using DataSharing.FwDataExchange; using DataSharing.RawData; using DataSharing.Share.Dtos; using DataSharing.Share.Dtos.HotlineSetting; using DataSharing.Share.Dtos.YiBin.ConvergenceMedia; using DataSharing.Share.Enums; using DataSharing.YiBin.ConvergenceMedia; using DotNetCore.CAP; using Hotline.Share.Dtos.File; using Hotline.Share.Dtos.Order; using MapsterMapper; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; using XF.Domain.Filters; using XF.Domain.Repository; namespace DataSharing.Host.Controllers.YiBin { /// /// 融媒体、I宜宾 /// public class ConvergenceMediaController : BaseController { #region 注入 private readonly IMapper _mapper; private readonly IMediator _mediator; private readonly ICapPublisher _capPublisher; private readonly IChannelConfigurationManager _channelConfigurationManager; private readonly IRepository _dataOrderRepository; private readonly IRepository _dataOrderWorkFlowRepository; private readonly IRepository _dsReceiveMediaDataRepository; private readonly IRepository _bulletinRepository; private readonly FwClient _fwClient; private readonly IDsUserTokenInfoService _dsUserTokenInfoService; /// /// /// /// /// /// /// /// /// /// /// /// /// public ConvergenceMediaController(IMapper mapper, IMediator mediator, ICapPublisher capPublisher, IChannelConfigurationManager channelConfigurationManager, IRepository dataOrderRepository, IRepository dataOrderWorkFlowRepository, IRepository dsReceiveMediaDataRepository, IRepository bulletinRepository, FwClient fwClient, IDsUserTokenInfoService dsUserTokenInfoService) { _mapper = mapper; _mediator = mediator; _capPublisher = capPublisher; _channelConfigurationManager = channelConfigurationManager; _dataOrderRepository = dataOrderRepository; _dataOrderWorkFlowRepository = dataOrderWorkFlowRepository; _dsReceiveMediaDataRepository = dsReceiveMediaDataRepository; _bulletinRepository = bulletinRepository; _fwClient = fwClient; _dsUserTokenInfoService = dsUserTokenInfoService; } #endregion /// /// 2.1融媒体写信 /// /// /// [HttpPost("WriteOrder")] [AllowAnonymous] public async Task WriteOrder([FromForm] MediaDataReceiveDto mediaDataReceiveDto) { var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(mediaDataReceiveDto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List responseDtos = new() { new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "密钥错误", Code = "-900" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(responseDtos, "0", "密钥错误")); } //验证数据 string strResult = mediaDataReceiveDto.Validate(); if (!string.IsNullOrEmpty(strResult)) { List responseDtos = new() { new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = strResult, Code = "0" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(responseDtos, "0", description: strResult)); } //写入原始数据 DsReceiveMediaData dsReceiveMediaData = new() { ServiceInterface = "WriteOrder", PlatformsName = accountDto.PlatformSourceName, ReceiveData = System.Text.Json.JsonSerializer.Serialize(mediaDataReceiveDto) }; dsReceiveMediaData.Id = await _dsReceiveMediaDataRepository.AddAsync(dsReceiveMediaData, HttpContext.RequestAborted); AddOrderDto data = new() { Title = mediaDataReceiveDto.Title, FromName = mediaDataReceiveDto.LinkName, Contact = mediaDataReceiveDto.Mobile, FullAddress = mediaDataReceiveDto.Address, Content = mediaDataReceiveDto.Content, IsSecret = mediaDataReceiveDto.Secrecy == 0 ? false : true, Source = (Hotline.Share.Enums.Order.ESource)Enum.Parse(typeof(Hotline.Share.Enums.Order.ESource), accountDto.PlatformSource), FromGender = mediaDataReceiveDto.Gender switch { "1" => Hotline.Share.Enums.Order.EGender.Male, "2" => Hotline.Share.Enums.Order.EGender.Female, _ => Hotline.Share.Enums.Order.EGender.Unknown, }, IdentityType = Hotline.Share.Enums.Order.EIdentityType.Citizen, Transpond = false, IsEnforcementOrder = false, ExternalId = Guid.NewGuid().ToString() }; switch (accountDto.PlatformSource) { case "ConvergenceMedia": data.SourceChannel = "宜宾融媒体"; data.SourceChannelCode = "YBRMT"; break; case "IYIBIN": data.SourceChannel = "i宜宾"; data.SourceChannelCode = "IYB"; break; default: break; } switch (mediaDataReceiveDto.PurTypeID) { case 17: data.AcceptType = "咨询"; data.AcceptTypeCode = "10"; break; case 18: data.AcceptType = "举报"; data.AcceptTypeCode = "30"; break; case 19: data.AcceptType = "投诉"; data.AcceptTypeCode = "35"; break; case 20: data.AcceptType = "求助"; data.AcceptTypeCode = "20"; break; case 21: data.AcceptType = "建议"; data.AcceptTypeCode = "15"; break; case 25: data.AcceptType = "其他"; data.AcceptTypeCode = "40"; break; default: data.AcceptType = "其他"; data.AcceptTypeCode = "40"; break; } string areaName = ""; switch (mediaDataReceiveDto.AreaID) { case 2: data.AreaCode = "511504"; areaName = "叙州区"; break; case 3: data.AreaCode = "511503"; areaName = "翠屏区"; break; case 4: data.AreaCode = "511504"; areaName = "南溪区"; break; case 5: data.AreaCode = "511524"; areaName = "长宁县"; break; case 6: data.AreaCode = "511528"; areaName = "兴文县"; break; case 7: data.AreaCode = "511526"; areaName = "珙县"; break; case 8: data.AreaCode = "511525"; areaName = "高县"; break; case 9: data.AreaCode = "511527"; areaName = "筠连县"; break; case 10: data.AreaCode = "511523"; areaName = "江安县"; break; case 11: data.AreaCode = "511529"; areaName = "屏山县"; break; case 12: data.AreaCode = "511504"; areaName = "叙州区"; break; default: break; } data.Address = "四川省宜宾市" + areaName; //调用工单创建接口 var result = await _fwClient.RequestNoTokenAsync("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data)); if (result != null && result.code == 0) { dsReceiveMediaData.ExternalId = result.result.id; dsReceiveMediaData.OrderCode = result.result.no; await _dsReceiveMediaDataRepository.UpdateAsync(dsReceiveMediaData, HttpContext.RequestAborted); List responseDtos = new() { new WriteOrderResponseDto() { AcceptCode = result.result.no, AcceptPwd = result.result.password, msg = "写信成功", Code = "1" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(responseDtos, "您已成功提交数据!")); } else { List responseDtos = new() { new WriteOrderResponseDto() { AcceptCode = "", AcceptPwd = "", msg = "接口调用失败", Code = "0" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(responseDtos, "0", description: "接口调用失败!")); } } /// /// 2.2工单列表 /// /// /// [HttpPost("GetOrderByList")] [AllowAnonymous] public async Task GetOrderByList([FromForm] GetOrderMediaReceiveDto dto) { //密钥验证 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } //数据处理 string AcceptTypeCode = ""; AcceptTypeCode = dto.PurTypeID switch { 17 => "10", 18 => "30", 19 => "35", 20 => "20", 21 => "15", 25 => "40", _ => "", }; //数据查询 RefAsync total = 0; var items = await _dataOrderRepository .Queryable() //.Where(p => p.Source == Hotline.Share.Enums.Order.ESource.ConvergenceMedia.ToString()) .Where(p => p.Source == accountDto.PlatformSource) .WhereIF(!string.IsNullOrEmpty(dto.AcceptCode), p => p.OrderNo.Contains(dto.AcceptCode)) .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title)) .WhereIF(!string.IsNullOrEmpty(dto.Mobile), p => p.Contact.Contains(dto.Mobile)) .WhereIF(!string.IsNullOrEmpty(AcceptTypeCode), p => p.CaseTypeCode == AcceptTypeCode) .WhereIF(!string.IsNullOrEmpty(dto.StartDate), p => p.CaseDate >= Convert.ToDateTime(dto.StartDate)) .WhereIF(!string.IsNullOrEmpty(dto.EndDate), p => p.CaseDate < Convert.ToDateTime(dto.EndDate).AddDays(1)) .Select(it => new { FlowID = it.Id, RowID = SqlFunc.RowNumber($"{it.CaseDate} desc "), Code = it.OrderNo, it.Title, AddDate = it.CaseDate, FromName = it.CaseSource, PurTypeName = it.CaseType, ResultState = it.HandleState }) .ToPageListAsync(dto.CurrentPage, dto.PageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize)); List returnData = new() { //处理返回 new() { PageCount = nPageCount, data = _mapper.Map>(items) } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(returnData, "成功")); } /// /// 2.3 工单查询 /// /// [HttpPost("GetOrderDetail")] [AllowAnonymous] public async Task GetOrderDetail([FromForm] MediaOrderDetailReceiveDto dto) { //验证密钥 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } //验证数据 string strResult = dto.Validate(); if (!string.IsNullOrEmpty(strResult)) return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(ReturnData.ReturnDataInfo(strResult), "0", "失败")); //查询数据 var items = await _dataOrderRepository .Queryable() .Where(p => p.OrderNo == dto.AcceptCode) .Where(p => p.Password == dto.AcceptPwd) .Where(p => p.Source == accountDto.PlatformSource) .Select(it => new { FlowID = it.Id, FlowCode = it.OrderNo, FlowTitle = it.Title, FlowFromName = it.CaseSource, FlowPurTypeName = it.CaseType, FlowConTypeName = it.HotspotName, FlowAddDate = it.CaseDate, FlowLKName = it.FromName, FlowBMName = it.ActualHandleOrgName, FlowRSFlagName = it.HandleState, FlowContent = it.Content, FlowResult = it.ActualOpinion, }) .ToListAsync(); if (items == null || items.Count == 0) return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(ReturnData.ReturnDataInfo("编号、密码错误!"), "0", "失败")); else return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(_mapper.Map>(items), "成功")); } /// /// 2.4 今日受理分类统计 /// /// /// [HttpPost("GetPurTypeReport")] [AllowAnonymous] public async Task GetPurTypeReport([FromForm] string Code) { //验证密钥 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } //数据查询 var list = await _dataOrderRepository.Queryable() .Where(p => p.CaseDate >= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"))) .Where(p => p.CaseDate <= Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"))) .Select(it => new { it.CaseType, it.CaseTypeCode }) .MergeTable()//将查询出来的结果合并成一个新表 .GroupBy(it => new { it.CaseType, it.CaseTypeCode })//对新表进行分组 .Select(it => new { PurTypeName = it.CaseType, Count = SqlFunc.AggregateCount(it.CaseTypeCode) }) .ToListAsync(); var listData = _mapper.Map>(list); return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(listData, "成功")); } /// /// 2.5 答复公开 /// /// /// [HttpPost("GetOrderByListOpen")] [AllowAnonymous] public async Task GetOrderByListOpen([FromForm] GetOrderMediaReceiveOpenDto dto) { //密钥验证 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } //数据处理 string AcceptTypeCode = ""; AcceptTypeCode = (object)dto.PurTypeID switch { 17 => "10", 18 => "30", 19 => "35", 20 => "20", 21 => "15", 25 => "40", _ => "", }; //查询数据 RefAsync total = 0; var items = await _dataOrderRepository .Queryable() .Where(p => p.IsPublish == EDsPublishState.Open) .WhereIF(!string.IsNullOrEmpty(dto.Title), p => p.Title.Contains(dto.Title)) .WhereIF(!string.IsNullOrEmpty(AcceptTypeCode), p => p.CaseTypeCode == AcceptTypeCode) .WhereIF(!string.IsNullOrEmpty(dto.StartDate), p => p.CaseDate >= Convert.ToDateTime(dto.StartDate).AddDays(-30)) .WhereIF(!string.IsNullOrEmpty(dto.EndDate), p => p.CaseDate < Convert.ToDateTime(dto.EndDate).AddDays(1)) .Select(it => new { FlowID = it.Id, RowID = SqlFunc.RowNumber($"{it.CaseDate} desc "), Code = it.OrderNo, it.Title, AddDate = it.CaseDate, FromName = it.CaseSource, PurTypeName = it.CaseType, ResultState = it.HandleState }) .ToPageListAsync(dto.CurrentPage, dto.PageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize)); //返回数据处理 List dataDto = new() { new(){ PageCount = nPageCount, data = _mapper.Map>(items) } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(dataDto, "成功")); } /// /// 2.6 办理明细 /// /// /// [HttpPost("GetOrderByRun")] [AllowAnonymous] public async Task GetOrderByRun([FromForm] MediaOrderDetailReceiveDto dto) { //密钥验证 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } //验证数据 string strResult = dto.Validate(); if (!string.IsNullOrEmpty(strResult)) return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(ReturnData.ReturnDataInfo(strResult), "0", "失败")); //验证信件是否存在 var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.AcceptCode && p.Password == dto.AcceptPwd && p.Source == accountDto.PlatformSource, HttpContext.RequestAborted); if (data == null) return OpenResponse.Ok(ConvergenceMediaDeResponse>.Failed(ReturnData.ReturnDataInfo("编号、密码错误!"), "0", "失败")); //数据查询 var list = await _dataOrderWorkFlowRepository.Queryable() .Where(p => p.OrderId == data.OrderId) .Where(p => p.WorkflowId == data.WorkflowId) .Select(it => new { BMName = it.HandlerOrgName, TTime = it.StepExpiredTime, DisposeDate = it.HandleTime }) .ToListAsync(); return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(_mapper.Map>(list), "成功")); } /// /// 2.1.3 上传附件 /// /// /// [HttpPost("WriteFiles")] [AllowAnonymous] public async Task WriteFiles([FromForm] IFormCollection formData) { string Code = formData["Code"]; string AcceptCode = formData["AcceptCode"]; string AcceptPwd = formData["AcceptPwd"]; //验证密钥 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } //验证数据 if (string.IsNullOrEmpty(AcceptCode) || string.IsNullOrEmpty(AcceptPwd)) return OpenResponse.Ok(ConvergenceMediaDeResponse.Failed("编号、密码不能为空!", "0", "失败")); var dataRaw = await _dsReceiveMediaDataRepository.GetAsync(p => p.OrderCode == AcceptCode, HttpContext.RequestAborted); if (dataRaw == null) return OpenResponse.Ok(ConvergenceMediaDeResponse.Failed("编号、密码错误!", "0", "失败")); IFormFileCollection files = formData.Files;//等价于Request.Form.Files List fileDtos = new(); foreach (var item in files) { //这里需要上文件服务器上传 var businessFileDto = await SendFileData(item); string strFileName = item.FileName; string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".") + 1) : ""; string strSubFileName = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(0, strFileName.LastIndexOf(".")) : strFileName; fileDtos.Add(new FileDto() { Name = strSubFileName, Type = strSuffix, Classify = "受理上传", Additions = businessFileDto.id, Path = businessFileDto.path }); } UpdateOrderFilesDto updateOrderFiles = new() { Files = fileDtos, Id = dataRaw.ExternalId, OrderNo = dataRaw.OrderCode }; //推送数据 var result = await _fwClient.RequestNoTokenAsync("api/v1/Order/update-orderfiles", "Post", System.Text.Json.JsonSerializer.Serialize(updateOrderFiles)); return OpenResponse.Ok(ConvergenceMediaDeResponse.Success("", "上传成功")); } /// /// 2.7 新闻列表 /// /// /// [HttpPost("GetNoticeListByPage")] [AllowAnonymous] public async Task GetNoticeListByPage([FromForm] GetNoticeReceiveDto dto) { //密钥验证 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } int nCurrentPage = 0, nPageSize = 0; if (true == string.IsNullOrEmpty(dto.CurrentPage)) nCurrentPage = 1; else nCurrentPage = Convert.ToInt32(dto.CurrentPage); if (true == string.IsNullOrEmpty(dto.PageSize)) nPageSize = 10; else nPageSize = Convert.ToInt32(dto.PageSize); switch (dto.CType) { case "1": case "5": break; case "6": dto.CType = "4"; break; default: dto.CType = "4"; break; } RefAsync total = 0; var items = await _bulletinRepository .Queryable() .Where(p => p.LoseEfficacyTime >= DateTime.Now) .Where(p => p.BulletinTypeId == dto.CType) .OrderByDescending(p => p.BulletinTime) .Select(it => new { Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "), NoticeID = it.Id, NoticeTypeName = it.BulletinTypeName, NoticeTitle = it.Title, NoticeBMName = it.SourceOrgName, NoticeCreateDate = it.BulletinTime }) .ToPageListAsync(nCurrentPage, nPageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / nPageSize)); //处理返回 List dataDto = new() { new(){PageCount = nPageCount, data = _mapper.Map>(items)} }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(dataDto, "成功")); } /// ///2.8 获取详情,修改阅读次数 /// /// /// [AllowAnonymous] [HttpPost("NoticeDetail")] public async Task GetArticleDetails([FromForm] MediaArticleIdDto dto) { //密钥验证 var accountDto = await _dsUserTokenInfoService.CheckAccountAsync(dto.Code, HttpContext.RequestAborted); if (accountDto is null || accountDto.IsCheckAccount == false) { List> convergenceMediaDes = new() { new() { msg = "密钥错误", code = "-900", data = "" } }; return OpenResponse.Ok(ConvergenceMediaDeResponse>>.Failed(convergenceMediaDes, "0", "失败")); } var data = await _bulletinRepository.GetAsync(p => p.Id == dto.NoticeID, HttpContext.RequestAborted); MediaArticleDetailsDto detailsDto = new(); if (data != null) { data.ReadedNum = data.ReadedNum++; await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted); detailsDto.NoticeID = data.Id; detailsDto.NoticeTypeName = data.BulletinTypeName; detailsDto.NoticeTitle = data.Title; detailsDto.NoticeBMName = data.SourceOrgName; detailsDto.NoticeCreateDate = data.BulletinTime; detailsDto.NoticeRCount = data.ReadedNum; detailsDto.NoticeContent = data.Content; } List dataDto = new() { detailsDto }; return OpenResponse.Ok(ConvergenceMediaDeResponse>.Success(dataDto, "成功")); } #region 私有方法-将文件转化为文件流 /// /// 将文件流上传到附件服务器 /// /// /// private async Task SendFileData(IFormFile file) { var businessFile = _channelConfigurationManager.GetConfigurationBusinessFile(); // 文件名称 string fileName = file.FileName; // 文件内容字节数据 using var memoryStream = new MemoryStream(); await file.CopyToAsync(memoryStream); memoryStream.Seek(0, SeekOrigin.Begin); byte[] fileContentBytes = memoryStream.ToArray(); // 构造字典文件数据 // 接口参数名称为files CFormUpload.FileParameter fileParameter = new CFormUpload.FileParameter("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, ""); if (!string.IsNullOrEmpty(result)) { var resultData = Newtonsoft.Json.JsonConvert.DeserializeObject(result); if (resultData != null && resultData.code == 0) { return resultData.result; } } return new BusinessFileDto(); } #endregion } }