Browse Source

Merge branch 'master' of http://110.188.24.182:10023/Fengwo/hotline

xf 1 year ago
parent
commit
96b7290dc7

+ 14 - 5
src/Hotline.Api/Controllers/HomeController.cs

@@ -155,14 +155,23 @@ public class HomeController : BaseController
     /// <summary>
     /// 首页系统配置
     /// </summary>
-    /// <returns></returns>
+    /// <returns>
+    /// IsRestApproval : 小休是否需要审核
+    /// IsNeedTelNo : 是否需要分机
+    /// IsTelNeedVerify : 分机是否需要验证
+    /// </returns>
     [AllowAnonymous]
     [HttpGet("home-page-info")]
-    public async Task<HomeSettingDto> HomePageInfo()
+    public async Task<object> HomePageInfo()
     {
-        var RestApproval = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.RestApproval).SettingValue[0]);
-
-        return new HomeSettingDto() { IsRestApproval = RestApproval };
+        var rsp = new
+        {
+            IsRestApproval = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsRestApproval).SettingValue[0]),
+            IsNeedTelNo = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsNeedTelNo).SettingValue[0]),
+            IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]),
+            TalkingDealTime = int.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.TalkingDealTime).SettingValue[0]),
+        };
+        return rsp;
     }
 
 

+ 20 - 2
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -2,6 +2,7 @@
 using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Users;
 using MapsterMapper;
+using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using Tr.Sdk;
 using Tr.Sdk.Blacklist;
@@ -91,9 +92,9 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         [Permission(EPermission.OnDuty)]
         [HttpPost("on-duty")]
-        public async Task OnDuty([FromBody] TrOnDutyDto dto)
+        public async Task<TrOnDutyResponseDto> OnDuty([FromBody] TrOnDutyDto dto)
         {
-            await _userDomainService.TrOnDutyAsync(_sessionContext.RequiredUserId, dto.TelId, dto.TelNo, HttpContext.RequestAborted);
+            return await _userDomainService.TrOnDutyAsync(_sessionContext.RequiredUserId, dto.TelId, dto.TelNo,dto.TelPwd,dto.Description, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -107,6 +108,23 @@ namespace Hotline.Api.Controllers
             await _userDomainService.TrOffDutyAsync(_sessionContext.RequiredUserId, HttpContext.RequestAborted);
         }
 
+        #endregion
+
+
+        #region 通话记录
+        /// <summary>
+        /// 接收通话记录
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <returns></returns>
+        [AllowAnonymous]
+        [HttpPost("receiveCallRecord")]
+        public async Task ReceiveCallRecord([FromBody]ReceiveCallRecordDto dto)
+        {
+
+        }
+
+
         #endregion
 
         #endregion

+ 80 - 1
src/Hotline.Api/Controllers/OrderController.cs

@@ -32,6 +32,7 @@ using XF.Domain.Constants;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
 using XF.Utility.EnumExtensions;
+using Microsoft.IdentityModel.Tokens;
 
 namespace Hotline.Api.Controllers;
 
@@ -72,6 +73,7 @@ public class OrderController : BaseController
     private readonly IRepository<RepeatableEvent> _repeatableEventRepository;
     private readonly IRepeatableEventDetailRepository _repeatableEventDetailRepository;
     private readonly IRepository<OrderWord> _orderWrodRepository;
+    private readonly IRepository<OrderObserve> _orderObserveRepository;
 
 
 	public OrderController(
@@ -106,7 +108,8 @@ public class OrderController : BaseController
         IRepository<CitizenLabelDetail> labelDetailRepository,
         IRepository<RepeatableEvent> repeatableEventRepository,
         IRepeatableEventDetailRepository repeatableEventDetailRepository,
-        IRepository<OrderWord> orderWrodRepository
+        IRepository<OrderWord> orderWrodRepository,
+        IRepository<OrderObserve> orderObserveRepository
 		)
     {
         _orderDomainService = orderDomainService;
@@ -141,6 +144,7 @@ public class OrderController : BaseController
         _repeatableEventRepository = repeatableEventRepository;
         _repeatableEventDetailRepository = repeatableEventDetailRepository;
         _orderWrodRepository = orderWrodRepository;
+        _orderObserveRepository = orderObserveRepository;
 
 	}
 
@@ -2064,4 +2068,79 @@ public class OrderController : BaseController
 		return rsp;
 	}
 	#endregion
+
+	#region 工单观察
+	/// <summary>
+	/// 新增工单观察
+	/// </summary>
+	/// <param name="dtos"></param>
+	/// <returns></returns>
+	[Permission(EPermission.AddOrderObserve)]
+	[HttpPost("order_observe")]
+	public async Task Add([FromBody] OrderObserveAddDto dto)
+	{
+		var observe = _mapper.Map<OrderObserve>(dto);
+		await _orderObserveRepository.AddAsync(observe, HttpContext.RequestAborted);
+	}
+
+	/// <summary>
+	/// 删除工单观察
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.DeleteOrderObserve)]
+	[HttpDelete("order_observe")]
+	public async Task Delete([FromBody] OrderObserveDeleteDto dto)
+	{
+		await _orderRepository.RemoveOrderObserveBatchAsync(dto.Ids, HttpContext.RequestAborted);
+	}
+
+	/// <summary>
+	/// 更新工单观察
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.UpdateOrderObserve)]
+	[HttpPut("order_observe")]
+	public async Task Update([FromBody] OrderObserveUpdateDto dto)
+	{
+		var word = await _orderObserveRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
+		if (word is null)
+			throw UserFriendlyException.SameMessage("无效工单观察");
+		_mapper.Map(dto, word);
+		await _orderObserveRepository.UpdateAsync(word, HttpContext.RequestAborted);
+	}
+
+	/// <summary>
+	/// 获取工单观察列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[Permission(EPermission.OrderObserveList)]
+	[HttpGet("order_observe/list")]
+	public async Task<PagedDto<OrderObserveDto>> List([FromQuery] OrderObserveListDto dto)
+	{
+		var (total, items) = await _orderObserveRepository.Queryable()
+            .Includes(x=>x.Order)
+			.WhereIF(dto.IsProvince.HasValue, x => x.Order.IsProvince == dto.IsProvince)
+			.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.Order.Title.Contains(dto.Title!))
+			.WhereIF(!string.IsNullOrEmpty(dto.No), x =>  x.Order.No.Contains(dto.No!))
+			.OrderByDescending(x => x.CreationTime)
+			.ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
+		return new PagedDto<OrderObserveDto>(total, _mapper.Map<IReadOnlyList<OrderObserveDto>>(items));
+	}
+
+	/// <summary>
+	/// 获取工单观察
+	/// </summary>
+	/// <param name="id"></param>
+	/// <returns></returns>
+	[HttpGet("order_observe/{id}")]
+	public async Task<OrderObserve> OrderObserveEntity(string id)
+	{
+		return await _orderObserveRepository.Queryable()
+			.FirstAsync(x => x.Id == id);
+	}
+	#endregion
+
 }

+ 1 - 1
src/Hotline.Api/Controllers/PbxController.cs

@@ -270,7 +270,7 @@ namespace Hotline.Api.Controllers
             if (work is null)
                 throw UserFriendlyException.SameMessage("当前坐席暂未进行工作");
 
-            bool isCanApply = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.RestApproval).SettingValue[0]);
+            bool isCanApply = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsRestApproval).SettingValue[0]);
 
             if (isCanApply)
             {

+ 3 - 1
src/Hotline.Api/Controllers/SettingController.cs

@@ -149,7 +149,9 @@ namespace Hotline.Api.Controllers
             if (model is null)
                 throw UserFriendlyException.SameMessage("未知配置,请刷新界面");
 
-            model = _mapper.Map<SystemSetting>(dto);
+            model.SettingValue = dto.SettingValue;
+            model.Sort = dto.Sort;
+            model.Remark = dto.Remark;
             _systemSettingCacheManager.DelSystemSetting(model.Code);
             await _systemSettingsRepository.UpdateAsync(model, HttpContext.RequestAborted);
         }

+ 12 - 1
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -150,5 +150,16 @@ namespace Hotline.Repository.SqlSugar.Orders
         }
 
 
-    }
+        /// <summary>
+        /// 工单观察批量删除
+        /// </summary>
+        /// <param name="ids"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task RemoveOrderObserveBatchAsync(List<string> ids, CancellationToken cancellationToken)
+        {
+	        await Db.Deleteable<OrderObserve>().In(x => x.Id, ids).ExecuteCommandAsync(cancellationToken);
+        }
+
+	}
 }

+ 1 - 5
src/Hotline.Share/Dtos/Home/HomeDto.cs

@@ -18,11 +18,7 @@ namespace Hotline.Share.Dtos.Home
         public string name { get; set; }
     }
 
-    public record HomeSettingDto
-    {
-        public bool IsRestApproval { get; set; }
-    }
-
+   
     public class UserAuthorityDto
     {
         public List<SystemMenuDto> menus { get; set; }

+ 93 - 0
src/Hotline.Share/Dtos/Order/OrderObserveDto.cs

@@ -0,0 +1,93 @@
+using Hotline.Share.Requests;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Order
+{
+	public class OrderObserveDto : OrderObserveBaseDto
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		public string OrderId { get; set; }
+
+		/// <summary>
+		/// 
+		/// </summary>
+		public OrderDto Order { get; set; }
+	}
+
+	public class OrderObserveAddDto
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		public string OrderId { get; set; }
+	}
+
+	public class OrderObserveDeleteDto
+	{
+		public List<string> Ids { get; set; }
+	}
+
+	public class OrderObserveUpdateDto : OrderObserveAddDto
+	{
+		public string Id { get; set; }
+	}
+
+	public record OrderObserveListDto : PagedKeywordRequest
+	{
+		/// <summary>
+		/// 标题
+		/// </summary>
+		public string? Title { get; set; }
+
+		/// <summary>
+		/// 编号
+		/// </summary>
+		public string? No { get; set; }
+
+		/// <summary>
+		/// 是否为省工单
+		/// </summary>
+		public bool? IsProvince { get; set; }
+
+	}
+	public class OrderObserveBaseDto
+	{
+		public DateTime? LastModificationTime { get; set; }
+
+		public bool IsDeleted { get; set; }
+
+		/// <summary>
+		/// 删除时间
+		/// </summary>
+		public DateTime? DeletionTime { get; set; }
+
+
+		/// <summary>
+		/// 创建时间
+		/// </summary>
+		public DateTime CreationTime { get; set; }
+
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 组织Id
+		/// </summary>
+		public string? CreatorOrgId { get; set; }
+
+
+		public string? CreatorOrgName { get; set; }
+
+		/// <summary>
+		/// 创建人
+		/// </summary>
+		public string? CreatorId { get; set; }
+
+		public string? CreatorName { get; set; }
+	}
+}

+ 154 - 2
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -11,6 +11,8 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public string TelNo { get; set; }
 
         public string Description { get; set; }
+
+        public string Password { get; set; }
     }
 
     #endregion
@@ -60,8 +62,158 @@ namespace Hotline.Share.Dtos.TrCallCenter
 
     public class TrOnDutyDto
     {
-        public string TelId { get; set; }
-        public string TelNo { get; set; }
+        public string? TelId { get; set; }
+        public string? TelNo { get; set; }
+        public string? TelPwd { get; set; }
+        public string? Description { get; set; }
+    }
+
+    public class TrOnDutyResponseDto
+    {
+        public string? TelNo { get; set; }
+
+        public string? TelPwd { get; set; }
+
+        public string? Description { get; set; }
+    }
+
+
+    #endregion
+
+
+    #region 通话记录
+
+    public class ReceiveCallRecordDto
+    {
+        /// <summary>
+        /// IPPBX用户名
+        /// </summary>
+        public string user { get; set; }
+
+        /// <summary>
+        /// 可直接访问的通话录音地址
+        /// </summary>
+        public string? recording_file_url { get; set; }
+
+        /// <summary>
+        /// 呼叫方向:呼入 in / 呼出 out
+        /// </summary>
+        public string call_direction { get; set; }
+
+        /// <summary>
+        /// 挂断方:主叫挂断 caller / 被叫挂断 callee / 其他未知情况
+        /// </summary>
+        public string hangup_side { get; set; }
+
+        /// <summary>
+        /// 坐席侧通话流水,无坐席参与则为手机侧通话流水
+        /// </summary>
+        public string call_accept { get; set; }
+
+        /// <summary>
+        /// 主叫号码
+        /// </summary>
+        public string caller_id_name { get; set; }
+
+        /// <summary>
+        /// 主叫号码
+        /// </summary>
+        public string caller_id_number { get; set; }
+
+        /// <summary>
+        /// 被叫号码
+        /// </summary>
+        public string destination_number { get; set; }
+
+        /// <summary>
+        /// 通话录音绝对路径
+        /// </summary>
+        public string? recording_file_name { get; set; }
+
+        /// <summary>
+        /// 通话创建时间
+        /// </summary>
+        public DateTime created_time { get; set; }
+
+        /// <summary>
+        /// 接通时间
+        /// </summary>
+        public DateTime? answered_time { get; set; }
+
+        /// <summary>
+        /// 挂机时间
+        /// </summary>
+        public DateTime over_time { get; set; }
+
+        /// <summary>
+        /// 线路号
+        /// </summary>
+        public string gateway { get; set; }
+
+        /// <summary>
+        /// 呼出时自定义的内容
+        /// </summary>
+        public string? other_str { get; set; }
+
+        /// <summary>
+        /// 手机侧通话流水,无坐席参与则为空
+        /// </summary>
+        public string? other_accept { get; set; }
+
+        /// <summary>
+        /// 状态码,语音信箱:999/其他:16
+        /// </summary>
+        public string status { get; set; }
+
+        /// <summary>
+        /// IVR开始时间
+        /// </summary>
+        public DateTime? beginIvrTime { get; set; }
+
+        /// <summary>
+        /// IVR结束时间
+        /// </summary>
+        public DateTime? endIvrTime { get; set; }
+
+        /// <summary>
+        /// 开始等待时间
+        /// </summary>
+        public DateTime? beginQueueTime { get; set; }
+
+        /// <summary>
+        /// 结束等待时间
+        /// </summary>
+        public DateTime? endQueueTime { get; set; }
+
+        /// <summary>
+        /// 开始振铃时间
+        /// </summary>
+        public DateTime? beginRingTime { get; set; }
+
+        /// <summary>
+        /// 结束振铃时间
+        /// </summary>
+        public DateTime? endRingTime { get; set; }
+
+        /// <summary>
+        /// 队列ID
+        /// </summary>
+        public string? ola_queue { get; set; } 
+
+        /// <summary>
+        /// 批量外呼流水
+        /// </summary>
+        public string? batch_accept { get; set; } 
+
+        /// <summary>
+        /// IVR按键信息
+        /// </summary>
+        public string? ivr_dtmf { get; set; }
+
+        /// <summary>
+        /// IVR按键对应动作,需解码
+        /// </summary>
+        public string? dtmf_type { get; set; }
     }
 
     #endregion

+ 6 - 1
src/Hotline.Share/Requests/SettingsRequest.cs

@@ -23,9 +23,14 @@ namespace Hotline.Share.Requests
         public string Remark { get; set; }
     }
 
-    public record class ModifySettingDto:AddSettingDto
+    public record class ModifySettingDto
     {
         public string Id { get; set; }
+
+        public string Remark { get; set; }
+
+        public int Sort { get; set; }
+        public List<string> SettingValue { get; set; }
     }
 
 

+ 1 - 0
src/Hotline/Hotline.csproj

@@ -16,6 +16,7 @@
 
   <ItemGroup>
     <ProjectReference Include="..\Hotline.Share\Hotline.Share.csproj" />
+    <ProjectReference Include="..\Tr.Sdk\Tr.Sdk.csproj" />
     <ProjectReference Include="..\XF.Domain.Repository\XF.Domain.Repository.csproj" />
   </ItemGroup>
 

+ 1 - 1
src/Hotline/Orders/IOrderRepository.cs

@@ -11,10 +11,10 @@ namespace Hotline.Orders
     {
         Task<string> AddOrderNavAsync(Order order, CancellationToken cancellationToken);
         Task UpdateOrderNavAsync(Order order, CancellationToken cancellationToken);
-
         Task RemoveOrderComplainAsync(OrderComplain orderComplain, CancellationToken cancellationToken);
         Task RemoveOrderReportAsync(OrderReport orderReport, CancellationToken cancellationToken);
         Task RemoveOrderWrodBatchAsync(List<string> ids, CancellationToken cancellationToken);
+        Task RemoveOrderObserveBatchAsync(List<string> ids, CancellationToken cancellationToken);
 
 	}
 }

+ 27 - 0
src/Hotline/Orders/OrderObserve.cs

@@ -0,0 +1,27 @@
+using SqlSugar;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+	[Description("工单观察")]
+	public class OrderObserve : FullStateEntity
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		[SugarColumn(ColumnDescription = "工单ID")]
+		public string OrderId { get; set; }
+
+		/// <summary>
+		/// 
+		/// </summary>
+		[Navigate(NavigateType.OneToOne, nameof(OrderId))]
+		public Order Order { get; set; }
+	}
+}

+ 26 - 0
src/Hotline/Permissions/EPermission.cs

@@ -1427,6 +1427,32 @@ namespace Hotline.Permissions
 
 		#endregion
 
+		#region 工单观察
+		/// <summary>
+		/// 工单观察列表
+		/// </summary>
+		[Display(GroupName = "OrderObserve", Name = "工单观察列表", Description = "工单观察列表")]
+		OrderObserveList = 501600,
+
+		/// <summary>
+		/// 新增工单观察
+		/// </summary>
+		[Display(GroupName = "OrderObserve", Name = "新增工单观察", Description = "新增工单观察")]
+		AddOrderObserve = 501601,
+
+		/// <summary>
+		/// 删除工单观察
+		/// </summary>
+		[Display(GroupName = "OrderObserve", Name = "删除工单观察", Description = "删除工单观察")]
+		DeleteOrderObserve = 501602,
+
+		/// <summary>
+		/// 修改工单观察
+		/// </summary>
+		[Display(GroupName = "OrderObserve", Name = "修改工单观察", Description = "修改工单观察")]
+		UpdateOrderObserve = 501603,
+		#endregion
+
 		#endregion
 
 		#region 辅助功能(600)

+ 3 - 1
src/Hotline/Users/IUserDomainService.cs

@@ -1,4 +1,5 @@
 using Hotline.CallCenter.Tels;
+using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Dtos.Users;
 
 namespace Hotline.Users
@@ -31,7 +32,8 @@ namespace Hotline.Users
         /// <param name="TelNo"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        Task TrOnDutyAsync(string userId, string TelId, string TelNo, CancellationToken cancellationToken);
+
+        Task<TrOnDutyResponseDto> TrOnDutyAsync(string userId, string? TelId, string? TelNo,string? TelPwd,string? Description, CancellationToken cancellationToken);
 
         /// <summary>
         /// 下班

+ 49 - 7
src/Hotline/Users/UserDomainService.cs

@@ -1,10 +1,12 @@
 using Hotline.Caching.Interfaces;
 using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Tels;
-using Hotline.Share.Dtos.CallCenter;
+using Hotline.Share.Dtos.TrCallCenter;
 using Hotline.Share.Dtos.Users;
 using MapsterMapper;
+using Tr.Sdk;
 using XF.Domain.Cache;
+using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
@@ -20,6 +22,8 @@ namespace Hotline.Users
         private readonly ITelCacheManager _telCacheManager;
         private readonly ITypedCache<Work> _cacheWork;
         private readonly IMapper _mapper;
+        private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly ITrClient _trClient;
 
         public UserDomainService(
             IRepository<User> userRepository,
@@ -27,7 +31,10 @@ namespace Hotline.Users
             IDeviceManager deviceManager,
             ITypedCache<Work> cacheWork,
             IUserCacheManager userCacheManager,
-            IMapper mapper, ITelCacheManager telCacheManager)
+            IMapper mapper, 
+            ITelCacheManager telCacheManager,
+            ISystemSettingCacheManager systemSettingCacheManager,
+            ITrClient trClient)
         {
             _userRepository = userRepository;
             _workRepository = workRepository;
@@ -36,6 +43,8 @@ namespace Hotline.Users
             _cacheWork = cacheWork;
             _mapper = mapper;
             _telCacheManager = telCacheManager;
+            _systemSettingCacheManager = systemSettingCacheManager;
+            _trClient = trClient;
         }
 
         /// <summary>
@@ -114,22 +123,55 @@ namespace Hotline.Users
         /// <param name="TelNo"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task TrOnDutyAsync(string userId,string TelId,string TelNo,CancellationToken cancellationToken)
+        public async Task<TrOnDutyResponseDto> TrOnDutyAsync(string userId, string? TelId, string? TelNo, string? TelPwd, string? Description,CancellationToken cancellationToken)
         {
+            var workingTel = await _workRepository.GetCurrentWorkByUserAsync(userId, cancellationToken);
+            if (workingTel is not null)
+            {
+                return new TrOnDutyResponseDto() { TelNo = workingTel.TelNo, TelPwd = workingTel.TelPwd, Description = workingTel.Description };
+            }
+
+            //检查配置
+            bool IsNeedTelNo = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsNeedTelNo).SettingValue[0]);
+            if (IsNeedTelNo && string.IsNullOrEmpty(TelNo))
+            {
+                throw UserFriendlyException.SameMessage("当前配置需要选择分机号签入");
+            }
+
+
+            
+
             var user = await _userRepository.GetAsync(userId, cancellationToken);
             if (user is null)
                 throw UserFriendlyException.SameMessage("无效的用户编号");
 
-            var workingTel = await _workRepository.GetCurrentWorkByUserAsync(userId, cancellationToken);
-            if (workingTel is not null)
-                throw UserFriendlyException.SameMessage($"当前用户已上班,userId:{userId}");
+            bool IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]);
+            var rsp = new TrOnDutyResponseDto();
+            if (!IsNeedTelNo)
+            {
+                TelNo = user.DefaultTelNo;
+                var telModel = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { TelNo = TelNo }, cancellationToken);
+                TelId = telModel[0].Id;
+                rsp.TelPwd = telModel[0].Password;
+                rsp.Description = telModel[0].Description;
+            }
+            
+
+            rsp.TelNo = TelNo;
+          
 
             var telIsWorking = await _workRepository.AnyAsync(d => d.TelId == TelId && !d.EndTime.HasValue, cancellationToken);
             if (telIsWorking)
                 throw UserFriendlyException.SameMessage("当前分机已被占用");
 
-            var work = new Work(userId, user.Name, TelId, TelNo);
+            var work = new Work(userId, user.Name, TelId, TelNo,rsp.TelPwd,rsp.Description);
             await _workRepository.AddAsync(work, cancellationToken);
+
+            if (IsTelNeedVerify)
+            {
+                rsp.TelPwd = string.Empty;
+            }
+            return rsp;
         }
 
         /// <summary>

+ 16 - 0
src/Hotline/Users/Work.cs

@@ -41,6 +41,11 @@ public class Work : CreationModificationEntity
     [SugarColumn(ColumnDescription = "工作时长(单位:秒)")]
     public double? WorkingDuration { get; private set; }
 
+    [SugarColumn(IsIgnore = true)]
+    public string? TelPwd { get; set; }
+
+    [SugarColumn(IsIgnore = true)]
+    public string? Description { get; set; }
     ///// <summary>
     ///// SignalR.ConnectionId
     ///// </summary>
@@ -52,6 +57,17 @@ public class Work : CreationModificationEntity
 
     }
 
+    public Work(string userId, string name, string telId, string telNo, string? telPwd, string? description)
+    {
+        StartTime = DateTime.Now;
+        UserId = userId;
+        UserName = name;
+        TelId = telId;
+        TelNo = telNo;
+        TelPwd = telPwd;
+        Description = description;
+    }
+
     public Work(string userId, string name, string telId, string telNo)
     {
         StartTime = DateTime.Now;

+ 1 - 1
src/Tr.Sdk/Blacklist/QueryBlacklistRequest.cs

@@ -10,7 +10,7 @@ namespace Tr.Sdk.Blacklist
 {
     public class QueryBlacklistRequest: TrRequest
     {
-        public override string Path() => "api/special_phone/delete";
+        public override string Path() => "api/special_phone/special_phone_detail";
 
         public override Method HttpMethod() => Method.Get;
 

+ 2 - 0
src/Tr.Sdk/Tels/QueryTelRequest.cs

@@ -25,5 +25,7 @@ namespace Tr.Sdk.Tels
         [JsonPropertyName("nbr")]
         public string TelNo { get; set; }
         public string Description { get; set; }
+
+        public string Password { get; set; }
     }
 }

+ 11 - 2
src/XF.Domain/Constants/SettingConstants.cs

@@ -16,7 +16,7 @@ namespace XF.Domain.Constants
         /// <summary>
         /// 是否小休审批
         /// </summary>
-        public const string RestApproval = "RestApproval";
+        public const string IsRestApproval = "IsRestApproval";
         /// <summary>
         /// 首页登录图
         /// </summary>
@@ -72,5 +72,14 @@ namespace XF.Domain.Constants
 		/// </summary>
 		public const string OrderAboutToExpire = "OrderAboutToExpire";
 
-	}
+        /// <summary>
+        /// 是否需要分机号
+        /// </summary>
+        public const string IsNeedTelNo = "IsNeedTelNo";
+
+        /// <summary>
+        /// 分机是否需要验证
+        /// </summary>
+        public const string IsTelNeedVerify = "IsTelNeedVerify";
+    }
 }