浏览代码

Merge branch 'release/yibin' of http://git.12345lm.cn/Fengwo/hotline into release/yibin

Dun.Jason 11 月之前
父节点
当前提交
37930d609f

+ 6 - 0
src/Hotline.Api/Controllers/IPPbxController.cs

@@ -399,6 +399,12 @@ namespace Hotline.Api.Controllers
             {
                 model.TelNo = model.CPN;
             }
+            //判断是否是内部通话(目前分机都为4位)
+            if (model.CPN.Length==4 && model.CDPN.Length ==4) //是内部通话
+            {
+                model.TelNo = model.CDPN;//如果是内部通话  响应分机为被叫号码
+            }
+
 
             //获取关联 工单或是回访
             var order = await _orderRepository.GetAsync(x => x.CallId == model.CallAccept, HttpContext.RequestAborted);

+ 50 - 11
src/Hotline.Api/Controllers/OrderController.cs

@@ -113,8 +113,9 @@ public class OrderController : BaseController
     private readonly IRepository<TranspondCityRawData> _transpondCityRawDataRepository;
     private readonly IRepository<OrderSpecialDetail> _orderSpecialDetailRepository;
     private readonly IOrderSecondaryHandlingApplication _orderSecondaryHandlingApplication;
+    private readonly IRepository<OrderCopy> _orderCopyRepository;
 
-    public OrderController(
+	public OrderController(
         IOrderDomainService orderDomainService,
         IOrderRepository orderRepository,
         IWorkflowApplication workflowApplication,
@@ -165,8 +166,9 @@ public class OrderController : BaseController
         IExportApplication exportApplication,
         IRepository<TranspondCityRawData> transpondCityRawDataRepository,
         IRepository<OrderSpecialDetail> orderSpecialDetailRepository,
-        IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication
-        )
+        IOrderSecondaryHandlingApplication orderSecondaryHandlingApplication,
+        IRepository<OrderCopy> orderCopyRepository
+		)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -219,7 +221,9 @@ public class OrderController : BaseController
         _transpondCityRawDataRepository = transpondCityRawDataRepository;
         _orderSpecialDetailRepository = orderSpecialDetailRepository;
         _orderSecondaryHandlingApplication = orderSecondaryHandlingApplication;
-    }
+        _orderCopyRepository = orderCopyRepository;
+
+	}
 
     #region 工单发布
 
@@ -2312,7 +2316,8 @@ public class OrderController : BaseController
         {
             var ids = order.FileJson.Select(x => x.Id).ToList();
             var files = await _fileRepository.GetFilesAsync(ids, HttpContext.RequestAborted);
-            dto.Files = files.Where(x => x.Classify == "办理上传" && string.IsNullOrEmpty(x.FlowKey)).ToList();
+            //x.Classify == "办理上传" &&
+		   dto.Files = files.Where(x =>string.IsNullOrEmpty(x.FlowKey)).ToList();
         }
 
         var call = await _trCallRecordRepository.Queryable().Where(x => x.CallAccept == order.CallId).FirstAsync();
@@ -2416,6 +2421,15 @@ public class OrderController : BaseController
         {
             _logger.LogError("新增工单发送短信失败,Error:{err}", e.Message);
         }
+        // 副本工单
+        var copy = new OrderCopy();
+        _mapper.Map(order, copy);
+        copy.OrderId = order.Id;
+		copy.AuditTime = DateTime.Now;
+		copy.AuditUserId = _sessionContext.UserId;
+		copy.AuditUserName = _sessionContext.UserName;
+		copy.InitId();
+		await _orderCopyRepository.AddAsync(copy, HttpContext.RequestAborted);
         return order.Id;
     }
 
@@ -2518,7 +2532,16 @@ public class OrderController : BaseController
         await _orderRepository.UpdateNav(order).Include(d => d.OrderExtension).ExecuteCommandAsync();
         //敏感分词
         await _orderApplication.OrderSensitiveParticiple(dto.Content, order.Id, HttpContext.RequestAborted);
-    }
+		// 副本工单
+		var copy = new OrderCopy();
+		_mapper.Map(order, copy);
+		copy.OrderId = order.Id;
+		copy.AuditTime = DateTime.Now;
+        copy.AuditUserId = _sessionContext.UserId;
+        copy.AuditUserName = _sessionContext.UserName;
+		copy.InitId();
+		await _orderCopyRepository.AddAsync(copy, HttpContext.RequestAborted);
+	}
 
     /// <summary>
     /// 开始工单办理流程
@@ -4948,9 +4971,25 @@ public class OrderController : BaseController
         };
         return rsp;
     }
-    #endregion
-
-    #region 副本工单
-
-    #endregion
+	#endregion
+
+	#region 副本工单
+
+	/// <summary>
+	/// 获取副本工单列表
+	/// </summary>
+	/// <param name="dto"></param>
+	/// <returns></returns>
+	[HttpGet("order_copy/list")]
+	public async Task<PagedDto<OrderDto>> OrderCopyList([FromQuery] OrderCopyListDto dto)
+	{
+		var (total, items) = await _orderCopyRepository.Queryable()
+            .Where(x=>x.OrderId == dto.OrderId)
+			.WhereIF(!string.IsNullOrEmpty(dto.Keyword),x => x.No.Contains(dto.Keyword!))
+			.OrderByDescending(x => x.CreationTime)
+			.ToPagedListAsync(1, 1, HttpContext.RequestAborted);
+		return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
+	}
+
+	#endregion
 }

+ 9 - 3
src/Hotline.Application/CallCenter/Calls/TrApplication.cs

@@ -71,6 +71,10 @@ namespace Hotline.Application.CallCenter.Calls
             {
                 work = new Work(_sessionContext.UserId, _sessionContext.UserName, telModel[0].Id, telNo, telModel[0].Password, telModel[0].Description, telModel[0].QueueId,_sessionContext.StaffNo, ETelModel.OrdinaryModel);
                 await _workRepository.AddAsync(work, cancellationToken);
+                //记录签入日志
+                var actionRecord = new TelActionRecord(work.UserId, work.UserName, work.TelNo, work.QueueId, EActionType.SignIn);
+                await _telActionRecordRepository.AddAsync(actionRecord, cancellationToken);
+
                 bool IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]);
                 string callOutQueueId = _systemSettingCacheManager.GetSetting(SettingConstants.CallOutQueueId).SettingValue[0];
                 if (IsTelNeedVerify)
@@ -98,17 +102,19 @@ namespace Hotline.Application.CallCenter.Calls
                 
                 bool isRest = await _telRestRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && !x.EndTime.HasValue,cancellationToken);
 
-                bool isCallHold = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && !x.EndTime.HasValue, cancellationToken);
+                bool isCallHold = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && x.ActionType == EActionType.CallHold && !x.EndTime.HasValue, cancellationToken);
+
+                bool isCallEndArrange = await _telActionRecordRepository.AnyAsync(x => x.TelNo == work.TelNo && x.UserId == userId && x.ActionType == EActionType.CallEndArrange && !x.EndTime.HasValue, cancellationToken);
 
                 bool IsTelNeedVerify = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.IsTelNeedVerify).SettingValue[0]);
                 string callOutQueueId = _systemSettingCacheManager.GetSetting(SettingConstants.CallOutQueueId).SettingValue[0];
                 if (IsTelNeedVerify)
                 {
-                    return new TrOnDutyResponseDto() { QueueCallOut= callOutQueueId, TelNo = work.TelNo, TelPwd = "", Description = work.Description, QueueId = work.QueueId, StartTime = work.StartTime, IsRest = isRest, TelModel = work.TelModel, IsCallHold = isCallHold };
+                    return new TrOnDutyResponseDto() { QueueCallOut= callOutQueueId, TelNo = work.TelNo, TelPwd = "", Description = work.Description, QueueId = work.QueueId, StartTime = work.StartTime, IsRest = isRest, TelModel = work.TelModel, IsCallHold = isCallHold, IsCallEndArrange = isCallEndArrange };
                 }
                 else
                 {
-                    return new TrOnDutyResponseDto() { QueueCallOut = callOutQueueId, TelNo = work.TelNo, TelPwd = work.TelPwd, Description = work.Description, QueueId = work.QueueId, StartTime = work.StartTime, IsRest = isRest, TelModel = work.TelModel, IsCallHold = isCallHold };
+                    return new TrOnDutyResponseDto() { QueueCallOut = callOutQueueId, TelNo = work.TelNo, TelPwd = work.TelPwd, Description = work.Description, QueueId = work.QueueId, StartTime = work.StartTime, IsRest = isRest, TelModel = work.TelModel, IsCallHold = isCallHold, IsCallEndArrange = isCallEndArrange };
                 }
                
             }

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

@@ -62,8 +62,10 @@ public class IdentityAppService : IIdentityAppService, IScopeDependency
         if (account == null)
             throw new UserFriendlyException($"用户名或密码错误!{System.Text.Json.JsonSerializer.Serialize(dto)}", "用户名或密码错误!");
 
+        var userInfo = await _userRepository.GetAsync(p => p.Id == account.Id, cancellationToken);
+
         //校验验证码
-        await _messageCodeDomainService.CheckdCode(account.UserName, account.PhoneNo, dto.MsgCode, cancellationToken);
+        await _messageCodeDomainService.CheckdCode(account.UserName, userInfo.PhoneNo, dto.MsgCode, cancellationToken);
 
         if (account.Status != EAccountStatus.Normal)
             throw UserFriendlyException.SameMessage("用户名或密码错误!");

+ 10 - 13
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -199,11 +199,8 @@ namespace Hotline.Application.Orders
 		public ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken)
 		{
 			dto.CreationTimeEnd = DateTime.Now;
-			dto.CreationTimeStart = DateTime.Now;
-			if (dto.IsHomePage != null && dto.IsHomePage == true)
-			{
-				dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
-			}
+			//dto.CreationTimeStart = DateTime.Now;
+			dto.CreationTimeStart = _timeLimitDomainService.CalcWorkTimeReduce(DateTime.Now, 5);
 
 			var query = _orderVisitedDetailRepository.Queryable(false, true)
 				.Includes(x => x.OrderVisit)
@@ -212,7 +209,7 @@ namespace Hotline.Application.Orders
 				.Includes(x => x.SecondaryHandling)
 				.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && s.Status < EScreenStatus.End && s.IsDeleted == false)
 				.Where((x, s) => s.Id == null && (x.SecondaryHandling.State == ESecondaryHandlingState.NotApply || x.SecondaryHandling.Id == null))
-				.WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true, x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
+				.Where(x => x.OrderVisit.VisitTime < dto.CreationTimeEnd && x.OrderVisit.VisitTime > dto.CreationTimeStart)
 				.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
 				.WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
 				.WhereIF(!string.IsNullOrEmpty(dto.Title), x => x.OrderVisit.Order!.Title!.Contains(dto.Title!))
@@ -227,7 +224,7 @@ namespace Hotline.Application.Orders
 				.WhereIF(dto.VisitTime.HasValue && dto.EndVisitTime.HasValue, x => x.OrderVisit.VisitTime == dto.VisitTime && x.OrderVisit.VisitTime <= dto.EndVisitTime)
 				.WhereIF(!string.IsNullOrEmpty(dto.VisitOrgName), x => x.VisitOrgName!.Contains(dto.VisitOrgName!))
 				.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
-				//.WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
+				.WhereIF(!string.IsNullOrEmpty(dto.OrgHandledAttitude), x => SqlFunc.JsonListObjectAny(x.OrgHandledAttitude, "Key", dto.OrgHandledAttitude))
 				.WhereIF(!string.IsNullOrEmpty(dto.OrgNoSatisfiedReason), x => SqlFunc.JsonField(x.OrgNoSatisfiedReason, "Key") == dto.OrgNoSatisfiedReason)
 				.Where((x, s) => x.OrderVisit.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle)
 				.Where((x, s) => x.OrderVisit.Order.CounterSignType == null && x.OrderVisit.Order.ActualHandleOrgCode == _sessionContext.OrgId)
@@ -239,9 +236,9 @@ namespace Hotline.Application.Orders
 								  x.OrderVisit.Order.No.Contains(dto.Keyword!))
 					.Where((x, s) => x.VisitTarget == EVisitTarget.Org && x.VisitOrgCode.StartsWith(_sessionContext.OrgId) && (
 						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
-						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" 
-						//||SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
-						//SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
+						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
+						|| SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
+						SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
 					));
 			}
 			else
@@ -251,9 +248,9 @@ namespace Hotline.Application.Orders
 								  x.OrderVisit.Order.No.Contains(dto.Keyword!))
 					.Where((x, s) => x.VisitTarget == EVisitTarget.Org && (
 						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "1" ||
-						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2" 
-						//||SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
-						//SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
+						SqlFunc.JsonField(x.OrgProcessingResults, "Key") == "2"
+						|| SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "1" ||
+						SqlFunc.JsonField(x.OrgHandledAttitude, "Key") == "2"
 					));
 			}
 

+ 67 - 51
src/Hotline.Application/Subscribers/DatasharingSubscriber.cs

@@ -126,26 +126,27 @@ namespace Hotline.Application.Subscribers
                     sendBack.FileJson = await _fileRepository.AddFileAsync(dto.Files, sendBack.Id, string.Empty, cancellationToken);
                 }
 
+                var order = await _orderRepository.GetAsync(sendBack.OrderId, cancellationToken);
+                if (order is null)
+                    throw new UserFriendlyException("无效工单编号");
+
                 if (dto.Result is 1)
                 {
-                    var order = await _orderRepository.GetAsync(sendBack.OrderId, cancellationToken);
-                    if (order is null)
-                        throw new UserFriendlyException("无效工单编号");
-                    var now = DateTime.Now;
-                    var handleDuration = order.StartTime.HasValue
-                        ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
-                            now, order.ProcessType is EProcessType.Zhiban)
-                        : 0;
-                    var fileDuration = order.CenterToOrgTime.HasValue
-                        ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
-                            now, order.ProcessType is EProcessType.Zhiban)
-                        : 0;
-                    var allDuration = order.StartTime.HasValue
-                        ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
-                            order.ProcessType is EProcessType.Zhiban)
-                        : 0;
-                    order.File(now, handleDuration, fileDuration, allDuration);
-                    await _orderRepository.UpdateAsync(order, cancellationToken);
+                    //var now = DateTime.Now;
+                    //var handleDuration = order.StartTime.HasValue
+                    //    ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
+                    //        now, order.ProcessType is EProcessType.Zhiban)
+                    //    : 0;
+                    //var fileDuration = order.CenterToOrgTime.HasValue
+                    //    ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
+                    //        now, order.ProcessType is EProcessType.Zhiban)
+                    //    : 0;
+                    //var allDuration = order.StartTime.HasValue
+                    //    ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
+                    //        order.ProcessType is EProcessType.Zhiban)
+                    //    : 0;
+                    //order.File(now, handleDuration, fileDuration, allDuration);
+                    //await _orderRepository.UpdateAsync(order, cancellationToken);
 
                     var current = SessionContextCreator.CreateSessionContext(dto.Source);
                     if (string.IsNullOrEmpty(order.WorkflowId))
@@ -167,6 +168,11 @@ namespace Hotline.Application.Subscribers
                             null, cancellationToken: cancellationToken);
                     }
                 }
+                else
+                {
+                    order.Status = EOrderStatus.WaitForAccept;
+                    await _orderRepository.UpdateAsync(order, cancellationToken);
+                }
             }
             await _orderSendBackRepository.UpdateAsync(sendBack, cancellationToken);
         }
@@ -319,7 +325,7 @@ namespace Hotline.Application.Subscribers
             //    .FirstAsync(cancellationToken);
 
             var orderScreen = await _orderScreenRepository.Queryable()
-                .Where(x => x.Order.ProvinceNo == dto.ProvinceScreenResult.CaseSerial && 
+                .Where(x => x.Order.ProvinceNo == dto.ProvinceScreenResult.CaseSerial &&
                             x.Status == EScreenStatus.Approval)
                 .FirstAsync(cancellationToken);
 
@@ -330,17 +336,17 @@ namespace Hotline.Application.Subscribers
                     ? Share.Enums.FlowEngine.EReviewResult.Approval
                     : Share.Enums.FlowEngine.EReviewResult.Failed, cancellationToken);
             orderScreen.Status = dto.ProvinceScreenResult.AuditResult ? Share.Enums.Order.EScreenStatus.End : Share.Enums.Order.EScreenStatus.Refuse;
-            if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
-            {
-                var visitDetail = await _orderVisitedDetailRepository.GetAsync(orderScreen.VisitDetailId, cancellationToken);
-                if (visitDetail != null)
-                {
-                    var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
-                    visitDetail.OrgProcessingResults = screenSatisfy;
-                    visitDetail.OrgHandledAttitude = screenSatisfy;
-                    await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
-                }
-            }
+            //if (orderScreen.Status == Share.Enums.Order.EScreenStatus.End)
+            //{
+            //    var visitDetail = await _orderVisitedDetailRepository.GetAsync(orderScreen.VisitDetailId, cancellationToken);
+            //    if (visitDetail != null)
+            //    {
+            //        var screenSatisfy = new Kv() { Key = "-1", Value = "视为满意" };
+            //        visitDetail.OrgProcessingResults = screenSatisfy;
+            //        visitDetail.OrgHandledAttitude = screenSatisfy;
+            //        await _orderVisitedDetailRepository.UpdateAsync(visitDetail, cancellationToken);
+            //    }
+            //}
             orderScreen.ReplyContent = dto.ProvinceScreenResult.AuditOpinion;
             if (dto.Files.Any())
                 orderScreen.FileJson =
@@ -475,14 +481,15 @@ namespace Hotline.Application.Subscribers
             if (order != null)
             {
                 //查询延期
-                var orderDelay = await _orderDelayRepository.GetAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, cancellationToken);
-                var current = SessionContextCreator.CreateSessionContext(dto.Source);
-                await _workflowApplication.HandleToEndAsync(current, orderDelay.WorkflowId, dto.Opinion, dto.Files,
-                    dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken);
-
+                var orderDelay = await _orderDelayRepository
+                    .GetAsync(x => x.OrderId == order.Id && x.DelayState == EDelayState.Examining, cancellationToken);
                 if (dto.Files != null && dto.Files.Any())
                     orderDelay.FileJson = await _fileRepository.AddFileAsync(dto.Files, orderDelay.Id, orderDelay.WorkflowId, cancellationToken);
                 await _orderDelayRepository.UpdateAsync(orderDelay, cancellationToken);
+
+                var current = SessionContextCreator.CreateSessionContext(dto.Source);
+                await _workflowApplication.HandleToEndAsync(current, orderDelay.WorkflowId, dto.Opinion, dto.Files,
+                    dto.IsPass ? EReviewResult.Approval : EReviewResult.Failed, cancellationToken);
             }
         }
 
@@ -519,21 +526,21 @@ namespace Hotline.Application.Subscribers
                     break;
             }
 
-            var now = DateTime.Now;
-            var handleDuration = order.StartTime.HasValue
-                ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
-                    now, order.ProcessType is EProcessType.Zhiban)
-                : 0;
-            var fileDuration = order.CenterToOrgTime.HasValue
-                ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
-                    now, order.ProcessType is EProcessType.Zhiban)
-                : 0;
-            var allDuration = order.StartTime.HasValue
-                ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
-                    order.ProcessType is EProcessType.Zhiban)
-                : 0;
-            order.File(now, handleDuration, fileDuration, allDuration);
-            await _orderRepository.UpdateAsync(order, cancellationToken);
+            //var now = DateTime.Now;
+            //var handleDuration = order.StartTime.HasValue
+            //    ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value,
+            //        now, order.ProcessType is EProcessType.Zhiban)
+            //    : 0;
+            //var fileDuration = order.CenterToOrgTime.HasValue
+            //    ? _timeLimitDomainService.CalcWorkTime(order.CenterToOrgTime.Value,
+            //        now, order.ProcessType is EProcessType.Zhiban)
+            //    : 0;
+            //var allDuration = order.StartTime.HasValue
+            //    ? _timeLimitDomainService.CalcWorkTime(order.StartTime.Value, now,
+            //        order.ProcessType is EProcessType.Zhiban)
+            //    : 0;
+            //order.File(now, handleDuration, fileDuration, allDuration);
+            //await _orderRepository.UpdateAsync(order, cancellationToken);
         }
 
         /// <summary>
@@ -593,6 +600,15 @@ namespace Hotline.Application.Subscribers
             await _orderDomainService.AddOrderComplementAsync(dto, cancellationToken);
         }
 
+        /// <summary>
+        /// 接收省上上传附件
+        /// </summary>
+        /// <param name="dto"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        /// <exception cref="UserFriendlyException"></exception>
+        /// <exception cref="ArgumentOutOfRangeException"></exception>
+        [CapSubscribe(EventNames.SharingFileInfo)]
         public async Task RecFilesAsync(ReceiveFilesFromDsDto dto, CancellationToken cancellationToken)
         {
             if (dto.Files == null || !dto.Files.Any())
@@ -668,7 +684,7 @@ namespace Hotline.Application.Subscribers
                     await _orderComplementRepository.UpdateAsync(complement, cancellationToken);
                     break;
                 case EDsBisType.OrderHandleResult:
-                    var order1 = await _orderRepository.GetAsync(d=>d.ProvinceNo == dto.ProvinceNo, cancellationToken);
+                    var order1 = await _orderRepository.GetAsync(d => d.ProvinceNo == dto.ProvinceNo, cancellationToken);
                     if (order1 is null)
                         throw new UserFriendlyException($"无效工单编号, ProvinceNo: {dto.ProvinceNo}");
                     if (string.IsNullOrEmpty(order1.WorkflowId))

+ 1 - 2
src/Hotline.Application/Tels/TelApplication.cs

@@ -52,8 +52,7 @@ public class TelApplication : ITelApplication, IScopeDependency
         await _workRepository.UpdateAsync(work, cancellationToken);
         _cacheWork.Remove(work.GetKey(KeyMode.UserId));
         _cacheWork.Remove(work.GetKey(KeyMode.TelNo));
-
-
+        
         var list = await _telActionRecordRepository.Queryable().Where(x => x.TelNo == work.TelNo && !x.EndTime.HasValue).ToListAsync();
         foreach (var item in list)
         {

+ 22 - 2
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -442,9 +442,23 @@ namespace Hotline.Share.Dtos.Order
         public bool IsResolved { get; set; }
         public string IsResolvedText => IsResolved ? "已解决" : "未解决";
 
-    }
+		#region 副本工单
+
+		/// <summary>
+		/// 修改人	
+		/// </summary>
+		public string AuditUserName { get; set; }
+		public string AuditUserId { get; set; }
+
+		/// <summary>
+		///  修改时间
+		/// </summary>
+		public DateTime AuditTime { get; set; }
+		#endregion
 
-    public class UpdateOrderDto : AddOrderDto
+	}
+
+	public class UpdateOrderDto : AddOrderDto
     {
         public string Id { get; set; }
     }
@@ -743,4 +757,10 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public List<FileDto> Files { get; set; } = new List<FileDto>();
     }
+
+
+    public record OrderCopyListDto : PagedKeywordRequest
+    {
+	    public string OrderId { get; set; }
+	}
 }

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

@@ -190,6 +190,8 @@ namespace Hotline.Share.Dtos.TrCallCenter
 
         public bool? IsCallHold { get; set; }
 
+        public bool? IsCallEndArrange { get; set; }
+
         public int Second => CalcSecond();
 
         public ETelModel? TelModel { get; set; }

+ 3 - 0
src/Hotline.Share/Enums/CallCenter/EActionType.cs

@@ -13,5 +13,8 @@ namespace Hotline.Share.Enums.CallCenter
 
         [Description("电话保持")]
         CallHold = 2,
+
+        [Description("签入签出")]
+        SignIn = 3,
     }
 }

+ 1 - 1
src/Hotline.Share/Hotline.Share.csproj

@@ -7,7 +7,7 @@
     <GenerateDocumentationFile>True</GenerateDocumentationFile>
     <NoWarn>$(NoWarn);1591;8618;</NoWarn>
     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-    <Version>1.0.73</Version>
+    <Version>1.0.74</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 5 - 0
src/Hotline.Share/Mq/EventNames.Share.cs

@@ -94,5 +94,10 @@
         /// 市州互转 接收原始数据
         /// </summary>
         public const string SharingOrderReceiveTranspondCity = "sharing.order.receive.transpond.city";
+
+        /// <summary>
+        /// 接受省上上传附件
+        /// </summary>
+        public const string SharingFileInfo = "sharing.file.info";
     }
 }

+ 32 - 0
src/Hotline/Orders/OrderCopy.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Orders
+{
+	/// <summary>
+	/// 副本工单
+	/// </summary>
+	[Description("副本工单")]
+	public partial class OrderCopy : Order
+	{
+		/// <summary>
+		/// 工单ID
+		/// </summary>
+		public string OrderId { get; set; }
+
+		/// <summary>
+		/// 修改人	
+		/// </summary>
+		public string AuditUserName { get; set; }
+		public string AuditUserId { get; set; }
+
+		/// <summary>
+		///  修改时间
+		/// </summary>
+		public DateTime AuditTime { get; set; }
+	}
+}

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

@@ -2134,6 +2134,17 @@ namespace Hotline.Permissions
         /// </summary>
         [Display(GroupName ="数据统计",Name = "部门满意度统计",Description = "部门满意度统计")]
         VisitAndOrgSatisfactionStatistics = 110604,
+
+        /// <summary>
+        /// 二次办理统计
+        /// </summary>
+        [Display(GroupName = "数据统计", Name = "二次办理统计", Description = "二次办理统计")]
+        SecondHandleStatistics = 110605,
+        /// <summary>
+        /// 二次办理满意度
+        /// </summary>
+        [Display(GroupName = "数据统计", Name = "二次办理满意度", Description = "二次办理满意度")]
+        SecondHandleSatisfied = 110606,
         #endregion
 
 

+ 11 - 5
src/Hotline/Push/MessageCodeDomainService.cs

@@ -4,12 +4,14 @@ using Hotline.Identity.Accounts;
 using Hotline.Push.Notifies;
 using Hotline.Share.Dtos.Push;
 using Hotline.Share.Enums.Push;
+using Hotline.Users;
 using MapsterMapper;
 using MediatR;
 using XF.Domain.Cache;
 using XF.Domain.Constants;
 using XF.Domain.Dependency;
 using XF.Domain.Exceptions;
+using XF.Domain.Repository;
 
 namespace Hotline.Push
 {
@@ -23,6 +25,7 @@ namespace Hotline.Push
         private readonly IAccountRepository _accountRepository;
         private readonly ITypedCache<LoginMessageCodeDto> _loginMessageCodeTypedCache;
         private readonly ISystemSettingCacheManager _systemSettingCacheManager;
+        private readonly IRepository<User> _userRepository;
 
         /// <summary>
         /// 
@@ -36,7 +39,8 @@ namespace Hotline.Push
             IMediator mediator,
             ICapPublisher capPublisher, IAccountRepository accountRepository,
             ITypedCache<LoginMessageCodeDto> loginMessageCodeTypedCache,
-            ISystemSettingCacheManager systemSettingCacheManager)
+            ISystemSettingCacheManager systemSettingCacheManager,
+            IRepository<User> userRepository)
         {
             _mapper = mapper;
             _mediator = mediator;
@@ -44,6 +48,7 @@ namespace Hotline.Push
             _accountRepository = accountRepository;
             _loginMessageCodeTypedCache = loginMessageCodeTypedCache;
             _systemSettingCacheManager = systemSettingCacheManager;
+            _userRepository = userRepository;
         }
         #endregion
 
@@ -59,7 +64,7 @@ namespace Hotline.Push
                 return false;
 
             var settingWhite = _systemSettingCacheManager.GetSetting(SettingConstants.LoginCodeWhiteList);
-       
+
             if (settingWhite == null || !settingWhite.SettingValue.Exists(p => p == UserName))
                 return true;
 
@@ -85,10 +90,11 @@ namespace Hotline.Push
             if (account == null)
                 return "用户名错误!";
 
-            if (string.IsNullOrEmpty(account.PhoneNo))
+            var userInfo = await _userRepository.GetAsync(p => p.Id == account.Id);
+            if (userInfo == null || string.IsNullOrEmpty(userInfo.PhoneNo))
                 return "用户未配置手机号码!";
 
-            string strKeyToken = KeyToken + account.PhoneNo;
+            string strKeyToken = KeyToken + userInfo.PhoneNo;
 
             var token = await _loginMessageCodeTypedCache.GetAsync(strKeyToken, cancellation);
             if (token != null)
@@ -117,7 +123,7 @@ namespace Hotline.Push
                 Name = account.Name,
                 TemplateCode = "1006",
                 Params = new List<string>() { token.Code },
-                TelNumber = account.PhoneNo,
+                TelNumber = userInfo.PhoneNo,
 
             };
             await _mediator.Publish(new PushMessageNotify(messageDto), cancellation);