Parcourir la source

workflowId add

xf il y a 2 ans
Parent
commit
c14b45c485

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

@@ -58,14 +58,13 @@ public class OrderController : BaseController
     public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
     {
         var (total, items) = await _orderRepository.Queryable()
-            .Where(d => d.Workflows.Any(x => x.ModuleCode == WorkflowModuleConsts.OrderManage))
             .WhereIF(!string.IsNullOrEmpty(dto.Keyword), d => d.Title.Contains(dto.Keyword) || d.No.Contains(dto.Keyword))
             .WhereIF(!string.IsNullOrEmpty(dto.Content), d => d.Content.Contains(dto.Content))
             .WhereIF(dto.AcceptTypes.Any(), d => dto.AcceptTypes.Contains(d.AcceptType))
             .WhereIF(dto.Channels.Any(), d => dto.Channels.Contains(d.Channel))
             .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.Workflows.Any(x => x.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode))))
+            .WhereIF(dto.OrgCodes.Any(), d => d.Workflow.Assigns.Any(s => dto.OrgCodes.Contains(s.OrgCode)))
             .WhereIF(!string.IsNullOrEmpty(dto.NameOrNo), d => d.Employee.Name.Contains(dto.NameOrNo) || d.Employee.StaffNo.Contains(dto.NameOrNo))
             .WhereIF(dto.CreationTimeStart.HasValue, d => d.CreationTime >= dto.CreationTimeStart)
             .WhereIF(dto.CreationTimeEnd.HasValue, d => d.CreationTime <= dto.CreationTimeEnd)
@@ -105,9 +104,8 @@ public class OrderController : BaseController
             .Includes(d => d.OrderComplain)
             .Includes(d => d.OrderReport)
             .FirstAsync(d => d.Id == id);
-        var workflow = await _workflowDomainService.GetWorkflowAsync(WorkflowModuleConsts.OrderManage, order.Id,
-            withSupplements: true, cancellationToken: HttpContext.RequestAborted);
-        order.Workflows = new List<Workflow> { workflow };
+        if (!string.IsNullOrEmpty(order.WorkflowId))
+            order.Workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSupplements: true, cancellationToken: HttpContext.RequestAborted);
 
         return _mapper.Map<OrderDto>(order);
     }
@@ -157,26 +155,16 @@ public class OrderController : BaseController
     /// <param name="dto">流程开启参数</param>
     /// <returns></returns>
     [HttpPost("{id}/startflow")]
-    public async Task<string> StartFlow(string id, [FromBody] StartWorkflowDto dto)
+    public async Task StartFlow(string id, [FromBody] StartWorkflowDto dto)
     {
         var order = await _orderRepository.GetAsync(id, HttpContext.RequestAborted);
         if (order == null)
             throw UserFriendlyException.SameMessage("无效工单编号");
         if (order.Status != EOrderStatus.Temporary)
             throw UserFriendlyException.SameMessage("工单已发起流程");
-        return await _workflowApplication.StartWorkflowAsync(dto, order.Id, HttpContext.RequestAborted);
-    }
-
-    /// <summary>
-    /// 查询工单办理流程编号
-    /// </summary>
-    /// <param name="id"></param>
-    /// <returns></returns>
-    [HttpGet("flowId-manage")]
-    public async Task<string> GetWorkflowId(string id)
-    {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(WorkflowModuleConsts.OrderManage, id, cancellationToken: HttpContext.RequestAborted);
-        return workflow?.Id;
+        var workflowId = await _workflowApplication.StartWorkflowAsync(dto, HttpContext.RequestAborted);
+        order.StartFlow(workflowId);
+        await _orderRepository.UpdateAsync(order, HttpContext.RequestAborted);
     }
 
     /// <summary>

+ 26 - 8
src/Hotline.Api/Controllers/PbxController.cs

@@ -33,6 +33,7 @@ namespace Hotline.Api.Controllers
     public class PbxController : BaseController
     {
         private readonly ITelRepository _telRepository;
+        private readonly ITelRestRepository _telRestRepository;
         private readonly ITelDomainService _telDomainService;
         private readonly ITypedCache<Tel> _cacheTel;
         private readonly ITypedCache<TelGroup> _cacheTelGroup;
@@ -50,6 +51,7 @@ namespace Hotline.Api.Controllers
 
         public PbxController(
             ITelRepository telRepository,
+            ITelRestRepository telRestRepository,
             ITelDomainService telDomainService,
             ITypedCache<Tel> cacheTel,
             ITypedCache<TelGroup> cacheTelGroup,
@@ -66,6 +68,7 @@ namespace Hotline.Api.Controllers
             ISystemSettingCacheManager systemSettingCacheManager)
         {
             _telRepository = telRepository;
+            _telRestRepository = telRestRepository;
             _telDomainService = telDomainService;
             _cacheTel = cacheTel;
             _cacheTelGroup = cacheTelGroup;
@@ -220,12 +223,27 @@ namespace Hotline.Api.Controllers
             var work = _userCacheManager.GetWorkByUser(_sessionContext.RequiredUserId);
             if (work is null)
                 throw UserFriendlyException.SameMessage("当前坐席暂未进行工作");
+            var isResting = await _telRepository.IsRestingAsync(work.TelNo, HttpContext.RequestAborted);
+            if (isResting)
+                throw new UserFriendlyException("当前坐席正在休息");
+
             bool isApply = bool.Parse(_systemSettingCacheManager.GetSetting(SettingConstants.RestApproval).SettingValue);
-            string id = await _telDomainService.RestAsync(work,dto.Reason,isApply, HttpContext.RequestAborted);
-            
-            var startworkflow = _mapper.Map<StartWorkflowDto>(dto);
-            if (isApply)
-                await _workflowApplication.StartWorkflowAsync(dto, id, HttpContext.RequestAborted);
+            var telRest = new TelRest(work.TelId, work.TelNo, work.UserId, work.UserName, dto.Reason, isApply);
+            if (!isApply)
+            {
+                await _deviceManager.TelRestAsync(telRest.TelNo, HttpContext.RequestAborted);
+            }
+            else
+            {
+                telRest.WorkflowId = await _workflowApplication.StartWorkflowAsync(dto, HttpContext.RequestAborted);
+            }
+            await _telRestRepository.AddAsync(telRest, HttpContext.RequestAborted);
+
+            //string id = await _telDomainService.RestAsync(work, dto.Reason, isApply, HttpContext.RequestAborted);
+
+            //var startworkflow = _mapper.Map<StartWorkflowDto>(dto);
+            //if (isApply)
+            //    await _workflowApplication.StartWorkflowAsync(dto, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -252,7 +270,7 @@ namespace Hotline.Api.Controllers
             var work = _userCacheManager.GetWorkByUser(_sessionContext.RequiredUserId);
             if (work is null)
                 throw UserFriendlyException.SameMessage("当前坐席暂未进行工作");
-            await _telDomainService.HoldAsync(work.TelId,_sessionContext.RequiredUserId,_sessionContext.UserName,callId, HttpContext.RequestAborted);
+            await _telDomainService.HoldAsync(work.TelId, _sessionContext.RequiredUserId, _sessionContext.UserName, callId, HttpContext.RequestAborted);
         }
 
         /// <summary>
@@ -265,7 +283,7 @@ namespace Hotline.Api.Controllers
             var work = _userCacheManager.GetWorkByUser(_sessionContext.RequiredUserId);
             if (work is null)
                 throw UserFriendlyException.SameMessage("当前坐席暂未进行工作");
-            await _telDomainService.UnHoldAsync(work.TelId,_sessionContext.RequiredUserId,callId, HttpContext.RequestAborted);
+            await _telDomainService.UnHoldAsync(work.TelId, _sessionContext.RequiredUserId, callId, HttpContext.RequestAborted);
         }
         /// <summary>
         /// 分机呼分机
@@ -710,7 +728,7 @@ namespace Hotline.Api.Controllers
             return new { WorkCategorys = ivr, RestCategory = ivr, WorkToGroup = group, RestToGroup = group, WorkDay = workDay };
         }
 
-        
+
         #endregion
     }
 }

+ 1 - 6
src/Hotline.Application/FlowEngine/IWorkflowApplication.cs

@@ -8,7 +8,7 @@ namespace Hotline.Application.FlowEngine
 {
     public interface IWorkflowApplication
     {
-        Task<string> StartWorkflowAsync(StartWorkflowDto dto, string externalId, CancellationToken cancellationToken = default);
+        Task<string> StartWorkflowAsync(StartWorkflowDto dto, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 流转至下一节点(节点办理)
@@ -21,11 +21,6 @@ namespace Hotline.Application.FlowEngine
         /// <summary>
         /// 查询流程下一节点配置参数
         /// </summary>
-        /// <param name="moduleCode"></param>
-        /// <param name="externalId"></param>
-        /// <returns></returns>
-        Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(string moduleCode, string externalId, CancellationToken cancellationToken);
-
         Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(Workflow workflow, CancellationToken cancellationToken);
 
         /// <summary>

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

@@ -52,19 +52,16 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         _sessionContext = sessionContext;
     }
 
-    public async Task<string> StartWorkflowAsync(StartWorkflowDto dto, string externalId, CancellationToken cancellationToken = default)
+    public async Task<string> StartWorkflowAsync(StartWorkflowDto dto, CancellationToken cancellationToken = default)
     {
         var definition = await _definitionDomainService.GetLastVersionDefinitionAsync(dto.DefinitionCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException("无效模板名称");
         if (definition.Status != EDefinitionStatus.Enable)
             throw new UserFriendlyException("该模板不可用");
-        var exists = await _workflowDomainService.ExsitsAsync(definition.ModuleCode, externalId, cancellationToken);
-        if (exists)
-            throw UserFriendlyException.SameMessage($"该工单已发起过{WorkflowModule.Modules[definition.ModuleCode]}流程");
 
         var nextStepBoxDefine = _workflowDomainService.GetStepBoxDefine(definition, dto.NextStepCode);
-        var workflow = await _workflowDomainService.CreateWorkflowAsync(definition, dto.Title, externalId, cancellationToken);
+        var workflow = await _workflowDomainService.CreateWorkflowAsync(definition, dto.Title, cancellationToken);
 
         await _workflowDomainService.StartAsync(workflow, dto, nextStepBoxDefine, cancellationToken);
 
@@ -96,17 +93,6 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// <summary>
     /// 查询流程下一节点配置参数
     /// </summary>
-    /// <param name="moduleCode"></param>
-    /// <param name="externalId"></param>
-    /// <returns></returns>
-    public async Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(string moduleCode, string externalId, CancellationToken cancellationToken)
-    {
-        var workflow = await _workflowDomainService.GetWorkflowAsync(moduleCode, externalId, true, true, cancellationToken: cancellationToken);
-        if (workflow == null)
-            throw new UserFriendlyException($"未查询到流程, moduleCode:{moduleCode}, externalId: {externalId}", "未查询到该流程");
-        return await GetNextStepOptionsAsync(workflow, cancellationToken);
-    }
-
     public async Task<IReadOnlyList<NextStepOptions>> GetNextStepOptionsAsync(Workflow workflow, CancellationToken cancellationToken)
     {
         var nextStepDefines = _workflowDomainService.GetNextStepOptions(workflow, cancellationToken);

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

@@ -39,7 +39,7 @@ public class NextStepHandler : INotificationHandler<NextStepNotify>
             case WorkflowModuleConsts.OrderManage:
                 await _orderDomainService.OrderManageAsync(EOrderStatus.WaitForSign,
                     assignMode, notification.IsCountersignEnd, notification.IsCountersignStart,
-                    workflow.ExternalId, workflow.CurrentStepTime, workflow.CurrentStepName, cancellationToken);
+                    workflow.Id, workflow.CurrentStepTime, workflow.CurrentStepName, cancellationToken);
                 break;
         }
     }

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

@@ -45,7 +45,7 @@ namespace Hotline.Application.Handlers.FlowEngine
                 case WorkflowModuleConsts.OrderManage:
                     await _orderDomainService.OrderManageAsync(EOrderStatus.WaitForSign, assignMode,
                         false, notification.IsCountersignStart,
-                        workflow.ExternalId, workflow.CurrentStepTime, workflow.CurrentStepName, cancellationToken);
+                        workflow.Id, workflow.CurrentStepTime, workflow.CurrentStepName, cancellationToken);
                     break;
             }
         }

+ 1 - 1
src/Hotline/CallCenter/Tels/ITelDomainService.cs

@@ -45,7 +45,7 @@ namespace Hotline.CallCenter.Tels
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         Task<string> RestAsync(Work currentWork,string reason,bool isApply, CancellationToken cancellationToken);
-
+        
         /// <summary>
         /// 分机小休审批通过
         /// </summary>

+ 7 - 7
src/Hotline/CallCenter/Tels/TelDomainService.cs

@@ -54,14 +54,14 @@ public class TelDomainService : ITelDomainService, IScopeDependency
     /// <param name="currentWork"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task<string> RestAsync(Work currentWork,string reason,bool isApply, CancellationToken cancellationToken)
+    public async Task<string> RestAsync(Work currentWork, string reason, bool isApply, CancellationToken cancellationToken)
     {
         var isResting = await _telRepository.IsRestingAsync(currentWork.TelNo, cancellationToken);
         if (!isResting)
         {
             await _deviceManager.TelRestAsync(currentWork.TelNo, cancellationToken);
-            
-            return await _telRestRepository.AddAsync(new TelRest(currentWork.TelId, currentWork.TelNo, currentWork.UserId, currentWork.UserName,reason, isApply),
+
+            return await _telRestRepository.AddAsync(new TelRest(currentWork.TelId, currentWork.TelNo, currentWork.UserId, currentWork.UserName, reason, isApply),
                 cancellationToken);
         }
         throw new UserFriendlyException("当前坐席正在休息");
@@ -76,7 +76,7 @@ public class TelDomainService : ITelDomainService, IScopeDependency
     public async Task RestApplyPass(string id, CancellationToken cancellationToken)
     {
         var telrest = await _telRestRepository.GetAsync(id, cancellationToken);
-        if(telrest!=null)
+        if (telrest != null)
         {
             telrest.ApplyStatus = Share.Enums.Order.ERestApplyStatus.Resting;
             telrest.StartTime = DateTime.Now;
@@ -112,7 +112,7 @@ public class TelDomainService : ITelDomainService, IScopeDependency
     /// <param name="telId"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task HoldAsync(string telId,string  userId,string userName,string callId, CancellationToken cancellationToken)
+    public async Task HoldAsync(string telId, string userId, string userName, string callId, CancellationToken cancellationToken)
     {
         var isHolding = await _telHoldRepository.IsHoldingAsync(telId, userId, callId, cancellationToken);
         if (!isHolding)
@@ -131,13 +131,13 @@ public class TelDomainService : ITelDomainService, IScopeDependency
     /// <param name="telId"></param>
     /// <param name="cancellationToken"></param>
     /// <returns></returns>
-    public async Task UnHoldAsync(string telId,string userId,string callId, CancellationToken cancellationToken)
+    public async Task UnHoldAsync(string telId, string userId, string callId, CancellationToken cancellationToken)
     {
         var tel = await _telRepository.GetAsync(telId, cancellationToken);
         if (tel is null)
             throw new UserFriendlyException("无效分机编号");
         await _deviceManager.UnHoldAsync(tel.No, cancellationToken);
-        var holdingTel = await _telHoldRepository.GetAsync(d => d.TelId == telId && d.TelNo == tel.No && d.UserId == userId && d.CallId == callId && !d.EndTime.HasValue );
+        var holdingTel = await _telHoldRepository.GetAsync(d => d.TelId == telId && d.TelNo == tel.No && d.UserId == userId && d.CallId == callId && !d.EndTime.HasValue);
         if (holdingTel is null)
             throw new UserFriendlyException("未找到分机保持信息");
         holdingTel.EndHold();

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

@@ -7,7 +7,7 @@ namespace Hotline.FlowEngine.Workflows
 {
     public interface IWorkflowDomainService
     {
-        Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string externalId, CancellationToken cancellationToken);
+        Task<Workflow> CreateWorkflowAsync(Definition definition, string title, CancellationToken cancellationToken);
 
         /// <summary>
         /// 进行流程的开始节点
@@ -18,7 +18,6 @@ namespace Hotline.FlowEngine.Workflows
         /// 查询工作流
         /// </summary>
         Task<Workflow> GetWorkflowAsync(string workflowId, bool withDefine = false, bool withSteps = false, bool withTraces = false, bool withSupplements = false, bool withAssigns = false, CancellationToken cancellationToken = default);
-        Task<Workflow> GetWorkflowAsync(string moduleCode, string externalId, bool withDefine = false, bool withSteps = false, bool withTraces = false, bool withSupplements = false, bool withAssigns = false, CancellationToken cancellationToken = default);
 
         /// <summary>
         /// 受理,接办
@@ -63,7 +62,5 @@ namespace Hotline.FlowEngine.Workflows
         /// 查询当前待办节点的下一级节点配置(办理参数)
         /// </summary>
         IReadOnlyList<StepDefine> GetNextStepOptions(Workflow workflow, CancellationToken cancellationToken);
-
-        Task<bool> ExsitsAsync(string moduleCode, string externalId, CancellationToken cancellationToken);
     }
 }

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

@@ -68,10 +68,10 @@ public class Workflow : CreationEntity
     [SugarColumn(Length = 2000)]
     public string Opinion { get; set; } = "办理中...";
 
-    /// <summary>
-    /// 外部业务唯一标识
-    /// </summary>
-    public string ExternalId { get; set; }
+    ///// <summary>
+    ///// 外部业务唯一标识
+    ///// </summary>
+    //public string ExternalId { get; set; }
 
     [Navigate(NavigateType.OneToOne, nameof(DefinitionId))]
     public Definition Definition { get; set; }

+ 30 - 52
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -47,7 +47,7 @@ namespace Hotline.FlowEngine.Workflows
             _mediator = mediator;
         }
 
-        public async Task<Workflow> CreateWorkflowAsync(Definition definition, string title, string externalId, CancellationToken cancellationToken)
+        public async Task<Workflow> CreateWorkflowAsync(Definition definition, string title, CancellationToken cancellationToken)
         {
             var workflow = new Workflow
             {
@@ -59,7 +59,6 @@ namespace Hotline.FlowEngine.Workflows
                 Status = EWorkflowStatus.Runnable,
                 TimeLimit = GetTimeLimit(definition.Code),
                 ExpiredTime = GenerateExpiredTime(definition.Code),
-                ExternalId = externalId,
                 StepBoxes = new(),
                 Traces = new(),
                 Definition = definition
@@ -106,15 +105,36 @@ namespace Hotline.FlowEngine.Workflows
             CancellationToken cancellationToken = default)
         {
             var query = _workflowRepository.Queryable().Where(d => d.Id == workflowId);
-            return await GetWorkflowAsync(query, withDefine, withSteps, withTraces, withSupplements, withAssigns);
-        }
+            if (withDefine)
+                query = query.Includes(d => d.Definition);
+            if (withSupplements)
+                query = query.Includes(d => d.Supplements);
+            if (withAssigns)
+                query = query.Includes(d => d.Assigns);
 
-        public async Task<Workflow> GetWorkflowAsync(string moduleCode, string externalId, bool withDefine = false, bool withSteps = false,
-            bool withTraces = false, bool withSupplements = false, bool withAssigns = false,
-            CancellationToken cancellationToken = default)
-        {
-            var query = _workflowRepository.Queryable().Where(d => d.ModuleCode == moduleCode && d.ExternalId == externalId);
-            return await GetWorkflowAsync(query, withDefine, withSteps, withTraces, withSupplements, withAssigns);
+            var workflow = await query.FirstAsync();
+            if (workflow is null)
+                throw new UserFriendlyException("无效workflowId");
+
+            if (withSteps)
+            {
+                var steps = await _workflowStepRepository.Queryable()
+                    .Where(d => d.WorkflowId == workflow.Id)
+                    .OrderBy(d => d.CreationTime)
+                    .ToTreeAsync(d => d.Steps, d => d.ParentId, null);
+                workflow.StepBoxes = steps;
+            }
+
+            if (withTraces)
+            {
+                var traces = await _workflowTraceRepository.Queryable()
+                    .Where(d => d.WorkflowId == workflow.Id)
+                    .ToTreeAsync(d => d.Traces, d => d.ParentId, null);
+                workflow.Traces = traces;
+            }
+
+
+            return workflow;
         }
 
         /// <summary>
@@ -473,51 +493,9 @@ namespace Hotline.FlowEngine.Workflows
             return workflow.Definition.FindSteps(currentStepBox.NextSteps);
         }
 
-        public async Task<bool> ExsitsAsync(string moduleCode, string externalId, CancellationToken cancellationToken)
-        {
-            return await _workflowRepository.Queryable()
-                .AnyAsync(d => d.ModuleCode == moduleCode && d.ExternalId == externalId);
-        }
-
 
         #region private
 
-
-        private async Task<Workflow> GetWorkflowAsync(ISugarQueryable<Workflow> query, bool withDefine, bool withSteps, bool withTraces,
-            bool withSupplements, bool withAssigns)
-        {
-            if (withDefine)
-                query = query.Includes(d => d.Definition);
-            if (withSupplements)
-                query = query.Includes(d => d.Supplements);
-            if (withAssigns)
-                query = query.Includes(d => d.Assigns);
-
-            var workflow = await query.FirstAsync();
-            if (workflow is null)
-                throw new UserFriendlyException("无效workflowId");
-
-            if (withSteps)
-            {
-                var steps = await _workflowStepRepository.Queryable()
-                    .Where(d => d.WorkflowId == workflow.Id)
-                    .OrderBy(d => d.CreationTime)
-                    .ToTreeAsync(d => d.Steps, d => d.ParentId, null);
-                workflow.StepBoxes = steps;
-            }
-
-            if (withTraces)
-            {
-                var traces = await _workflowTraceRepository.Queryable()
-                    .Where(d => d.WorkflowId == workflow.Id)
-                    .ToTreeAsync(d => d.Traces, d => d.ParentId, null);
-                workflow.Traces = traces;
-            }
-
-
-            return workflow;
-        }
-
         /// <summary>
         /// 在stepCode对应的stepBox中找到开启会签流程的节点
         /// </summary>

+ 1 - 1
src/Hotline/Orders/IOrderDomainService.cs

@@ -22,6 +22,6 @@ namespace Hotline.Orders
         /// 工单办理(每个节点都会触发)
         /// </summary>
         Task OrderManageAsync(EOrderStatus status, FlowAssignMode assignMode, bool isCountersignEnd, bool isCountersignStart,
-            string orderId, DateTime currentStepTime, string CurrentStepName, CancellationToken cancellationToken);
+            string workflowId, DateTime currentStepTime, string CurrentStepName, CancellationToken cancellationToken);
     }
 }

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

@@ -200,8 +200,8 @@ namespace Hotline.Orders
         [Navigate(NavigateType.OneToOne, nameof(EmployeeId))]
         public User Employee { get; set; }
 
-        [Navigate(NavigateType.OneToMany, nameof(Workflow.ExternalId))]
-        public List<Workflow> Workflows { get; set; }
+        [Navigate(NavigateType.OneToOne, nameof(WorkflowId))]
+        public Workflow Workflow { get; set; }
     }
 
     /// <summary>
@@ -233,6 +233,12 @@ namespace Hotline.Orders
             StartTime = DateTime.Now;
         }
 
+        public void StartFlow(string workflowId)
+        {
+            WorkflowId = workflowId;
+            Status = EOrderStatus.WaitForSign;
+        }
+
         #endregion
     }
 }

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

@@ -55,12 +55,12 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     /// </summary>
     public async Task OrderManageAsync(EOrderStatus status, FlowAssignMode assignMode,
         bool isCountersignEnd, bool isCountersignStart,
-        string orderId, DateTime currentStepTime, string CurrentStepName,
+        string workflowId, DateTime currentStepTime, string CurrentStepName,
         CancellationToken cancellationToken)
     {
-        var order = await _orderRepository.GetAsync(orderId, cancellationToken);
+        var order = await _orderRepository.GetAsync(d => d.WorkflowId == workflowId, cancellationToken);
         if (order == null)
-            throw new UserFriendlyException($"无效工单编号, orderId: {orderId}", "无效工单编号");
+            throw new UserFriendlyException($"无效工单流程编号, workflowId: {workflowId}", "无效工单编号");
         if (order.Status is EOrderStatus.Filed) return;
 
         //更新指派信息
@@ -81,6 +81,8 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
         order.Status = status;
 
         await _orderRepository.UpdateAsync(order, cancellationToken);
+
+        //todo push msg
     }
 
     #region private

+ 4 - 4
src/XF.Domain.Repository/Entity.cs

@@ -137,8 +137,8 @@ public abstract class FullStateEntity : CreationSoftDeleteEntity, IHasModificati
 
 public abstract class WorkflowEntity : FullStateEntity, IWorkflow
 {
-    //[SugarColumn(IsNullable = true)]
-    //public string? WorkflowId { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? WorkflowId { get; set; }
 
     [SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
     public List<string> AssignOrgCodes { get; set; } = new();
@@ -224,8 +224,8 @@ public abstract class PositionEntity : FullStateEntity
 
 public abstract class PositionWorkflowEntity : PositionEntity, IWorkflow
 {
-    //[SugarColumn(IsNullable = true)]
-    //public string? WorkflowId { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? WorkflowId { get; set; }
 
     [SugarColumn(ColumnDataType = "varchar(1000)", IsJson = true)]
     public List<string> AssignOrgCodes { get; set; } = new();

+ 1 - 1
src/XF.Domain/Entities/IDataPermission.cs

@@ -16,7 +16,7 @@ namespace XF.Domain.Entities
 
     public interface IWorkflow
     {
-        //string? WorkflowId { get; set; }
+        string? WorkflowId { get; set; }
 
         /// <summary>
         /// 指派部门编码