OrderServiceMock.cs 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. using System.Net.Http.Headers;
  2. using AutoFixture;
  3. using Fw.Utility.UnifyResponse;
  4. using Hotline.Api.Controllers;
  5. using Hotline.Api.Controllers.Snapshot;
  6. using Hotline.Caching.Interfaces;
  7. using Hotline.FlowEngine.Notifications;
  8. using Hotline.Orders;
  9. using Hotline.Share.Dtos;
  10. using Hotline.Share.Dtos.File;
  11. using Hotline.Share.Dtos.FlowEngine;
  12. using Hotline.Share.Dtos.FlowEngine.Workflow;
  13. using Hotline.Share.Dtos.Order;
  14. using Hotline.Share.Dtos.Snapshot;
  15. using Hotline.Share.Enums.FlowEngine;
  16. using Hotline.Share.Enums.Snapshot;
  17. using Hotline.Share.Tools;
  18. using Hotline.Tests.Dto;
  19. using Hotline.Tests.Mock.Interfaces;
  20. using Microsoft.AspNetCore.Http;
  21. using Microsoft.AspNetCore.Mvc;
  22. using XF.Domain.Authentications;
  23. using XF.Domain.Repository;
  24. using System.Net.Http.Headers;
  25. using Hotline.Share.Dtos;
  26. using Hotline.FlowEngine.Notifications;
  27. using Hotline.Api.Controllers.Bi;
  28. using XF.Domain.Exceptions;
  29. using System;
  30. using DocumentFormat.OpenXml.Bibliography;
  31. using Hotline.Snapshot;
  32. using Hotline.Share.Enums.Settings;
  33. using Npgsql;
  34. namespace Hotline.Tests.Mock;
  35. public class OrderServiceMock
  36. {
  37. private readonly OrderController _orderController;
  38. public CreateOrderOutDto CreateOrderOutDto;
  39. private AddOrderDto AddOrderDto;
  40. private readonly IRepository<Order> _orderRepository;
  41. private readonly IOrderVisitRepository _orderVisitRepository;
  42. private readonly SnapshotController _snapshotController;
  43. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  44. public readonly IFixture _fixture;
  45. public readonly ISessionContext _sessionContext;
  46. public readonly IOrderServiceStartWorkflow _orderServiceStartWorkflow;
  47. public readonly RedPackController _redPackController;
  48. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  49. public OrderServiceMock(OrderController orderController, IRepository<Order> orderRepository, IOrderVisitRepository orderVisitRepository, SnapshotController snapshotController, ISessionContext sessionContext, IOrderServiceStartWorkflow orderServiceStartWorkflow, ISystemSettingCacheManager systemSettingCacheManager, RedPackController redPackController, ISystemDicDataCacheManager systemDicDataCacheManager)
  50. {
  51. _orderController = orderController;
  52. _orderController.ControllerContext = new ControllerContext
  53. {
  54. HttpContext = new DefaultHttpContext()
  55. };
  56. _orderRepository = orderRepository;
  57. _orderVisitRepository = orderVisitRepository;
  58. _snapshotController = snapshotController;
  59. _snapshotController.ControllerContext = new ControllerContext
  60. {
  61. HttpContext = new DefaultHttpContext()
  62. };
  63. _fixture = new Fixture();
  64. _sessionContext = sessionContext;
  65. _orderServiceStartWorkflow = orderServiceStartWorkflow;
  66. _systemSettingCacheManager = systemSettingCacheManager;
  67. _redPackController = redPackController;
  68. _redPackController.ControllerContext = new ControllerContext
  69. {
  70. HttpContext = new DefaultHttpContext(),
  71. };
  72. _systemDicDataCacheManager = systemDicDataCacheManager;
  73. }
  74. public IOrderServiceStartWorkflow CreateSnapshotOrder(Action action, string industryName = "电气焊作业申报")
  75. {
  76. action.Invoke();
  77. var homePage = _snapshotController.GetHomePageAsync().GetAwaiter().GetResult();
  78. var industry = homePage.Industrys
  79. .Where(m => m.Name == industryName)
  80. .OrderBy(m => m.DisplayOrder)
  81. .FirstOrDefault();
  82. var pageBase = _snapshotController.GetIndustryBaseAsync(industry.Id).GetAwaiter().GetResult();
  83. var inDto = _fixture.Create<AddSnapshotOrderInDto>();
  84. inDto.Street = "单元测试街道" + DateTime.Now.ToLongDateTimeString();
  85. inDto.IndustryId = industry.Id;
  86. inDto.Town = "仙市镇";
  87. inDto.AreaCode = "510302";
  88. inDto.County = "自流井区";
  89. inDto.Description = "单元测试添加的时间描述";
  90. inDto.IsSecret = false;
  91. inDto.PhoneNumber = _sessionContext.Phone;
  92. inDto.Latitude = 29.3661181959828;
  93. inDto.Longitude = 104.41928;
  94. //inDto.JobType =
  95. var file = 0;
  96. foreach (var item in inDto.Files)
  97. {
  98. var i = UploadImage();
  99. if (i.Code == -1)
  100. {
  101. file = i.Code;
  102. break;
  103. }
  104. var result = i.Result;
  105. item.FileName = result.FileName;
  106. item.Path = result.Path;
  107. item.AdditionId = result.Id;
  108. }
  109. if (file == -1) inDto.Files = new List<SnapshotFileInDto>();
  110. CreateOrderOutDto = _snapshotController.AddOrderAsync(inDto).GetAwaiter().GetResult().ToJson().FromJson<CreateOrderOutDto>();
  111. _orderServiceStartWorkflow.orderServiceMock = this;
  112. return _orderServiceStartWorkflow;
  113. }
  114. public IOrderServiceStartWorkflow CreateOrder(string callId = "", string industryId = "", string industryName = "", List<string> tags = null)
  115. {
  116. var json = "{\"sourceChannel\":\"因特网\",\"sourceChannelCode\":\"YTW\",\"transferPhone\":null,\"fromPhone\":null,\"acceptorName\":\"单元测试\",\"acceptorStaffNo\":\"\",\"fromName\":\"1233333333\",\"fromGender\":1,\"identityType\":1,\"licenceType\":null,\"licenceTypeCode\":null,\"licenceNo\":null,\"ageRange\":null,\"ageRangeCode\":null,\"contact\":\"12333333333\",\"isSecret\":false,\"acceptSms\":false,\"no\":null,\"title\":\"\",\"hotspotId\":\"1912\",\"eventCategoryId\":null,\"incidentTime\":null,\"incidentPurpose\":null,\"areaCode\":\"519800\",\"city\":\"省内\",\"street\":null,\"isRepeat\":\"false\",\"pushType\":null,\"pushTypeCode\":null,\"content\":\"单元测试内容\",\"duplicateIds\":[],\"duplicateTitle\":null,\"callAddress\":null,\"repeatableEventDetails\":[],\"orderExtension\":null,\"transpond\":false,\"isEnforcementOrder\":false,\"focusOnEventsArr\":[],\"focusOnEvents\":null,\"isFormalistWorkOrder\":false,\"isSensitiveWorkOrders\":false,\"isUrgent\":false,\"isThreePartyConference\":false,\"is24HoursComplete\":false,\"company\":null,\"orderPushTypes\":[],\"acceptType\":\"咨询\",\"acceptTypeCode\":\"10\",\"files\":[],\"hotspotSpliceName\":\"互联互通-转接乐山市12345\",\"hotspotName\":\"转接乐山市12345\",\"hotspotCode\":\"1912\",\"hotspotExternal\":\"19\",\"county\":\"\",\"town\":\"\"}";
  117. AddOrderDto = json.FromJson<AddOrderDto>();
  118. if (callId.NotNullOrEmpty())
  119. {
  120. AddOrderDto.CallId = callId;
  121. AddOrderDto.SourceChannel = "电话";
  122. AddOrderDto.SourceChannelCode = AppDefaults.SourceChannel.DianHua;
  123. }
  124. AddOrderDto.IndustryId = industryId;
  125. AddOrderDto.IndustryName = industryName;
  126. AddOrderDto.Title = "单元测试" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
  127. if (tags.NotNullOrEmpty())
  128. AddOrderDto.Tags = tags;
  129. RetryHelper.Retry(() =>
  130. {
  131. try
  132. {
  133. CreateOrderOutDto = _orderController.Add(AddOrderDto).GetAwaiter().GetResult().ToJson().FromJson<CreateOrderOutDto>();
  134. }
  135. catch (PostgresException e)
  136. {
  137. if (e.Message.Contains("unique_order_no"))
  138. {
  139. return false;
  140. }
  141. }
  142. return true;
  143. }, 10);
  144. _orderServiceStartWorkflow.orderServiceMock = this;
  145. return _orderServiceStartWorkflow;
  146. }
  147. public OrderServiceMock UpdateOrder()
  148. {
  149. UpdateOrderDto order = _orderController.Get(CreateOrderOutDto.Id).GetAwaiter().GetResult();
  150. _orderController.Update(order).GetAwaiter().GetResult();
  151. return this;
  152. }
  153. public CreateOrderOutDto GetCreateResult()
  154. {
  155. return CreateOrderOutDto;
  156. }
  157. public OrderServiceMock 办理到派单员(Action action = null, bool isSafetyDepartment = false)
  158. {
  159. action?.Invoke();
  160. var stepNextInfo = _orderController.GetNextStepsWithRecommend(CreateOrderOutDto.Id).GetAwaiter().GetResult().ToJson().FromJson<NextStepsDto<NextStepOption>>();
  161. var stepInfo = stepNextInfo.Steps.FirstOrDefault(m => m.Value == "派单组");
  162. var stepOrg = stepInfo.Items.FirstOrDefault(m => m.Username == "单元测试派单员");
  163. var order = _orderRepository.Get(CreateOrderOutDto.Id);
  164. var handleDto = new NextWorkflowDto<OrderHandleFlowDto>
  165. {
  166. Data = new OrderHandleFlowDto
  167. {
  168. OrderId = CreateOrderOutDto.Id,
  169. IsSafetyDepartment = isSafetyDepartment
  170. },
  171. Workflow = new NextWorkflowDto
  172. {
  173. WorkflowId = order.WorkflowId,
  174. StepId = stepNextInfo.StepId,
  175. NextHandlers = [stepOrg],
  176. NextStepCode = stepInfo.Key,
  177. NextStepName = stepInfo.Value,
  178. Opinion = "办理到派单组意见",
  179. BackToCountersignEnd = false,
  180. IsSms = false,
  181. IsForwarded = false,
  182. HandlerType = EHandlerType.OrgLevel,
  183. BusinessType = EBusinessType.Send,
  184. FlowDirection = EFlowDirection.CenterToCenter,
  185. CurrentTag = TagDefaults.OrderMark
  186. }
  187. };
  188. _orderController.Handle(handleDto).GetAwaiter().GetResult();
  189. return this;
  190. }
  191. public OrderServiceMock 办理到一级部门(Action action = null)
  192. {
  193. action?.Invoke();
  194. var stepNextInfo = _orderController.GetNextStepsWithRecommend(CreateOrderOutDto.Id).GetAwaiter().GetResult().ToJson().FromJson<NextStepsDto<NextStepOption>>();
  195. var stepInfo = stepNextInfo.Steps.FirstOrDefault(m => m.Value == "一级部门");
  196. var stepOrg = stepInfo.Items.FirstOrDefault(m => m.OrgName == "测试部门");
  197. var order = _orderRepository.Get(CreateOrderOutDto.Id);
  198. var handleDto = new NextWorkflowDto<OrderHandleFlowDto>
  199. {
  200. Data = new OrderHandleFlowDto
  201. {
  202. OrderId = CreateOrderOutDto.Id,
  203. },
  204. Workflow = new NextWorkflowDto
  205. {
  206. WorkflowId = order.WorkflowId,
  207. StepId = stepNextInfo.StepId,
  208. NextHandlers = [stepOrg],
  209. NextStepCode = stepInfo.Key,
  210. NextStepName = stepInfo.Value,
  211. Opinion = "办理意见",
  212. BackToCountersignEnd = false,
  213. IsSms = false,
  214. IsForwarded = false,
  215. HandlerType = EHandlerType.OrgLevel,
  216. BusinessType = EBusinessType.Department,
  217. }
  218. };
  219. _orderController.Handle(handleDto).GetAwaiter().GetResult();
  220. return this;
  221. }
  222. public OrderServiceMock 办理到归档(Action action = null, Action<OrderHandleFlowDto> dataAction = null, Action<NextWorkflowDto> workflowAction = null)
  223. {
  224. action?.Invoke();
  225. var stepNextInfo = _orderController.GetNextStepsWithRecommend(CreateOrderOutDto.Id).GetAwaiter().GetResult().ToJson().FromJson<NextStepsDto<NextStepOption>>();
  226. var stepInfo = stepNextInfo.Steps.FirstOrDefault(m => m.Value == "归档");
  227. var stepOrg = stepInfo.Items.FirstOrDefault();
  228. var order = _orderRepository.Get(CreateOrderOutDto.Id);
  229. var handleDto = new NextWorkflowDto<OrderHandleFlowDto>
  230. {
  231. Data = new OrderHandleFlowDto
  232. {
  233. OrderId = CreateOrderOutDto.Id,
  234. RealHandlerName = "经办人",
  235. RealHandlerPhone = "13666666666",
  236. RealContactLocale = true,
  237. RealIsContacted = true,
  238. IsOther = true,
  239. OtherRemark = "其它原因",
  240. RealCommunicationAddress = "地点地点地点",
  241. RealCommunicationTime = DateTime.Now,
  242. },
  243. Workflow = new NextWorkflowDto
  244. {
  245. NextStepCode = "end",
  246. NextStepName = "归档",
  247. Opinion = "办理到归档",
  248. BackToCountersignEnd = false,
  249. IsSms = false,
  250. IsForwarded = false,
  251. HandlerType = EHandlerType.OrgLevel,
  252. BusinessType = EBusinessType.Department,
  253. FlowDirection = EFlowDirection.OrgToOrg,
  254. WorkflowId = order.WorkflowId,
  255. StepId = stepNextInfo.StepId,
  256. }
  257. };
  258. dataAction?.Invoke(handleDto.Data);
  259. workflowAction?.Invoke(handleDto.Workflow);
  260. try
  261. {
  262. _orderController.Handle(handleDto).GetAwaiter().GetResult();
  263. }
  264. catch (Exception e)
  265. {
  266. var msg = e.Message;
  267. if (msg.Contains("RealtimeService") == false)
  268. {
  269. throw;
  270. }
  271. // ignore
  272. }
  273. return this;
  274. }
  275. public OrderServiceMock 办理到二级部门(Action action = null)
  276. {
  277. action?.Invoke();
  278. var stepNextInfo = _orderController.GetNextStepsWithRecommend(CreateOrderOutDto.Id).GetAwaiter().GetResult().ToJson().FromJson<NextStepsDto<NextStepOption>>();
  279. var stepInfo = stepNextInfo.Steps.FirstOrDefault(m => m.Value == "二级部门");
  280. var stepOrg = stepInfo.Items.FirstOrDefault(m => m.OrgName == "测试二级部门");
  281. var order = _orderRepository.Get(CreateOrderOutDto.Id);
  282. var handleDto = new NextWorkflowDto<OrderHandleFlowDto>
  283. {
  284. Data = new OrderHandleFlowDto
  285. {
  286. OrderId = CreateOrderOutDto.Id,
  287. },
  288. Workflow = new NextWorkflowDto
  289. {
  290. NextHandlers = [stepOrg],
  291. NextStepCode = stepInfo.Key,
  292. NextStepName = stepInfo.Value,
  293. Opinion = "办理到二级部门",
  294. BackToCountersignEnd = false,
  295. IsSms = false,
  296. IsForwarded = false,
  297. HandlerType = EHandlerType.OrgLevel,
  298. BusinessType = EBusinessType.Department,
  299. FlowDirection = EFlowDirection.OrgToOrg,
  300. WorkflowId = order.WorkflowId,
  301. StepId = stepNextInfo.StepId,
  302. }
  303. };
  304. _orderController.Handle(handleDto).GetAwaiter().GetResult();
  305. return this;
  306. }
  307. public OrderServiceMock 办理一级部门汇总(Action action = null)
  308. {
  309. action?.Invoke();
  310. var stepNextInfo = _orderController.GetNextStepsWithRecommend(CreateOrderOutDto.Id).GetAwaiter().GetResult().ToJson().FromJson<NextStepsDto<NextStepOption>>();
  311. var stepInfo = stepNextInfo.Steps.FirstOrDefault(m => m.Value == "一级部门汇总");
  312. var stepOrg = stepInfo.Items.FirstOrDefault(m => m.OrgName == "测试部门");
  313. var order = _orderRepository.Get(CreateOrderOutDto.Id);
  314. var handleDto = new NextWorkflowDto<OrderHandleFlowDto>
  315. {
  316. Data = new OrderHandleFlowDto
  317. {
  318. OrderId = CreateOrderOutDto.Id,
  319. RealHandlerName = "经办人",
  320. RealHandlerPhone = "13666666666",
  321. RealContactLocale = true,
  322. RealIsContacted = true,
  323. IsOther = true,
  324. IsEvasive = true,
  325. OtherRemark = "其它原因",
  326. RealCommunicationAddress = "地点地点地点",
  327. RealCommunicationTime = DateTime.Now
  328. },
  329. Workflow = new NextWorkflowDto
  330. {
  331. NextHandlers = [stepOrg],
  332. NextStepCode = stepInfo.Key,
  333. NextStepName = stepInfo.Value,
  334. Opinion = "办理到一级部门汇总",
  335. BackToCountersignEnd = false,
  336. IsSms = false,
  337. IsForwarded = false,
  338. HandlerType = EHandlerType.AssignedUser,
  339. BusinessType = EBusinessType.Department,
  340. FlowDirection = EFlowDirection.OrgToOrg,
  341. StepType = EStepType.Summary,
  342. WorkflowId = order.WorkflowId,
  343. StepId = stepNextInfo.StepId,
  344. }
  345. };
  346. _orderController.Handle(handleDto).GetAwaiter().GetResult();
  347. return this;
  348. }
  349. public OrderServiceMock 发布工单(Action action = null, IList<Kv>? snapshotLabels = null)
  350. {
  351. action?.Invoke();
  352. var baseData = _orderController.PublishOrderPageBase(CreateOrderOutDto.Id).GetAwaiter().GetResult();
  353. var inDto = new PublishOrderDto
  354. {
  355. Id = CreateOrderOutDto.Id,
  356. PublishState = false,
  357. ArrangeTitle = baseData.OrderTitle,
  358. ArrangeContent = baseData.Content,
  359. ArrangeOpinion = baseData.ActualOpinion,
  360. IdNames = [baseData.ActualHandleOrgName],
  361. ProPublishState = false,
  362. Resolve = true,
  363. SnapshotLabels = snapshotLabels
  364. };
  365. _orderController.PublishOrder(inDto).GetAwaiter().GetResult();
  366. return this;
  367. }
  368. public OrderServiceMock 部门审核网格员红包(Action action = null)
  369. {
  370. action?.Invoke();
  371. var baseData = _redPackController.GetRedPackGuiderAuditItems(new SnapshotOrderGuiderAuditItemsInDto(null, null, 0)).GetAwaiter().GetResult();
  372. var item = baseData.Items.FirstOrDefault(m => m.No == CreateOrderOutDto.No);
  373. if (item == null)
  374. throw UserFriendlyException.SameMessage("获取审核红包信息错误, 不存在被测试的对象.");
  375. var inDto = new UpdateRedPackGuiderAuditInDto
  376. {
  377. RedPackAuditId = item.RedPackAuditId,
  378. Status = ESnapshotSMSStatus.Agree,
  379. Opinion = "红包审核通过",
  380. };
  381. _redPackController.UpdateRedPackGuiderAuditAsync(inDto).GetAwaiter().GetResult();
  382. return this;
  383. }
  384. public OrderServiceMock 部门审核市民红包(Action action = null)
  385. {
  386. action?.Invoke();
  387. var baseData = _redPackController.GetRedPackAuditItems(new SnapshotOrderAuditItemsInDto(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0)).GetAwaiter().GetResult();
  388. var item = baseData.Items.FirstOrDefault(m => m.No == CreateOrderOutDto.No);
  389. if (item == null)
  390. throw UserFriendlyException.SameMessage("获取审核红包信息错误, 不存在被测试的对象.");
  391. var inDto = new UpdateRedPackAuditInDto
  392. {
  393. SMSTemplateId = "",
  394. IsSendSms = false,
  395. RedPackAuditId = item.RedPackAuditId,
  396. Status = ESnapshotSMSStatus.Agree,
  397. Opinion = "红包审核通过",
  398. };
  399. _redPackController.UpdateRedPackAuditAsync(inDto).GetAwaiter().GetResult();
  400. return this;
  401. }
  402. public OrderServiceMock 发送回访短信(Action action = null)
  403. {
  404. action?.Invoke();
  405. var id = _orderVisitRepository.Queryable()
  406. .Where(m => m.No == CreateOrderOutDto.No)
  407. .Select(m => m.Id)
  408. .First();
  409. var inDto = new VisitSmsInDto
  410. {
  411. Ids = [id]
  412. };
  413. _orderController.VisitPushSMSAsync(inDto).GetAwaiter().GetResult();
  414. return this;
  415. }
  416. private ApiResponse<FileJson> UploadImage()
  417. {
  418. #region 图片
  419. var base64String = "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";
  420. #endregion
  421. byte[] imageBytes = Convert.FromBase64String(base64String);
  422. var uploadUrl = _systemSettingCacheManager.FileServerUrl + "/file/upload?source=hotline";
  423. var file = "测试图片" + DateTime.Now.ToString("ss") + ".png";
  424. var resultJson = UploadFileFromMemory(imageBytes, file, uploadUrl);
  425. if (resultJson.IsNullOrEmpty()) return new ApiResponse<FileJson>() { Code = -1 };
  426. var result = resultJson.FromJson<ApiResponse<FileJson>>();
  427. return result;
  428. }
  429. public GuiderSystemInDto GetGuiderSystemInDto(string number)
  430. {
  431. List<GuiderSystemInDto> items = [ new GuiderSystemInDto
  432. {
  433. ReplyCode = CreateOrderOutDto.No,
  434. AppealNumber = number,
  435. ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
  436. ReplyUserName = "18181552753@zgsg",
  437. ReplyBMName = "瓦市村村民委员会",
  438. ReplyResultType = "2",
  439. ReplyISTrue = "1",
  440. IsRepeat = "0",
  441. IsHiddenDanger = "1",
  442. MemberName = "许利洪",
  443. MemberMobile = "18181552753",
  444. ReplyContent = "到现场查实,存在安全隐患",
  445. OrgId = "4828",
  446. OrgName = "瓦市村民委员会",
  447. OrgFullName = "四川省/自贡市/沿滩区/永安镇/瓦市村村民委员会",
  448. DepartmentNo = "510311106206",
  449. ParentOrgId = "4821",
  450. ReplyFileList =
  451. [
  452. "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
  453. ]
  454. },
  455. new GuiderSystemInDto {
  456. ReplyCode = CreateOrderOutDto.No,
  457. AppealNumber = number,
  458. ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
  459. ReplyUserName = "18015707487@zgsg",
  460. ReplyBMName = "大岩社区第一网格",
  461. ReplyResultType = "2",
  462. ReplyISTrue = "1",
  463. IsRepeat = "0",
  464. IsHiddenDanger = "1",
  465. MemberName = "黄敬",
  466. MemberMobile = "18015707487",
  467. ReplyContent = "到现场查实,存在安全隐患",
  468. OrgId = "138497",
  469. OrgName = "大岩社区第一网格",
  470. OrgFullName = "四川省/自贡市/自贡高新区/红旗街道/大岩社区居民委员会/大岩社区第一网格",
  471. DepartmentNo = "510323004002001",
  472. ParentOrgId = "137874",
  473. ReplyFileList =
  474. [
  475. "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
  476. ]
  477. },
  478. new GuiderSystemInDto {
  479. ReplyCode = CreateOrderOutDto.No,
  480. AppealNumber = number,
  481. ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
  482. ReplyUserName = "18015707367@zgsg",
  483. ReplyBMName = "悦景社区第一网格",
  484. ReplyResultType = "2",
  485. ReplyISTrue = "1",
  486. IsRepeat = "0",
  487. IsHiddenDanger = "0",
  488. MemberName = "余文惠",
  489. MemberMobile = "18015707367",
  490. ReplyContent = "确认情况属实,但是不属于我们管辖。属于市政工程。",
  491. OrgId = "138563",
  492. OrgName = "悦景社区第一网格",
  493. OrgFullName = "四川省/自贡市/自贡高新区/红旗街道/悦景社区居民委员会/悦景社区第一网格",
  494. DepartmentNo = "510323004004001",
  495. ParentOrgId = "137875",
  496. ReplyFileList =
  497. [
  498. "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
  499. ]
  500. },
  501. new GuiderSystemInDto {
  502. ReplyCode = CreateOrderOutDto.No,
  503. AppealNumber = number,
  504. ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
  505. ReplyUserName = "18015707408@zgsg",
  506. ReplyBMName = "大湾社区第一网格",
  507. ReplyResultType = "2",
  508. ReplyISTrue = "1",
  509. IsRepeat = "0",
  510. IsHiddenDanger = "0",
  511. MemberName = "邓文文",
  512. MemberMobile = "15928137497",
  513. ReplyContent = "网格员到现场核实,情况属实,此地方属于物业处理,已通知物业及时处理。",
  514. OrgId = "138520",
  515. OrgName = "大湾社区第一网格",
  516. OrgFullName = "四川省/自贡市/自贡高新区/红旗街道/大湾社区居民委员会/大湾社区第一网格",
  517. DepartmentNo = "510323004001001",
  518. ParentOrgId = "137873",
  519. ReplyFileList =
  520. [
  521. "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
  522. ]
  523. },
  524. new GuiderSystemInDto {
  525. ReplyCode = CreateOrderOutDto.No,
  526. AppealNumber = number,
  527. ReplyDate = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"),
  528. ReplyUserName = "18015707443@zgsg",
  529. ReplyBMName = "明珠社区第一网格",
  530. ReplyResultType = "2",
  531. ReplyISTrue = "",
  532. IsRepeat = "",
  533. IsHiddenDanger = "",
  534. MemberName = "周洪英",
  535. MemberMobile = "15881342458",
  536. ReplyContent = "现场查看情况属实,属于汇东公园管辖范围",
  537. OrgId = "138372",
  538. OrgName = "明珠社区第一网格",
  539. OrgFullName = "四川省/自贡市/自贡高新区/丹桂街道/明珠社区居民委员会/明珠社区第一网格",
  540. DepartmentNo = "510323001010001",
  541. ParentOrgId = "137777",
  542. ReplyFileList =
  543. [
  544. "http://10.0.188.11:1234/tqOssManager/getObjectByUri/sichuan/scgrid/jpg/2024/12/5/095020318625.jpg"
  545. ]
  546. }];
  547. var index = new Random().Next(0, items.Count);
  548. return items[index];
  549. }
  550. private string UploadFileFromMemory(byte[] fileBytes, string fileName, string uploadUrl)
  551. {
  552. try
  553. {
  554. using HttpClient client = new HttpClient();
  555. using var multipartContent = new MultipartFormDataContent();
  556. var fileContent = new ByteArrayContent(fileBytes);
  557. fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");
  558. multipartContent.Add(fileContent, "fileData", fileName);
  559. HttpResponseMessage response = client.PostAsync(uploadUrl, multipartContent).GetAwaiter().GetResult();
  560. response.EnsureSuccessStatusCode();
  561. var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
  562. return result;
  563. }
  564. catch (Exception e)
  565. {
  566. var msg = e.Message;
  567. }
  568. return string.Empty;
  569. }
  570. public OrderServiceMock StepHandle(Func<CreateOrderOutDto, OrderServiceMock, Task> handle)
  571. {
  572. handle(CreateOrderOutDto, this).GetAwaiter().GetResult();
  573. return this;
  574. }
  575. public OrderServiceMock StepHandle(Func<CreateOrderOutDto, Task> handle)
  576. {
  577. handle(CreateOrderOutDto).GetAwaiter().GetResult();
  578. return this;
  579. }
  580. public OrderServiceMock 办理到工单标注(Action action = null)
  581. {
  582. action?.Invoke();
  583. var stepNextInfo = _orderController.GetNextStepsWithRecommend(CreateOrderOutDto.Id).GetAwaiter().GetResult().ToJson().FromJson<NextStepsDto<NextStepOption>>();
  584. var stepInfo = stepNextInfo.Steps.FirstOrDefault(m => m.Value == "工单标记");
  585. var stepOrg = stepInfo.Items.FirstOrDefault(m => m.Username == "单元测试班长");
  586. var handleDto = new NextWorkflowDto<OrderHandleFlowDto>
  587. {
  588. Data = new OrderHandleFlowDto
  589. {
  590. OrderId = CreateOrderOutDto.Id,
  591. IsSafetyDepartment = true,
  592. },
  593. Workflow = new NextWorkflowDto
  594. {
  595. NextHandlers = [stepOrg],
  596. NextStepCode = stepInfo.Key,
  597. NextStepName = stepInfo.Value,
  598. Opinion = "办理到工单标记意见",
  599. BackToCountersignEnd = false,
  600. IsSms = false,
  601. IsForwarded = false,
  602. HandlerType = EHandlerType.OrgLevel,
  603. BusinessType = EBusinessType.Send,
  604. FlowDirection = EFlowDirection.CenterToCenter,
  605. }
  606. };
  607. _orderController.Handle(handleDto).GetAwaiter().GetResult();
  608. return this;
  609. }
  610. public OrderServiceMock 部门审核特殊红包(Action action, double? approvedAmount = 0)
  611. {
  612. action?.Invoke();
  613. var baseData = _redPackController.GetRedPackSpecialAuditItems(new SnapshotOrderAuditItemsInDto(null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 0)).GetAwaiter().GetResult();
  614. var item = baseData.Items.FirstOrDefault(m => m.No == CreateOrderOutDto.No);
  615. var basedata = _systemDicDataCacheManager.SnapshotRedPackSpecialType.First();
  616. if (item == null)
  617. throw UserFriendlyException.SameMessage("获取特殊审核红包信息错误, 不存在被测试的对象.");
  618. var inDto = new UpdateRedPackSpecialAuditInDto
  619. {
  620. AuditTypeId = basedata.Id,
  621. ApprovedAmount = approvedAmount,
  622. RedPackAuditId = item.RedPackAuditId,
  623. Status = ERedPackAuditStatus.Agree,
  624. Opinion = "红包审核通过",
  625. };
  626. _redPackController.UpdateRedPackSpecialAuditAsync(inDto).GetAwaiter().GetResult();
  627. return this;
  628. }
  629. public string 申请延期(Action action = null)
  630. {
  631. action?.Invoke();
  632. var options = _orderController.GetDelayFlowStartOptions().Result as NextStepsDto<NextStepOption>;
  633. var step = options.Steps.First();
  634. var req = new StartWorkflowDto<ApplyDelayDto>
  635. {
  636. Workflow = new BasicWorkflowDto
  637. {
  638. NextStepCode = step.Key,
  639. NextStepName = step.Value,
  640. NextHandlers = new List<StepAssignInfo> { step.Items.First() },
  641. Opinion = "单元测试延期申请",
  642. FlowDirection = step.FlowDirection,
  643. BackToCountersignEnd = step.BackToCountersignEnd,
  644. HandlerType = step.HandlerType,
  645. BusinessType = step.BusinessType,
  646. },
  647. Data = new ApplyDelayDto
  648. {
  649. OrderId = CreateOrderOutDto.Id,
  650. DelayNum = 3,
  651. DelayReason = "单元测试延期理由",
  652. DelayUnit = ETimeType.WorkDay,
  653. Files = new()
  654. }
  655. };
  656. return _orderController.ApplyDelay(req).GetAwaiter().GetResult();
  657. }
  658. }