using DataSharing.FwDataExchange; using DataSharing.RawData; using DataSharing.Share.Dtos.HotlineSetting; using DataSharing.Share.Dtos.WebPortal; using DataSharing.WebPortal; using DotNetCore.CAP; using Fw.Utility.UnifyResponse; using Hotline.Api.Sdk; using Hotline.Share.Dtos.Order; using Hotline.Share.Enums.Push; using MapsterMapper; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SqlSugar; using XF.Domain.Cache; using XF.Domain.Filters; using XF.Domain.Repository; namespace DataSharing.Host.Controllers { /// /// 门户网站数据获取 /// public class WebPortalController : BaseController { private readonly IMapper _mapper; private readonly IMediator _mediator; private readonly ICapPublisher _capPublisher; private readonly IRepository _bulletinRepository; private readonly IRepository _dataOrderRepository; private readonly IRepository _webFlowAcceptRepository; private readonly IRepository _webUserRegisterRepository; private readonly IRepository _webUserAuthRepository; private readonly IChannelConfigurationManager _channelConfigurationManager; private readonly ITypedCache _writeLettersSendSms; private readonly IRepository _dsHotspotRepository; private readonly IRepository _dsOrderVisitRepository; private readonly FwClient _fwClient; /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// public WebPortalController(IMapper mapper, IMediator mediator, ICapPublisher capPublisher, IRepository bulletinRepository, IRepository dataOrderRepository, IRepository webFlowAcceptRepository, IRepository webUserRegisterRepository, IRepository webUserAuthRepository, IChannelConfigurationManager channelConfigurationManager, ITypedCache writeLettersSendSms, IRepository dsHotspotRepository, IRepository dsOrderVisitRepository, FwClient fwClient) { _mapper = mapper; _mediator = mediator; _capPublisher = capPublisher; _bulletinRepository = bulletinRepository; _dataOrderRepository = dataOrderRepository; _webFlowAcceptRepository = webFlowAcceptRepository; _webUserRegisterRepository = webUserRegisterRepository; _webUserAuthRepository = webUserAuthRepository; _channelConfigurationManager = channelConfigurationManager; _writeLettersSendSms = writeLettersSendSms; _dsHotspotRepository = dsHotspotRepository; _dsOrderVisitRepository = dsOrderVisitRepository; _fwClient = fwClient; } #region 通知 /// /// 获取列表 /// /// [AllowAnonymous] [HttpPost("getarticlelist")] public async Task GetArticleList([FromBody] QueryArticleListDto dto) { RefAsync total = 0; var items = await _bulletinRepository.Queryable() .Where(p => p.LoseEfficacyTime >= DateTime.Now) .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2")) .Where(p => p.BulletinTypeId == dto.NoticeType) .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition)) .OrderByDescending(p => p.BulletinTime) .Select(it => new { Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "),// SqlFunc.MappingColumn(default(int), " row_number() over( order by 'NoticeCreateDate' ) "), NoticeID = it.Id, NoticeContent = it.Content, NoticeTypeName = it.BulletinTypeName, NoticeTitle = it.Title, NoticeBMName = it.SourceOrgName, NoticeCreateDate = it.BulletinTime, VideoUrl = "", WNLT_FullCode = "" }) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize)); ArticleListDataDto dataDto = new() { PageCount = nPageCount, data = _mapper.Map>(items) }; return OpenResponse.Ok(WebPortalDeResponse.Success(dataDto)); } /// /// 获取通知公告前几条数据 /// /// /// [AllowAnonymous] [HttpPost("getarticlelistbynum")] public async Task GetArticleListByNum([FromBody] ArticleIdByNumDto dto) { var items = await _bulletinRepository.Queryable() .Where(p => p.LoseEfficacyTime >= DateTime.Now) .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2")) .Where(p => p.BulletinTypeId == dto.BulletinTypeId) .WhereIF(!string.IsNullOrEmpty(dto.CheckChar), p => p.Content.Contains(dto.CheckChar)) .OrderByDescending(p => p.BulletinTime) .Select(it => new { DataID = it.Id, Title = it.Title, CreateDate = it.BulletinTime, Content = it.Content }) .Take(dto.Num) .ToListAsync(); var data = _mapper.Map>(items); return OpenResponse.Ok(WebPortalDeResponse>.Success(data, "成功")); } /// /// 获取详情,修改阅读次数 /// /// /// [AllowAnonymous] [HttpPost("getarticledetails")] public async Task GetArticleDetails([FromBody] ArticleIdDto dto) { var data = await _bulletinRepository.GetAsync(p => p.Id == dto.Id, HttpContext.RequestAborted); ArticleDetailsDto detailsDto = null; if (data != null) { data.ReadedNum = data.ReadedNum++; await _bulletinRepository.UpdateAsync(data, HttpContext.RequestAborted); detailsDto = new() { NoticeID = data.Id, NoticeTypeName = data.BulletinTypeName, NoticeTitle = data.Title, NoticeBMName = data.SourceOrgName, NoticeCreateDate = data.BulletinTime, NoticeRCount = data.ReadedNum, WNED_VideoUrl = "", NoticeContent = data.Content }; } else detailsDto = new(); List dataDto = new() { detailsDto }; return OpenResponse.Ok(WebPortalDeResponse>.Success(dataDto)); } /// /// 上一条和下一条 /// /// /// [AllowAnonymous] [HttpPost("getpreviousandnext")] public async Task GetPreviousAndNext([FromBody] ArticlePreviousAndNextDto dto) { var sugar = _bulletinRepository.Queryable() .Where(p => p.LoseEfficacyTime >= DateTime.Now) .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2")) ; if (dto.FullSearch == "1")//全文搜索 { sugar.Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4") .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Content.Contains(dto.Condition) || p.Title.Contains(dto.Condition)); } else//指定分类 { sugar.WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition)) .Where(p => p.BulletinTypeId == dto.NoticeTypeId); } var list = await sugar.OrderByDescending(p => p.BulletinTime) .Select(it => new { Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "),// SqlFunc.MappingColumn(default(int), " row_number() over( order by 'NoticeCreateDate' ) "), NoticeID = it.Id, NoticeTitle = it.Title, NoticeCreateDate = it.BulletinTime }) .ToListAsync(); //数据为空返回空数据 if (list == null || list.Count == 0) return OpenResponse.Ok(WebPortalDeResponse>.Success(null)); else { var temp = list.Find(p => p.NoticeID == dto.ID); if (temp != null) { List returnDto = new(); //上一条 var pTemp = list.Find(p => p.Page == temp.Page - 1); if (pTemp != null) returnDto.Add(new() { NoticeID = pTemp.NoticeID, NoticeTitle = pTemp.NoticeTitle, pntype = "p" }); //下一条 var nTemp = list.Find(p => p.Page == temp.Page + 1); if (nTemp != null) returnDto.Add(new() { NoticeID = nTemp.NoticeID, NoticeTitle = nTemp.NoticeTitle, pntype = "n" }); return OpenResponse.Ok(WebPortalDeResponse>.Success(returnDto)); } else return OpenResponse.Ok(WebPortalDeResponse>.Success(null)); } } /// /// 全文检索 /// /// /// [AllowAnonymous] [HttpPost("getfulltextsearchlist")] public async Task GetFullTextSearchList([FromBody] QueryArticleListDto dto) { if (string.IsNullOrEmpty(dto.Condition)) return OpenResponse.Ok(WebPortalDeResponse.Success(null)); RefAsync total = 0; var items = await _bulletinRepository.Queryable() .Where(p => p.LoseEfficacyTime >= DateTime.Now) .Where(d => SqlFunc.JsonListObjectAny(d.PushRanges, "Key", "2")) .Where(p => p.BulletinTypeId == "1" || p.BulletinTypeId == "5" || p.BulletinTypeId == "6" || p.BulletinTypeId == "7" || p.BulletinTypeId == "3" || p.BulletinTypeId == "4") .WhereIF(!string.IsNullOrEmpty(dto.Condition), p => p.Title.Contains(dto.Condition)) .OrderByDescending(p => p.BulletinTime) .Select(it => new { Page = SqlFunc.RowNumber($"{it.BulletinTime} desc "), NoticeID = it.Id, Content = it.Content, NoticeTypeID = it.BulletinTypeId, NoticeTypeName = it.BulletinTypeName, NoticeTitle = it.Title, NoticeBMName = it.SourceOrgName, NoticeCreateDate = it.BulletinTime, TypeCode = "", }) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize)); FullTextSearchListDataDto dataDto = new() { PageCount = nPageCount, data = _mapper.Map>(items) }; return OpenResponse.Ok(WebPortalDeResponse.Success(dataDto)); } #endregion #region 办件 /// /// 获取信件前6条数据 /// /// /// [HttpPost("getorderlistbynum")] [AllowAnonymous] public async Task GetOrderListByNum([FromBody] QueryOrderListByNumDto dto) { var items = await _dataOrderRepository.Queryable() .Where(p => p.IsPublish == DataSharing.Share.Enums.EDsPublishState.Open) .Where(p => p.HandleState == "办理完成") .OrderByDescending(p => p.PublishDate) .Select(it => new { DataID = it.OrderId, Title = it.Title, CreateDate = it.PublishDate }) .Take(dto.Num) .ToListAsync(); var data = _mapper.Map>(items); return OpenResponse.Ok(WebPortalDeResponse>.Success(data, "成功")); } /// /// 办件摘编列表数据 /// /// /// [HttpPost("getorderlist")] [AllowAnonymous] public async Task GetOrderList([FromBody] QueryOrderListDto dto) { RefAsync total = 0; var items = await _dataOrderRepository.Queryable() .Where(p => p.IsPublish == DataSharing.Share.Enums.EDsPublishState.Open) .Where(p => p.HandleState == "办理完成") .WhereIF(!string.IsNullOrEmpty(dto.FlowCode), d => d.OrderNo == dto.FlowCode) .WhereIF(!string.IsNullOrEmpty(dto.FlowName), d => d.Title.Contains(dto.FlowName)) .WhereIF(!string.IsNullOrEmpty(dto.FlowSType), d => d.CaseTypeCode == dto.FlowSType) .WhereIF(!string.IsNullOrEmpty(dto.FlowRType), d => d.HotspotId == dto.FlowRType) .WhereIF(!string.IsNullOrEmpty(dto.FlowSDate), d => d.CaseDate >= DateTime.Parse(DateTime.Parse(dto.FlowSDate).ToString("yyyy-MM-dd 00:00:00")))//dto.FlowSDate .WhereIF(!string.IsNullOrEmpty(dto.FlowEDate), d => d.CaseDate <= DateTime.Parse(DateTime.Parse(dto.FlowEDate).ToString("yyyy-MM-dd 00:00:00")))// dto.FlowEDate .WhereIF(!string.IsNullOrEmpty(dto.FlowFrom), d => d.FromName.Contains(dto.FlowFrom)) .OrderByDescending(p => p.PublishDate) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize)); OrderListReturnDto returnDto = new() { PageNum = dto.PageIndex, PageCount = nPageCount, Data = _mapper.Map>(items) }; return OpenResponse.Ok(WebPortalDeResponse.Success(returnDto, "成功")); } /// /// 办件摘编详情 /// /// /// [AllowAnonymous] [HttpPost("getorderdetailbyid")] public async Task GetOrderDetailById([FromBody] ArticleIdDto dto) { var data = await _dataOrderRepository.GetAsync(p => p.OrderId == dto.Id); var orderDetail = _mapper.Map(data); if (data != null) { //如果是省工单或者是省政民互动的工单,市民不能进行评价 if (data.IsProvince == true || data.CaseSourceCode == "ZMHD") orderDetail.IsProvinceOrder = "1"; else orderDetail.IsProvinceOrder = "0"; //orderDetail.IsProvinceOrder = data.IsProvince == true ? "1" : "0"; switch (data.VisitTypeState) { case DataSharing.Share.Enums.EVisitTypeState.UnVisit: orderDetail.VisitType = "0"; break; case DataSharing.Share.Enums.EVisitTypeState.Visit: orderDetail.VisitType = "1"; break; case DataSharing.Share.Enums.EVisitTypeState.Reviewed: orderDetail.VisitType = "2"; break; default: break; } } List dataDto = new() { orderDetail }; return OpenResponse.Ok(WebPortalDeResponse>.Success(dataDto)); } /// /// 根据编号和密码查询信件ID /// /// /// [AllowAnonymous] [HttpPost("getorderid")] public async Task GetOrderId([FromBody] GetOrderCodePwd dto) { //var data = await _webFlowAcceptRepository.GetAsync(p => p.Code == dto.OrderNo && p.Pwd == dto.Pwd); var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.OrderNo && p.Password == dto.Pwd); return OpenResponse.Ok(WebPortalDeResponse.Success(data?.OrderId)); } /// /// 办件摘编详情 /// /// /// [AllowAnonymous] [HttpPost("getorderdetailbyno")] public async Task GetOrderDetailByNo([FromBody] GetOrderCodePwd dto) { var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.OrderNo && p.Password == dto.Pwd); if (data != null) { var orderDetail = _mapper.Map(data); if (data != null) { //如果是省工单或者是省政民互动的工单,市民不能进行评价 if (data.IsProvince == true || data.CaseSourceCode == "ZMHD") orderDetail.IsProvinceOrder = "1"; else orderDetail.IsProvinceOrder = "0"; //orderDetail.IsProvinceOrder = data.IsProvince == true ? "1" : "0"; switch (data.VisitTypeState) { case DataSharing.Share.Enums.EVisitTypeState.UnVisit: orderDetail.VisitType = "0"; break; case DataSharing.Share.Enums.EVisitTypeState.Visit: orderDetail.VisitType = "1"; break; case DataSharing.Share.Enums.EVisitTypeState.Reviewed: orderDetail.VisitType = "2"; break; default: break; } } List dataDto = new() { orderDetail }; return OpenResponse.Ok(WebPortalDeResponse>.Success(dataDto)); } return OpenResponse.Ok(WebPortalDeResponse>.Failed(description: "查询失败")); } /// /// 写信接口 /// /// /// [AllowAnonymous] [HttpPost("orderacceptance")] public async Task OrderAcceptance([FromBody] DsWebFlowAccept dto) { var data = _mapper.Map(dto); data.SourceChannel = "网站"; data.SourceChannelCode = "WZ"; data.Source = Hotline.Share.Enums.Order.ESource.WebPortal; if (!string.IsNullOrEmpty(data.LicenceNo)) { data.LicenceTypeCode = "10"; data.LicenceType = "中华人民共和国居民身份证"; } data.ExternalId = Guid.NewGuid().ToString(); // await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderCreation, data, cancellationToken: HttpContext.RequestAborted); //调用工单创建接口 // var result1 = await _hotlineClient.ReceiveOrderAsync(data, HttpContext.RequestAborted); var result = await _fwClient.RequestNoTokenAsync("api/v1/Order/add-anonymous", "Post", System.Text.Json.JsonSerializer.Serialize(data)); OrderAcceptanceReturnDto returnDto = new(); if (result != null && result.code == 0) { returnDto.PWD = result.result.password; returnDto.Code = result.result.no; returnDto.State = "1"; dto.Pwd = result.result.password; dto.Code = result.result.no; dto.OrderId = result.result.id; await _webFlowAcceptRepository.AddAsync(dto, HttpContext.RequestAborted); } else returnDto.State = "0"; //OrderAcceptanceReturnDto returnDto = new() //{ // PWD = "12345", // Code = "12345", // State = "1" //}; //dto.Pwd = "12345"; //dto.Code = "12345"; //dto.OrderId = "12345"; //await _webFlowAcceptRepository.AddAsync(dto, HttpContext.RequestAborted); return OpenResponse.Ok(WebPortalDeResponse.Success(returnDto)); } /// /// 受理类型和热点统计 /// /// [AllowAnonymous] [HttpPost("getchartdata")] public async Task GetChartData() { var startDate = Convert.ToDateTime(DateTime.Now.AddMonths(-1).ToString("yyyy-MM-dd 00:00:00")); var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")); //数据查询 var listType = await _dataOrderRepository.Queryable() .Where(p => p.CaseDate >= startDate) .Where(p => p.CaseDate <= endDate) .Select(it => new { it.CaseType, it.CaseTypeCode }) .MergeTable()//将查询出来的结果合并成一个新表 .GroupBy(it => new { it.CaseType, it.CaseTypeCode })//对新表进行分组 .Select(it => new { name = it.CaseType, value = SqlFunc.AggregateCount(it.CaseTypeCode) }) .ToListAsync(); //数据查询-查询总数前5的数据 var listHot = await _dataOrderRepository.Queryable() .Where(p => p.CaseDate >= startDate) .Where(p => p.CaseDate <= endDate) .Select(it => new { it.HotspotId, it.HotspotName }) .MergeTable()//将查询出来的结果合并成一个新表 .GroupBy(it => new { it.HotspotId, it.HotspotName })//对新表进行分组 .Select(it => new { typeName = it.HotspotName, num = SqlFunc.AggregateCount(it.HotspotId) }) .OrderByDescending(it => it.num) .Take(5) .ToListAsync(); GetChartDataDto dataDto = new() { formCount = _mapper.Map>(listType), hotCount = _mapper.Map>(listHot) }; return OpenResponse.Ok(WebPortalDeResponse.Success(dataDto)); } /// /// 获取统计数据 /// /// [AllowAnonymous] [HttpPost("getstatist")] public async Task GetStatist() { var startDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 00:00:00")); var endDate = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd 23:59:59")); GetStatistDto getStatistDto = new() { AllCount = await _dataOrderRepository.Queryable().CountAsync(), AllTrandCount = await _dataOrderRepository.Queryable().Where(p => p.HandleState == "办理完成").CountAsync(), DayCount = await _dataOrderRepository.Queryable().Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync(), DayTrandCount = await _dataOrderRepository.Queryable().Where(p => p.HandleState == "办理完成").Where(p => p.CaseDate >= startDate).Where(p => p.CaseDate <= endDate).CountAsync() }; return OpenResponse.Ok(WebPortalDeResponse.Success(getStatistDto)); } #endregion #region 用户 /// /// 添加统一认证用户数据 /// /// /// [AllowAnonymous] [HttpPost("adduserauth")] public async Task AddUserAuth([FromBody] UserModelDto dto) { bool bResult = false; // 唯一记录ID string id = dto.id; // 注册用户ID string webUserID = ""; // 统一认证用户注册ID string wUAID = ""; //查询是否有注册用户 var dataUser = await _webUserAuthRepository.GetAsync(p => p.DataId == id, HttpContext.RequestAborted); if (dataUser != null) { webUserID = dataUser.WebUserID; wUAID = dataUser.Id; } //没有注册用户添加数据 if (string.IsNullOrEmpty(webUserID)) { var userRegister = _mapper.Map(dto); userRegister.RegDate = DateTime.Now; userRegister.LastDate = DateTime.Now; webUserID = await _webUserRegisterRepository.AddAsync(userRegister, HttpContext.RequestAborted); } //统一认证数据 var userAuth = _mapper.Map(dto); if (!string.IsNullOrEmpty(wUAID)) { //修改数据 userAuth.Id = wUAID; await _webUserAuthRepository.UpdateAsync(userAuth, HttpContext.RequestAborted); bResult = true; } else { //新增数据 userAuth.WebGUID = Guid.NewGuid().ToString(); userAuth.WebUserID = webUserID; var addId = await _webUserAuthRepository.AddAsync(userAuth, HttpContext.RequestAborted); if (!string.IsNullOrEmpty(addId)) bResult = true; } //判断是否成功 if (bResult) return OpenResponse.Ok(WebPortalDeResponse.Success(webUserID)); else return OpenResponse.Ok(WebPortalDeResponse.Failed()); } /// /// 用户中心用户写信数据 /// /// /// [HttpPost("getorderbyuserlist")] [AllowAnonymous] public async Task GetOrderByUserList([FromBody] QueryOrderListByUserDto dto) { var dataUser = await _webUserAuthRepository.GetAsync(p => p.DataId == dto.UserId, HttpContext.RequestAborted); if (dataUser != null) { RefAsync total = 0; var items = await _webFlowAcceptRepository.Queryable() .LeftJoin((o, or) => o.OrderId == or.OrderId) .Where(o => o.WebUserID == dataUser.WebUserID) //重新构建数据 .Select((o, or) => new { FlowID = o.OrderId, FlowCode = o.Code, FlowPwd = o.Pwd, FlowTitle = o.Title, FlowFromName = or.CaseSource, FlowPurTypeName = o.PurTypeName, ConTypeName = or.HotspotName, FlowAddDate = o.CreationTime, RSFlagName = or.HandleState, WebUserID = o.WebUserID }) //将结果合并成一个表 .MergeTable() // .Where(p => p.WebUserID == dataUser.WebUserID) .ToPageListAsync(dto.PageIndex, dto.PageSize, total); //计算总页数 int nPageCount = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(total) / dto.PageSize)); OrderListReturnDto returnDto = new() { PageNum = dto.PageIndex, PageCount = nPageCount, Data = _mapper.Map>(items) }; return OpenResponse.Ok(WebPortalDeResponse.Success(returnDto, "成功")); } return OpenResponse.Ok(WebPortalDeResponse.Success(new OrderListReturnDto(), "成功")); } #endregion #region 短信、基础设置 /// /// 短信验证码发送 /// /// /// [AllowAnonymous] [HttpPost("writeletterssendsms")] public async Task WriteLettersSendSms([FromBody] SendSmsModelDto dto) { string keyToken = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd"); var data = await _writeLettersSendSms.GetAsync(keyToken, HttpContext.RequestAborted); if (data != null)//已经发过短信 { //是否可以继续发送短信(10次) if (data.SendCount > 10) //短信发送超过10条 return OpenResponse.Ok(WebPortalDeResponse.Success("-2")); // 验证是否在两分钟之内 TimeSpan duration = DateTime.Now - data.AddTime; // 计算时间差 if ((int)duration.TotalSeconds < 120) // 距离上次发送时间不足两分钟 return OpenResponse.Ok(WebPortalDeResponse.Success("-4")); //修改缓存信息 data.SendCount++; data.SmsCode = dto.SmsCode; data.AddTime = DateTime.Now; } else { //没有发过短信,直接写入数据 data = new WriteLettersSendSmsDto { AddTime = DateTime.Now, SmsCode = dto.SmsCode, MobileNum = dto.TelNum, SendCount = 1 }; } //这里发送短信 宜宾12345市民服务热线网站验证码{0},用于写信时验证联系电话。验证码有效期10分钟。 string Content = "宜宾12345市民服务热线网站验证码" + dto.SmsCode + ",用于写信时验证联系电话。验证码有效期10分钟。"; PushMessageDto pushMessageDto = new PushMessageDto() { ClientId = "Web", ExternalId = "", Content = Content, Remark = "", Name = dto.TelNum, TelNumber = dto.TelNum }; await _capPublisher.PublishAsync("send.sms", pushMessageDto, cancellationToken: HttpContext.RequestAborted); //修改缓存 await _writeLettersSendSms.SetAsync(keyToken, data, TimeSpan.FromDays(1), HttpContext.RequestAborted); return OpenResponse.Ok(WebPortalDeResponse.Success("1")); } /// /// 验证短信验证码是否正确 正确返回1,错误返回-1 /// /// /// [AllowAnonymous] [HttpPost("checksmscode")] public async Task CheckSmsCode([FromBody] SendSmsModelDto dto) { string keyToken = "SmsUserWriteKey_" + dto.TelNum + "_" + DateTime.Now.ToString("yyyyMMdd"); var data = await _writeLettersSendSms.GetAsync(keyToken, HttpContext.RequestAborted); //检测是否存在 if (data != null) return OpenResponse.Ok(WebPortalDeResponse.Success(data.SmsCode)); //不存在 return OpenResponse.Ok(WebPortalDeResponse.Success("-1")); } /// /// 获取热点分类的树形 /// /// [AllowAnonymous] [HttpPost("gethotspottreelist")] public async Task GetHotspotTreeList() { var data = await _dsHotspotRepository.Queryable().ToTreeAsync(it => it.children, it => it.ParentId, null); return OpenResponse.Ok(WebPortalDeResponse>.Success(data)); } /// /// 系统主题颜色 /// /// [AllowAnonymous] [HttpPost("getsystemsettingstheme")] public async Task GetSystemSettingsTheme() { var data = _channelConfigurationManager.GetConfigurationWebPortal(); return OpenResponse.Ok(WebPortalDeResponse.Success(data.SystemSettingsTheme)); } #endregion #region 评价 /// /// 获取待评价部门信息 /// /// /// [AllowAnonymous] [HttpPost("getwaitvisitdata")] public async Task GetWaitVisitData([FromBody] ArticleIdDto dto) { var dataOrder = await _dataOrderRepository.AnyAsync(p => p.OrderId == dto.Id && p.VisitTypeState == Share.Enums.EVisitTypeState.Visit, HttpContext.RequestAborted); if (!dataOrder) return OpenResponse.Ok(WebPortalDeResponse>.Failed("工单已经评价!")); var data = await _dsOrderVisitRepository.Queryable().Where(p => p.OrderId == dto.Id && p.IsEffective == true && p.VisitTarget == Hotline.Share.Enums.Order.EVisitTarget.Org.ToString()).ToListAsync(); var listDat = _mapper.Map>(data); return OpenResponse.Ok(WebPortalDeResponse>.Success(listDat)); } /// /// 评价内容 /// /// /// [AllowAnonymous] [HttpPost("receivevisitdata")] public async Task ReceiveVisitData([FromBody] OrderVisitListDataDto dto) { if (dto == null || dto.VistListDtos == null || dto.VistListDtos.Count == 0) return OpenResponse.Ok(WebPortalDeResponse.Failed("评价数据不能为空!")); var dataOrder = await _dataOrderRepository.GetAsync(p => p.OrderId == dto.OrderId && p.VisitTypeState == Share.Enums.EVisitTypeState.Visit, HttpContext.RequestAborted); if (dataOrder == null) return OpenResponse.Ok(WebPortalDeResponse.Failed("工单已经评价!")); //组装数据 OrderVisitWebDto visitWebDto = new() { VisitType = Hotline.Share.Enums.Order.EVisitType.WebVisit, VisitTime = DateTime.Now }; List orderVisitDetails = new(); int count = 0; #region 查询是否有需要评价的语音---已取消语音评价 ////查询是否有需要评价的语音 //var seatVisit = await _dsOrderVisitRepository.GetAsync(p => p.OrderId == dto.OrderId && p.IsEffective == true // && p.VisitTarget == Hotline.Share.Enums.Order.EVisitTarget.Seat.ToString(), HttpContext.RequestAborted); //if (seatVisit != null) //{ // //修改本地数据 // seatVisit.VoiceEvaluate = Hotline.Share.Enums.Order.EVoiceEvaluate.VerySatisfied.ToString(); // seatVisit.SeatEvaluate = Hotline.Share.Enums.Order.ESeatEvaluate.VerySatisfied.ToString(); // await _dsOrderVisitRepository.UpdateAsync(seatVisit, HttpContext.RequestAborted); // visitWebDto.Id = seatVisit.VisitId; // //业务系统语音以及坐席默认评价 // OrderVisitDetailWebDto detailDto = new() // { // Id = seatVisit.VisitDetailId, // VoiceEvaluate = Hotline.Share.Enums.Order.EVoiceEvaluate.VerySatisfied, // SeatEvaluate = Hotline.Share.Enums.Order.ESeatEvaluate.VerySatisfied, // VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Seat // }; // orderVisitDetails.Add(detailDto); //} #endregion #region 部门评价 //部门评价 //遍历数据 foreach (var item in dto.VistListDtos) { Hotline.Share.Dtos.Kv kv = item.SatisfactionCode switch { "5" => new Hotline.Share.Dtos.Kv { Key = "5", Value = "非常满意" }, "4" => new Hotline.Share.Dtos.Kv { Key = "4", Value = "满意" }, "2" => new Hotline.Share.Dtos.Kv { Key = "2", Value = "不满意" }, _ => new Hotline.Share.Dtos.Kv { Key = "7", Value = "不做评价" }, }; //查询数据 var tempData = await _dsOrderVisitRepository.GetAsync(p => p.OrderId == dto.OrderId && p.Id == item.Id, HttpContext.RequestAborted); if (tempData != null) { //修改当前数据 tempData.OrgProcessingResults = _mapper.Map(kv); tempData.OrgHandledAttitude = _mapper.Map(kv); tempData.OrgNoSatisfiedReason = new List(); tempData.VisitContent = item.VisitContent; tempData.VisitOrgName = item.VisitOrgName; tempData.VisitOrgCode = item.VisitOrgCode; tempData.VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Org.ToString(); tempData.VisitType = Hotline.Share.Enums.Order.EVisitType.WebVisit.ToString(); tempData.VisitTime = DateTime.Now; tempData.IsEffective = true; await _dsOrderVisitRepository.UpdateAsync(tempData, HttpContext.RequestAborted); count++; //组装回访数据 visitWebDto.Id = tempData.VisitId; OrderVisitDetailWebDto detailDto = new() { Id = tempData.VisitDetailId, VisitTarget = Hotline.Share.Enums.Order.EVisitTarget.Org, OrgProcessingResults = kv, OrgNoSatisfiedReason = new List(), OrgHandledAttitude = kv, VisitContent = item.VisitContent }; orderVisitDetails.Add(detailDto); } } #endregion //修改工单评价状态为已评价 if (count == dto.VistListDtos.Count) { dataOrder.VisitTypeState = Share.Enums.EVisitTypeState.Reviewed; await _dataOrderRepository.UpdateAsync(dataOrder, HttpContext.RequestAborted); } visitWebDto.OrderVisitDetailDto = orderVisitDetails; //推送数据 await _capPublisher.PublishAsync(DataSharing.Share.Mq.EventNames.SharingOrderVisitAllOther, visitWebDto, cancellationToken: HttpContext.RequestAborted); return OpenResponse.Ok(WebPortalDeResponse.Success("1")); } #endregion } }