Kaynağa Gözat

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

田爽 1 yıl önce
ebeveyn
işleme
4ff34eaa8d

+ 67 - 7
src/Hotline.Api/Controllers/OrderController.cs

@@ -1860,7 +1860,7 @@ public class OrderController : BaseController
     [HttpGet("urge")]
     public async Task<PagedDto<UrgeOrderDto>> UrgeList([FromQuery] UrgeListDto dto)
     {
-        var (total, items) = await _orderUrgeRepository.Queryable()
+        var (total, items) = await _orderUrgeRepository.Queryable(permissionVerify:true)
             .Includes(x => x.Order)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                 d => d.Order.Title.Contains(dto.Keyword!) || d.Order.No.Contains(dto.Keyword!))
@@ -2046,7 +2046,7 @@ public class OrderController : BaseController
             .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.SourceChannelCode)) //来源渠道
             .WhereIF(dto.HotspotIds.Any(), d => dto.HotspotIds.Contains(d.HotspotId)) //热点类型
             .WhereIF(!string.IsNullOrEmpty(dto.TransferPhone), d => d.TransferPhone.Contains(dto.TransferPhone!)) //转接号码
-                                                                                                                  //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
+            //.WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
             .WhereIF(dto.OrgCodes.Any(), d => dto.OrgCodes.Contains(d.ActualHandleOrgCode)) //接办部门
             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.AcceptorName.Contains(dto.NameOrNo!) || d.AcceptorStaffNo.Contains(dto.NameOrNo!)) //受理人/坐席
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart) //受理时间开始
@@ -2070,6 +2070,8 @@ public class OrderController : BaseController
             .WhereIF(dto.IdentityType != null, d => d.IdentityType == dto.IdentityType) //来电主体
             .WhereIF(!string.IsNullOrEmpty(dto.FromName), d => d.FromName.Contains(dto.FromName)) //来电人姓名
             .WhereIF(dto.AreaCodes.Any(), d => dto.AreaCodes.Contains(d.AreaCode)) //区域
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == true,x=>x.IsProvince == true)
+            .WhereIF(dto.IsProvinceOrder.HasValue && dto.IsProvinceOrder == false,x=>x.IsProvince == false)
             .OrderByDescending(d => d.CreationTime)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
@@ -2570,6 +2572,7 @@ public class OrderController : BaseController
             .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == true, d => d.CounterSignType.HasValue)
             .WhereIF(dto.IsCounterSign.HasValue && dto.IsCounterSign == false, d => !d.CounterSignType.HasValue)
             .Where(x => x.Source < ESource.MLSQ || x.Source > ESource.WZSC)
+            .Where(x=>x.Status!= EOrderStatus.BackToProvince)
             .OrderByDescending(d => d.StartTime)
             .ToPagedListAsync(dto, HttpContext.RequestAborted);
 
@@ -2769,6 +2772,60 @@ public class OrderController : BaseController
         return new PagedDto<OrderSendBackDto>(total, _mapper.Map<IReadOnlyList<OrderSendBackDto>>(items));
     }
 
+    /// <summary>
+    /// 批量省工单退回
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("send_back/batch")]
+    public async Task<object> BatchApplyUrge([FromBody]BatchOrderSendBackAddDto dto)
+    {
+        int count = dto.OrderIds.Count;
+        int successCount = 0;
+        int errorCount = 0;
+        var SendDatas = new List<PublishOrderSendBackModelDto>();
+        foreach (var item in dto.OrderIds)
+        {
+            //验证工单是否可以申请
+            var order = await _orderRepository.GetAsync(item, HttpContext.RequestAborted);
+            if (order is null)
+            {
+                errorCount++;
+                continue;
+            }
+            if (order.Status >= EOrderStatus.BackToUnAccept)
+            {
+                errorCount++;
+                continue;
+            }
+            if (order.Source <= ESource.HotlineImport)
+            {
+                errorCount++;
+                continue;
+            }
+            var model = new OrderSendBack() { 
+                 Content = dto.Content,
+                 OrderId = item,
+                 Destination = ESendBackDestination.Province
+            };
+            await _orderSendBackRepository.AddAsync(model, HttpContext.RequestAborted);
+            if (!string.IsNullOrEmpty(model.Id))
+            {
+                order.Status = EOrderStatus.BackToProvince;
+                await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+                successCount++;
+                var sendBackDto = _mapper.Map<OrderSendBackDto>(model);
+                var OrderDto = _mapper.Map<OrderDto>(order);
+                SendDatas.Add(new PublishOrderSendBackModelDto() { Order = OrderDto, SendBack = sendBackDto, ClientGuid = "" });
+            }
+        }
+        //推省上
+        await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowPrevious,
+                    new PublishOrderSendBackDto() { SendDatas = SendDatas });
+        return new { Count = count, ErrorCount = errorCount, SuccessCount = successCount };
+    }
+
+
     /// <summary>
     /// 退回申请
     /// </summary>
@@ -2783,9 +2840,9 @@ public class OrderController : BaseController
         var order = await _orderRepository.GetAsync(dto.OrderId, HttpContext.RequestAborted);
         if (order is null)
             throw UserFriendlyException.SameMessage("无效工单");
-        if ((int)order.Status > 1)
+        if (order.Status >= EOrderStatus.BackToUnAccept)
             throw UserFriendlyException.SameMessage("工单状态无效,请确认当前工单状态");
-        if ((int)order.Source <= 1)
+        if (order.Source <= ESource.HotlineImport)
             throw UserFriendlyException.SameMessage("工单来源无效,请确认当前工单来源");
         var model = _mapper.Map<OrderSendBack>(dto);
         model.InitId();
@@ -2795,9 +2852,12 @@ public class OrderController : BaseController
 
         if (!string.IsNullOrEmpty(model.Id))
         {
-            order = await _orderRepository.GetAsync(dto.OrderId, HttpContext.RequestAborted);
             order.Status = EOrderStatus.BackToProvince;
             await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
+            var sendBackDto = _mapper.Map<OrderSendBackDto>(model);
+            var OrderDto = _mapper.Map<OrderDto>(order);
+            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowPrevious,
+                    new PublishOrderSendBackDto() { SendDatas = new List<PublishOrderSendBackModelDto>() { new PublishOrderSendBackModelDto() { Order = OrderDto, SendBack = sendBackDto, ClientGuid = "" } } });
         }
     }
 
@@ -2828,8 +2888,8 @@ public class OrderController : BaseController
             var order = await _orderRepository.GetAsync(sendBack.OrderId);
             var sendBackDto = _mapper.Map<OrderSendBackDto>(sendBack);
             var OrderDto = _mapper.Map<OrderDto>(order);
-            await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowPrevious,
-                    new PublishOrderSendBackDto() { Order = OrderDto, SendBack = sendBackDto, ClientGuid = "" });
+            //await _capPublisher.PublishAsync(Hotline.Share.Mq.EventNames.HotlineOrderFlowPrevious,
+              //      new PublishOrderSendBackDto() { Order = OrderDto, SendBack = sendBackDto, ClientGuid = "" });
             //try
             //{
             //    await _provinceService.GetCaseBackApply(

+ 15 - 3
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -48,6 +48,7 @@ public class WorkflowController : BaseController
     private readonly IRepository<WorkflowModule> _wfModuleRepository;
     private readonly IRepository<WorkflowTrace> _workflowTraceRepository;
     private readonly IRepository<WorkflowCountersign> _workflowCountersignRepository;
+    private readonly IRepository<WorkflowCountersignMember> _workflowCountersignMemberRepository;
     private readonly ISessionContext _sessionContext;
     private readonly IMapper _mapper;
     private readonly ISystemDicDataCacheManager _systemDicDataCacheManager;
@@ -70,7 +71,8 @@ public class WorkflowController : BaseController
         ISessionContext sessionContext,
         IMapper mapper,
         ISystemDicDataCacheManager systemDicDataCacheManager,
-        IFileRepository fileRepository
+        IFileRepository fileRepository,
+        IRepository<WorkflowCountersignMember> workflowCountersignMemberRepository
     )
     {
         _definitionDomainService = definitionDomainService;
@@ -90,6 +92,7 @@ public class WorkflowController : BaseController
         _workflowCountersignRepository = workflowCountersignRepository;
         _systemDicDataCacheManager = systemDicDataCacheManager;
         _fileRepository = fileRepository;
+        _workflowCountersignMemberRepository = workflowCountersignMemberRepository;
     }
 
     #region definition
@@ -552,14 +555,16 @@ public class WorkflowController : BaseController
     {
         RefAsync<int> total = 0;
         var query = _workflowCountersignRepository.Queryable()
+            .Includes(x=>x.Members)
             .LeftJoin<Workflow>((c, w) => c.WorkflowId == w.Id)
             .InnerJoin<Order>((c, w, o) => w.ExternalId == o.Id)
+            .WhereIF(!_sessionContext.OrgIsCenter,x=>x.Members.Any(x=>x.Key== _sessionContext.OrgId))
             .WhereIF(dto.IsProvince.HasValue, (c, w, o) => o.IsProvince == dto.IsProvince.Value)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword),
                 (c, w, o) => o.No.Contains(dto.Keyword) || o.Title.Contains(dto.Keyword));
 
-        if (dto.IsOnlyStarter)
-            query = query.Where((c, w, o) => c.StarterId == _sessionContext.RequiredUserId);
+        //if (dto.IsOnlyStarter)
+        //    query = query.Where((c, w, o) => c.StarterId == _sessionContext.RequiredUserId);
 
         var items = await query
             .OrderByDescending((c, w, o) => o.ExpiredTime)
@@ -573,6 +578,13 @@ public class WorkflowController : BaseController
             return dto;
         }).ToList();
 
+
+
+
+
+
+
+
         return new PagedDto<WorkflowCountersignDto>(total, dtos);
     }
 

+ 2 - 2
src/Hotline.Application/Orders/OrderApplication.cs

@@ -148,7 +148,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
         DateTime stTime = DateTime.Now.AddDays(int.Parse(value));
         stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
         DateTime stTime2 = _timeLimitDomainService.WorkDay(DateTime.Now);
-        var (total, items) = await _orderRepository.Queryable()
+        var (total, items) = await _orderRepository.Queryable(viewFilter:true)
             .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
             .Where(x => x.ExpiredTime != null &&
@@ -194,7 +194,7 @@ public class OrderApplication : IOrderApplication, IScopeDependency
     public async Task<PagedDto<OrderDto>> GetToExpireAsync(AboutToExpireListDto dto, CancellationToken cancellationToken)
     {
         DateTime stTime = _timeLimitDomainService.WorkDay(DateTime.Now);
-        var (total, items) = await _orderRepository.Queryable()
+        var (total, items) = await _orderRepository.Queryable(viewFilter:true)
             .WhereIF(dto.IsProvince.HasValue, x => x.IsProvince == dto.IsProvince)
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.Title.Contains(dto.Keyword!) || x.No.Contains(dto.Keyword!))
             //.WhereIF(!string.IsNullOrEmpty(dto.No), x => x.No == dto.No)

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

@@ -101,6 +101,12 @@ namespace Hotline.Application.Subscribers
                     var order = await _orderRepository.GetAsync(sendBack.OrderId, cancellationToken);
                     await _workflowApplication.JumpToEndAsync(order.WorkflowId, "省工单同意退回", null, cancellationToken: cancellationToken);
                 }
+                else
+                {
+                    var order = await _orderRepository.GetAsync(sendBack.OrderId, cancellationToken);
+                    order.Status = EOrderStatus.WaitForAccept;
+                    await _orderRepository.UpdateAsync(order, cancellationToken);
+                }
             }
         }
 

+ 34 - 15
src/Hotline.Share/Dtos/Order/OrderSendBackDto.cs

@@ -29,7 +29,19 @@ namespace Hotline.Share.Dtos.Order
 		public List<FileDto> Files { get; set; } = new();
 
 	}
-	public class AuditOrderSendBackDto 
+
+	public class BatchOrderSendBackAddDto
+	{
+		public List<string> OrderIds { get; set; }
+
+        /// <summary>
+        /// 申请原因
+        /// </summary>
+        public string? Content { get; set; }
+    }
+
+
+    public class AuditOrderSendBackDto 
 	{
 		public string Id { get; set; }
 
@@ -163,21 +175,28 @@ namespace Hotline.Share.Dtos.Order
 		/// </summary>
 		public int? State { get; set; }
 	}
+
+	
 	public class PublishOrderSendBackDto
 	{
-		// <summary>
-		/// 工单对象
-		/// </summary>
-		public OrderDto Order { get; set; }
-
-		/// <summary>
-		/// 退回
-		/// </summary>
-		public OrderSendBackDto SendBack { get; set; }
-
-		/// <summary>
-		/// 附件
-		/// </summary>
-		public string ClientGuid { get; set; }
+		public List<PublishOrderSendBackModelDto> SendDatas { get; set; }
 	}
+
+	public class PublishOrderSendBackModelDto
+	{
+        // <summary>
+        /// 工单对象
+        /// </summary>
+        public OrderDto Order { get; set; }
+
+        /// <summary>
+        /// 退回
+        /// </summary>
+        public OrderSendBackDto SendBack { get; set; }
+
+        /// <summary>
+        /// 附件
+        /// </summary>
+        public string ClientGuid { get; set; }
+    }
 }

+ 5 - 0
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -138,6 +138,11 @@ namespace Hotline.Share.Dtos.Order
         /// 区域(×)(多选)
         /// </summary>
         public List<string> AreaCodes { get; set; } = new();
+
+        /// <summary>
+        /// 是否省工单(空为全部  true为省工单 false为市工单)
+        /// </summary>
+        public bool? IsProvinceOrder { get; set; }
     }
 
 

+ 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.59</Version>
+    <Version>1.0.61</Version>
   </PropertyGroup>
 
   <ItemGroup>

+ 2 - 2
src/Hotline.YbEnterprise.Sdk/EnterpriseService.cs

@@ -72,9 +72,9 @@ namespace Hotline.YbEnterprise.Sdk
 
 			if (res is null)
 				throw new UserFriendlyException("获取token请求失败");
-			if (res.success)
+			if (!res.success)
 				throw new UserFriendlyException("获取token请求失败");
-			return res.data;
+            return res.data;
 		}
 		public async Task<TResponse> ExecuteAsync<TRequest, TResponse>(string path, Method httpMethod, TRequest request, RestRequest restRequest = null,
 			CancellationToken cancellationToken = default)

+ 11 - 15
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -468,8 +468,9 @@ namespace Hotline.FlowEngine.Workflows
 
             //赋值当前节点的下级办理节点
             if (dto.IsStartCountersign
-                || (currentStep.IsInCountersign() &&
-                    !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId)))
+                //|| (currentStep.IsInCountersign() &&
+                //    !currentStep.IsTopCountersignEndStep(workflow.TopCountersignStepId))
+                )
             {
                 currentStep.CreateCountersignSteps(nextSteps);
                 await _workflowStepRepository.UpdateAsync(currentStep, cancellationToken);
@@ -481,22 +482,13 @@ namespace Hotline.FlowEngine.Workflows
 
             //todo 计算办理工作时长
 
-            ////更新当前办理节点信息
-            //if (!workflow.IsInCountersign)
-            //    workflow.UpdateWorkflowCurrentStepInfo(nextSteps.First(), dto.NextHandlers.First(), dto.HandlerType);
-
             ////更新当前办理节点信息
             //workflow.UpdateWorkflowCurrentStepInfo(dto.IsStartCountersign,
             //    _sessionContext.RequiredUserId, _sessionContext.UserName,
             //    _sessionContext.RequiredOrgId, _sessionContext.OrgName,
             //    _sessionContext.OrgAreaCode, _sessionContext.OrgAreaName,
             //    currentStep, nextSteps?.FirstOrDefault());
-
-            ////指派实际办理节点
-            //if (!workflow.IsInCountersign &&
-            //    nextStepDefine.StepType != EStepType.Summary &&
-            //    nextStepDefine.StepType != EStepType.End)
-            //    workflow.UpdateActualStepWhenAssign(nextSteps.First(), dto.NextHandlers.First(), dto.HandlerType);
+            
 
             //指派实际办理节点
             if (workflow.FlowType is EFlowType.Handle &&
@@ -1300,7 +1292,7 @@ namespace Hotline.FlowEngine.Workflows
             EFlowAssignType? flowAssignType, ECounterSignType? counterSignType, CancellationToken cancellationToken)
         {
             var countersign = await CreateCountersignAsync(
-                workflow.Id, startStep, dto.NextHandlers, flowAssignType,
+                workflow, startStep, dto.NextHandlers, flowAssignType,
                 counterSignType, workflow.ExpiredTime,
                 startStep.CountersignId, cancellationToken);
             startStep.StartCountersign(countersign.Id);
@@ -1391,7 +1383,7 @@ namespace Hotline.FlowEngine.Workflows
         }
 
         private async Task<WorkflowCountersign> CreateCountersignAsync(
-            string workflowId, WorkflowStep startStep, List<Kv> handlers, EFlowAssignType? flowAssignType,
+            Workflow workflow, WorkflowStep startStep, List<Kv> handlers, EFlowAssignType? flowAssignType,
             ECounterSignType? counterSignType, DateTime expiredTime, string? parentId = null,
             CancellationToken cancellationToken = default)
         {
@@ -1404,7 +1396,7 @@ namespace Hotline.FlowEngine.Workflows
 
             var countersign = new WorkflowCountersign
             {
-                WorkflowId = workflowId,
+                WorkflowId = workflow.Id,
                 StartStepId = startStep.Id,
                 StartStepCode = startStep.Code,
                 StartStepBusiType = startStep.BusinessType,
@@ -1421,6 +1413,7 @@ namespace Hotline.FlowEngine.Workflows
                 FlowAssignType = flowAssignType,
                 CounterSignType = counterSignType,
                 ExpiredTime = expiredTime,
+                //ExternalId = workflow.ExternalId,
             };
             //await _workflowCountersignRepository.AddAsync(countersign, cancellationToken);
 
@@ -1851,6 +1844,9 @@ namespace Hotline.FlowEngine.Workflows
                 //1. create terminal trace 2. 撤回至startStep
                 var newStep = await DuplicateStepWithTraceAsync(workflow, startCountersignStep, EWorkflowTraceStatus.Normal, cancellationToken);
 
+                if (startCountersignStep.IsCountersignEndStep)
+                    workflow.TopCountersignStepId = startCountersignStep.CountersignStartStepId;
+
                 if (workflow.CheckIfCountersignOver())
                     workflow.EndCountersign();