using Prism.Commands; using Prism.Mvvm; using Prism.Regions; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.Serialization.Formatters.Binary; using System.Runtime.Serialization; using System.Text; using System.Threading.Tasks; using System.Windows; using DM_Weight.Models; using DM_Weight.util; using System.Data; using System.Configuration; namespace DM_Weight.ViewModels { public class RoleManagerWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime { private List? _roleList; public List? RoleList { get { return _roleList; } set { SetProperty(ref _roleList, value); } } //public RoleManagerWindowViewModel() //{ // _allPremissions = Clone(defaultAll); //} public static ObservableCollection Clone(object List) { using (Stream objectStream = new MemoryStream()) { IFormatter formatter = new BinaryFormatter(); formatter.Serialize(objectStream, List); objectStream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(objectStream) as ObservableCollection; } } private RoleDm _role = new RoleDm(); public RoleDm Role { get { return _role; } set { CompareList(value); SetProperty(ref _role, value); } } private void CompareList(RoleDm Role) { AllPremissions = Clone(defaultAll); RightPremissions.Clear(); if (Role != null && Role.Permissions != null) { List Permissions = Role.Permissions; Permissions.ForEach(it => { // 父菜单 PremissionDm p = AllPremissions.ToList().Find(it2 => it2.Id == it.Id); int index = AllPremissions.ToList().FindIndex(it2 => it2.Id == it.Id); if (p.Id != 6) { it.Children.ToList().ForEach(it3 => { int i =p.Children.ToList().FindIndex(it4 => it4.Id == it3.Id); if (i > 0 && AllPremissions.ElementAt(index).Children.Count > i) { AllPremissions.ElementAt(index).Children.RemoveAt(i); } }); if (p.Children.Count == 0) { AllPremissions.RemoveAt(index); } } else { AllPremissions.RemoveAt(index); } }); RightPremissions = new ObservableCollection(Permissions); } } private string? _searchValue; /// /// 查询条件 查询字段值 /// public string? SearchValue { get { return _searchValue; } set { SetProperty(ref _searchValue, value); RequestData(); } } public static ObservableCollection defaultAll = new ObservableCollection(); static RoleManagerWindowViewModel() { #region 取药菜单 PremissionDm quyao = new PremissionDm{ Id = 1, PremissionName = "取药", PremissionImage = "/Images/TbQyao.png", }; ObservableCollection quyaoChild = new ObservableCollection(); PremissionDm quyao1 = new PremissionDm { Id = 11, PremissionName = "处方取药", PremissionPath = "OrderTakeDrugWindow", }; PremissionDm quyao2 = new PremissionDm { Id = 12, PremissionName = "调拨出库", PremissionPath = "InvoiceOutWindow", }; PremissionDm quyao3 = new PremissionDm { Id = 13, PremissionName = "抽屉取药", PremissionPath = "DrawerTakeDrugWindow", }; PremissionDm quyao4 = new PremissionDm { Id = 14, PremissionName = "自选取药", PremissionPath = "SelfTakeDrugWindow", }; PremissionDm quyao5 = new PremissionDm { Id = 15, PremissionName = "取药记录", PremissionPath = "TakeRecordWindow", }; PremissionDm quyao6 = new PremissionDm { Id = 16, PremissionName = "手术取药", PremissionPath = "OperationTakeWindow", }; quyaoChild.Add(quyao1); quyaoChild.Add(quyao2); quyaoChild.Add(quyao3); quyaoChild.Add(quyao4); quyaoChild.Add(quyao5); quyaoChild.Add(quyao6); quyao.Children = quyaoChild; defaultAll.Add(quyao); #endregion #region 加药菜单 PremissionDm jiayao = new PremissionDm { Id = 2, PremissionName = "加药", PremissionImage = "/Images/TbJiay.png", }; ObservableCollection jiayaoChild = new ObservableCollection(); PremissionDm jiayao1 = new PremissionDm { Id = 21, PremissionName = "自选加药", PremissionPath = "SelfAddWindow", }; PremissionDm jiayao2 = new PremissionDm { Id = 22, PremissionName = "调拨入库", PremissionPath = "InvoiceInWindow", }; PremissionDm jiayao3 = new PremissionDm { Id = 23, PremissionName = "抽屉加药", PremissionPath = "DrawerAddDrugWindow", }; PremissionDm jiayao4 = new PremissionDm { Id = 25, PremissionName = "加药记录", PremissionPath = "AddRecordWindow", }; PremissionDm jiayao5 = new PremissionDm { Id = 24, PremissionName = "多批次抽屉加药", PremissionPath = "AddDrugControl", }; jiayaoChild.Add(jiayao1); jiayaoChild.Add(jiayao2); jiayaoChild.Add(jiayao3); jiayaoChild.Add(jiayao5); jiayaoChild.Add(jiayao4); jiayao.Children = jiayaoChild; defaultAll.Add(jiayao); #endregion #region 还药菜单 PremissionDm huanyao = new PremissionDm { Id = 3, PremissionName = "还药", PremissionImage = "/Images/TbTuiy.png", }; ObservableCollection huanyaoChild = new ObservableCollection(); PremissionDm huanyao1 = new PremissionDm { Id = 31, PremissionName = "归还药品", PremissionPath = "ReturnDrugWindow", }; PremissionDm huanyao11 = new PremissionDm { Id = 31, PremissionName = "归还药品", PremissionPath = "ReturnDrugWindow2", }; PremissionDm huanyao2 = new PremissionDm { Id = 32, PremissionName = "归还空瓶", PremissionPath = "ReturnEmptyWindow", }; PremissionDm huanyao3 = new PremissionDm { Id = 33, PremissionName = "归还记录", PremissionPath = "ReturnRecordWindow", }; huanyaoChild.Add(Convert.ToInt32(ConfigurationManager.AppSettings["returnDrugMode"]) == 1? huanyao11:huanyao1); huanyaoChild.Add(huanyao2); huanyaoChild.Add(huanyao3); huanyao.Children = huanyaoChild; defaultAll.Add(huanyao); #endregion #region 库存管理菜单 PremissionDm kuguan = new PremissionDm { Id = 4, PremissionName = "库存管理", PremissionImage = "/Images/TbKuc.png", }; ObservableCollection kuguanChild = new ObservableCollection(); PremissionDm kuguan1 = new PremissionDm { Id = 41, PremissionName = "库存列表", PremissionPath = "StockListWindow", }; PremissionDm kuguan2 = new PremissionDm { Id = 42, PremissionName = "库存盘点", PremissionPath = "CheckStockWindow", }; PremissionDm kuguan3 = new PremissionDm { Id = 43, PremissionName = "盘点记录", PremissionPath = "CheckRecordWindow", }; PremissionDm kuguan4 = new PremissionDm { Id = 44, PremissionName = "药品列表", PremissionPath = "DrugListWindow", }; PremissionDm kuguan5 = new PremissionDm { Id = 45, PremissionName = "交接班记录", PremissionPath = "ChangeShiftsListWindow", }; kuguanChild.Add(kuguan1); kuguanChild.Add(kuguan2); kuguanChild.Add(kuguan3); kuguanChild.Add(kuguan4); kuguanChild.Add(kuguan5); kuguan.Children = kuguanChild; defaultAll.Add(kuguan); #endregion #region 系统设置菜单 PremissionDm sysset = new PremissionDm { Id = 5, PremissionName = "系统设置", PremissionImage = "/Images/TbSet.png", }; ObservableCollection syssetChild = new ObservableCollection(); PremissionDm sysset1 = new PremissionDm { Id = 51, PremissionName = "用户管理", PremissionPath = "UserManagerWindow", }; PremissionDm sysset2 = new PremissionDm { Id = 52, PremissionName = "角色管理", PremissionPath = "RoleManagerWindow", }; PremissionDm sysset3 = new PremissionDm { Id = 53, PremissionName = "设置", PremissionPath = "SettingWindow", }; syssetChild.Add(sysset1); syssetChild.Add(sysset2); syssetChild.Add(sysset3); sysset.Children = syssetChild; defaultAll.Add(sysset); #endregion #region 退出菜单 PremissionDm logout = new PremissionDm { Id = 6, PremissionName = "退出", PremissionImage = "/Images/TbExit.png", }; defaultAll.Add(logout); #endregion } private ObservableCollection _allPremissions = Clone(defaultAll); public ObservableCollection AllPremissions { get => _allPremissions; set => SetProperty(ref _allPremissions, value); } private PremissionDm? _leftPremission ; public PremissionDm? LeftPremission { get => _leftPremission; set => SetProperty(ref _leftPremission, value); } private ObservableCollection _rightPremissions = new ObservableCollection(); public ObservableCollection RightPremissions { get => _rightPremissions; set => SetProperty(ref _rightPremissions, value); } private PremissionDm? _rightPremission; public PremissionDm? RightPremission { get => _rightPremission; set => SetProperty(ref _rightPremission, value); } public bool KeepAlive => false; public T DeepCopyByReflect(T obj) { //如果是字符串或值类型则直接返回 if (obj == null || (obj is string) || (obj.GetType().IsValueType)) return obj; object retval = Activator.CreateInstance(obj.GetType()); FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); foreach (FieldInfo field in fields) { try { field.SetValue(retval, DeepCopyByReflect(field.GetValue(obj))); } catch { } } return (T)retval; } public DelegateCommand Query { get => new DelegateCommand(() => { RequestData(); }); } public DelegateCommand ToRight => new DelegateCommand(() => { // 说明是父菜单 if (LeftPremission.Children != null || LeftPremission.Id == 6) { // 右侧有没有此菜单 int index = RightPremissions.ToList().FindIndex((it) => it.Id == LeftPremission.Id); // 已经存在 if (index > -1) { // 获取右侧中的菜单 PremissionDm item = RightPremissions.ElementAt(index); // 向其中添加子菜单 LeftPremission.Children.ToList().ForEach(it => { int v = it.Id % 10; if (v > item.Children.Count) { item.Children.Add(it); } else { item.Children.Insert(v-1, it); } }); } else { int v = LeftPremission.Id % 10; if (v > RightPremissions.Count) { RightPremissions.Add(LeftPremission); } else { RightPremissions.Insert(v - 1, LeftPremission); } } AllPremissions.RemoveAt(AllPremissions.ToList().FindIndex(it => it.Id == LeftPremission.Id)); } // 子菜单 else { // 查找所选子菜单的父菜单 PremissionDm item = AllPremissions.ToList().Find(it => (int)(LeftPremission.Id / 10) == it.Id); // 查找父菜单是否在右侧 int index = RightPremissions.ToList().FindIndex(it => it.Id == item.Id); // 存在 if (index > -1) { ObservableCollection a= RightPremissions.ElementAt(index).Children; int v = LeftPremission.Id % 10; if (v > a.Count) { a.Add(LeftPremission); } else { a.Insert(v - 1, LeftPremission); } item.Children.RemoveAt(item.Children.ToList().FindIndex(it => it.Id == LeftPremission.Id)); if (item.Children.Count == 0) { AllPremissions.RemoveAt(AllPremissions.ToList().FindIndex(it => it.Id == LeftPremission.Id)); } } // 不存在 else { // 拷贝 PremissionDm item2 = DeepCopyByReflect(item); ObservableCollection child = new ObservableCollection(); child.Add(LeftPremission); item2.Children = child; int v = item2.Id % 10; if (v > RightPremissions.Count) { RightPremissions.Add(item2); } else { RightPremissions.Insert(v - 1, item2); } item.Children.RemoveAt(item.Children.ToList().FindIndex(it => it.Id == LeftPremission.Id)); } } }); public DelegateCommand LeftSelectedItemChangedCommand { get => new DelegateCommand((PremissionDm _selected) => { LeftPremission = _selected; }); } public DelegateCommand RightSelectedItemChangedCommand { get => new DelegateCommand((PremissionDm _selected) => { RightPremission = _selected; }); } public DelegateCommand ToLeft { get => new DelegateCommand(() => { // 说明是父菜单 if (RightPremission.Children != null || RightPremission.Id == 6) { // 左侧有没有此菜单 int index = AllPremissions.ToList().FindIndex((it) => it.Id == RightPremission.Id); // 已经存在 if (index > -1) { // 获取左侧中的菜单 PremissionDm item = AllPremissions.ElementAt(index); // 向其中添加子菜单 RightPremission.Children.ToList().ForEach(it => { int v = it.Id % 10; if (v > item.Children.Count) { item.Children.Add(it); } else { item.Children.Insert(v - 1, it); } }); } else { int v = RightPremission.Id % 10; if (v > AllPremissions.Count) { AllPremissions.Add(RightPremission); } else { AllPremissions.Insert(v - 1, RightPremission); } } RightPremissions.RemoveAt(RightPremissions.ToList().FindIndex(it => it.Id == RightPremission.Id)); } // 子菜单 else { // 查找所选子菜单的父菜单 PremissionDm item = RightPremissions.ToList().Find(it => (int)(RightPremission.Id / 10) == it.Id); // 查找父菜单是否在左侧 int index = AllPremissions.ToList().FindIndex(it => it.Id == item.Id); // 存在 if (index > -1) { ObservableCollection a = AllPremissions.ElementAt(index).Children; int v = RightPremission.Id % 10; if (v > a.Count) { a.Add(RightPremission); } else { a.Insert(v - 1, RightPremission); } item.Children.RemoveAt(item.Children.ToList().FindIndex(it => it.Id == RightPremission.Id)); if (item.Children.Count == 0) { RightPremissions.RemoveAt(RightPremissions.ToList().FindIndex(it => it.Id == RightPremission.Id)); } } // 不存在 else { // 拷贝 PremissionDm item2 = DeepCopyByReflect(item); ObservableCollection child = new ObservableCollection(); child.Add(RightPremission); item2.Children = child; int v = item2.Id % 10; if (v > AllPremissions.Count) { AllPremissions.Add(item2); } else { AllPremissions.Insert(v - 1, item2); } item.Children.RemoveAt(item.Children.ToList().FindIndex(it => it.Id == RightPremission.Id)); } } }); } public DelegateCommand AllToRight { get => new DelegateCommand(() => { RightPremissions = Clone(defaultAll); AllPremissions.Clear(); }); } public DelegateCommand AllToLeft { get => new DelegateCommand(() => { AllPremissions = Clone(defaultAll); RightPremissions.Clear(); }); } public DelegateCommand AddRole { get => new DelegateCommand(() => { Role.Id = 0; Role.MachineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1"; Role.Permissions = RightPremissions.ToList(); SqlSugarHelper.Db.Insertable(Role).ExecuteCommand(); RequestData(); }); } public DelegateCommand EditRole { get => new DelegateCommand(() => { Role.Permissions = RightPremissions.ToList(); SqlSugarHelper.Db.Updateable(Role).ExecuteCommand(); RequestData(); }); } //这个方法用于拦截请求,continuationCallback(true)就是不拦截,continuationCallback(false)拦截本次操作 public void ConfirmNavigationRequest(NavigationContext navigationContext, Action continuationCallback) { continuationCallback(true); } //接收导航传过来的参数 public void OnNavigatedTo(NavigationContext navigationContext) { //查询表格数据 RequestData(); } void RequestData() { RoleList = SqlSugarHelper.Db.Queryable() .Where(di => di.MachineId.Equals(ConfigurationManager.AppSettings["machineId"] ?? "DM1")) .WhereIF(!String.IsNullOrEmpty(SearchValue), (di) => di.RoleName.Contains(SearchValue??"")) .Select(r => r) .ToList() ; } //每次导航的时候,该实列用不用重新创建,true是不重新创建,false是重新创建 public bool IsNavigationTarget(NavigationContext navigationContext) { return true; } //这个方法用于拦截请求 public void OnNavigatedFrom(NavigationContext navigationContext) { } } }