diff --git a/OpenAuth.App/AuthorizeApp.cs b/OpenAuth.App/AuthorizeApp.cs index f058bfae..384a84fb 100644 --- a/OpenAuth.App/AuthorizeApp.cs +++ b/OpenAuth.App/AuthorizeApp.cs @@ -24,9 +24,10 @@ namespace OpenAuth.App var user = new UserWithAccessedCtrls { User = _service.User, - AccessedOrgs = _service.Orgs, + Orgs = _service.Orgs, Modules = _service.Modules.MapToList(), Resources = _service.Resources, + Roles = _service.Roles }; foreach (var moduleView in user.Modules) diff --git a/OpenAuth.App/GoodsApplyApp.cs b/OpenAuth.App/GoodsApplyApp.cs index e81e244a..2de70c1a 100644 --- a/OpenAuth.App/GoodsApplyApp.cs +++ b/OpenAuth.App/GoodsApplyApp.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using OpenAuth.App.ViewModel; using OpenAuth.Domain; using OpenAuth.Domain.Interface; @@ -62,5 +61,10 @@ namespace OpenAuth.App return result; } + + public void Del(Guid id) + { + _repository.Delete(u =>u.Id == id); + } } } \ No newline at end of file diff --git a/OpenAuth.App/OpenAuth.App.csproj b/OpenAuth.App/OpenAuth.App.csproj index 8e63d345..06d12ce7 100644 --- a/OpenAuth.App/OpenAuth.App.csproj +++ b/OpenAuth.App/OpenAuth.App.csproj @@ -41,6 +41,10 @@ ..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll True + + ..\packages\WorkflowEngine.NET-Core.1.5.5.2\lib\net45\OptimaJet.Workflow.Core.dll + True + @@ -99,6 +103,8 @@ + + diff --git a/OpenAuth.App/RoleManagerApp.cs b/OpenAuth.App/RoleManagerApp.cs index 3641a343..c9cdda0f 100644 --- a/OpenAuth.App/RoleManagerApp.cs +++ b/OpenAuth.App/RoleManagerApp.cs @@ -80,8 +80,7 @@ namespace OpenAuth.App /// private Guid[] GetSubOrgIds(Guid orgId) { - var org = _orgRepository.FindSingle(u => u.Id == orgId); - var orgs = _orgRepository.Find(u => u.CascadeId.Contains(org.CascadeId)).Select(u => u.Id).ToArray(); + var orgs = _orgRepository.GetSubOrgs(orgId).Select(u => u.Id).ToArray(); return orgs; } @@ -116,22 +115,21 @@ namespace OpenAuth.App _relevanceRepository.AddRelevance("RoleOrg", orgIds.ToLookup(u => role.Id)); } + public List LoadForUser(Guid userId) + { + return _repository.LoadForUser(userId).ToList(); + } + public List LoadForOrgAndUser(Guid orgId, Guid userId) { - var allorgs = GetSubOrgIds(orgId); - var roles = _relevanceRepository.Find(u => u.Key == "RoleOrg" - && allorgs.Contains(u.SecondId)).Select(u =>u.FirstId).ToList(); //机构关联的角色 + var userroles = LoadForUser(userId); + var orgroles = _repository.LoadInOrgs(GetSubOrgIds(orgId)).ToList(); - var roleIds = _repository.Find(u => orgId == Guid.Empty - || (roles.Contains(u.Id))).ToList(); //从角色表里获取 var rolevms = new List(); - foreach (var role in roleIds) + foreach (var role in orgroles) { RoleVM rolevm = role; - rolevm.IsBelongUser = (_relevanceRepository.FindSingle(u => u.SecondId == role.Id - && u.FirstId == userId - && u.Key == "UserRole") - != null); + rolevm.IsBelongUser = userroles.Any(u => u.Id == role.Id); var orgs = _orgRepository.LoadByRole(role.Id); rolevm.Organizations = string.Join(",", orgs.Select(u => u.Name).ToList()); rolevm.OrganizationIds = string.Join(",", orgs.Select(u => u.Id).ToList()); diff --git a/OpenAuth.App/ViewModel/CommandModel.cs b/OpenAuth.App/ViewModel/CommandModel.cs new file mode 100644 index 00000000..934870bd --- /dev/null +++ b/OpenAuth.App/ViewModel/CommandModel.cs @@ -0,0 +1,25 @@ +// *********************************************************************** +// Assembly : OpenAuth.App +// Author : yubaolee +// Created : 09-05-2016 +// +// Last Modified By : yubaolee +// Last Modified On : 09-05-2016 +// Contact : Microsoft +// File: CommandModel.cs +// *********************************************************************** + +using OptimaJet.Workflow.Core.Model; + +namespace OpenAuth.App.ViewModel +{ + /// + /// workflow命令 + /// + public class CommandModel + { + public string Key { get; set; } + public string Value { get; set; } + public TransitionClassifier Classifier { get; set; } + } +} \ No newline at end of file diff --git a/OpenAuth.App/ViewModel/GoodsApplyVM.cs b/OpenAuth.App/ViewModel/GoodsApplyVM.cs new file mode 100644 index 00000000..c9ee8b55 --- /dev/null +++ b/OpenAuth.App/ViewModel/GoodsApplyVM.cs @@ -0,0 +1,73 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a CodeSmith Template. +// +// DO NOT MODIFY contents of this file. Changes to this +// file will be lost if the code is regenerated. +// Author:Yubao Li +// +//------------------------------------------------------------------------------ + +using System.Collections.Generic; +using Infrastructure; +using OpenAuth.Domain; + +namespace OpenAuth.App.ViewModel +{ + /// + /// + /// + public class GoodsApplyVM :Entity + { + /// + /// + /// + public int Sort { get; set; } + /// + /// + /// + public int Number { get; set; } + /// + /// + /// + public string Name { get; set; } + /// + /// + /// + public string Comment { get; set; } + /// + /// + /// + public string State { get; set; } + /// + /// + /// + public string StateName { get; set; } + /// + /// + /// + public System.Guid UserId { get; set; } + /// + /// + /// + public System.Guid? ControllerUserId { get; set; } + + /// + /// 可用命令 + /// + public CommandModel[] Commands { get; set; } + + public Dictionary AvailiableStates { get; set; } + + public static implicit operator GoodsApplyVM(GoodsApply obj) + { + return obj.MapTo(); + } + + public static implicit operator GoodsApply(GoodsApplyVM obj) + { + return obj.MapTo(); + } + + } +} \ No newline at end of file diff --git a/OpenAuth.App/ViewModel/UserWithAccessedCtrls.cs b/OpenAuth.App/ViewModel/UserWithAccessedCtrls.cs index c26fe9ad..bfb0e8e8 100644 --- a/OpenAuth.App/ViewModel/UserWithAccessedCtrls.cs +++ b/OpenAuth.App/ViewModel/UserWithAccessedCtrls.cs @@ -39,10 +39,8 @@ namespace OpenAuth.App.ViewModel /// public List Orgs { get; set; } - /// - /// 用户可访问的机构 - /// - public IEnumerable AccessedOrgs { get; set; } + + public List Roles { get; set; } } } diff --git a/OpenAuth.App/packages.config b/OpenAuth.App/packages.config index 5ea0358d..00ed5e7c 100644 --- a/OpenAuth.App/packages.config +++ b/OpenAuth.App/packages.config @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/OpenAuth.Domain/Interface/IOrgRepository.cs b/OpenAuth.Domain/Interface/IOrgRepository.cs index 81c8512c..cca36447 100644 --- a/OpenAuth.Domain/Interface/IOrgRepository.cs +++ b/OpenAuth.Domain/Interface/IOrgRepository.cs @@ -15,16 +15,9 @@ namespace OpenAuth.Domain.Interface IEnumerable LoadByRole(Guid roleId); /// - /// 得到全部子部门 + /// 获取包括自己在内的全部子部门 /// /// 部门ID IEnumerable GetSubOrgs(Guid orgId); - - /// - /// 获取包括自己在内的全部子部门 - /// - /// The org identifier. - /// IEnumerable<Org>. - IEnumerable GetSubWithOwn(Guid orgId); } } diff --git a/OpenAuth.Domain/Interface/IRoleRepository.cs b/OpenAuth.Domain/Interface/IRoleRepository.cs index 335304f8..4b654909 100644 --- a/OpenAuth.Domain/Interface/IRoleRepository.cs +++ b/OpenAuth.Domain/Interface/IRoleRepository.cs @@ -10,6 +10,8 @@ namespace OpenAuth.Domain.Interface int GetRoleCntInOrgs(params Guid[] orgIds); IEnumerable LoadInOrgs(int pageindex, int pagesize, params Guid[] orgIds); + IEnumerable LoadInOrgs(params Guid[] orgId); + IEnumerable LoadForUser(Guid userId); void Delete(Guid id); diff --git a/OpenAuth.Domain/Service/AuthoriseService.cs b/OpenAuth.Domain/Service/AuthoriseService.cs index acefd045..f536aea4 100644 --- a/OpenAuth.Domain/Service/AuthoriseService.cs +++ b/OpenAuth.Domain/Service/AuthoriseService.cs @@ -29,6 +29,7 @@ namespace OpenAuth.Domain.Service private List _moduleElements; //用户可访问的菜单 private List _resources; //用户可访问的资源 private List _orgs; //用户可访问的机构 + private List _roles; //用户角色 public AuthoriseService(IUnitWork unitWork) { @@ -40,6 +41,11 @@ namespace OpenAuth.Domain.Service get { return _modules; } } + public List Roles + { + get { return _roles;} + } + public List ModuleElements { get { return _moduleElements; } @@ -80,7 +86,7 @@ namespace OpenAuth.Domain.Service { if (name == "System") { - _user = new User{Account = "System"}; + _user = new User{Account = "System", Id = Guid.Empty}; LoadForSystem(); } else @@ -104,6 +110,7 @@ namespace OpenAuth.Domain.Service var userRoleIds = _unitWork.Find(u => u.FirstId == _user.Id && u.Key == "UserRole").Select(u => u.SecondId).ToList(); + _roles = _unitWork.Find(u => userRoleIds.Contains(u.Id)).ToList(); //用户角色与自己分配到的模块ID var moduleIds = _unitWork.Find( u => @@ -143,9 +150,8 @@ namespace OpenAuth.Domain.Service { _modules = _unitWork.Find(null).ToList(); _moduleElements = _unitWork.Find(null).ToList(); - + _roles = _unitWork.Find(null).ToList(); _resources = _unitWork.Find(null).OrderBy(u => u.SortNo).ToList(); - _orgs = _unitWork.Find(null).OrderBy(u => u.SortNo).ToList(); } } diff --git a/OpenAuth.Domain/Service/StockManagerService.cs b/OpenAuth.Domain/Service/StockManagerService.cs index 97359d01..23ea9236 100644 --- a/OpenAuth.Domain/Service/StockManagerService.cs +++ b/OpenAuth.Domain/Service/StockManagerService.cs @@ -41,7 +41,7 @@ namespace OpenAuth.Domain.Service var orgIds = _authoriseService.Orgs.Select(u => u.Id).ToArray(); //用户可访问的机构ID - var orgs = _orgRepository.GetSubWithOwn(orgId) //点击的节点与用户可访问的机构合并 + var orgs = _orgRepository.GetSubOrgs(orgId) //点击的节点与用户可访问的机构合并 .Where(u => orgIds.Contains(u.Id)) .Select(u => u.Id).ToArray(); diff --git a/OpenAuth.Mvc/BllScripts/goodsApply.js b/OpenAuth.Mvc/BllScripts/goodsApply.js index 754e2394..5e8470eb 100644 --- a/OpenAuth.Mvc/BllScripts/goodsApply.js +++ b/OpenAuth.Mvc/BllScripts/goodsApply.js @@ -139,7 +139,6 @@ function del() { $.getJSON('/GoodsApplies/Delete?Id=' + selected.Id, function (data) { if (data.statusCode == "200") { list.reload(); - ztree.reload(); } else { $(this).alertmsg('warn', data.message); @@ -179,4 +178,4 @@ function refresh() { list.reload(); } -//@@ sourceURL=StockManager.js \ No newline at end of file +//@@ sourceURL=goodsApply.js \ No newline at end of file diff --git a/OpenAuth.Mvc/BllScripts/processDetail.js b/OpenAuth.Mvc/BllScripts/processDetail.js index 7683fb7f..8744ea4c 100644 --- a/OpenAuth.Mvc/BllScripts/processDetail.js +++ b/OpenAuth.Mvc/BllScripts/processDetail.js @@ -35,6 +35,15 @@ function wfdesignerRedraw() { wfdesignerRedraw(); - +$(function () { + $(".btn-cmd") + .on("click", function () { //执行命令 + $.post("/GoodsApplies/ExeCmd?id=" +$("#processId").val() +"&cmd=" +$(this).val() , + { name: "John", time: "2pm" }, + function (data) { + console.log("Data Loaded: " + data); + }); + }); +}); //@@ sourceURL=processDetail.js \ No newline at end of file diff --git a/OpenAuth.Mvc/Controllers/GoodsAppliesController.cs b/OpenAuth.Mvc/Controllers/GoodsAppliesController.cs index 751430da..4cb1ccf6 100644 --- a/OpenAuth.Mvc/Controllers/GoodsAppliesController.cs +++ b/OpenAuth.Mvc/Controllers/GoodsAppliesController.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Web.Mvc; using Infrastructure; using OpenAuth.App; using OpenAuth.App.SSO; +using OpenAuth.App.ViewModel; using OpenAuth.Domain; using OpenAuth.Mvc.Models; using OptimaJet.Workflow.Core.Runtime; @@ -50,8 +52,9 @@ namespace OpenAuth.Mvc.Controllers { try { - var apply = _app.Get(id); + GoodsApplyVM apply = _app.Get(id); CreateWorkflowIfNotExists(id); + apply.Commands = GetCommands(id); return View(apply); } catch (Exception e) @@ -62,6 +65,39 @@ namespace OpenAuth.Mvc.Controllers return View(); } + public string Delete(Guid id) + { + try + { + _app.Del(id); + } + catch (Exception ex) + { + BjuiResponse.statusCode = "300"; + BjuiResponse.message = ex.Message; + throw; + } + + return JsonHelper.Instance.Serialize(BjuiResponse); + } + + [HttpPost] + public string ExeCmd(Guid id, string cmd) + { + try + { + ExecuteCommand(id, cmd, null); + } + catch (Exception ex) + { + BjuiResponse.statusCode = "300"; + BjuiResponse.message = ex.Message; + throw; + } + + return JsonHelper.Instance.Serialize(BjuiResponse); + } + private void CreateWorkflowIfNotExists(Guid id) { @@ -77,5 +113,43 @@ namespace OpenAuth.Mvc.Controllers sync.Wait(new TimeSpan(0, 0, 10)); } } + + /// + /// 获取当前登陆用户可执行的命令 + /// + /// 流程实体ID + private CommandModel[] GetCommands(Guid id) + { + var result = new List(); + var commands = WorkflowInit.Runtime.GetAvailableCommands(id, AuthUtil.GetCurrentUser().User.Id.ToString()); + foreach (var workflowCommand in commands) //去除相同的 + { + if (result.Count(c => c.Key == workflowCommand.CommandName) == 0) + result.Add(new CommandModel() { Key = workflowCommand.CommandName, Value = workflowCommand.LocalizedName, Classifier = workflowCommand.Classifier }); + } + return result.ToArray(); + } + + /// + /// 执行指令 + /// + /// 流程实例ID + /// 命令名称 + /// 申请实体 + private void ExecuteCommand(Guid id, string commandName, GoodsApply goodsApply) + { + var currentUser =AuthUtil.GetCurrentUser().User.Id.ToString(); + + var commands = WorkflowInit.Runtime.GetAvailableCommands(id, currentUser); + + var command = + commands.FirstOrDefault( + c => c.CommandName.Equals(commandName, StringComparison.CurrentCultureIgnoreCase)); + + if (command == null) + return; + + WorkflowInit.Runtime.ExecuteCommand(id, currentUser, currentUser, command); + } } } \ No newline at end of file diff --git a/OpenAuth.Mvc/Controllers/OrgManagerController.cs b/OpenAuth.Mvc/Controllers/OrgManagerController.cs index 90e5ded3..649c5c0d 100644 --- a/OpenAuth.Mvc/Controllers/OrgManagerController.cs +++ b/OpenAuth.Mvc/Controllers/OrgManagerController.cs @@ -33,7 +33,7 @@ namespace OpenAuth.Mvc.Controllers public string LoadOrg() { - return JsonHelper.Instance.Serialize(AuthUtil.GetCurrentUser().AccessedOrgs); + return JsonHelper.Instance.Serialize(AuthUtil.GetCurrentUser().Orgs); } public string LoadForUser(Guid firstId) diff --git a/OpenAuth.Mvc/Models/WorkflowInit.cs b/OpenAuth.Mvc/Models/WorkflowInit.cs index bd58110a..66d03e96 100644 --- a/OpenAuth.Mvc/Models/WorkflowInit.cs +++ b/OpenAuth.Mvc/Models/WorkflowInit.cs @@ -34,7 +34,7 @@ namespace OpenAuth.Mvc.Models _runtime = new WorkflowRuntime(new Guid("{8D38DB8F-F3D5-4F26-A989-4FDD40F32D9D}")) .WithBuilder(builder) - // .WithRuleProvider(new WorkflowRuleProvider()) + .WithRuleProvider(new WorkflowRuleProvider()) // .WithActionProvider(new WorkflowActionProvider()) .WithPersistenceProvider(new MSSQLProvider(connectionString)) .WithTimerManager(new TimerManager()) @@ -62,12 +62,7 @@ namespace OpenAuth.Mvc.Models var nextState = WorkflowInit.Runtime.GetLocalizedStateName(e.ProcessId, e.ProcessInstance.CurrentState); var _app = AutofacExt.GetFromFac(); - var goodsapply = _app.Get(e.ProcessId); - if (goodsapply != null) - { - goodsapply.StateName = nextState; - } - _app.ChangeState(goodsapply.Id, e.ProcessInstance.CurrentState, nextState); + _app.ChangeState(e.ProcessId, e.ProcessInstance.CurrentState, nextState); } } diff --git a/OpenAuth.Mvc/Models/WorkflowRuleProvider.cs b/OpenAuth.Mvc/Models/WorkflowRuleProvider.cs index c6887e30..f455abd7 100644 --- a/OpenAuth.Mvc/Models/WorkflowRuleProvider.cs +++ b/OpenAuth.Mvc/Models/WorkflowRuleProvider.cs @@ -1,11 +1,15 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenAuth.App; using OptimaJet.Workflow.Core.Model; using OptimaJet.Workflow.Core.Runtime; namespace OpenAuth.Mvc.Models { + /// + /// 判断角色 + /// public class WorkflowRuleProvider : IWorkflowRuleProvider { private RoleManagerApp _app; @@ -15,6 +19,9 @@ namespace OpenAuth.Mvc.Models _app = AutofacExt.GetFromFac(); } + /// + /// 加载角色列表,供流程设计的时候进行选择 + /// public List GetRules() { var roles = _app.Load(Guid.Empty, 1, 100).list; @@ -26,10 +33,26 @@ namespace OpenAuth.Mvc.Models return rolestrs; } + /// + /// Checks the specified process instance. + /// 李玉宝于2016-09-05 16:43:07 + /// + /// The process instance. + /// The runtime. + /// 用户ID + /// Name of the rule. + /// The parameter. + /// true if XXXX, false otherwise. public bool Check(ProcessInstance processInstance, WorkflowRuntime runtime, string identityId, string ruleName, string parameter) { - throw new NotImplementedException(); + var userRole = _app.LoadForUser(Guid.Parse(identityId)); + foreach (var role in userRole) + { + if (role.Name == ruleName) + return true; + } + return false; } public IEnumerable GetIdentities(ProcessInstance processInstance, WorkflowRuntime runtime, string ruleName, string parameter) diff --git a/OpenAuth.Mvc/Views/GoodsApplies/Detail.cshtml b/OpenAuth.Mvc/Views/GoodsApplies/Detail.cshtml index c06ab2d1..ff39b7f2 100644 --- a/OpenAuth.Mvc/Views/GoodsApplies/Detail.cshtml +++ b/OpenAuth.Mvc/Views/GoodsApplies/Detail.cshtml @@ -1,7 +1,7 @@ @{ Layout = null; } -@model OpenAuth.Domain.GoodsApply +@model OpenAuth.App.ViewModel.GoodsApplyVM @@ -18,6 +18,11 @@ @Model.Name 数量:@Model.Number + 你可以: + @foreach (var cmd in Model.Commands) + { + + }
diff --git a/OpenAuth.Repository/OrgRepository.cs b/OpenAuth.Repository/OrgRepository.cs index b1c48c67..550c4830 100644 --- a/OpenAuth.Repository/OrgRepository.cs +++ b/OpenAuth.Repository/OrgRepository.cs @@ -54,19 +54,5 @@ namespace OpenAuth.Repository return Find(u => u.CascadeId.Contains(cascadeId)); } - - public IEnumerable GetSubWithOwn(Guid orgId) - { - string cascadeId = "0."; - if (orgId != Guid.Empty) - { - var org = FindSingle(u => u.Id == orgId); - if (org == null) - throw new Exception("未能找到指定对象信息"); - cascadeId = org.CascadeId; - } - - return Find(u => u.CascadeId.Contains(cascadeId)); - } } } diff --git a/OpenAuth.Repository/ResourceRepository.cs b/OpenAuth.Repository/ResourceRepository.cs index 92b6d805..cda11ca2 100644 --- a/OpenAuth.Repository/ResourceRepository.cs +++ b/OpenAuth.Repository/ResourceRepository.cs @@ -40,5 +40,18 @@ namespace OpenAuth.Repository return result; } + + public IEnumerable LoadForUser(Guid userId) + { + + if (userId == Guid.Empty) + return Find(null); + + var userRoleIds = + Context.Relevances.Where(u => u.FirstId == userId && u.Key == "UserRole") + .Select(u => u.SecondId).ToList(); + + return Find(u => userRoleIds.Contains(u.Id)); + } } }