ソースを参照

Merge branch 'test' of http://110.188.24.182:10023/Fengwo/hotline into test

qinchaoyue 1 ヶ月 前
コミット
5b092cb16b

+ 122 - 16
src/Hotline.Api/Controllers/FwThirdController.cs

@@ -1,4 +1,4 @@
-using DocumentFormat.OpenXml.Spreadsheet;
+using DocumentFormat.OpenXml.Office.CoverPageProps;
 using Hotline.Application.Bulletin;
 using Hotline.Application.Identity;
 using Hotline.Application.Orders;
@@ -7,38 +7,25 @@ using Hotline.Caching.Interfaces;
 using Hotline.Configurations;
 using Hotline.KnowledgeBase;
 using Hotline.Orders;
-using Hotline.Push.Notifies;
 using Hotline.Repository.SqlSugar.Extensions;
-using Hotline.Repository.SqlSugar.Knowledge;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.DataSharing.PusherHotlineDto;
 using Hotline.Share.Dtos.Identity;
-using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.Schedulings;
 using Hotline.Share.Dtos.WebPortal;
 using Hotline.Share.Enums.KnowledgeBase;
 using Hotline.Share.Enums.Order;
-using Hotline.Share.Enums.Push;
-using Hotline.Share.Tools;
 using Hotline.Tools;
+using Hotline.Users;
 using Hotline.WebPortal;
-using Hotline.YbEnterprise.Sdk;
 using MapsterMapper;
-using MathNet.Numerics;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Options;
-using MongoDB.Driver.Core.WireProtocol.Messages;
-using Newtonsoft.Json.Linq;
-using Senparc.Weixin.WxOpen.AdvancedAPIs.WxApp.WxAppJson;
-using Senparc.Weixin.WxOpen.Entities;
-using SharpCompress.Common;
+using NPOI.XWPF.UserModel;
 using SqlSugar;
-using System.Text.Json;
-using System.Threading;
 using XF.Domain.Authentications;
 using XF.Domain.Cache;
 using XF.Domain.Filters;
@@ -62,6 +49,8 @@ namespace Hotline.Api.Controllers
         private readonly IRepository<OrderPublish> _orderPublishRepository;
         private readonly IOrderRepository _orderRepository;
         private readonly IRepository<OrderVisit> _orderVisitRepository;
+        private readonly IRepository<Order> _orderListRepository;
+        private readonly IRepository<User> _userRepository;
         private readonly IOrderApplication _orderApplication;
         private readonly ISessionContext _sessionContext;
         private readonly IRepository<OrderVisitDetail> _orderVisitDetailRepository;
@@ -89,6 +78,8 @@ namespace Hotline.Api.Controllers
             IRepository<OrderPublish> orderPublishRepository,
             IOrderRepository orderRepository,
             IRepository<OrderVisit> orderVisitRepository,
+            IRepository<Order> orderListRepository,
+            IRepository<User> userRepository,
             IOrderApplication orderApplication,
             ISessionContext sessionContext,
             IRepository<OrderVisitDetail> orderVisitDetailRepository,
@@ -117,6 +108,8 @@ namespace Hotline.Api.Controllers
             _orderPublishRepository = orderPublishRepository;
             _orderRepository = orderRepository;
             _orderVisitRepository = orderVisitRepository;
+            _userRepository = userRepository;
+            _orderListRepository = orderListRepository;
             _orderApplication = orderApplication;
             _sessionContext = sessionContext;
             _orderVisitDetailRepository = orderVisitDetailRepository;
@@ -146,6 +139,9 @@ namespace Hotline.Api.Controllers
 
         #endregion
 
+
+        #region 自贡门户查询接口
+
         #region 受理统计
 
         /// <summary>getacceptancetypestatisticsbymonth
@@ -773,5 +769,115 @@ namespace Hotline.Api.Controllers
         }
 
         #endregion
+
+        #endregion
+
+        #region 泸州电信查询接口
+
+        #region 工单信息
+
+        /// <summary>
+        /// 工单信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("getOrderResultList")]
+        public async Task<OpenResponse> GetOrderResultList([FromBody] DateDto dto)
+        {
+            TimeSpan timeSpan = dto.EndTime - dto.StartTime;
+            if (timeSpan.TotalHours > 24)
+            {
+                return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>.Failed("0", "开始结束时间不能大于24小时!"));
+            }
+
+            var items = await _orderListRepository.Queryable()
+                .Where(x => x.CreationTime >= dto.StartTime)
+                .Where(x => x.CreationTime <= dto.EndTime)
+                .OrderByDescending(x => x.CreationTime)
+                .Select(it => new
+                {
+                    Id = it.Id,
+                    No = it.No,
+                    Title = it.Title,
+                    Content = it.Content,
+                    ActualHandleOrgName = it.ActualHandleOrgName,
+                    CreationTime = it.CreationTime,
+                    FromName = it.FromName,
+                    FromPhone = string.IsNullOrEmpty(it.FromPhone) ? it.FromPhone : it.Contact
+                })
+                .ToListAsync();
+
+            var OrderDto = _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>(items);
+            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.OrderResultDto>>.Success(OrderDto, "成功"));
+        }
+
+        #endregion
+
+        #region 评价信息
+
+        /// <summary>
+        /// 评价信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("getVisitResultList")]
+        public async Task<OpenResponse> GetVisitResultList([FromBody] DateDto dto)
+        {
+            TimeSpan timeSpan = dto.EndTime - dto.StartTime;
+            if (timeSpan.TotalHours > 24)
+            {
+                return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>.Failed("0", "开始结束时间不能大于24小时!"));
+            }
+
+            var items = await _orderVisitRepository.Queryable()
+                .Includes(x => x.OrderVisitDetails)
+                .LeftJoin<OrderPublish>((x, op) => x.OrderId == op.OrderId)
+                .Where(x => x.CreationTime >= dto.StartTime)
+                .Where(x => x.CreationTime <= dto.EndTime)
+                .OrderByDescending(x => x.CreationTime)
+                .Select((x, op) => new
+                {
+                    OrderID = x.OrderId,
+                    NowEvaluate = x.NowEvaluate,
+                    VisitContent = x.OrderVisitDetails.Where(n => n.VisitTarget == EVisitTarget.Org || n.VisitTarget == EVisitTarget.Seat).Select(s => s.VisitContent).First(),
+                    VisitTime = x.VisitTime,
+                    VisitName = x.Employee.Name,
+                    PublishState = op.PublishState
+                })
+                .ToListAsync();
+
+            var VisitDto = _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>(items);
+            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.VisitResultDto>>.Success(VisitDto, "成功"));
+        }
+
+        #endregion
+
+        #region 账号信息
+
+        /// <summary>
+        /// 账号信息
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [HttpGet("getUserResultList")]
+        public async Task<OpenResponse> GetUserResultList()
+        {
+            var items = await _userRepository.Queryable()
+                .OrderByDescending(x => x.CreationTime)
+                .Select(it => new
+                {
+                    UUID = it.Id,
+                    Name = it.Name
+                })
+                .ToListAsync();
+
+            var UserDto = _mapper.Map<IReadOnlyList<Hotline.Share.Dtos.WebPortal.UserResultDto>>(items);
+            return OpenResponse.Ok(WebPortalDeResponse<IReadOnlyList<Hotline.Share.Dtos.WebPortal.UserResultDto>>.Success(UserDto, "成功"));
+        }
+
+        #endregion
+
+        #endregion
+
     }
 }

+ 62 - 23
src/Hotline.Api/Controllers/TelRestController.cs

@@ -1,12 +1,15 @@
 using Hotline.Application.CallCenter;
+using Hotline.Article;
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Tels;
 using Hotline.Realtimes;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Article;
 using Hotline.Share.Dtos.CallCenter;
 using Hotline.Share.Dtos.Order;
+using Hotline.Share.Enums.Article;
 using Hotline.Share.Enums.CallCenter;
 using Hotline.Tools;
 using MapsterMapper;
@@ -28,6 +31,7 @@ namespace Hotline.Api.Controllers
         private readonly ITelDomainService _telDomainService;
         private readonly IMapper _mapper;
         private readonly IRealtimeService _realtimeService;
+        private readonly ICircularRecordDomainService _circularRecordDomainService;
 
         public TelRestController(ISystemDicDataCacheManager systemDicDataCacheManager,
              IRepository<TelRestApply> telRestApplyRepository,
@@ -35,7 +39,8 @@ namespace Hotline.Api.Controllers
               ISessionContext sessionContext,
               ITelDomainService telDomainService,
               IMapper mapper,
-              IRealtimeService realtimeService)
+              IRealtimeService realtimeService,
+              ICircularRecordDomainService circularRecordDomainService)
         {
             _systemDicDataCacheManager = systemDicDataCacheManager;
             _telRestApplyRepository = telRestApplyRepository;
@@ -44,6 +49,7 @@ namespace Hotline.Api.Controllers
             _telDomainService = telDomainService;
             _mapper = mapper;
             _realtimeService = realtimeService;
+            _circularRecordDomainService = circularRecordDomainService;
         }
 
         #region 小休审批
@@ -70,17 +76,17 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         /// <exception cref="UserFriendlyException"></exception>
         [HttpPost("addtelrest")]
-        public async Task AddTelRest([FromBody] TelRestApplyAddDto dto)
+        public async Task<string> AddTelRest([FromBody] TelRestApplyAddDto dto)
         {
             if (string.IsNullOrEmpty(dto.TelNo))
-                throw new UserFriendlyException("分机号不能为空!");
+                return "分机号不能为空!";
             if (dto.Reason == null)
-                throw new UserFriendlyException("小休原因不能为空!");
+                return "小休原因不能为空!";
 
             var data = await _telRestApplyRepository.GetAsync(p => p.TelNo == dto.TelNo && p.CreatorId == _sessionContext.RequiredUserId &&
             p.AuditStatus == ETelRestAuditStatus.NoAudit, HttpContext.RequestAborted);
             if (data != null)
-                throw new UserFriendlyException("小休申请审批中,暂时无法操作!");
+                return "小休申请审批中,暂时无法操作!";
 
             TelRestApply telRestApply = new()
             {
@@ -90,7 +96,12 @@ namespace Hotline.Api.Controllers
                 StaffNo = _sessionContext.StaffNo,
                 AuditStatus = ETelRestAuditStatus.NoAudit
             };
-            await _telRestApplyRepository.AddAsync(telRestApply, HttpContext.RequestAborted);
+            var id = await _telRestApplyRepository.AddAsync(telRestApply, HttpContext.RequestAborted);
+            if (!string.IsNullOrEmpty(id))
+                return "小休申请成功!";
+            else
+                return "小休申请失败!";
+
         }
 
         /// <summary>
@@ -100,26 +111,54 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         /// <exception cref="UserFriendlyException"></exception>
         [HttpPost("telrest_apply_audit")]
-        public async Task TelRestApplyAudit([FromBody] TelRestApplyAuditDto dto)
+        public async Task<string> TelRestApplyAudit([FromBody] TelRestApplyAuditDto dto)
         {
-            if (dto.IsPass == false && string.IsNullOrEmpty(dto.AuditOpinion))
-                throw new UserFriendlyException("审批原因不能为空!");
-            var data = await _telRestApplyRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
-            if (data == null)
-                throw new UserFriendlyException("审批数据查询失败!");
-            data.AuditUserName = _sessionContext.UserName;
-            data.AuditUserId = _sessionContext.RequiredUserId;
-            data.AuditOrgId = _sessionContext.RequiredOrgId;
-            data.AuditOrgName = _sessionContext.OrgName;
-            data.AuditTime = DateTime.Now;
-            data.AuditOpinion = dto.AuditOpinion;
-            data.AuditStatus = dto.IsPass == true ? ETelRestAuditStatus.Pass : ETelRestAuditStatus.NoPass;
-            await _telRestApplyRepository.UpdateAsync(data, HttpContext.RequestAborted);
-            if (dto.IsPass)
+            if (dto.IsPass != true && string.IsNullOrEmpty(dto.AuditOpinion))
+                return "审批原因不能为空!";
+            foreach (var item in dto.Ids)
             {
-                //通知前端休息通过
-                await _realtimeService.RestApplyPassAsync(data.CreatorId, HttpContext.RequestAborted);
+                var data = await _telRestApplyRepository.GetAsync(item, HttpContext.RequestAborted);
+                if (data != null)
+                {
+                    data.AuditUserName = _sessionContext.UserName;
+                    data.AuditUserId = _sessionContext.RequiredUserId;
+                    data.AuditOrgId = _sessionContext.RequiredOrgId;
+                    data.AuditOrgName = _sessionContext.OrgName;
+                    data.AuditTime = DateTime.Now;
+                    data.AuditOpinion = dto.AuditOpinion;
+                    data.AuditStatus = dto.IsPass == true ? ETelRestAuditStatus.Pass : ETelRestAuditStatus.NoPass;
+                    await _telRestApplyRepository.UpdateAsync(data, HttpContext.RequestAborted);
+
+                    //发送消息
+                    var ispasstext = dto.IsPass == true ? "已通过" : "不通过";
+                    AddCircularDto circularDto = new()
+                    {
+                        Title = "小休审批",
+                        Content = "您在" + data.CreationTime.ToString("yyyy-MM-dd HH:mm:ss") + "申请的小休审批" + ispasstext,
+                        CircularTypeId = "7",
+                        CircularTypeName = "小休审批",
+                        IsMustRead = true,
+                        SourceOrgId = _sessionContext.RequiredOrgId,
+                        SourceOrgName = _sessionContext.OrgName,
+                        CircularType = ECircularType.Person
+                    };
+                    List<CircularReadGroupDto> users = [];
+                    users.Add(new CircularReadGroupDto()
+                    {
+                        UserId = data.CreatorId,
+                        UserName = data.CreatorName
+                    });
+                    circularDto.CircularReadGroups = users;
+                    //调用推送消息通用接口
+                    await _circularRecordDomainService.AddCircularMessage(circularDto, HttpContext.RequestAborted);
+                    if (dto.IsPass)
+                    {
+                        //通知前端休息通过
+                        await _realtimeService.RestApplyPassAsync(data.CreatorId, HttpContext.RequestAborted);
+                    }
+                }
             }
+            return "审批完成";
         }
 
         /// <summary>

BIN
src/Hotline.Api/Documents/luzhou/泸州12345平台工单查询接口(V1.0-20250312) .docx


+ 0 - 0
src/Hotline.Api/Documents/luzhou/丰窝12345平台工单接入接口(V1.1-20250225) .docx → src/Hotline.Api/Documents/zigong/丰窝12345平台工单接入接口(V1.1-20250225) .docx


+ 1 - 0
src/Hotline.Application/CallCenter/PbxApplication.cs

@@ -33,6 +33,7 @@ namespace Hotline.Application.CallCenter
                 .WhereIF(!string.IsNullOrEmpty(dto.AuditUserName), p => p.AuditUserName == dto.AuditUserName)
                 .WhereIF(dto.AuditStartTime.HasValue, p => p.AuditTime >= dto.AuditStartTime)
                 .WhereIF(dto.AuditEndTime.HasValue, p => p.AuditTime <= dto.AuditEndTime)
+                .WhereIF(!string.IsNullOrEmpty(dto.ReasonId), p => p.ReasonId == dto.ReasonId)
                 .Select(p => new TelRestApplyListDto
                 {
                     Id = p.Id,

+ 13 - 6
src/Hotline.Application/Orders/OrderApplication.cs

@@ -1185,8 +1185,8 @@ public class OrderApplication : IOrderApplication, IScopeDependency
             if (bool.Parse(enabled))
             {
                 //自动延期催办短信发送
-                await _capPublisher.PublishDelayAsync(  expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(2),
-                    EventNames.HotlineOrderAutomaticSendSmsDelay,  new PublishAutomaticDelayDto() { OrderId = order.Id }, cancellationToken: cancellationToken);
+                await _capPublisher.PublishDelayAsync(expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(2),
+                    EventNames.HotlineOrderAutomaticSendSmsDelay, new PublishAutomaticDelayDto() { OrderId = order.Id }, cancellationToken: cancellationToken);
 
                 await _capPublisher.PublishDelayAsync(
                     expiredTimeConfig.ExpiredTime - DateTime.Now.AddHours(1),
@@ -1431,8 +1431,15 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                         if (first.VisitOrgCode != OrgSeedData.CenterId &&
                             (first.OrgProcessingResults.Value == "不满意" || first.OrgProcessingResults.Value == "非常不满意"))
                         {
-                            var orderVisit = await _orderVisitRepository.Queryable().FirstAsync(x => x.Id == dto.Id, cancellationToken);
-                            if (string.IsNullOrEmpty(orderVisit.Employee.PhoneNo) == false)
+                            var roleJingBanRen = _systemSettingCacheManager.GetSetting(SettingConstants.AcceptSmsRoleIds)?.SettingValue;
+                            var userList = await _userRepository
+                                            .Queryable()
+                                            .Where(d => d.OrgId == first.VisitOrgCode &&
+                                                   d.Roles.Any(x => roleJingBanRen.Contains(x.Id)) &&
+                                                   string.IsNullOrEmpty(d.PhoneNo) == false)
+                                            .ToListAsync();
+
+                            foreach (var item in userList)
                             {
                                 var messageDto = new Share.Dtos.Push.MessageDto
                                 {
@@ -1441,10 +1448,10 @@ public class OrderApplication : IOrderApplication, IScopeDependency
                                     OrderId = visit.Order.Id,
                                     PushPlatform = EPushPlatform.Sms,
                                     Remark = visit.Order.Title,
-                                    Name = orderVisit.Employee.Name,
+                                    Name = item.Name,
                                     TemplateCode = "1020",
                                     Params = new List<string>() { visit.Order.No },
-                                    TelNumber = orderVisit.Employee.PhoneNo,
+                                    TelNumber = item.PhoneNo,
                                 };
                                 await _mediator.Publish(new PushMessageNotify(messageDto), cancellationToken);
                             }

+ 1 - 1
src/Hotline.Share/Dtos/CallCenter/TelRestApplyAddDto.cs

@@ -28,7 +28,7 @@ namespace Hotline.Share.Dtos.CallCenter
         /// <summary>
         /// 数据Id
         /// </summary>
-        public string Id { get; set; }
+        public List<string> Ids{ get; set; }
 
         /// <summary>
         /// 审批原因

+ 13 - 0
src/Hotline.Share/Dtos/WebPortal/ArticleDetailsDto.cs

@@ -365,4 +365,17 @@ namespace Hotline.Share.Dtos.WebPortal
         /// </summary>
         public IReadOnlyList<FullTextSearchListDto> data { get; set; }
     }
+
+    public class DateDto
+    {
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// /结束时间
+        /// </summary>
+        public DateTime EndTime { get; set; }
+    }
 }

+ 98 - 0
src/Hotline.Share/Dtos/WebPortal/GetOrderCodePwd.cs

@@ -535,4 +535,102 @@ namespace Hotline.Share.Dtos.WebPortal
         public string? path { get; set; }
     }
 
+    /// <summary>
+    /// 工单信息
+    /// </summary>
+    public class OrderResultDto
+    {
+        /// <summary>
+        /// 工单唯一标识
+        /// </summary>
+        public string? Id { get; set; }
+
+        /// <summary>
+        /// 办件编号
+        /// </summary>
+        public string? No { get; set; }
+
+        /// <summary>
+        /// 工单标题
+        /// </summary>
+        public string? Title { get; set; }
+
+        /// <summary>
+        /// 工单内容
+        /// </summary>
+        public string? Content { get; set; }
+
+        /// <summary>
+        /// 受理部门(实际办理部门)
+        /// </summary>
+        public string? ActualHandleOrgName { get; set; }
+
+        /// <summary>
+        /// 工单提交(申报)时间(受理时间)
+        /// </summary>
+        public DateTime? CreationTime { get; set; }
+
+        /// <summary>
+        /// 提交人姓名(来电人姓名)
+        /// </summary>
+        public string? FromName { get; set; }
+
+        /// <summary>
+        /// 手机号(来电号码 FromPhone 联系电话 Contact)
+        /// </summary>
+        public string? FromPhone { get; set; }
+    }
+
+    /// <summary>
+    /// 评价信息
+    /// </summary>
+    public class VisitResultDto
+    {
+        /// <summary>
+        /// 工单唯一标识
+        /// </summary>
+        public string? OrderID { get; set; }
+
+        /// <summary>
+        /// 评价满意度(评分)
+        /// </summary>
+        public Kv? NowEvaluate { get; set; }
+
+        /// <summary>
+        /// 评价描述
+        /// </summary>
+        public string? VisitContent { get; set; }
+
+        /// <summary>
+        /// 评价时间
+        /// </summary>
+        public string? VisitTime { get; set; }
+
+        /// <summary>
+        /// 评价人
+        /// </summary>
+        public string? VisitName { get; set; }
+
+        /// <summary>
+        /// 是否公开
+        /// </summary>
+        public bool PublishState { get; set; } = false;
+    }
+
+    /// <summary>
+    /// 账号信息
+    /// </summary>
+    public class UserResultDto
+    {
+        /// <summary>
+        /// 账号信息:uuid(用户唯一标识)
+        /// </summary>
+        public string? UUID { get; set; }
+
+        /// <summary>
+        /// 用户名
+        /// </summary>
+        public string? Name { get; set; }
+    }
+
 }