Bläddra i källkod

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

田爽 1 år sedan
förälder
incheckning
3b8d2d341d

+ 164 - 20
src/Hotline.Api/Controllers/DataSharing/ConvergenceMediaController.cs

@@ -1,11 +1,12 @@
-using DotNetCore.CAP;
-using Fw.Utility.UnifyResponse;
-using Hotline.DataSharing;
+using Hotline.DataSharing;
 using Hotline.DataSharing.ConvergenceMedia;
 using Hotline.DataSharing.Order;
+using Hotline.DataSharing.Province;
 using Hotline.DataSharing.Province.Notifications;
 using Hotline.Share.Dtos.DataSharing;
 using Hotline.Share.Dtos.DataSharing.ConvergenceMedia;
+using Hotline.Share.Dtos.DataSharing.Province;
+using Hotline.Share.Dtos.File;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.DataSharing;
 using Hotline.Share.Enums.Order;
@@ -170,11 +171,13 @@ namespace Hotline.Api.Controllers.DataSharing
                 data.Address = "四川省宜宾市" + areaName;
 
                 //调用工单创建接口
-                var result = await _mediator.Send(new ReceiveOrderNotify { AddOrderDto = data }, HttpContext.RequestAborted);
+                var result = await _mediator.Send(new ReceiveOrderNotify { AddOrderDto = data, Files = new List<FileDto>() }, HttpContext.RequestAborted);
                 if (result != null && !string.IsNullOrEmpty(result.Id))
                 {
                     dto.Id = id;
                     dto.OrderId = result.Id;
+                    dto.Password = result.Password;
+                    dto.OrderNo = result.No;
                     await _mediaDataReceiveRepository.UpdateAsync(dto, HttpContext.RequestAborted);
                     return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Success(new WriteOrderResponseDto() { AcceptCode = result.No, AcceptPwd = result.Password, msg = "写信成功", Code = "1" }, "您已成功提交数据!"));
                 }
@@ -447,7 +450,7 @@ namespace Hotline.Api.Controllers.DataSharing
                 return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", strResult));
 
             //验证信件是否存在
-            var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.AcceptCode && p.Password == dto.AcceptPwd && p.Source == ESource.ConvergenceMedia.ToString());
+            var data = await _dataOrderRepository.GetAsync(p => p.OrderNo == dto.AcceptCode && p.Password == dto.AcceptPwd && p.Source == ESource.ConvergenceMedia.ToString(), HttpContext.RequestAborted);
             if (data != null)
                 return OpenResponse.Ok(ConvergenceMediaDeResponse<IReadOnlyList<GetOrderByRunDataDto>>.Failed(null, "0", "编号、密码错误!"));
 
@@ -472,38 +475,179 @@ namespace Hotline.Api.Controllers.DataSharing
         /// <returns></returns>
         [HttpPost("WriteFiles")]
         [AllowAnonymous]
-        public async Task<byte[]> WriteFiles([FromForm] IFormCollection formData)
+        public async Task<OpenResponse> WriteFiles([FromForm] IFormCollection formData)
         {
             string Code = formData["Code"];
             string AcceptCode = formData["AcceptCode"];
             string AcceptPwd = formData["AcceptPwd"];
 
+            //验证密钥
+            var mediaCode = _channelConfigurationManager.GetConfigurationMediaCode();
+            if (mediaCode.MediaCode.ToLower().Trim() != Code.ToLower().Trim())
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(null, "-900", "密钥错误"));
+
+            var dataOrder = await _mediaDataReceiveRepository.GetAsync(p => p.OrderNo == AcceptCode && p.Password == AcceptPwd, HttpContext.RequestAborted);
+            if (dataOrder == null)
+                return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Failed(null, "0", "编号或者密码错误"));
+
             IFormFileCollection files = formData.Files;//等价于Request.Form.Files
-            long size = files.Sum(f => f.Length);
-            var file = files[0];
 
-            string FileName = file.FileName;
+            List<FileDto> fileDtos = new List<FileDto>();
+
+            foreach (var item in files)
+            {
+                //这里需要上文件服务器上传
+                var businessFileDto = await SendFileData(item);
+
+                string strFileName = item.FileName;
+                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".")) : "";
+                fileDtos.Add(new FileDto()
+                {
+                    Name = item.FileName,
+                    Type = strSuffix,
+                    Classify = "受理上传",
+                    Additions = businessFileDto.id,
+                    Path = businessFileDto.path
+                });
+            }
+
+            //组装工单数据
+            AddOrderDto data = new()
+            {
+                Title = dataOrder.Title,
+                FromName = dataOrder.LinkName,
+                Contact = dataOrder.Mobile,
+                Address = dataOrder.Address,
+                Content = dataOrder.Content,
+                IsSecret = dataOrder.Secrecy == 0 ? false : true,
+                Source = ESource.ConvergenceMedia,
+                FromGender = dataOrder.Gender switch
+                {
+                    "1" => EGender.Male,
+                    "2" => EGender.Female,
+                    _ => EGender.Unknown,
+                }
+            };
+            switch (dataOrder.PurTypeName)
+            {
+                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 (dataOrder.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 _mediator.Send(new ReceiveOrderNotify { AddOrderDto = data, Files = new List<FileDto>() }, HttpContext.RequestAborted);
 
-            var stream = file.OpenReadStream();
-            byte[] ByteFile = i_StreamToBytes(stream);
-            return ByteFile;
+            return OpenResponse.Ok(ConvergenceMediaDeResponse<WriteOrderResponseDto>.Success(null, "上传成功"));
         }
 
 
         #region 私有方法-将文件转化为文件流
+
         /// <summary>
-        /// 将文件转化为文件流
+        /// 将文件流上传到附件服务器
         /// </summary>
-        /// <param name="stream"></param>
+        /// <param name="file"></param>
         /// <returns></returns>
-        private byte[] i_StreamToBytes(Stream stream)
+        private async Task<BusinessFileDto> SendFileData(IFormFile file)
         {
-            byte[] bytes = new byte[stream.Length];
-            stream.Read(bytes, 0, bytes.Length);
-            // 设置当前流的位置为流的开始    
-            stream.Seek(0, SeekOrigin.Begin);
-            return bytes;
+            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<string, object> 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<BusinessFileResponse>(result);
+                if (resultData != null && resultData.code == 0)
+                {
+                    return resultData.result;
+                }
+            }
+            return new BusinessFileDto();
+
         }
+
+
         #endregion
     }
 }

+ 18 - 2
src/Hotline.Api/Controllers/DataSharing/ProvinceController.cs

@@ -149,8 +149,9 @@ namespace Hotline.Api.Controllers.DataSharing
 
             if (!string.IsNullOrEmpty(id))
             {
+                var listFiles = await GetFileData(dto.CliengGuid, dto.CaseSerial, "受理上传");
                 //调用工单创建接口
-                var result = await _mediator.Send(new ReceiveOrderNotify { AddOrderDto = data }, HttpContext.RequestAborted);
+                var result = await _mediator.Send(new ReceiveOrderNotify { AddOrderDto = data, Files = listFiles }, HttpContext.RequestAborted);
                 if (result != null && !string.IsNullOrEmpty(result.Id))
                 {
                     return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
@@ -683,6 +684,9 @@ namespace Hotline.Api.Controllers.DataSharing
                 //这里需要上文件服务器上传
                 var businessFileDto = await SendFileData(file);
 
+                string strFileName = file.FileName;
+                string strSuffix = strFileName.LastIndexOf(".") > 0 ? strFileName.Substring(strFileName.LastIndexOf(".")) : "";
+
                 // 新增文件到列表
                 var materialInfo = new DsGetCaseMaterialInfo()
                 {
@@ -692,6 +696,7 @@ namespace Hotline.Api.Controllers.DataSharing
                     AreaCode = tmpCaseMaterialInfo.AreaCode,
                     FileName = file.FileName,
                     FileSize = file.Length,
+                    Type = strSuffix.Trim('.'),
                     Additions = businessFileDto.id,
                     Path = businessFileDto.path,
                     Direction = "2",
@@ -702,6 +707,15 @@ namespace Hotline.Api.Controllers.DataSharing
                 //  await _capPublisher.PublishAsync(Sharing.Share.Mq.EventNames.SharingFileData, _mapper.Map<FileDto>(materialInfo), cancellationToken: HttpContext.RequestAborted);
             }
 
+            var list = await _getCaseMaterialInfoRepository.Queryable().Where(p => p.CliengGuid == tmpCaseMaterialInfo.CliengGuid && p.CaseSerial == tmpCaseMaterialInfo.CaseSerial).ToListAsync();
+
+            if (list!=null&&list.Count>0)
+            {
+                foreach (var item in list)
+                {
+
+                }
+            }
             return OpenResponse.Ok(Reponse.Success("您已成功提交数据!"));
         }
 
@@ -829,7 +843,9 @@ namespace Hotline.Api.Controllers.DataSharing
         {
             var list = await _getCaseMaterialInfoRepository.Queryable().Where(p => p.CliengGuid == CliengGuid && p.CaseSerial == CaseSerial).ToListAsync();
 
-            List<FileDto> fileDtos = new List<FileDto>();
+            List<FileDto> fileDtos = new();
+            if (fileDtos == null || fileDtos.Count == 0)
+                return fileDtos;
             foreach (var item in list)
             {
                 fileDtos.Add(new FileDto()

+ 4 - 4
src/Hotline.Application/CallCenter/Calls/TrApplication.cs

@@ -39,7 +39,7 @@ namespace Hotline.Application.CallCenter.Calls
             {
                 if (work.TelNo == telNo)
                 {
-                    return new TrOnDutyResponseDto() { TelNo = work.TelNo, TelPwd = work.TelPwd, Description = work.Description };
+                    return new TrOnDutyResponseDto() { TelNo = work.TelNo, TelPwd = work.TelPwd, Description = work.Description, QueueId = work.QueueId };
                 }
                 else
                 {
@@ -56,16 +56,16 @@ namespace Hotline.Application.CallCenter.Calls
             var telModel = await _trClient.QueryTelsAsync(new Tr.Sdk.Tels.QueryTelRequest() { TelNo = telNo }, cancellationToken);
             if (telModel !=null && telModel.Count>0)
             {
-                work = new Work(_sessionContext.UserId, _sessionContext.UserName, telModel[0].Id, telNo, telModel[0].Password, telModel[0].Description);
+                work = new Work(_sessionContext.UserId, _sessionContext.UserName, telModel[0].Id, telNo, telModel[0].Password, telModel[0].Description, telModel[0].QueueId);
                 await _workRepository.AddAsync(work, cancellationToken);
                 bool IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]);
                 if (IsTelNeedVerify)
                 {
-                    return new TrOnDutyResponseDto() { TelNo = telNo, TelPwd = "", Description = telModel[0].Description };
+                    return new TrOnDutyResponseDto() { TelNo = telNo, TelPwd = "", Description = telModel[0].Description, QueueId = telModel[0].QueueId };
                 }
                 else
                 {
-                    return new TrOnDutyResponseDto() { TelNo = telNo, TelPwd = telModel[0].Password, Description = telModel[0].Description };
+                    return new TrOnDutyResponseDto() { TelNo = telNo, TelPwd = telModel[0].Password, Description = telModel[0].Description, QueueId = telModel[0].QueueId };
                 }
             }
             throw UserFriendlyException.SameMessage("签入异常,未查询到对应分机信息");

+ 8 - 7
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -728,8 +728,9 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             };
         }
 
-        var userId = _sessionContext.RequiredOrgId;
-        var levelOneOrgCode = userId.GetHigherOrgCode();
+        var orgId = _sessionContext.RequiredOrgId;
+        var levelOneOrgId = orgId.GetHigherOrgId();
+        var isCenter = levelOneOrgId.IsCenter();
         switch (stepDefine.HandlerType)
         {
             case EHandlerType.AssignedUser:
@@ -747,10 +748,10 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     .ToListAsync(cancellationToken);
                 var users1 = roles.SelectMany(d => d.Accounts).Select(d => d.User);
 
-                //工单办理:除当前为一级部门选择中心汇总,其余只能选下级部门
+                //工单办理:除一级部门选择中心汇总,其余只能选下级部门
                 if (flowType is EFlowType.Handle
                     && (stepDefine.StepType != EStepType.Summary || stepDefine.BusinessType != EBusinessType.Center))
-                    users1 = users1.Where(d => d.OrgId.StartsWith(userId));
+                    users1 = users1.Where(d => d.OrgId.StartsWith(levelOneOrgId));
 
                 handlers = users1.Select(d => new Kv(d.Id, d.Name)).ToList();
                 break;
@@ -759,7 +760,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                 var levels = stepDefine.HandlerTypeItems.Select(d => d.Key).Select(d => int.Parse(d));
                 var orgs1 = await _organizeRepository.Queryable()
                     .Where(d => d.IsEnable && levels.Contains(d.Level))
-                    .WhereIF(!levelOneOrgCode.IsCenter(), d => d.Id.StartsWith(userId))
+                    .WhereIF(!isCenter, d => d.Id.StartsWith(levelOneOrgId))
                     .ToListAsync(cancellationToken);
 
                 handlers = orgs1.Select(d => new Kv(d.Id, d.Name)).ToList();
@@ -769,7 +770,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
                     .Select(d => Enum.Parse<EOrgType>(d));
                 var orgs2 = await _organizeRepository.Queryable()
                     .Where(d => d.IsEnable && types.Contains(d.OrgType))
-                    .WhereIF(!levelOneOrgCode.IsCenter(), d => d.Id.StartsWith(userId))
+                    .WhereIF(!isCenter, d => d.Id.StartsWith(orgId))
                     .ToListAsync(cancellationToken);
 
                 handlers = orgs2.Select(d => new Kv(d.Id, d.Name)).ToList();
@@ -900,7 +901,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     {
         int orgLevel;
         List<Kv> items;
-        var levelOneOrgCode = _sessionContext.RequiredOrgId.GetHigherOrgCode();
+        var levelOneOrgCode = _sessionContext.RequiredOrgId.GetHigherOrgId();
         switch (policy)
         {
             case EDynamicPolicy.OrgUpCenterTop:

+ 2 - 1
src/Hotline.Application/Handlers/FlowEngine/WorkflowNextHandler.cs

@@ -192,7 +192,8 @@ public class WorkflowNextHandler : INotificationHandler<NextStepNotify>
                         switch (nextTag.Value)
                         {
                             case TagDefaults.TagValue.Province:
-                                //发起省延期审批
+                                //TODO 发起省延期审批
+
                                 break;
                         }
                     }

+ 1 - 1
src/Hotline.Application/Identity/IdentityAppService.cs

@@ -100,7 +100,7 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
                     new(AppClaimTypes.DepartmentAreaCode, user.Organization?.AreaCode ?? string.Empty),
                     new(AppClaimTypes.DepartmentAreaName, user.Organization?.AreaName ?? string.Empty),
                     new(AppClaimTypes.DepartmentLevel, user.Organization?.Level.ToString() ?? string.Empty),
-                    new(AppClaimTypes.AreaId, user.OrgId?.GetHigherOrgCode() ?? string.Empty),
+                    new(AppClaimTypes.AreaId, user.OrgId?.GetHigherOrgId() ?? string.Empty),
                 }
             );
         }

+ 3 - 0
src/Hotline.Share/Dtos/TrCallCenter/TrTelDao.cs

@@ -15,6 +15,8 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public string TelNo { get; set; }
 
         public string Description { get; set; }
+
+        public string QueueId { get; set; }
     }
 
     #endregion
@@ -74,6 +76,7 @@ namespace Hotline.Share.Dtos.TrCallCenter
         public string? TelPwd { get; set; }
 
         public string? Description { get; set; }
+        public string? QueueId { get; set; }
     }
 
 

+ 12 - 0
src/Hotline/DataSharing/ConvergenceMedia/DsMediaDataReceive.cs

@@ -74,5 +74,17 @@ namespace Hotline.DataSharing.ConvergenceMedia
         /// </summary>
         [SugarColumn(ColumnDescription = "区域类型编码", ColumnDataType = "varchar(50)")]
         public int AreaID { get; set; }
+
+        /// <summary>
+        /// 工单编号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "区域类型编码", ColumnDataType = "varchar(50)")]
+        public string? OrderNo { get; set; }
+
+        /// <summary>
+        /// 查询密码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "查询密码", ColumnDataType = "varchar(10)")]
+        public string? Password { get; set; }
     }
 }

+ 6 - 2
src/Hotline/DataSharing/Order/DsOrderWorkFlow.cs

@@ -1,4 +1,5 @@
-using SqlSugar;
+using Hotline.Share.Dtos.File;
+using SqlSugar;
 using XF.Domain.Repository;
 
 namespace Hotline.DataSharing.Order
@@ -95,12 +96,15 @@ namespace Hotline.DataSharing.Order
         /// <summary>
         /// 办理意见
         /// </summary>
+        [SugarColumn(Length = 2000)]
         public string? Opinion { get; set; }
 
         /// <summary>
         /// 附件
         /// </summary>
-        public List<string> Additions { get; set; } = new();
+
+        [SugarColumn(ColumnDataType = "json", IsJson = true, IsNullable = true)]
+        public List<FileJson>? FileJson { get; set; }
 
         /// <summary>
         /// 节点期满时间

+ 11 - 2
src/Hotline/DataSharing/Province/Services/ProvinceService.cs

@@ -18,6 +18,7 @@ using Hotline.Share.Enums.Order;
 using MapsterMapper;
 using MediatR;
 using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
 using Sharing.Province.Dtos.HuiJu.Send;
 using Sharing.Share.Dtos.DataSharing.DataExchange;
@@ -26,6 +27,7 @@ using System.Security.Cryptography;
 using System.Text;
 using XF.Domain.Dependency;
 using XF.Domain.Repository;
+using static System.Runtime.InteropServices.JavaScript.JSType;
 
 namespace Hotline.DataSharing.Province.Services
 {
@@ -82,6 +84,7 @@ namespace Hotline.DataSharing.Province.Services
         private readonly IHttpClientFactory _httpClientFactory;
         private readonly IPusherProviderService _pusherProviderService;
         private readonly IEnterpriseService _enterpriseService;
+        private readonly ILogger<ProvinceService> _logger;
 
         /// <summary>
         /// 注入
@@ -185,7 +188,8 @@ namespace Hotline.DataSharing.Province.Services
           IRepository<DsOrderWorkFlow> dataOrderWorkFlowRepository,
           IHttpClientFactory httpClientFactory,
            IPusherProviderService pusherProviderService,
-           IEnterpriseService enterpriseService)
+           IEnterpriseService enterpriseService,
+           ILogger<ProvinceService> logger)
         {
             _submitCaseInfoRepository = submitCaseInfoRepository;
             _mapper = mapper;
@@ -237,6 +241,7 @@ namespace Hotline.DataSharing.Province.Services
             _httpClientFactory = httpClientFactory;
             _pusherProviderService = pusherProviderService;
             _enterpriseService = enterpriseService;
+            _logger = logger;
         }
         #endregion
 
@@ -505,7 +510,11 @@ namespace Hotline.DataSharing.Province.Services
             }
 
             //写本地办理数据-用于查询办理流程
-            var orderWorkFlow = _mapper.Map<DsOrderWorkFlow>(dto);
+            var orderWorkFlow = _mapper.Map<DsOrderWorkFlow>(dto.WorkflowTrace);
+            orderWorkFlow.OrderId = dto.Order.Id;
+            _logger.LogInformation("流程转换前数据", System.Text.Json.JsonSerializer.Serialize(dto));
+            _logger.LogInformation("流程转换后数据", System.Text.Json.JsonSerializer.Serialize(orderWorkFlow));
+
             await _dataOrderWorkFlowRepository.AddAsync(orderWorkFlow, cancellationToken);
 
             //省上下来的工单走协同的接口

+ 4 - 4
src/Hotline/Settings/SystemDomainService.cs

@@ -69,7 +69,7 @@ public class SystemDomainService : ISystemDomainService, IScopeDependency
                 .Where(d => d.Level == 1)
                 .MaxAsync(d => d.Id, cancellationToken);
 
-            if (!int.TryParse(maxCode.GetLastOrgCode(), out var max))
+            if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
                 throw new UserFriendlyException("无效部门编码");
             return (max + 1).ToString("000");
         }
@@ -86,7 +86,7 @@ public class SystemDomainService : ISystemDomainService, IScopeDependency
             if (string.IsNullOrEmpty(maxCode))
                 return $"{parentOrg.Id}001";
 
-            if (!int.TryParse(maxCode.GetLastOrgCode(), out var max))
+            if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
                 throw new UserFriendlyException("无效部门编码");
 
             return $"{parentOrg.Id}{(max + 1):000}";
@@ -134,7 +134,7 @@ public class SystemDomainService : ISystemDomainService, IScopeDependency
             }
             else
             {
-                if (!int.TryParse(maxCode.GetLastOrgCode(), out var max))
+                if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
                     throw new UserFriendlyException("无效部门编码");
 
                 org.Id = $"{OrgSeedData.CenterId}{(max + 1):000}";
@@ -161,7 +161,7 @@ public class SystemDomainService : ISystemDomainService, IScopeDependency
             }
             else
             {
-                if (!int.TryParse(maxCode.GetLastOrgCode(), out var max))
+                if (!int.TryParse(maxCode.GetLastOrgId(), out var max))
                     throw new UserFriendlyException("无效部门编码");
 
                 org.Id = $"{parentOrg.Id}{(max + 1):000}";

+ 3 - 3
src/Hotline/Settings/SystemOrganize.cs

@@ -98,7 +98,7 @@ public static class OrgExtensions
     /// <param name="orgId"></param>
     /// <param name="orgLevel">默认获取一级部门</param>
     /// <returns></returns>
-    public static string GetHigherOrgCode(this string orgId, int orgLevel = 1)
+    public static string GetHigherOrgId(this string orgId, int orgLevel = 1)
     {
         if (string.IsNullOrEmpty(orgId))
             throw UserFriendlyException.SameMessage("无效部门编码");
@@ -112,7 +112,7 @@ public static class OrgExtensions
     /// <summary>
     /// 获取最末级部门对应编号(最末3位)
     /// </summary>
-    public static string GetLastOrgCode(this string orgCode)
+    public static string GetLastOrgId(this string orgCode)
     {
         if (orgCode.Length < 3)
             throw new UserFriendlyException("非法部门编码");
@@ -130,7 +130,7 @@ public static class OrgExtensions
     {
         if (string.IsNullOrEmpty(orgId))
             throw UserFriendlyException.SameMessage("无效部门编码");
-        var upperOrg = orgId.GetHigherOrgCode();
+        var upperOrg = orgId.GetHigherOrgId();
         return IsCenter(upperOrg);
     }
 }

+ 4 - 1
src/Hotline/Users/Work.cs

@@ -44,6 +44,8 @@ public class Work : CreationModificationEntity
     public string? TelPwd { get; set; }
 
     public string? Description { get; set; }
+
+    public string? QueueId { get; set; }
     ///// <summary>
     ///// SignalR.ConnectionId
     ///// </summary>
@@ -55,7 +57,7 @@ public class Work : CreationModificationEntity
 
     }
 
-    public Work(string userId, string name, string telId, string telNo, string? telPwd, string? description)
+    public Work(string userId, string name, string telId, string telNo, string? telPwd, string? description, string? queueId)
     {
         StartTime = DateTime.Now;
         UserId = userId;
@@ -64,6 +66,7 @@ public class Work : CreationModificationEntity
         TelNo = telNo;
         TelPwd = telPwd;
         Description = description;
+        QueueId = queueId;
     }
 
     public Work(string userId, string name, string telId, string telNo)

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

@@ -27,5 +27,8 @@ namespace Tr.Sdk.Tels
         public string Description { get; set; }
 
         public string Password { get; set; }
+
+        [JsonPropertyName("queue_id")]
+        public string QueueId { get; set; }
     }
 }