Bladeren bron

Merge branch 'master' into tangj-knowledge

TANG JIANG 2 jaren geleden
bovenliggende
commit
f3e5d7fb3f

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

@@ -85,6 +85,19 @@ public class WorkflowController : BaseController
         return new PagedDto<DefinitionDto>(total, _mapper.Map<IReadOnlyList<DefinitionDto>>(items));
     }
 
+    /// <summary>
+    /// 查询流程模板
+    /// </summary>
+    /// <param name="id"></param>
+    /// <returns></returns>
+    [HttpGet("definition/{id}")]
+    public async Task<DefinitionDto> GetDefinition(string id)
+    {
+        var definition = await _definitionRepository.GetAsync(id, HttpContext.RequestAborted);
+        if (definition == null) return new();
+        return _mapper.Map<DefinitionDto>(definition);
+    }
+
     /// <summary>
     /// 新增流程模板草稿
     /// </summary>

+ 6 - 7
src/Hotline.Application/FlowEngine/WorkflowApplication.cs

@@ -17,20 +17,20 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     private readonly IDefinitionDomainService _definitionDomainService;
     private readonly IWorkflowDomainService _workflowDomainService;
     private readonly IWorkflowRepository _workflowRepository;
-    private readonly IUserRepository _userRepository;
+    private readonly IUserDomainService _userDomainService;
     private readonly ISessionContext _sessionContext;
 
     public WorkflowApplication(
         IDefinitionDomainService definitionDomainService,
         IWorkflowDomainService workflowDomainService,
         IWorkflowRepository workflowRepository,
-        IUserRepository userRepository,
+        IUserDomainService userDomainService,
         ISessionContext sessionContext)
     {
         _definitionDomainService = definitionDomainService;
         _workflowDomainService = workflowDomainService;
         _workflowRepository = workflowRepository;
-        _userRepository = userRepository;
+        _userDomainService = userDomainService;
         _sessionContext = sessionContext;
     }
 
@@ -67,7 +67,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
 
     private async Task<bool> CheckIfFlowOutOfCallCenterAsync(StepDefine nextStepBoxDefine, string mainHandler, CancellationToken CancellationToken)
     {
-        //todo current is center & next is not center return true
+        //current is center & next is not center return true
         var isFromCallCenter = IsOrgFromCallCenter(_sessionContext.RequiredOrgCode);
         if (!isFromCallCenter) return false;
 
@@ -80,8 +80,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
         if (nextStepBoxDefine.HandlerType is EHandlerType.AssignUser or EHandlerType.Role)
         {
             //mainHandler is userId
-            //todo 临时处理方案(暂时耦合user)
-            var handler = await _userRepository.GetAsync(mainHandler, cancellationToken);
+            var handler = await _userDomainService.GetUserAsync(mainHandler, cancellationToken);
             if (handler == null)
                 throw new UserFriendlyException($"mainHandler未找到对应User, handler: {mainHandler}");
             if (string.IsNullOrEmpty(handler.OrgCode))
@@ -100,7 +99,7 @@ public class WorkflowApplication : IWorkflowApplication, IScopeDependency
     /// 是否为呼叫中心部门
     /// </summary>
     /// <returns></returns>
-    private bool IsOrgFromCallCenter(string orgCode) => orgCode.StartsWith(OrgSeedData.Code);
+    private bool IsOrgFromCallCenter(string orgCode) => orgCode.StartsWith(OrgSeedData.CallCenterCode);
 
 
 

+ 10 - 9
src/Hotline.Repository.SqlSugar/DataPermissions/DataPermissionManager.cs

@@ -22,6 +22,7 @@ public class DataPermissionManager : IDataPermissionManager, IScopeDependency
     public DataPermissionScheme GetQueryFilter<TEntity>(ISessionContext sessionContext) where TEntity : class, IEntity<string>, IDataPermission, new()
     {
         EAuthorityType? queryFilter = GetCurrentQueryFilter(sessionContext.Roles, typeof(TEntity).Name);
+
         if (queryFilter == null)
         {
             
@@ -54,28 +55,28 @@ public class DataPermissionManager : IDataPermissionManager, IScopeDependency
     public (string orgId,string departmentCode, string creatorId, string? areaId) GetDataPermissionOptions()
     {
         using var scope = _serviceScopeFactory.CreateScope();
-        var userRepository = scope.ServiceProvider.GetService<IUserRepository>();
-        var user = userRepository!.GetAsync(_sessionContext.RequiredUserId).Result;
+        var userRepository = scope.ServiceProvider.GetRequiredService<IUserRepository>();
+        var user = userRepository.GetAsync(_sessionContext.RequiredUserId).GetAwaiter().GetResult();
         if (!string.IsNullOrEmpty(user!.OrgId))
         {
-            var orgRepository = scope.ServiceProvider.GetService<ISystemOrganizeRepository>();
-            var org = orgRepository!.GetAsync(user!.OrgId).Result;
+            var orgRepository = scope.ServiceProvider.GetRequiredService<ISystemOrganizeRepository>();
+            var org = orgRepository!.GetAsync(user!.OrgId).GetAwaiter().GetResult();
 
             return (org!.Id, org.OrgCode, _sessionContext.RequiredUserId, org.OrgCode);
         }
         return ("", "", _sessionContext.RequiredUserId, "");
     }
 
-    private EAuthorityType? GetCurrentQueryFilter(string[] roles, string entityName)
+    private EAuthorityType GetCurrentQueryFilter(string[] roles, string entityName)
     {
         using var scope = _serviceScopeFactory.CreateScope();
-        var systemDataTableRepository = scope.ServiceProvider.GetService<ISystemDataTableRepository>();
-        var systemDataAuthorityRepository = scope.ServiceProvider.GetService<ISystemDataAuthorityRepository>();
+        var systemDataTableRepository = scope.ServiceProvider.GetRequiredService<ISystemDataTableRepository>();
+        var systemDataAuthorityRepository = scope.ServiceProvider.GetRequiredService<ISystemDataAuthorityRepository>();
 
         ////查询对应表配置
-        var tableModel = systemDataTableRepository!.GetAsync(x => x.EntityName == entityName).Result;
+        var tableModel = systemDataTableRepository.GetAsync(x => x.EntityName == entityName).GetAwaiter().GetResult();
         ////查询表对应最高数据权限
-        var auth = systemDataAuthorityRepository!.GetMyTopDataAuth(roles, tableModel!.Id);
+        var auth = systemDataAuthorityRepository.GetMyTopDataAuth(roles, tableModel!.Id);
         return auth;
     }
 }

+ 15 - 0
src/Hotline.Repository.SqlSugar/Orders/HotSpotTypeRepository.cs

@@ -0,0 +1,15 @@
+using Hotline.CallCenter.BlackLists;
+using Hotline.Orders;
+using Hotline.Repository.SqlSugar.DataPermissions;
+using SqlSugar;
+using XF.Domain.Dependency;
+
+namespace Hotline.Repository.SqlSugar.Orders
+{
+    public class HotSpotTypeRepository : BaseRepository<HotSpotType>, IHotSpotTypeRepository, IScopeDependency
+    {
+        public HotSpotTypeRepository(ISugarUnitOfWork<HotlineDbContext> uow, IDataPermissionFilterBuilder dataPermissionFilterBuilder) : base(uow, dataPermissionFilterBuilder)
+        {
+        }
+    }
+}

+ 1 - 1
src/Hotline.Repository.SqlSugar/System/SystemDataAuthorityRepository.cs

@@ -12,7 +12,7 @@ namespace Hotline.Repository.SqlSugar.System
         {
         }
 
-        public EAuthorityType? GetMyTopDataAuth(string[] roles,string tableid)
+        public EAuthorityType GetMyTopDataAuth(string[] roles,string tableid)
         {
             var dataAuth =Db.Queryable<SystemDataAuthority>().Where(x => roles.Contains(x.RoleCode) && x.TableId == tableid).Min(x=>x.AuthorityType);
             return dataAuth;

+ 1 - 1
src/Hotline.Share/Dtos/FlowEngine/DefinitionDto.cs

@@ -33,7 +33,7 @@ namespace Hotline.Share.Dtos.FlowEngine
         /// </summary>
         public int Version { get; set; }
 
-        public string Description { get; set; }
+        public string? Description { get; set; }
 
         public List<StepDefineDto> Steps { get; set; }
         

+ 2 - 1
src/Hotline/FlowEngine/Definitions/Definition.cs

@@ -23,7 +23,8 @@ public class Definition : CreationEntity
     /// </summary>
     public int Version { get; set; }
 
-    public string Description { get; set; }
+    [SugarColumn(IsNullable = true)]
+    public string? Description { get; set; }
 
     [SugarColumn(ColumnDataType = "varchar(4000)", IsJson = true)]
     public List<StepDefine> Steps { get; set; } = new();

+ 20 - 0
src/Hotline/FlowEngine/Workflows/Workflow.cs

@@ -47,6 +47,26 @@ public class Workflow : CreationEntity
     /// </summary>
     public string? CurrentCountersignStepCode { get; set; }
 
+    /// <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>
+    [SugarColumn(Length = 2000)]
+    public string Opinion { get; set; } = "办理中...";
 
     [Navigate(NavigateType.OneToOne, nameof(DefinitionId))]
     public Definition Definition { get; set; }

+ 21 - 0
src/Hotline/FlowEngine/Workflows/WorkflowAssign.cs

@@ -0,0 +1,21 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using XF.Domain.Repository;
+
+namespace Hotline.FlowEngine.Workflows
+{
+    /// <summary>
+    /// 接办部门(上级办理时指派了下级,即生成记录)
+    /// </summary>
+    public class WorkflowAssign : CreationEntity
+    {
+        public string WorkflowId { get; set; }
+
+        public string OrgCode { get; set; }
+
+        public string OrgName { get; set; }
+    }
+}

+ 27 - 2
src/Hotline/FlowEngine/Workflows/WorkflowDomainService.cs

@@ -52,19 +52,22 @@ namespace Hotline.FlowEngine.Workflows
                 ModuleCode = definition.ModuleCode,
                 DefinitionId = definition.Id,
                 Status = EWorkflowStatus.Runnable,
+                TimeLimit = GetTimeLimit(definition.Code),
                 ExpiredTime = GenerateExpiredTime(definition.Code),
                 StepBoxes = new(),
                 Traces = new(),
                 Definition = definition
             };
 
+            workflow.AssignTime = workflow.CreationTime;
+
             await _workflowRepository.AddAsync(workflow, cancellationToken);
 
             return workflow;
         }
 
         /// <summary>
-        /// 进行流程开始节点
+        /// 流程开始
         /// </summary>
         /// <param name="workflow"></param>
         /// <param name="dto"></param>
@@ -86,8 +89,8 @@ namespace Hotline.FlowEngine.Workflows
             //第二节点的previousId is string.Empty
             await CreateStepAsync(workflow, nextStepBoxDefine, dto, cancellationToken: cancellationToken);
 
-            var assignMode = nextStepBoxDefine.GetFlowAssignMode(dto.Handlers);
             //publish
+            var assignMode = nextStepBoxDefine.GetFlowAssignMode(dto.Handlers);
             _mediator.Publish(new StartWorkflowNotify(workflow, assignMode.assignType, assignMode.handlers, dto), cancellationToken);
         }
 
@@ -230,7 +233,17 @@ namespace Hotline.FlowEngine.Workflows
 
             //是否从中心流转出去,重新计算expiredTime 
             if (isOutOfCallCenter)
+            {
+                workflow.IsStraight = false;
                 workflow.ExpiredTime = GenerateExpiredTime(workflow.Definition.Code);
+                workflow.AssignTime = DateTime.Now;
+            }
+
+            //更新当前接办部门
+            if (nextStepBoxDefine.StepType is EStepType.Normal)
+            {
+
+            }
 
             //创建下一节点
             var nextStepBox = await CreateStepAsync(workflow, nextStepBoxDefine, dto, currentStepBox, currentStep, cancellationToken);
@@ -763,9 +776,21 @@ namespace Hotline.FlowEngine.Workflows
         /// <returns></returns>
         private DateTime GenerateExpiredTime(string defineCode)
         {
+            //GetConfig(string defineCode).Time
             return DateTime.Now.AddDays(7); //todo 依据配置生成, Think about 工作日
         }
 
+        private string GetTimeLimit(string defineCode)
+        {
+            //return GetConfig(string defineCode).Description;
+            return "7个工作日";
+        }
+
+        //private ConfigInCludeDescriptionAndTime GetConfig(string defineCode)
+        //{
+        //    throw new NotImplementedException();
+        //}
+
         #endregion
 
     }

+ 26 - 0
src/Hotline/Orders/HotSpotType.cs

@@ -0,0 +1,26 @@
+
+using SqlSugar;
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    /// <summary>
+    /// 热点基础数据
+    /// </summary>
+    [SugarIndex("unique_hotspottype_name", nameof(HotSpotType.HotSpotName), OrderByType.Desc, true)]
+    public class HotSpotType: CreationSoftDeleteEntity
+    {
+        public string HotSpotName { get; set; }
+        [SugarColumn(IsNullable = true)]
+        public string ParentId { get; set; }
+        public string PYCode { get; set; }
+        public string FullPYCode { get; set; }
+        public string ProvinceCode { get; set; }
+        public int OrderBy { get; set; }
+        public string TrunkNum { get; set; }
+        /// <summary>
+        /// 生成的时候写入
+        /// </summary>
+        public string HotSpotFullName { get; set; }
+    }
+}

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

@@ -0,0 +1,9 @@
+using XF.Domain.Repository;
+
+namespace Hotline.Orders
+{
+    public interface IHotSpotTypeRepository : IRepository<HotSpotType>
+    {
+
+    }
+}

+ 5 - 1
src/Hotline/Orders/Order.cs

@@ -157,7 +157,9 @@ namespace Hotline.Orders
         public string Content { get; set; }
 
         #endregion
-        
+
+        #region 工单属性
+
         /// <summary>
         /// 当前节点名称
         /// </summary>
@@ -187,6 +189,8 @@ namespace Hotline.Orders
         /// 过期状态
         /// </summary>
         public EExpiredStatus ExpiredStatus { get; set; }
+
+        #endregion
     }
 
     public enum EExpiredStatus

+ 2 - 2
src/Hotline/SeedData/OrgSeedData.cs

@@ -7,7 +7,7 @@ namespace Hotline.SeedData
     public class OrgSeedData : ISeedData<SystemOrganize>
     {
         public static readonly string Id = "08dac6ae-3096-4156-828e-b34e9c1fb5da";
-        public static readonly string Code = "001";
+        public static readonly string CallCenterCode = "001";
 
         public IEnumerable<SystemOrganize> HasData() =>
         new[]
@@ -16,7 +16,7 @@ namespace Hotline.SeedData
             {
                 Id = Id,
                 OrgName = "12345政务服务便民热线",
-                OrgCode = Code,
+                OrgCode = CallCenterCode,
                 IsEnable = true,
                 CreationTime = DateTime.Now
             }

+ 1 - 1
src/Hotline/Settings/ISystemDataAuthorityRepository.cs

@@ -5,6 +5,6 @@ namespace Hotline.Settings
 {
     public interface ISystemDataAuthorityRepository : IRepository<SystemDataAuthority>
     {
-        EAuthorityType? GetMyTopDataAuth(string[] roles, string tableid);
+        EAuthorityType GetMyTopDataAuth(string[] roles, string tableid);
     }
 }

+ 2 - 0
src/Hotline/Users/IUserDomainService.cs

@@ -21,5 +21,7 @@ namespace Hotline.Users
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
         Task<WorkDto?> OffDutyAsync(string userId, CancellationToken cancellationToken);
+        
+        Task<User?> GetUserAsync(string userId, CancellationToken cancellationToken);
     }
 }

+ 3 - 0
src/Hotline/Users/UserDomainService.cs

@@ -98,5 +98,8 @@ namespace Hotline.Users
             #endregion
             return _mapper.Map<WorkDto>(work);
         }
+
+        public async Task<User?> GetUserAsync(string userId, CancellationToken cancellationToken)
+            => await _userRepository.GetAsync(userId, cancellationToken);
     }
 }