using DataSharing.Application.Identity; using DataSharing.Enterprise; using DataSharing.RawData; using DataSharing.Share.Dtos; using DataSharing.Share.Dtos.Enterprise; using DotNetCore.CAP; using Hotline.Share.Dtos.DataSharing.PusherHotlineDto; using Hotline.Share.Dtos.File; using Hotline.Share.Dtos.FlowEngine.Workflow; using MapsterMapper; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; using XF.Domain.Filters; using XF.Domain.Options; using XF.Domain.Repository; using static Org.BouncyCastle.Math.EC.ECCurve; namespace DataSharing.Host.Controllers { /// /// 企业专班 /// public class EnterpriseController : BaseController { private readonly IMapper _mapper; private readonly IRepository _dsReceiveEnterpriseDataRepository; private readonly EnterpriseClient _enterpriseClient; private readonly IMediator _mediator; private readonly ICapPublisher _capPublisher; private readonly IRepository _dataOrderRepository; private readonly IChannelConfigurationManager _channelConfigurationManager; private readonly IIdentityAppService _identityAppService; private readonly IOptionsSnapshot _identityOptionsAccessor; /// /// /// /// /// /// /// /// /// /// public EnterpriseController(IMapper mapper, IRepository dsReceiveEnterpriseDataRepository, EnterpriseClient enterpriseClient, IMediator mediator, ICapPublisher capPublisher, IRepository dataOrderRepository, IChannelConfigurationManager channelConfigurationManager, IIdentityAppService identityAppService, IOptionsSnapshot identityOptionsAccessor) { _mapper = mapper; _dsReceiveEnterpriseDataRepository = dsReceiveEnterpriseDataRepository; _enterpriseClient = enterpriseClient; _mediator = mediator; _capPublisher = capPublisher; _dataOrderRepository = dataOrderRepository; _channelConfigurationManager = channelConfigurationManager; _identityAppService = identityAppService; _identityOptionsAccessor = identityOptionsAccessor; } /// /// 根据账号、秘钥获取token授权 /// /// 账号 /// 密码 /// [HttpPost("api/token")] [AllowAnonymous] public async Task GetToken([FromBody] TokenAccount dto) { var token = await _identityAppService.LoginTokenAsync(new LoginDto() { Username = dto.clientid, Password = dto.clientsecret }, HttpContext.RequestAborted); if (token == null || !token.IsSuccess) return OpenResponse.Ok(GetDataBaseReponse.Failed(token?.Message)); var jwtOptions = _identityOptionsAccessor.Value.Jwt; TokenModel tokenInfo = new() { expires_in = jwtOptions.Expired, access_token = token.Token }; return OpenResponse.Ok(GetDataBaseReponse.Success(tokenInfo, "授权成功")); } /// /// 查询企业专班 /// /// /// [HttpPost("platform/12345/selectEnterpriseList")] public async Task GetEnterpriseList([FromBody] SelectEnterpriseListDto dto) { var enterpriseList = _mapper.Map(dto); var configEnterprise = _channelConfigurationManager.GetConfigurationEnterprise(); string baseAddress = configEnterprise.AddressUrl; if (!baseAddress.EndsWith('/')) baseAddress += "/"; var response = await _enterpriseClient.RequestAsync(baseAddress + YbEnterpriseDefaults.PathEnterprisesList, "Post", System.Text.Json.JsonSerializer.Serialize(enterpriseList), HttpContext.RequestAborted); if (response != null) { if (response.success == true && response.data != null) { return OpenResponse.Ok(System.Text.Json.JsonSerializer.Deserialize(response.data.ToString())); } } return OpenResponse.Ok(""); } /// /// 企业服务提交办理结果 /// /// /// [HttpPost("api/yb12345/enterprise/writeResult")] public async Task WriteResult([FromBody] WriteResultDto dto) { //验证数据 string strResult = dto.Validate(); if (!string.IsNullOrEmpty(strResult)) return OpenResponse.Ok(EnterpriseDeResponse.Failed(description: strResult)); var data = new DsReceiveEnterpriseData() { ExternalId = dto.ReplyCode, ServiceInterface = "api/yb12345/enterprise/writeResult", ReceiveData = System.Text.Json.JsonSerializer.Serialize(dto) }; var id = await _dsReceiveEnterpriseDataRepository.AddAsync(data, HttpContext.RequestAborted); var order = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.ReplyCode, HttpContext.RequestAborted); List Files = new(); if (dto.ReplyFiles != null && dto.ReplyFiles.Count > 0) { foreach (var item in dto.ReplyFiles) { byte[] fileContentBytes = Convert.FromBase64String(item.FileText); var fileData = SendFileData(fileContentBytes, item.Filename, item.Fileformat, dto.ReplyResultType == 2 ? "退回附件" : "办理上传"); if (fileData != null) { Files.Add(fileData); } } } if (!string.IsNullOrEmpty(id)) { //如果是办理中调用 if (dto.ReplyResultType != 0) { string FinishType = ""; if (dto.ReplyResultType == 2) FinishType = "0"; else if (dto.ReplyResultType == 1) FinishType = "1"; if (order != null) { OrderResultDto orderResultDto = new() { OrderId = order.OrderId, FinishType = FinishType, Opinion = dto.ReplyContent, Files = Files }; await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderReultSend, orderResultDto, cancellationToken: HttpContext.RequestAborted); } } else { //这里调用业务接口,推送办理数据 List Traces = new() { new() { HandlerName = dto.ReplyUserName, HandlerOrgName = dto.ReplyBMName, HandleTime = dto.ReplyDate, Opinion = dto.ReplyContent, Files=Files } }; AddOrderTracesDto addOrderTracesDto = new() { OrderId = order.OrderId, Traces = Traces }; if (order != null) await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderAddTraces, addOrderTracesDto, cancellationToken: HttpContext.RequestAborted); } //这里往业务系统推送数据 return OpenResponse.Ok(EnterpriseDeResponse.Success("回复提交成功")); } return OpenResponse.Ok(EnterpriseDeResponse.Failed("接口调用失败!")); } /// /// 将文件流上传到附件服务器 /// /// 文件流 /// 文件名称 /// 文件类型 /// 文件分类 /// private FileDto SendFileData(byte[] fileContentBytes, string fileName, string type, string classify) { var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile(); // 构造字典文件数据 // 接口参数名称为files CFormUpload.FileParameter fileParameter = new("fileData", fileContentBytes, fileName, "multipart/form-data"); Dictionary dicParam = new() { { fileName, fileParameter } }; string url = string.Format("{0}{1}?source={2}", businessFile.BaseUrl, businessFile.UploadUrlAddress, businessFile.Source); var result = CFormUpload.MultipartFormDataPost(url, null, dicParam, ""); FileDto fileDto = null; if (!string.IsNullOrEmpty(result)) { var resultData = Newtonsoft.Json.JsonConvert.DeserializeObject(result); if (resultData != null && resultData.code == 0) { fileDto = new() { Name = fileName, Type = type, Classify = classify, Additions = resultData.result.id, Path = resultData.result.path }; } } return fileDto; } } }