瀏覽代碼

center to org

xf 1 年之前
父節點
當前提交
ba53f14f3c

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

@@ -3,6 +3,7 @@ using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;
+using Hotline.Orders;
 using Hotline.SeedData;
 using Hotline.Settings;
 using Hotline.Share.Dtos.FlowEngine;
@@ -21,6 +22,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 {
     private readonly IDefinitionDomainService _definitionDomainService;
     private readonly IWorkflowDomainService _workflowDomainService;
+    private readonly IOrderDomainService _orderDomainService;
     private readonly IWorkflowRepository _workflowRepository;
     private readonly IWorkflowAssignRepository _workflowAssignRepository;
     private readonly IUserRepository _userRepository;
@@ -34,6 +36,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public WorkflowApplication(
         IDefinitionDomainService definitionDomainService,
         IWorkflowDomainService workflowDomainService,
+        IOrderDomainService orderDomainService,
         IWorkflowRepository workflowRepository,
         IWorkflowAssignRepository workflowAssignRepository,
         IUserRepository userRepository,
@@ -44,6 +47,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     {
         _definitionDomainService = definitionDomainService;
         _workflowDomainService = workflowDomainService;
+        _orderDomainService = orderDomainService;
         _workflowRepository = workflowRepository;
         _workflowAssignRepository = workflowAssignRepository;
         _userRepository = userRepository;
@@ -96,14 +100,16 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw new UserFriendlyException("未指定节点处理者");
 
         //下一节点为结束节点时,无办理人等参数,只有办理意见即可
-        var isOutFromCallCenter = nextStepBoxDefine.StepType is not EStepType.End
+        var isFromCenterToOrg = nextStepBoxDefine.StepType is not EStepType.End
                                 && await CheckIfFlowOutFromCallCenterAsync(nextStepBoxDefine, dto.NextMainHandler, cancellationToken);
+        if (isFromCenterToOrg)
+            await _orderDomainService.FlowFromCenterToOrgAsync(workflow.Id, cancellationToken);
 
         var isStartCountersign = nextStepBoxDefine.CouldPrevStartCountersign(dto.NextHandlers.Count);
 
         var flowAssignMode = await GetFlowAssignModeAsync(nextStepBoxDefine, isStartCountersign, dto.NextHandlers, cancellationToken);
 
-        await _workflowDomainService.NextAsync(workflow, dto, nextStepBoxDefine, isOutFromCallCenter, isStartCountersign, flowAssignMode, cancellationToken);
+        await _workflowDomainService.NextAsync(workflow, dto, nextStepBoxDefine, isFromCenterToOrg, isStartCountersign, flowAssignMode, cancellationToken);
 
         //更新接办部门(详情页面展示)
         await AddOrUpdateAssignAsync(workflow, dto, nextStepBoxDefine, cancellationToken);

+ 1 - 1
src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs

@@ -46,7 +46,7 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
             case WorkflowModuleConsts.OrderManage:
                 await _orderDomainService.ManageFlowNextAsync(
                     notification.FlowAssignMode, notification.IsCountersignStart, notification.IsCountersignEnd,
-                    workflow.ExternalId, workflow.CurrentStepTime, workflow.CurrentStepName, workflow.ExpiredTime,
+                    workflow.ExternalId, workflow.CurrentStepTime, workflow.CurrentStepName, workflow.ExpiredTime, workflow.ProcessType,
                     cancellationToken);
                 break;
             case WorkflowModuleConsts.KnowledgeAdd:

+ 31 - 0
src/Hotline.Share/Dtos/Hotspots/HotspotDto.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Data.SqlTypes;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Share.Dtos.Hotspots
+{
+    public class HotspotDto
+    {
+        public string HotSpotName { get; set; }
+        
+        public string ParentId { get; set; }
+        
+        public string PYCode { get; set; }
+        
+        public string FullPYCode { get; set; }
+        
+        public string ProvinceCode { get; set; }
+        
+        public int OrderBy { get; set; }
+        
+        public string TrunkNum { get; set; }
+        
+        /// <summary>
+        /// 生成的时候写入
+        /// </summary>
+        public string HotSpotFullName { get; set; }
+    }
+}

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

@@ -4,6 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Hotline.Share.Dtos.FlowEngine;
+using Hotline.Share.Dtos.Hotspots;
 using Hotline.Share.Enums.Order;
 using XF.Utility.EnumExtensions;
 
@@ -76,6 +77,16 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string? EmployeeStaffNo { get; set; }
 
+        /// <summary>
+        /// 处理方式(直办、交办)
+        /// </summary>
+        public EProcessType ProcessType { get; set; }
+
+        /// <summary>
+        /// 进展情况
+        /// </summary>
+        public EProgress Progress { get; set; }
+
         public string WorkflowId { get; set; }
         public WorkflowDto Workflow { get; set; }
 
@@ -132,6 +143,8 @@ namespace Hotline.Share.Dtos.Order
             }
         }
 
+        public HotspotDto Hotspot { get; set; }
+
     }
 
     public class UpdateOrderDto : AddOrderDto
@@ -254,7 +267,7 @@ namespace Hotline.Share.Dtos.Order
         /// 热点
         /// </summary>
         public string HotspotId { get; set; }
-        public string Hotspot { get; set; }
+        public string HotspotName { get; set; }
         public string HotspotSpliceName { get; set; }
 
         /// <summary>

+ 3 - 0
src/Hotline.Share/Enums/Order/EAcceptType.cs

@@ -43,6 +43,9 @@ public enum EAcceptType
     [Description("投诉")]
     Complain = 35,
 
+    /// <summary>
+    /// 其他
+    /// </summary>
     [Description("其他")]
     Other = 40,
 }

+ 32 - 0
src/Hotline.Share/Enums/Order/EProcessType.cs

@@ -0,0 +1,32 @@
+namespace Hotline.Share.Enums.Order;
+
+/// <summary>
+/// 工单处理方式(直办、交办)
+/// </summary>
+public enum EProcessType
+{
+    /// <summary>
+    /// 直接办结
+    /// </summary>
+    Zhiban = 10,
+
+    /// <summary>
+    /// 交办
+    /// </summary>
+    Jiaoban = 20,
+
+    /// <summary>
+    /// 派单员重派
+    /// </summary>
+    PdyChongpai = 30,
+
+    /// <summary>
+    /// 结果审核重派
+    /// </summary>
+    ShChongpai = 40,
+
+    /// <summary>
+    /// 回访不满意重派	
+    /// </summary>
+    HfChongpai = 50
+}

+ 22 - 0
src/Hotline.Share/Enums/Order/EProgress.cs

@@ -0,0 +1,22 @@
+namespace Hotline.Share.Enums.Order;
+
+/// <summary>
+/// 进展情况
+/// </summary>
+public enum EProgress
+{
+    /// <summary>
+    /// 办理中
+    /// </summary>
+    Managing = 0,
+
+    /// <summary>
+    /// 已发布
+    /// </summary>
+    Published = 1,
+
+    /// <summary>
+    /// 已回访
+    /// </summary>
+    Visited = 2,
+}

+ 1 - 1
src/Hotline.Share/Enums/Order/ESource.cs

@@ -5,7 +5,7 @@ public enum ESource
     /// <summary>
     /// 热线平台工单
     /// </summary>
-    Normal = 0,
+    Hotline = 0,
 
     /// <summary>
     /// 省平台直派

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

@@ -139,6 +139,11 @@
         /// </summary>
         public const string HotlineOrderFlow = "hotline.order.flow";
 
+        /// <summary>
+        /// 工单从中心派往部门
+        /// </summary>
+        public const string HotlineOrderCenterToOrg = "hotline.order.centertoorg";
+
         /// <summary>
         /// 热线工单归档
         /// </summary>

+ 1 - 1
src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs

@@ -30,7 +30,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 办理(流转至下一节点)
         /// </summary>
         Task NextAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine nextStepBoxDefine,
-            bool isOutOfCallCenter, bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken);
+            bool isOutFromCallCenter, bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken);
 
         /// <summary>
         /// 退回(返回前一节点)

+ 4 - 2
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -1,6 +1,8 @@
 using Hotline.FlowEngine.Definitions;
+using Hotline.Orders;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
 using SqlSugar;
 using XF.Domain.Entities;
 using XF.Domain.Exceptions;
@@ -58,9 +60,9 @@ public class Workflow : CreationEntity
     public string? TopCountersignStepCode { get; set; }
 
     /// <summary>
-    /// 中心直办件
+    /// 处理方式(直办、交办)
     /// </summary>
-    public bool IsStraight { get; set; } = true;
+    public EProcessType ProcessType { get; set; } = EProcessType.Zhiban;
 
     /// <summary>
     /// 交办时间

+ 6 - 4
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -1,8 +1,10 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Notifications;
+using Hotline.Orders;
 using Hotline.SeedData;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Enums.Order;
 using Hotline.Users;
 using MapsterMapper;
 using MediatR;
@@ -236,7 +238,7 @@ namespace Hotline.FlowEngine.Workflows
         /// 办理(流转至下一节点)
         /// </summary>
         public async Task NextAsync(Workflow workflow, BasicWorkflowDto dto, StepDefine nextStepBoxDefine,
-            bool isOutOfCallCenter, bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken)
+            bool isOutFromCallCenter, bool isStartCountersign, FlowAssignMode flowAssignMode, CancellationToken cancellationToken)
         {
             ValidatePermission(workflow);
             CheckWhetherRunnable(workflow.Status);
@@ -351,9 +353,9 @@ namespace Hotline.FlowEngine.Workflows
             }
 
             //是否从中心流转出去,重新计算expiredTime 
-            if (isOutOfCallCenter)
+            if (isOutFromCallCenter)
             {
-                workflow.IsStraight = false;
+                workflow.ProcessType = EProcessType.Jiaoban;
                 workflow.ExpiredTime = GenerateExpiredTime(workflow.Definition.Code);
                 workflow.AssignTime = DateTime.Now;
             }
@@ -409,7 +411,7 @@ namespace Hotline.FlowEngine.Workflows
                 workflow.UpdateHandlers(_sessionContext.RequiredUserId, _sessionContext.RequiredOrgCode,
                     flowAssignMode.FlowAssignType, flowAssignMode.HandlerObjects);
 
-                _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
+                await _mediator.Publish(new CountersignEndAssigned(workflow), cancellationToken);
             }
 
             //更新workflow当前节点名称、时间、会签节点code 等字段

+ 9 - 2
src/Hotline/Orders/IOrderDomainService.cs

@@ -26,14 +26,14 @@ namespace Hotline.Orders
         /// <summary>
         /// 工单办理流程开始(流程开始后触发)
         /// </summary>
-        Task ManageFlowStartAsync(FlowAssignMode assignMode, bool isCountersignStart, string? orderId, string workflowId, 
+        Task ManageFlowStartAsync(FlowAssignMode assignMode, bool isCountersignStart, string? orderId, string workflowId,
             DateTime? currentStepTime, string? currentStepName, DateTime expiredTime, CancellationToken cancellationToken);
 
         /// <summary>
         /// 工单办理流程流转(每个节点办理都会触发)
         /// </summary>
         Task ManageFlowNextAsync(FlowAssignMode assignMode, bool isCountersignStart, bool isCountersignEnd,
-            string? orderId, DateTime? currentStepTime, string? currentStepName, DateTime expiredTime, CancellationToken cancellationToken);
+            string? orderId, DateTime? currentStepTime, string? currentStepName, DateTime expiredTime, EProcessType processType, CancellationToken cancellationToken);
 
         /// <summary>
         /// 工单最终办理(此完结流程并未结束)
@@ -64,5 +64,12 @@ namespace Hotline.Orders
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         Task ManageFlowJumpAsync(string workflowId, FlowAssignMode assignMode, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 工单办理流程从中心流转至部门
+        /// </summary>
+        /// <param name="workflowId"></param>
+        /// <returns></returns>
+        Task FlowFromCenterToOrgAsync(string workflowId, CancellationToken cancellationToken);
     }
 }

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

@@ -1,9 +1,11 @@
 using Hotline.FlowEngine.Workflows;
+using Hotline.Settings.Hotspots;
 using Hotline.Share.Enums.Order;
 using Hotline.Users;
 using SqlSugar;
 using XF.Domain.Extensions;
 using XF.Domain.Repository;
+using EProcessType = Hotline.Share.Enums.Order.EProcessType;
 
 namespace Hotline.Orders
 {
@@ -141,7 +143,7 @@ namespace Hotline.Orders
         /// 热点
         /// </summary>
         public string HotspotId { get; set; }
-        public string Hotspot { get; set; }
+        public string HotspotName { get; set; }
         public string HotspotSpliceName { get; set; }
 
         /// <summary>
@@ -235,31 +237,69 @@ namespace Hotline.Orders
         /// </summary>
         public ESource Source { get; set; }
 
+        /// <summary>
+        /// 处理方式(直办、交办)
+        /// </summary>
+        public EProcessType ProcessType { get; set; } = EProcessType.Zhiban;
+
+        /// <summary>
+        /// 进展情况
+        /// </summary>
+        public EProgress Progress { get; set; }
+
+        /// <summary>
+        /// 是否公开
+        /// </summary>
+        public bool IsPublicity { get; set; }
+
         #endregion
 
+
+    }
+
+    public partial class Order
+    {
         /// <summary>
         /// 接线员(服务人)
         /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(EmployeeId))]
         public User Employee { get; set; }
 
+        /// <summary>
+        /// 热点
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(HotspotId))]
+        public Hotspot Hotspot { get; set; }
+
+        /// <summary>
+        /// 办理流程
+        /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
         public Workflow Workflow { get; set; }
-    }
 
-    public partial class Order
-    {
         /// <summary>
         /// 工单扩展信息(12315-投诉)
         /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(Id))]
-        public OrderComplain OrderComplain { get; set; }
+        public OrderComplain? OrderComplain { get; set; }
 
         /// <summary>
         /// 工单扩展信息(12315-举报)
         /// </summary>
         [Navigate(NavigateType.OneToOne, nameof(Id))]
-        public OrderReport OrderReport { get; set; }
+        public OrderReport? OrderReport { get; set; }
+
+        /// <summary>
+        /// 已发布工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(Id))]
+        public OrderPublished? OrderPublished { get; set; }
+
+        /// <summary>
+        /// 已回访工单
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(Id))]
+        public OrderVisited? OrderVisited { get; set; }
 
         #region Method
 
@@ -353,6 +393,21 @@ namespace Hotline.Orders
             CompleteTime = null;
         }
 
+        /// <summary>
+        /// 工单从中心派往部门办理
+        /// </summary>
+        public void FlowFromCenterToOrg() => ProcessType = EProcessType.Jiaoban;
+
+        /// <summary>
+        /// 发布
+        /// </summary>
+        /// <param name="isPublicity"></param>
+        public void Publish(bool isPublicity)
+        {
+            Progress = EProgress.Published;
+            IsPublicity = isPublicity;
+        }
+
         #endregion
     }
 }

+ 29 - 3
src/Hotline/Orders/OrderDomainService.cs

@@ -105,7 +105,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     /// </summary>
     public async Task ManageFlowNextAsync(FlowAssignMode assignMode,
         bool isCountersignStart, bool isCountersignEnd,
-        string? orderId, DateTime? currentStepTime, string? currentStepName, DateTime expiredTime,
+        string? orderId, DateTime? currentStepTime, string? currentStepName, DateTime expiredTime, EProcessType processType,
         CancellationToken cancellationToken)
     {
         var order = await GetOrderAsync(orderId, cancellationToken);
@@ -116,6 +116,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
 
         //更新流转信息
         order.ManageFlow(isCountersignStart, isCountersignEnd, currentStepTime, currentStepName, expiredTime);
+        order.ProcessType = processType;
 
         await _orderRepository.UpdateAsync(order, cancellationToken);
 
@@ -184,13 +185,36 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         await _orderRepository.UpdateAsync(order, cancellationToken);
     }
 
+    /// <summary>
+    /// 工单办理流程从中心流转至部门
+    /// </summary>
+    /// <param name="workflowId"></param>
+    /// <returns></returns>
+    public async Task FlowFromCenterToOrgAsync(string workflowId, CancellationToken cancellationToken)
+    {
+        var order = await GetOrderByFlowIdAsync(workflowId, cancellationToken);
+        CheckOrderIfFiled(order);
+
+        if (order.ProcessType == EProcessType.Zhiban)
+        {
+            order.FlowFromCenterToOrg();
+            await _orderRepository.UpdateAsync(order, cancellationToken);
+
+            await _capPublisher.PublishAsync(EventNames.HotlineOrderCenterToOrg, _mapper.Map<OrderDto>(order),
+                cancellationToken: cancellationToken);
+        }
+    }
+
     #region private
 
     private async Task<Order> GetOrderAsync(string? orderId, CancellationToken cancellationToken)
     {
         if (string.IsNullOrEmpty(orderId))
             throw UserFriendlyException.SameMessage("无效工单编号");
-        var order = await _orderRepository.GetAsync(orderId, cancellationToken);
+        var order = await _orderRepository.Queryable()
+            .Includes(d => d.Hotspot)
+            .FirstAsync(d => d.Id == orderId);
+
         if (order == null)
             throw new UserFriendlyException($"无效工单编号, orderId: {orderId}", "无效工单编号");
         return order;
@@ -200,7 +224,9 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         if (string.IsNullOrEmpty(workflowId))
             throw UserFriendlyException.SameMessage("无效流程编号");
-        var order = await _orderRepository.GetAsync(d => d.WorkflowId == workflowId, cancellationToken);
+        var order = await _orderRepository.Queryable()
+            .Includes(d => d.Hotspot)
+            .FirstAsync(d => d.WorkflowId == workflowId);
         if (order == null)
             throw new UserFriendlyException($"无效流程编号, workflowId: {workflowId}", "无效流程编号");
         return order;

+ 14 - 0
src/Hotline/Orders/OrderPublished.cs

@@ -0,0 +1,14 @@
+using XF.Domain.Repository;
+
+namespace Hotline.Orders;
+
+/// <summary>
+/// 已发布工单
+/// </summary>
+public class OrderPublished : CreationEntity
+{
+    /// <summary>
+    /// 工单编码(冗余)
+    /// </summary>
+    public string No { get; set; }
+}

+ 14 - 0
src/Hotline/Orders/OrderVisited.cs

@@ -0,0 +1,14 @@
+using XF.Domain.Repository;
+
+namespace Hotline.Orders;
+
+/// <summary>
+/// 已回访工单
+/// </summary>
+public class OrderVisited : CreationEntity
+{
+    /// <summary>
+    /// 工单编码(冗余)
+    /// </summary>
+    public string No { get; set; }
+}

+ 0 - 9
src/Hotline/Orders/TempOrder.cs

@@ -1,9 +0,0 @@
-namespace Hotline.Orders;
-
-/// <summary>
-/// 工单草稿
-/// </summary>
-public class TempOrder : Order
-{
-
-}

+ 1 - 0
src/Hotline/SeedData/OrgSeedData.cs

@@ -17,6 +17,7 @@ namespace Hotline.SeedData
                 Id = CallCenterId,
                 OrgName = "12345政务服务便民热线",
                 OrgCode = CallCenterCode,
+                OrgLevel = 0,
                 IsEnable = true,
             }
         };