OrderControllerTest.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. using AutoFixture;
  2. using Hotline.Api.Controllers;
  3. using Hotline.Application.CallCenter;
  4. using Hotline.Caching.Interfaces;
  5. using Hotline.CallCenter.Calls;
  6. using Hotline.FlowEngine.Notifications;
  7. using Hotline.Identity.Accounts;
  8. using Hotline.Identity.Roles;
  9. using Hotline.Orders;
  10. using Hotline.Settings;
  11. using Hotline.Settings.Hotspots;
  12. using Hotline.Share.Dtos.CallCenter;
  13. using Hotline.Share.Dtos.Order;
  14. using Hotline.Share.Dtos.Order.Publish;
  15. using Hotline.Share.Dtos.Snapshot;
  16. using Hotline.Share.Dtos.TrCallCenter;
  17. using Hotline.Share.Enums.CallCenter;
  18. using Hotline.Share.Enums.FlowEngine;
  19. using Hotline.Share.Enums.Order;
  20. using Hotline.Share.Enums.Settings;
  21. using Hotline.Share.Tools;
  22. using Hotline.Snapshot.Interfaces;
  23. using Hotline.Tests.Dto;
  24. using Hotline.Tests.Mock;
  25. using Hotline.Tests.SqlSuger;
  26. using Hotline.Users;
  27. using Mapster;
  28. using MediatR;
  29. using Microsoft.AspNetCore.Http;
  30. using Microsoft.AspNetCore.Mvc;
  31. using Microsoft.Extensions.DependencyInjection;
  32. using Shouldly;
  33. using SqlSugar;
  34. using System;
  35. using System.Collections.Generic;
  36. using System.Linq;
  37. using System.Text;
  38. using System.Threading;
  39. using System.Threading.Tasks;
  40. using Hotline.FlowEngine.Workflows;
  41. using XF.Domain.Authentications;
  42. using XF.Domain.Cache;
  43. using XF.Domain.Exceptions;
  44. using XF.Domain.Repository;
  45. namespace Hotline.Tests.Controller;
  46. public class OrderControllerTest : TestBase
  47. {
  48. private readonly OrderController _orderController;
  49. private readonly IRepository<Hotspot> _hotspotRepository;
  50. private readonly IOrderRepository _orderRepository;
  51. private readonly OrderServiceMock _orderServiceMock;
  52. private readonly IRepository<OrderPublish> _orderPublishRepository;
  53. private readonly INotificationHandler<EndWorkflowNotify> _orderPublishEndWorkflowHandler;
  54. private readonly IOrderVisitRepository _orderVisitRepository;
  55. private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
  56. private readonly IRepository<SystemSetting> _systemSettingRepository;
  57. private readonly ISystemSettingCacheManager _systemSettingCacheManager;
  58. private readonly IRepository<CallNative> _callNativeRepository;
  59. private readonly IRepository<CallidRelation> _callIdRelationRepository;
  60. private readonly XingTangCallApplication _defaultCallApplication;
  61. private readonly ISqlSugarClient _capSqlClient;
  62. private readonly IIndustryRepository _industryRepository;
  63. private readonly IOrderSnapshotRepository _orderSnapshotRepository;
  64. private readonly ISystemLogRepository _systemLogRepository;
  65. private readonly IOrderVisitDomainService _orderVisitDomainService;
  66. private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
  67. private readonly IWorkflowDomainService _workflowDomainService;
  68. public OrderControllerTest(IAccountRepository accountRepository, IRepository<Role> roleRepository,
  69. UserController userController, IRepository<Hotspot> hotspotRepository, OrderController orderController,
  70. IOrderRepository orderRepository, IServiceScopeFactory scopeFactory, IRepository<User> userRepository,
  71. OrderServiceMock orderServiceMock, IRepository<OrderPublish> orderPublishRepository,
  72. INotificationHandler<EndWorkflowNotify> orderPublishEndWorkflowHandler,
  73. IOrderVisitRepository orderVisitRepository, IRepository<SystemSetting> systemSettingRepository,
  74. ISystemSettingCacheManager systemSettingCacheManager, IRepository<CallNative> callNativeRepository,
  75. IRepository<CallidRelation> callIdRelationRepository, XingTangCallApplication defaultCallApplication,
  76. ISugarUnitOfWork<CapDbContext> capDbContext, IHttpContextAccessor httpContextAccessor, IThirdIdentiyService thirdService,
  77. IThirdAccountRepository thirdAccount, IIndustryRepository industryRepository, IOrderSnapshotRepository orderSnapshotRepository,
  78. ISystemLogRepository systemLogRepository, IOrderVisitDomainService orderVisitDomainService,
  79. IRepository<OrderVisitDetail> orderVisitDetailRepository, ISystemDicDataCacheManager systemDicDataCacheManager,
  80. IWorkflowDomainService workflowDomainService,
  81. ITypedCache<SystemSetting> cacheSettingData)
  82. : base(accountRepository, roleRepository, userController, scopeFactory, userRepository, httpContextAccessor, thirdService, thirdAccount,
  83. cacheSettingData)
  84. {
  85. _hotspotRepository = hotspotRepository;
  86. _orderController = orderController;
  87. _orderController.ControllerContext = new ControllerContext
  88. {
  89. HttpContext = new DefaultHttpContext()
  90. };
  91. _orderRepository = orderRepository;
  92. _orderServiceMock = orderServiceMock;
  93. _orderPublishRepository = orderPublishRepository;
  94. _orderPublishEndWorkflowHandler = orderPublishEndWorkflowHandler;
  95. _orderVisitRepository = orderVisitRepository;
  96. _systemSettingRepository = systemSettingRepository;
  97. _systemSettingCacheManager = systemSettingCacheManager;
  98. _callNativeRepository = callNativeRepository;
  99. _callIdRelationRepository = callIdRelationRepository;
  100. _defaultCallApplication = defaultCallApplication;
  101. _capSqlClient = capDbContext.Db;
  102. _industryRepository = industryRepository;
  103. _orderSnapshotRepository = orderSnapshotRepository;
  104. _systemLogRepository = systemLogRepository;
  105. _orderVisitDomainService = orderVisitDomainService;
  106. _orderVisitDetailRepository = orderVisitDetailRepository;
  107. _systemDicDataCacheManager = systemDicDataCacheManager;
  108. _workflowDomainService = workflowDomainService;
  109. }
  110. /// <summary>
  111. /// 创建工单时传入一个错误callId
  112. /// 验证:
  113. /// 测试在延迟消息后会不会把工单测CallId修复成正确的CallId
  114. /// 推送的省上数据是否正确
  115. /// 测试修复后的CallId 再次保存功能, 能通过 systemLog 查询修复记录, 拦截工单保存
  116. /// </summary>
  117. /// <returns></returns>
  118. [Fact]
  119. public async Task OrderCallIdRelevance_Test()
  120. {
  121. var callNo = DateTime.Now.ToString("yyyyMMddhhmmss") + "Flow";
  122. var inDto = _fixture.Build<CallNative>()
  123. .With(m => m.Id, Ulid.NewUlid().ToString())
  124. .With(m => m.CallNo, callNo)
  125. .With(m => m.Direction, ECallDirection.In)
  126. .With(m => m.IsDeleted, false)
  127. .Create();
  128. await _callNativeRepository.AddAsync(inDto);
  129. var inDto2 = _fixture.Build<CallNative>()
  130. .With(m => m.Id, Ulid.NewUlid().ToString())
  131. .With(m => m.Direction, ECallDirection.Out)
  132. .With(m => m.CallNo, callNo)
  133. .With(m => m.AudioFile, string.Empty)
  134. .With(m => m.IsDeleted, false)
  135. .Create();
  136. await _callNativeRepository.AddAsync(inDto2);
  137. var callOrder = new CallidRelation
  138. {
  139. Id = callNo,
  140. CallId = inDto2.Id,
  141. };
  142. await _callIdRelationRepository.AddAsync(callOrder, CancellationToken.None);
  143. SetZuoXi();
  144. var order = _orderServiceMock.CreateOrder(callNo)
  145. .办理到派单员()
  146. .GetCreateResult();
  147. order.ShouldNotBeNull();
  148. await _defaultCallApplication.OrderRelateCallHandlerAsync(order.Id, CancellationToken.None);
  149. var orderEntity = await _orderRepository.GetAsync(order.Id);
  150. orderEntity.ShouldNotBeNull();
  151. orderEntity.CallId.ShouldBe(inDto.Id);
  152. var query = _capSqlClient.Queryable<PublishedEntity>()
  153. .Where(m => m.Name == "hotline.call.connect.order" && m.Content.Contains(order.Id));
  154. var sql = query.ToSqlString();
  155. sql.Contains("id").ShouldBeFalse("字段大小写错误" + sql);
  156. var published = await query.FirstAsync();
  157. published.ShouldNotBeNull("推送数据不存在");
  158. var message = published.Content.FromJson<Message<PublishCallRecrodDto>>();
  159. message.Value.Order.ShouldNotBeNull("推送的工单信息为空");
  160. message.Value.Order.ProvinceNo.ShouldNotBeNull("省工单编号不能为空");
  161. message.Value.Order.No.ShouldBe(order.No, "推送的工单编号错误");
  162. try
  163. {
  164. order = _orderServiceMock.CreateOrder(callNo)
  165. .办理到派单员()
  166. .GetCreateResult();
  167. }
  168. catch (UserFriendlyException e)
  169. {
  170. e.FriendlyMessage.ShouldBe("来电已保存工单!");
  171. }
  172. }
  173. [Fact]
  174. public async Task Visit_Test()
  175. {
  176. SetZuoXi();
  177. var order = _orderServiceMock.CreateOrder()
  178. .办理到一级部门()
  179. .办理到二级部门(Set一级部门)
  180. .办理一级部门汇总(Set二级部门)
  181. .办理到归档(Set一级部门)
  182. .发布工单(SetZuoXi)
  183. .GetCreateResult();
  184. var visit = await _orderVisitRepository.Queryable()
  185. .Where(m => m.OrderId == order.Id)
  186. .FirstAsync();
  187. var visitDetaila = await _orderVisitDetailRepository.Queryable().Where(m => m.VisitId == visit.Id).ToListAsync();
  188. var visitDetail = visitDetaila.Adapt<List<VisitDetailDto>>();
  189. var smsReply = _orderVisitDomainService.GetVisitEvaluateByReplyTxt("0");
  190. visitDetail.ForEach(m =>
  191. {
  192. m.SeatEvaluate = ESeatEvaluate.DefaultSatisfied;
  193. m.OrgProcessingResults = smsReply.GetOrgProcessingResults(_systemDicDataCacheManager.VisitSatisfaction);
  194. m.OrgHandledAttitude = smsReply.GetOrgHandledAttitude(_systemDicDataCacheManager.VisitSatisfaction);
  195. });
  196. var callNo = DateTime.Now.ToString("yyyyMMddhhmmss") + "Flow";
  197. var inDto = _fixture.Build<CallNative>()
  198. .With(m => m.Id, Ulid.NewUlid().ToString())
  199. .With(m => m.CallNo, callNo)
  200. .With(m => m.Direction, ECallDirection.In)
  201. .With(m => m.IsDeleted, false)
  202. .Create();
  203. await _callNativeRepository.AddAsync(inDto);
  204. _systemLogRepository.Add("回访外呼已经接通", "", new CallRemarkDto { CallId = callNo, CallNumber = inDto.ToNo }.ToJson(), "", 1, visit.Id);
  205. var visitDto = new VisitDto
  206. {
  207. Id = visit.Id,
  208. IsPutThrough = true,
  209. VisitDetails = visitDetail
  210. };
  211. await _orderController.Visit(visitDto);
  212. var orderEntity = await _orderRepository.GetAsync(order.Id);
  213. orderEntity.OrgProcessingResults.ShouldNotBeNull();
  214. }
  215. /// <summary>
  216. /// 创建工单并派送给派单员
  217. /// </summary>
  218. /// <returns></returns>
  219. [Fact]
  220. public async Task ToPaiDanYuan_Test()
  221. {
  222. SetZuoXi();
  223. var order = _orderServiceMock.CreateOrder()
  224. .办理到派单员()
  225. .GetCreateResult();
  226. order.ShouldNotBeNull();
  227. }
  228. /// <summary>
  229. /// 创建随手拍工单
  230. /// 验证随手拍工单是否能正常创建
  231. /// </summary>
  232. /// <returns></returns>
  233. [Fact]
  234. public async Task OrderSnapshot_Test()
  235. {
  236. var industryItems = await _industryRepository.Queryable().Select(d => new { d.Id, d.Name, }).ToListAsync();
  237. var industry = industryItems.First();
  238. SetZuoXi();
  239. var order = _orderServiceMock.CreateOrder(industryId: industry.Id, industryName: industry.Name)
  240. .办理到派单员()
  241. .办理到归档(SetPaiDanYuan, data =>
  242. {
  243. data.IsEvasive = true;
  244. data.IsInactively = true;
  245. })
  246. .GetCreateResult();
  247. var orderEntity = await _orderRepository.GetAsync(order.Id);
  248. orderEntity.ShouldNotBeNull();
  249. var snapshot = await _orderSnapshotRepository.GetAsync(m => m.Id == order.Id);
  250. snapshot.ShouldNotBeNull();
  251. snapshot.IndustryId.ShouldBe(industry.Id);
  252. snapshot.IndustryName.ShouldBe(industry.Name);
  253. }
  254. /// <summary>
  255. /// 验证中心直办工单归档后 自动发布
  256. /// 是否推诿, 是否不积极
  257. /// </summary>
  258. /// <returns></returns>
  259. [Fact]
  260. public async Task AutoPublish_Test()
  261. {
  262. SetZuoXi();
  263. var order = _orderServiceMock.CreateOrder()
  264. .办理到派单员()
  265. .办理到归档(SetPaiDanYuan, data =>
  266. {
  267. data.IsEvasive = true;
  268. data.IsInactively = true;
  269. })
  270. .GetCreateResult();
  271. var publish = await _orderPublishRepository.GetAsync(m => m.No == order.No);
  272. publish.ShouldNotBeNull(order.No);
  273. var orderEntity = await _orderRepository.GetAsync(order.Id);
  274. orderEntity.ShouldNotBeNull();
  275. orderEntity.IsEvasive.ShouldBeTrue();
  276. orderEntity.IsInactively.ShouldBeTrue();
  277. orderEntity.Status.ShouldBe(EOrderStatus.Visited);
  278. orderEntity.OrgProcessingResults.ShouldNotBeNull();
  279. orderEntity.OrgProcessingResults.Key.ShouldBe("4");
  280. orderEntity.OrgProcessingResults.Value.ShouldBe("满意");
  281. orderEntity.SeatEvaluate.ShouldBe(ESeatEvaluate.Satisfied);
  282. }
  283. [Fact]
  284. public void Set一级部门_Test()
  285. {
  286. Set一级部门();
  287. }
  288. [Fact]
  289. public async Task IsStepUrgent_True_Test()
  290. {
  291. SetZuoXi();
  292. var order = _orderServiceMock.CreateOrder()
  293. .办理到派单员()
  294. .办理到归档(SetPaiDanYuan, data => data.IsStepUrgent = true, workflow =>
  295. {
  296. workflow.BusinessType = EBusinessType.DepartmentLeader;
  297. workflow.Opinion = "测试保存勾选紧急";
  298. })
  299. .GetCreateResult();
  300. order.ShouldNotBeNull();
  301. order.Id.ShouldNotBeNull();
  302. var orderDto = await _orderController.Get(order.Id);
  303. orderDto.IsStepUrgent.ShouldBeTrue();
  304. orderDto.IsStepUrgenText.ShouldBe("紧急");
  305. }
  306. /// <summary>
  307. /// 测试在办理的过程中能正确保存
  308. /// 1.与市民电话联系
  309. /// 2.已赴现场处置
  310. /// 3.其他
  311. /// 4.其他原因
  312. /// 5.经办人
  313. /// 6.经办人电话
  314. /// 7.沟通时间
  315. /// 8.沟通地点
  316. /// </summary>
  317. /// <returns></returns>
  318. [Fact]
  319. public async Task CreateOrder_Test()
  320. {
  321. SetZuoXi();
  322. var order = _orderServiceMock.CreateOrder()
  323. .办理到一级部门()
  324. .办理到二级部门(Set一级部门)
  325. .办理一级部门汇总(Set二级部门)
  326. .GetCreateResult();
  327. order.Id.ShouldNotBeNull();
  328. var orderEntity = await _orderRepository.GetAsync(order.Id);
  329. orderEntity.RealCommunicationAddress.ShouldNotBeNull();
  330. orderEntity.RealCommunicationTime.ShouldNotBeNull();
  331. orderEntity.RealContactLocale.ShouldNotBeNull();
  332. orderEntity.RealContactLocale.ShouldBe(true);
  333. orderEntity.RealHandlerName.ShouldNotBeNull();
  334. orderEntity.RealHandlerPhone.ShouldNotBeNull();
  335. }
  336. [Fact]
  337. public async Task GetOrderHandleTimeConfigByAcceptType_Test()
  338. {
  339. var result = await _orderController.GetOrderHandleTimeConfigByAcceptType(Share.Enums.FlowEngine.EFlowDirection.OrgToCenter, "10");
  340. result.Count.ShouldBe(1);
  341. result.TimeText.ShouldBe("1个工作日");
  342. result.TimeType.ShouldBe(ETimeType.WorkDay);
  343. }
  344. /// <summary>
  345. /// 测试取消发布功能
  346. /// </summary>
  347. /// <returns></returns>
  348. [Fact]
  349. public async Task CancelOrderPublish_Test()
  350. {
  351. var system = await _systemSettingRepository.Queryable()
  352. .Where(m => m.Code == SettingConstants.CancelPublishOrderEnabled)
  353. .FirstAsync();
  354. system.SettingValue[0] = "true";
  355. await _systemSettingRepository.UpdateAsync(system);
  356. _systemSettingCacheManager.DelSystemSetting(SettingConstants.CancelPublishOrderEnabled);
  357. SetZuoXi();
  358. var order = _orderServiceMock.CreateOrder()
  359. .办理到派单员()
  360. .办理到归档(SetPaiDanYuan, data =>
  361. {
  362. data.IsEvasive = true;
  363. data.IsInactively = true;
  364. })
  365. .GetCreateResult();
  366. var publish = await _orderPublishRepository.GetAsync(m => m.No == order.No);
  367. publish.ShouldNotBeNull(order.No);
  368. var orderEntity = await _orderRepository.GetAsync(order.Id);
  369. orderEntity.ShouldNotBeNull();
  370. orderEntity.IsEvasive.ShouldBeTrue();
  371. orderEntity.IsInactively.ShouldBeTrue();
  372. await _orderController.PublishCancelAsync(new PublishCancelInDto { OrderPublishId = publish.Id });
  373. var visit = await _orderVisitRepository.GetAsync(m => m.OrderId == order.Id);
  374. var publishCount = await _orderPublishRepository.Queryable().Where(m => m.OrderId == order.Id && m.IsDeleted == false).CountAsync();
  375. publishCount.ShouldBe(0, "发布工单数据已经被删除, 应该是0条");
  376. visit.ShouldNotBeNull("回访信息不存在");
  377. visit.VisitState.ShouldBe(EVisitState.Visited, "回访状态应该是已回访");
  378. orderEntity = await _orderRepository.GetAsync(order.Id);
  379. orderEntity.Status.ShouldBe(EOrderStatus.Filed);
  380. var publishList = await _orderController.PublishOrderList(new QueryOrderPublishDto
  381. {
  382. PageSize = 1000,
  383. QuerySelf = true
  384. });
  385. publishList.Items.Any(m => m.Id == order.Id).ShouldBeTrue("工单发布列表中没有取消的工单");
  386. SetZuoXi();
  387. // 验证是否能非上次发布人员发布
  388. try
  389. {
  390. await _orderController.PublishOrder(new PublishOrderDto { Id = order.Id });
  391. }
  392. catch (UserFriendlyException e)
  393. {
  394. e.Message.Contains("您不能发布").ShouldBeTrue();
  395. }
  396. // 验证被取消前的发布人能否继续发布
  397. SetPaiDanYuan();
  398. var inDto = _fixture.Create<PublishOrderDto>();
  399. inDto.Id = order.Id;
  400. await _orderController.PublishOrder(inDto);
  401. var published = await _orderPublishRepository.Queryable().Where(m => m.OrderId == order.Id && m.IsDeleted == false).FirstAsync();
  402. published.ShouldNotBeNull();
  403. published.IsDeleted.ShouldBeFalse();
  404. }
  405. /// <summary>
  406. /// 工单批量标注
  407. /// </summary>
  408. /// <returns></returns>
  409. [Fact]
  410. public async Task OrderSignBath_Test()
  411. {
  412. var inDto = new OrderSignBathInDto
  413. {
  414. IsSafetyDepartment = true,
  415. Remark = "单元测试标注",
  416. OrderIds = new List<string>()
  417. };
  418. inDto.OrderIds.Add(_orderServiceMock.CreateSnapshotOrder(SetWeiXin).办理到工单标注(SetZuoXi).GetCreateResult().Id);
  419. inDto.OrderIds.Add(_orderServiceMock.CreateSnapshotOrder(SetWeiXin).办理到工单标注(SetZuoXi).GetCreateResult().Id);
  420. Set班长();
  421. await _orderController.GetNextStepsWithRecommend(inDto.OrderIds.First());
  422. var result = await _orderController.OrderSignBathAsync(inDto);
  423. result.Contains("标注完成").ShouldBe(true);
  424. }
  425. /// <summary>
  426. /// 中心直接归档-自动发布后: 回访详情,部门办件结果没有(满意)问题;
  427. /// </summary>
  428. /// <returns></returns>
  429. [Fact]
  430. public async Task OrderVisitCentor_Test()
  431. {
  432. //ChangeAppScopeYiBin();
  433. //var order = _orderServiceMock.CreateOrder()
  434. // .办理到归档()
  435. // .GetCreateResult(); ;
  436. //var orgVisit = await _orderVisitDetailRepository.Queryable()
  437. // .Where(m => m.VisitTarget == EVisitTarget.Org)
  438. // .FirstAsync();
  439. //orgVisit.VisitContent.ShouldBe("满意");
  440. }
  441. #region 工单流程
  442. /// <summary>
  443. /// 工单从创建到归档完整流程
  444. /// </summary>
  445. [Fact]
  446. public async Task OrderHandleTest()
  447. {
  448. SetZuoXi();
  449. var flowInPaiDan = _orderServiceMock.CreateOrder()
  450. .办理到派单员();
  451. var orderInfo = flowInPaiDan.GetCreateResult();
  452. //todo check order
  453. var order = await _orderRepository.GetAsync(orderInfo.Id);
  454. order.ShouldNotBeNull();
  455. order.Status.ShouldBe(EOrderStatus.Handling);
  456. order.WorkflowId.ShouldNotBeNull();
  457. var workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true);
  458. workflow.ShouldNotBeNull();
  459. workflow.Status.ShouldBe(EWorkflowStatus.Runnable);
  460. var step = workflow.Steps.FirstOrDefault(d=>d.BusinessType == EBusinessType.Send);
  461. var trace = workflow.Traces.FirstOrDefault(d => d.BusinessType == EBusinessType.Send);
  462. step.ShouldNotBeNull();
  463. trace.ShouldNotBeNull();
  464. step.Status.ShouldBe(EWorkflowStepStatus.WaitForAccept);
  465. trace.Status.ShouldBe(EWorkflowStepStatus.WaitForAccept);
  466. step.FlowAssignType.ShouldBe(EFlowAssignType.User);
  467. trace.FlowAssignType.ShouldBe(EFlowAssignType.User);
  468. step.RoleId.ShouldNotBeNull();
  469. trace.RoleId.ShouldNotBeNull();
  470. var flowInLevelOne = flowInPaiDan.办理到一级部门(SetPaiDanYuan);
  471. orderInfo = flowInLevelOne.GetCreateResult();
  472. order = await _orderRepository.GetAsync(orderInfo.Id);
  473. order.ShouldNotBeNull();
  474. order.Status.ShouldBe(EOrderStatus.Handling);
  475. order.WorkflowId.ShouldNotBeNull();
  476. workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true);
  477. workflow.ShouldNotBeNull();
  478. workflow.Status.ShouldBe(EWorkflowStatus.Runnable);
  479. step = workflow.Steps.FirstOrDefault(d=> d.Status == EWorkflowStepStatus.WaitForAccept);
  480. trace = workflow.Traces.FirstOrDefault(d=> d.Status == EWorkflowStepStatus.WaitForAccept);
  481. step.ShouldNotBeNull();
  482. trace.ShouldNotBeNull();
  483. step.BusinessType.ShouldBe(EBusinessType.Department);
  484. trace.BusinessType.ShouldBe(EBusinessType.Department);
  485. step.FlowAssignType.ShouldBe(EFlowAssignType.Org);
  486. trace.FlowAssignType.ShouldBe(EFlowAssignType.Org);
  487. step.HandlerOrgId.ShouldNotBeNull();
  488. trace.HandlerOrgId.ShouldNotBeNull();
  489. step.HandlerOrgId.CalcOrgLevel().ShouldBe(1);
  490. trace.HandlerOrgId.CalcOrgLevel().ShouldBe(1);
  491. var flowInLevelTwo = flowInLevelOne.办理到二级部门(Set一级部门);
  492. orderInfo = flowInLevelTwo.GetCreateResult();
  493. order = await _orderRepository.GetAsync(orderInfo.Id);
  494. order.ShouldNotBeNull();
  495. order.Status.ShouldBe(EOrderStatus.Handling);
  496. order.WorkflowId.ShouldNotBeNull();
  497. workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true);
  498. workflow.ShouldNotBeNull();
  499. workflow.Status.ShouldBe(EWorkflowStatus.Runnable);
  500. step = workflow.Steps.FirstOrDefault(d=> d.Status == EWorkflowStepStatus.WaitForAccept);
  501. trace = workflow.Traces.FirstOrDefault(d=> d.Status == EWorkflowStepStatus.WaitForAccept);
  502. step.ShouldNotBeNull();
  503. trace.ShouldNotBeNull();
  504. step.BusinessType.ShouldBe(EBusinessType.Department);
  505. trace.BusinessType.ShouldBe(EBusinessType.Department);
  506. step.FlowAssignType.ShouldBe(EFlowAssignType.Org);
  507. trace.FlowAssignType.ShouldBe(EFlowAssignType.Org);
  508. step.HandlerOrgId.ShouldNotBeNull();
  509. trace.HandlerOrgId.ShouldNotBeNull();
  510. step.HandlerOrgId.CalcOrgLevel().ShouldBe(2);
  511. trace.HandlerOrgId.CalcOrgLevel().ShouldBe(2);
  512. var flowInLevelOneSummary = flowInLevelTwo.办理一级部门汇总(Set二级部门);
  513. orderInfo = flowInLevelOneSummary.GetCreateResult();
  514. order = await _orderRepository.GetAsync(orderInfo.Id);
  515. order.ShouldNotBeNull();
  516. order.Status.ShouldBe(EOrderStatus.Handling);
  517. order.WorkflowId.ShouldNotBeNull();
  518. workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true);
  519. workflow.ShouldNotBeNull();
  520. workflow.Status.ShouldBe(EWorkflowStatus.Runnable);
  521. step = workflow.Steps.FirstOrDefault(d=> d.Status == EWorkflowStepStatus.WaitForAccept);
  522. trace = workflow.Traces.FirstOrDefault(d=> d.Status == EWorkflowStepStatus.WaitForAccept);
  523. step.ShouldNotBeNull();
  524. trace.ShouldNotBeNull();
  525. step.StepType.ShouldBe(EStepType.Summary);
  526. trace.StepType.ShouldBe(EStepType.Summary);
  527. step.BusinessType.ShouldBe(EBusinessType.Department);
  528. trace.BusinessType.ShouldBe(EBusinessType.Department);
  529. step.FlowAssignType.ShouldBe(EFlowAssignType.Org);
  530. trace.FlowAssignType.ShouldBe(EFlowAssignType.Org);
  531. step.HandlerOrgId.ShouldNotBeNull();
  532. trace.HandlerOrgId.ShouldNotBeNull();
  533. step.HandlerOrgId.CalcOrgLevel().ShouldBe(1);
  534. trace.HandlerOrgId.CalcOrgLevel().ShouldBe(1);
  535. var flowInEnd = flowInLevelOneSummary.办理到归档(Set一级部门);
  536. orderInfo = flowInEnd.GetCreateResult();
  537. order = await _orderRepository.GetAsync(orderInfo.Id);
  538. order.ShouldNotBeNull();
  539. order.Status.ShouldBe(EOrderStatus.Filed);
  540. order.FiledTime.ShouldNotBeNull();
  541. order.WorkflowId.ShouldNotBeNull();
  542. workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withTraces: true);
  543. workflow.ShouldNotBeNull();
  544. workflow.Status.ShouldBe(EWorkflowStatus.Completed);
  545. step = workflow.Steps.FirstOrDefault(d=> d.StepType == EStepType.End);
  546. trace = workflow.Traces.FirstOrDefault(d=> d.StepType == EStepType.End);
  547. step.ShouldNotBeNull();
  548. trace.ShouldNotBeNull();
  549. //
  550. // flowInEnd.发布工单(SetZuoXi)
  551. // .GetCreateResult();
  552. }
  553. #endregion
  554. }