OrderComplementController.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. using Hotline.Article;
  2. using Hotline.FlowEngine.Workflows;
  3. using Hotline.Orders;
  4. using Hotline.Repository.SqlSugar.Extensions;
  5. using Hotline.Share.Dtos;
  6. using Hotline.Share.Dtos.Article;
  7. using Hotline.Share.Dtos.Order;
  8. using Hotline.Share.Enums.Article;
  9. using Hotline.Tools;
  10. using Hotline.Users;
  11. using MapsterMapper;
  12. using Microsoft.AspNetCore.Mvc;
  13. using XF.Domain.Authentications;
  14. using XF.Domain.Exceptions;
  15. using XF.Domain.Repository;
  16. namespace Hotline.Api.Controllers.OrderApi;
  17. public class OrderComplementController : BaseController
  18. {
  19. private readonly IOrderDomainService _orderDomainService;
  20. private readonly ISessionContext _sessionContext;
  21. private readonly IRepository<OrderComplement> _orderComplementRepository;
  22. private readonly IRepository<WorkflowStep> _workflowStepRepository;
  23. private readonly IRepository<User> _userRepository;
  24. private readonly ICircularRecordDomainService _circularRecordDomainService;
  25. private readonly IComplementOrderService _complementOrderService;
  26. private readonly IMapper _mapper;
  27. private readonly IRepository<OrderComplementCopy> _orderComplementCopyRepository;
  28. public OrderComplementController(IOrderDomainService orderDomainService,
  29. ISessionContext sessionContext,
  30. IRepository<OrderComplement> orderComplementRepository,
  31. IRepository<WorkflowStep> workflowStepRepository,
  32. IRepository<User> userRepository,
  33. ICircularRecordDomainService circularRecordDomainService,
  34. IComplementOrderService complementOrderService,
  35. IMapper mapper,
  36. IRepository<OrderComplementCopy> orderComplementCopyRepository)
  37. {
  38. _orderDomainService = orderDomainService;
  39. _sessionContext = sessionContext;
  40. _orderComplementRepository = orderComplementRepository;
  41. _workflowStepRepository = workflowStepRepository;
  42. _userRepository = userRepository;
  43. _circularRecordDomainService = circularRecordDomainService;
  44. _complementOrderService = complementOrderService;
  45. _mapper = mapper;
  46. _orderComplementCopyRepository = orderComplementCopyRepository;
  47. }
  48. /// <summary>
  49. /// 补充
  50. /// </summary>
  51. /// <param name="dto"></param>
  52. /// <returns></returns>
  53. [HttpPost]
  54. public async Task<string> Supplement([FromBody] AddOrderComplementDto dto)
  55. {
  56. return await _orderDomainService.AddOrderComplementAsync(dto, HttpContext.RequestAborted);
  57. }
  58. /// <summary>
  59. /// 添加补充
  60. /// </summary>
  61. /// <param name="dto"></param>
  62. /// <returns></returns>
  63. [HttpPost("add_order_complement")]
  64. public async Task AddOrderComplement([FromBody] AddComplementDto dto)
  65. {
  66. if (dto == null)
  67. throw UserFriendlyException.SameMessage("数据错误!");
  68. if (string.IsNullOrEmpty(dto.Opinion))
  69. throw UserFriendlyException.SameMessage("补充内容不能为空!");
  70. if (dto.Opinion.Length > 2000)
  71. throw UserFriendlyException.SameMessage("补充内容限制2000字!");
  72. var data = await _orderDomainService.GetOrderAsync(dto.OrderId, cancellationToken: HttpContext.RequestAborted);
  73. if (data == null)
  74. throw UserFriendlyException.SameMessage("工单查询失败!");
  75. OrderComplement complement = new OrderComplement()
  76. {
  77. OrderId = dto.OrderId,
  78. Opinion = dto.Opinion,
  79. SupplyName = _sessionContext.UserName,
  80. SupplyOrg = _sessionContext.OrgName,
  81. SupplyTime = DateTime.Now,
  82. No = data.No,
  83. IsProComplement = false
  84. };
  85. var id = await _orderComplementRepository.AddAsync(complement, HttpContext.RequestAborted);
  86. if (!string.IsNullOrEmpty(id))
  87. {
  88. #region 处理推送消息
  89. //获取当前办理节点数据
  90. var work = await _workflowStepRepository.GetAsync(p => p.Id == data.ActualHandleStepId, HttpContext.RequestAborted);
  91. if (work != null)
  92. {
  93. //获取办理指定类型
  94. var workflowStepHandler = work.GetWorkflowStepHandler();
  95. if (workflowStepHandler != null)
  96. {
  97. AddCircularDto circularDto = new AddCircularDto()
  98. {
  99. Title = "工单补充",
  100. Content = "工单" + data.No + "有补充内容,请注意查收!",
  101. CircularTypeId = "6",
  102. CircularTypeName = "工单补充",
  103. IsMustRead = true,
  104. SourceOrgId = _sessionContext.RequiredOrgId,
  105. SourceOrgName = _sessionContext.OrgName,
  106. CircularType = ECircularType.Person
  107. };
  108. List<CircularReadGroupDto> users = [];
  109. if (!string.IsNullOrEmpty(workflowStepHandler.UserId)) //指定用户
  110. {
  111. users.Add(new CircularReadGroupDto()
  112. {
  113. UserId = workflowStepHandler.UserId,
  114. UserName = workflowStepHandler.Username
  115. });
  116. }
  117. else if (!string.IsNullOrEmpty(workflowStepHandler.RoleId)) //指定角色
  118. {
  119. //查询指定角色下面所有的用户
  120. var userlist = await _userRepository.Queryable().Where(x =>
  121. x.OrgId == workflowStepHandler.OrgId && x.Roles.Any(d => workflowStepHandler.RoleId.Contains(d.Id)))
  122. .Select(d => new CircularReadGroupDto
  123. {
  124. UserId = d.Id,
  125. UserName = d.Name
  126. }).ToListAsync();
  127. users.AddRange(userlist);
  128. }
  129. else if (!string.IsNullOrEmpty(workflowStepHandler.OrgId)) //指定部门
  130. {
  131. users.Add(new CircularReadGroupDto()
  132. {
  133. OrgId = workflowStepHandler.OrgId,
  134. OrgName = workflowStepHandler.OrgName
  135. });
  136. circularDto.CircularType = ECircularType.Org;
  137. }
  138. if (users != null && users.Count > 0)
  139. {
  140. circularDto.CircularReadGroups = users;
  141. //调用推送消息通用接口
  142. await _circularRecordDomainService.AddCircularMessage(circularDto, HttpContext.RequestAborted);
  143. }
  144. }
  145. }
  146. #endregion
  147. }
  148. }
  149. /// <summary>
  150. /// 修改补充
  151. /// </summary>
  152. /// <param name="dto"></param>
  153. /// <returns></returns>
  154. [HttpPost("update_order_complement")]
  155. public async Task UpdateOrderComplement([FromBody] UpdateComplementDto dto)
  156. {
  157. if (dto == null)
  158. throw UserFriendlyException.SameMessage("数据错误!");
  159. if (string.IsNullOrEmpty(dto.Opinion))
  160. throw UserFriendlyException.SameMessage("补充内容不能为空!");
  161. if (dto.Opinion.Length > 2000)
  162. throw UserFriendlyException.SameMessage("补充内容限制2000字!");
  163. var data = await _orderComplementRepository.GetAsync(p => p.Id == dto.Id, cancellationToken: HttpContext.RequestAborted);
  164. if (data == null)
  165. throw UserFriendlyException.SameMessage("补充查询失败!");
  166. //修改记录
  167. var dataCopy = new OrderComplementCopy
  168. {
  169. OperationType = "0",
  170. OrderId = data.OrderId,
  171. Opinion = data.Opinion,
  172. SupplyName = data.SupplyName,
  173. SupplyOrg = data.SupplyOrg,
  174. SupplyTime = data.SupplyTime,
  175. DsBisId = data.DsBisId,
  176. No = data.No,
  177. IsProComplement = data.IsProComplement,
  178. FileJson = data.FileJson,
  179. ComplementId = data.Id
  180. };
  181. await _orderComplementCopyRepository.AddAsync(dataCopy, HttpContext.RequestAborted);
  182. //修改
  183. data.Opinion = dto.Opinion;
  184. await _orderComplementRepository.UpdateAsync(data, HttpContext.RequestAborted);
  185. }
  186. /// <summary>
  187. /// 删除补充
  188. /// </summary>
  189. /// <returns></returns>
  190. [HttpGet("delete_order_complement/{id}")]
  191. public async Task DeleteOrderComplement(string id)
  192. {
  193. var data = await _orderComplementRepository.GetAsync(p => p.Id == id, cancellationToken: HttpContext.RequestAborted);
  194. if (data == null)
  195. throw UserFriendlyException.SameMessage("补充查询失败!");
  196. //修改记录
  197. var dataCopy = new OrderComplementCopy
  198. {
  199. OperationType = "1",
  200. OrderId = data.OrderId,
  201. Opinion = data.Opinion,
  202. SupplyName = data.SupplyName,
  203. SupplyOrg = data.SupplyOrg,
  204. SupplyTime = data.SupplyTime,
  205. DsBisId = data.DsBisId,
  206. No = data.No,
  207. IsProComplement = data.IsProComplement,
  208. FileJson = data.FileJson,
  209. ComplementId = data.Id
  210. };
  211. await _orderComplementCopyRepository.AddAsync(dataCopy, HttpContext.RequestAborted);
  212. //删除
  213. await _orderComplementRepository.RemoveAsync(p => p.Id == id, false, HttpContext.RequestAborted);
  214. }
  215. /// <summary>
  216. /// 查询补充详情
  217. /// </summary>
  218. /// <param name="id"></param>
  219. /// <returns></returns>
  220. [HttpGet("get_complement_order_info/{id}")]
  221. public async Task<ComplementOrderDto> GetComplementOrderInfo(string id)
  222. {
  223. var data = await _orderComplementRepository.GetAsync(p => p.Id == id, cancellationToken: HttpContext.RequestAborted);
  224. if (data == null)
  225. throw UserFriendlyException.SameMessage("补充查询失败!");
  226. return _mapper.Map<ComplementOrderDto>(data);
  227. }
  228. /// <summary>
  229. /// 补充查询
  230. /// </summary>
  231. /// <param name="dto"></param>
  232. /// <returns></returns>
  233. [HttpGet("get-order-complement-list")]
  234. public async Task<PagedDto<ComplementOrderDto>> GetOrderComplementList([FromQuery] ComplementOrderRequestDto dto)
  235. {
  236. var (total, items) = await _complementOrderService.GetOrderComplementList(dto)
  237. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  238. return new PagedDto<ComplementOrderDto>(total, _mapper.Map<IReadOnlyList<ComplementOrderDto>>(items));
  239. }
  240. /// <summary>
  241. /// 补充查询列表导出
  242. /// </summary>
  243. /// <param name="dto"></param>
  244. /// <returns></returns>
  245. [HttpPost("get-order-complement-list/export")]
  246. public async Task<FileStreamResult> OrderTerminateListExport([FromBody] ExportExcelDto<ComplementOrderRequestDto> dto)
  247. {
  248. var query = _complementOrderService.GetOrderComplementList(dto.QueryDto);
  249. List<OrderComplement> data;
  250. if (dto.IsExportAll)
  251. {
  252. data = await query.ToListAsync(HttpContext.RequestAborted);
  253. }
  254. else
  255. {
  256. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  257. data = items;
  258. }
  259. var dataDtos = _mapper.Map<ICollection<ComplementOrderDto>>(data);
  260. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<ComplementOrderDto>(dto.ColumnInfos);
  261. var dtos = dataDtos
  262. .Select(stu => _mapper.Map(stu, typeof(ComplementOrderDto), dynamicClass))
  263. .Cast<object>()
  264. .ToList();
  265. var stream = ExcelHelper.CreateStream(dtos);
  266. return ExcelStreamResult(stream, "补充查询列表");
  267. }
  268. /// <summary>
  269. /// 补充操作记录查询
  270. /// </summary>
  271. /// <param name="dto"></param>
  272. /// <returns></returns>
  273. [HttpGet("get-order-complement-copy-list")]
  274. public async Task<PagedDto<ComplementOrderCopDto>> GetOrderComplementCopyList([FromQuery] ComplementOrderCopyRequestDto dto)
  275. {
  276. var (total, items) = await _complementOrderService.GetOrderComplementCopyList(dto)
  277. .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
  278. return new PagedDto<ComplementOrderCopDto>(total, _mapper.Map<IReadOnlyList<ComplementOrderCopDto>>(items));
  279. }
  280. /// <summary>
  281. /// 补充操作记录列表导出
  282. /// </summary>
  283. /// <param name="dto"></param>
  284. /// <returns></returns>
  285. [HttpPost("get-order-complement-copy-list/export")]
  286. public async Task<FileStreamResult> OrderTerminateCopyListExport([FromBody] ExportExcelDto<ComplementOrderCopyRequestDto> dto)
  287. {
  288. var query = _complementOrderService.GetOrderComplementCopyList(dto.QueryDto);
  289. List<OrderComplementCopy> data;
  290. if (dto.IsExportAll)
  291. {
  292. data = await query.ToListAsync(HttpContext.RequestAborted);
  293. }
  294. else
  295. {
  296. var (_, items) = await query.ToPagedListAsync(dto.QueryDto, HttpContext.RequestAborted);
  297. data = items;
  298. }
  299. var dataDtos = _mapper.Map<ICollection<ComplementOrderCopDto>>(data);
  300. dynamic? dynamicClass = DynamicClassHelper.CreateDynamicClass<ComplementOrderCopDto>(dto.ColumnInfos);
  301. var dtos = dataDtos
  302. .Select(stu => _mapper.Map(stu, typeof(ComplementOrderCopDto), dynamicClass))
  303. .Cast<object>()
  304. .ToList();
  305. var stream = ExcelHelper.CreateStream(dtos);
  306. return ExcelStreamResult(stream, " 补充操作记录列表");
  307. }
  308. /// <summary>
  309. /// 查看记录删除
  310. /// </summary>
  311. /// <param name="id"></param>
  312. /// <returns></returns>
  313. [HttpGet("get-complement-order-copy-delete/{id}")]
  314. public async Task<ComplementOrderCopyDetailDto> GetComplementOrderCopyDelete(string id)
  315. {
  316. ComplementOrderCopyDetailDto detailDto = new ComplementOrderCopyDetailDto();
  317. var data = await _orderComplementCopyRepository.Queryable()
  318. .Includes(p => p.Order)
  319. .Where(p => p.Id == id)
  320. .FirstAsync();
  321. if (data != null)
  322. {
  323. detailDto.No = data.No;
  324. detailDto.OrderTitle = data.Order.Title;
  325. detailDto.UserName = data.SupplyName;
  326. detailDto.OrgName = data.CreatorOrgName;
  327. detailDto.Opinion = data.Opinion;
  328. detailDto.OperationName = data.CreatorName;
  329. detailDto.OperationTime = data.CreationTime;
  330. }
  331. return detailDto;
  332. }
  333. /// <summary>
  334. /// 查看记录修改
  335. /// </summary>
  336. /// <param name="id"></param>
  337. /// <returns></returns>
  338. [HttpGet("get-complement-order-copy-update/{id}")]
  339. public async Task<object> GetComplementOrderCopyUpdate(string id)
  340. {
  341. ComplementOrderCopyDetailListDto copyDetailListDto = new ComplementOrderCopyDetailListDto();
  342. var updateData = await _orderComplementCopyRepository.Queryable()
  343. .Includes(p => p.Order)
  344. .Where(p => p.Id == id)
  345. .FirstAsync();
  346. if (updateData is null)
  347. throw UserFriendlyException.SameMessage("修改明细查询失败!");
  348. ComplementOrderCopyDetailDto oldInfo = new ComplementOrderCopyDetailDto
  349. {
  350. No = updateData.No,
  351. OrderTitle = updateData.Order.Title,
  352. UserName = updateData.SupplyName,
  353. OrgName = updateData.SupplyOrg,
  354. SupplyTime = updateData.SupplyTime,
  355. Opinion = updateData.Opinion,
  356. };
  357. var copyNew = await _orderComplementCopyRepository.Queryable()
  358. .OrderBy(x => x.CreationTime)
  359. .FirstAsync(p => p.ComplementId == updateData.ComplementId && p.CreationTime > updateData.CreationTime);
  360. ComplementOrderCopyDetailDto newInfo = null;
  361. if (copyNew != null)
  362. {
  363. newInfo = new ComplementOrderCopyDetailDto
  364. {
  365. No = copyNew.No,
  366. OrderTitle = updateData.Order.Title,
  367. UserName = updateData.CreatorName,
  368. OrgName = updateData.CreatorOrgName,
  369. SupplyTime = updateData.CreationTime,
  370. Opinion = copyNew.Opinion,
  371. };
  372. }
  373. else
  374. {
  375. var orderComplement = await _orderComplementRepository.Queryable()
  376. .FirstAsync(d => d.Id == updateData.ComplementId);
  377. if (orderComplement is not null)
  378. {
  379. newInfo = new ComplementOrderCopyDetailDto
  380. {
  381. No = orderComplement.No,
  382. OrderTitle = updateData.Order.Title,
  383. UserName = updateData.CreatorName,
  384. OrgName = updateData.CreatorOrgName,
  385. SupplyTime = updateData.CreationTime,
  386. Opinion = orderComplement.Opinion
  387. };
  388. }
  389. }
  390. return new { OldInfo = oldInfo, NewInfo = newInfo };
  391. }
  392. }