XiangTan_DM/DM_Weight/ViewModels/RoleManagerWindowViewModel.cs

803 lines
29 KiB
C#
Raw Normal View History

2024-12-03 13:22:42 +08:00
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;
using MaterialDesignThemes.Wpf;
using System.Windows.Media;
namespace DM_Weight.ViewModels
{
public class RoleManagerWindowViewModel : BindableBase, IConfirmNavigationRequest, IRegionMemberLifetime
{
private List<RoleDm>? _roleList;
public List<RoleDm>? RoleList
{
get { return _roleList; }
set { SetProperty(ref _roleList, value); }
}
//public RoleManagerWindowViewModel()
//{
// _allPremissions = Clone<PremissionDm>(defaultAll);
//}
public static ObservableCollection<T> Clone<T>(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<T>;
}
}
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<PremissionDm>(defaultAll);
//RightPremissions.Clear();
//if (Role != null && Role.Permissions != null)
//{
// List<PremissionDm> 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<PremissionDm>(Permissions);
//}
AllPremissions = Clone<PremissionDm>(defaultAll);
RightPremissions.Clear();
if (Role != null && Role.Permissions != null)
{
List<PremissionDm> 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 != null && p.Children != null && it != null && it.Children != null && p.Children.Count == it.Children.Count)
{
AllPremissions.RemoveAt(index);
}
else
{
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)
if (p.Children.Count > 0 && i >= 0 && p.Children[i] != null)
{
AllPremissions.ElementAt(index).Children.RemoveAt(i);
}
});
if (p.Children.Count == 0)
{
AllPremissions.RemoveAt(index);
}
}
else
{
AllPremissions.RemoveAt(index);
}
}
});
RightPremissions = new ObservableCollection<PremissionDm>(Permissions);
}
}
private string? _searchValue;
/// <summary>
/// 查询条件 查询字段值
/// </summary>
public string? SearchValue
{
get { return _searchValue; }
set
{
SetProperty(ref _searchValue, value);
RequestData();
}
}
public static ObservableCollection<PremissionDm> defaultAll = new ObservableCollection<PremissionDm>();
static RoleManagerWindowViewModel()
{
#region
PremissionDm quyao = new PremissionDm
{
Id = 1,
PremissionName = "取药",
PremissionImage = "/Images/TbQyao.png",
};
ObservableCollection<PremissionDm> quyaoChild = new ObservableCollection<PremissionDm>();
//PremissionDm quyao1 = new PremissionDm
//{
// Id = 11,
// PremissionName = "处方取药",
// PremissionPath = "OrderTakeDrugWindow",
//};
PremissionDm quyao1 = new PremissionDm
{
Id = 11,
PremissionName = "交接柜补药",
PremissionPath = "AddToJiaoJieWindow",
};
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",
};
if (ConfigurationManager.AppSettings["returnDrugMode"].ToString().Equals("1"))
{
PremissionDm mulityOrder = new PremissionDm
{
Id = 16,
PremissionName = "多处方取药",
PremissionPath = "MultiOrderTakeDrugWindow",
};
//quyaoChild.Add(mulityOrder);
}
quyaoChild.Add(quyao1);
quyaoChild.Add(quyao2);
quyaoChild.Add(quyao3);
quyaoChild.Add(quyao4);
quyaoChild.Add(quyao5);
quyao.Children = quyaoChild;
defaultAll.Add(quyao);
#endregion
#region
PremissionDm jiayao = new PremissionDm
{
Id = 2,
PremissionName = "加药",
PremissionImage = "/Images/TbJiay.png",
};
ObservableCollection<PremissionDm> jiayaoChild = new ObservableCollection<PremissionDm>();
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 = 24,
PremissionName = "加药记录",
PremissionPath = "AddRecordWindow",
};
if (ConfigurationManager.AppSettings["MultiBatch"].ToString().Equals("1"))
{
PremissionDm jiayao5 = new PremissionDm
{
Id = 25,
PremissionName = "多批次抽屉加药",
PremissionPath = "AddDrugControl",
};
jiayaoChild.Add(jiayao5);
}
PremissionDm jiayao6 = new PremissionDm
{
Id = 26,
PremissionName = "药品请领",
PremissionPath = "CollectDrugWindow",
};
PremissionDm jiayao7 = new PremissionDm
{
Id = 27,
PremissionName = "请领列表",
PremissionPath = "ApplyListWindow",
};
PremissionDm jiayao8 = new PremissionDm
{
Id = 28,
PremissionName = "请领入库",
PremissionPath = "ApplyInStockWindow",
};
jiayaoChild.Add(jiayao1);
jiayaoChild.Add(jiayao2);
jiayaoChild.Add(jiayao3);
jiayaoChild.Add(jiayao4);
jiayaoChild.Add(jiayao6);
jiayaoChild.Add(jiayao7);
jiayaoChild.Add(jiayao8);
jiayao.Children = jiayaoChild;
defaultAll.Add(jiayao);
#endregion
#region
PremissionDm huanyao = new PremissionDm
{
Id = 3,
PremissionName = "还药",
PremissionImage = "/Images/TbTuiy.png",
};
ObservableCollection<PremissionDm> huanyaoChild = new ObservableCollection<PremissionDm>();
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<PremissionDm> kuguanChild = new ObservableCollection<PremissionDm>();
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",
};
PremissionDm kuguan6 = new PremissionDm
{
Id = 46,
PremissionName = "账册",
PremissionPath = "AccountWindow",
};
PremissionDm kuguan7 = new PremissionDm
{
Id = 47,
PremissionName = "使用账册",
PremissionPath = "UseAccountWindow",
};
2024-12-03 13:22:42 +08:00
kuguanChild.Add(kuguan1);
kuguanChild.Add(kuguan2);
kuguanChild.Add(kuguan3);
kuguanChild.Add(kuguan4);
kuguanChild.Add(kuguan5);
kuguanChild.Add(kuguan6);
kuguanChild.Add(kuguan7);
2024-12-03 13:22:42 +08:00
kuguan.Children = kuguanChild;
defaultAll.Add(kuguan);
#endregion
#region
PremissionDm sysset = new PremissionDm
{
Id = 5,
PremissionName = "系统设置",
PremissionImage = "/Images/TbSet.png",
};
ObservableCollection<PremissionDm> syssetChild = new ObservableCollection<PremissionDm>();
PremissionDm sysset1 = new PremissionDm
{
Id = 51,
PremissionName = "用户管理",
PremissionPath = "UserManagerWindow",
};
PremissionDm sysset2 = new PremissionDm
{
Id = 52,
PremissionName = "角色管理",
PremissionPath = "RoleManagerWindow",
};
PremissionDm sysset3;
if (Convert.ToInt32(ConfigurationManager.AppSettings["hasFridge"]) > 0)
{
//有冰箱,需要冰箱设置(两个冰箱)
sysset3 = new PremissionDm
{
Id = 53,
PremissionName = "设置",
PremissionPath = "SettingMainWindow",
};
}
else
{
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<PremissionDm> _allPremissions = Clone<PremissionDm>(defaultAll);
public ObservableCollection<PremissionDm> AllPremissions
{
get => _allPremissions;
set => SetProperty(ref _allPremissions, value);
}
private PremissionDm? _leftPremission;
public PremissionDm? LeftPremission
{
get => _leftPremission;
set => SetProperty(ref _leftPremission, value);
}
private ObservableCollection<PremissionDm> _rightPremissions = new ObservableCollection<PremissionDm>();
public ObservableCollection<PremissionDm> 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>(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<PremissionDm> 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<PremissionDm>(item);
ObservableCollection<PremissionDm> child = new ObservableCollection<PremissionDm>();
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<PremissionDm> LeftSelectedItemChangedCommand
{
get => new DelegateCommand<PremissionDm>((PremissionDm _selected) =>
{
LeftPremission = _selected;
});
}
public DelegateCommand<PremissionDm> RightSelectedItemChangedCommand
{
get => new DelegateCommand<PremissionDm>((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<PremissionDm> 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<PremissionDm>(item);
ObservableCollection<PremissionDm> child = new ObservableCollection<PremissionDm>();
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<PremissionDm>(defaultAll);
AllPremissions.Clear();
});
}
public DelegateCommand AllToLeft
{
get => new DelegateCommand(() =>
{
AllPremissions = Clone<PremissionDm>(defaultAll);
RightPremissions.Clear();
});
}
private ISnackbarMessageQueue _snackbarMessageQueue = new SnackbarMessageQueue(TimeSpan.FromSeconds(3));
public ISnackbarMessageQueue SnackbarMessageQueue
{
get => _snackbarMessageQueue;
set => SetProperty(ref _snackbarMessageQueue, value);
}
private SolidColorBrush _colorBrush;
public SolidColorBrush SnackbarBackground
{
get => _colorBrush;
set => SetProperty(ref _colorBrush, value);
}
public DelegateCommand AddRole
{
get => new DelegateCommand(() =>
{
Role.Id = 0;
Role.MachineId = ConfigurationManager.AppSettings["machineId"] ?? "DM1";
Role.Permissions = RightPremissions.ToList();
List<RoleDm> roleList = SqlSugarHelper.Db.Queryable<RoleDm>().Where(r => r.RoleName == Role.RoleName).ToList();
if (roleList.Count > 0)
{
SnackbarBackground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#b71c1c"));
SnackbarMessageQueue.Enqueue("该角色已存在!");
return;
}
SqlSugarHelper.Db.Insertable<RoleDm>(Role).ExecuteCommand();
RequestData();
});
}
public DelegateCommand EditRole
{
get => new DelegateCommand(() =>
{
Role.Permissions = RightPremissions.ToList();
SqlSugarHelper.Db.Updateable<RoleDm>(Role).ExecuteCommand();
RequestData();
});
}
//这个方法用于拦截请求,continuationCallback(true)就是不拦截continuationCallback(false)拦截本次操作
public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
{
continuationCallback(true);
}
//接收导航传过来的参数
public void OnNavigatedTo(NavigationContext navigationContext)
{
//查询表格数据
RequestData();
}
void RequestData()
{
RoleList = SqlSugarHelper.Db.Queryable<RoleDm>()
.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)
{
}
}
}