Bläddra i källkod

Merge branch 'release' into feature/updateorder

tangjiang 6 månader sedan
förälder
incheckning
f0e389e1ff

+ 3 - 2
src/Hotline.Api/Controllers/CallController.cs

@@ -105,10 +105,11 @@ namespace Hotline.Api.Controllers
         /// <returns></returns>
         /// <exception cref="NotImplementedException"></exception>
         [HttpGet("{callId}")]
-        public Task<CallNative?> GetCall(string callId)
+        public Task<List<CallNative>> GetCall(string callId)
         {
+            //为兼容天润通话记录返回集合
             if (string.IsNullOrEmpty(callId)) return default;
-            return _callApplication.GetCallAsync(callId, HttpContext.RequestAborted);
+            return _callApplication.GetCallListAsync(callId, HttpContext.RequestAborted);
         }
 
         /// <summary>

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

@@ -792,8 +792,8 @@ namespace Hotline.Api.Controllers
 
                     //工单
                     var order = await _orderRepository.GetAsync(x => x.Id == dto.Id, HttpContext.RequestAborted);
-                    if (!string.IsNullOrEmpty(order.CallId))
-                        throw UserFriendlyException.SameMessage("通话记录已经关联工单");
+                    //if (!string.IsNullOrEmpty(order.CallId))
+                    //    throw UserFriendlyException.SameMessage("通话记录已经关联工单");
 
                     order.CallId = dto.CallId;
                     order.FromPhone = trRecord.CPN;

+ 15 - 14
src/Hotline.Api/Controllers/OrderController.cs

@@ -2995,7 +2995,7 @@ public class OrderController : BaseController
             dto.IsReturnUnderApproval = true;
         }
         //省退回
-        var orderSendback = await _orderSendBackRepository.Queryable().Where(x => x.OrderId == order.Id).OrderByDescending(x=>x.AuditTime).FirstAsync();
+        var orderSendback = await _orderSendBackRepository.Queryable().Where(x => x.OrderId == order.Id).OrderByDescending(x => x.AuditTime).FirstAsync();
         if (orderSendback is not null)
         {
             string stateStr = "";
@@ -3015,7 +3015,7 @@ public class OrderController : BaseController
                     stateStr = "未知";
                     break;
             }
-            dto.ProvinceSendBackString = "该工单已向省平台发送退回申请!退回状态:"+ stateStr;
+            dto.ProvinceSendBackString = "该工单已向省平台发送退回申请!退回状态:" + stateStr;
         }
 
         var isProvinceorderRevoke = await _orderRevokeRepository.Queryable().AnyAsync(x => x.OrderId == order.Id && x.IsProRevoke == true);
@@ -3748,9 +3748,9 @@ public class OrderController : BaseController
         var (total, items) = await _orderRepository
             .Queryable(hasHandled: isHandled, isAdmin: isAdmin)
             .Includes(d => d.OrderSpecials)
-            .Where(d => d.Status != EOrderStatus.WaitForAccept && 
-                        d.Status != EOrderStatus.BackToUnAccept && 
-                        d.Status != EOrderStatus.SpecialToUnAccept && 
+            .Where(d => d.Status != EOrderStatus.WaitForAccept &&
+                        d.Status != EOrderStatus.BackToUnAccept &&
+                        d.Status != EOrderStatus.SpecialToUnAccept &&
                         d.Status != EOrderStatus.HandOverToUnAccept)
             .WhereIF(dto.IsProvince.HasValue, d => d.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.StartsWith(dto.Keyword))
@@ -3772,7 +3772,7 @@ public class OrderController : BaseController
             .WhereIF(dto.IsUrgent.HasValue, d => d.IsUrgent == dto.IsUrgent!.Value)
             .OrderByDescending(d => new { d.IsUrgent, d.StartTime })
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
-        
+
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
     }
 
@@ -4054,7 +4054,7 @@ public class OrderController : BaseController
             if (averageSendOrder)
             {
                 var handler = await _orderDomainService.AverageOrder(HttpContext.RequestAborted);
-                dto.NextHandlers = new List<FlowStepHandler> { handler };
+                dto.Handler = handler;
             }
         }
 
@@ -4354,7 +4354,7 @@ public class OrderController : BaseController
                 continue;
             }
 
-            if (order.Status >= EOrderStatus.Filed || order.Status == EOrderStatus.BackToProvince || !order.IsProvince || order.ActualHandleOrgCode!="001")
+            if (order.Status >= EOrderStatus.Filed || order.Status == EOrderStatus.BackToProvince || !order.IsProvince || (!string.IsNullOrEmpty(order.ActualHandleOrgCode) && order.ActualHandleOrgCode != "001"))
             {
                 errorCount++;
                 continue;
@@ -4405,7 +4405,7 @@ public class OrderController : BaseController
         var order = await _orderRepository.GetAsync(dto.OrderId, HttpContext.RequestAborted);
         if (order is null)
             throw UserFriendlyException.SameMessage("无效工单");
-        if (order.Status >= EOrderStatus.Filed || order.Status == EOrderStatus.BackToProvince || !order.IsProvince || order.ActualHandleOrgCode != "001")
+        if (order.Status >= EOrderStatus.Filed || order.Status == EOrderStatus.BackToProvince || !order.IsProvince || (!string.IsNullOrEmpty(order.ActualHandleOrgCode) && order.ActualHandleOrgCode != "001"))
             throw UserFriendlyException.SameMessage("工单状态无效,请确认当前工单状态");
         if (order.Source <= ESource.HotlineImport)
             throw UserFriendlyException.SameMessage("工单来源无效,请确认当前工单来源");
@@ -6162,7 +6162,7 @@ public class OrderController : BaseController
 
                     order.FirstVisitResultCode = _sysDicDataCacheManager
                         .GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction)
-                        .FirstOrDefault(m => m.DicDataName == item.VisitResult)?.DicDataValue 
+                        .FirstOrDefault(m => m.DicDataName == item.VisitResult)?.DicDataValue
                         ?? order.FirstVisitResultCode;
 
                     #endregion
@@ -6170,7 +6170,7 @@ public class OrderController : BaseController
                     if (order.Id.IsNullOrEmpty())
                     {
                         //order.Source = item;
-                        var id = await _orderDomainService.AddAsync(order,false,  HttpContext.RequestAborted);
+                        var id = await _orderDomainService.AddAsync(order, false, HttpContext.RequestAborted);
                         if (!string.IsNullOrEmpty(id))
                         {
                             addCount++;
@@ -6581,14 +6581,15 @@ public class OrderController : BaseController
     /// <param name="dto"></param>
     /// <returns></returns>
     [HttpPost("modify-externalcitizens")]
-    public async Task ModifyExternalcitizens([FromBody]ModifyExternalcitizensDto dto)
+    public async Task ModifyExternalcitizens([FromBody] ModifyExternalcitizensDto dto)
     {
-
+        if (dto.PhoneNum.Length != 11)
+            throw UserFriendlyException.SameMessage("手机号不合法");
         bool isHas = await _externalCitizensRepository.Queryable().AnyAsync(x => x.Id != dto.Id && x.PhoneNum == dto.PhoneNum);
         if (isHas)
             throw UserFriendlyException.SameMessage("已存在当前电话,请核对后再修改");
         var model = await _externalCitizensRepository.GetAsync(dto.Id, HttpContext.RequestAborted);
-        if( model == null )
+        if (model == null)
             throw UserFriendlyException.SameMessage("无效数据");
         model.PhoneNum = dto.PhoneNum;
         model.Name = dto.Name;

+ 0 - 2
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -24,8 +24,6 @@ using Hotline.File;
 using Hotline.Orders;
 using Hotline.Share.Dtos.Order;
 using Hotline.Share.Dtos.FlowEngine.Definition;
-using Microsoft.AspNetCore.Authorization;
-using Hotline.Caching.Services;
 using Hotline.Settings.TimeLimits;
 using Hotline.SeedData;
 

+ 14 - 2
src/Hotline.Application/CallCenter/DefaultCallApplication.cs

@@ -289,10 +289,22 @@ public abstract class DefaultCallApplication : ICallApplication
     /// <summary>
     /// 查询通话记录
     /// </summary>
-    public virtual async Task<CallNative?> GetCallAsync(string callId, CancellationToken cancellationToken)
+    public virtual async Task<CallNative> GetCallAsync(string callId, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(callId)) return null;
-        return await _callNativeRepository.GetAsync(callId, cancellationToken);
+        return await _callNativeRepository.GetAsync(callId,cancellationToken);
+    }
+
+    /// <summary>
+    /// 查询通话记录列表
+    /// </summary>
+    /// <param name="callId"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public virtual async Task<List<CallNative>> GetCallListAsync(string callId,CancellationToken cancellationToken)
+    {
+        if(string.IsNullOrEmpty(callId)) return null;
+        return await _callNativeRepository.Queryable().Where(x => x.Id == callId).ToListAsync(cancellationToken);
     }
 
     /// <summary>

+ 8 - 0
src/Hotline.Application/CallCenter/ICallApplication.cs

@@ -86,9 +86,17 @@ namespace Hotline.Application.CallCenter
         /// </summary>
         Task<int> UpdateRelationOptLockAsync(CallidRelation relation, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 查询通话记录列表
+        /// </summary>
+        Task<List<CallNative>> GetCallListAsync(string callId, CancellationToken cancellationToken);
+
         /// <summary>
         /// 查询通话记录
         /// </summary>
+        /// <param name="callId"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
         Task<CallNative?> GetCallAsync(string callId, CancellationToken cancellationToken);
 
         /// <summary>

+ 17 - 2
src/Hotline.Application/CallCenter/TianRunCallApplication.cs

@@ -109,6 +109,8 @@ namespace Hotline.Application.CallCenter
             return callRecord;
         }
 
+        
+
         /// <summary>
         /// 根据转写ID获取通话信息
         /// </summary>
@@ -183,8 +185,21 @@ namespace Hotline.Application.CallCenter
         public override async Task<CallNative?> GetCallAsync(string callId, CancellationToken cancellationToken)
         {
             var call = await _trCallRecordRepository.Queryable()
-                .FirstAsync(d => d.OtherAccept == callId, cancellationToken);
-            return _mapper.Map<CallNative>(call);
+                .FirstAsync(d => d.OtherAccept == callId,cancellationToken);
+            return _mapper.Map<CallNative?>(call);
+        }
+
+        /// <summary>
+        /// 查询通话记录列表
+        /// </summary>
+        /// <param name="callId"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public override async Task<List<CallNative>> GetCallListAsync(string callId, CancellationToken cancellationToken)
+        {
+            var call = await _trCallRecordRepository.Queryable()
+                .Where(d => d.OtherAccept == callId).ToListAsync(cancellationToken);
+            return _mapper.Map<List<CallNative>>(call);
         }
     }
 }

+ 4 - 0
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -170,6 +170,10 @@ namespace Hotline.Application.Subscribers
                 {
                     order.Status = EOrderStatus.WaitForAccept;
                 }
+                if (dto.Result is 1)
+                    order.ProvinceSendBack = true;
+                else
+                    order.ProvinceSendBack = false;
                 await _orderRepository.UpdateAsync(order, cancellationToken);
 
                 //if (dto.Result is 1)

+ 10 - 6
src/Hotline.Share/Dtos/FlowEngine/PreviousWorkflowDto.cs

@@ -12,12 +12,16 @@ public class PreviousWorkflowDto : EndWorkflowIdDto
     /// </summary>
     public DateTime? ExpiredTime { get; set; }
 
+    ///// <summary>
+    ///// 根据办理者类型不同,此字段为不同内容
+    ///// <example>
+    ///// 部门等级/分类为:depCodes, 角色为:userIds
+    ///// </example>
+    ///// </summary>
+    //public List<FlowStepHandler> NextHandlers { get; set; } = new();
+
     /// <summary>
-    /// 根据办理者类型不同,此字段为不同内容
-    /// <example>
-    /// 部门等级/分类为:depCodes, 角色为:userIds
-    /// </example>
+    /// 指定办理对象
     /// </summary>
-    public List<FlowStepHandler> NextHandlers { get; set; } = new();
-
+    public FlowStepHandler? Handler { get; set; }
 }

+ 7 - 1
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -695,7 +695,13 @@ namespace Hotline.Share.Dtos.Order
         /// 省撤单信息
         /// </summary>
         public string ProvinceRevokeString { get; set; }
-      
+
+        /// <summary>
+        /// 省工单退回
+        /// </summary>
+        public bool? ProvinceSendBack { get; set; }
+
+
     }
 
     public class UpdateOrderDto : AddOrderDto

+ 12 - 10
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -21,6 +21,7 @@ using XF.Domain.Dependency;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
 using XF.Domain.Repository;
+using System.Reflection.Metadata;
 
 namespace Hotline.FlowEngine.Workflows
 {
@@ -258,7 +259,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var unhandlePreviousTrace = workflow.Traces.FirstOrDefault(d =>
                     d.Status is not EWorkflowStepStatus.Handled
-                //&& d.TraceType is EWorkflowTraceType.Previous
+            //&& d.TraceType is EWorkflowTraceType.Previous
             );
             //var previousOpinion = unhandlePreviousTrace?.Opinion ?? null;
 
@@ -626,17 +627,18 @@ namespace Hotline.FlowEngine.Workflows
             //如果有传入期满时间 新节点为传入的期满时间
             if (dto.ExpiredTime.HasValue)
                 prevStep.StepExpiredTime = dto.ExpiredTime;
-            //退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
-            if (dto.NextHandlers.Any())
-            {
-                var handle = dto.NextHandlers.FirstOrDefault();
-                prevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
-            }
-
+            
             //复制上一个节点为待接办
             var newPrevStep =
                 await DuplicateStepWithTraceAsync(workflow, prevStep, EWorkflowTraceType.Previous, cancellationToken);
 
+            //退给派单组节点,需按照平均分配原则派给一个派单员 禅道299 TODO
+            if (dto.Handler != null)//todo 改为按策略判断
+            {
+                var handle = dto.Handler;
+                newPrevStep.Assign(handle.UserId, handle.Username, handle.OrgId, handle.OrgName, handle.RoleId, handle.RoleName);
+            }
+
             //remove workflow.steps
             await _workflowStepRepository.RemoveRangeAsync(removeSteps, cancellationToken);
             //await _workflowStepRepository.RemoveNav(removeSteps)
@@ -1092,7 +1094,7 @@ namespace Hotline.FlowEngine.Workflows
             var workflow = await GetWorkflowAsync(workflowId, withDefine: true, withSteps: true, withTraces: true,
                 cancellationToken: cancellationToken);
             var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start);
-            if(startStep is null)
+            if (startStep is null)
                 throw new UserFriendlyException($"数据异常, workflowId: {workflowId}", "该流程无开始节点");
 
             await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
@@ -1130,7 +1132,7 @@ namespace Hotline.FlowEngine.Workflows
             else
             {
                 var startStep = workflow.Steps.First(d => d.StepType == EStepType.Start);
-                if(startStep is null)
+                if (startStep is null)
                     throw new UserFriendlyException($"数据异常, workflowId: {workflowId}", "该流程无开始节点");
                 await RecallToTargetStepAsync(workflow, startStep, opinion, current, cancellationToken);
             }

+ 6 - 0
src/Hotline/Orders/Order.cs

@@ -855,6 +855,12 @@ namespace Hotline.Orders
         [SugarColumn(ColumnDescription = "工单标签")]
         public string? TagNames { get; set; }
 
+        /// <summary>
+        /// 省退回结果
+        /// </summary>
+        [SugarColumn(ColumnDescription ="省退回结果")]
+        public bool? ProvinceSendBack { get; set; }
+
         #endregion
 
         #region 附件冗余