瀏覽代碼

ordervisit

Jason 1 年之前
父節點
當前提交
8203d9aae6

+ 80 - 4
src/Hotline.Api/Controllers/OrderController.cs

@@ -607,21 +607,97 @@ public class OrderController : BaseController
 
     #region 二次回访申请
 
+    [Permission(EPermission.ApplyOrderVisit)]
+    [HttpPost("visitapply/add")]
     public async Task ApplyOrderVisit([FromBody]VisitStartFlowDto dto)
     {
-        var orderVisitApply = _mapper.Map<AddVisitApply>(dto.Data);
+        var orderVisitApply = _mapper.Map<OrderVisitApply>(dto.Data);
         //验证是否可以申请二次回访
         
 
         var isAny = await _orderVisitApplyRepository.AnyAsync(x => x.OrderId == orderVisitApply.OrderId && x.VisitApplyState != EVisitApplyState.NoPass,HttpContext.RequestAborted);
         if (isAny)
-        {
             throw UserFriendlyException.SameMessage("当前状态不能申请二次回访");
-        }
 
         var orderModel = await _orderRepository.GetAsync(x => x.Id == orderVisitApply.OrderId, HttpContext.RequestAborted);
-        
+        if (orderModel?.CounterSignType != null)
+            throw UserFriendlyException.SameMessage("会签件不能申请二次回访");
+
+        orderVisitApply.EmployeeId = _sessionContext.RequiredUserId;
+        var id = await _orderVisitApplyRepository.AddAsync(orderVisitApply, HttpContext.RequestAborted);
+
+        try
+        {
+            var startDto = _mapper.Map<StartWorkflowDto>(dto.Workflow);
+            startDto.DefinitionModuleCode = WorkflowModuleConsts.VisitApply;
+            startDto.Title = orderVisitApply.VisitReason;
+            string workFlowId = await _workflowApplication.StartWorkflowAsync(startDto, id, cancellationToken: HttpContext.RequestAborted);
+            orderVisitApply.WorkflowId = workFlowId;
+            await _orderVisitApplyRepository.UpdateAsync(orderVisitApply, HttpContext.RequestAborted);
+        }
+        catch (Exception ex)
+        {
+            await _orderDelayRepository.RemoveAsync(id, false, HttpContext.RequestAborted);
+            throw new UserFriendlyException($"工单二次回访流程失败!, {ex.Message}", "工单二次回访流程失败");
+        }
+    }
+
+    /// <summary>
+    /// 查询二次申请流程开启参数
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("visitapply/startflow")]
+    public async Task<NextStepsDto> GetVisitFlowStartOptions()
+    {
+        return await _workflowApplication.GetStartStepsAsync(WorkflowModuleConsts.VisitApply, HttpContext.RequestAborted);
+    }
+
+    /// <summary>
+    /// 二次回访申请列表
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [Permission(EPermission.VisitApplyList)]
+    [HttpGet("visitapply/list")]
+    public async Task<PagedDto<VisitApplyDto>> VisitApplyList([FromQuery]VisitApplyListDto dto)
+    {
+        var (total,items) = await _orderVisitApplyRepository.Queryable()
+            .Includes(d=>d.Order)
+            .Includes(d=>d.Employee)
+            .WhereIF(dto.VisitApplyState != null, x => x.VisitApplyState == dto.VisitApplyState)
+            .WhereIF(!string.IsNullOrEmpty(dto.Keyword), x => x.OrderNo.Contains(dto.Keyword))
+            .OrderByDescending(x => x.CreationTime)
+            .ToPagedListAsync(dto.PageIndex,dto.PageSize,HttpContext.RequestAborted);
+
+        return new PagedDto<VisitApplyDto>(total, _mapper.Map<IReadOnlyList<VisitApplyDto>>(items));
+    }
 
+    /// <summary>
+    /// 获取二次回访申请
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    [Permission(EPermission.VisitApplyEntity)]
+    [HttpGet("visitapply/{id}")]
+    public async Task<VisitApplyDto> VisitApplyEntity([FromQuery]string id)
+    {
+        var model = await _orderVisitApplyRepository.GetAsync(x => x.Id == id, HttpContext.RequestAborted);
+
+        return _mapper.Map<VisitApplyDto>(model);
+    }
+
+    /// <summary>
+    /// 页面基础信息
+    /// </summary>
+    /// <returns></returns>
+    [HttpGet("visitapply/basedata")]
+    public async Task<object> VisitApplyBaseData()
+    {
+        var rsp = new
+        {
+            VisitApplyState = EnumExts.GetDescriptions<EVisitApplyState>()
+        };
+        return rsp;
     }
 
     #endregion

+ 26 - 3
src/Hotline.Application/Handlers/FlowEngine/EndWorkflowHandler.cs

@@ -38,6 +38,7 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
     private readonly ICircularRecordDomainService _circularRecordDomainService;
     private readonly IRepository<OrderVisit> _orderVisitRepository;
     private readonly IRepository<OrderDelay> _orderDelayRepository;
+    private readonly IRepository<OrderVisitApply> _orderVisitApplyRepository;
 
     public EndWorkflowHandler(
         IKnowledgeDomainService knowledgeDomainService,
@@ -54,7 +55,8 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
         IRepository<CircularRecord> circularRecordRepository,
         ICircularRecordDomainService circularRecordDomainService,
         IRepository<OrderDelay> orderDelayRepository,
-        IRepository<OrderVisit> orderVisitRepository
+        IRepository<OrderVisit> orderVisitRepository,
+        IRepository<OrderVisitApply> orderVisitApplyRepository
         )
     {
         _knowledgeDomainService = knowledgeDomainService;
@@ -72,6 +74,7 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
         _circularRecordDomainService = circularRecordDomainService;
         _orderDelayRepository = orderDelayRepository;
         _orderVisitRepository = orderVisitRepository;
+        _orderVisitApplyRepository = orderVisitApplyRepository;
     }
 
     /// <summary>Handles a notification</summary>
@@ -90,11 +93,9 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
             case WorkflowModuleConsts.KnowledgeDelete://删除知识库
                 await _knowledgeDomainService.EndWorkKnowledge(workflow, cancellationToken);
                 break;
-
             case WorkflowModuleConsts.TelRestApply:
                 await _telDomainService.TelRestApplyPassAsync(workflow.ExternalId, cancellationToken);
                 break;
-
             case WorkflowModuleConsts.OrderHandle:
                 var order = await _orderDomainService.GetOrderAsync(workflow.ExternalId, cancellationToken);
                 order.CheckIfFiled();
@@ -230,6 +231,28 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
                     //处理工单延期TODO
                 }
                 break;
+            case WorkflowModuleConsts.VisitApply:
+                //获取单据
+                var visitApply = await _orderVisitApplyRepository.GetAsync(workflow.ExternalId, cancellationToken);
+                if (visitApply!=null)
+                {
+                    //处理申请单
+                    visitApply.VisitApplyState = EVisitApplyState.Pass;
+                    await _orderVisitApplyRepository.UpdateAsync(visitApply, cancellationToken);
+                    //处理原回访数据
+                    var visitModel = await _orderVisitRepository.GetAsync(visitApply.OrderVisitId, cancellationToken);
+                    if (visitModel!=null)
+                    {
+                        visitModel.VisitState = EVisitState.None;
+                        await _orderVisitRepository.UpdateAsync(visitModel, cancellationToken);
+                        //处理新回访数据
+                        //查询原回访数据子表
+                        var visitModelNew = _mapper.Map<OrderVisit>(visitModel);
+                        var visitModelDetail = _orderVisitedDetailRepository.Queryable().Where(x => x.VisitId == visitModel.Id);
+                        //TODO
+                    }
+                }
+                break;
         }
     }
 }

+ 1 - 1
src/Hotline.Share/Dtos/Order/OrderStartFlowDto.cs

@@ -33,7 +33,7 @@ namespace Hotline.Share.Dtos.Order
 
     }
 
-    public class VisitStartFlowDto:StartWorkflowDto<AddVisitApply>
+    public class VisitStartFlowDto:StartWorkflowDto<AddVisitApplyDto>
     {
 
     }

+ 54 - 1
src/Hotline.Share/Dtos/Order/QueryOrderDto.cs

@@ -4,6 +4,7 @@ using System.ComponentModel;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using Hotline.Share.Dtos.Users;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Enums.Settings;
 using Hotline.Share.Requests;
@@ -506,7 +507,7 @@ namespace Hotline.Share.Dtos.Order
         NoPub = 2
     }
 
-    public class AddVisitApply 
+    public class AddVisitApplyDto
     {
         public string OrderNo { get; set; }
 
@@ -519,4 +520,56 @@ namespace Hotline.Share.Dtos.Order
         public List<string> FileIds { get; set; }
     }
 
+    public class VisitApplyDto
+    {
+        public string OrderNo { get; set; }
+
+        public string OrderId { get; set; }
+
+        public OrderDto Order { get; set; }
+
+        public string EmployeeId { get; set; }
+
+        public UserDto Employee { get; set; }
+
+        public string VisitReason { get; set; }
+
+        /// <summary>
+        /// 源单号
+        /// </summary>
+        public string OrderVisitId { get; set; }
+
+        public OrderVisitDto OrderVisit { get; set; }
+
+        /// <summary>
+        /// 流程ID
+        /// </summary>
+        public string? WorkflowId { get; set; }
+
+        public EVisitApplyState VisitApplyState { get; set; }
+
+        public string Id { get; set; }
+
+        public string? CreatorId { get; set; }
+
+        public string? CreatorName { get; set; }
+
+        public string? CreatorOrgId { get; set; }
+
+        public string? CreatorOrgName { get; set; }
+
+        public int CreatorOrgLevel { get; set; }
+
+        /// <summary>
+        /// 一级部门Id
+        /// </summary>
+        public string? AreaId { get; set; }
+    }
+
+    public record VisitApplyListDto: PagedKeywordRequest
+    {
+        public EVisitApplyState? VisitApplyState { get; set; }
+
+    }
+
 }

+ 0 - 5
src/Hotline.Share/Enums/Order/EVisitApplyState.cs

@@ -21,10 +21,5 @@ namespace Hotline.Share.Enums.Order
         [Description("拒绝")]
         NoPass = 2,
 
-        /// <summary>
-		/// 审批拒绝
-		/// </summary>
-		[Description("审批拒绝")]
-        Refuse = 3,
     }
 }

+ 7 - 1
src/Hotline/FlowEngine/WorkflowModules/WorkflowModuleConsts.cs

@@ -54,6 +54,11 @@ public class WorkflowModuleConsts
     /// </summary>
     public const string CircularApply = "CircularApply";
 
+    /// <summary>
+    /// 二次回访申请
+    /// </summary>
+    public const string VisitApply = "VisitApply";
+
 
     public static List<WorkflowModule> AllModules =>
         new()
@@ -67,6 +72,7 @@ public class WorkflowModuleConsts
             new(OrderPrevious,"工单退回"),
             new(OrderScreen,"工单甄别"),
             new(BulletinApply,"公告审批"),
-            new(CircularApply,"通知审批")
+            new(CircularApply,"通知审批"),
+            new(VisitApply,"二次回访申请")
         };
 }

+ 23 - 4
src/Hotline/Permissions/EPermission.cs

@@ -1504,12 +1504,31 @@ namespace Hotline.Permissions
 		/// </summary>
 		[Display(GroupName = "OrderObserve", Name = "修改工单终结", Description = "修改工单终结")]
 		UpdateOrderFinality = 501703,
-		#endregion
+        #endregion
 
-		#endregion
+        #region 工单二次回访申请
+        /// <summary>
+        /// 二次回访申请列表
+        /// </summary>
+        [Display(GroupName = "VisitApplyList",Name ="二次回访申请列表",Description ="二次回访申请列表")]
+        VisitApplyList = 501800,
+
+        /// <summary>
+        /// 申请二次回访
+        /// </summary>
+        [Display(GroupName = "ApplyOrderVisit",Name ="申请二次回访",Description ="申请二次回访")]
+        ApplyOrderVisit = 501801,
+        /// <summary>
+        /// 二次回访申请对象
+        /// </summary>
+        [Display(GroupName = "VisitApplyEntity",Name = "二次回访申请对象",Description ="二次回访申请对象")]
+        VisitApplyEntity = 501802,
+        #endregion
+
+        #endregion
 
-		#region 辅助功能(600)
-		[Display(GroupName = "辅助功能", Name = "辅助功能", Description = "辅助功能")]
+        #region 辅助功能(600)
+        [Display(GroupName = "辅助功能", Name = "辅助功能", Description = "辅助功能")]
         Auxiliary = 600000,
 
         #region 公告列表