EnterpriseController.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. using DataSharing.Application.Identity;
  2. using DataSharing.Enterprise;
  3. using DataSharing.RawData;
  4. using DataSharing.Share.Dtos;
  5. using DataSharing.Share.Dtos.Enterprise;
  6. using DotNetCore.CAP;
  7. using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
  8. using Hotline.Share.Dtos.File;
  9. using Hotline.Share.Dtos.FlowEngine.Workflow;
  10. using MapsterMapper;
  11. using MediatR;
  12. using Microsoft.AspNetCore.Authorization;
  13. using Microsoft.AspNetCore.DataProtection;
  14. using Microsoft.AspNetCore.Mvc;
  15. using Microsoft.Extensions.Options;
  16. using XF.Domain.Filters;
  17. using XF.Domain.Options;
  18. using XF.Domain.Repository;
  19. using static Org.BouncyCastle.Math.EC.ECCurve;
  20. namespace DataSharing.Host.Controllers
  21. {
  22. /// <summary>
  23. /// 企业专班
  24. /// </summary>
  25. public class EnterpriseController : BaseController
  26. {
  27. private readonly IMapper _mapper;
  28. private readonly IRepository<DsReceiveEnterpriseData> _dsReceiveEnterpriseDataRepository;
  29. private readonly EnterpriseClient _enterpriseClient;
  30. private readonly IMediator _mediator;
  31. private readonly ICapPublisher _capPublisher;
  32. private readonly IRepository<DsOrder> _dataOrderRepository;
  33. private readonly IChannelConfigurationManager _channelConfigurationManager;
  34. private readonly IIdentityAppService _identityAppService;
  35. private readonly IOptionsSnapshot<IdentityConfiguration> _identityOptionsAccessor;
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. /// <param name="mapper"></param>
  40. /// <param name="dsReceiveEnterpriseDataRepository"></param>
  41. /// <param name="enterpriseClient"></param>
  42. /// <param name="mediator"></param>
  43. /// <param name="capPublisher"></param>
  44. /// <param name="dataOrderRepository"></param>
  45. /// <param name="channelConfigurationManager"></param>
  46. public EnterpriseController(IMapper mapper, IRepository<DsReceiveEnterpriseData> dsReceiveEnterpriseDataRepository,
  47. EnterpriseClient enterpriseClient,
  48. IMediator mediator,
  49. ICapPublisher capPublisher,
  50. IRepository<DsOrder> dataOrderRepository,
  51. IChannelConfigurationManager channelConfigurationManager,
  52. IIdentityAppService identityAppService,
  53. IOptionsSnapshot<IdentityConfiguration> identityOptionsAccessor)
  54. {
  55. _mapper = mapper;
  56. _dsReceiveEnterpriseDataRepository = dsReceiveEnterpriseDataRepository;
  57. _enterpriseClient = enterpriseClient;
  58. _mediator = mediator;
  59. _capPublisher = capPublisher;
  60. _dataOrderRepository = dataOrderRepository;
  61. _channelConfigurationManager = channelConfigurationManager;
  62. _identityAppService = identityAppService;
  63. _identityOptionsAccessor = identityOptionsAccessor;
  64. }
  65. /// <summary>
  66. /// 根据账号、秘钥获取token授权
  67. /// </summary>
  68. /// <param name="ClientID">账号</param>
  69. /// <param name="Secret">密码</param>
  70. /// <returns></returns>
  71. [HttpPost("api/token")]
  72. [AllowAnonymous]
  73. public async Task<OpenResponse> GetToken([FromBody] TokenAccount dto)
  74. {
  75. var token = await _identityAppService.LoginTokenAsync(new LoginDto() { Username = dto.clientid, Password = dto.clientsecret }, HttpContext.RequestAborted);
  76. if (token == null || !token.IsSuccess)
  77. return OpenResponse.Ok(GetDataBaseReponse<string>.Failed(token?.Message));
  78. var jwtOptions = _identityOptionsAccessor.Value.Jwt;
  79. TokenModel tokenInfo = new()
  80. {
  81. expires_in = jwtOptions.Expired,
  82. access_token = token.Token
  83. };
  84. return OpenResponse.Ok(GetDataBaseReponse<TokenModel>.Success(tokenInfo, "授权成功"));
  85. }
  86. /// <summary>
  87. /// 查询企业专班
  88. /// </summary>
  89. /// <param name="dto"></param>
  90. /// <returns></returns>
  91. [HttpPost("platform/12345/selectEnterpriseList")]
  92. public async Task<OpenResponse> GetEnterpriseList([FromBody] SelectEnterpriseListDto dto)
  93. {
  94. var enterpriseList = _mapper.Map<SelectEnterpriseList>(dto);
  95. var configEnterprise = _channelConfigurationManager.GetConfigurationEnterprise();
  96. string baseAddress = configEnterprise.AddressUrl;
  97. if (!baseAddress.EndsWith('/'))
  98. baseAddress += "/";
  99. var response = await _enterpriseClient.RequestAsync<EnterpriseResponse>(baseAddress + YbEnterpriseDefaults.PathEnterprisesList, "Post", System.Text.Json.JsonSerializer.Serialize(enterpriseList), HttpContext.RequestAborted);
  100. if (response != null)
  101. {
  102. if (response.success == true && response.data != null)
  103. {
  104. return OpenResponse.Ok(System.Text.Json.JsonSerializer.Deserialize<EnRecordsDto>(response.data.ToString()));
  105. }
  106. }
  107. return OpenResponse.Ok("");
  108. }
  109. /// <summary>
  110. /// 企业服务提交办理结果
  111. /// </summary>
  112. /// <param name="dto"></param>
  113. /// <returns></returns>
  114. [HttpPost("api/yb12345/enterprise/writeResult")]
  115. public async Task<OpenResponse> WriteResult([FromBody] WriteResultDto dto)
  116. {
  117. //验证数据
  118. string strResult = dto.Validate();
  119. if (!string.IsNullOrEmpty(strResult))
  120. return OpenResponse.Ok(EnterpriseDeResponse.Failed(description: strResult));
  121. var data = new DsReceiveEnterpriseData()
  122. {
  123. ExternalId = dto.ReplyCode,
  124. ServiceInterface = "api/yb12345/enterprise/writeResult",
  125. ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto)
  126. };
  127. var id = await _dsReceiveEnterpriseDataRepository.AddAsync(data, HttpContext.RequestAborted);
  128. var order = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.ReplyCode, HttpContext.RequestAborted);
  129. List<FileDto> Files = new();
  130. if (dto.ReplyFiles != null && dto.ReplyFiles.Count > 0)
  131. {
  132. foreach (var item in dto.ReplyFiles)
  133. {
  134. byte[] fileContentBytes = Convert.FromBase64String(item.FileText);
  135. var fileData = SendFileData(fileContentBytes, item.Filename, item.Fileformat, dto.ReplyResultType == 2 ? "退回附件" : "办理上传");
  136. if (fileData != null)
  137. {
  138. Files.Add(fileData);
  139. }
  140. }
  141. }
  142. if (!string.IsNullOrEmpty(id))
  143. {
  144. //如果是办理中调用
  145. if (dto.ReplyResultType != 0)
  146. {
  147. string FinishType = "";
  148. if (dto.ReplyResultType == 2)
  149. FinishType = "0";
  150. else if (dto.ReplyResultType == 1)
  151. FinishType = "1";
  152. if (order != null)
  153. {
  154. OrderResultDto orderResultDto = new()
  155. {
  156. OrderId = order.OrderId,
  157. FinishType = FinishType,
  158. Opinion = dto.ReplyContent,
  159. Files = Files
  160. };
  161. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReultSend, orderResultDto, cancellationToken: HttpContext.RequestAborted);
  162. }
  163. }
  164. else
  165. {
  166. //这里调用业务接口,推送办理数据
  167. List<WorkflowTraceDto> Traces = new()
  168. {
  169. new()
  170. {
  171. HandlerName = dto.ReplyUserName,
  172. HandlerOrgName = dto.ReplyBMName,
  173. HandleTime = dto.ReplyDate,
  174. Opinion = dto.ReplyContent,
  175. Files=Files
  176. }
  177. };
  178. AddOrderTracesDto addOrderTracesDto = new()
  179. {
  180. OrderId = order.OrderId,
  181. Traces = Traces
  182. };
  183. if (order != null)
  184. await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderAddTraces, addOrderTracesDto, cancellationToken: HttpContext.RequestAborted);
  185. }
  186. //这里往业务系统推送数据
  187. return OpenResponse.Ok(EnterpriseDeResponse.Success("回复提交成功"));
  188. }
  189. return OpenResponse.Ok(EnterpriseDeResponse.Failed("接口调用失败!"));
  190. }
  191. /// <summary>
  192. /// 将文件流上传到附件服务器
  193. /// </summary>
  194. /// <param name="fileContentBytes">文件流</param>
  195. /// <param name="fileName">文件名称</param>
  196. /// <param name="type">文件类型</param>
  197. /// <param name="classify">文件分类</param>
  198. /// <returns></returns>
  199. private FileDto SendFileData(byte[] fileContentBytes, string fileName, string type, string classify)
  200. {
  201. var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile();
  202. // 构造字典文件数据
  203. // 接口参数名称为files
  204. CFormUpload.FileParameter fileParameter = new("fileData", fileContentBytes, fileName, "multipart/form-data");
  205. Dictionary<string, object> dicParam = new()
  206. {
  207. { fileName, fileParameter }
  208. };
  209. string url = string.Format("{0}{1}?source={2}", businessFile.BaseUrl, businessFile.UploadUrlAddress, businessFile.Source);
  210. var result = CFormUpload.MultipartFormDataPost(url, null, dicParam, "");
  211. FileDto fileDto = null;
  212. if (!string.IsNullOrEmpty(result))
  213. {
  214. var resultData = Newtonsoft.Json.JsonConvert.DeserializeObject<BusinessFileResponse>(result);
  215. if (resultData != null && resultData.code == 0)
  216. {
  217. fileDto = new()
  218. {
  219. Name = fileName,
  220. Type = type,
  221. Classify = classify,
  222. Additions = resultData.result.id,
  223. Path = resultData.result.path
  224. };
  225. }
  226. }
  227. return fileDto;
  228. }
  229. }
  230. }