TANG JIANG 2 năm trước cách đây
mục cha
commit
94b6935b4b
41 tập tin đã thay đổi với 484 bổ sung144 xóa
  1. 40 12
      src/Hotline.Api/Controllers/HotSpotController.cs
  2. 17 7
      src/Hotline.Api/Controllers/OrderController.cs
  3. 1 1
      src/Hotline.Api/Controllers/PbxController.cs
  4. 0 1
      src/Hotline.Api/Controllers/TestController.cs
  5. 14 0
      src/Hotline.Api/Controllers/WorkflowController.cs
  6. 0 9
      src/Hotline.Api/appsettings.Development.json
  7. 0 9
      src/Hotline.Api/appsettings.json
  8. 3 3
      src/Hotline.Application/FlowEngine/WorkflowApplication.cs
  9. 3 10
      src/Hotline.Application/Handlers/FlowEngine/EndWorkflowHandler.cs
  10. 1 1
      src/Hotline.Application/Handlers/FlowEngine/NextStepHandler.cs
  11. 1 1
      src/Hotline.Application/Handlers/FlowEngine/PreviousStepHandler.cs
  12. 1 1
      src/Hotline.Application/Handlers/FlowEngine/StartWorkflowHandler.cs
  13. 1 1
      src/Hotline.Application/Handlers/FlowEngine/TerminalWorkflowHandler.cs
  14. 30 0
      src/Hotline.Application/Handlers/Order/GetOrderDetailHandler.cs
  15. 25 5
      src/Hotline.Application/Mappers/MapperConfigs.cs
  16. 2 1
      src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionFilterBuilder.cs
  17. 1 1
      src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs
  18. 1 1
      src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs
  19. 5 0
      src/Hotline.Share/Dtos/FlowEngine/EndWorkflowDto.cs
  20. 37 2
      src/Hotline.Share/Dtos/FlowEngine/WorkflowDto.cs
  21. 35 8
      src/Hotline.Share/Dtos/Order/OrderDto.cs
  22. 1 0
      src/Hotline.Share/Dtos/Order/QueryOrderHistoryDto.cs
  23. 3 3
      src/Hotline.Share/Dtos/Settings/TimeLimitDto.cs
  24. 2 2
      src/Hotline.Share/Enums/Settings/ETimeLimitState.cs
  25. 11 0
      src/Hotline.Share/Enums/Settings/ETimeLimitType.cs
  26. 0 35
      src/Hotline/FileStorage/File.cs
  27. 48 8
      src/Hotline/FlowEngine/Definitions/DefinitionDomainService.cs
  28. 27 2
      src/Hotline/FlowEngine/Definitions/IDefinitionDomainService.cs
  29. 1 2
      src/Hotline/FlowEngine/Notifications/WorkflowNotify.cs
  30. 1 1
      src/Hotline/FlowEngine/Workflows/IWorkflowDomainService.cs
  31. 15 10
      src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs
  32. 5 1
      src/Hotline/FlowEngine/Workflows/WorkflowSupplement.cs
  33. 4 0
      src/Hotline/Hotline.csproj
  34. 31 0
      src/Hotline/Orders/Notifications/GetOrderDetailNotify.cs
  35. 1 1
      src/Hotline/Orders/OrderDomainService.cs
  36. 2 2
      src/Hotline/Settings/SystemOrganize.cs
  37. 48 2
      src/Hotline/Settings/TimeLimits/TimeLimit.cs
  38. 48 0
      src/Hotline/Settings/TimeLimits/TimeLimitBaseDataConsts.cs
  39. 13 0
      src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs
  40. 4 0
      src/XF.Domain.Repository/Entity.cs
  41. 1 1
      src/XF.Domain.Repository/XF.Domain.Repository.csproj

+ 40 - 12
src/Hotline.Api/Controllers/HotSpotController.cs

@@ -1,11 +1,17 @@
-using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Caches;
+using Hotline.Repository.SqlSugar.Extensions;
+using Hotline.Settings;
 using Hotline.Settings.Hotspots;
 using Hotline.Settings.TimeLimits;
 using Hotline.Share.Dtos;
-using Hotline.Share.Dtos.Order;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Order;
+using Hotline.Share.Enums.Settings;
 using MapsterMapper;
 using Microsoft.AspNetCore.Mvc;
+using StackExchange.Redis;
 using XF.Domain.Exceptions;
+using XF.Utility.EnumExtensions;
 
 namespace Hotline.Api.Controllers
 {
@@ -18,13 +24,15 @@ namespace Hotline.Api.Controllers
         private readonly IMapper _mapper;
         private readonly ITimeLimitDomainService _timeLimitDomainService;
         private readonly ITimeLimitRepository _timeLimitRepository;
+        private readonly ISysDicDataCacheManager _sysDicDataCacheManager;
 
-        public HotspotController(IHotspotTypeRepository hotspotTypeRepository,IMapper mapper, ITimeLimitDomainService timeLimitDomainService, ITimeLimitRepository timeLimitRepository)
+        public HotspotController(IHotspotTypeRepository hotspotTypeRepository,IMapper mapper, ITimeLimitDomainService timeLimitDomainService, ITimeLimitRepository timeLimitRepository,ISysDicDataCacheManager sysDicDataCacheManager)
         {
             _hotspotTypeRepository = hotspotTypeRepository;
             _mapper = mapper;
             _timeLimitDomainService = timeLimitDomainService;
             _timeLimitRepository = timeLimitRepository;
+            _sysDicDataCacheManager = sysDicDataCacheManager;
         }
 
         #region 热点
@@ -65,6 +73,26 @@ namespace Hotline.Api.Controllers
 
 
         #region 时限管理
+
+        /// <summary>
+        /// 获取时限配置页面基础数据
+        /// </summary>
+        /// <returns></returns>
+        [HttpGet("timelimit-basedata")]
+        public async Task<object> GetTimeLimitBaseData()
+        {
+            return new {
+                BaseData = TimeLimitBaseData.GetBaseData(),
+                AcceptType = EnumExts.GetDescriptions<EAcceptType>(),
+                PushType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.PushType),
+                SourceChannel = EnumExts.GetDescriptions<EChannel>(),
+                IdentityType = EnumExts.GetDescriptions<EIdentityType>(),
+                OrderType = EnumExts.GetDescriptions<EOrderType>(),
+                CertType = _sysDicDataCacheManager.GetSysDicDataCache(TimeLimitBaseDataConsts.CertType),
+                EmergencyLevel = EnumExts.GetDescriptions<EEmergencyLevel>()
+            };
+        }
+
         /// <summary>
         /// 新增时限管理
         /// </summary>
@@ -74,7 +102,7 @@ namespace Hotline.Api.Controllers
         public async Task<string> AddTimeLimit([FromBody]AddTimeLimitDto dto)
         {
             var model = _mapper.Map<TimeLimit>(dto);
-            model.TimeLimitState = Share.Enums.Order.ETimeLimitState.Draft;
+            model.TimeLimitState = ETimeLimitState.Draft;
             return await _timeLimitDomainService.AddAsync(model, HttpContext.RequestAborted);
         }
 
@@ -131,7 +159,7 @@ namespace Hotline.Api.Controllers
             {
                 throw UserFriendlyException.SameMessage("无效数据");
             }
-            if (model.TimeLimitState != Share.Enums.Order.ETimeLimitState.Draft)
+            if (model.TimeLimitState != ETimeLimitState.Draft)
             {
                 throw UserFriendlyException.SameMessage("无法删除,请刷新页面");
             }
@@ -151,13 +179,13 @@ namespace Hotline.Api.Controllers
             {
                 throw UserFriendlyException.SameMessage("无效数据");
             }
-            if (model.TimeLimitState == Share.Enums.Order.ETimeLimitState.Enable)
+            if (model.TimeLimitState == ETimeLimitState.Enable)
             {
                 throw UserFriendlyException.SameMessage("该配置已生效");
             }
-            var list = await _timeLimitRepository.QueryAsync(x => x.WorkflowCode == model.WorkflowCode && x.TimeLimitState == Share.Enums.Order.ETimeLimitState.Enable);
-            list.ForEach(x => x.TimeLimitState = Share.Enums.Order.ETimeLimitState.Disable);
-            model.TimeLimitState = Share.Enums.Order.ETimeLimitState.Enable;
+            var list = await _timeLimitRepository.QueryAsync(x => x.WorkflowCode == model.WorkflowCode && x.TimeLimitState == ETimeLimitState.Enable);
+            list.ForEach(x => x.TimeLimitState = ETimeLimitState.Disable);
+            model.TimeLimitState = ETimeLimitState.Enable;
             list.Add(model);
             await _timeLimitRepository.UpdateRangeAsync(list, HttpContext.RequestAborted);
         }
@@ -175,15 +203,15 @@ namespace Hotline.Api.Controllers
             {
                 throw UserFriendlyException.SameMessage("无效数据");
             }
-            if (model.TimeLimitState == Share.Enums.Order.ETimeLimitState.Draft)
+            if (model.TimeLimitState == ETimeLimitState.Draft)
             {
                 throw UserFriendlyException.SameMessage("该配置未生效,无法禁用");
             }
-            if (model.TimeLimitState == Share.Enums.Order.ETimeLimitState.Disable)
+            if (model.TimeLimitState == ETimeLimitState.Disable)
             {
                 throw UserFriendlyException.SameMessage("该配置已禁用");
             }
-            model.TimeLimitState = Share.Enums.Order.ETimeLimitState.Disable;
+            model.TimeLimitState = ETimeLimitState.Disable;
             await _timeLimitRepository.UpdateAsync(model, HttpContext.RequestAborted);
         }
         #endregion

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

@@ -2,6 +2,7 @@
 using Hotline.FlowEngine.Definitions;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
+using Hotline.Orders.Notifications;
 using Hotline.Repository.SqlSugar.Extensions;
 using Hotline.Settings;
 using Hotline.Settings.Hotspots;
@@ -11,6 +12,7 @@ using Hotline.Share.Dtos.Order;
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 using MapsterMapper;
+using MediatR;
 using Microsoft.AspNetCore.Authorization;
 using Microsoft.AspNetCore.Mvc;
 using XF.Domain.Authentications;
@@ -35,6 +37,7 @@ public class OrderController : BaseController
     private readonly IDefinitionDomainService _definitionDomainService;
     private readonly ISessionContext _sessionContext;
     private readonly IMapper _mapper;
+    private readonly IMediator _mediator;
 
     public OrderController(
         IOrderDomainService orderDomainService,
@@ -46,7 +49,8 @@ public class OrderController : BaseController
         ISystemOrganizeRepository organizeRepository,
         IDefinitionDomainService definitionDomainService,
         ISessionContext sessionContext,
-        IMapper mapper)
+        IMapper mapper,
+        IMediator mediator)
     {
         _orderDomainService = orderDomainService;
         _orderRepository = orderRepository;
@@ -58,6 +62,7 @@ public class OrderController : BaseController
         _definitionDomainService = definitionDomainService;
         _sessionContext = sessionContext;
         _mapper = mapper;
+        _mediator = mediator;
     }
 
     /// <summary>
@@ -68,7 +73,7 @@ public class OrderController : BaseController
     [HttpGet]
     public async Task<PagedDto<OrderDto>> Query([FromQuery] QueryOrderDto dto)
     {
-        var (total, items) = await _orderRepository.Queryable(workflowFilter: false)
+        var (total, items) = await _orderRepository.Queryable()
             .Includes(d => d.Employee)
             .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))
@@ -101,6 +106,7 @@ public class OrderController : BaseController
     {
         var (total, items) = await _orderRepository.Queryable()
             .Where(d => d.FromPhone == dto.PhoneNo)
+            .WhereIF(!string.IsNullOrEmpty(dto.OrderId), d => d.Id != dto.OrderId)
             .OrderByDescending(d => d.CreationTime)
             .ToPagedListAsync(dto.PageIndex, dto.PageSize, HttpContext.RequestAborted);
         return new PagedDto<OrderDto>(total, _mapper.Map<IReadOnlyList<OrderDto>>(items));
@@ -114,15 +120,19 @@ public class OrderController : BaseController
     [HttpGet("{id}")]
     public async Task<OrderDto> Get(string id)
     {
-        var order = await _orderRepository.Queryable(workflowFilter: false)
+        var order = await _orderRepository.Queryable()
             .Includes(d => d.Employee)
             .Includes(d => d.OrderComplain)
             .Includes(d => d.OrderReport)
             .FirstAsync(d => d.Id == id);
-        if (!string.IsNullOrEmpty(order.WorkflowId))
-            order.Workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSupplements: true, cancellationToken: HttpContext.RequestAborted);
+        if (!string.IsNullOrEmpty(order?.WorkflowId))
+            order.Workflow = await _workflowDomainService.GetWorkflowAsync(order.WorkflowId, withSteps: true, withSupplements: true, withAssigns: true, cancellationToken: HttpContext.RequestAborted);
+
+        _mediator.Publish(new GetOrderDetailNotify(order.Workflow, _sessionContext.RequiredUserId,
+            _sessionContext.UserName, _sessionContext.RequiredOrgCode, _sessionContext.OrgName));
 
-        return _mapper.Map<OrderDto>(order);
+        var dto = _mapper.Map<OrderDto>(order);
+        return dto;
     }
 
     /// <summary>
@@ -185,7 +195,7 @@ public class OrderController : BaseController
         if (order.Status != EOrderStatus.Temporary || !string.IsNullOrEmpty(order.WorkflowId))
             throw UserFriendlyException.SameMessage("工单已发起流程");
 
-        var definition = await _definitionDomainService.GetLastVersionDefinitionByModuleCodeAsync(
+        var definition = await _definitionDomainService.GetLastEnableByModuleCodeAsync(
             WorkflowModuleConsts.OrderManage, HttpContext.RequestAborted);
         if (definition is null)
             throw UserFriendlyException.SameMessage("未配置流程模板");

+ 1 - 1
src/Hotline.Api/Controllers/PbxController.cs

@@ -251,7 +251,7 @@ namespace Hotline.Api.Controllers
             else
             {
                 var startWorkflowDto = _mapper.Map<StartWorkflowDto>(dto);
-                var definition = await _definitionDomainService.GetLastVersionDefinitionByModuleCodeAsync(
+                var definition = await _definitionDomainService.GetLastEnableByModuleCodeAsync(
                     WorkflowModuleConsts.TelRestApply, HttpContext.RequestAborted);
                 if (definition is null)
                     throw UserFriendlyException.SameMessage("未配置流程模板");

+ 0 - 1
src/Hotline.Api/Controllers/TestController.cs

@@ -3,7 +3,6 @@ using Hotline.CallCenter.BlackLists;
 using Hotline.CallCenter.Devices;
 using Hotline.CallCenter.Ivrs;
 using Hotline.FlowEngine.Definitions;
-using Hotline.FlowEngine.Notifies;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Identity.Accounts;
 using Hotline.Identity.Roles;

+ 14 - 0
src/Hotline.Api/Controllers/WorkflowController.cs

@@ -190,6 +190,8 @@ public class WorkflowController : BaseController
             throw UserFriendlyException.SameMessage("草稿需发布才能启用");
         if (definition.Status == EDefinitionStatus.Disable)
         {
+            await _definitionDomainService.EnableAsync(definition.ModuleCode, HttpContext.RequestAborted);
+
             definition.Status = EDefinitionStatus.Enable;
             await _definitionRepository.UpdateAsync(definition, HttpContext.RequestAborted);
         }
@@ -275,6 +277,18 @@ public class WorkflowController : BaseController
         await _workflowDomainService.TerminateAsync(workflowId, HttpContext.RequestAborted);
     }
 
+    /// <summary>
+    /// 补充
+    /// </summary>
+    /// <param name="dto"></param>
+    /// <returns></returns>
+    [HttpPost("supplement")]
+    public async Task Supplement([FromBody] SupplementDto dto)
+    {
+        var workflow = await _workflowDomainService.GetWorkflowAsync(dto.WorkflowId);
+        await _workflowDomainService.SupplementAsync(workflow, dto, HttpContext.RequestAborted);
+    }
+
     /// <summary>
     /// 获取跳转参数
     /// </summary>

+ 0 - 9
src/Hotline.Api/appsettings.Development.json

@@ -56,15 +56,6 @@
   "Cors": {
     "Origins": [ "http://localhost:8888", "http://admin.hotline.fw.com", "http://hotline.fw.com" ]
   },
-  "WorkTimeSettings": {
-    "MorningBegin": "08:00",
-    "MorningEnd": "12:00",
-    "AfterBegin": "15:00",
-    "AfterEnd": "21:00",
-    "WorkDay": [ 1, 2, 3, 4, 5, 0, 6 ],
-    "WorkCategory": "08da9b9f-a35d-4ade-8ea7-55e8abbcdefd",
-    "RestCategory": "08daa5f5-ac7a-4ced-8295-1c78baa15f9e"
-  },
   "IdentityConfiguration": {
     "Password": {
       "RequiredLength": 8,

+ 0 - 9
src/Hotline.Api/appsettings.json

@@ -72,15 +72,6 @@
   "Cors": {
     "Origins": [ "http://localhost:8888", "http://admin.hotline.fw.com", "http://hotline.fw.com" ]
   },
-  //"WorkTimeSettings": {
-  //  "MorningBegin": "08:00",
-  //  "MorningEnd": "12:00",
-  //  "AfterBegin": "15:00",
-  //  "AfterEnd": "21:00",
-  //  "WorkDay": [ 1, 2, 3, 4, 5, 0, 6 ],
-  //  "WorkCategory": "08da9b9f-a35d-4ade-8ea7-55e8abbcdefd",
-  //  "RestCategory": "08daa5f5-ac7a-4ced-8295-1c78baa15f9e"
-  //},
   "Exceptionless": {
     "InUse": false,
     "ServerUrl": "http://log.fw.com",

+ 3 - 3
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -58,8 +58,8 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
             throw new UserFriendlyException("非法参数");
 
         var definition = string.IsNullOrEmpty(dto.DefinitionCode)
-            ? await _definitionDomainService.GetLastVersionDefinitionByModuleCodeAsync(dto.DefinitionModuleCode, cancellationToken)
-            : await _definitionDomainService.GetLastVersionDefinitionAsync(dto.DefinitionCode, cancellationToken);
+            ? await _definitionDomainService.GetLastEnableByModuleCodeAsync(dto.DefinitionModuleCode, cancellationToken)
+            : await _definitionDomainService.GetLastEnableAsync(dto.DefinitionCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException("无效模板名称");
         if (definition.Status != EDefinitionStatus.Enable)
@@ -107,7 +107,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     public async Task<IReadOnlyList<NextStepOptions>> GetStartOptionsAsync(string moduleCode, CancellationToken cancellationToken)
     {
         var definition =
-            await _definitionDomainService.GetLastVersionDefinitionByModuleCodeAsync(moduleCode, cancellationToken);
+            await _definitionDomainService.GetLastEnableByModuleCodeAsync(moduleCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException($"无效模块编码, modeuleCode: {moduleCode}", "无效模块编码");
         var startStep = definition.Steps.FirstOrDefault(d => d.StepType == EStepType.Start);

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

@@ -1,5 +1,4 @@
-using Hotline.FlowEngine.Notifies;
-using Hotline.KnowledgeBase;
+using Hotline.FlowEngine.Notifications;
 using Hotline.Settings;
 using Hotline.Share.Enums.Order;
 using MediatR;
@@ -8,11 +7,10 @@ namespace Hotline.Application.Handlers.FlowEngine;
 
 public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
 {
-    private readonly IKnowledgeDomainService _knowledgeDomainService;
 
-    public EndWorkflowHandler(IKnowledgeDomainService knowledgeDomainService)
+    public EndWorkflowHandler()
     {
-        _knowledgeDomainService = knowledgeDomainService;
+
     }
 
     /// <summary>Handles a notification</summary>
@@ -24,11 +22,6 @@ public class EndWorkflowHandler : INotificationHandler<EndWorkflowNotify>
 
         switch (workflow.ModuleCode)
         {
-            case WorkflowModuleConsts.KnowledgeAdd://新增知识库
-            case WorkflowModuleConsts.KnowledgeUpdate://修改知识库
-            case WorkflowModuleConsts.KnowledgeDelete://删除知识库
-                await _knowledgeDomainService.EndWorkKnowledge(workflow, cancellationToken);
-                break;
             case WorkflowModuleConsts.TelRestApply:
                 //TODO 审核通过
                 //notification.Workflow.ExternalId;

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

@@ -1,5 +1,5 @@
 using Hotline.Application.FlowEngine;
-using Hotline.FlowEngine.Notifies;
+using Hotline.FlowEngine.Notifications;
 using Hotline.FlowEngine.Workflows;
 using Hotline.Orders;
 using Hotline.Settings;

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

@@ -3,7 +3,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using Hotline.FlowEngine.Notifies;
+using Hotline.FlowEngine.Notifications;
 using MediatR;
 
 namespace Hotline.Application.Handlers.FlowEngine

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

@@ -4,7 +4,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using Hotline.Application.FlowEngine;
-using Hotline.FlowEngine.Notifies;
+using Hotline.FlowEngine.Notifications;
 using Hotline.Orders;
 using Hotline.Settings;
 using Hotline.Share.Enums.Order;

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

@@ -1,4 +1,4 @@
-using Hotline.FlowEngine.Notifies;
+using Hotline.FlowEngine.Notifications;
 using MediatR;
 
 namespace Hotline.Application.Handlers.FlowEngine;

+ 30 - 0
src/Hotline.Application/Handlers/Order/GetOrderDetailHandler.cs

@@ -0,0 +1,30 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.FlowEngine.Workflows;
+using Hotline.Orders.Notifications;
+using MediatR;
+
+namespace Hotline.Application.Handlers.Order
+{
+    public class GetOrderDetailHandler : INotificationHandler<GetOrderDetailNotify>
+    {
+        private readonly IWorkflowDomainService _workflowDomainService;
+
+        public GetOrderDetailHandler(IWorkflowDomainService workflowDomainService)
+        {
+            _workflowDomainService = workflowDomainService;
+        }
+
+        /// <summary>Handles a notification</summary>
+        /// <param name="notification">The notification</param>
+        /// <param name="cancellationToken">Cancellation token</param>
+        public async Task Handle(GetOrderDetailNotify notification, CancellationToken cancellationToken)
+        {
+            await _workflowDomainService.AcceptAsync(notification.Workflow, notification.UserId, notification.UserName,
+                notification.OrgCode, notification.OrgName, cancellationToken);
+        }
+    }
+}

+ 25 - 5
src/Hotline.Application/Mappers/MapperConfigs.cs

@@ -27,13 +27,13 @@ namespace Hotline.Application.Mappers
                 .Map(d => d.Name, x => x.Name ?? x.UserName);
 
             config.NewConfig<User, UserDto>()
+                .IgnoreIf((s, d) => s.Account == null, d => d.UserName, d => d.Roles)
+                .IgnoreIf((s, d) => s.Organization == null, d => d.OrgName)
                 .Map(d => d.UserName, x => x.Account.UserName)
                 .Map(d => d.OrgName, x => x.Organization.OrgName)
                 .Map(d => d.Roles, x => string.Join(',', x.Account.Roles.Select(d => d.DisplayName)))
                 .Map(d => d.State, x => x.IsDeleted ? "已删除" : "正常")
-                .IgnoreIf((s, d) => s.Account == null, d => d.UserName)
-                .IgnoreIf((s, d) => s.Account == null, d => d.Roles)
-                ;
+                .IgnoreNullValues(true);
 
             config.NewConfig<Role, RoleDto>()
                 .Map(d => d.AccountIds, x => x.Accounts.Select(d => d.Id))
@@ -47,6 +47,18 @@ namespace Hotline.Application.Mappers
             config.ForType<WorkflowStep, WorkflowStep>()
                 .Ignore(d => d.Id);
 
+            config.ForType<WorkflowStep, WorkflowTrace>()
+                .Ignore(d => d.Id)
+                .Map(d => d.StepId, s => s.Id);
+
+            config.ForType<WorkflowSupplement, WorkflowSupplementDto>()
+                .IgnoreIf((s, d) => s.Creator == null, d => d.Creator);
+
+            config.ForType<Workflow, WorkflowDto>()
+                .IgnoreIf((s, d) => s.Assigns == null || !s.Assigns.Any(), d => d.AssignOrgs)
+                .Map(d => d.AssignOrgs, s => string.Join(',', s.Assigns.Select(d => d.OrgName)))
+                ;
+
             #endregion
 
             #region Knowledge
@@ -83,10 +95,18 @@ namespace Hotline.Application.Mappers
                 .IgnoreIf((s, d) => s.OrderReport == null, d => d.OrderReport)
                 .IgnoreIf((s, d) => s.Workflow == null, d => d.Workflow)
                 .IgnoreIf((s, d) => s.Employee == null, d => d.EmployeeName, d => d.EmployeeStaffNo)
-                .Map(d => d.EmployeeName, x => x.Employee.Name)
-                .Map(d => d.EmployeeStaffNo, x => x.Employee.StaffNo)
+                .Ignore(d => d.Workflow.Definition)
+                .Ignore(d => d.Workflow.StepBoxes)
+                .Ignore(d => d.Workflow.Traces)
                 ;
 
+            config.ForType<AddOrderDto, Order>()
+                .IgnoreIf((s, d) => s.OrderComplain == null, d => d.OrderComplain)
+                .IgnoreIf((s, d) => s.OrderReport == null, d => d.OrderReport);
+
+            config.ForType<UpdateOrderDto, Order>()
+                .Inherits<AddOrderDto, Order>();
+
             #endregion
         }
     }

+ 2 - 1
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionFilterBuilder.cs

@@ -44,7 +44,8 @@ public class DataPermissionFilterBuilder : IDataPermissionFilterBuilder, IScopeD
         var userId = _sessionContext.RequiredUserId;
         var orgCode = _sessionContext.RequiredOrgCode;
 
-        return d => d.AssignUserIds.Contains(userId) || d.AssignOrgCodes.Contains(orgCode);
+        return d => SqlFunc.JsonArrayAny(d.AssignUserIds, userId) ||
+                    SqlFunc.JsonArrayAny(d.AssignOrgCodes, orgCode);
     }
 
     //public Expression<Func<TEntity, bool>> BuildIncludeFlowData<TEntity>() where TEntity : class, IEntity<string>, IDataPermission, IWorkflow, new()

+ 1 - 1
src/Hotline.Repository.SqlSugar/Extensions/SqlSugarStartupExtensions.cs

@@ -172,7 +172,7 @@ namespace Hotline.Repository.SqlSugar.Extensions
             /***写AOP等方法***/
             db.Aop.OnLogExecuting = (sql, pars) =>
             {
-                //Log.Information(sql);
+                Log.Information(sql);
             };
             db.Aop.OnError = (exp) =>//SQL报错
             {

+ 1 - 1
src/Hotline.Repository.SqlSugar/Orders/OrderRepository.cs

@@ -38,7 +38,7 @@ namespace Hotline.Repository.SqlSugar.Orders
                 else if (order.AcceptType == EAcceptType.Report)
                 {
                     order.OrderReport.InitDatePermission(_dataPermissionFilterBuilder.DataPermissionManager);
-                    await AddNav(order).Include(d=>d.OrderReport).ExecuteCommandAsync();
+                    await AddNav(order).Include(d => d.OrderReport).ExecuteCommandAsync();
                 }
                 else
                 {

+ 5 - 0
src/Hotline.Share/Dtos/FlowEngine/EndWorkflowDto.cs

@@ -11,4 +11,9 @@ public class EndWorkflowDto
     /// 附件
     /// </summary>
     public List<string> Additions { get; set; } = new();
+}
+
+public class SupplementDto : EndWorkflowDto
+{
+    public string WorkflowId { get; set; }
 }

+ 37 - 2
src/Hotline.Share/Dtos/FlowEngine/WorkflowDto.cs

@@ -1,4 +1,5 @@
-using Hotline.Share.Enums.FlowEngine;
+using Hotline.Share.Dtos.Users;
+using Hotline.Share.Enums.FlowEngine;
 using XF.Utility.EnumExtensions;
 
 namespace Hotline.Share.Dtos.FlowEngine
@@ -9,6 +10,13 @@ namespace Hotline.Share.Dtos.FlowEngine
 
         public string Title { get; set; }
 
+        /// <summary>
+        /// 业务模块名称
+        /// </summary>
+        public string? ModuleName { get; set; }
+
+        public string? ModuleCode { get; set; }
+
         /// <summary>
         /// 到期时间
         /// </summary>
@@ -24,11 +32,36 @@ namespace Hotline.Share.Dtos.FlowEngine
         /// <summary>
         /// 到达当前节点时间(stepBox创建时间)
         /// </summary>
-        public DateTime CurrentStepTime { get; set; }
+        public DateTime? CurrentStepTime { get; set; }
         
         public EWorkflowStatus Status { get; set; }
         public string StatusText => Status.ToString();
 
+        /// <summary>
+        /// 中心直办件
+        /// </summary>
+        public bool IsStraight { get; set; } = true;
+
+        /// <summary>
+        /// 交办时间
+        /// </summary>
+        public DateTime AssignTime { get; set; }
+
+        /// <summary>
+        /// 办理时间限制(如:24小时、7个工作日)
+        /// </summary>
+        public string TimeLimit { get; set; }
+
+        /// <summary>
+        /// 办理意见(冗余,办理中...or 最终办理意见)
+        /// </summary>
+        public string Opinion { get; set; }
+
+        /// <summary>
+        /// 接办部门
+        /// </summary>
+        public string AssignOrgs { get; set; }
+
         public DefinitionDto Definition { get; set; }
 
         /// <summary>
@@ -75,5 +108,7 @@ namespace Hotline.Share.Dtos.FlowEngine
         /// 附件
         /// </summary>
         public List<string> Additions { get; set; } = new();
+
+        public UserDto Creator { get; set; }
     }
 }

+ 35 - 8
src/Hotline.Share/Dtos/Order/OrderDto.cs

@@ -27,7 +27,7 @@ namespace Hotline.Share.Dtos.Order
         /// 工单状态
         /// </summary>
         public EOrderStatus Status { get; set; }
-        
+
         /// <summary>
         /// 开始时间
         /// </summary>
@@ -56,9 +56,6 @@ namespace Hotline.Share.Dtos.Order
         /// </summary>
         public string No { get; set; }
 
-        public string AcceptTypeText => AcceptType.GetDescription();
-        public string EmergencyLevelText => EmergencyLevel.GetDescription();
-
         /// <summary>
         /// 受理人姓名
         /// </summary>
@@ -70,12 +67,43 @@ namespace Hotline.Share.Dtos.Order
         public string? EmployeeStaffNo { get; set; }
 
         public string WorkflowId { get; set; }
+        public WorkflowDto Workflow { get; set; }
+
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public string ChannelText => Channel.GetDescription();
+
+        /// <summary>
+        /// 来电/信人性别
+        /// </summary>
+        public string FromGenderText => FromGender.GetDescription();
+
+        /// <summary>
+        /// 来电/信人身份
+        /// </summary>
+        public string IdentityTypeText => IdentityType.GetDescription();
+
+        /// <summary>
+        /// 工单类型
+        /// </summary>
+        public string OrderTypeText => OrderType.GetDescription();
+
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public string AcceptTypeText => AcceptType.GetDescription();
+
+        /// <summary>
+        /// 紧急程度
+        /// </summary>
+        public string EmergencyLevelText => EmergencyLevel.GetDescription();
 
         /// <summary>
         /// 超期时间描述(需求:超期3天、0.5天后超期)
         /// </summary>
         public string ExpiredText => CalculateExpiredText();
-        
+
         private string CalculateExpiredText()
         {
             //todo 完整处理方案:1.创建待过期表,Id,过期时间,即将过期时间等字段。2.延迟消息通知处理过期,删除子表数据,处理order过期状态字段。3.此处即可采用expiredStatus进行判断
@@ -94,7 +122,6 @@ namespace Hotline.Share.Dtos.Order
             }
         }
 
-        public WorkflowDto Workflow { get; set; }
     }
 
     public class UpdateOrderDto : AddOrderDto
@@ -247,11 +274,11 @@ namespace Hotline.Share.Dtos.Order
         /// <summary>
         /// 投诉
         /// </summary>
-        public OrderComplainDto OrderComplain { get; set; } = new();
+        public OrderComplainDto OrderComplain { get; set; }
 
         /// <summary>
         /// 举报
         /// </summary>
-        public OrderReportDto OrderReport { get; set; } = new();
+        public OrderReportDto OrderReport { get; set; }
     }
 }

+ 1 - 0
src/Hotline.Share/Dtos/Order/QueryOrderHistoryDto.cs

@@ -10,5 +10,6 @@ namespace Hotline.Share.Dtos.Order
     public record QueryOrderHistoryDto : PagedRequest
     {
         public string PhoneNo { get; set; }
+        public string? OrderId { get; set; }
     }
 }

+ 3 - 3
src/Hotline.Share/Dtos/Order/TimeLimitDto.cs → src/Hotline.Share/Dtos/Settings/TimeLimitDto.cs

@@ -1,7 +1,7 @@
 using Hotline.Share.Enums.Order;
 using Hotline.Share.Requests;
 
-namespace Hotline.Share.Dtos.Order
+namespace Hotline.Share.Dtos.Settings
 {
     public record AddTimeLimitDto
     {
@@ -129,12 +129,12 @@ namespace Hotline.Share.Dtos.Order
 
     #endregion
 
-    public record UpdateTimeLimitDto:AddTimeLimitDto
+    public record UpdateTimeLimitDto : AddTimeLimitDto
     {
         public string Id { get; set; }
     }
 
-    public record QueryPagedTimeLimitPagedDto: PagedKeywordRequest
+    public record QueryPagedTimeLimitPagedDto : PagedKeywordRequest
     {
 
     }

+ 2 - 2
src/Hotline.Share/Enums/Order/ETimeLimitState.cs → src/Hotline.Share/Enums/Settings/ETimeLimitState.cs

@@ -5,7 +5,7 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 
-namespace Hotline.Share.Enums.Order
+namespace Hotline.Share.Enums.Settings
 {
     public enum ETimeLimitState
     {
@@ -14,6 +14,6 @@ namespace Hotline.Share.Enums.Order
         [Description("启用")]
         Enable = 1,
         [Description("禁用")]
-        Disable =2,
+        Disable = 2,
     }
 }

+ 11 - 0
src/Hotline.Share/Enums/Settings/ETimeLimitType.cs

@@ -0,0 +1,11 @@
+
+namespace Hotline.Share.Enums.Settings
+{
+    public enum ETimeLimitType
+    {
+        Enum = 0,
+        HotPots = 1,
+        DicData =2,
+        DefaultTime = 3,
+    }
+}

+ 0 - 35
src/Hotline/FileStorage/File.cs

@@ -1,35 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using XF.Domain.Repository;
-
-namespace Hotline.FileStorage
-{
-    public class File //: FullStateEntity
-    {
-        public EFileSType FileSType { get; set; }
-
-        public string Name { get; set; }
-
-        public string Extention { get; set; }
-
-        public string FullName { get; set; }
-
-        /// <summary>
-        /// 相对路劲
-        /// </summary>
-        public string Path { get; set; }
-
-        public string FullPath { get; set; }
-
-        public string Size { get; set; }
-    }
-
-    public enum EFileSType
-    {
-        Image = 0,
-
-    }
-}

+ 48 - 8
src/Hotline/FlowEngine/Definitions/DefinitionDomainService.cs

@@ -43,9 +43,27 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
         definitionTemp.Version = lastVersion + 1;
         definitionTemp.Status = EDefinitionStatus.Enable;
 
+        await EnableAsync(definitionTemp.ModuleCode!, cancellationToken);
+
         await _definitionRepository.UpdateAsync(definitionTemp, cancellationToken);
     }
 
+    /// <summary>
+    /// 禁用指定业务模块下所有模板
+    /// </summary>
+    /// <param name="moduleCode"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async Task EnableAsync(string moduleCode, CancellationToken cancellationToken)
+    {
+        if (string.IsNullOrEmpty(moduleCode))
+            throw new UserFriendlyException("moduleCode为空");
+        var definitions = await _definitionRepository.QueryAsync(d =>
+            d.ModuleCode == moduleCode && d.Status == EDefinitionStatus.Enable);
+        definitions.ForEach(d => d.Status = EDefinitionStatus.Disable);
+        await _definitionRepository.UpdateRangeAsync(definitions, cancellationToken);
+    }
+
     /// <summary>
     /// 发布(保存并发布)
     /// </summary>
@@ -55,30 +73,52 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
         await PublishAsync(id, cancellationToken);
     }
 
+    /// <summary>
+    /// 查询最大版本号(含启用、禁用)
+    /// </summary>
+    /// <param name="code"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
     public async Task<int> GetLastVersionAsync(string code, CancellationToken cancellationToken)
     {
-        var definition = await GetLastVersionDefinitionAsync(code, cancellationToken);
-        return definition?.Version ?? 0;
+        return await _definitionRepository.Queryable()
+            .Where(d => d.Code == code)
+            .MaxAsync(d => d.Version);
+
+        //var definition = await GetLastVersionDefinitionAsync(code, enable, cancellationToken);
+        //return definition?.Version ?? 0;
     }
 
-    public async Task<Definition?> GetLastVersionDefinitionAsync(string code, CancellationToken cancellationToken)
+    /// <summary>
+    /// 查询已启用的最后版本
+    /// </summary>
+    /// <param name="moduleCode"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async Task<Definition?> GetLastEnableByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken)
     {
         return await _definitionRepository.Queryable()
-            .Where(d => d.Code == code)
+            .Where(d => d.ModuleCode == moduleCode && d.Status == EDefinitionStatus.Enable)
             .OrderByDescending(d => d.Version)
             .Take(1)
             .FirstAsync();
     }
 
-    public async Task<Definition?> GetLastVersionDefinitionByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken)
+    /// <summary>
+    /// 查询已启用的最后版本
+    /// </summary>
+    /// <param name="code"></param>
+    /// <param name="cancellationToken"></param>
+    /// <returns></returns>
+    public async Task<Definition?> GetLastEnableAsync(string code, CancellationToken cancellationToken)
     {
         return await _definitionRepository.Queryable()
-            .Where(d => d.ModuleCode == moduleCode)
+            .Where(d => d.Code == code && d.Status == EDefinitionStatus.Enable)
             .OrderByDescending(d => d.Version)
             .Take(1)
             .FirstAsync();
     }
-
+    
     /// <summary>
     /// 未开启的流程,查找第2个节点的模板配置信息,用作开始流程的时候传参
     /// </summary>
@@ -87,7 +127,7 @@ public class DefinitionDomainService : IDefinitionDomainService, IScopeDependenc
     /// <returns></returns>
     public async Task<IReadOnlyList<StepDefine>> GetSecondStepsAsync(string definitionCode, CancellationToken cancellationToken)
     {
-        var definition = await GetLastVersionDefinitionAsync(definitionCode, cancellationToken);
+        var definition = await GetLastEnableAsync(definitionCode, cancellationToken);
         if (definition == null)
             throw new UserFriendlyException($"无效模板编码, code:{definitionCode}", "无效模板编码");
         return definition.FindSteps(definition.FindStartStep().NextSteps);

+ 27 - 2
src/Hotline/FlowEngine/Definitions/IDefinitionDomainService.cs

@@ -16,9 +16,34 @@ namespace Hotline.FlowEngine.Definitions
         /// </summary>
         Task PublishAsync(AddDefinitionDto dto, CancellationToken cancellationToken);
 
+        /// <summary>
+        /// 查询最大版本号(含启用、禁用)
+        /// </summary>
+        /// <param name="code"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
         Task<int> GetLastVersionAsync(string code, CancellationToken cancellationToken);
-        Task<Definition?> GetLastVersionDefinitionAsync(string code, CancellationToken cancellationToken);
-        Task<Definition?> GetLastVersionDefinitionByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 查询已启用的最后版本
+        /// </summary>
+        /// <param name="code"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task<Definition?> GetLastEnableAsync(string code, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 查询已启用的最后版本
+        /// </summary>
+        /// <param name="moduleCode"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        Task<Definition?> GetLastEnableByModuleCodeAsync(string moduleCode, CancellationToken cancellationToken);
+
+        /// <summary>
+        /// 禁用指定业务模块下所有模板
+        /// </summary>
+        Task EnableAsync(string moduleCode, CancellationToken cancellationToken);
 
         /// <summary>
         /// 未开启的流程,查找start节点配置的nextSteps信息,用作开启流程的传参

+ 1 - 2
src/Hotline/FlowEngine/Notifies/WorkflowNotify.cs → src/Hotline/FlowEngine/Notifications/WorkflowNotify.cs

@@ -2,9 +2,8 @@
 using Hotline.FlowEngine.Workflows;
 using Hotline.Share.Dtos.FlowEngine;
 using MediatR;
-using XF.Domain.Entities;
 
-namespace Hotline.FlowEngine.Notifies;
+namespace Hotline.FlowEngine.Notifications;
 
 public record WorkflowNotify(Workflow Workflow, StepDefine StepDefine, BasicWorkflowDto Dto) : INotification;
 

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

@@ -22,7 +22,7 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 受理,接办
         /// </summary>
-        Task AcceptAsync(Workflow workflow, CancellationToken cancellationToken);
+        Task AcceptAsync(Workflow workflow, string userId, string userName, string orgCode, string orgName, CancellationToken cancellationToken);
 
         /// <summary>
         /// 办理(流转至下一节点)

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

@@ -1,5 +1,5 @@
 using Hotline.FlowEngine.Definitions;
-using Hotline.FlowEngine.Notifies;
+using Hotline.FlowEngine.Notifications;
 using Hotline.SeedData;
 using Hotline.Share.Dtos.FlowEngine;
 using Hotline.Share.Enums.FlowEngine;
@@ -112,7 +112,7 @@ namespace Hotline.FlowEngine.Workflows
             if (withDefine)
                 query = query.Includes(d => d.Definition);
             if (withSupplements)
-                query = query.Includes(d => d.Supplements);
+                query = query.Includes(d => d.Supplements, d => d.Creator);
             if (withAssigns)
                 query = query.Includes(d => d.Assigns);
 
@@ -144,30 +144,30 @@ namespace Hotline.FlowEngine.Workflows
         /// <summary>
         /// 受理(接办)
         /// </summary>
-        public async Task AcceptAsync(Workflow workflow, CancellationToken cancellationToken)
+        public async Task AcceptAsync(Workflow workflow, string userId, string userName, string orgCode, string orgName, CancellationToken cancellationToken)
         {
             //工单完成以后查看的场景
             if (workflow.Status is not EWorkflowStatus.Runnable) return;
 
-            var (currentStepBox, currentStep) = GetUnCompleteStepOrDefault(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
+            var (currentStepBox, currentStep) = GetUnCompleteStepOrDefault(workflow.StepBoxes, orgCode, userId);
             if (currentStep is null) return;
             if (currentStep.Status is EWorkflowStepStatus.Accepted) return;
             if (currentStep.HandlerType is EHandlerType.AssignUser or EHandlerType.Role)
             {
                 //userId
-                if (currentStep.HandlerId != _sessionContext.RequiredUserId) return;
+                if (currentStep.HandlerId != userId) return;
             }
             else
             {
                 //orgId
-                if (currentStep.HandlerId != _sessionContext.RequiredOrgCode) return;
+                if (currentStep.HandlerId != orgCode) return;
             }
             if (currentStep.StepType is EStepType.End)
                 throw new UserFriendlyException("当前流程已流转到最终步骤");
 
             if (currentStepBox.Status is EWorkflowStepStatus.Assigned)
                 currentStepBox.Status = EWorkflowStepStatus.Accepted;
-            currentStep.Accept(_sessionContext.RequiredUserId, _sessionContext.UserName);
+            currentStep.Accept(userId, userName);
 
             //接办时非会签并且有多个接办部门时需更新接办部门
             if (!workflow.IsInCountersign())
@@ -177,7 +177,7 @@ namespace Hotline.FlowEngine.Workflows
                 {
                     await _workflowAssignRepository.RemoveRangeAsync(assigns, cancellationToken);
 
-                    var assign = WorkflowAssign.Create(workflow.Id, _sessionContext.OrgCode, _sessionContext.OrgName);
+                    var assign = WorkflowAssign.Create(workflow.Id, orgCode, orgName);
                     await _workflowAssignRepository.AddAsync(assign, cancellationToken);
                 }
             }
@@ -198,7 +198,12 @@ namespace Hotline.FlowEngine.Workflows
 
             var (currentStepBox, currentStep) = GetUnCompleteStep(workflow.StepBoxes, _sessionContext.RequiredOrgCode, _sessionContext.RequiredUserId);
             if (currentStep.Status is EWorkflowStepStatus.Assigned)
-                await AcceptAsync(workflow, cancellationToken);
+                await AcceptAsync(workflow,
+                    _sessionContext.RequiredUserId,
+                    _sessionContext.UserName,
+                    _sessionContext.RequiredOrgCode,
+                    _sessionContext.OrgName,
+                    cancellationToken);
             if (currentStep.StepType is EStepType.End)
                 throw new UserFriendlyException("当前流程已流转到最终步骤");
 
@@ -644,7 +649,7 @@ namespace Hotline.FlowEngine.Workflows
                 await _workflowStepRepository.AddAsync(stepBox, cancellationToken);
             }
 
-            if (stepBoxDefine.StepType is EStepType.CountersignEnd)
+            if (stepBoxDefine.StepType is EStepType.CountersignEnd && workflow.IsInCountersign())
             {
                 if (prevStep is null)
                     throw new UserFriendlyException($"汇总节点的上级节点不能为空节点,workflowId: {workflow.Id}", "创建汇总节点异常");

+ 5 - 1
src/Hotline/FlowEngine/Workflows/WorkflowSupplement.cs

@@ -1,4 +1,5 @@
-using SqlSugar;
+using Hotline.Users;
+using SqlSugar;
 using XF.Domain.Repository;
 
 namespace Hotline.FlowEngine.Workflows;
@@ -21,4 +22,7 @@ public class WorkflowSupplement : CreationEntity
     /// </summary>
     [SugarColumn(ColumnDataType = "varchar(2000)", IsJson = true)]
     public List<string> Additions { get; set; } = new();
+
+    [Navigate(NavigateType.OneToOne, nameof(CreatorId))]
+    public User Creator { get; set; }
 }

+ 4 - 0
src/Hotline/Hotline.csproj

@@ -22,4 +22,8 @@
     <ProjectReference Include="..\XF.Domain.Repository\XF.Domain.Repository.csproj" />
   </ItemGroup>
 
+  <ItemGroup>
+    <Folder Include="FileStorage\" />
+  </ItemGroup>
+
 </Project>

+ 31 - 0
src/Hotline/Orders/Notifications/GetOrderDetailNotify.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Hotline.FlowEngine.Workflows;
+using MediatR;
+
+namespace Hotline.Orders.Notifications
+{
+    /// <summary>
+    /// 查询工单详情
+    /// </summary>
+    public class GetOrderDetailNotify : INotification
+    {
+        public GetOrderDetailNotify(Workflow workflow, string userId, string userName, string orgCode, string orgName)
+        {
+            Workflow = workflow;
+            UserId = userId;
+            UserName = userName;
+            OrgCode = orgCode;
+            OrgName = orgName;
+        }
+
+        public string UserId { get; set; }
+        public string UserName { get; set; }
+        public string OrgCode { get; set; }
+        public string OrgName { get; set; }
+        public Workflow Workflow { get; set; }
+    }
+}

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

@@ -30,7 +30,7 @@ public class OrderDomainService : IOrderDomainService, IScopeDependency
     {
         if (order.AcceptType == EAcceptType.Complain && order.OrderComplain == null)
             throw UserFriendlyException.SameMessage("非法投诉参数");
-        if (order.AcceptType == EAcceptType.Complain && order.OrderReport == null)
+        if (order.AcceptType == EAcceptType.Report && order.OrderReport == null)
             throw UserFriendlyException.SameMessage("非法举报参数");
 
         order.Init(_sessionContext.RequiredUserId);

+ 2 - 2
src/Hotline/Settings/SystemOrganize.cs

@@ -34,13 +34,13 @@ public class SystemOrganize : CreationEntity
     /// <summary>
     /// 上级ID
     /// </summary>
-    [SugarColumn(IsIgnore = true)]
+    [SugarColumn(IsNullable = true)]
     public string? ParentId { get; set; }
 
     /// <summary>
     /// 上级名称
     /// </summary>
-    [SugarColumn(IsIgnore = true)]
+    [SugarColumn(IsNullable = true)]
     public string? ParentName { get; set; }
 
     /// <summary>

+ 48 - 2
src/Hotline/Settings/TimeLimits/TimeLimit.cs

@@ -1,5 +1,5 @@
-using Hotline.Share.Dtos.Order;
-using Hotline.Share.Enums.Order;
+using Hotline.Share.Dtos.Settings;
+using Hotline.Share.Enums.Settings;
 using SqlSugar;
 using XF.Domain.Repository;
 
@@ -31,6 +31,52 @@ namespace Hotline.Settings.TimeLimits
         [SugarColumn(ColumnDataType = "longtext", IsJson = true, IsNullable = true)]
         public List<CombinationModel>? Combination { get; set; }
 
+    }
+
+
+    public class TimeLimitBaseDataModel
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 业务流程编码(多个使用“,”分隔)
+        /// </summary>
+        public string WorkflowCodes { get; set; }
+
+        public ETimeLimitType TimeLimitType { get; set; }
 
+        public string TypeCode { get; set; }
+
+        //public static GetBaseData
+        public TimeLimitBaseDataModel(string id,string name,string workflowCodes, ETimeLimitType timelimitType,string typeCode)
+        {
+            Id = id;
+            Name = name;
+            WorkflowCodes = workflowCodes;
+            TimeLimitType = timelimitType;
+            TypeCode = typeCode;
+        }
+    }
+
+
+    public static class TimeLimitBaseData
+    {
+        public static List<TimeLimitBaseDataModel> GetBaseData()
+        {
+            return new List<TimeLimitBaseDataModel>()
+            {
+                new TimeLimitBaseDataModel("82fde961-b1a7-11ed-ad8e-005056a2d053","受理类型", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.AcceptType),
+                new TimeLimitBaseDataModel("33b756f6-b1a9-11ed-ad8e-005056a2d053", "热点分类","Order",ETimeLimitType.HotPots,TimeLimitBaseDataConsts.HotPots),
+                new TimeLimitBaseDataModel("c45da596-b1aa-11ed-ad8e-005056a2d053", "推送分类", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.PushType),
+                new TimeLimitBaseDataModel("ee78d588-b1aa-11ed-ad8e-005056a2d053", "来源渠道", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.SourceChannel),
+                new TimeLimitBaseDataModel("8f9209d1-b1ab-11ed-ad8e-005056a2d053", "来电人身份", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.IdentityType),
+                new TimeLimitBaseDataModel("d6100e08-b1ab-11ed-ad8e-005056a2d053", "工单类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.OrderType),
+                new TimeLimitBaseDataModel("f21424ff-b1ab-11ed-ad8e-005056a2d053", "证件类型", "Order", ETimeLimitType.DicData, TimeLimitBaseDataConsts.CertType),
+                new TimeLimitBaseDataModel("bda69be9-b1b2-11ed-ad8e-005056a2d053", "紧急程度", "Order", ETimeLimitType.Enum, TimeLimitBaseDataConsts.EmergencyLevel),
+                new TimeLimitBaseDataModel("cd3b29dd-b1bf-11ed-ad8e-005056a2d053","默认参数","ZengBie,KnowledgeAdd",ETimeLimitType.DefaultTime,TimeLimitBaseDataConsts.DefaultTime)
+            };
+        }
     }
 }

+ 48 - 0
src/Hotline/Settings/TimeLimits/TimeLimitBaseDataConsts.cs

@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Hotline.Settings.TimeLimits
+{
+    public class TimeLimitBaseDataConsts
+    {
+        /// <summary>
+        /// 受理类型
+        /// </summary>
+        public const string AcceptType = "AcceptType";
+        /// <summary>
+        /// 热点分类
+        /// </summary>
+        public const string HotPots = "HotPots";
+        /// <summary>
+        /// 推送分类
+        /// </summary>
+        public const string PushType = "PushType";
+        /// <summary>
+        /// 来源渠道
+        /// </summary>
+        public const string SourceChannel = "SourceChannel";
+        /// <summary>
+        /// 来电人身份
+        /// </summary>
+        public const string IdentityType = "IdentityType";
+        /// <summary>
+        /// 工单类型
+        /// </summary>
+        public const string OrderType = "OrderType";
+        /// <summary>
+        /// 证件类型
+        /// </summary>
+        public const string CertType = "CertType";
+        /// <summary>
+        /// 紧急程度
+        /// </summary>
+        public const string EmergencyLevel = "EmergencyLevel";
+        /// <summary>
+        /// 默认参数
+        /// </summary>
+        public const string DefaultTime = "DefaultTime";
+    }
+}

+ 13 - 0
src/Hotline/Settings/TimeLimits/TimeLimitDomainService.cs

@@ -26,5 +26,18 @@ namespace Hotline.Settings.TimeLimits
             }
             await _timeLimitRepository.UpdateAsync(model, cancellationToken);
         }
+
+
+        //public async Task<(string, int)> Get(string WorkflowCode,DateTime BeginTime,Dictionary<string,string> param)
+        //{
+        //    //1>> 取出对应已启用的配置
+        //    var model = await _timeLimitRepository.GetAsync(x => x.WorkflowCode == WorkflowCode && x.TimeLimitState == Share.Enums.Settings.ETimeLimitState.Enable);
+        //    if (model!=null)
+        //    {
+
+        //    }
+        //}
+
+
     }
 }

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

@@ -157,6 +157,7 @@ public abstract class WorkflowEntity : FullStateEntity, IWorkflow
 
     public void Assign(EFlowAssignType type, string handler)
     {
+        handler = handler.ToLower();
         switch (type)
         {
             case EFlowAssignType.Org:
@@ -175,6 +176,7 @@ public abstract class WorkflowEntity : FullStateEntity, IWorkflow
 
     public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
     {
+        handlers.ToList().ForEach(d => d.ToLower());
         switch (type)
         {
             case EFlowAssignType.Org:
@@ -250,6 +252,7 @@ public abstract class PositionWorkflowEntity : PositionEntity, IWorkflow
 
     public void Assign(EFlowAssignType type, string handler)
     {
+        handler = handler.ToLower();
         switch (type)
         {
             case EFlowAssignType.Org:
@@ -268,6 +271,7 @@ public abstract class PositionWorkflowEntity : PositionEntity, IWorkflow
 
     public void Assign(EFlowAssignType type, IEnumerable<string> handlers)
     {
+        handlers.ToList().ForEach(d => d.ToLower());
         switch (type)
         {
             case EFlowAssignType.Org:

+ 1 - 1
src/XF.Domain.Repository/XF.Domain.Repository.csproj

@@ -9,7 +9,7 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="SqlSugarCore" Version="5.1.3.40" />
+    <PackageReference Include="SqlSugarCore" Version="5.1.3.52-preview04" />
   </ItemGroup>
 
   <ItemGroup>