From 7ba859f12e5172c3ba22bddfb386496570846e6d Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 13 Aug 2022 20:50:16 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=EF=BC=8C=E5=8F=96=E7=8E=AF=E5=A2=83ip?= =?UTF-8?q?=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.MicroService/Registers/Consul.cs | 51 ++++++++++++------- 1 file changed, 33 insertions(+), 18 deletions(-) diff --git a/WorkFlowCore/Commons/Common.MicroService/Registers/Consul.cs b/WorkFlowCore/Commons/Common.MicroService/Registers/Consul.cs index 5ee1bb7..5123d90 100644 --- a/WorkFlowCore/Commons/Common.MicroService/Registers/Consul.cs +++ b/WorkFlowCore/Commons/Common.MicroService/Registers/Consul.cs @@ -4,7 +4,9 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; using System; using System.Collections.Generic; +using System.Net.NetworkInformation; using System.Text; +using System.Linq; namespace Common.MicroService.Registers { @@ -18,7 +20,7 @@ namespace Common.MicroService.Registers public string ServicePort { get; set; } public string ServiceName { get; set; } } - public static void RunConsulRegister(this IApplicationBuilder app,Actionoptions, IHostApplicationLifetime hostApplicationLifetime) + public static void RunConsulRegister(this IApplicationBuilder app, Action options, IHostApplicationLifetime hostApplicationLifetime) { var _options = new RegisterOptions(); options?.Invoke(_options); @@ -37,27 +39,40 @@ namespace Common.MicroService.Registers var port = _options.ServicePort; var serviceName = _options.ServiceName; Console.WriteLine($"args:{ip},{port},{serviceName}"); - var registration = new AgentServiceRegistration() + + + var addresses = NetworkInterface.GetAllNetworkInterfaces() + .Select(i => i.GetIPProperties()) + .Select(i => i.UnicastAddresses); + + foreach (var localAddresses in addresses) { - ID = serviceName + "-" + Guid.NewGuid(), - Name = serviceName, - Address = ip, - Port = int.Parse(port), - Check = new AgentServiceCheck + foreach (var localAddress in localAddresses) { - Interval = TimeSpan.FromSeconds(10), - HTTP = $"http://{ip}:{port}/api/Health/", - Timeout = TimeSpan.FromSeconds(5), - DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(30) - } - }; + var ipAddress = localAddress.Address.ToString(); + var registration = new AgentServiceRegistration() + { + ID = serviceName + "-" + Guid.NewGuid(), + Name = serviceName, + Address = ipAddress, + Port = int.Parse(port), + Check = new AgentServiceCheck + { + Interval = TimeSpan.FromSeconds(10), + HTTP = $"http://{ipAddress}:{port}/api/Health/", + Timeout = TimeSpan.FromSeconds(5), + DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(30) + } + }; - client.Agent.ServiceRegister(registration); + client.Agent.ServiceRegister(registration); - hostApplicationLifetime.ApplicationStopped.Register(() => - { - client.Agent.ServiceDeregister(registration.ID); - }); + hostApplicationLifetime.ApplicationStopped.Register(() => + { + client.Agent.ServiceDeregister(registration.ID); + }); + } + } } } } -- Gitee From 1ccc178dc30315865c0b20fd2d9e2c27f8e39906 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 13 Aug 2022 20:51:40 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E7=A7=BB=E9=99=A4workflow=20=E9=A2=86?= =?UTF-8?q?=E5=9F=9F=E5=B1=82=20=E5=B7=A5=E4=BD=9C=E5=8D=95=E5=85=83?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=8E=9F=E5=88=99=E4=B8=8A=EF=BC=8C?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8D=95=E5=85=83=E7=94=B1=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkFlowCore/WorkTasks/WorkTaskManager.cs | 300 ++++++++---------- .../WorkFlowCore/Workflows/WorkflowManager.cs | 95 +++--- 2 files changed, 169 insertions(+), 226 deletions(-) diff --git a/WorkFlowCore/Workflow/WorkFlowCore/WorkTasks/WorkTaskManager.cs b/WorkFlowCore/Workflow/WorkFlowCore/WorkTasks/WorkTaskManager.cs index e43388f..cce2bff 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore/WorkTasks/WorkTaskManager.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore/WorkTasks/WorkTaskManager.cs @@ -26,7 +26,6 @@ namespace WorkFlowCore.WorkTasks private readonly ConditionManager conditionManager; private readonly UserSelectorManager userSelectorManager; private readonly DomainEventBusService eventManager; - private readonly IUnitOfWorkManager unitOfWorkManager; private readonly WorkflowInterface workflowInterface; private readonly ILogger logger; @@ -37,9 +36,8 @@ namespace WorkFlowCore.WorkTasks , ConditionManager conditionManager , UserSelectorManager userSelectorManager , DomainEventBusService eventManager - , IUnitOfWorkManager unitOfWorkManager - ,WorkflowInterface workflowInterface - ,ILogger logger) + , WorkflowInterface workflowInterface + , ILogger logger) { this.workflowRepository = workflowRepository; this.versionRepository = versionRepository; @@ -48,7 +46,6 @@ namespace WorkFlowCore.WorkTasks this.conditionManager = conditionManager; this.userSelectorManager = userSelectorManager; this.eventManager = eventManager; - this.unitOfWorkManager = unitOfWorkManager; this.workflowInterface = workflowInterface; this.logger = logger; } @@ -75,11 +72,7 @@ namespace WorkFlowCore.WorkTasks { var worktask = new WorkTask(Guid.NewGuid(), workflowId, name, formData, entityFullName, entityKeyValue, createdUserId); worktaskInfo = worktask.ToWorkTaskInfo(); - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workTaskRepository.InsertAsync(worktaskInfo); - unitOfWork.Commit(); - } + await workTaskRepository.InsertAsync(worktaskInfo); } return worktaskInfo.ToWorkTask(); } @@ -98,11 +91,7 @@ namespace WorkFlowCore.WorkTasks var worktask = new WorkTask(Guid.NewGuid(), workflowId, name, formData, entityFullName, entityKeyValue, createdUserId); worktask.AsSimulation(); - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workTaskRepository.InsertAsync(worktask.ToWorkTaskInfo()); - unitOfWork.Commit(); - } + await workTaskRepository.InsertAsync(worktask.ToWorkTaskInfo()); return worktask; } @@ -232,11 +221,7 @@ namespace WorkFlowCore.WorkTasks stepInfos.Add(step.ToWorkStepInfo(stepInfo)); } } - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workStepRepository.UpdateManyAsync(stepInfos); - unitOfWork.Commit(); - } + await workStepRepository.UpdateManyAsync(stepInfos); } /// /// 更新同节点其它用户步骤状态为未处理 @@ -259,11 +244,7 @@ namespace WorkFlowCore.WorkTasks stepInfos.Add(step.ToWorkStepInfo(stepInfo)); } } - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workStepRepository.UpdateManyAsync(stepInfos); - unitOfWork.Commit(); - } + await workStepRepository.UpdateManyAsync(stepInfos); } @@ -286,12 +267,8 @@ namespace WorkFlowCore.WorkTasks if (startNode == null) throw new Exception("找不到可用的起始结点!"); var steps = GetApproveSteps(Guid.Empty, "", workTask, startNode, string.Empty, Guid.NewGuid().ToString()); - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workTaskRepository.UpdateAsync(workTask.ToWorkTaskInfo(workTaskInfo)); - await SendTasks(workTask, steps, workTask.FormData); - unitOfWork.Commit(); - } + await workTaskRepository.UpdateAsync(workTask.ToWorkTaskInfo(workTaskInfo)); + await SendTasks(workTask, steps, workTask.FormData); //自动处理开始节点 @@ -319,7 +296,7 @@ namespace WorkFlowCore.WorkTasks /// /// /// - private async Task HasAllHandlersWorkflowed(Guid currentWorkStepId,string currentGroupId) + private async Task HasAllHandlersWorkflowed(Guid currentWorkStepId, string currentGroupId) { var GetCountAsync = await workStepRepository.GetCountAsync(ws => ws.GroupId == currentGroupId && ws.Id != currentWorkStepId && !ws.IsHandled); return GetCountAsync == 0; @@ -355,76 +332,71 @@ namespace WorkFlowCore.WorkTasks var nextNodes = await GetNextNodes(currentNode, workTask, currentWorkStep); //更新当前处理节点为已处理 - using (var unitOfWork = unitOfWorkManager.Begin()) - { - currentWorkStep.Handle(WorkStepHandleType.Pass, comment, resourceIds); - await workStepRepository.UpdateAsync(currentWorkStep.ToWorkStepInfo(currentWorkStepInfo)); - + currentWorkStep.Handle(WorkStepHandleType.Pass, comment, resourceIds); + await workStepRepository.UpdateAsync(currentWorkStep.ToWorkStepInfo(currentWorkStepInfo)); - if (currentNode.IsWaitingAllUser) + if (currentNode.IsWaitingAllUser) + { + lock ("WorkNodeType.Sign") { - lock ("WorkNodeType.Sign") + if (!HasAllHandlersWorkflowed(currentWorkStep.Id, currentWorkStep.GroupId).Result) { - if (!HasAllHandlersWorkflowed(currentWorkStep.Id, currentWorkStep.GroupId).Result) - { - return ProveResult.Succeed(steps); - } + return ProveResult.Succeed(steps); } } - else - { - await UpdateOtherStepsStatusWithUnWorkOfNode(currentWorkStep); - } - //如果是会签操作,则确保所有会签中的操作都完成了才进行下一步 - if (nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.Sign) + } + else + { + await UpdateOtherStepsStatusWithUnWorkOfNode(currentWorkStep); + } + //如果是会签操作,则确保所有会签中的操作都完成了才进行下一步 + if (nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.Sign) + { + //会签 + //等待所有待处理的处理才继续 + lock ("WorkNodeType.Sign") { - //会签 - //等待所有待处理的处理才继续 - lock ("WorkNodeType.Sign") + if (HasOnHandingSignSteps(currentWorkStep.NodeId, currentWorkStep.GroupId).Result) { - if (HasOnHandingSignSteps(currentWorkStep.NodeId, currentWorkStep.GroupId).Result) - { - return ProveResult.Succeed(steps); ; - } + return ProveResult.Succeed(steps); ; } } - var nextGroupId = Guid.NewGuid().ToString(); + } + var nextGroupId = Guid.NewGuid().ToString(); - foreach (var node in nextNodes) + foreach (var node in nextNodes) + { + //如果 指定了处理人,则直接派给处理人 + //如果指定了 抄送(只读)人员,直接推送给抄送人员 + if (userSelectors != null && userSelectors.Any()) { - //如果 指定了处理人,则直接派给处理人 - //如果指定了 抄送(只读)人员,直接推送给抄送人员 - if (userSelectors != null && userSelectors.Any()) + GetUsersByUserSelectors(userSelectors, null, (selector, user) => { - GetUsersByUserSelectors(userSelectors, null, (selector, user) => + steps.Add(new WorkStep(Guid.NewGuid(), workTask.Id, currentWorkStep.NodeId, currentNode.Name, node.Id, node.Name, new User { - steps.Add(new WorkStep(Guid.NewGuid(), workTask.Id, currentWorkStep.NodeId, currentNode.Name, node.Id, node.Name, new User - { - Id = user.Id, - Name = user.Name - }, selector.HandleType == NodeUser.NodeHandleType.Handle ? WorkStepType.Handle : WorkStepType.ReadOnly, currentWorkStep.GroupId, nextGroupId)); - }); - } - else - { - steps.AddRange(GetApproveSteps(currentWorkStep.NodeId, currentNode.Name, workTask, node, currentWorkStep.GroupId, nextGroupId)); - } + Id = user.Id, + Name = user.Name + }, selector.HandleType == NodeUser.NodeHandleType.Handle ? WorkStepType.Handle : WorkStepType.ReadOnly, currentWorkStep.GroupId, nextGroupId)); + }); + } + else + { + steps.AddRange(GetApproveSteps(currentWorkStep.NodeId, currentNode.Name, workTask, node, currentWorkStep.GroupId, nextGroupId)); } + } - if (steps.Count == 0 && currentNode.NodeType != WorkNodeType.End) - return ProveResult.Failed("找不到可以处理的下一个步骤!"); - await SendTasks(workTask, steps, formData); - if (!unitOfWork.Commit()) - ProveResult.Failed("提交失败"); + if (steps.Count == 0 && currentNode.NodeType != WorkNodeType.End) + return ProveResult.Failed("找不到可以处理的下一个步骤!"); + await SendTasks(workTask, steps, formData); + + //检查更新流程状态为审判中或者结束 + await CheckAndSetTaskProcessing(workTask, workTaskInfo, currentNode); + await CheckAndSetTaskProcessed(workTask, workTaskInfo, currentNode); - //检查更新流程状态为审判中或者结束 - await CheckAndSetTaskProcessing(workTask, workTaskInfo, currentNode); - await CheckAndSetTaskProcessed(workTask, workTaskInfo, currentNode); - } //自动处理结束节点 if (nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.End) { @@ -475,39 +447,35 @@ namespace WorkFlowCore.WorkTasks return ProveResult.Failed("开始步骤无法拒绝!"); //更新当前处理节点为已处理 - using (var unitOfWork = unitOfWorkManager.Begin()) - { - currentWorkStep.Handle(WorkStepHandleType.Reject, comment, resourceIds); - await workStepRepository.UpdateAsync(currentWorkStep.ToWorkStepInfo(currentWorkStepInfo)); - var steps = new List(); - - var nextNodes = await GetNextNodes(currentNode, workTask, currentWorkStep); - //如果下一个节点是会签,则同组的步骤都要撤回 - if (nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.Sign) - { - await UpdateOtherStepsStatusWithUnWork(currentWorkStep.NodeId, currentWorkStep.GroupId); - } - + currentWorkStep.Handle(WorkStepHandleType.Reject, comment, resourceIds); + await workStepRepository.UpdateAsync(currentWorkStep.ToWorkStepInfo(currentWorkStepInfo)); + var steps = new List(); - //获取拒绝的步骤(如果指定绝节节点则获取拒绝节点,否则退回上一步的节点,处理人员仍然 是上一步的人员) - var rejectInfo = await GetRejectInfo(currentNode, workTask, currentWorkStep); - var rejectSteps = rejectInfo.Item1; - steps.AddRange(rejectSteps); - if (steps.Count == 0) - return ProveResult.Failed("找不到可以处理的下一个步骤!"); + var nextNodes = await GetNextNodes(currentNode, workTask, currentWorkStep); + //如果下一个节点是会签,则同组的步骤都要撤回 + if (nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.Sign) + { + await UpdateOtherStepsStatusWithUnWork(currentWorkStep.NodeId, currentWorkStep.GroupId); + } - //如果拒绝返回的节点是开始 节点,则更新流程状态为待审批 - var rejectNodes = rejectInfo.Item2; - var startNode = rejectNodes.FirstOrDefault(n => n.NodeType == WorkNodeType.Begin); - if (startNode != null) - { - await CheckAndTaskPendding(workTask, workTaskInfo, startNode); - } - await SendTasks(workTask, steps, formData); + //获取拒绝的步骤(如果指定绝节节点则获取拒绝节点,否则退回上一步的节点,处理人员仍然 是上一步的人员) + var rejectInfo = await GetRejectInfo(currentNode, workTask, currentWorkStep); + var rejectSteps = rejectInfo.Item1; + steps.AddRange(rejectSteps); + if (steps.Count == 0) + return ProveResult.Failed("找不到可以处理的下一个步骤!"); - return unitOfWork.Commit(ProveResult.Succeed(steps), ProveResult.Failed("提交失败")); + //如果拒绝返回的节点是开始 节点,则更新流程状态为待审批 + var rejectNodes = rejectInfo.Item2; + var startNode = rejectNodes.FirstOrDefault(n => n.NodeType == WorkNodeType.Begin); + if (startNode != null) + { + await CheckAndTaskPendding(workTask, workTaskInfo, startNode); } + + await SendTasks(workTask, steps, formData); + return ProveResult.Succeed(steps); } @@ -551,41 +519,38 @@ namespace WorkFlowCore.WorkTasks } - using (var unitOfWork = unitOfWorkManager.Begin()) + //如果已读则不处理,否则执行撤回||如果下一个节点是会签节点,则允许撤回当前的操作重新审批 + if (nextSteps.Any() && !nextSteps.Where(s => s.IsRead || s.IsHandled).Any() || nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.Sign) { - //如果已读则不处理,否则执行撤回||如果下一个节点是会签节点,则允许撤回当前的操作重新审批 - if (nextSteps.Any() && !nextSteps.Where(s => s.IsRead || s.IsHandled).Any() || nextNodes.Count == 1 && nextNodes[0].NodeType == WorkNodeType.Sign) - { - //设置后续节点为未处理 - var stepInfos = new List(); - foreach (var nextStepsInfo in nextSteps) - { - var nextStep = nextStepsInfo.ToWorkStep(); - nextStep.Handle(WorkStepHandleType.UnWork, $"撤回:{comment}"); - stepInfos.Add(nextStep.ToWorkStepInfo(nextStepsInfo)); - } - await workStepRepository.UpdateManyAsync(stepInfos); - //设置当前节点为撤回状态 - //新插入当前步骤 - var withdrawStep = currentWorkStep.Copy(); - withdrawStep.Handle(WorkStepHandleType.Withdraw, comment); - await workStepRepository.InsertAsync(withdrawStep.ToWorkStepInfo()); - //新插入当前步骤 - var newStep = currentWorkStep.Copy(); - newStep.SetReaded();//对于撤回新插入的记录,它应该是已读的 - await workStepRepository.InsertAsync(newStep.ToWorkStepInfo()); - steps.Add(newStep); - } - else + //设置后续节点为未处理 + var stepInfos = new List(); + foreach (var nextStepsInfo in nextSteps) { - return ProveResult.Failed("下一步骤已读或已处理,无法撤回!"); + var nextStep = nextStepsInfo.ToWorkStep(); + nextStep.Handle(WorkStepHandleType.UnWork, $"撤回:{comment}"); + stepInfos.Add(nextStep.ToWorkStepInfo(nextStepsInfo)); } - await CheckAndTaskPendding(workTask, workTaskInfo, currentNode); - - if (steps.Count == 0) - return ProveResult.Failed("找不到可以处理的下一个步骤!"); - return unitOfWork.Commit(ProveResult.Succeed(steps), ProveResult.Failed("提交失败")); + await workStepRepository.UpdateManyAsync(stepInfos); + //设置当前节点为撤回状态 + //新插入当前步骤 + var withdrawStep = currentWorkStep.Copy(); + withdrawStep.Handle(WorkStepHandleType.Withdraw, comment); + await workStepRepository.InsertAsync(withdrawStep.ToWorkStepInfo()); + //新插入当前步骤 + var newStep = currentWorkStep.Copy(); + newStep.SetReaded();//对于撤回新插入的记录,它应该是已读的 + await workStepRepository.InsertAsync(newStep.ToWorkStepInfo()); + steps.Add(newStep); } + else + { + return ProveResult.Failed("下一步骤已读或已处理,无法撤回!"); + } + await CheckAndTaskPendding(workTask, workTaskInfo, currentNode); + + if (steps.Count == 0) + return ProveResult.Failed("找不到可以处理的下一个步骤!"); + return ProveResult.Succeed(steps); } /// /// 获取转发出去的步骤id @@ -696,39 +661,36 @@ namespace WorkFlowCore.WorkTasks //设置当前节点为转发状态 - using (var unitOfWork = unitOfWorkManager.Begin()) + currentWorkStep.Handle(WorkStepHandleType.Forward, comment); + await workStepRepository.UpdateAsync(currentWorkStep.ToWorkStepInfo(currentWorkStepInfo)); + //插入新处理人的处理步骤 + //遍历用户 选择器获取实际用户 并转发处理 + foreach (var selector in UserSelectors) { - currentWorkStep.Handle(WorkStepHandleType.Forward, comment); - await workStepRepository.UpdateAsync(currentWorkStep.ToWorkStepInfo(currentWorkStepInfo)); - //插入新处理人的处理步骤 - //遍历用户 选择器获取实际用户 并转发处理 - foreach (var selector in UserSelectors) + var userSelector = userSelectorManager.GetUserSelector(selector.SelectorId); + foreach (var section in selector.Selections) { - var userSelector = userSelectorManager.GetUserSelector(selector.SelectorId); - foreach (var section in selector.Selections) + var _users = userSelector.GetUsers(new SelectorInput { - var _users = userSelector.GetUsers(new SelectorInput - { - SelectionId = section.Id, - Expression = selector.Parameter, - WorkTask = workTask - }); - - _users.ForEach(user => - { - var newStep = currentWorkStep.Copy(); - newStep.SetHandleUser(user); - newStep.FromForward(currentWorkStep.Id); - workStepRepository.InsertAsync(newStep.ToWorkStepInfo()); - steps.Add(newStep); - }); - } + SelectionId = section.Id, + Expression = selector.Parameter, + WorkTask = workTask + }); + _users.ForEach(user => + { + var newStep = currentWorkStep.Copy(); + newStep.SetHandleUser(user); + newStep.FromForward(currentWorkStep.Id); + workStepRepository.InsertAsync(newStep.ToWorkStepInfo()); + steps.Add(newStep); + }); } - if (steps.Count == 0) - return ProveResult.Failed("找不到可以处理的下一个步骤!"); - return unitOfWork.Commit(ProveResult.Succeed(steps), ProveResult.Failed("提交失败")); + } + if (steps.Count == 0) + return ProveResult.Failed("找不到可以处理的下一个步骤!"); + return ProveResult.Succeed(steps); } /// @@ -740,7 +702,7 @@ namespace WorkFlowCore.WorkTasks private async Task HasOnHandingSignSteps(Guid currentNodeId, string stepGroupId) { var steps = await workStepRepository.GetCountAsync(ws => ws.GroupId == stepGroupId && ws.IsHandled == false && ws.NodeId != currentNodeId); - return steps>0; + return steps > 0; } /// diff --git a/WorkFlowCore/Workflow/WorkFlowCore/Workflows/WorkflowManager.cs b/WorkFlowCore/Workflow/WorkFlowCore/Workflows/WorkflowManager.cs index 3525e4a..f33336b 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore/Workflows/WorkflowManager.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore/Workflows/WorkflowManager.cs @@ -19,19 +19,16 @@ namespace WorkFlowCore.Workflows private readonly IBasicRepository workflowRepository; private readonly IBasicRepository versionRepository; private readonly DomainEventBusService eventManager; - private readonly IUnitOfWorkManager unitOfWorkManager; private readonly WorkflowInterface workflowInterface; public WorkflowManager(IBasicRepository workflowRepository , IBasicRepository versionRepository , DomainEventBusService eventManager - , IUnitOfWorkManager unitOfWorkManager , WorkflowInterface workflowInterface) { this.workflowRepository = workflowRepository; this.versionRepository = versionRepository; this.eventManager = eventManager; - this.unitOfWorkManager = unitOfWorkManager; this.workflowInterface = workflowInterface; } @@ -68,15 +65,11 @@ namespace WorkFlowCore.Workflows public async Task CreateWorkflow(string workflowNo, string name, string description) { - using (var unitOfWork = unitOfWorkManager.Begin()) - { - var workflow = new Workflow(Guid.NewGuid(), workflowNo, name, description); - workflow = await workflowRepository.InsertAsync(workflow); - var workflowVersion = new WorkflowVersion(Guid.NewGuid(), workflow.Id, workflow.ActiveVersion, string.Empty, description); - await versionRepository.InsertAsync(workflowVersion.ToWorkflowVersionInfo()); - unitOfWork.Commit(); - return workflow; - } + var workflow = new Workflow(Guid.NewGuid(), workflowNo, name, description); + workflow = await workflowRepository.InsertAsync(workflow); + var workflowVersion = new WorkflowVersion(Guid.NewGuid(), workflow.Id, workflow.ActiveVersion, string.Empty, description); + await versionRepository.InsertAsync(workflowVersion.ToWorkflowVersionInfo()); + return workflow; } /// /// 更新流程激活版本 @@ -85,13 +78,10 @@ namespace WorkFlowCore.Workflows /// public async Task UpdateWorkflowActiveVersion(Guid workflowId, int activeVersion) { - using (var unitOfWork = unitOfWorkManager.Begin()) - { - var workflow = await workflowRepository.GetAsync(workflowId); - workflow.UpdateActiveVersion(activeVersion); - await workflowRepository.UpdateAsync(workflow); - return unitOfWork.Commit(true, false); - } + var workflow = await workflowRepository.GetAsync(workflowId); + workflow.UpdateActiveVersion(activeVersion); + await workflowRepository.UpdateAsync(workflow); + return true; } /// /// 删除流程 @@ -103,12 +93,8 @@ namespace WorkFlowCore.Workflows var tasks = await workflowRepository.GetListAsync(wt => wt.Id == workflowid); tasks.ForEach(t => t.Deleted = true); - - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workflowRepository.UpdateManyAsync(tasks); - return unitOfWork.Commit(true, false); - } + await workflowRepository.UpdateManyAsync(tasks); + return true; } /// /// 删除流程版本 @@ -118,11 +104,8 @@ namespace WorkFlowCore.Workflows /// public async Task DeleteWorkflowVersion(Guid workflowid, int versionId) { - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await versionRepository.DeleteManyAsync(wt => wt.WorkflowId == workflowid && wt.VersionNo == versionId); - return unitOfWork.Commit(true, false); - } + await versionRepository.DeleteManyAsync(wt => wt.WorkflowId == workflowid && wt.VersionNo == versionId); + return true; } private List GetNewNodeMaps(List workflowLines, List workflowNodes) @@ -184,38 +167,36 @@ namespace WorkFlowCore.Workflows { var workflow = await workflowRepository.GetAsync(workflowId); workflow.Update(name, description); - using (var unitOfWork = unitOfWorkManager.Begin()) - { - await workflowRepository.UpdateAsync(workflow); - WorkflowVersion version = null; - var versionInfo = await workflowInterface.GetWorkflowVersionInfo(workflowId, versionNo); - if (versionInfo == null) - { - //新建版本 - version = new WorkflowVersion(Guid.NewGuid(), workflowId, versionNo, drawingInfo, versionDescription); - version.SetNodeMaps(GetNewNodeMaps(workflowLines, workflowNodes)); - await versionRepository.InsertAsync(version.ToWorkflowVersionInfo()); - } - else - { - version = versionInfo.ToWorkflowVersion(); - version.SetNodeMaps(GetNewNodeMaps(workflowLines, workflowNodes)); - version.Update(versionNo, drawingInfo, versionDescription); - await versionRepository.UpdateAsync(version.ToWorkflowVersionInfo(versionInfo)); - } - //推送设计流程信息变更事件 - eventManager.Publish(new WorkflowVersionChangeEventData - { - Workflow = workflow, - WorkflowVersion = version, - }); - return unitOfWork.Commit(workflow, null); + await workflowRepository.UpdateAsync(workflow); + WorkflowVersion version = null; + var versionInfo = await workflowInterface.GetWorkflowVersionInfo(workflowId, versionNo); + if (versionInfo == null) + { + //新建版本 + version = new WorkflowVersion(Guid.NewGuid(), workflowId, versionNo, drawingInfo, versionDescription); + version.SetNodeMaps(GetNewNodeMaps(workflowLines, workflowNodes)); + await versionRepository.InsertAsync(version.ToWorkflowVersionInfo()); } + else + { + version = versionInfo.ToWorkflowVersion(); + version.SetNodeMaps(GetNewNodeMaps(workflowLines, workflowNodes)); + version.Update(versionNo, drawingInfo, versionDescription); + await versionRepository.UpdateAsync(version.ToWorkflowVersionInfo(versionInfo)); + } + //推送设计流程信息变更事件 + eventManager.Publish(new WorkflowVersionChangeEventData + { + Workflow = workflow, + WorkflowVersion = version, + }); + + return workflow; } #endregion - + } } -- Gitee From 3c2fe962f201f2f219133e1d1255effc542ec4b3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 13 Aug 2022 20:52:20 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=9F=BAurl=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E4=B8=8D=E8=B5=B0=E5=85=A8=E5=B1=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin/vue-admin-template/public/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/admin/vue-admin-template/public/config.js b/admin/vue-admin-template/public/config.js index 279e5be..db06349 100644 --- a/admin/vue-admin-template/public/config.js +++ b/admin/vue-admin-template/public/config.js @@ -1,3 +1,3 @@ -window.globalconfig_baseURL="baseURL" \ No newline at end of file +window.globalconfig_baseURL="" \ No newline at end of file -- Gitee From a1667802dd64ed0bb850f7ca1aade9206e244f9d Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 20 Aug 2022 22:42:48 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20Mapster=20=E5=8A=A8?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E6=B3=A8=E5=86=8C=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.Mapster/Common.Mapster.csproj | 12 ++++ .../Common.Mapster/CommonMapsterModule.cs | 57 +++++++++++++++++++ .../Common.Mapster/MapFromAttribute.cs | 16 ++++++ .../Commons/Common.Mapster/MapToAttribute.cs | 16 ++++++ .../DynamicFormAppModule.cs | 12 ++-- .../DynamicForm/DynamicForm.Host/Startup.cs | 6 +- .../DynamicForm.IAppService.csproj | 1 + .../DynamicFormAppContractsModule.cs | 17 ++++++ .../OrganizationAppModule.cs | 10 ++-- .../Organization.Host/Startup.cs | 2 +- .../Organization.IAppService.csproj | 1 + .../OrganizationAppContractsModule.cs | 24 ++++++++ WorkFlowCore/WorkFlowCore.sln | 11 +++- .../WorkFlowCoreAppModule.cs | 11 ++-- .../Workflow/WorkFlowCore.Host/Startup.cs | 3 +- .../WorkFlowCore.IAppService.csproj | 1 + .../WorkFlowCoreAppContractsModule.cs | 24 ++++++++ 17 files changed, 197 insertions(+), 27 deletions(-) create mode 100644 WorkFlowCore/Commons/Common.Mapster/Common.Mapster.csproj create mode 100644 WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs create mode 100644 WorkFlowCore/Commons/Common.Mapster/MapFromAttribute.cs create mode 100644 WorkFlowCore/Commons/Common.Mapster/MapToAttribute.cs create mode 100644 WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicFormAppContractsModule.cs create mode 100644 WorkFlowCore/UserOrganization/Organization.IAppService/OrganizationAppContractsModule.cs create mode 100644 WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCoreAppContractsModule.cs diff --git a/WorkFlowCore/Commons/Common.Mapster/Common.Mapster.csproj b/WorkFlowCore/Commons/Common.Mapster/Common.Mapster.csproj new file mode 100644 index 0000000..83e07b1 --- /dev/null +++ b/WorkFlowCore/Commons/Common.Mapster/Common.Mapster.csproj @@ -0,0 +1,12 @@ + + + + netcoreapp3.1 + + + + + + + + diff --git a/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs b/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs new file mode 100644 index 0000000..2f7300a --- /dev/null +++ b/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs @@ -0,0 +1,57 @@ +using Mapster; +using MapsterMapper; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; + +namespace Common.Mapster +{ + public static class CommonMapsterModule + { + private static TypeAdapterConfig config = new TypeAdapterConfig();//放外面声明可以多次调用注册 + public static IServiceCollection AddMapster(this IServiceCollection services,params Assembly[] assemblies) + { + if(assemblies!=null) + { + //扫描 register + config.Scan(assemblies); + //扫描自定义特性 + foreach(Assembly assembly in assemblies) + { + var types = assembly.GetTypes(); + foreach(Type type in types) + { + var mapfromAttrs = type.GetCustomAttributes(); + if(mapfromAttrs != null) + { + foreach (var item in mapfromAttrs) + { + if (item.FromType == null) continue; + config.ForType(item.FromType, type); + } + } + + var maptoAttrs = type.GetCustomAttributes(); + if (maptoAttrs != null) + { + foreach (var item in maptoAttrs) + { + if (item.ToType == null) continue; + config.ForType(type, item.ToType); + } + } + } + } + + } + + var mapper = new Mapper(config);//务必设置为单实例 + services.AddSingleton(mapper); + + return services; + } + } +} diff --git a/WorkFlowCore/Commons/Common.Mapster/MapFromAttribute.cs b/WorkFlowCore/Commons/Common.Mapster/MapFromAttribute.cs new file mode 100644 index 0000000..e588569 --- /dev/null +++ b/WorkFlowCore/Commons/Common.Mapster/MapFromAttribute.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.Mapster +{ + [AttributeUsage(AttributeTargets.Class)] + public class MapFromAttribute : Attribute + { + public Type FromType; + public MapFromAttribute(Type FromType) + { + this.FromType = FromType; + } + } +} diff --git a/WorkFlowCore/Commons/Common.Mapster/MapToAttribute.cs b/WorkFlowCore/Commons/Common.Mapster/MapToAttribute.cs new file mode 100644 index 0000000..d15ab28 --- /dev/null +++ b/WorkFlowCore/Commons/Common.Mapster/MapToAttribute.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.Mapster +{ + [AttributeUsage(AttributeTargets.Class)] + public class MapToAttribute : Attribute + { + public Type ToType; + public MapToAttribute(Type ToType) + { + this.ToType = ToType; + } + } +} diff --git a/WorkFlowCore/DynamicForm/DynamicForm.AppService/DynamicFormAppModule.cs b/WorkFlowCore/DynamicForm/DynamicForm.AppService/DynamicFormAppModule.cs index 701d0ee..4751d0c 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.AppService/DynamicFormAppModule.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.AppService/DynamicFormAppModule.cs @@ -3,8 +3,10 @@ using Common.DynamicApi; using Common.EventBus; using Common.EventBus.Default; using Common.EventBus.Kafka; +using Common.Mapster; using Common.MicroService.Registers; using DynamicForm.Core; +using DynamicForm.IAppService; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -22,9 +24,9 @@ namespace DynamicForm.AppService { var serviceConfig = new DynamicFormAppModuleConfiguration(services); options?.Invoke(serviceConfig); - + services.AddMapster(Assembly.GetExecutingAssembly()); + services.AddDynamicFormAppContracts(); services.AddDependencyServices(Assembly.GetExecutingAssembly()); - services.AddDefautEventBus(Assembly.GetExecutingAssembly(), typeof(DynamicFormCoreModule).Assembly); services.AddKafkaEventBus(config => { @@ -44,12 +46,6 @@ namespace DynamicForm.AppService { this.services = services; } - - public void AddDynamicControllers() - { - services.AddDynamicControllers(Assembly.GetExecutingAssembly()); - } - /// /// kafka连接地址配置 /// diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs b/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs index e1715d0..2e3aecd 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs @@ -1,5 +1,6 @@ using Common.BackgroundWorker; +using Common.DynamicApi; using Common.EventBus; using Common.EventBus.Kafka; using Common.MicroService.Registers; @@ -48,11 +49,12 @@ namespace DynamicForm.Host services.AddDynamicFormApp(options => { - options.AddDynamicControllers(); options.KafkaBootstrapServers = Configuration.GetValueFromManyChanels("Kafka:BootstrapServers"); - }); + services.AddDynamicControllers(typeof(DynamicFormAppModule).Assembly); + + services.AddDynamicFormCore(options => { options.MicroServiceGateway = Configuration.GetValueFromManyChanels("Gateway"); diff --git a/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicForm.IAppService.csproj b/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicForm.IAppService.csproj index 10e2bc2..3d3381f 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicForm.IAppService.csproj +++ b/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicForm.IAppService.csproj @@ -6,6 +6,7 @@ + diff --git a/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicFormAppContractsModule.cs b/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicFormAppContractsModule.cs new file mode 100644 index 0000000..4e1ca5d --- /dev/null +++ b/WorkFlowCore/DynamicForm/DynamicForm.IAppService/DynamicFormAppContractsModule.cs @@ -0,0 +1,17 @@ + +using Microsoft.Extensions.DependencyInjection; +using System.Reflection; +using System.Text; +using Common.Mapster; + +namespace DynamicForm.IAppService +{ + public static class DynamicFormAppContractsModule + { + public static IServiceCollection AddDynamicFormAppContracts(this IServiceCollection services) + { + services.AddMapster(Assembly.GetExecutingAssembly()); + return services; + } + } +} diff --git a/WorkFlowCore/UserOrganization/Organization.AppService/OrganizationAppModule.cs b/WorkFlowCore/UserOrganization/Organization.AppService/OrganizationAppModule.cs index 4855a95..5a3a5b9 100644 --- a/WorkFlowCore/UserOrganization/Organization.AppService/OrganizationAppModule.cs +++ b/WorkFlowCore/UserOrganization/Organization.AppService/OrganizationAppModule.cs @@ -3,8 +3,10 @@ using Common.DynamicApi; using Common.EventBus; using Common.EventBus.Default; using Common.EventBus.Kafka; +using Common.Mapster; using Microsoft.Extensions.DependencyInjection; using Organization.Core; +using Organization.IAppService; using System; using System.Collections.Generic; using System.Linq; @@ -21,9 +23,9 @@ namespace Organization.AppService var serviceConfig = new OrganizationAppModuleConfiguration(services); options?.Invoke(serviceConfig); + services.AddMapster(Assembly.GetExecutingAssembly()); + services.AddOrganizationAppContracts(); services.AddDependencyServices(Assembly.GetExecutingAssembly()); - - services.AddDefautEventBus(Assembly.GetExecutingAssembly(), typeof(OrganizationCoreModule).Assembly); services.AddKafkaEventBus(config => @@ -43,10 +45,6 @@ namespace Organization.AppService this.services = services; } - public void AddDynamicControllers() - { - services.AddDynamicControllers(Assembly.GetExecutingAssembly()); - } /// /// kafka连接地址配置 /// diff --git a/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs b/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs index bafdc02..eb38f55 100644 --- a/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs +++ b/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs @@ -55,9 +55,9 @@ namespace Organization.Host }); services.AddOrganizationApp(options => { - options.AddDynamicControllers(); options.KafkaBootstrapServers = Configuration.GetValueFromManyChanels("Kafka:BootstrapServers"); }); + services.AddDynamicControllers(typeof(OrganizationAppModule).Assembly); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Organization.Host", Version = "v1" }); diff --git a/WorkFlowCore/UserOrganization/Organization.IAppService/Organization.IAppService.csproj b/WorkFlowCore/UserOrganization/Organization.IAppService/Organization.IAppService.csproj index 10b6d1f..e3764e7 100644 --- a/WorkFlowCore/UserOrganization/Organization.IAppService/Organization.IAppService.csproj +++ b/WorkFlowCore/UserOrganization/Organization.IAppService/Organization.IAppService.csproj @@ -7,6 +7,7 @@ + diff --git a/WorkFlowCore/UserOrganization/Organization.IAppService/OrganizationAppContractsModule.cs b/WorkFlowCore/UserOrganization/Organization.IAppService/OrganizationAppContractsModule.cs new file mode 100644 index 0000000..f7aeb19 --- /dev/null +++ b/WorkFlowCore/UserOrganization/Organization.IAppService/OrganizationAppContractsModule.cs @@ -0,0 +1,24 @@ +using Common.BackgroundWorker; +using Common.DependencyInjection; +using Common.EventBus; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Common.Mapster; + +namespace Organization.IAppService +{ + public static class OrganizationAppContractsModule + { + public static IServiceCollection AddOrganizationAppContracts(this IServiceCollection services) + { + services.AddMapster(Assembly.GetExecutingAssembly()); + return services; + } + } +} diff --git a/WorkFlowCore/WorkFlowCore.sln b/WorkFlowCore/WorkFlowCore.sln index e325836..b7aab65 100644 --- a/WorkFlowCore/WorkFlowCore.sln +++ b/WorkFlowCore/WorkFlowCore.sln @@ -75,9 +75,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.EventBus.Kafka", "Co EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Configuration.Extension", "Commons\Common.Configuration.Extension\Common.Configuration.Extension.csproj", "{C2CAEC38-37A1-454A-B1B4-2113387210EF}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.UnitOfWork", "Commons\Common.UnitOfWork\Common.UnitOfWork.csproj", "{32DC90C3-31B4-444B-80DA-63001B7BB3EE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.UnitOfWork", "Commons\Common.UnitOfWork\Common.UnitOfWork.csproj", "{32DC90C3-31B4-444B-80DA-63001B7BB3EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.UnitOfWork4EntityFramework", "Commons\Common.UnitOfWork4EntityFramework\Common.UnitOfWork4EntityFramework.csproj", "{E1E16CA1-38EC-4F0D-AB15-F097174EC3B4}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.UnitOfWork4EntityFramework", "Commons\Common.UnitOfWork4EntityFramework\Common.UnitOfWork4EntityFramework.csproj", "{E1E16CA1-38EC-4F0D-AB15-F097174EC3B4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Mapster", "Commons\Common.Mapster\Common.Mapster.csproj", "{3C37AF32-C83D-4C54-8F17-74DD0584BC50}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -217,6 +219,10 @@ Global {E1E16CA1-38EC-4F0D-AB15-F097174EC3B4}.Debug|Any CPU.Build.0 = Debug|Any CPU {E1E16CA1-38EC-4F0D-AB15-F097174EC3B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1E16CA1-38EC-4F0D-AB15-F097174EC3B4}.Release|Any CPU.Build.0 = Release|Any CPU + {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -255,6 +261,7 @@ Global {C2CAEC38-37A1-454A-B1B4-2113387210EF} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} {32DC90C3-31B4-444B-80DA-63001B7BB3EE} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} {E1E16CA1-38EC-4F0D-AB15-F097174EC3B4} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} + {3C37AF32-C83D-4C54-8F17-74DD0584BC50} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2B47C6B7-D14F-4E7A-AC89-493A7F10350B} diff --git a/WorkFlowCore/Workflow/WorkFlowCore.AppService/WorkFlowCoreAppModule.cs b/WorkFlowCore/Workflow/WorkFlowCore.AppService/WorkFlowCoreAppModule.cs index 5333e7b..f22afca 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.AppService/WorkFlowCoreAppModule.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.AppService/WorkFlowCoreAppModule.cs @@ -3,11 +3,13 @@ using Common.DynamicApi; using Common.EventBus; using Common.EventBus.Default; using Common.EventBus.Kafka; +using Common.Mapster; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Reflection; using System.Text; +using WorkFlowCore.IAppService; namespace WorkFlowCore.AppService { @@ -19,11 +21,12 @@ namespace WorkFlowCore.AppService var serviceConfig = new WorkFlowCoreAppModuleConfiguration(services); options?.Invoke(serviceConfig); - + services.AddMapster(Assembly.GetExecutingAssembly()); services.AddDependencyServices(Assembly.GetExecutingAssembly()); + services.AddWorkFlowCoreAppContracts(); + - services.AddDefautEventBus(Assembly.GetExecutingAssembly(), typeof(WorkFlowCoreModule).Assembly); services.AddKafkaEventBus(config => @@ -44,10 +47,6 @@ namespace WorkFlowCore.AppService this.services = services; } - public void AddDynamicControllers() - { - services.AddDynamicControllers(Assembly.GetExecutingAssembly()); - } /// /// kafka连接地址配置 /// diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs b/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs index cc83271..334c019 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs @@ -41,11 +41,10 @@ namespace WorkFlowCore.Host { services.AddWorkFlowCoreApp(options => { - options.AddDynamicControllers(); options.KafkaBootstrapServers = Configuration.GetValueFromManyChanels("Kafka:BootstrapServers"); }); - + services.AddDynamicControllers(typeof(WorkFlowCoreModule).Assembly); services.AddWorkFlowCore(options => { options.MicroServiceGateway = Configuration.GetValueFromManyChanels("Gateway"); diff --git a/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCore.IAppService.csproj b/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCore.IAppService.csproj index a7e8d70..42b0b96 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCore.IAppService.csproj +++ b/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCore.IAppService.csproj @@ -6,6 +6,7 @@ + diff --git a/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCoreAppContractsModule.cs b/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCoreAppContractsModule.cs new file mode 100644 index 0000000..d875b39 --- /dev/null +++ b/WorkFlowCore/Workflow/WorkFlowCore.IAppService/WorkFlowCoreAppContractsModule.cs @@ -0,0 +1,24 @@ +using Common.BackgroundWorker; +using Common.DependencyInjection; +using Common.EventBus; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using Common.Mapster; + +namespace WorkFlowCore.IAppService +{ + public static class WorkFlowCoreAppContractsModule + { + public static IServiceCollection AddWorkFlowCoreAppContracts(this IServiceCollection services) + { + services.AddMapster(Assembly.GetExecutingAssembly()); + return services; + } + } +} -- Gitee From 288b34be5811fe99374e61bc912b104ec8adb2f1 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 16 Oct 2022 16:08:58 +0800 Subject: [PATCH 05/13] =?UTF-8?q?update=EF=BC=9A=E4=BB=93=E5=82=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E7=A7=9F=E6=88=B7=E4=B8=8E=E8=BD=AF?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commons/Common.Authorization/User.cs | 8 +- .../BasicRepository4EF.cs | 162 ++++++++++++++++-- .../EfContextExtensions.cs | 25 +++ .../Common.EventBus.Kafka/IKafkaEventBus.cs | 10 ++ .../Common.EventBus.Kafka/KafkaEventBus.cs | 2 +- .../KafkaEventBusModule.cs | 1 + .../ISoftDeleteEntity.cs | 22 +++ .../ISoftDeleteRepository.cs | 74 ++++++++ .../ITenantsEntity.cs | 11 ++ .../IWithBaseInfoEntity.cs | 15 +- .../IBasicRepository4EF.cs | 2 +- admin/vue-admin-template/.env.development | 2 +- localapp-workflow.bat | 2 +- 13 files changed, 303 insertions(+), 33 deletions(-) create mode 100644 WorkFlowCore/Commons/Common.BaseRepositories4EF/EfContextExtensions.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus.Kafka/IKafkaEventBus.cs create mode 100644 WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteEntity.cs create mode 100644 WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteRepository.cs create mode 100644 WorkFlowCore/Commons/Common.IBaseRepositories/ITenantsEntity.cs diff --git a/WorkFlowCore/Commons/Common.Authorization/User.cs b/WorkFlowCore/Commons/Common.Authorization/User.cs index 42472fb..759717b 100644 --- a/WorkFlowCore/Commons/Common.Authorization/User.cs +++ b/WorkFlowCore/Commons/Common.Authorization/User.cs @@ -16,12 +16,18 @@ namespace Common.Authorization this.Name = handleUser_Name; } + public User(string id, string name, string tenantId) : this(id, name) + { + TenantId = tenantId; + } + public string Id { get; set; } public string Name { get; set; } + public string TenantId { get; set; } public override string ToString() { - return Id + "_" + Name; + return $"{TenantId}_{Id}_{Name}"; } } } diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs index 938b774..c4aaad7 100644 --- a/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs @@ -21,7 +21,7 @@ namespace Common.BaseRepositories4EF { public class BasicRepository4EF : IBasicRepository4EF where TEntity : class, IEntity { - private readonly DbContext dbContext; + protected readonly DbContext dbContext; private UnitOfWork4EF unitOfWork; private readonly ICommonSession session; @@ -41,8 +41,6 @@ namespace Common.BaseRepositories4EF if (entity != null) { unitOfWork.BeginWithoutLevel(); - - dbContext.Remove(entity); if (autoSave||!unitOfWork.IsActive()) await dbContext.SaveChangesAsync(); } @@ -65,7 +63,8 @@ namespace Common.BaseRepositories4EF if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; - var entities = dbContext.Set().Where(t => ids.Contains(t.Id)).ToList(); + var queryable = dbContext.Set().Where(t => ids.Contains(t.Id)).AddTenantContition(session); + var entities = queryable.ToList(); if (entities != null) { unitOfWork.BeginWithoutLevel(); @@ -90,7 +89,8 @@ namespace Common.BaseRepositories4EF { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; - var entities = dbContext.Set().Where(predicate).ToList(); + var queryable = dbContext.Set().Where(predicate).AddTenantContition(session); + var entities = queryable.ToList(); if (entities != null) { unitOfWork.BeginWithoutLevel(); @@ -114,7 +114,8 @@ namespace Common.BaseRepositories4EF public async Task GetAsync([NotNull] Expression> predicate, bool includeDetails = false, CancellationToken cancellationToken = default) { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - return await Task.FromResult(dbContext.Set().Where(predicate).FirstOrDefault()); + var queryable = dbContext.Set().Where(predicate).AddTenantContition(session); + return await Task.FromResult(queryable.FirstOrDefault()); } public async Task GetCountAsync(CancellationToken cancellationToken = default) @@ -126,25 +127,26 @@ namespace Common.BaseRepositories4EF public async Task GetCountAsync([NotNull] Expression> predicate, CancellationToken cancellationToken = default) { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return 0; - return await Task.FromResult(dbContext.Set().Count(predicate)); + var queryable = dbContext.Set().Where(predicate).AddTenantContition(session); + return await Task.FromResult(queryable.Count()); } public async Task> GetListAsync(bool includeDetails = false, CancellationToken cancellationToken = default) { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - return await Task.FromResult(dbContext.Set().ToList()); + return await Task.FromResult(dbContext.Set().AddTenantContition(session).ToList()); } public async Task> GetListAsync([global::JetBrains.Annotations.NotNullAttribute] Expression> predicate, bool includeDetails = false, CancellationToken cancellationToken = default) { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - return await Task.FromResult(dbContext.Set().Where(predicate).ToList()); + return await Task.FromResult(dbContext.Set().Where(predicate).AddTenantContition(session).ToList()); } public async Task> GetPagedListAsync(int skipCount, int maxResultCount, string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - var query = dbContext.Set().Where(t => true); + var query = dbContext.Set().Where(t => true).AddTenantContition(session); if (!string.IsNullOrEmpty(sorting)) query = query.OrderBy(sorting); return await Task.FromResult(query.Skip(skipCount).Take(maxResultCount).ToList()); @@ -153,7 +155,7 @@ namespace Common.BaseRepositories4EF public async Task> GetPagedListAsync([NotNull] Expression> predicate, int skipCount, int maxResultCount, string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) { if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - var query = dbContext.Set().Where(predicate); + var query = dbContext.Set().Where(predicate).AddTenantContition(session); if (!string.IsNullOrEmpty(sorting)) query = query.OrderBy(sorting); return await Task.FromResult(query.Skip(skipCount).Take(maxResultCount).ToList()); @@ -172,7 +174,11 @@ namespace Common.BaseRepositories4EF withBaseInfoEntity.ModifiedUserId = session?.User?.Id; entity = (TEntity)withBaseInfoEntity; } - + if (entity is ITenantsEntity) + { + var tenantEntity = (ITenantsEntity)entity; + tenantEntity.TenantId = session?.User?.TenantId; + } unitOfWork.BeginWithoutLevel(); await dbContext.Set().AddAsync(entity, cancellationToken); if (autoSave||!unitOfWork.IsActive()) await dbContext.SaveChangesAsync(cancellationToken); @@ -192,6 +198,11 @@ namespace Common.BaseRepositories4EF withBaseInfoEntity.ModifiedTime = DateTime.Now; withBaseInfoEntity.ModifiedUserId = session?.User?.Id; } + if (entity is ITenantsEntity) + { + var tenantEntity = (ITenantsEntity)entity; + tenantEntity.TenantId = session?.User?.TenantId; + } } unitOfWork.BeginWithoutLevel(); await dbContext.Set().AddRangeAsync(entities, cancellationToken); @@ -206,6 +217,11 @@ namespace Common.BaseRepositories4EF withBaseInfoEntity.ModifiedTime = DateTime.Now; withBaseInfoEntity.ModifiedUserId = session?.User?.Id; } + if (entity is ITenantsEntity) + { + var tenantEntity = (ITenantsEntity)entity; + tenantEntity.TenantId = session?.User?.TenantId; + } unitOfWork.BeginWithoutLevel(); dbContext.Set().Update(entity); if (autoSave || !unitOfWork.IsActive()) await dbContext.SaveChangesAsync(cancellationToken); @@ -223,6 +239,11 @@ namespace Common.BaseRepositories4EF withBaseInfoEntity.ModifiedTime = DateTime.Now; withBaseInfoEntity.ModifiedUserId = session?.User?.Id; } + if(entity is ITenantsEntity) + { + var tenantEntity = (ITenantsEntity)entity; + tenantEntity.TenantId = session?.User?.TenantId; + } } unitOfWork.BeginWithoutLevel(); dbContext.Set().UpdateRange(entities); @@ -250,7 +271,7 @@ namespace Common.BaseRepositories4EF if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - var query = dbContext.Set().Where(whereInfo.Where.ToString(), whereInfo.Parameters.ToArray()); + var query = dbContext.Set().Where(whereInfo.Where.ToString(), whereInfo.Parameters.ToArray()).AddTenantContition(session); if (predicate != null) query = query.Where(predicate); if (!string.IsNullOrEmpty(sorting)) query = query.OrderBy(sorting); @@ -261,7 +282,7 @@ namespace Common.BaseRepositories4EF { var whereInfo = QueryCondition.GetWhereInfo(conditions); if (cancellationToken != null && cancellationToken.IsCancellationRequested) return 0; - var query = dbContext.Set().Where(whereInfo.Where.ToString(), whereInfo.Parameters.ToArray()); + var query = dbContext.Set().Where(whereInfo.Where.ToString(), whereInfo.Parameters.ToArray()).AddTenantContition(session); if (predicate != null) query = query.Where(predicate); return query.Count(); } @@ -270,12 +291,123 @@ namespace Common.BaseRepositories4EF { var whereInfo = QueryCondition.GetWhereInfo(conditions); if (cancellationToken != null && cancellationToken.IsCancellationRequested) return null; - var query = dbContext.Set().Where(whereInfo.Where.ToString(), whereInfo.Parameters.ToArray()); + var query = dbContext.Set().Where(whereInfo.Where.ToString(), whereInfo.Parameters.ToArray()).AddTenantContition(session); if (predicate != null) query = query.Where(predicate); if (!string.IsNullOrEmpty(sorting)) query = query.OrderBy(sorting); return await Task.FromResult(query.Skip(skipCount).Take(maxResultCount).ToList()); } + + public async Task SoftDeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default) + { + if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; + + var entity = await dbContext.Set().FindAsync(id); + if (entity != null) + { + if (entity is ISoftDeleteEntity) + { + var deleteEntity = (ISoftDeleteEntity)entity; + deleteEntity.DeletedUserId = session?.User?.Id; + deleteEntity.DeletedTime = DateTime.Now; + deleteEntity.Deleted = true; + } + unitOfWork.BeginWithoutLevel(); + dbContext.Update(entity); + if (autoSave || !unitOfWork.IsActive()) await dbContext.SaveChangesAsync(); + } + } + + public async Task SoftDeleteAsync([global::JetBrains.Annotations.NotNullAttribute] TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default) + { + if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; + + if (entity != null) + { + if (entity is ISoftDeleteEntity) + { + var deleteEntity = (ISoftDeleteEntity)entity; + deleteEntity.DeletedUserId = session?.User?.Id; + deleteEntity.DeletedTime = DateTime.Now; + deleteEntity.Deleted = true; + } + unitOfWork.BeginWithoutLevel(); + dbContext.Update(entity); + if (autoSave || !unitOfWork.IsActive()) await dbContext.SaveChangesAsync(cancellationToken); + } + } + + public async Task SoftDeleteManyAsync([global::JetBrains.Annotations.NotNullAttribute] IEnumerable ids, bool autoSave = false, CancellationToken cancellationToken = default) + { + + if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; + + var entities = dbContext.Set().Where(t => ids.Contains(t.Id)).ToList(); + if (entities != null) + { + if (typeof(ISoftDeleteEntity).IsAssignableFrom(typeof(TEntity))) + { + foreach (var entity in entities) + { + var deleteEntity = (ISoftDeleteEntity)entity; + deleteEntity.DeletedUserId = session?.User?.Id; + deleteEntity.DeletedTime = DateTime.Now; + deleteEntity.Deleted = true; + } + } + unitOfWork.BeginWithoutLevel(); + dbContext.UpdateRange(entities); + if (autoSave || !unitOfWork.IsActive()) await dbContext.SaveChangesAsync(cancellationToken); + } + + } + + public async Task SoftDeleteManyAsync([global::JetBrains.Annotations.NotNullAttribute] IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default) + { + if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; + if (entities != null) + { + if (typeof(ISoftDeleteEntity).IsAssignableFrom(typeof(TEntity))) + { + foreach (var entity in entities) + { + var deleteEntity = (ISoftDeleteEntity)entity; + deleteEntity.DeletedUserId = session?.User?.Id; + deleteEntity.DeletedTime = DateTime.Now; + deleteEntity.Deleted = true; + } + } + unitOfWork.BeginWithoutLevel(); + dbContext.UpdateRange(entities); + if (autoSave || !unitOfWork.IsActive()) await dbContext.SaveChangesAsync(cancellationToken); + } + } + + public async Task SoftDeleteManyAsync([NotNull] Expression> predicate, bool autoSave = false, CancellationToken cancellationToken = default) + { + if (cancellationToken != null && cancellationToken.IsCancellationRequested) return; + + var entities = dbContext.Set().Where(predicate).AddTenantContition(session).ToList(); + if (entities != null) + { + if (typeof(ISoftDeleteEntity).IsAssignableFrom(typeof(TEntity))) + { + foreach (var entity in entities) + { + var deleteEntity = (ISoftDeleteEntity)entity; + deleteEntity.DeletedUserId = session?.User?.Id; + deleteEntity.DeletedTime = DateTime.Now; + deleteEntity.Deleted = true; + } + } + unitOfWork.BeginWithoutLevel(); + dbContext.UpdateRange(entities); + if (autoSave || !unitOfWork.IsActive()) await dbContext.SaveChangesAsync(cancellationToken); + } + } + + + } public class BasicRepository4EF : BasicRepository4EF, IReadOnlyBasicRepository where TEntity : class, IEntity diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/EfContextExtensions.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/EfContextExtensions.cs new file mode 100644 index 0000000..4af1083 --- /dev/null +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/EfContextExtensions.cs @@ -0,0 +1,25 @@ +using Common.Authorization; +using Common.IBaseRepositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Dynamic.Core; +using System.Text; + +namespace Common.BaseRepositories4EF +{ + public static class EfContextExtensions + { + public static IQueryable AddTenantContition(this IQueryable queryable, ICommonSession session) where TEntity : class, IEntity + { + if (typeof(ITenantsEntity).IsAssignableFrom(typeof(TEntity))) + { + if (!string.IsNullOrEmpty(session?.User?.TenantId)) + { + queryable = queryable.Where("TenantId={0}", session?.User?.TenantId); + } + } + return queryable; + } + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus.Kafka/IKafkaEventBus.cs b/WorkFlowCore/Commons/Common.EventBus.Kafka/IKafkaEventBus.cs new file mode 100644 index 0000000..dbd4c6c --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus.Kafka/IKafkaEventBus.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.EventBus.Kafka +{ + public interface IKafkaEventBus: IEventBus + { + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs b/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs index 2c2ffbc..e0b6fb9 100644 --- a/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs +++ b/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs @@ -13,7 +13,7 @@ using System.Threading.Tasks; namespace Common.EventBus.Kafka { - public class KafkaEventBus : IEventBus + public class KafkaEventBus : IKafkaEventBus { private IServiceProvider serviceProvider; private readonly KafkaEventConfig eventConfig; diff --git a/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBusModule.cs b/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBusModule.cs index 70660f1..431e5ef 100644 --- a/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBusModule.cs +++ b/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBusModule.cs @@ -11,6 +11,7 @@ namespace Common.EventBus.Kafka { public static IServiceCollection AddKafkaEventBus(this IServiceCollection services, Action options) { + services.AddSingleton(typeof(IKafkaEventBus), typeof(KafkaEventBus)); services.AddSingleton(typeof(IEventBus), typeof(KafkaEventBus)); services.AddSingleton(typeof(KafkaEventBus)); var config = new KafkaEventConfig(); diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteEntity.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteEntity.cs new file mode 100644 index 0000000..bad794d --- /dev/null +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteEntity.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.IBaseRepositories +{ + public interface ISoftDeleteEntity + { + /// + /// 删除用户 + /// + string DeletedUserId { get; set; } + /// + /// 删除时间 + /// + DateTime DeletedTime { get; set; } + /// + /// 删除状态 + /// + bool Deleted { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteRepository.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteRepository.cs new file mode 100644 index 0000000..383d015 --- /dev/null +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/ISoftDeleteRepository.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using JetBrains.Annotations; +using System.Linq.Expressions; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Common.IBaseRepositories +{ + public interface ISoftDeleteRepository where TEntity : class, IEntity + { + /// + /// Deletes an entity. + /// + /// Entity to be deleted + /// + /// Set true to automatically save changes to database. + /// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database. + /// + /// A to observe while waiting for the task to complete. + Task SoftDeleteAsync([NotNull] TEntity entity, bool autoSave = false, CancellationToken cancellationToken = default); + + /// + /// Deletes multiple entities. + /// + /// Entities to be deleted. + /// + /// Set true to automatically save changes to database. + /// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database. + /// + /// A to observe while waiting for the task to complete. + /// Awaitable . + Task SoftDeleteManyAsync([NotNull] IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default); + + /// + /// Deletes multiple entities. + /// + /// conditions + /// + /// Set true to automatically save changes to database. + /// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database. + /// + /// A to observe while waiting for the task to complete. + /// + Task SoftDeleteManyAsync([NotNull] Expression> predicate, bool autoSave = false, CancellationToken cancellationToken = default); +} + + public interface ISoftDeleteRepository where TEntity : class, IEntity + { + /// + /// Deletes an entity by primary key. + /// + /// Primary key of the entity + /// + /// Set true to automatically save changes to database. + /// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database. + /// + /// A to observe while waiting for the task to complete. + Task SoftDeleteAsync(TKey id, bool autoSave = false, CancellationToken cancellationToken = default); //TODO: Return true if deleted + + /// + /// Deletes multiple entities by primary keys. + /// + /// Primary keys of the each entity. + /// + /// Set true to automatically save changes to database. + /// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database. + /// + /// A to observe while waiting for the task to complete. + /// Awaitable . + Task SoftDeleteManyAsync([NotNull] IEnumerable ids, bool autoSave = false, CancellationToken cancellationToken = default); + } +} diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/ITenantsEntity.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/ITenantsEntity.cs new file mode 100644 index 0000000..a614979 --- /dev/null +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/ITenantsEntity.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.IBaseRepositories +{ + public interface ITenantsEntity + { + public string TenantId { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs index e78e161..15a659c 100644 --- a/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs @@ -5,7 +5,7 @@ using System.Text; namespace Common.IBaseRepositories { - public interface IWithBaseInfoEntity : IEntity + public interface IWithBaseInfoEntity : IEntity, ISoftDeleteEntity { /// /// 更新时间 @@ -24,18 +24,7 @@ namespace Common.IBaseRepositories /// DateTime CreationTime { get; set; } - /// - /// 删除用户 - /// - string DeletedUserId { get; set; } - /// - /// 删除时间 - /// - DateTime DeletedTime { get; set; } - /// - /// 删除状态 - /// - bool Deleted { get; set; } + } public interface IWithBaseInfoEntity : IWithBaseInfoEntity diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories4EF/IBasicRepository4EF.cs b/WorkFlowCore/Commons/Common.IBaseRepositories4EF/IBasicRepository4EF.cs index 20ccaea..ca5d75d 100644 --- a/WorkFlowCore/Commons/Common.IBaseRepositories4EF/IBasicRepository4EF.cs +++ b/WorkFlowCore/Commons/Common.IBaseRepositories4EF/IBasicRepository4EF.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; namespace Common.IBaseRepositories4EF { - public interface IBasicRepository4EF : IBasicRepository, IReadOnlyBasicRepository where TEntity : class, IEntity + public interface IBasicRepository4EF : IBasicRepository, IReadOnlyBasicRepository, ISoftDeleteRepository where TEntity : class, IEntity { Task> GetListAsync( List conditions, diff --git a/admin/vue-admin-template/.env.development b/admin/vue-admin-template/.env.development index 89b492c..a10dfae 100644 --- a/admin/vue-admin-template/.env.development +++ b/admin/vue-admin-template/.env.development @@ -2,5 +2,5 @@ ENV = 'development' # base api -VUE_APP_BASE_API = 'http://localhost:7001/' +VUE_APP_BASE_API = 'http://localhost:5400/' //VUE_APP_BASE_API = 'https://localhost:6001/api' diff --git a/localapp-workflow.bat b/localapp-workflow.bat index c2ee0d9..2a78538 100644 --- a/localapp-workflow.bat +++ b/localapp-workflow.bat @@ -5,7 +5,7 @@ set ASPNETCORE_ENVIRONMENT=Development cd WorkFlowCore\Workflow\WorkFlowCore.Host dotnet build cd bin\Debug\netcoreapp3.1\ -dotnet "WorkFlowCore.Host.dll" --urls "http://[*]:5100" --ip "172.26.96.1" --port "5100" --servicename workflow --KafkaBootstrapServers "kafka1:9092" --ConnectionString "Database=Workflow;Data Source=localhost;Port=3306;UserId=root;Password=123456;Charset=utf8;TreatTinyAsBoolean=false;Allow User Variables=True" +dotnet "WorkFlowCore.Host.dll" --Gateway "http://localhost:5400/" --urls "http://[*]:5100" --ip "172.26.96.1" --port "5100" --servicename workflow --KafkaBootstrapServers "kafka1:9092" --ConnectionString "Database=Workflow;Data Source=localhost;Port=3306;UserId=root;Password=123456;Charset=utf8;TreatTinyAsBoolean=false;Allow User Variables=True" -- Gitee From ac9a2ad719f7b8ea4377bc481fcc2042de05e41b Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 19 Oct 2022 20:49:10 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=97=A0=E6=B3=95=E5=9B=9E=E6=BB=9A=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20=E5=A2=9E=E5=8A=A0commondbcontext=EF=BC=8C=E4=B8=BA?= =?UTF-8?q?=E5=90=8E=E5=AE=9E=E7=8E=B0=E5=88=86=E5=BA=93=E5=A4=9A=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=8A=A8=E6=80=81=E5=88=87=E5=BA=93=E5=81=9A=E5=87=86?= =?UTF-8?q?=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BaseRepositories4EFModule.cs | 10 ++++- .../DbContexts/CommonDbContext.cs | 31 +++++++++++++++ .../CommonDbContextOptionsBuilder.cs | 28 +++++++++++++ .../DbContexts/DbContextConfigure.cs | 30 ++++++++++++++ .../DynamicApiBuilderModule.cs | 2 +- .../UnitOfWorkApiInterceptor.cs | 1 + .../Commons/Common.UnitOfWork/IUnitOfWork.cs | 1 + .../Common.UnitOfWork/UnitOfWorkMiddleware.cs | 10 ++++- .../UnitOfWork4EF.cs | 15 +++++-- .../Common.WebApi/Common.WebApi.csproj | 1 + .../Common.WebApi/ExceptionMiddleware.cs | 39 +++++++++++++++++++ .../Commons/Common.WebApi/WebApiModule.cs | 17 ++++++++ .../FormInstances/FormInstanceAppService.cs | 1 + .../DynamicFormDbContext.cs | 10 ++++- .../DynamicFormFrameworkModule.cs | 16 +++++++- .../DynamicForm/DynamicForm.Host/Startup.cs | 5 ++- .../Organization.Host/Startup.cs | 2 + .../Repositories/UnitOfWork.cs | 27 +++++++------ .../Workflow/WorkFlowCore.Host/Startup.cs | 2 + 19 files changed, 226 insertions(+), 22 deletions(-) create mode 100644 WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContext.cs create mode 100644 WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContextOptionsBuilder.cs create mode 100644 WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/DbContextConfigure.cs create mode 100644 WorkFlowCore/Commons/Common.WebApi/ExceptionMiddleware.cs create mode 100644 WorkFlowCore/Commons/Common.WebApi/WebApiModule.cs diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/BaseRepositories4EFModule.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/BaseRepositories4EFModule.cs index f2d3bd1..723208a 100644 --- a/WorkFlowCore/Commons/Common.BaseRepositories4EF/BaseRepositories4EFModule.cs +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/BaseRepositories4EFModule.cs @@ -1,6 +1,8 @@ -using Common.IBaseRepositories; +using Common.BaseRepositories4EF.DbContexts; +using Common.IBaseRepositories; using Common.IBaseRepositories4EF; using Common.UnitOfWork4EntityFramework; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; @@ -18,5 +20,11 @@ namespace Common.BaseRepositories4EF services.AddUnitOfWork4EntityFramework(); return services; } + public static IServiceCollection AddCommonDbContext(this IServiceCollection services, Action options) where TDbContext : CommonDbContext + { + services.AddDbContext(); + DbContextConfigure.SetOptionsConfiguration(options); + return services; + } } } diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContext.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContext.cs new file mode 100644 index 0000000..e80180e --- /dev/null +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContext.cs @@ -0,0 +1,31 @@ +using JetBrains.Annotations; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.BaseRepositories4EF.DbContexts +{ + public class CommonDbContext : DbContext + { + public CommonDbContext([NotNull] DbContextOptions options) : base(options) + { + } + static int index = 0; + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + var configuration = DbContextConfigure.GetOptionsConfiguration(this.GetType()); + if (configuration != null) + { + var isDynamicConnect = index % 2 == 0; + //TODO 根据当前会话获取租户信息,多租户的 host 自己根据需要配置是否分库,原则上, + var commonConfigure = new CommonDbContextOptionsBuilder(isDynamicConnect, "", ""); + index++; + configuration.Invoke(commonConfigure); + if(commonConfigure.Options!=null&&(isDynamicConnect || !optionsBuilder.IsConfigured)) + commonConfigure.Options.Invoke(optionsBuilder); + } + base.OnConfiguring(optionsBuilder); + } + } +} diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContextOptionsBuilder.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContextOptionsBuilder.cs new file mode 100644 index 0000000..ccc0d18 --- /dev/null +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/CommonDbContextOptionsBuilder.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.BaseRepositories4EF.DbContexts +{ + public class CommonDbContextOptionsBuilder + { + public CommonDbContextOptionsBuilder(bool isDynamicConnect, string connectionString, string connectionVersion) + { + IsDynamicConnect = isDynamicConnect; + ConnectionString = connectionString; + ConnectionVersion = connectionVersion; + + } + + public void ConfigureDbContext(Action options) + { + Options = options; + } + + public bool IsDynamicConnect { get;internal set; } + public string ConnectionString { get;internal set; } + public string ConnectionVersion { get;internal set; } + public Action Options { get;set; } + } +} diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/DbContextConfigure.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/DbContextConfigure.cs new file mode 100644 index 0000000..8727ccf --- /dev/null +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/DbContexts/DbContextConfigure.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.BaseRepositories4EF.DbContexts +{ + internal static class DbContextConfigure + { + private static Dictionary> contextConfigurations; + static DbContextConfigure() + { + contextConfigurations = new Dictionary>(); + } + + internal static Action GetOptionsConfiguration(Type typeOfDbContext) + { + if(contextConfigurations.ContainsKey(typeOfDbContext)) + return contextConfigurations[typeOfDbContext]; + return null; + } + internal static void SetOptionsConfiguration(Action action) where TDbContext : CommonDbContext + { + if (contextConfigurations.ContainsKey(typeof(TDbContext))) + contextConfigurations[typeof(TDbContext)] = action; + else contextConfigurations.Add(typeof(TDbContext), action); + } + + } +} diff --git a/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiBuilderModule.cs b/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiBuilderModule.cs index 178c4a4..77e46eb 100644 --- a/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiBuilderModule.cs +++ b/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiBuilderModule.cs @@ -17,7 +17,7 @@ namespace Common.DynamicApi services.AddControllers(options => { //全局异常过滤 - options.Filters.Add(); + //options.Filters.Add(); }).AddDynamicApi(appServiceAassembly); services.AddScoped(); diff --git a/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiInterceptors/UnitOfWorkApiInterceptor.cs b/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiInterceptors/UnitOfWorkApiInterceptor.cs index cfe1783..27677cf 100644 --- a/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiInterceptors/UnitOfWorkApiInterceptor.cs +++ b/WorkFlowCore/Commons/Common.DynamicApi/DynamicApiInterceptors/UnitOfWorkApiInterceptor.cs @@ -21,6 +21,7 @@ namespace Common.DynamicApi.DynamicApiInterceptors public void BeforeExecute() { // + //unitOfWork.Enabled(); } public void Executed() diff --git a/WorkFlowCore/Commons/Common.UnitOfWork/IUnitOfWork.cs b/WorkFlowCore/Commons/Common.UnitOfWork/IUnitOfWork.cs index 9498982..8ddd63f 100644 --- a/WorkFlowCore/Commons/Common.UnitOfWork/IUnitOfWork.cs +++ b/WorkFlowCore/Commons/Common.UnitOfWork/IUnitOfWork.cs @@ -8,6 +8,7 @@ namespace Common.UnitOfWork { bool Commit(); + void Rollback(); bool HasCommitted(); bool IsActive(); void Enabled(); diff --git a/WorkFlowCore/Commons/Common.UnitOfWork/UnitOfWorkMiddleware.cs b/WorkFlowCore/Commons/Common.UnitOfWork/UnitOfWorkMiddleware.cs index f9a46b3..8d3be38 100644 --- a/WorkFlowCore/Commons/Common.UnitOfWork/UnitOfWorkMiddleware.cs +++ b/WorkFlowCore/Commons/Common.UnitOfWork/UnitOfWorkMiddleware.cs @@ -19,7 +19,15 @@ namespace Common.UnitOfWork { unitOfWork.Enabled(); - await next(context); + try + { + await next(context); + } + catch (Exception) + { + unitOfWork.Rollback(); + throw; + } unitOfWork.Commit(); } } diff --git a/WorkFlowCore/Commons/Common.UnitOfWork4EntityFramework/UnitOfWork4EF.cs b/WorkFlowCore/Commons/Common.UnitOfWork4EntityFramework/UnitOfWork4EF.cs index 978658a..0ecada5 100644 --- a/WorkFlowCore/Commons/Common.UnitOfWork4EntityFramework/UnitOfWork4EF.cs +++ b/WorkFlowCore/Commons/Common.UnitOfWork4EntityFramework/UnitOfWork4EF.cs @@ -46,7 +46,7 @@ namespace Common.UnitOfWork4EntityFramework { Console.WriteLine(ex.ToString()); //回滚 - dbContextTransaction.Rollback(); + Rollback(); return false; } @@ -54,8 +54,10 @@ namespace Common.UnitOfWork4EntityFramework public void Dispose() { - if(isActive) - Commit(); + if (dbContextTransaction == null) return; + + //if (isActive) + // Commit(); if (!isActive) dbContextTransaction?.Dispose(); } @@ -91,5 +93,12 @@ namespace Common.UnitOfWork4EntityFramework { return isEnabled&&hasCommitted; } + + public void Rollback() + { + //回滚 + dbContextTransaction.Rollback(); + isActive = false; + } } } diff --git a/WorkFlowCore/Commons/Common.WebApi/Common.WebApi.csproj b/WorkFlowCore/Commons/Common.WebApi/Common.WebApi.csproj index f2730a3..0340a10 100644 --- a/WorkFlowCore/Commons/Common.WebApi/Common.WebApi.csproj +++ b/WorkFlowCore/Commons/Common.WebApi/Common.WebApi.csproj @@ -13,6 +13,7 @@ + diff --git a/WorkFlowCore/Commons/Common.WebApi/ExceptionMiddleware.cs b/WorkFlowCore/Commons/Common.WebApi/ExceptionMiddleware.cs new file mode 100644 index 0000000..ba7557e --- /dev/null +++ b/WorkFlowCore/Commons/Common.WebApi/ExceptionMiddleware.cs @@ -0,0 +1,39 @@ +using Common.UnitOfWork; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using System.Net; +using Newtonsoft.Json; +using Common.WebApi.ViewModels; + +namespace Common.WebApi +{ + public class ExceptionMiddleware + { + private readonly RequestDelegate next; + + public ExceptionMiddleware( RequestDelegate next) + { + this.next = next; + } + + public async Task Invoke(HttpContext context,ILogger logger) + { + try + { + await next(context); + } + catch (Exception ex) + { + context.Response.ContentType="application/json"; + context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; + context.Response.Body.WriteAsync(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(OutputDto.Failed($"发生异常:{ex.Message}")))); + logger.LogError($"发生异常:{ex.Message}", ex); + Console.Error.WriteLine(ex.ToString()); + } + } + } +} diff --git a/WorkFlowCore/Commons/Common.WebApi/WebApiModule.cs b/WorkFlowCore/Commons/Common.WebApi/WebApiModule.cs new file mode 100644 index 0000000..423b285 --- /dev/null +++ b/WorkFlowCore/Commons/Common.WebApi/WebApiModule.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.AspNetCore.Builder; + +namespace Common.WebApi +{ + public static class WebApiModule + { + public static IApplicationBuilder UseWebApiExceptionHandler(this IApplicationBuilder app) + { + app.UseMiddleware(); + return app; + + } + } +} diff --git a/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs b/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs index 44c9525..4a34a42 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs @@ -37,6 +37,7 @@ namespace DynamicForm.AppService.FormInstances { var instance = new FormInstance(input.FormDesignId, input.WorkflowId, input.FormData, input.Title); await repository.InsertAsync(instance.ToFormInstanceInfo()); + throw new Exception("test"); return instance.Adapt(); } public override async Task UpdateAsync(Guid id, FormInstanceUpdateInput input) diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs index c33586b..0aec54a 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs @@ -1,4 +1,5 @@ -using DynamicForm.Core; +using Common.BaseRepositories4EF.DbContexts; +using DynamicForm.Core; using DynamicForm.Core.Users; using DynamicForm.Core.Workflows; using JetBrains.Annotations; @@ -12,7 +13,7 @@ using System.Threading.Tasks; namespace DynamicForm.Framework { - public class DynamicFormDbContext : DbContext + public class DynamicFormDbContext : CommonDbContext { public DynamicFormDbContext([JetBrains.Annotations.NotNull] DbContextOptions options) : base(options) { @@ -30,6 +31,11 @@ namespace DynamicForm.Framework public DbSet WorkflowVersions { get; set; } #endregion + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); + } + protected override void OnModelCreating(ModelBuilder modelBuilder) { //增加别名,避免同一数据时表重名 diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs index 331a925..687d879 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs @@ -22,10 +22,22 @@ namespace DynamicForm.Framework var configuration = new DynamicFormFrameworkModuleConfiguration(); options?.Invoke(configuration); + /*services.AddDbContext()*/; + //services.AddDbContext(op => + //{ + // op.UseMySql(configuration?.DbConnectionString, new MySqlServerVersion(configuration.DbServerVersion)); + //}); - services.AddDbContext(op => + services.AddCommonDbContext(options => { - op.UseMySql(configuration?.DbConnectionString, new MySqlServerVersion(configuration.DbServerVersion)); + // + options.ConfigureDbContext(op => + { + if (options.IsDynamicConnect) + op.UseMySql(configuration?.DbConnectionString, new MySqlServerVersion(configuration.DbServerVersion)); + else + op.UseMySql(configuration?.DbConnectionString, new MySqlServerVersion(configuration.DbServerVersion)); + }); }); services.AddScoped(); return services; diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs b/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs index 2e3aecd..215ad4b 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Host/Startup.cs @@ -5,6 +5,7 @@ using Common.EventBus; using Common.EventBus.Kafka; using Common.MicroService.Registers; using Common.UnitOfWork; +using Common.WebApi; using DynamicForm.AppService; using DynamicForm.Core; using DynamicForm.Framework; @@ -108,8 +109,10 @@ namespace DynamicForm.Host app.UseAuthorization(); app.UseEventBus(); app.RunKafkaEventBus(); + + app.UseWebApiExceptionHandler(); + app.UseUnitOfWork(); - app.UseEndpoints(endpoints => { endpoints.MapControllers(); diff --git a/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs b/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs index eb38f55..b8ff68c 100644 --- a/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs +++ b/WorkFlowCore/UserOrganization/Organization.Host/Startup.cs @@ -7,6 +7,7 @@ using Common.EventBus.Kafka; using Common.MicroService; using Common.MicroService.Registers; using Common.UnitOfWork; +using Common.WebApi; using Common.WebApi.Filters; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; @@ -104,6 +105,7 @@ namespace Organization.Host app.UseAuthorization(); app.UseEventBus(); app.RunKafkaEventBus(); + app.UseWebApiExceptionHandler(); app.UseUnitOfWork(); app.UseEndpoints(endpoints => { diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories/UnitOfWork.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories/UnitOfWork.cs index 1091eda..64c41e8 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories/UnitOfWork.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories/UnitOfWork.cs @@ -50,17 +50,7 @@ namespace WorkFlowCore.Framework.Repositories } catch (Exception) { - //回滚 - foreach (var item in removeList) - { - if(!VirtualDB.IsContains(item.GetType(), item)) - VirtualDB.Add(item.GetType(), item); - } - foreach (var item in addList) - { - if (VirtualDB.IsContains(item.GetType(), item)) - VirtualDB.Remove(item.GetType(), item); - } + Rollback(); return false; } } @@ -130,5 +120,20 @@ namespace WorkFlowCore.Framework.Repositories if (this.isActive) return; isActive = true; } + + public void Rollback() + { + //回滚 + foreach (var item in removeList) + { + if (!VirtualDB.IsContains(item.GetType(), item)) + VirtualDB.Add(item.GetType(), item); + } + foreach (var item in addList) + { + if (VirtualDB.IsContains(item.GetType(), item)) + VirtualDB.Remove(item.GetType(), item); + } + } } } diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs b/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs index 334c019..5e0a624 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Host/Startup.cs @@ -5,6 +5,7 @@ using Common.EventBus.Kafka; using Common.MicroService; using Common.MicroService.Registers; using Common.UnitOfWork; +using Common.WebApi; using Common.WebApi.Filters; using Consul; using Microsoft.AspNetCore.Builder; @@ -114,6 +115,7 @@ namespace WorkFlowCore.Host }); app.UseEventBus(); app.RunKafkaEventBus(); + app.UseWebApiExceptionHandler(); app.UseUnitOfWork(); app.UseEndpoints(endpoints => { -- Gitee From 6b904536d50079addae1307c449a901e00234bcb Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 19 Oct 2022 22:02:13 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AE=80=E6=98=93?= =?UTF-8?q?=E7=9A=84=E6=8F=92=E4=BB=B6=E8=BD=BD=E5=85=A5=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.SimplePluginLoader.csproj | 13 ++++ .../CommonSimplePluginLoader.cs | 59 +++++++++++++++++++ .../Common.SimplePluginLoader/Manifest.cs | 14 +++++ .../PluginAssemblyLoadContext.cs | 29 +++++++++ WorkFlowCore/WorkFlowCore.sln | 9 ++- .../WorkFlowCoreFrameworkModule.cs | 15 +++++ 6 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj create mode 100644 WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs create mode 100644 WorkFlowCore/Commons/Common.SimplePluginLoader/Manifest.cs create mode 100644 WorkFlowCore/Commons/Common.SimplePluginLoader/PluginAssemblyLoadContext.cs diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj b/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj new file mode 100644 index 0000000..b555a71 --- /dev/null +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj @@ -0,0 +1,13 @@ + + + + netcoreapp3.1 + enable + enable + + + + + + + diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs b/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs new file mode 100644 index 0000000..f5ec796 --- /dev/null +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; +using Microsoft.Extensions.DependencyInjection; +using Newtonsoft.Json; + +namespace Common.SimplePluginLoader +{ + public static class CommonSimplePluginLoader + { + /// + /// 载入插件 + /// + /// + /// + /// + /// + /// + public static IServiceCollection LoadPlugins(this IServiceCollection services, string pluginDir, Action> loaded) where TManifest : Manifest + { + if (!Directory.Exists(pluginDir)) return services; + + var plugins = new List(); + + var dirs = Directory.GetDirectories(pluginDir); + foreach (var dir in dirs) + { + var manifestPath = Path.Combine(dir, "manifest.json"); + if (!File.Exists(manifestPath)) continue; + try + { + var manifest = JsonConvert.DeserializeObject(File.ReadAllText(manifestPath)); + if (manifest == null) continue; + + var context = new PluginAssemblyLoadContext(System.IO.Path.Combine(dir, "src", manifest.Entry)); + var EntryLib = manifest.Entry; + var assembly = context.LoadFromAssemblyName(new System.Reflection.AssemblyName(EntryLib.Substring(0, EntryLib.Length - 4))); + manifest.Assembly = assembly; + plugins.Add(manifest); + } + catch (Exception ex) + { + + // + } + + } + loaded?.Invoke(plugins); + + return services; + } + + public static IServiceCollection LoadPlugins(this IServiceCollection services, string pluginDir, Action> loaded) + { + return LoadPlugins(services, pluginDir, loaded); + } + } +} diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/Manifest.cs b/WorkFlowCore/Commons/Common.SimplePluginLoader/Manifest.cs new file mode 100644 index 0000000..adbbfad --- /dev/null +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/Manifest.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace Common.SimplePluginLoader +{ + public class Manifest + { + public string Entry { get; set; } + public string Version { get; set; } + public Assembly Assembly { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/PluginAssemblyLoadContext.cs b/WorkFlowCore/Commons/Common.SimplePluginLoader/PluginAssemblyLoadContext.cs new file mode 100644 index 0000000..7d8a315 --- /dev/null +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/PluginAssemblyLoadContext.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.Loader; +using System.Text; + +namespace Common.SimplePluginLoader +{ + public class PluginAssemblyLoadContext : AssemblyLoadContext + { + private AssemblyDependencyResolver _resolver; + + public PluginAssemblyLoadContext(string mainAssemblyToLoadPath) : base(isCollectible: true) + { + _resolver = new AssemblyDependencyResolver(mainAssemblyToLoadPath); + } + + protected override Assembly Load(AssemblyName name) + { + string assemblyPath = _resolver.ResolveAssemblyToPath(name); + if (assemblyPath != null) + { + return LoadFromAssemblyPath(assemblyPath); + } + + return null; + } + } +} diff --git a/WorkFlowCore/WorkFlowCore.sln b/WorkFlowCore/WorkFlowCore.sln index b7aab65..722f639 100644 --- a/WorkFlowCore/WorkFlowCore.sln +++ b/WorkFlowCore/WorkFlowCore.sln @@ -79,7 +79,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.UnitOfWork", "Common EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.UnitOfWork4EntityFramework", "Commons\Common.UnitOfWork4EntityFramework\Common.UnitOfWork4EntityFramework.csproj", "{E1E16CA1-38EC-4F0D-AB15-F097174EC3B4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.Mapster", "Commons\Common.Mapster\Common.Mapster.csproj", "{3C37AF32-C83D-4C54-8F17-74DD0584BC50}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Mapster", "Commons\Common.Mapster\Common.Mapster.csproj", "{3C37AF32-C83D-4C54-8F17-74DD0584BC50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.SimplePluginLoader", "Commons\Common.SimplePluginLoader\Common.SimplePluginLoader.csproj", "{038F8892-EDB7-4091-AC59-D21DC44033E0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -223,6 +225,10 @@ Global {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Debug|Any CPU.Build.0 = Debug|Any CPU {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Release|Any CPU.ActiveCfg = Release|Any CPU {3C37AF32-C83D-4C54-8F17-74DD0584BC50}.Release|Any CPU.Build.0 = Release|Any CPU + {038F8892-EDB7-4091-AC59-D21DC44033E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {038F8892-EDB7-4091-AC59-D21DC44033E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {038F8892-EDB7-4091-AC59-D21DC44033E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {038F8892-EDB7-4091-AC59-D21DC44033E0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -262,6 +268,7 @@ Global {32DC90C3-31B4-444B-80DA-63001B7BB3EE} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} {E1E16CA1-38EC-4F0D-AB15-F097174EC3B4} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} {3C37AF32-C83D-4C54-8F17-74DD0584BC50} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} + {038F8892-EDB7-4091-AC59-D21DC44033E0} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2B47C6B7-D14F-4E7A-AC89-493A7F10350B} diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs index 02814fa..42ed17a 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs @@ -19,6 +19,9 @@ using WorkFlowCore.IRepositories; using WorkFlowCore.UserSelectors; using WorkFlowCore.Workflows; using WorkFlowCore.WorkTasks; +using Common.SimplePluginLoader; +using System.IO; +using System.Linq; namespace WorkFlowCore.Framework { @@ -70,8 +73,20 @@ namespace WorkFlowCore.Framework var assembly = typeof(WorkFlowCoreFrameworkModule).Assembly; //注册条件和选择器 + #region 注册条件和选择器 UserSelectorManager.RegisterSelector(assembly); + services.LoadPlugins(Path.Combine(AppContext.BaseDirectory, "Plugins", "Selectors"), plugins => + { + UserSelectorManager.RegisterSelector(plugins.Select(p => p.Assembly).ToArray()); + }); ConditionManager.Registercondition(assembly); + + services.LoadPlugins(Path.Combine(AppContext.BaseDirectory, "Plugins", "Conditions"), plugins => + { + ConditionManager.Registercondition(plugins.Select(p => p.Assembly).ToArray()); + }); + #endregion + services.AddScoped(); services.AddScoped(); services.AddScoped(); -- Gitee From 106a3fac93315c45799922d2b833a92818de6348 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 19 Oct 2022 22:03:29 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E4=B8=8D=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.SimplePluginLoader/Common.SimplePluginLoader.csproj | 1 + .../WorkFlowCore.Framework/WorkFlowCore.Framework.csproj | 1 + 2 files changed, 2 insertions(+) diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj b/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj index b555a71..2817e4a 100644 --- a/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj @@ -8,6 +8,7 @@ + diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj index 3cc1447..a6acc27 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj @@ -29,6 +29,7 @@ + -- Gitee From 0c4efe9485c6da88d0098617d9f604fccecd4aa6 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 20 Oct 2022 21:22:27 +0800 Subject: [PATCH 09/13] =?UTF-8?q?update=EF=BC=9A=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=93=E5=82=A8=E7=A7=9F=E6=88=B7=E6=95=B0=E6=8D=AE=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E8=B5=8B=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.BaseRepositories4EF/BasicRepository4EF.cs | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs b/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs index c4aaad7..0f724ef 100644 --- a/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs +++ b/WorkFlowCore/Commons/Common.BaseRepositories4EF/BasicRepository4EF.cs @@ -177,7 +177,8 @@ namespace Common.BaseRepositories4EF if (entity is ITenantsEntity) { var tenantEntity = (ITenantsEntity)entity; - tenantEntity.TenantId = session?.User?.TenantId; + if (!string.IsNullOrEmpty(session?.User?.TenantId)) + tenantEntity.TenantId = session?.User?.TenantId; } unitOfWork.BeginWithoutLevel(); await dbContext.Set().AddAsync(entity, cancellationToken); @@ -201,7 +202,8 @@ namespace Common.BaseRepositories4EF if (entity is ITenantsEntity) { var tenantEntity = (ITenantsEntity)entity; - tenantEntity.TenantId = session?.User?.TenantId; + if(!string.IsNullOrEmpty(session?.User?.TenantId)) + tenantEntity.TenantId = session?.User?.TenantId; } } unitOfWork.BeginWithoutLevel(); @@ -220,7 +222,8 @@ namespace Common.BaseRepositories4EF if (entity is ITenantsEntity) { var tenantEntity = (ITenantsEntity)entity; - tenantEntity.TenantId = session?.User?.TenantId; + if (!string.IsNullOrEmpty(session?.User?.TenantId)) + tenantEntity.TenantId = session?.User?.TenantId; } unitOfWork.BeginWithoutLevel(); dbContext.Set().Update(entity); @@ -242,7 +245,8 @@ namespace Common.BaseRepositories4EF if(entity is ITenantsEntity) { var tenantEntity = (ITenantsEntity)entity; - tenantEntity.TenantId = session?.User?.TenantId; + if (!string.IsNullOrEmpty(session?.User?.TenantId)) + tenantEntity.TenantId = session?.User?.TenantId; } } unitOfWork.BeginWithoutLevel(); -- Gitee From 7f8537ebad53e46a4cec0ade699018f6ac02f1bc Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 20 Oct 2022 21:27:52 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E9=85=8D=E5=A5=97=E5=B7=A5=E4=BD=9C?= =?UTF-8?q?=E5=8D=95=E5=85=83=E8=B0=83=E6=95=B4=E4=BA=8B=E4=BB=B6=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.EventBus.Kafka/KafkaEventBus.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs b/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs index e0b6fb9..a44db00 100644 --- a/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs +++ b/WorkFlowCore/Commons/Common.EventBus.Kafka/KafkaEventBus.cs @@ -92,13 +92,22 @@ namespace Common.EventBus.Kafka var data = JsonConvert.DeserializeObject(cr.Message.Value, eventDataType); using (var scope = serviceProvider.CreateScope()) { - var handler = scope.ServiceProvider.GetService(handlerType); - handlerType.GetMethod("Handle", new Type[] { eventDataType }).Invoke(handler, new object[] { data }); //统一工作单元提交,无需事件单独处理 var unitOfWork = scope.ServiceProvider.GetService(); - + var handler = scope.ServiceProvider.GetService(handlerType); + try + { + handlerType.GetMethod("Handle", new Type[] { eventDataType }).Invoke(handler, new object[] { data }); + unitOfWork.Commit(); + } + catch (Exception ex) + { + logger.LogError(ex, "kafka事件异常"); + unitOfWork.Rollback(); + } + var domainEventBusService = scope.ServiceProvider.GetService(); - if (unitOfWork == null || unitOfWork.Commit()) domainEventBusService?.Trigger(); + if (unitOfWork == null || unitOfWork.HasCommitted()) domainEventBusService?.Trigger(); } c.Commit(cr); -- Gitee From 7998f245e1cc1ca7a4282ab7ee74875d5a02d20f Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 20 Oct 2022 21:43:46 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs b/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs index 2f7300a..1734712 100644 --- a/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs +++ b/WorkFlowCore/Commons/Common.Mapster/CommonMapsterModule.cs @@ -50,6 +50,7 @@ namespace Common.Mapster var mapper = new Mapper(config);//务必设置为单实例 services.AddSingleton(mapper); + services.AddSingleton(serviceProvider=>mapper); return services; } -- Gitee From 59a20e6ef5dc92e41235617a1d9ea02cc5ee2dfc Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Oct 2022 11:16:22 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E4=BB=93=E5=82=A8=EF=BC=8C=E5=A6=82=E6=9E=9C=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=EF=BC=8C=E5=88=99=E6=94=AF=E6=8C=81=E5=AD=98=E5=82=A8=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E8=AE=B0=E5=BD=95=EF=BC=8C=E4=BE=BF=E4=BA=8E=E5=90=8E?= =?UTF-8?q?=E7=BB=AD=E5=AE=9E=E7=8E=B0=E4=BA=8B=E4=BB=B6=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=9B=9E=E6=94=BE=EF=BC=8C=E4=BB=A5=E5=8F=8A=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=20cqrs=20(=E5=91=BD=E4=BB=A4=E6=9F=A5=E8=AF=A2=E5=88=86?= =?UTF-8?q?=E7=A6=BB=E7=B3=BB=E7=BB=9F)=20=E4=BF=AE=E5=A4=8D=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=E8=BD=BD=E5=85=A5=E6=9C=8D=E5=8A=A1=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Common.EventBus.Repository4EF.csproj | 16 + .../CommonEventBusRepository4EFModule.cs | 20 ++ .../EventData.cs | 34 ++ .../EventDataRepository.cs | 26 ++ .../IEventBusDbContext.cs | 12 + .../Common.EventBus/CommonEventBusConfig.cs | 16 + .../Common.EventBus/CommonEventBusModule.cs | 26 ++ .../Common.EventBus/DomainEventBusManager.cs | 2 +- .../Common.EventBus/DomainEventBusService.cs | 9 +- .../IRepositories/EventData.cs | 30 ++ .../IRepositories/IEventDataRepository.cs | 13 + .../ICreationEntity.cs | 18 + .../IModificationEntity.cs | 18 + .../IWithBaseInfoEntity.cs | 20 +- .../Common.SimplePluginLoader.csproj | 2 +- .../CommonSimplePluginLoader.cs | 1 + .../DynamicForm.Framework.csproj | 1 + .../DynamicFormDbContext.cs | 7 +- .../DynamicFormFrameworkModule.cs | 4 + .../20221022025345_addeventdata.Designer.cs | 294 +++++++++++++++ .../Migrations/20221022025345_addeventdata.cs | 43 +++ .../DynamicFormDbContextModelSnapshot.cs | 37 ++ .../20221022025952_addeventdata.Designer.cs | 270 ++++++++++++++ .../Migrations/20221022025952_addeventdata.cs | 43 +++ .../OrganizationDbContextModelSnapshot.cs | 75 ++-- .../Organization.Framework.csproj | 1 + .../OrganizationDbContext.cs | 6 +- .../OrganizationFrameworkModule.cs | 4 +- WorkFlowCore/WorkFlowCore.sln | 9 +- .../20221022031252_addeventdata.Designer.cs | 339 ++++++++++++++++++ .../Migrations/20221022031252_addeventdata.cs | 43 +++ .../WorkflowDbContextModelSnapshot.cs | 35 ++ .../Repositories4EF/WorkflowDbContext.cs | 7 +- .../WorkFlowCore.Framework.csproj | 1 + .../WorkFlowCoreFrameworkModule.cs | 5 +- 35 files changed, 1437 insertions(+), 50 deletions(-) create mode 100644 WorkFlowCore/Commons/Common.EventBus.Repository4EF/Common.EventBus.Repository4EF.csproj create mode 100644 WorkFlowCore/Commons/Common.EventBus.Repository4EF/CommonEventBusRepository4EFModule.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventData.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventDataRepository.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus.Repository4EF/IEventBusDbContext.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus/CommonEventBusConfig.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus/CommonEventBusModule.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus/IRepositories/EventData.cs create mode 100644 WorkFlowCore/Commons/Common.EventBus/IRepositories/IEventDataRepository.cs create mode 100644 WorkFlowCore/Commons/Common.IBaseRepositories/ICreationEntity.cs create mode 100644 WorkFlowCore/Commons/Common.IBaseRepositories/IModificationEntity.cs create mode 100644 WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.Designer.cs create mode 100644 WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.cs create mode 100644 WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.Designer.cs create mode 100644 WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.cs create mode 100644 WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.Designer.cs create mode 100644 WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.cs diff --git a/WorkFlowCore/Commons/Common.EventBus.Repository4EF/Common.EventBus.Repository4EF.csproj b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/Common.EventBus.Repository4EF.csproj new file mode 100644 index 0000000..0e2b6a9 --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/Common.EventBus.Repository4EF.csproj @@ -0,0 +1,16 @@ + + + + netcoreapp3.1 + + + + + + + + + + + + diff --git a/WorkFlowCore/Commons/Common.EventBus.Repository4EF/CommonEventBusRepository4EFModule.cs b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/CommonEventBusRepository4EFModule.cs new file mode 100644 index 0000000..96953cf --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/CommonEventBusRepository4EFModule.cs @@ -0,0 +1,20 @@ +using Common.EventBus.IRepositories; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.EventBus.Repository4EF +{ + public static class CommonEventBusRepository4EFModule + { + public static IServiceCollection AddEventBusRepository4EF(this IServiceCollection services)where IDbContext: DbContext,IEventBusDbContext + { + services.AddScoped(); + return services; + } + + + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventData.cs b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventData.cs new file mode 100644 index 0000000..92d319d --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventData.cs @@ -0,0 +1,34 @@ +using Common.IBaseRepositories; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Common.EventBus.Repository4EF +{ + public class EventData : IRepositories.EventData, IEntity, ICreationEntity,ITenantsEntity + { + public EventData() + { + } + public EventData(IRepositories.EventData data) + { + Publisher = data.Publisher; + PublishId = data.PublishId; + PublishTime = data.PublishTime; + IsRePublish = data.IsRePublish; + EventContent = data.EventContent; + CreationTime = DateTime.Now; + } + + public string CreatedUserId { get; set; } + public DateTime CreationTime { get; set; } + public string TenantId { get; set; } + public long Id { get; set; } + + public object[] GetKeys() + { + return GetType().GetProperties().Select(p => p.Name).ToArray(); + } + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventDataRepository.cs b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventDataRepository.cs new file mode 100644 index 0000000..9e8b659 --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/EventDataRepository.cs @@ -0,0 +1,26 @@ +using Common.EventBus.IRepositories; +using Common.IBaseRepositories; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Common.EventBus.Repository4EF +{ + public class EventDataRepository : IEventDataRepository + { + private readonly IBasicRepository basicRepository; + + public EventDataRepository(IBaseRepositories.IBasicRepository basicRepository) + { + this.basicRepository = basicRepository; + } + + public Task InsertAsync(IRepositories.EventData eventData, CancellationToken cancellationToken = default) + { + var eventDataEntity = new EventData(eventData); + return basicRepository.InsertAsync(eventDataEntity); + } + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus.Repository4EF/IEventBusDbContext.cs b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/IEventBusDbContext.cs new file mode 100644 index 0000000..cca5fcc --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus.Repository4EF/IEventBusDbContext.cs @@ -0,0 +1,12 @@ +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.EventBus.Repository4EF +{ + public interface IEventBusDbContext + { + DbSet CommonEventDatas { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus/CommonEventBusConfig.cs b/WorkFlowCore/Commons/Common.EventBus/CommonEventBusConfig.cs new file mode 100644 index 0000000..ec76945 --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus/CommonEventBusConfig.cs @@ -0,0 +1,16 @@ +using Common.EventBus.IRepositories; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.EventBus +{ + public class CommonEventBusConfig + { + internal Type EventDataRepositoryType; + public void ReEventDataRepository()where TEventDataRepository : IEventDataRepository + { + EventDataRepositoryType = typeof(IEventDataRepository); + } + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus/CommonEventBusModule.cs b/WorkFlowCore/Commons/Common.EventBus/CommonEventBusModule.cs new file mode 100644 index 0000000..7fc358e --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus/CommonEventBusModule.cs @@ -0,0 +1,26 @@ +using Common.EventBus.IRepositories; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.EventBus +{ + public static class CommonEventBusModule + { + //public static IServiceCollection AddEventBus(this IServiceCollection services,Action options=null ) + //{ + // if(options==null)return services; + + // var config = new CommonEventBusConfig(); + // options.Invoke(config); + // if(config.EventDataRepositoryType!=null) + // { + // services.AddScoped(typeof(IEventDataRepository), config.EventDataRepositoryType); + // } + // return services; + //} + + + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus/DomainEventBusManager.cs b/WorkFlowCore/Commons/Common.EventBus/DomainEventBusManager.cs index 6f8554f..e4bc244 100644 --- a/WorkFlowCore/Commons/Common.EventBus/DomainEventBusManager.cs +++ b/WorkFlowCore/Commons/Common.EventBus/DomainEventBusManager.cs @@ -8,7 +8,7 @@ namespace Common.EventBus /// /// 全局静态事件帮助类,便于在其它非注入渠道发起事件 /// - public class DomainEventBusManager + internal class DomainEventBusManager { private static IServiceProvider serviceProvider; internal static void Init(IServiceProvider serviceProvider) diff --git a/WorkFlowCore/Commons/Common.EventBus/DomainEventBusService.cs b/WorkFlowCore/Commons/Common.EventBus/DomainEventBusService.cs index fd36434..fcec271 100644 --- a/WorkFlowCore/Commons/Common.EventBus/DomainEventBusService.cs +++ b/WorkFlowCore/Commons/Common.EventBus/DomainEventBusService.cs @@ -1,4 +1,5 @@ -using Microsoft.Extensions.DependencyInjection; +using Common.EventBus.IRepositories; +using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Text; @@ -9,17 +10,21 @@ namespace Common.EventBus { private readonly IServiceProvider serviceProvider; private List baseEventDatas; + private readonly IEventDataRepository eventDataRepository; public DomainEventBusService(IServiceProvider serviceProvider) { this.serviceProvider = serviceProvider; baseEventDatas = new List(); + this.eventDataRepository = serviceProvider.GetService(); } public void Publish(TData data) where TData : BaseEventData { if (data == null) return; - //TODO 保存到数据库 + //保存到数据库 + if (eventDataRepository != null) + eventDataRepository.InsertAsync(EventData.CreateEventData(data)); baseEventDatas.Add(data); } public void Trigger() diff --git a/WorkFlowCore/Commons/Common.EventBus/IRepositories/EventData.cs b/WorkFlowCore/Commons/Common.EventBus/IRepositories/EventData.cs new file mode 100644 index 0000000..8028749 --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus/IRepositories/EventData.cs @@ -0,0 +1,30 @@ +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.EventBus.IRepositories +{ + public class EventData + { + public static EventData CreateEventData(BaseEventData data) + { + var eventData = new EventData(); + eventData.Publisher = data.Publisher; + eventData.PublishId = data.PublishId; + eventData.PublishTime = data.PublishTime; + eventData.IsRePublish = data.IsRePublish; + eventData.EventContent = JsonConvert.SerializeObject(data); + return eventData; + } + + public string Publisher { get; set; } + public Guid PublishId { get; set; } + public DateTime PublishTime { get; set; } + public bool IsRePublish { get; set; } + /// + /// json序列化数据 + /// + public string EventContent { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.EventBus/IRepositories/IEventDataRepository.cs b/WorkFlowCore/Commons/Common.EventBus/IRepositories/IEventDataRepository.cs new file mode 100644 index 0000000..6e36cdc --- /dev/null +++ b/WorkFlowCore/Commons/Common.EventBus/IRepositories/IEventDataRepository.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Common.EventBus.IRepositories +{ + public interface IEventDataRepository + { + Task InsertAsync(EventData eventData, CancellationToken cancellationToken = default); + } +} diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/ICreationEntity.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/ICreationEntity.cs new file mode 100644 index 0000000..d3edf35 --- /dev/null +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/ICreationEntity.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.IBaseRepositories +{ + public interface ICreationEntity + { + /// + /// 创建用户 + /// + string CreatedUserId { get; set; } + /// + /// 创建时间 + /// + DateTime CreationTime { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/IModificationEntity.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/IModificationEntity.cs new file mode 100644 index 0000000..77b4fd0 --- /dev/null +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/IModificationEntity.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Common.IBaseRepositories +{ + public interface IModificationEntity + { + /// + /// 更新时间 + /// + DateTime ModifiedTime { get; set; } + /// + /// 更新用户 + /// + string ModifiedUserId { get; set; } + } +} diff --git a/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs b/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs index 15a659c..34fa2e8 100644 --- a/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs +++ b/WorkFlowCore/Commons/Common.IBaseRepositories/IWithBaseInfoEntity.cs @@ -5,24 +5,10 @@ using System.Text; namespace Common.IBaseRepositories { - public interface IWithBaseInfoEntity : IEntity, ISoftDeleteEntity + public interface IWithBaseInfoEntity : IEntity,ICreationEntity,IModificationEntity, ISoftDeleteEntity { - /// - /// 更新时间 - /// - DateTime ModifiedTime { get; set; } - /// - /// 更新用户 - /// - string ModifiedUserId { get; set; } - /// - /// 创建用户 - /// - string CreatedUserId { get; set; } - /// - /// 创建时间 - /// - DateTime CreationTime { get; set; } + + } diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj b/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj index 2817e4a..9a58a1d 100644 --- a/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/Common.SimplePluginLoader.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 - enable + disable enable diff --git a/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs b/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs index f5ec796..1d280e4 100644 --- a/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs +++ b/WorkFlowCore/Commons/Common.SimplePluginLoader/CommonSimplePluginLoader.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Reflection; using System.Text; using Microsoft.Extensions.DependencyInjection; diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicForm.Framework.csproj b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicForm.Framework.csproj index 7e17f71..403de92 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicForm.Framework.csproj +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicForm.Framework.csproj @@ -12,6 +12,7 @@ + diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs index 0aec54a..98adcce 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormDbContext.cs @@ -1,4 +1,5 @@ using Common.BaseRepositories4EF.DbContexts; +using Common.EventBus.Repository4EF; using DynamicForm.Core; using DynamicForm.Core.Users; using DynamicForm.Core.Workflows; @@ -13,7 +14,7 @@ using System.Threading.Tasks; namespace DynamicForm.Framework { - public class DynamicFormDbContext : CommonDbContext + public class DynamicFormDbContext : CommonDbContext, IEventBusDbContext { public DynamicFormDbContext([JetBrains.Annotations.NotNull] DbContextOptions options) : base(options) { @@ -30,6 +31,10 @@ namespace DynamicForm.Framework #region 工作流 public DbSet WorkflowVersions { get; set; } #endregion + /// + /// 公共事件数据 + /// + public DbSet CommonEventDatas { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs index 687d879..f30a964 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/DynamicFormFrameworkModule.cs @@ -1,6 +1,7 @@ using Common.Authorization; using Common.BaseRepositories4EF; using Common.DependencyInjection; +using Common.EventBus.Repository4EF; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using System; @@ -40,6 +41,9 @@ namespace DynamicForm.Framework }); }); services.AddScoped(); + + //注册事件仓储 + services.AddEventBusRepository4EF(); return services; } diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.Designer.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.Designer.cs new file mode 100644 index 0000000..2d6b610 --- /dev/null +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.Designer.cs @@ -0,0 +1,294 @@ +// +using System; +using DynamicForm.Framework; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +namespace DynamicForm.Framework.Migrations +{ + [DbContext(typeof(DynamicFormDbContext))] + [Migration("20221022025345_addeventdata")] + partial class addeventdata + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 64) + .HasAnnotation("ProductVersion", "5.0.13"); + + modelBuilder.Entity("Common.EventBus.Repository4EF.EventData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("EventContent") + .HasColumnType("longtext"); + + b.Property("IsRePublish") + .HasColumnType("bit(1)"); + + b.Property("PublishId") + .HasColumnType("char(36)"); + + b.Property("PublishTime") + .HasColumnType("datetime(6)"); + + b.Property("Publisher") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CommonEventDatas"); + }); + + modelBuilder.Entity("DynamicForm.Core.FormDesignInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActiveVersion") + .HasColumnType("int"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("Description") + .HasColumnType("longtext"); + + b.Property("FormType") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Title") + .HasColumnType("longtext"); + + b.Property("WorkflowId_Id") + .HasColumnType("char(36)"); + + b.Property("WorkflowId_Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("FormDesignInfos"); + }); + + modelBuilder.Entity("DynamicForm.Core.FormDesignVersion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("DesignContent") + .HasColumnType("longtext"); + + b.Property("FormDesignId") + .HasColumnType("char(36)"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Version") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("FormDesignVersions"); + }); + + modelBuilder.Entity("DynamicForm.Core.FormInstanceInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("CurrentHandleInfo_NodeName") + .HasColumnType("longtext"); + + b.Property("CurrentHandleInfo_StepId") + .HasColumnType("longtext"); + + b.Property("CurrentHandleInfo_UserId") + .HasColumnType("longtext"); + + b.Property("CurrentHandleInfo_UserName") + .HasColumnType("longtext"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("FormData") + .HasColumnType("longtext"); + + b.Property("FormDesignId_Id") + .HasColumnType("char(36)"); + + b.Property("FormDesignId_Version") + .HasColumnType("int"); + + b.Property("LatestProveData") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Title") + .HasColumnType("longtext"); + + b.Property("WorkflowId_Id") + .HasColumnType("char(36)"); + + b.Property("WorkflowId_Version") + .HasColumnType("int"); + + b.Property("WorkflowStatus") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("FormInstanceInfos"); + }); + + modelBuilder.Entity("DynamicForm.Core.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("DynamicForm_User"); + }); + + modelBuilder.Entity("DynamicForm.Core.Workflows.WorkflowVersion", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("VersionNo") + .HasColumnType("int"); + + b.Property("WorkflowId") + .HasColumnType("char(36)"); + + b.Property("WorkflowName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("DynamicForm_WorkflowVersion"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.cs new file mode 100644 index 0000000..51d10de --- /dev/null +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/20221022025345_addeventdata.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace DynamicForm.Framework.Migrations +{ + public partial class addeventdata : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CommonEventDatas", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + CreatedUserId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CreationTime = table.Column(type: "datetime(6)", nullable: false), + TenantId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Publisher = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + PublishId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PublishTime = table.Column(type: "datetime(6)", nullable: false), + IsRePublish = table.Column(type: "bit(1)", nullable: false), + EventContent = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_CommonEventDatas", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CommonEventDatas"); + } + } +} diff --git a/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/DynamicFormDbContextModelSnapshot.cs b/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/DynamicFormDbContextModelSnapshot.cs index 5b9c637..7b0beb7 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/DynamicFormDbContextModelSnapshot.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.Framework/Migrations/DynamicFormDbContextModelSnapshot.cs @@ -1,7 +1,9 @@ // using System; +using DynamicForm.Framework; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace DynamicForm.Framework.Migrations { @@ -15,6 +17,41 @@ namespace DynamicForm.Framework.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 64) .HasAnnotation("ProductVersion", "5.0.13"); + modelBuilder.Entity("Common.EventBus.Repository4EF.EventData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("EventContent") + .HasColumnType("longtext"); + + b.Property("IsRePublish") + .HasColumnType("bit(1)"); + + b.Property("PublishId") + .HasColumnType("char(36)"); + + b.Property("PublishTime") + .HasColumnType("datetime(6)"); + + b.Property("Publisher") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CommonEventDatas"); + }); + modelBuilder.Entity("DynamicForm.Core.FormDesignInfo", b => { b.Property("Id") diff --git a/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.Designer.cs b/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.Designer.cs new file mode 100644 index 0000000..a2568a4 --- /dev/null +++ b/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.Designer.cs @@ -0,0 +1,270 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Organization.Framework; + +namespace Organization.Framework.Migrations +{ + [DbContext(typeof(OrganizationDbContext))] + [Migration("20221022025952_addeventdata")] + partial class addeventdata + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 64) + .HasAnnotation("ProductVersion", "5.0.13"); + + modelBuilder.Entity("Common.EventBus.Repository4EF.EventData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("EventContent") + .HasColumnType("longtext"); + + b.Property("IsRePublish") + .HasColumnType("bit(1)"); + + b.Property("PublishId") + .HasColumnType("char(36)"); + + b.Property("PublishTime") + .HasColumnType("datetime(6)"); + + b.Property("Publisher") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CommonEventDatas"); + }); + + modelBuilder.Entity("Organization.Core.Organizations.Organization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Code") + .HasColumnType("longtext"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("FullName") + .HasColumnType("longtext"); + + b.Property("MaxNum") + .HasColumnType("int"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("PreCode") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Organizations"); + }); + + modelBuilder.Entity("Organization.Core.Organizations.UserOrganization", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("IsLeader") + .HasColumnType("bit(1)"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("OrganizationCode") + .HasColumnType("longtext"); + + b.Property("OrganizationName") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("UserName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("UserOrganization"); + }); + + modelBuilder.Entity("Organization.Core.Roles.UserRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("RoleName") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("UserName") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("UserRoles"); + }); + + modelBuilder.Entity("Organization.Core.Users.Role", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Roles"); + }); + + modelBuilder.Entity("Organization.Core.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("Email") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Users"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.cs b/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.cs new file mode 100644 index 0000000..5c20c11 --- /dev/null +++ b/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/20221022025952_addeventdata.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Organization.Framework.Migrations +{ + public partial class addeventdata : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CommonEventDatas", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + CreatedUserId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CreationTime = table.Column(type: "datetime(6)", nullable: false), + TenantId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Publisher = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + PublishId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PublishTime = table.Column(type: "datetime(6)", nullable: false), + IsRePublish = table.Column(type: "bit(1)", nullable: false), + EventContent = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_CommonEventDatas", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CommonEventDatas"); + } + } +} diff --git a/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/OrganizationDbContextModelSnapshot.cs b/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/OrganizationDbContextModelSnapshot.cs index 18d36d7..20aec0d 100644 --- a/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/OrganizationDbContextModelSnapshot.cs +++ b/WorkFlowCore/UserOrganization/Organization.Framework/Migrations/OrganizationDbContextModelSnapshot.cs @@ -17,6 +17,41 @@ namespace Organization.Framework.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 64) .HasAnnotation("ProductVersion", "5.0.13"); + modelBuilder.Entity("Common.EventBus.Repository4EF.EventData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("EventContent") + .HasColumnType("longtext"); + + b.Property("IsRePublish") + .HasColumnType("bit(1)"); + + b.Property("PublishId") + .HasColumnType("char(36)"); + + b.Property("PublishTime") + .HasColumnType("datetime(6)"); + + b.Property("Publisher") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CommonEventDatas"); + }); + modelBuilder.Entity("Organization.Core.Organizations.Organization", b => { b.Property("Id") @@ -111,7 +146,7 @@ namespace Organization.Framework.Migrations b.ToTable("UserOrganization"); }); - modelBuilder.Entity("Organization.Core.Users.Role", b => + modelBuilder.Entity("Organization.Core.Roles.UserRole", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -138,15 +173,24 @@ namespace Organization.Framework.Migrations b.Property("ModifiedUserId") .HasColumnType("longtext"); - b.Property("Name") + b.Property("RoleId") + .HasColumnType("char(36)"); + + b.Property("RoleName") + .HasColumnType("longtext"); + + b.Property("UserId") + .HasColumnType("char(36)"); + + b.Property("UserName") .HasColumnType("longtext"); b.HasKey("Id"); - b.ToTable("Roles"); + b.ToTable("UserRoles"); }); - modelBuilder.Entity("Organization.Core.Users.User", b => + modelBuilder.Entity("Organization.Core.Users.Role", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -167,9 +211,6 @@ namespace Organization.Framework.Migrations b.Property("DeletedUserId") .HasColumnType("longtext"); - b.Property("Email") - .HasColumnType("longtext"); - b.Property("ModifiedTime") .HasColumnType("datetime(6)"); @@ -181,10 +222,10 @@ namespace Organization.Framework.Migrations b.HasKey("Id"); - b.ToTable("Users"); + b.ToTable("Roles"); }); - modelBuilder.Entity("Organization.Core.Users.UserRole", b => + modelBuilder.Entity("Organization.Core.Users.User", b => { b.Property("Id") .ValueGeneratedOnAdd() @@ -205,27 +246,21 @@ namespace Organization.Framework.Migrations b.Property("DeletedUserId") .HasColumnType("longtext"); + b.Property("Email") + .HasColumnType("longtext"); + b.Property("ModifiedTime") .HasColumnType("datetime(6)"); b.Property("ModifiedUserId") .HasColumnType("longtext"); - b.Property("RoleId") - .HasColumnType("char(36)"); - - b.Property("RoleName") - .HasColumnType("longtext"); - - b.Property("UserId") - .HasColumnType("char(36)"); - - b.Property("UserName") + b.Property("Name") .HasColumnType("longtext"); b.HasKey("Id"); - b.ToTable("UserRoles"); + b.ToTable("Users"); }); #pragma warning restore 612, 618 } diff --git a/WorkFlowCore/UserOrganization/Organization.Framework/Organization.Framework.csproj b/WorkFlowCore/UserOrganization/Organization.Framework/Organization.Framework.csproj index a0870d8..1fdd0b3 100644 --- a/WorkFlowCore/UserOrganization/Organization.Framework/Organization.Framework.csproj +++ b/WorkFlowCore/UserOrganization/Organization.Framework/Organization.Framework.csproj @@ -17,6 +17,7 @@ + diff --git a/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationDbContext.cs b/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationDbContext.cs index 860ed8e..5922dae 100644 --- a/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationDbContext.cs +++ b/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationDbContext.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using Common.EventBus.Repository4EF; +using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using Organization.Core.Organizations; using Organization.Core.Roles; @@ -11,7 +12,7 @@ using System.Threading.Tasks; namespace Organization.Framework { - public class OrganizationDbContext : DbContext + public class OrganizationDbContext : DbContext, IEventBusDbContext { public OrganizationDbContext([NotNull] DbContextOptions options) : base(options) { @@ -21,5 +22,6 @@ namespace Organization.Framework public DbSet UserOrganization { get; set; } public DbSet Organizations { get; set; } public DbSet Roles { get; set; } + public DbSet CommonEventDatas { get; set; } } } diff --git a/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationFrameworkModule.cs b/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationFrameworkModule.cs index fe117a0..1927c29 100644 --- a/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationFrameworkModule.cs +++ b/WorkFlowCore/UserOrganization/Organization.Framework/OrganizationFrameworkModule.cs @@ -1,5 +1,6 @@ using Common.Authorization; using Common.BaseRepositories4EF; +using Common.EventBus.Repository4EF; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Organization.Core.Organizations.IRepositories; @@ -29,7 +30,8 @@ namespace Organization.Framework }); services.AddScoped(); - + //注册事件仓储 + services.AddEventBusRepository4EF(); } public class OrganizationFrameworkModuleConfiguration diff --git a/WorkFlowCore/WorkFlowCore.sln b/WorkFlowCore/WorkFlowCore.sln index 722f639..9ae9ba6 100644 --- a/WorkFlowCore/WorkFlowCore.sln +++ b/WorkFlowCore/WorkFlowCore.sln @@ -81,7 +81,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.UnitOfWork4EntityFra EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Mapster", "Commons\Common.Mapster\Common.Mapster.csproj", "{3C37AF32-C83D-4C54-8F17-74DD0584BC50}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.SimplePluginLoader", "Commons\Common.SimplePluginLoader\Common.SimplePluginLoader.csproj", "{038F8892-EDB7-4091-AC59-D21DC44033E0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.SimplePluginLoader", "Commons\Common.SimplePluginLoader\Common.SimplePluginLoader.csproj", "{038F8892-EDB7-4091-AC59-D21DC44033E0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Common.EventBus.Repository4EF", "Commons\Common.EventBus.Repository4EF\Common.EventBus.Repository4EF.csproj", "{519E4805-268B-409C-9167-45A5DF4B8F69}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -229,6 +231,10 @@ Global {038F8892-EDB7-4091-AC59-D21DC44033E0}.Debug|Any CPU.Build.0 = Debug|Any CPU {038F8892-EDB7-4091-AC59-D21DC44033E0}.Release|Any CPU.ActiveCfg = Release|Any CPU {038F8892-EDB7-4091-AC59-D21DC44033E0}.Release|Any CPU.Build.0 = Release|Any CPU + {519E4805-268B-409C-9167-45A5DF4B8F69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {519E4805-268B-409C-9167-45A5DF4B8F69}.Debug|Any CPU.Build.0 = Debug|Any CPU + {519E4805-268B-409C-9167-45A5DF4B8F69}.Release|Any CPU.ActiveCfg = Release|Any CPU + {519E4805-268B-409C-9167-45A5DF4B8F69}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -269,6 +275,7 @@ Global {E1E16CA1-38EC-4F0D-AB15-F097174EC3B4} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} {3C37AF32-C83D-4C54-8F17-74DD0584BC50} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} {038F8892-EDB7-4091-AC59-D21DC44033E0} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} + {519E4805-268B-409C-9167-45A5DF4B8F69} = {3EF58BFB-DEAB-4607-9C83-3D0B0BF0CFFA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {2B47C6B7-D14F-4E7A-AC89-493A7F10350B} diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.Designer.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.Designer.cs new file mode 100644 index 0000000..7766bdf --- /dev/null +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.Designer.cs @@ -0,0 +1,339 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using WorkFlowCore.Framework.Repositories4EF; + +namespace WorkFlowCore.Framework.Migrations +{ + [DbContext(typeof(WorkflowDbContext))] + [Migration("20221022031252_addeventdata")] + partial class addeventdata + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 64) + .HasAnnotation("ProductVersion", "5.0.13"); + + modelBuilder.Entity("Common.EventBus.Repository4EF.EventData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("EventContent") + .HasColumnType("longtext"); + + b.Property("IsRePublish") + .HasColumnType("bit(1)"); + + b.Property("PublishId") + .HasColumnType("char(36)"); + + b.Property("PublishTime") + .HasColumnType("datetime(6)"); + + b.Property("Publisher") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CommonEventDatas"); + }); + + modelBuilder.Entity("WorkFlowCore.Users.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("Workflow_User"); + }); + + modelBuilder.Entity("WorkFlowCore.WorkTasks.WorkStepInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Comment") + .HasColumnType("longtext"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("FormData") + .HasColumnType("longtext"); + + b.Property("FromForwardStepId") + .HasColumnType("char(36)"); + + b.Property("FromNodeId") + .HasColumnType("char(36)"); + + b.Property("FromNodeName") + .HasColumnType("longtext"); + + b.Property("GroupId") + .HasColumnType("longtext"); + + b.Property("HandleType") + .HasColumnType("int"); + + b.Property("HandleUser_Id") + .HasColumnType("longtext"); + + b.Property("HandleUser_Name") + .HasColumnType("longtext"); + + b.Property("HandlerTime") + .HasColumnType("datetime(6)"); + + b.Property("IsHandled") + .HasColumnType("bit(1)"); + + b.Property("IsRead") + .HasColumnType("bit(1)"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("NodeId") + .HasColumnType("char(36)"); + + b.Property("NodeName") + .HasColumnType("longtext"); + + b.Property("PreStepGroupId") + .HasColumnType("longtext"); + + b.Property("ReadTime") + .HasColumnType("datetime(6)"); + + b.Property("ResourceIds") + .HasColumnType("longtext"); + + b.Property("WorkStepType") + .HasColumnType("int"); + + b.Property("WorkTaskId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("WorkStepInfos"); + }); + + modelBuilder.Entity("WorkFlowCore.WorkTasks.WorkTaskInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("EntityFullName") + .HasColumnType("longtext"); + + b.Property("EntityKeyValue") + .HasColumnType("longtext"); + + b.Property("FormData") + .HasColumnType("longtext"); + + b.Property("IsSimulation") + .HasColumnType("bit(1)"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .HasColumnType("longtext"); + + b.Property("WorkTaskStatus") + .HasColumnType("int"); + + b.Property("WorkflowId_Id") + .HasColumnType("char(36)"); + + b.Property("WorkflowId_VersionId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.ToTable("WorkTaskInfos"); + }); + + modelBuilder.Entity("WorkFlowCore.Workflows.Workflow", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("ActiveVersion") + .HasColumnType("int"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("varchar(500)"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.Property("WorkflowNo") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("varchar(50)"); + + b.HasKey("Id"); + + b.ToTable("Workflows"); + }); + + modelBuilder.Entity("WorkFlowCore.Workflows.WorkflowVersionInfo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AllNodes") + .HasColumnType("longtext"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("Deleted") + .HasColumnType("bit(1)"); + + b.Property("DeletedTime") + .HasColumnType("datetime(6)"); + + b.Property("DeletedUserId") + .HasColumnType("longtext"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("varchar(2000)"); + + b.Property("DrawingInfo") + .HasColumnType("longtext"); + + b.Property("ModifiedTime") + .HasColumnType("datetime(6)"); + + b.Property("ModifiedUserId") + .HasColumnType("longtext"); + + b.Property("NodeMaps") + .HasColumnType("longtext"); + + b.Property("VersionNo") + .HasColumnType("int"); + + b.Property("WorkflowId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.ToTable("WorkflowVersionInfos"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.cs new file mode 100644 index 0000000..0619edf --- /dev/null +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/20221022031252_addeventdata.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace WorkFlowCore.Framework.Migrations +{ + public partial class addeventdata : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "CommonEventDatas", + columns: table => new + { + Id = table.Column(type: "bigint", nullable: false) + .Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn), + CreatedUserId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + CreationTime = table.Column(type: "datetime(6)", nullable: false), + TenantId = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + Publisher = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4"), + PublishId = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + PublishTime = table.Column(type: "datetime(6)", nullable: false), + IsRePublish = table.Column(type: "bit(1)", nullable: false), + EventContent = table.Column(type: "longtext", nullable: true) + .Annotation("MySql:CharSet", "utf8mb4") + }, + constraints: table => + { + table.PrimaryKey("PK_CommonEventDatas", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "CommonEventDatas"); + } + } +} diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/WorkflowDbContextModelSnapshot.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/WorkflowDbContextModelSnapshot.cs index b054c00..42e8543 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/WorkflowDbContextModelSnapshot.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Migrations/WorkflowDbContextModelSnapshot.cs @@ -17,6 +17,41 @@ namespace WorkFlowCore.Framework.Migrations .HasAnnotation("Relational:MaxIdentifierLength", 64) .HasAnnotation("ProductVersion", "5.0.13"); + modelBuilder.Entity("Common.EventBus.Repository4EF.EventData", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + b.Property("CreatedUserId") + .HasColumnType("longtext"); + + b.Property("CreationTime") + .HasColumnType("datetime(6)"); + + b.Property("EventContent") + .HasColumnType("longtext"); + + b.Property("IsRePublish") + .HasColumnType("bit(1)"); + + b.Property("PublishId") + .HasColumnType("char(36)"); + + b.Property("PublishTime") + .HasColumnType("datetime(6)"); + + b.Property("Publisher") + .HasColumnType("longtext"); + + b.Property("TenantId") + .HasColumnType("longtext"); + + b.HasKey("Id"); + + b.ToTable("CommonEventDatas"); + }); + modelBuilder.Entity("WorkFlowCore.Users.User", b => { b.Property("Id") diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories4EF/WorkflowDbContext.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories4EF/WorkflowDbContext.cs index d2f62a9..6329524 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories4EF/WorkflowDbContext.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/Repositories4EF/WorkflowDbContext.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using Common.EventBus.Repository4EF; +using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -9,7 +10,7 @@ using WorkFlowCore.WorkTasks; namespace WorkFlowCore.Framework.Repositories4EF { - public class WorkflowDbContext : DbContext + public class WorkflowDbContext : DbContext, IEventBusDbContext { public WorkflowDbContext([NotNull] DbContextOptions options) : base(options) { @@ -22,7 +23,7 @@ namespace WorkFlowCore.Framework.Repositories4EF #region 组织用户 public DbSet Users { get; set; } - + public DbSet CommonEventDatas { get; set; } #endregion protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj index a6acc27..1ff4ffa 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCore.Framework.csproj @@ -28,6 +28,7 @@ + diff --git a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs index 42ed17a..837f377 100644 --- a/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs +++ b/WorkFlowCore/Workflow/WorkFlowCore.Framework/WorkFlowCoreFrameworkModule.cs @@ -22,6 +22,7 @@ using WorkFlowCore.WorkTasks; using Common.SimplePluginLoader; using System.IO; using System.Linq; +using Common.EventBus.Repository4EF; namespace WorkFlowCore.Framework { @@ -67,10 +68,11 @@ namespace WorkFlowCore.Framework }); services.AddScoped(); } + //注册事件仓储 + services.AddEventBusRepository4EF(); - var assembly = typeof(WorkFlowCoreFrameworkModule).Assembly; //注册条件和选择器 #region 注册条件和选择器 @@ -97,6 +99,7 @@ namespace WorkFlowCore.Framework services.AddScoped(); services.AddScoped(); services.AddSingleton(); + } } } -- Gitee From 9a78a316c84cf67e0dcd79f4f20f7c745b387d60 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 22 Oct 2022 11:17:59 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E4=B8=8D=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormInstances/FormInstanceAppService.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs b/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs index 4a34a42..44c9525 100644 --- a/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs +++ b/WorkFlowCore/DynamicForm/DynamicForm.AppService/FormInstances/FormInstanceAppService.cs @@ -37,7 +37,6 @@ namespace DynamicForm.AppService.FormInstances { var instance = new FormInstance(input.FormDesignId, input.WorkflowId, input.FormData, input.Title); await repository.InsertAsync(instance.ToFormInstanceInfo()); - throw new Exception("test"); return instance.Adapt(); } public override async Task UpdateAsync(Guid id, FormInstanceUpdateInput input) -- Gitee