Browse Source

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

tangjiang 11 months ago
parent
commit
2de9111d96

+ 57 - 6
src/Hotline.Api/Controllers/OrderController.cs

@@ -4722,14 +4722,27 @@ public class OrderController : BaseController
         await _orderSecondaryHandlingApplication.AddAsync(dto, HttpContext.RequestAborted);
         await _orderSecondaryHandlingApplication.AddAsync(dto, HttpContext.RequestAborted);
 	}
 	}
 
 
+
+	/// <summary>
+	/// 二次办理退回
+	/// </summary>
+	/// <param name="dtos"></param>
+	/// <returns></returns>
+	[HttpPost("secondary_handling/send_back")]
+	[LogFilter("二次办理退回")]
+	public async Task OrderSecondaryHandlingSendBackAsync([FromBody] SendBackOrderSecondaryHandlingDto dto)
+	{
+		await _orderSecondaryHandlingApplication.SendBackAsync(dto, HttpContext.RequestAborted);
+	}
+
 	/// <summary>
 	/// <summary>
 	/// 二次办理审批
 	/// 二次办理审批
 	/// </summary>
 	/// </summary>
 	/// <param name="dtos"></param>
 	/// <param name="dtos"></param>
 	/// <returns></returns>
 	/// <returns></returns>
 	[HttpPut("secondary_handling/audit")]
 	[HttpPut("secondary_handling/audit")]
-	[LogFilter("新增二次办理")]
-	public async Task OrderSecondaryHandlingAudit([FromBody] AuditOrderSecondaryHandlingDto dto)
+	[LogFilter("二次办理审批")]
+	public async Task OrderSecondaryHandlingAudit([FromBody]  AuditOrderSecondaryHandlingDto dto)
 	{
 	{
         var model = await _orderSecondaryHandlingApplication.Entity(dto.Id, HttpContext.RequestAborted);
         var model = await _orderSecondaryHandlingApplication.Entity(dto.Id, HttpContext.RequestAborted);
         if (model == null || model.State != ESecondaryHandlingState.Apply)
         if (model == null || model.State != ESecondaryHandlingState.Apply)
@@ -4737,10 +4750,29 @@ public class OrderController : BaseController
         await _orderSecondaryHandlingApplication.AuditAsync(dto, model, HttpContext.RequestAborted);
         await _orderSecondaryHandlingApplication.AuditAsync(dto, model, HttpContext.RequestAborted);
 	}
 	}
 
 
-    /// <summary>
-    /// 二次办理申请列表
-    /// </summary>
-    /// <returns></returns>
+	/// <summary>
+	/// 二次办理批量审批
+	/// </summary>
+	/// <param name="dtos"></param>
+	/// <returns></returns>
+	[HttpPut("secondary_handling/batch_audit")]
+	[LogFilter("二次办理批量审批")]
+	public async Task OrderSecondaryHandlingBatchAudit([FromBody] AuditOrderSecondaryHandlingDto dto)
+	{
+		foreach (var item in dto.Ids)
+		{
+			var model = await _orderSecondaryHandlingApplication.Entity(item, HttpContext.RequestAborted);
+			if (model == null || model.State != ESecondaryHandlingState.Apply)
+				throw UserFriendlyException.SameMessage("无效特提审批信息!");
+			await _orderSecondaryHandlingApplication.AuditAsync(dto, model, HttpContext.RequestAborted);
+		}
+	}
+
+
+	/// <summary>
+	/// 二次办理申请列表
+	/// </summary>
+	/// <returns></returns>
 	[HttpGet("secondary_handling/apply")]
 	[HttpGet("secondary_handling/apply")]
 	public async Task<PagedDto<OrderVisitDetailDto>> OrderSecondaryHandlingApplyQuery([FromQuery] MayScreenListDto dto)
 	public async Task<PagedDto<OrderVisitDetailDto>> OrderSecondaryHandlingApplyQuery([FromQuery] MayScreenListDto dto)
 	{
 	{
@@ -4839,5 +4871,24 @@ public class OrderController : BaseController
 	{
 	{
         return await _orderSecondaryHandlingApplication.Entity(id, HttpContext.RequestAborted);
         return await _orderSecondaryHandlingApplication.Entity(id, HttpContext.RequestAborted);
 	}
 	}
+
+	/// <summary>
+	/// 列表页面基础数据
+	/// </summary>
+	/// <returns></returns>
+	[HttpGet("secondary_handling/base")]
+	public async Task<object> SecondaryHandlingBaseData()
+	{
+		var rsp = new
+		{
+			Status = EnumExts.GetDescriptions<ESecondaryHandlingState>(),
+			CounterSignType = EnumExts.GetDescriptions<ECounterSignType>(),
+			AcceptType = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.AcceptType),
+			SourceChannel = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.SourceChannel),
+			VisitSatisfaction = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.VisitSatisfaction),
+			DissatisfiedReason = _sysDicDataCacheManager.GetSysDicDataCache(SysDicTypeConsts.DissatisfiedReason),
+		};
+		return rsp;
+	}
 	#endregion
 	#endregion
 }
 }

+ 1 - 0
src/Hotline.Application/Mappers/IdentityMapperConfigs.cs

@@ -21,6 +21,7 @@ public class IdentityMapperConfigs : IRegister
         config.NewConfig<User, UserDto>()
         config.NewConfig<User, UserDto>()
             .IgnoreIf((s, d) => s.Account == null, d => d.UserName)
             .IgnoreIf((s, d) => s.Account == null, d => d.UserName)
             .IgnoreIf((s, d) => s.Roles == null || !s.Roles.Any(), d => d.RoleNames)
             .IgnoreIf((s, d) => s.Roles == null || !s.Roles.Any(), d => d.RoleNames)
+            .IgnoreIf((s, d) => s.Organization == null, d => d.Organization)
             .Map(d => d.UserName, x => x.Account.UserName)
             .Map(d => d.UserName, x => x.Account.UserName)
             .Map(d => d.State, x => x.IsDeleted ? "已删除" : "正常")
             .Map(d => d.State, x => x.IsDeleted ? "已删除" : "正常")
             .Map(d => d.RoleNames, x => string.Join(',', x.Roles.Select(s => s.DisplayName)))
             .Map(d => d.RoleNames, x => string.Join(',', x.Roles.Select(s => s.DisplayName)))

+ 2 - 0
src/Hotline.Application/Orders/IOrderSecondaryHandlingApplication.cs

@@ -12,6 +12,8 @@ namespace Hotline.Application.Orders
 	public interface IOrderSecondaryHandlingApplication
 	public interface IOrderSecondaryHandlingApplication
 	{
 	{
 		Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken);
 		Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken);
+
+		Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken);
 		Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken);
 		Task AuditAsync(AuditOrderSecondaryHandlingDto dto, OrderSecondaryHandling model, CancellationToken cancellationToken);
 		ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken);
 		ISugarQueryable<OrderVisitDetail> ApplyQuery(MayScreenListDto dto, CancellationToken cancellationToken);
 		Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken);
 		Task<OrderSecondaryHandling> Entity(string id, CancellationToken cancellationToken);

+ 41 - 4
src/Hotline.Application/Orders/OrderSecondaryHandlingApplication.cs

@@ -75,9 +75,18 @@ namespace Hotline.Application.Orders
 		public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
 		public async Task AddAsync(AddOrderSecondaryHandlingDto dto, CancellationToken cancellationToken)
 		{
 		{
 			var model = _mapper.Map<OrderSecondaryHandling>(dto);
 			var model = _mapper.Map<OrderSecondaryHandling>(dto);
+			if (string.IsNullOrEmpty(dto.Id))
+			{
+				model.InitId();
+			}
+			else {
+				model = await _orderSecondaryHandlingRepository.GetAsync(dto.Id , cancellationToken);
+				model.Content = dto.Content;
+			}
 			model.State = ESecondaryHandlingState.Apply;
 			model.State = ESecondaryHandlingState.Apply;
 			model.ApplyOrgId = _sessionContext.OrgId;
 			model.ApplyOrgId = _sessionContext.OrgId;
 			model.ApplyOrgName = _sessionContext.OrgName;
 			model.ApplyOrgName = _sessionContext.OrgName;
+		
 			if (dto.Files.Any())
 			if (dto.Files.Any())
 				model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
 				model.FileJson = await _fileRepository.AddFileAsync(dto.Files, model.Id, "", cancellationToken);
 
 
@@ -88,9 +97,34 @@ namespace Hotline.Application.Orders
 				visit.VisitState = EVisitState.None;
 				visit.VisitState = EVisitState.None;
 				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
 				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
 			}
 			}
-			await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken);
+
+			if (!string.IsNullOrEmpty(dto.Id))
+			{
+				await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+			}
+			else {
+				await _orderSecondaryHandlingRepository.AddAsync(model, cancellationToken);
+			}
 		}
 		}
 
 
+		public async Task SendBackAsync(SendBackOrderSecondaryHandlingDto dto, CancellationToken cancellationToken) 
+		{
+			var model =await _orderSecondaryHandlingRepository.GetAsync(dto.Id, cancellationToken);
+			model.State = ESecondaryHandlingState.NotApply;
+			model.SendBackContent = dto.SendBackContent;
+			model.AuditUser = _sessionContext.UserName;
+			model.AuditTime = DateTime.Now;
+			model.SendBackNum++;
+			await _orderSecondaryHandlingRepository.UpdateAsync(model, cancellationToken);
+			var visit = await _orderVisitRepository.GetAsync(x => x.Id == model.VisitId , cancellationToken);
+			if (visit != null)
+			{
+				visit.VisitState = model.VisitState;
+				await _orderVisitRepository.UpdateAsync(visit, cancellationToken);
+			}
+		}
+
+
 		/// <summary>
 		/// <summary>
 		/// 二次办理审批
 		/// 二次办理审批
 		/// </summary>
 		/// </summary>
@@ -170,8 +204,9 @@ namespace Hotline.Application.Orders
 				.Includes(x => x.OrderVisit)
 				.Includes(x => x.OrderVisit)
 				.Includes(x => x.OrderVisit, y => y.Order)
 				.Includes(x => x.OrderVisit, y => y.Order)
 				.Includes(x => x.OrderVisit, y => y.Employee)
 				.Includes(x => x.OrderVisit, y => y.Employee)
-				.LeftJoin<OrderScreen>((x, s) => x.Id == s.VisitDetailId && (int)s.Status < 2 && s.IsDeleted == false)
-				.Where((x, s) => s.Id == null)
+				.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)
 				.WhereIF(dto.IsHomePage.HasValue && dto.IsHomePage == true, 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(!string.IsNullOrEmpty(dto.No), x => x.OrderVisit.Order!.No!.Contains(dto.No!))
 				.WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
 				.WhereIF(dto.IsProvince.HasValue, x => x.OrderVisit.Order!.IsProvince == dto.IsProvince)
@@ -189,7 +224,8 @@ namespace Hotline.Application.Orders
 				.WhereIF(!string.IsNullOrEmpty(dto.OrgProcessingResults), x => SqlFunc.JsonField(x.OrgProcessingResults, "Key") == dto.OrgProcessingResults)
 				.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)
 				.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.VisitState != EVisitState.None && x.OrderVisit.IsCanHandle)
+				.Where((x, s) => x.OrderVisit.Order.CounterSignType == null && x.OrderVisit.Order.ActualHandleOrgCode  == _sessionContext.OrgId) ;
 			if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
 			if (_sessionContext.OrgId != null && !_sessionContext.OrgIsCenter)
 			{
 			{
 				query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
 				query.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
@@ -228,6 +264,7 @@ namespace Hotline.Application.Orders
 				.Includes(x => x.Order)
 				.Includes(x => x.Order)
 				.Includes(x => x.VisitDetail)
 				.Includes(x => x.VisitDetail)
 				.Includes(x => x.Visit, d => d.Order)
 				.Includes(x => x.Visit, d => d.Order)
+				.Where(x=>x.State> ESecondaryHandlingState.NotApply)
 				.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
 				.WhereIF(!string.IsNullOrEmpty(dto.Keyword),
 					x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
 					x => x.Visit.Order.Title.Contains(dto.Keyword!) || x.Visit.Order.No.Contains(dto.Keyword!))
 				.WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)
 				.WhereIF(dto.Status is ESecondaryHandlingState.Apply, x => x.State == ESecondaryHandlingState.Apply)

+ 24 - 1
src/Hotline.Share/Dtos/Order/OrderSecondaryHandlingDto.cs

@@ -6,6 +6,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
+using XF.Utility.EnumExtensions;
 
 
 namespace Hotline.Share.Dtos.Order
 namespace Hotline.Share.Dtos.Order
 {
 {
@@ -21,6 +22,15 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		/// </summary>
 		public ESecondaryHandlingState? State { get; set; }
 		public ESecondaryHandlingState? State { get; set; }
 
 
+		public string StateText => State.GetDescription();
+
+		/// <summary>
+		/// 重提办理
+		/// </summary>
+		public int? SendBackNum { get; set; }
+
+		public string SendBack => SendBackNum is > 0 ? "是" : "否";
+
 		/// <summary>
 		/// <summary>
 		/// 申请理由
 		/// 申请理由
 		/// </summary>
 		/// </summary>
@@ -73,10 +83,12 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		/// </summary>
 		public List<FileDto> Files { get; set; } = new();
 		public List<FileDto> Files { get; set; } = new();
 
 
-		public List<FileJson>? FileJson { get; set; }
 	}
 	}
 
 
 	public class AddOrderSecondaryHandlingDto {
 	public class AddOrderSecondaryHandlingDto {
+
+		public string Id { get; set; }
+
 		/// <summary>
 		/// <summary>
 		/// 工单ID
 		/// 工单ID
 		/// </summary>
 		/// </summary>
@@ -119,6 +131,17 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		/// </summary>
 		public string? AuditContent { get; set; }
 		public string? AuditContent { get; set; }
 
 
+		public List<string> Ids { get; set; }
+	}
+
+	public class SendBackOrderSecondaryHandlingDto
+	{
+		public string Id { get; set; }
+
+		/// <summary>
+		/// 退回意见
+		/// </summary>
+		public string? SendBackContent { get; set; }
 	}
 	}
 
 
 	public class OrderSecondaryHandlingBaseDto
 	public class OrderSecondaryHandlingBaseDto

+ 2 - 0
src/Hotline.Share/Dtos/Order/OrderVisitDto.cs

@@ -372,6 +372,8 @@ namespace Hotline.Share.Dtos.Order
 
 
         public OrderVisitDto OrderVisit { get; set; }
         public OrderVisitDto OrderVisit { get; set; }
 
 
+        public OrderSecondaryHandlingDto SecondaryHandling { get; set; }
+
         public OrderDto Order => OrderVisit != null ? OrderVisit.Order : null;
         public OrderDto Order => OrderVisit != null ? OrderVisit.Order : null;
 
 
         /// <summary>
         /// <summary>

+ 11 - 4
src/Hotline.Share/Enums/Order/ESecondaryHandlingState.cs

@@ -9,28 +9,35 @@ namespace Hotline.Share.Enums.Order
 {
 {
 	public enum ESecondaryHandlingState
 	public enum ESecondaryHandlingState
 	{
 	{
+
+		/// <summary>
+		/// 待申请
+		/// </summary>
+		[Description("待申请")]
+		NotApply = 0,
+
 		/// <summary>
 		/// <summary>
 		/// 待办
 		/// 待办
 		/// </summary>
 		/// </summary>
 		[Description("待办")]
 		[Description("待办")]
-		Apply = 0,
+		Apply = 1,
 
 
 		/// <summary>
 		/// <summary>
 		/// 审批通过
 		/// 审批通过
 		/// </summary>
 		/// </summary>
 		[Description("审批通过")]
 		[Description("审批通过")]
-		End = 1,
+		End = 2,
 
 
 		/// <summary>
 		/// <summary>
 		/// 审批拒绝
 		/// 审批拒绝
 		/// </summary>
 		/// </summary>
 		[Description("审批拒绝")]
 		[Description("审批拒绝")]
-		Refuse = 2,
+		Refuse = 3,
 
 
 		/// <summary>
 		/// <summary>
 		/// 已办理
 		/// 已办理
 		/// </summary>
 		/// </summary>
 		[Description("已办理")]
 		[Description("已办理")]
-		Handled = 3,
+		Handled = 4,
 	}
 	}
 }
 }

+ 11 - 0
src/Hotline/Orders/OrderSecondaryHandling.cs

@@ -39,12 +39,23 @@ namespace Hotline.Orders
 		[SugarColumn(ColumnDescription = "状态")]
 		[SugarColumn(ColumnDescription = "状态")]
 		public ESecondaryHandlingState? State { get; set; }
 		public ESecondaryHandlingState? State { get; set; }
 
 
+		/// <summary>
+		/// 重提办理
+		/// </summary>
+		public int? SendBackNum { get; set; }
+
 		/// <summary>
 		/// <summary>
 		/// 申请理由
 		/// 申请理由
 		/// </summary>
 		/// </summary>
 		[SugarColumn(ColumnDescription = "申请理由", ColumnDataType = "varchar(2000)")]
 		[SugarColumn(ColumnDescription = "申请理由", ColumnDataType = "varchar(2000)")]
 		public string? Content { get; set; }
 		public string? Content { get; set; }
 
 
+		/// <summary>
+		/// 退回意见
+		/// </summary>
+		[SugarColumn(ColumnDescription = "退回意见", ColumnDataType = "varchar(2000)")]
+		public string? SendBackContent { get; set; }
+
 		/// <summary>
 		/// <summary>
 		/// 审批意见
 		/// 审批意见
 		/// </summary>
 		/// </summary>

+ 8 - 2
src/Hotline/Orders/OrderVisitDetail.cs

@@ -1,5 +1,6 @@
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.Hotspots;
 using Hotline.Share.Dtos;
 using Hotline.Share.Dtos;
+using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Order;
 using SqlSugar;
 using SqlSugar;
 using XF.Domain.Repository;
 using XF.Domain.Repository;
@@ -19,9 +20,14 @@ namespace Hotline.Orders
         public OrderVisit OrderVisit { get; set; }
         public OrderVisit OrderVisit { get; set; }
 
 
         /// <summary>
         /// <summary>
-        /// 语音评价(话务评价)
+        /// 通话记录
         /// </summary>
         /// </summary>
-        public EVoiceEvaluate? VoiceEvaluate { get; set; }
+        [Navigate(NavigateType.OneToOne, nameof(Id),nameof(OrderSecondaryHandling.VisitDetailId))]
+        public OrderSecondaryHandling SecondaryHandling { get; set; }
+		/// <summary>
+		/// 语音评价(话务评价)
+		/// </summary>
+		public EVoiceEvaluate? VoiceEvaluate { get; set; }
 
 
         /// <summary>
         /// <summary>
         /// 话务员评价(话务评价)
         /// 话务员评价(话务评价)