@@ -215,5 +215,4 @@ | |||||
</Setter> | </Setter> | ||||
</Style> | </Style> | ||||
<!--#endregion--> | <!--#endregion--> | ||||
</ResourceDictionary> | </ResourceDictionary> |
@@ -21,6 +21,7 @@ namespace BPASmartClient.CustomResource.UserControls | |||||
/// </summary> | /// </summary> | ||||
public partial class DateTimeUI : UserControl | public partial class DateTimeUI : UserControl | ||||
{ | { | ||||
public DateTimeUI() | public DateTimeUI() | ||||
{ | { | ||||
InitializeComponent(); | InitializeComponent(); | ||||
@@ -130,7 +130,7 @@ namespace BPASmartClient.Modbus | |||||
} | } | ||||
return -1; | return -1; | ||||
} | } | ||||
private void ExceptionHandling(Exception ex) | private void ExceptionHandling(Exception ex) | ||||
{ | { | ||||
if (ex.InnerException is SocketException) | if (ex.InnerException is SocketException) | ||||
@@ -174,7 +174,78 @@ namespace BPASmartClient.Modbus | |||||
} | } | ||||
return default(object); | return default(object); | ||||
} | } | ||||
#region 180项目调用 | |||||
public int GetAddress(string address, string target) | |||||
{ | |||||
if (address == null) return -1; | |||||
if (address.Length > 0) | |||||
{ | |||||
if (address.ToUpper().Contains("D") && address.Length == 5) | |||||
{ | |||||
try | |||||
{ | |||||
string head = (Convert.ToInt32(address.Substring(1, 1)) - 1).ToString(); | |||||
string tail = address.Substring(2, 3); | |||||
address = head + tail; | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
//打印日志 | |||||
return -1; | |||||
} | |||||
} | |||||
} | |||||
return -1; | |||||
} | |||||
public object Read(string address, ushort len, string target, byte slaveAddress = 1) | |||||
{ | |||||
if (address == null || tcpClient == null) return default(object); | |||||
ushort startAddress = (ushort)GetAddress(address, target); | |||||
CommandType commandType = CommandType.HoldingRegisters; | |||||
try | |||||
{ | |||||
if (address.ToUpper().Contains("D")) | |||||
{ | |||||
commandType = CommandType.HoldingRegisters; | |||||
return master.ReadHoldingRegisters(slaveAddress, startAddress, len); | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageLog.GetInstance.ShowEx($"读取地址:【{address}:= {startAddress}】,读取类型:【{commandType.ToString()}】出错,{ex.ToString()}"); | |||||
ExceptionHandling(ex); | |||||
} | |||||
return default(object); | |||||
} | |||||
public void Write<T>(string address, T value, string target, byte slaveAddress = 1) | |||||
{ | |||||
if (address == null || tcpClient == null) return; | |||||
ushort startAddress = (ushort)GetAddress(address,target); | |||||
CommandType commandType = CommandType.Coils; | |||||
try | |||||
{ | |||||
if (address.ToUpper().Contains("D")) | |||||
{ | |||||
commandType = CommandType.HoldingRegisters; | |||||
if (value is ushort ushortValue) | |||||
{ | |||||
master.WriteSingleRegister(slaveAddress, startAddress, ushortValue); | |||||
} | |||||
} | |||||
} | |||||
catch (Exception ex) | |||||
{ | |||||
MessageLog.GetInstance.ShowEx($"写入地址:【{address}:= {startAddress}】,写入类型:【{commandType.ToString()}】出错,{ex.ToString()}"); | |||||
ExceptionHandling(ex); | |||||
} | |||||
} | |||||
#endregion | |||||
public void Write<T>(string address, T value, byte slaveAddress = 1) | public void Write<T>(string address, T value, byte slaveAddress = 1) | ||||
{ | { | ||||
if (address == null || tcpClient == null) return; | if (address == null || tcpClient == null) return; | ||||
@@ -51,8 +51,6 @@ namespace DosingSystem.Model | |||||
private void IpAddressLines() | private void IpAddressLines() | ||||
{ | { | ||||
for (int i = 1; i <= 255; i++) | for (int i = 1; i <= 255; i++) | ||||
{ | { | ||||
if (!InvalidIP.Contains($"{IPSegment}{i}")) | if (!InvalidIP.Contains($"{IPSegment}{i}")) | ||||
@@ -238,7 +238,7 @@ | |||||
</Grid> | </Grid> | ||||
<!--#region 底部窗体栏--> | <!--#region 底部窗体栏--> | ||||
<ContentControl | |||||
<ContentControl | |||||
x:Name="contentRegion" | x:Name="contentRegion" | ||||
Grid.Row="1" | Grid.Row="1" | ||||
Content="{Binding MyWindow}" /> | Content="{Binding MyWindow}" /> | ||||
@@ -116,7 +116,7 @@ | |||||
Height="30" | Height="30" | ||||
Margin="0,0,7,0" | Margin="0,0,7,0" | ||||
Command="{Binding AddCommand}" | Command="{Binding AddCommand}" | ||||
Content="添加原料" /> | |||||
Content="添加原料" Cursor="Hand" /> | |||||
<Button | <Button | ||||
Width="80" | Width="80" | ||||
@@ -0,0 +1,36 @@ | |||||
<Application x:Class="FryPot_DosingSystem.App" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem" xmlns:con="clr-namespace:System.Drawing;assembly=netstandard" | |||||
xmlns:con1="clr-namespace:BPASmartClient.CustomResource.Converters;assembly=BPASmartClient.CustomResource" | |||||
StartupUri="View/MainWindow.xaml"> | |||||
<Application.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/RecCheckBox.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/RecTitleBarButton.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/GlobalStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/RecComboBox.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/RecIcoButtonStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/RecToggleButton.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/BeveledRadioButtonStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/DatePickeerDictionary.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/RecDictionarys/RecButtonStyle.xaml" /> | |||||
<ResourceDictionary> | |||||
<con:ColorConverter x:Key="ColorConverter" /> | |||||
<con1:TextConverter x:Key="TextConverter" /> | |||||
<con1:VisibleTypeConverter x:Key="VisibleTypeConverter" /> | |||||
<con1:StatusConverter x:Key="StatusConverter" /> | |||||
</ResourceDictionary> | |||||
<ResourceDictionary> | |||||
<ImageBrush x:Key="hbl" ImageSource="/BPASmartClient.CustomResource;component/Image/HBL.png" /> | |||||
<ImageBrush x:Key="dbxt" ImageSource="/BPASmartClient.CustomResource;component/Image/顶部线条.png" /> | |||||
</ResourceDictionary> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</Application.Resources> | |||||
</Application> |
@@ -0,0 +1,17 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Configuration; | |||||
using System.Data; | |||||
using System.Linq; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
namespace FryPot_DosingSystem | |||||
{ | |||||
/// <summary> | |||||
/// Interaction logic for App.xaml | |||||
/// </summary> | |||||
public partial class App : Application | |||||
{ | |||||
} | |||||
} |
@@ -0,0 +1,10 @@ | |||||
using System.Windows; | |||||
[assembly: ThemeInfo( | |||||
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located | |||||
//(used if a resource is not found in the page, | |||||
// or application resource dictionaries) | |||||
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located | |||||
//(used if a resource is not found in the page, | |||||
// app, or any theme specific resource dictionaries) | |||||
)] |
@@ -0,0 +1,106 @@ | |||||
using BPASmartClient.Helper; | |||||
using BPASmartClient.Message; | |||||
using BPASmartClient.Modbus; | |||||
using FryPot_DosingSystem.Model; | |||||
using System; | |||||
using System.Collections.Concurrent; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Control | |||||
{ | |||||
internal class DeviceOperate | |||||
{ | |||||
private static DeviceOperate _instance; | |||||
public static DeviceOperate GetInstance=>_instance ??= new DeviceOperate(); | |||||
ModbusTcp modbus = new ModbusTcp(); | |||||
private string Ip { get; set; } | |||||
private string Port { get; set; } | |||||
private bool Connected { get; set; } | |||||
private string DeviceName { get; set; } | |||||
public ConcurrentDictionary<string, object> Data { get; set; } = new ConcurrentDictionary<string, object>(); | |||||
public ObservableCollection<PlcVariableModel> Variables { get; set; }=new ObservableCollection<PlcVariableModel>(); | |||||
public DeviceOperate() | |||||
{ | |||||
Init(); | |||||
Connect(); | |||||
ReadData(); | |||||
} | |||||
public void Init() | |||||
{ | |||||
if (Variables.Count > 0) | |||||
{ | |||||
Variables.Clear(); | |||||
} | |||||
Variables.Add(new PlcVariableModel() { Address = "D2001", Length = 8 });//1号线体滚筒工位号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2011", Length = 8 });//2号线体滚筒工位号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2021", Length = 8 });//3号线体滚筒工位号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2031", Length = 9 });//输送线出料状态 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2040", Length = 5 });//炒锅1-5进料滚筒运行 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2045", Length = 5 });//炒锅1-5进料到位信号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2050", Length = 5 });//炒锅1-5空桶到位信号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2055", Length = 5 });//炒锅1-5空桶呼叫AGV | |||||
Variables.Add(new PlcVariableModel() { Address = "D2060", Length = 5 });//炒锅1空桶洗桶呼叫AGV | |||||
Variables.Add(new PlcVariableModel() { Address = "D2065", Length = 5 });//炒锅1-5空桶滚筒运行 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2070", Length = 5 });//炒锅1-5滚筒故障信号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2075", Length = 1 });//洗桶进桶滚筒运行信号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2076", Length = 1 });//洗桶出桶呼叫AGV | |||||
Variables.Add(new PlcVariableModel() { Address = "D2077", Length = 1 });// 洗桶出桶滚筒运行信号 | |||||
Variables.Add(new PlcVariableModel() { Address = "D2078", Length = 3 });//1-3滚筒线体配方完成信号 | |||||
} | |||||
public void Connect() | |||||
{ | |||||
Json<DeviceManage>.Read(); | |||||
DeviceManage devices = Json<DeviceManage>.Data; | |||||
if (devices != null) | |||||
{ | |||||
if (devices.Devices.Count > 0) | |||||
{ | |||||
Ip = devices.Devices[0].Ip; | |||||
Port = devices.Devices[0].Port; | |||||
DeviceName = devices.Devices[0].DeviceName; | |||||
Task.Run(() => { modbus.ModbusTcpConnect(Ip, Convert.ToInt32(Port)); }); | |||||
} | |||||
} | |||||
} | |||||
public void ReadData() | |||||
{ | |||||
ThreadManage.GetInstance().StartLong(new Action(() => | |||||
{ | |||||
Connected = modbus.Connected; | |||||
while (Connected) | |||||
{ | |||||
foreach (var item in Variables) | |||||
{ | |||||
var res = modbus.Read(item.Address, item.Length, "180项目"); | |||||
if (Data.ContainsKey(item.Address)) | |||||
{ | |||||
Data[item.Address] = res; | |||||
} | |||||
else | |||||
{ | |||||
Data.TryAdd(item.Address, res); | |||||
} | |||||
} | |||||
Thread.Sleep(500); | |||||
} | |||||
Thread.Sleep(1000); | |||||
}),$"设备【{DeviceName}】PLC实时数据读取线程"); | |||||
} | |||||
public void WritePlcData(string address,ushort value) | |||||
{ | |||||
modbus.Write(address, value,"180项目"); | |||||
} | |||||
public ConcurrentDictionary<string, object> GetAllData() | |||||
{ | |||||
return Data; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,162 @@ | |||||
using BPASmartClient.Helper; | |||||
using FryPot_DosingSystem.Model; | |||||
using System; | |||||
using System.Collections.Concurrent; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Control | |||||
{ | |||||
internal class DosingLogicControl | |||||
{ | |||||
public static DosingLogicControl _instance; | |||||
public static DosingLogicControl GetInstance=>_instance ??= new DosingLogicControl(); | |||||
public ConcurrentDictionary<string,object> PlcReadData=new ConcurrentDictionary<string, object>(); | |||||
public DosingLogicControl() | |||||
{ | |||||
IniteTask(); | |||||
} | |||||
/// <summary> | |||||
/// 实时获取plc数据 | |||||
/// </summary> | |||||
public void ReadPlcData() | |||||
{ | |||||
ThreadManage.GetInstance().StartLong(new Action(() => | |||||
{ | |||||
GetAddressData("D2001", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.rollerLineOne.StationOne = data[0]; | |||||
GlobalVariable.rollerLineOne.StationTwo = data[1]; | |||||
GlobalVariable.rollerLineOne.StationThree = data[2]; | |||||
GlobalVariable.rollerLineOne.StationFour = data[3]; | |||||
GlobalVariable.rollerLineOne.StationFive = data[4]; | |||||
GlobalVariable.rollerLineOne.StationSix = data[5]; | |||||
GlobalVariable.rollerLineOne.StationSeven = data[6]; | |||||
GlobalVariable.rollerLineOne.StationEight = data[7]; | |||||
})); | |||||
GetAddressData("D2011", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.rollerLineTwo.StationOne = data[0]; | |||||
GlobalVariable.rollerLineTwo.StationTwo = data[1]; | |||||
GlobalVariable.rollerLineTwo.StationThree = data[2]; | |||||
GlobalVariable.rollerLineTwo.StationFour = data[3]; | |||||
GlobalVariable.rollerLineTwo.StationFive = data[4]; | |||||
GlobalVariable.rollerLineTwo.StationSix = data[5]; | |||||
GlobalVariable.rollerLineTwo.StationSeven = data[6]; | |||||
GlobalVariable.rollerLineTwo.StationEight = data[7]; | |||||
})); | |||||
GetAddressData("D2021", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.rollerLineThree.StationOne = data[0]; | |||||
GlobalVariable.rollerLineThree.StationTwo = data[1]; | |||||
GlobalVariable.rollerLineThree.StationThree = data[2]; | |||||
GlobalVariable.rollerLineThree.StationFour = data[3]; | |||||
GlobalVariable.rollerLineThree.StationFive = data[4]; | |||||
GlobalVariable.rollerLineThree.StationSix = data[5]; | |||||
GlobalVariable.rollerLineThree.StationSeven = data[6]; | |||||
GlobalVariable.rollerLineThree.StationEight = data[7]; | |||||
})); | |||||
GetAddressData("D2040", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.fryPotOne.InputMaterialRollerRunningSingle = data[0]; | |||||
GlobalVariable.fryPotTwo.InputMaterialRollerRunningSingle = data[1]; | |||||
GlobalVariable.fryPotThree.InputMaterialRollerRunningSingle = data[2]; | |||||
GlobalVariable.fryPotFour.InputMaterialRollerRunningSingle = data[3]; | |||||
GlobalVariable.fryPotFive.InputMaterialRollerRunningSingle= data[4]; | |||||
})); | |||||
GetAddressData("D2045", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.fryPotOne.InputMaterialArrivedSingle = data[0]; | |||||
GlobalVariable.fryPotTwo.InputMaterialArrivedSingle = data[1]; | |||||
GlobalVariable.fryPotThree.InputMaterialArrivedSingle = data[2]; | |||||
GlobalVariable.fryPotFour.InputMaterialArrivedSingle = data[3]; | |||||
GlobalVariable.fryPotFive.InputMaterialArrivedSingle = data[4]; | |||||
})); | |||||
GetAddressData("D2050", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.fryPotOne.EmptyBarrelArrivedSingle = data[0]; | |||||
GlobalVariable.fryPotTwo.EmptyBarrelArrivedSingle = data[1]; | |||||
GlobalVariable.fryPotThree.EmptyBarrelArrivedSingle = data[2]; | |||||
GlobalVariable.fryPotFour.EmptyBarrelArrivedSingle = data[3]; | |||||
GlobalVariable.fryPotFive.EmptyBarrelArrivedSingle = data[4]; | |||||
})); | |||||
GetAddressData("D2065", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.fryPotOne.EmptyBarrelRollerRunningSingle = data[0]; | |||||
GlobalVariable.fryPotTwo.EmptyBarrelRollerRunningSingle = data[1]; | |||||
GlobalVariable.fryPotThree.EmptyBarrelRollerRunningSingle = data[2]; | |||||
GlobalVariable.fryPotFour.EmptyBarrelRollerRunningSingle = data[3]; | |||||
GlobalVariable.fryPotFive.EmptyBarrelRollerRunningSingle = data[4]; | |||||
})); | |||||
GetAddressData("D2070", new Action<ushort[]>((data) => | |||||
{ | |||||
GlobalVariable.fryPotOne.RollerTroubleSingle = data[0]; | |||||
GlobalVariable.fryPotTwo.RollerTroubleSingle = data[1]; | |||||
GlobalVariable.fryPotThree.RollerTroubleSingle = data[2]; | |||||
GlobalVariable.fryPotFour.RollerTroubleSingle = data[3]; | |||||
GlobalVariable.fryPotFive.RollerTroubleSingle = data[4]; | |||||
})); | |||||
GetAddressData("D2078",new Action<ushort[]>(data => { | |||||
GlobalVariable.rollerLineOne.RecipeCompleteSingle = data[0]; | |||||
GlobalVariable.rollerLineTwo.RecipeCompleteSingle = data[1]; | |||||
GlobalVariable.rollerLineThree.RecipeCompleteSingle = data[2]; | |||||
})); | |||||
GetAddressData("D2075",new Action<ushort[]>(data => { | |||||
GlobalVariable.CleadBarrelEnterSingle = data[0]; | |||||
})); | |||||
GetAddressData("D2077", new Action<ushort[]>(data => { | |||||
GlobalVariable.CleadBarrelExitSingle = data[0]; | |||||
})); | |||||
Thread.Sleep(10); | |||||
}), "MainViewReadPlcData"); | |||||
} | |||||
/// <summary> | |||||
/// 返回指定地址指定长度的数据 | |||||
/// </summary> | |||||
/// <param name="address"></param> | |||||
/// <returns></returns> | |||||
public void GetAddressData(string address, Action<ushort[]> action) | |||||
{ | |||||
PlcReadData= DeviceOperate.GetInstance.GetAllData(); | |||||
if (PlcReadData.ContainsKey(address)) | |||||
{ | |||||
action((ushort[])(PlcReadData[address])); | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 写Plc数据 | |||||
/// </summary> | |||||
/// <param name="address"></param> | |||||
/// <param name="Value"></param> | |||||
public void WritePlcData(string address, ushort Value) | |||||
{ | |||||
DeviceOperate.GetInstance.WritePlcData(address, Value); | |||||
} | |||||
/// <summary> | |||||
/// 初始化任务 | |||||
/// </summary> | |||||
public void IniteTask() | |||||
{ | |||||
ThreadManage.GetInstance().StartLong(new Action(() => { | |||||
MainTask(); | |||||
}),"启动主任务循环",true); | |||||
} | |||||
/// <summary> | |||||
/// 开启主任务 | |||||
/// </summary> | |||||
public void MainTask() | |||||
{ | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,386 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Control | |||||
{ | |||||
/// <summary> | |||||
/// plc变量 | |||||
/// </summary> | |||||
internal static class GlobalVariable | |||||
{ | |||||
/// <summary> | |||||
/// 滚筒线1 | |||||
/// </summary> | |||||
public static RollerLineOne rollerLineOne = new RollerLineOne(); | |||||
/// <summary> | |||||
/// 滚筒线2 | |||||
/// </summary> | |||||
public static RollerLineTwo rollerLineTwo = new RollerLineTwo(); | |||||
/// <summary> | |||||
/// 滚筒线3 | |||||
/// </summary> | |||||
public static RollerLineThree rollerLineThree = new RollerLineThree(); | |||||
/// <summary> | |||||
/// 炒锅1 | |||||
/// </summary> | |||||
public static FryPotOne fryPotOne= new FryPotOne(); | |||||
/// <summary> | |||||
/// 炒锅2 | |||||
/// </summary> | |||||
public static FryPotTwo fryPotTwo= new FryPotTwo(); | |||||
/// <summary> | |||||
/// 炒锅3 | |||||
/// </summary> | |||||
public static FryPotThree fryPotThree= new FryPotThree(); | |||||
/// <summary> | |||||
/// 炒锅4 | |||||
/// </summary> | |||||
public static FryPotFour fryPotFour= new FryPotFour(); | |||||
/// <summary> | |||||
/// 炒锅5 | |||||
/// </summary> | |||||
public static FryPotFive fryPotFive= new FryPotFive(); | |||||
/// <summary> | |||||
/// 洗桶进桶滚筒运行信号 | |||||
/// </summary> | |||||
public static ushort CleadBarrelEnterSingle { get; set; } | |||||
/// <summary> | |||||
/// 洗桶出桶滚筒运行信号 | |||||
/// </summary> | |||||
public static ushort CleadBarrelExitSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 滚筒线1相关变量 | |||||
/// </summary> | |||||
public class RollerLineOne | |||||
{ | |||||
/// <summary> | |||||
/// 工位号1 | |||||
/// </summary> | |||||
public ushort StationOne { get; set; } | |||||
/// <summary> | |||||
/// 工位号2 | |||||
/// </summary> | |||||
public ushort StationTwo { get; set; } | |||||
/// <summary> | |||||
/// 工位号3 | |||||
/// </summary> | |||||
public ushort StationThree { get; set; } | |||||
/// <summary> | |||||
/// 工位号4 | |||||
/// </summary> | |||||
public ushort StationFour { get; set; } | |||||
/// <summary> | |||||
/// 工位号5 | |||||
/// </summary> | |||||
public ushort StationFive { get; set; } | |||||
/// <summary> | |||||
/// 工位号6 | |||||
/// </summary> | |||||
public ushort StationSix { get; set; } | |||||
/// <summary> | |||||
/// 工位号7 | |||||
/// </summary> | |||||
public ushort StationSeven { get; set; } | |||||
/// <summary> | |||||
/// 工位号8 | |||||
/// </summary> | |||||
public ushort StationEight { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingSingle { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行故障信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingTroubleSingle { get; set; } | |||||
/// <summary> | |||||
/// 当前线体配方完成信号 | |||||
/// </summary> | |||||
public ushort RecipeCompleteSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 滚筒线2相关变量 | |||||
/// </summary> | |||||
public class RollerLineTwo | |||||
{ | |||||
/// <summary> | |||||
/// 工位号1 | |||||
/// </summary> | |||||
public ushort StationOne { get; set; } | |||||
/// <summary> | |||||
/// 工位号2 | |||||
/// </summary> | |||||
public ushort StationTwo { get; set; } | |||||
/// <summary> | |||||
/// 工位号3 | |||||
/// </summary> | |||||
public ushort StationThree { get; set; } | |||||
/// <summary> | |||||
/// 工位号4 | |||||
/// </summary> | |||||
public ushort StationFour { get; set; } | |||||
/// <summary> | |||||
/// 工位号5 | |||||
/// </summary> | |||||
public ushort StationFive { get; set; } | |||||
/// <summary> | |||||
/// 工位号6 | |||||
/// </summary> | |||||
public ushort StationSix { get; set; } | |||||
/// <summary> | |||||
/// 工位号7 | |||||
/// </summary> | |||||
public ushort StationSeven { get; set; } | |||||
/// <summary> | |||||
/// 工位号8 | |||||
/// </summary> | |||||
public ushort StationEight { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingSingle { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行故障信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingTroubleSingle { get; set; } | |||||
/// <summary> | |||||
/// 当前线体配方完成信号 | |||||
/// </summary> | |||||
public ushort RecipeCompleteSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 滚筒线3相关变量 | |||||
/// </summary> | |||||
public class RollerLineThree | |||||
{ | |||||
/// <summary> | |||||
/// 工位号1 | |||||
/// </summary> | |||||
public ushort StationOne { get; set; } | |||||
/// <summary> | |||||
/// 工位号2 | |||||
/// </summary> | |||||
public ushort StationTwo { get; set; } | |||||
/// <summary> | |||||
/// 工位号3 | |||||
/// </summary> | |||||
public ushort StationThree { get; set; } | |||||
/// <summary> | |||||
/// 工位号4 | |||||
/// </summary> | |||||
public ushort StationFour { get; set; } | |||||
/// <summary> | |||||
/// 工位号5 | |||||
/// </summary> | |||||
public ushort StationFive { get; set; } | |||||
/// <summary> | |||||
/// 工位号6 | |||||
/// </summary> | |||||
public ushort StationSix { get; set; } | |||||
/// <summary> | |||||
/// 工位号7 | |||||
/// </summary> | |||||
public ushort StationSeven { get; set; } | |||||
/// <summary> | |||||
/// 工位号8 | |||||
/// </summary> | |||||
public ushort StationEight { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingSingle { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行故障信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingTroubleSingle { get; set; } | |||||
/// <summary> | |||||
/// 当前线体配方完成信号 | |||||
/// </summary> | |||||
public ushort RecipeCompleteSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 滚筒线4相关变量 | |||||
/// </summary> | |||||
public class RollerLineFour | |||||
{ | |||||
/// <summary> | |||||
/// 工位号1 | |||||
/// </summary> | |||||
public ushort StationOne { get; set; } | |||||
/// <summary> | |||||
/// 工位号2 | |||||
/// </summary> | |||||
public ushort StationTwo { get; set; } | |||||
/// <summary> | |||||
/// 工位号3 | |||||
/// </summary> | |||||
public ushort StationThree { get; set; } | |||||
/// <summary> | |||||
/// 工位号4 | |||||
/// </summary> | |||||
public ushort StationFour { get; set; } | |||||
/// <summary> | |||||
/// 工位号5 | |||||
/// </summary> | |||||
public ushort StationFive { get; set; } | |||||
/// <summary> | |||||
/// 工位号6 | |||||
/// </summary> | |||||
public ushort StationSix { get; set; } | |||||
/// <summary> | |||||
/// 工位号7 | |||||
/// </summary> | |||||
public ushort StationSeven { get; set; } | |||||
/// <summary> | |||||
/// 工位号8 | |||||
/// </summary> | |||||
public ushort StationEight { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingSingle { get; set; } | |||||
/// <summary> | |||||
/// 输送出料滚筒运行故障信号 | |||||
/// </summary> | |||||
public ushort OutMaterialingTroubleSingle { get; set; } | |||||
/// <summary> | |||||
/// 当前线体配方完成信号 | |||||
/// </summary> | |||||
public ushort RecipeCompleteSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 炒锅1相关变量 | |||||
/// </summary> | |||||
public class FryPotOne | |||||
{ | |||||
/// <summary> | |||||
/// 进料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort InputMaterialRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 进料到位信号 | |||||
/// </summary> | |||||
public ushort InputMaterialArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶到位信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶滚筒运行信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 滚筒故障信号 | |||||
/// </summary> | |||||
public ushort RollerTroubleSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 炒锅2相关变量 | |||||
/// </summary> | |||||
public class FryPotTwo | |||||
{ | |||||
/// <summary> | |||||
/// 进料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort InputMaterialRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 进料到位信号 | |||||
/// </summary> | |||||
public ushort InputMaterialArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶到位信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶滚筒运行信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 滚筒故障信号 | |||||
/// </summary> | |||||
public ushort RollerTroubleSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 炒锅3相关变量 | |||||
/// </summary> | |||||
public class FryPotThree | |||||
{ | |||||
/// <summary> | |||||
/// 进料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort InputMaterialRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 进料到位信号 | |||||
/// </summary> | |||||
public ushort InputMaterialArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶到位信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶滚筒运行信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 滚筒故障信号 | |||||
/// </summary> | |||||
public ushort RollerTroubleSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 炒锅4相关变量 | |||||
/// </summary> | |||||
public class FryPotFour | |||||
{ | |||||
/// <summary> | |||||
/// 进料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort InputMaterialRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 进料到位信号 | |||||
/// </summary> | |||||
public ushort InputMaterialArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶到位信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶滚筒运行信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 滚筒故障信号 | |||||
/// </summary> | |||||
public ushort RollerTroubleSingle { get; set; } | |||||
} | |||||
/// <summary> | |||||
/// 炒锅5相关变量 | |||||
/// </summary> | |||||
public class FryPotFive | |||||
{ | |||||
/// <summary> | |||||
/// 进料滚筒运行信号 | |||||
/// </summary> | |||||
public ushort InputMaterialRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 进料到位信号 | |||||
/// </summary> | |||||
public ushort InputMaterialArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶到位信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelArrivedSingle { get; set; } | |||||
/// <summary> | |||||
/// 空桶滚筒运行信号 | |||||
/// </summary> | |||||
public ushort EmptyBarrelRollerRunningSingle { get; set; } | |||||
/// <summary> | |||||
/// 滚筒故障信号 | |||||
/// </summary> | |||||
public ushort RollerTroubleSingle { get; set; } | |||||
} | |||||
} |
@@ -0,0 +1,29 @@ | |||||
<Project Sdk="Microsoft.NET.Sdk"> | |||||
<PropertyGroup> | |||||
<OutputType>WinExe</OutputType> | |||||
<TargetFramework>net6.0-windows</TargetFramework> | |||||
<Nullable>enable</Nullable> | |||||
<UseWPF>true</UseWPF> | |||||
</PropertyGroup> | |||||
<ItemGroup> | |||||
<None Remove="hbl.ico" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<Content Include="hbl.ico" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<PackageReference Include="Microsoft.Toolkit.Mvvm" Version="7.1.2" /> | |||||
<PackageReference Include="NModbus" Version="3.0.72" /> | |||||
</ItemGroup> | |||||
<ItemGroup> | |||||
<ProjectReference Include="..\BPASmartClient.CustomResource\BPASmartClient.CustomResource.csproj" /> | |||||
<ProjectReference Include="..\BPASmartClient.Helper\BPASmartClient.Helper.csproj" /> | |||||
<ProjectReference Include="..\BPASmartClient.Modbus\BPASmartClient.Modbus.csproj" /> | |||||
</ItemGroup> | |||||
</Project> |
@@ -0,0 +1,37 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
namespace FryPot_DosingSystem.Helper | |||||
{ | |||||
public class PasswordBoxHelper | |||||
{ | |||||
public static string GetPasswordContent(DependencyObject obj) => (string)obj.GetValue(PasswordContentProperty); | |||||
public static void SetPasswordContent(DependencyObject obj, string value) => obj.SetValue(PasswordContentProperty, value); | |||||
public static readonly DependencyProperty PasswordContentProperty = | |||||
DependencyProperty.RegisterAttached("PasswordContent", typeof(string), typeof(PasswordBoxHelper), | |||||
new PropertyMetadata(string.Empty, OnPasswordContentPropertyChanged)); | |||||
private static void OnPasswordContentPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) | |||||
{ | |||||
var box = d as PasswordBox; | |||||
box.PasswordChanged -= OnPasswordChanged; | |||||
var password = (string)e.NewValue; | |||||
if (box != null && box.Password != password) | |||||
box.Password = password; | |||||
box.PasswordChanged += OnPasswordChanged; | |||||
} | |||||
private static void OnPasswordChanged(object sender, RoutedEventArgs e) | |||||
{ | |||||
var box = sender as PasswordBox; | |||||
SetPasswordContent(box, box.Password); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,22 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
public class ActionMenu:ObservableObject | |||||
{ | |||||
private string commandParmeter; | |||||
public string CommandParameter { get { return commandParmeter; }set { commandParmeter = value; OnPropertyChanged(); } } | |||||
private string menuName; | |||||
public string MenuName { get { return menuName; } set { menuName = value;OnPropertyChanged(); } } | |||||
private Authority[] authority; | |||||
public Authority[] Authority { get { return authority; } set { authority = value; OnPropertyChanged(); } } | |||||
} | |||||
} |
@@ -0,0 +1,24 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class DeviceInfo : ObservableObject | |||||
{ | |||||
private string _deviceNum; | |||||
public string DeviceNum { get { return _deviceNum; }set { _deviceNum = value;OnPropertyChanged(); } } | |||||
private string _deviceName; | |||||
public string DeviceName { get { return _deviceName; } set { _deviceName = value; OnPropertyChanged(); } } | |||||
private string _ip; | |||||
public string Ip { get { return _ip; } set { _ip = value; OnPropertyChanged(); } } | |||||
private string _port; | |||||
public string Port { get { return _port; } set { _port = value; OnPropertyChanged(); } } | |||||
} | |||||
} |
@@ -0,0 +1,15 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class DeviceManage:ObservableObject | |||||
{ | |||||
public ObservableCollection<DeviceInfo> Devices { get; set; } = new ObservableCollection<DeviceInfo>(); | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class Global | |||||
{ | |||||
public static UserManage userManager { get; set; } = new UserManage(); | |||||
} | |||||
} |
@@ -0,0 +1,30 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows.Media; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class LogModel:ObservableObject | |||||
{ | |||||
private string _logTime; | |||||
public string LogTime { get { return _logTime; } set { _logTime = value; OnPropertyChanged(); } } | |||||
private string _logType; | |||||
public string LogType { get { return _logType; } set { _logType = value; OnPropertyChanged(); } } | |||||
private string _logMessage; | |||||
public string LogMessage { get { return _logMessage; } set { _logMessage = value; OnPropertyChanged(); } } | |||||
private Brush _foreColor; | |||||
public Brush ForeColor { get { return _foreColor; } set { _foreColor = value; OnPropertyChanged(); } } | |||||
public LogModel() | |||||
{ | |||||
ForeColor = new SolidColorBrush((System.Windows.Media.Color)System.Windows.Media.ColorConverter.ConvertFromString("#21bb2e")); | |||||
LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,48 @@ | |||||
using BPA.Message; | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.IO; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class LoginInfoConfig | |||||
{ | |||||
private volatile static LoginInfoConfig _Instance; | |||||
public static LoginInfoConfig GetInstance => _Instance ?? (_Instance = new LoginInfoConfig()); | |||||
private LoginInfoConfig() { } | |||||
public void Init() | |||||
{ | |||||
if (File.Exists("LoginUp.hbl")) | |||||
{ | |||||
var result = JsonConvert.DeserializeObject<UserManage>(File.ReadAllText("LoginUp.hbl").AESDecrypt()); | |||||
if (result == null || (result != null && result.userInfos.Count <= 0))//无用户登陆相关信息 | |||||
{ | |||||
} | |||||
else | |||||
{ | |||||
Global.userManager = result; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
AddData(); | |||||
} | |||||
} | |||||
private void AddData() | |||||
{ | |||||
Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.管理员, UserName = "admin", Password = "123456",UserId="123" }); | |||||
//Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.操作员, UserName = "czy", Password = "123456" }); | |||||
//Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.观察员, UserName = "gcy", Password = "123456" }); | |||||
//Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.技术员, UserName = "jsy", Password = "123456" }); | |||||
File.WriteAllText("LoginUp.hbl", JsonConvert.SerializeObject(Global.userManager).AESEncrypt()); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,35 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class MaterialType:ObservableObject | |||||
{ | |||||
/// <summary> | |||||
/// 原料名称 | |||||
/// </summary> | |||||
private string _materialName; | |||||
public string MaterialName { get { return _materialName; } set { _materialName = value; OnPropertyChanged(); } } | |||||
/// <summary> | |||||
/// 原料编码 | |||||
/// </summary> | |||||
private string _materialCode; | |||||
public string MaterialCode { get { return _materialCode; } set { _materialCode = value; OnPropertyChanged(); } } | |||||
/// <summary> | |||||
/// 原料重量 | |||||
/// </summary> | |||||
private string _materialWeight; | |||||
public string MaterialWeight { get { return _materialWeight; }set { _materialWeight = value;OnPropertyChanged(); } } | |||||
/// <summary> | |||||
/// 原料对应桶位置 | |||||
/// </summary> | |||||
private string _materialLoc; | |||||
public string MaterialLoc { get { return _materialLoc; } set { _materialLoc = value; OnPropertyChanged(); } } | |||||
} | |||||
} |
@@ -0,0 +1,14 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class PlcVariableModel | |||||
{ | |||||
public string Address { get; set; } | |||||
public ushort Length { get; set;} | |||||
} | |||||
} |
@@ -0,0 +1,17 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class RecipeManage:ObservableObject | |||||
{ | |||||
//private static RecipeManage _Instance; | |||||
//public static RecipeManage GetInstance=>_Instance ?? (_Instance = new RecipeManage()); | |||||
public ObservableCollection<NewRecipeModel> Recipes { get; set; }=new ObservableCollection<NewRecipeModel>(); | |||||
} | |||||
} |
@@ -0,0 +1,32 @@ | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class NewRecipeModel:ObservableObject | |||||
{ | |||||
/// <summary> | |||||
/// 配方唯一ID | |||||
/// </summary> | |||||
private string _recipeId; | |||||
public string RecipeId { get { return _recipeId; }set { _recipeId = value; OnPropertyChanged(); } } | |||||
/// <summary> | |||||
/// 配方名称 | |||||
/// </summary> | |||||
private string _recipeName; | |||||
public string RecipeName { get { return _recipeName; } set { _recipeName = value;OnPropertyChanged(); } } | |||||
/// <summary> | |||||
/// 配发下发状况信息 | |||||
/// </summary> | |||||
private string _recipeSetInfo; | |||||
public string RecipeSetInfo { get { return _recipeSetInfo; } set { _recipeSetInfo = value; OnPropertyChanged(); } } | |||||
public ObservableCollection<MaterialType> materialCollection { get; set; } = new ObservableCollection<MaterialType>(); | |||||
} | |||||
} |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.Model | |||||
{ | |||||
internal class UserManage | |||||
{ | |||||
public List<UserInfo> userInfos { get; set; } = new List<UserInfo>(); | |||||
} | |||||
public class UserInfo | |||||
{ | |||||
public Authority Authority { get; set; } | |||||
public string UserName { get; set; } | |||||
public string Password { get; set; } | |||||
public string UserId { get; set; } | |||||
} | |||||
public enum Authority | |||||
{ | |||||
管理员 = 1, | |||||
操作员 = 2, | |||||
观察员 = 3, | |||||
技术员 = 4 | |||||
} | |||||
} |
@@ -0,0 +1,187 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.AdministratorLoginView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
xmlns:helper="clr-namespace:FryPot_DosingSystem.Helper" | |||||
xmlns:uc="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource" | |||||
mc:Ignorable="d" | |||||
Height="450" Width="800" | |||||
Loaded="UserControl_Loaded"> | |||||
<UserControl.DataContext> | |||||
<vm:AdministratorLoginViewModel></vm:AdministratorLoginViewModel> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<Style x:Key="TxLogin" TargetType="TextBlock"> | |||||
<Setter Property="FontSize" Value="20" /> | |||||
<Setter Property="Foreground" Value="#ddd" /> | |||||
<Setter Property="HorizontalAlignment" Value="Center" /> | |||||
<Setter Property="VerticalAlignment" Value="Center" /> | |||||
</Style> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<!--<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="7*" /> | |||||
<ColumnDefinition Width="10*" /> | |||||
</Grid.ColumnDefinitions>--> | |||||
<!--<Grid.RowDefinitions> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="4*" /> | |||||
<RowDefinition Height="8*" /> | |||||
<RowDefinition Height="20*" /> | |||||
</Grid.RowDefinitions>--> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<!--#region 登录--> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="0.7*"/> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="权限:" /> | |||||
<ComboBox | |||||
Grid.Column="1" | |||||
Width="230" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
BorderBrush="#FF074B92" | |||||
BorderThickness="1" | |||||
FontFamily="楷体" | |||||
FontSize="20" | |||||
Foreground="#FF2AB2E7" | |||||
IsEditable="False" | |||||
ItemsSource="{Binding permission}" | |||||
Style="{StaticResource ComboBoxStyle}" | |||||
Text="{Binding SelectText}" /> | |||||
<TextBlock | |||||
Grid.Row="1" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="账号:" /> | |||||
<TextBox | |||||
x:Name="tbx_admin" | |||||
Grid.Row="1" | |||||
Grid.Column="1" | |||||
Width="230" | |||||
Height="28" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
HorizontalContentAlignment="Center" | |||||
VerticalContentAlignment="Top" | |||||
Background="Transparent" | |||||
BorderBrush="White" | |||||
BorderThickness="0,0,0,1" | |||||
FontSize="20" | |||||
Foreground="#F8F8FF" | |||||
GotFocus="tbx_admin_GotFocus" | |||||
Text="{Binding Admin, Mode=TwoWay}" /> | |||||
<TextBlock | |||||
Grid.Row="2" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="密码:" /> | |||||
<PasswordBox | |||||
x:Name="password" | |||||
Grid.Row="2" | |||||
Grid.Column="1" | |||||
Width="230" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
HorizontalContentAlignment="Center" | |||||
VerticalContentAlignment="Top" | |||||
helper:PasswordBoxHelper.PasswordContent="{Binding Password, Mode=TwoWay}" | |||||
Background="Transparent" | |||||
BorderBrush="White" | |||||
BorderThickness="0,0,0,1" | |||||
CaretBrush="White" | |||||
FontSize="16" | |||||
Foreground="#F8F8FF" | |||||
GotFocus="password_GotFocus" /> | |||||
<TextBlock | |||||
Grid.Row="3" | |||||
Grid.ColumnSpan="2" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
FontFamily="楷体" | |||||
FontSize="16" | |||||
Foreground="#FFE2415C" | |||||
Text="{Binding ErrorMessage}" | |||||
TextWrapping="Wrap" /> | |||||
<StackPanel Grid.Row="4" Grid.ColumnSpan="2" Orientation="Horizontal"> | |||||
<Button | |||||
Margin="280,0,0,0" | |||||
Width="120" | |||||
Height="40" | |||||
VerticalAlignment="Center" | |||||
Background="Transparent" | |||||
BorderBrush="#ff19b7ec" | |||||
BorderThickness="2" | |||||
Command="{Binding AdminLoginCommand}" | |||||
Content="登 录" | |||||
FontSize="28" | |||||
Foreground="#9934F7F7" | |||||
IsDefault="True" /> | |||||
<Button | |||||
Margin="30,0,0,0" | |||||
Width="120" | |||||
Height="40" | |||||
VerticalAlignment="Center" | |||||
Background="Transparent" | |||||
BorderBrush="#ff19b7ec" | |||||
BorderThickness="2" | |||||
Content="{Binding RegistOrChange}" | |||||
FontSize="28" | |||||
Foreground="#9934F7F7" | |||||
IsDefault="True" | |||||
Command="{Binding RegistCommand}" | |||||
CommandParameter="{Binding RegistOrChange}"/> | |||||
</StackPanel> | |||||
</Grid> | |||||
<!--#endregion--> | |||||
<!--#region 密码修改--> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition /> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<!--#endregion--> | |||||
<uc:UserKeyBoard | |||||
x:Name="myKeyboard" | |||||
Grid.Row="5" | |||||
Grid.ColumnSpan="2" | |||||
Margin="100,10,100,50" | |||||
Focusable="False" /> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,95 @@ | |||||
using BPASmartClient.Helper; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Shapes; | |||||
using static BPASmartClient.CustomResource.UserControls.UserKeyBoard; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// AdministratorLoginView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class AdministratorLoginView : UserControl | |||||
{ | |||||
public AdministratorLoginView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
private void MyKeyDown_Password(object _key) | |||||
{ | |||||
EKeyitem key = EKeyitem.A; | |||||
if (_key.GetType() == typeof(EKeyitem)) key = (EKeyitem)_key; | |||||
switch (key) | |||||
{ | |||||
case EKeyitem.DEL: | |||||
if (password.Password.Length > 0) | |||||
{ | |||||
password.Password = password.Password.Substring(0, password.Password.Length - 1); | |||||
} | |||||
break; | |||||
case EKeyitem.AC: | |||||
password.Password = string.Empty; | |||||
break; | |||||
case EKeyitem.OK: | |||||
break; | |||||
default: | |||||
password.Password += _key.ToString(); | |||||
break; | |||||
} | |||||
} | |||||
private void tbx_admin_GotFocus(object sender, RoutedEventArgs e) | |||||
{ | |||||
myKeyboard.MyKeyDown = MyKeyDown_Admin; | |||||
} | |||||
private void password_GotFocus(object sender, RoutedEventArgs e) | |||||
{ | |||||
myKeyboard.MyKeyDown = MyKeyDown_Password; | |||||
} | |||||
private void MyKeyDown_Admin(object _key) | |||||
{ | |||||
EKeyitem key = EKeyitem.A; | |||||
if (_key.GetType() == typeof(EKeyitem)) key = (EKeyitem)_key; | |||||
switch (key) | |||||
{ | |||||
case EKeyitem.DEL: | |||||
if (tbx_admin.Text.Length > 0) | |||||
{ | |||||
tbx_admin.Text = tbx_admin.Text.Substring(0, tbx_admin.Text.Length - 1); | |||||
} | |||||
break; | |||||
case EKeyitem.AC: | |||||
tbx_admin.Text = string.Empty; | |||||
break; | |||||
case EKeyitem.OK: | |||||
break; | |||||
default: | |||||
tbx_admin.Text += _key.ToString(); | |||||
break; | |||||
} | |||||
this.tbx_admin.Focus(); | |||||
} | |||||
private void UserControl_Loaded(object sender, RoutedEventArgs e) | |||||
{ | |||||
this.tbx_admin.Focus(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,185 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.AdministratorPasswordChangeView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:helper="clr-namespace:FryPot_DosingSystem.Helper" | |||||
xmlns:uc="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<UserControl.DataContext> | |||||
<vm:AdministratorPasswordChangeViewModel/> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<Style x:Key="TxLogin" TargetType="TextBlock"> | |||||
<Setter Property="FontSize" Value="20" /> | |||||
<Setter Property="Foreground" Value="#ddd" /> | |||||
<Setter Property="HorizontalAlignment" Value="Center" /> | |||||
<Setter Property="VerticalAlignment" Value="Center" /> | |||||
</Style> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<!--<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="7*" /> | |||||
<ColumnDefinition Width="10*" /> | |||||
</Grid.ColumnDefinitions>--> | |||||
<!--<Grid.RowDefinitions> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="5*" /> | |||||
<RowDefinition Height="4*" /> | |||||
<RowDefinition Height="8*" /> | |||||
<RowDefinition Height="20*" /> | |||||
</Grid.RowDefinitions>--> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<!--#region 登录--> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="0.7*"/> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="权限:" /> | |||||
<ComboBox | |||||
Grid.Column="1" | |||||
Width="230" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
BorderBrush="#FF074B92" | |||||
BorderThickness="1" | |||||
FontFamily="楷体" | |||||
FontSize="20" | |||||
Foreground="#FF2AB2E7" | |||||
IsEditable="False" | |||||
ItemsSource="{Binding permission}" | |||||
Style="{StaticResource ComboBoxStyle}" | |||||
Text="{Binding SelectText}" /> | |||||
<TextBlock | |||||
Grid.Row="1" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="账号:" /> | |||||
<TextBox | |||||
x:Name="tbx_admin" | |||||
Grid.Row="1" | |||||
Grid.Column="1" | |||||
Width="230" | |||||
Height="28" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
HorizontalContentAlignment="Center" | |||||
VerticalContentAlignment="Top" | |||||
Background="Transparent" | |||||
BorderBrush="White" | |||||
BorderThickness="0,0,0,1" | |||||
FontSize="20" | |||||
Foreground="#F8F8FF" | |||||
GotFocus="tbx_admin_GotFocus" | |||||
Text="{Binding Admin, Mode=TwoWay}" /> | |||||
<TextBlock | |||||
Grid.Row="2" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Center" | |||||
Foreground="#feffff" | |||||
Style="{StaticResource TxLogin}" | |||||
Text="密码:" /> | |||||
<PasswordBox | |||||
x:Name="password" | |||||
Grid.Row="2" | |||||
Grid.Column="1" | |||||
Width="230" | |||||
HorizontalAlignment="Left" | |||||
VerticalAlignment="Center" | |||||
HorizontalContentAlignment="Center" | |||||
VerticalContentAlignment="Top" | |||||
helper:PasswordBoxHelper.PasswordContent="{Binding Password, Mode=TwoWay}" | |||||
Background="Transparent" | |||||
BorderBrush="White" | |||||
BorderThickness="0,0,0,1" | |||||
CaretBrush="White" | |||||
FontSize="16" | |||||
Foreground="#F8F8FF" | |||||
GotFocus="password_GotFocus" /> | |||||
<TextBlock | |||||
Grid.Row="3" | |||||
Grid.ColumnSpan="2" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
FontFamily="楷体" | |||||
FontSize="16" | |||||
Foreground="#FFE2415C" | |||||
Text="{Binding ErrorMessage}" | |||||
TextWrapping="Wrap" /> | |||||
<StackPanel Grid.Row="4" Grid.ColumnSpan="2" Orientation="Horizontal"> | |||||
<Button | |||||
Margin="280,0,0,0" | |||||
Width="120" | |||||
Height="40" | |||||
VerticalAlignment="Center" | |||||
Background="Transparent" | |||||
BorderBrush="#ff19b7ec" | |||||
BorderThickness="2" | |||||
Command="{Binding AdminLoginCommand}" | |||||
Content="登 录" | |||||
FontSize="28" | |||||
Foreground="#9934F7F7" | |||||
IsDefault="True" /> | |||||
<Button | |||||
Margin="30,0,0,0" | |||||
Width="120" | |||||
Height="40" | |||||
VerticalAlignment="Center" | |||||
Background="Transparent" | |||||
BorderBrush="#ff19b7ec" | |||||
BorderThickness="2" | |||||
Content="修改" | |||||
FontSize="28" | |||||
Foreground="#9934F7F7" | |||||
IsDefault="True" | |||||
Command="{Binding RegistCommand}"/> | |||||
</StackPanel> | |||||
</Grid> | |||||
<!--#endregion--> | |||||
<!--#region 密码修改--> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition /> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
</Grid> | |||||
<!--#endregion--> | |||||
<uc:UserKeyBoard | |||||
x:Name="myKeyboard" | |||||
Grid.Row="5" | |||||
Grid.ColumnSpan="2" | |||||
Margin="100,10,100,50" | |||||
Focusable="False" /> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,85 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
using static BPASmartClient.CustomResource.UserControls.UserKeyBoard; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// AdministratorPasswordChangeView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class AdministratorPasswordChangeView : UserControl | |||||
{ | |||||
public AdministratorPasswordChangeView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
private void tbx_admin_GotFocus(object sender, RoutedEventArgs e) | |||||
{ | |||||
myKeyboard.MyKeyDown = MyKeyDown_Admin; | |||||
} | |||||
private void password_GotFocus(object sender, RoutedEventArgs e) | |||||
{ | |||||
myKeyboard.MyKeyDown = MyKeyDown_Password; | |||||
} | |||||
private void MyKeyDown_Password(object _key) | |||||
{ | |||||
EKeyitem key = EKeyitem.A; | |||||
if (_key.GetType() == typeof(EKeyitem)) key = (EKeyitem)_key; | |||||
switch (key) | |||||
{ | |||||
case EKeyitem.DEL: | |||||
if (password.Password.Length > 0) | |||||
{ | |||||
password.Password = password.Password.Substring(0, password.Password.Length - 1); | |||||
} | |||||
break; | |||||
case EKeyitem.AC: | |||||
password.Password = string.Empty; | |||||
break; | |||||
case EKeyitem.OK: | |||||
break; | |||||
default: | |||||
password.Password += _key.ToString(); | |||||
break; | |||||
} | |||||
} | |||||
private void MyKeyDown_Admin(object _key) | |||||
{ | |||||
EKeyitem key = EKeyitem.A; | |||||
if (_key.GetType() == typeof(EKeyitem)) key = (EKeyitem)_key; | |||||
switch (key) | |||||
{ | |||||
case EKeyitem.DEL: | |||||
if (tbx_admin.Text.Length > 0) | |||||
{ | |||||
tbx_admin.Text = tbx_admin.Text.Substring(0, tbx_admin.Text.Length - 1); | |||||
} | |||||
break; | |||||
case EKeyitem.AC: | |||||
tbx_admin.Text = string.Empty; | |||||
break; | |||||
case EKeyitem.OK: | |||||
break; | |||||
default: | |||||
tbx_admin.Text += _key.ToString(); | |||||
break; | |||||
} | |||||
this.tbx_admin.Focus(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.AlarmInfoView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<Grid> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// AlarmInfoView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class AlarmInfoView : UserControl | |||||
{ | |||||
public AlarmInfoView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,72 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.DeviceListVIew" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<UserControl.DataContext> | |||||
<vm:DeviceListViewModel/> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="50"/> | |||||
<RowDefinition Height="20"/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right"> | |||||
<Button Width="150" Height="35" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,20,0" Content="添加设备" Command="{Binding AddDeviceCommand}"></Button> | |||||
<Button Content="保存设置" Width="150" Height="35" Margin="0,0,20,0" Command="{Binding SaveDeviceConfig}"></Button> | |||||
</StackPanel> | |||||
<Line Grid.Row="1" X1="0" Y1="10" X2="1300" Y2="10" Stroke="Aqua" StrokeThickness="1"></Line> | |||||
<ItemsControl Grid.Row="2" ItemsSource="{Binding devices}"> | |||||
<ItemsControl.ItemsPanel> | |||||
<ItemsPanelTemplate> | |||||
<StackPanel></StackPanel> | |||||
</ItemsPanelTemplate> | |||||
</ItemsControl.ItemsPanel> | |||||
<ItemsControl.ItemTemplate> | |||||
<DataTemplate> | |||||
<RadioButton> | |||||
<RadioButton.Template> | |||||
<ControlTemplate> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> | |||||
<TextBlock Text="设备名称:" Margin="10,10,10,10" FontSize="16" ></TextBlock> | |||||
<ComboBox ItemsSource="{Binding DataContext.DeviceName, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" Text="{Binding DeviceName}" Width="150" FontSize="16"></ComboBox> | |||||
</StackPanel> | |||||
<StackPanel Grid.Column="1" Orientation="Horizontal" HorizontalAlignment="Center"> | |||||
<TextBlock Text="ModBus IP:" Margin="10,10,10,10" FontSize="16" VerticalAlignment="Center"></TextBlock> | |||||
<TextBox Width="150" FontSize="16" Text="{Binding Ip}" ></TextBox> | |||||
</StackPanel> | |||||
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Center"> | |||||
<TextBlock Text="Port:" FontSize="16" Margin="10,10,10,10"></TextBlock> | |||||
<TextBox Width="150" FontSize="16" Text="{Binding Port}"></TextBox> | |||||
</StackPanel> | |||||
<Button Grid.Column="3" Content="删除" Width="150" Height="30" FontSize="16" Command="{Binding DataContext.DeleteDevice,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ItemsControl}}" CommandParameter="{Binding DeviceNum}"></Button> | |||||
</Grid> | |||||
</ControlTemplate> | |||||
</RadioButton.Template> | |||||
</RadioButton> | |||||
</DataTemplate> | |||||
</ItemsControl.ItemTemplate> | |||||
</ItemsControl> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// DeviceListVIew.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class DeviceListVIew : UserControl | |||||
{ | |||||
public DeviceListVIew() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.EditRecipeView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<Grid> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// EditRecipeView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class EditRecipeView : UserControl | |||||
{ | |||||
public EditRecipeView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,12 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.HardWareStatusView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<Grid> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// HardWareStatusView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class HardWareStatusView : UserControl | |||||
{ | |||||
public HardWareStatusView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,54 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.LogView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<UserControl.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml"/> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml"/> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="50"/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<DataGrid Grid.Row="1" ItemsSource="{Binding LogDatas}"> | |||||
<DataGrid.Columns> | |||||
<DataGridTemplateColumn Header="日志时间" Width="300"> | |||||
<DataGridTemplateColumn.CellTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding LogTime, UpdateSourceTrigger=PropertyChanged}" Foreground="{Binding ForeColor, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" FontSize="14"></TextBlock> | |||||
</DataTemplate> | |||||
</DataGridTemplateColumn.CellTemplate> | |||||
</DataGridTemplateColumn> | |||||
<DataGridTemplateColumn Header="日志类型" Width="300"> | |||||
<DataGridTemplateColumn.CellTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding LogType, UpdateSourceTrigger=PropertyChanged}" Foreground="{Binding ForeColor, UpdateSourceTrigger=PropertyChanged}" FontSize="14" HorizontalAlignment="Center"> | |||||
</TextBlock> | |||||
</DataTemplate> | |||||
</DataGridTemplateColumn.CellTemplate> | |||||
</DataGridTemplateColumn> | |||||
<DataGridTemplateColumn Header="日志信息" Width="*"> | |||||
<DataGridTemplateColumn.CellTemplate> | |||||
<DataTemplate> | |||||
<TextBlock Text="{Binding LogMessage, UpdateSourceTrigger=PropertyChanged}" | |||||
Foreground="{Binding ForeColor, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Center" FontSize="14"></TextBlock> | |||||
</DataTemplate> | |||||
</DataGridTemplateColumn.CellTemplate> | |||||
</DataGridTemplateColumn> | |||||
</DataGrid.Columns> | |||||
</DataGrid> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,30 @@ | |||||
using FryPot_DosingSystem.ViewModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// LogView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class LogView : UserControl | |||||
{ | |||||
public LogView() | |||||
{ | |||||
InitializeComponent(); | |||||
this.DataContext = LogViewModel.GetInstance; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,255 @@ | |||||
<Window x:Class="FryPot_DosingSystem.View.MainWindow" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
xmlns:control="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource" | |||||
Title="MainWindow" | |||||
Width="1300" | |||||
Height="800" | |||||
AllowsTransparency="True" | |||||
Background="{x:Null}" | |||||
Topmost="False" | |||||
WindowStartupLocation="CenterScreen" | |||||
WindowStyle="None" | |||||
mc:Ignorable="d"> | |||||
<Window.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||||
<ResourceDictionary> | |||||
<!--#region ListBox样式--> | |||||
<Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}"> | |||||
<Setter Property="OverridesDefaultStyle" Value="True" /> | |||||
<Setter Property="SnapsToDevicePixels" Value="True" /> | |||||
<Setter Property="BorderBrush" Value="{x:Null}" /> | |||||
<Setter Property="Foreground" Value="White" /> | |||||
<Setter Property="FontSize" Value="20" /> | |||||
<Setter Property="HorizontalContentAlignment" Value="Center" /> | |||||
<Setter Property="VerticalContentAlignment" Value="Center" /> | |||||
<Setter Property="Template"> | |||||
<Setter.Value> | |||||
<ControlTemplate TargetType="{x:Type ListBoxItem}"> | |||||
<Border x:Name="border" CornerRadius="8"> | |||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> | |||||
</Border> | |||||
</ControlTemplate> | |||||
</Setter.Value> | |||||
</Setter> | |||||
</Style> | |||||
<!--#endregion--> | |||||
</ResourceDictionary> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</Window.Resources> | |||||
<Window.DataContext> | |||||
<vm:MainViewModel></vm:MainViewModel> | |||||
</Window.DataContext> | |||||
<Border x:Name="br" Style="{DynamicResource border主窗体背景}"> | |||||
<Grid x:Name="grid_main"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="60" /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<!-- 标题 --> | |||||
<Grid Grid.Row="0"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="300" /> | |||||
<ColumnDefinition /> | |||||
</Grid.ColumnDefinitions> | |||||
<Border | |||||
Grid.ColumnSpan="2" | |||||
Height="52" | |||||
VerticalAlignment="Top" | |||||
Style="{DynamicResource bordertop矩形}" /> | |||||
<Border Style="{DynamicResource bordertopL}" /> | |||||
<Image | |||||
Margin="20,0,0,0" | |||||
VerticalAlignment="Center" | |||||
Style="{DynamicResource imagetop_Title}" /> | |||||
<Grid Grid.Column="1"> | |||||
<ListBox | |||||
x:Name="lstEnt" | |||||
Background="{x:Null}" | |||||
BorderBrush="{x:Null}" | |||||
ScrollViewer.CanContentScroll="False" | |||||
ScrollViewer.HorizontalScrollBarVisibility="Hidden" | |||||
ScrollViewer.VerticalScrollBarVisibility="Disabled" | |||||
BorderThickness="0" | |||||
ItemContainerStyle="{StaticResource ResourceKey=ListBoxItemStyle1}" | |||||
ItemsSource="{Binding DisplayMenus}" Margin="0,0,293,0"> | |||||
<ListBox.ItemsPanel> | |||||
<ItemsPanelTemplate> | |||||
<StackPanel Orientation="Horizontal" /> | |||||
</ItemsPanelTemplate> | |||||
</ListBox.ItemsPanel> | |||||
<ListBox.ItemTemplate> | |||||
<DataTemplate> | |||||
<RadioButton | |||||
Command="{Binding DataContext.TogglePag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBox}}" | |||||
CommandParameter="{Binding CommandParameter}" | |||||
Content="{Binding MenuName}" | |||||
GroupName="all" | |||||
Style="{StaticResource MenuRadioButtonStyle}" /> | |||||
</DataTemplate> | |||||
</ListBox.ItemTemplate> | |||||
</ListBox> | |||||
</Grid> | |||||
<StackPanel | |||||
Grid.Column="4" | |||||
Height="50" | |||||
HorizontalAlignment="Right" | |||||
VerticalAlignment="Top" | |||||
Orientation="Horizontal"> | |||||
<Border Style="{DynamicResource border竖线}" /> | |||||
<Grid> | |||||
<ToggleButton | |||||
Name="tb" | |||||
Margin="5" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Cursor="Hand" | |||||
IsChecked="{Binding UserManagement}" | |||||
Style="{DynamicResource StatusBtnStyle网络连接状态}" | |||||
ToolTip="用户管理" /> | |||||
<!-- 当 StaysOpen 设置为 True 时 popup失去焦点的时候不会自动关闭 --> | |||||
<Popup | |||||
AllowsTransparency="True" | |||||
Focusable="False" | |||||
IsOpen="{Binding IsChecked, ElementName=tb}" | |||||
Placement="Bottom" | |||||
PlacementTarget="{Binding ElementName=tb}" | |||||
StaysOpen="False"> | |||||
<Border Background="#081424" ClipToBounds="True"> | |||||
<Grid Width="100" Margin="0"> | |||||
<StackPanel Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}"> | |||||
<Button | |||||
Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}" | |||||
Margin="0,5,0,1" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Command="{Binding PasswordChange}" | |||||
Content="密码修改" | |||||
Cursor="Hand" /> | |||||
<Button | |||||
Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}" | |||||
Margin="0,5,0,1" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Command="{Binding Login}" | |||||
Content="登录账号" | |||||
Cursor="Hand" /> | |||||
<Button | |||||
Width="{Binding RelativeSource={RelativeSource AncestorLevel=1, AncestorType=Grid}, Path=ActualWidth}" | |||||
Margin="0,5,0,1" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Command="{Binding ExitLogin}" | |||||
Content="退出登录" | |||||
Cursor="Hand" /> | |||||
</StackPanel> | |||||
</Grid> | |||||
</Border> | |||||
</Popup> | |||||
</Grid> | |||||
<Border Style="{DynamicResource border竖线}" /> | |||||
<ToggleButton | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Center" | |||||
Cursor="Hand" | |||||
DataContext="{Binding IsAlarm}" | |||||
Style="{DynamicResource StatusBtnStyle告警}" | |||||
ToolTip="告警消息" /> | |||||
<Border Style="{DynamicResource border竖线}" /> | |||||
<control:DateTimeUI Margin="10,0,10,0" VerticalAlignment="Center" /> | |||||
<Border Style="{DynamicResource border竖线}" /> | |||||
<Button | |||||
x:Name="ButClose" | |||||
Grid.Column="4" | |||||
Margin="10,0,20,0" | |||||
VerticalAlignment="Center" | |||||
Content="退出" | |||||
Cursor="Hand" | |||||
Style="{DynamicResource CommonBtn_返回}" | |||||
ToolTip="退出程序" | |||||
/> | |||||
</StackPanel> | |||||
</Grid> | |||||
<!-- 底部窗体 --> | |||||
<Grid Grid.Row="1" Margin="10"> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="45" /> | |||||
<RowDefinition /> | |||||
</Grid.RowDefinitions> | |||||
<!-- 顶部装饰 --> | |||||
<Border | |||||
Grid.Row="0" | |||||
Grid.RowSpan="2" | |||||
Style="{DynamicResource border右下}" /> | |||||
<Border | |||||
Grid.Row="0" | |||||
Grid.RowSpan="2" | |||||
Style="{DynamicResource border左下}" /> | |||||
<Border | |||||
Grid.Row="0" | |||||
Grid.RowSpan="2" | |||||
Style="{DynamicResource border右上}" /> | |||||
<Border | |||||
Grid.Row="0" | |||||
Grid.RowSpan="2" | |||||
Style="{DynamicResource border左上}" /> | |||||
<Grid Margin="10"> | |||||
<Border Width="600" Style="{DynamicResource borderFromTitle}" /> | |||||
<StackPanel Orientation="Horizontal"> | |||||
<CheckBox | |||||
Margin="5,0,5,0" | |||||
Content="开机启动" | |||||
IsChecked="{Binding AutoStart}" /> | |||||
</StackPanel> | |||||
<TextBlock | |||||
x:Name="Title" | |||||
HorizontalAlignment="Center" | |||||
VerticalAlignment="Top" | |||||
FontSize="16" | |||||
Foreground="#feffff" | |||||
Text="{Binding WindowTitleName}" /> | |||||
</Grid> | |||||
<!--#region 底部窗体栏--> | |||||
<ContentControl | |||||
x:Name="contentRegion" | |||||
Grid.Row="1" | |||||
Content="{Binding MyWindow}" | |||||
/> | |||||
<!--#endregion--> | |||||
</Grid> | |||||
</Grid> | |||||
</Border> | |||||
</Window> |
@@ -0,0 +1,64 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Diagnostics; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// MainWindow.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class MainWindow : Window | |||||
{ | |||||
ScrollViewer scrollViewer; | |||||
double lastPointX; | |||||
double distance; | |||||
public MainWindow() | |||||
{ | |||||
InitializeComponent(); | |||||
Initialize(); | |||||
} | |||||
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) | |||||
{ | |||||
base.OnMouseLeftButtonDown(e); | |||||
// 获取鼠标相对控件位置 (grid_main为控件Name) | |||||
Point position = Mouse.GetPosition(grid_main); | |||||
// 如果鼠标位置在控件内,允许拖动 | |||||
if (e.LeftButton == MouseButtonState.Pressed) | |||||
{ | |||||
if (position.X >= 0 && position.X < grid_main.ActualWidth && position.Y >= 0 && position.Y < grid_main.ActualHeight) | |||||
{ | |||||
this.DragMove(); | |||||
} | |||||
} | |||||
} | |||||
private void Initialize() | |||||
{ | |||||
this.ButClose.Click += (obj, e) => | |||||
{ | |||||
MessageBoxResult res = MessageBox.Show("确定关闭上位机软件?", "警告", MessageBoxButton.OKCancel); | |||||
if (res == MessageBoxResult.OK) | |||||
{ | |||||
this.Close(); | |||||
} | |||||
}; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,113 @@ | |||||
<Window x:Class="FryPot_DosingSystem.View.NewRecipeView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
mc:Ignorable="d" | |||||
Title="NewRecipeView" Height="550" Width="800" | |||||
WindowStyle="None" WindowStartupLocation="CenterScreen" AllowsTransparency="True"> | |||||
<Window.DataContext> | |||||
<vm:NewRecipeViewModel></vm:NewRecipeViewModel> | |||||
</Window.DataContext> | |||||
<Window.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||||
<ResourceDictionary> | |||||
<!--#region ListBox样式--> | |||||
<Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}"> | |||||
<Setter Property="OverridesDefaultStyle" Value="True" /> | |||||
<Setter Property="SnapsToDevicePixels" Value="True" /> | |||||
<Setter Property="BorderBrush" Value="{x:Null}" /> | |||||
<Setter Property="Foreground" Value="White" /> | |||||
<Setter Property="FontSize" Value="20" /> | |||||
<Setter Property="HorizontalContentAlignment" Value="Center" /> | |||||
<Setter Property="VerticalContentAlignment" Value="Center" /> | |||||
<Setter Property="Template"> | |||||
<Setter.Value> | |||||
<ControlTemplate TargetType="{x:Type ListBoxItem}"> | |||||
<Border x:Name="border" CornerRadius="8"> | |||||
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> | |||||
</Border> | |||||
</ControlTemplate> | |||||
</Setter.Value> | |||||
</Setter> | |||||
</Style> | |||||
<!--#endregion--> | |||||
</ResourceDictionary> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</Window.Resources> | |||||
<Border Name="br"> | |||||
<Border.Background> | |||||
<ImageBrush ImageSource="/BPASmartClient.CustomResource;component/Image/bg.png"></ImageBrush> | |||||
</Border.Background> | |||||
<Grid > | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="50"></RowDefinition> | |||||
<RowDefinition Height="60"></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="配方信息" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Aqua" FontSize="25" Margin="0,10"></TextBlock> | |||||
<UniformGrid Grid.Row="1" Columns="2"> | |||||
<StackPanel Orientation="Horizontal"> | |||||
<TextBlock Text="请输入配方名称:" Foreground="Aqua" FontSize="18" Margin="10,0,5,0" VerticalAlignment="Center"></TextBlock> | |||||
<TextBox Text="{Binding RecipeName}" Width="230" Height="30" BorderThickness="1" BorderBrush="Aqua" VerticalAlignment="Center" FontSize="16" ></TextBox> | |||||
</StackPanel> | |||||
<StackPanel Orientation="Horizontal"> | |||||
<Button Content="添加原料" Width="150" Margin="10" Height="30" Cursor="Hand" Command="{Binding AddRecipe}" ></Button> | |||||
<Button Content="确认" Height="30" Width="100" Margin="5,10" Command="{Binding Comfirm}"></Button> | |||||
<Button Click="Button_Click" Content="取消" Height="30" FontSize="20" Width="100" Margin="8,10" Cursor="Hand"></Button> | |||||
</StackPanel> | |||||
</UniformGrid> | |||||
<ScrollViewer Grid.Row="2"> | |||||
<ItemsControl ItemsSource="{Binding materials}"> | |||||
<ItemsControl.ItemsPanel> | |||||
<ItemsPanelTemplate> | |||||
<StackPanel></StackPanel> | |||||
</ItemsPanelTemplate> | |||||
</ItemsControl.ItemsPanel> | |||||
<ItemsControl.ItemTemplate> | |||||
<DataTemplate> | |||||
<RadioButton> | |||||
<RadioButton.Template> | |||||
<ControlTemplate> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="210"/> | |||||
<ColumnDefinition Width="210"></ColumnDefinition> | |||||
<ColumnDefinition Width="225"></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<ComboBox ItemsSource="{Binding DataContext.materialNames,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" Text="{Binding MaterialName}" Margin="10,0,0,10" Width="190"></ComboBox> | |||||
<StackPanel Grid.Column="1" Orientation="Horizontal" > | |||||
<TextBox Text="{Binding MaterialLoc}" Width="170" Margin="35,0,0,10" ></TextBox> | |||||
</StackPanel> | |||||
<StackPanel Orientation="Horizontal" Grid.Column="2"> | |||||
<TextBox Text="{Binding MaterialWeight}" Width="170" Margin="35,0,0,10" ></TextBox> | |||||
<TextBlock VerticalAlignment="Center" Margin="4,0,0,10" Text="g" ></TextBlock> | |||||
</StackPanel> | |||||
<Button Grid.Column="3" | |||||
Content="删除" | |||||
Width="94" | |||||
Margin="0,0,0,10" | |||||
HorizontalAlignment="Right" | |||||
Command="{Binding DataContext.RemoveRecipe,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" | |||||
CommandParameter="{Binding MaterialCode}"></Button> | |||||
</Grid> | |||||
</ControlTemplate> | |||||
</RadioButton.Template> | |||||
</RadioButton> | |||||
</DataTemplate> | |||||
</ItemsControl.ItemTemplate> | |||||
</ItemsControl> | |||||
</ScrollViewer> | |||||
</Grid> | |||||
</Border> | |||||
</Window> |
@@ -0,0 +1,36 @@ | |||||
using BPASmartClient.Helper; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// NewRecipeView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class NewRecipeView : Window | |||||
{ | |||||
public NewRecipeView() | |||||
{ | |||||
InitializeComponent(); | |||||
this.br.MouseLeftButtonDown += (o, e) => { if (e.LeftButton == MouseButtonState.Pressed) this.DragMove(); }; | |||||
ActionManage.GetInstance.CancelRegister("CloseNewRecipeView"); | |||||
ActionManage.GetInstance.Register(new Action(() => { this.Close(); }), "CloseNewRecipeView"); | |||||
} | |||||
private void Button_Click(object sender, RoutedEventArgs e) | |||||
{ | |||||
this.Close(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,82 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.RecipeSendDownView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:pry="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<UserControl.DataContext> | |||||
<vm:RecipeSetDownViewModel/> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<ResourceDictionary> | |||||
<ResourceDictionary.MergedDictionaries> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/GenricStyle.xaml" /> | |||||
<ResourceDictionary Source="/BPASmartClient.CustomResource;component/Themes/MyStyle.xaml" /> | |||||
</ResourceDictionary.MergedDictionaries> | |||||
</ResourceDictionary> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="50"/> | |||||
<RowDefinition/> | |||||
</Grid.RowDefinitions> | |||||
<Button HorizontalAlignment="Right" VerticalAlignment="Center" Content="配方一键下发" Width="110" Height="30" Margin="0,0,10,0" Cursor="Hand" Command="{Binding AllRecipeSetDownCommand}"></Button> | |||||
<ScrollViewer Grid.Row="1" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"> | |||||
<ItemsControl ItemsSource="{Binding Recipes}"> | |||||
<ItemsControl.ItemsPanel> | |||||
<ItemsPanelTemplate> | |||||
<StackPanel></StackPanel> | |||||
</ItemsPanelTemplate> | |||||
</ItemsControl.ItemsPanel> | |||||
<ItemsControl.ItemTemplate> | |||||
<DataTemplate> | |||||
<Border BorderBrush="Aqua" BorderThickness="2" CornerRadius="14" Height="120" Margin="5,5"> | |||||
<RadioButton> | |||||
<RadioButton.Template> | |||||
<ControlTemplate> | |||||
<Grid> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="*"></ColumnDefinition> | |||||
<ColumnDefinition Width="0.01*"></ColumnDefinition> | |||||
<ColumnDefinition Width="4*"></ColumnDefinition> | |||||
<ColumnDefinition Width="1.2*"/> | |||||
</Grid.ColumnDefinitions> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="70"></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<TextBlock Text="{Binding RecipeName}" FontSize="35" HorizontalAlignment="Center"></TextBlock> | |||||
<Button Grid.Row="1" Width="100" Content="配方下发" Command="{Binding DataContext.RecipeSetDownCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" | |||||
CommandParameter="{Binding RecipeId}" Cursor="Hand"></Button> | |||||
</Grid> | |||||
<Line StrokeThickness="3" Grid.Column="1" HorizontalAlignment="Left" Stroke="LawnGreen" X1="0" Y1="5" X2="0" Y2="110"></Line> | |||||
<Grid Grid.Column="2"> | |||||
<!--后续添加内容--> | |||||
</Grid> | |||||
<Grid Grid.Column="3"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition Width="3"/> | |||||
<ColumnDefinition/> | |||||
</Grid.ColumnDefinitions> | |||||
<Line StrokeThickness="3" Grid.Column="0" HorizontalAlignment="Left" Stroke="LawnGreen" X1="0" Y1="5" X2="0" Y2="110"></Line> | |||||
<TextBlock Grid.Column="1" FontSize="16" Text="{Binding RecipeSetInfo}" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> | |||||
<!--后续添加内容--> | |||||
</Grid> | |||||
</Grid> | |||||
</ControlTemplate> | |||||
</RadioButton.Template> | |||||
</RadioButton> | |||||
</Border> | |||||
</DataTemplate> | |||||
</ItemsControl.ItemTemplate> | |||||
</ItemsControl> | |||||
</ScrollViewer> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,28 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// RecipeSendDownView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class RecipeSendDownView : UserControl | |||||
{ | |||||
public RecipeSendDownView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,127 @@ | |||||
<UserControl x:Class="FryPot_DosingSystem.View.RecipeSetView" | |||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | |||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | |||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | |||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | |||||
xmlns:local="clr-namespace:FryPot_DosingSystem.View" | |||||
xmlns:pry="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource" | |||||
xmlns:vm="clr-namespace:FryPot_DosingSystem.ViewModel" | |||||
mc:Ignorable="d" | |||||
d:DesignHeight="450" d:DesignWidth="800"> | |||||
<UserControl.DataContext> | |||||
<vm:RecipeSetViewModel></vm:RecipeSetViewModel> | |||||
</UserControl.DataContext> | |||||
<UserControl.Resources> | |||||
<SolidColorBrush x:Key="BorderSolid" Color="#5523CACA" /> | |||||
<SolidColorBrush x:Key="FontColor" Color="#FF2AB2E7" /> | |||||
<SolidColorBrush x:Key="TitleFontColor" Color="#ddd" /> | |||||
<SolidColorBrush x:Key="CursorColor" Color="Aqua" /> | |||||
<SolidColorBrush x:Key="TitleBorderColor" Color="#FF2AB2E7" /> | |||||
<SolidColorBrush x:Key="TextBlockForeground" Color="#9934F7F7" /> | |||||
<Style x:Key="TextBlockStyle" TargetType="TextBlock"> | |||||
<Setter Property="FontFamily" Value="楷体" /> | |||||
<Setter Property="FontSize" Value="16" /> | |||||
<Setter Property="Background" Value="Transparent" /> | |||||
<!--<Setter Property="Foreground" Value="{StaticResource FontColor}" />--> | |||||
<Setter Property="VerticalAlignment" Value="Center" /> | |||||
<Setter Property="HorizontalAlignment" Value="Center" /> | |||||
</Style> | |||||
<Style x:Key="buttonStyle" TargetType="Button"> | |||||
<Setter Property="Background" Value="Transparent" /> | |||||
<Setter Property="FontSize" Value="16" /> | |||||
<Setter Property="Foreground" Value="Aqua" /> | |||||
<Setter Property="HorizontalAlignment" Value="Center" /> | |||||
<Setter Property="BorderThickness" Value="0" /> | |||||
<Style.Triggers> | |||||
<Trigger Property="IsMouseOver" Value="True"> | |||||
<Setter Property="Cursor" Value="Hand"></Setter> | |||||
</Trigger> | |||||
</Style.Triggers> | |||||
</Style> | |||||
</UserControl.Resources> | |||||
<Grid> | |||||
<Grid.RowDefinitions> | |||||
<RowDefinition Height="50"></RowDefinition> | |||||
<RowDefinition Height="auto"></RowDefinition> | |||||
<RowDefinition></RowDefinition> | |||||
</Grid.RowDefinitions> | |||||
<UniformGrid Columns="2"> | |||||
<Image Source="../hbl.ico" HorizontalAlignment="Left"></Image> | |||||
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Grid.Column="2"> | |||||
<pry:IcoButton Content="新建配方" | |||||
Margin="80,5,15,5" | |||||
Width="150" | |||||
FontSize="16" | |||||
Foreground="Aqua" | |||||
IcoText="" | |||||
Cursor="Hand" | |||||
Style="{StaticResource NewButtonStyle}" | |||||
Command="{Binding NewRecipe}"> | |||||
</pry:IcoButton> | |||||
<pry:IcoButton | |||||
Content="保存配方" Margin="0,5" | |||||
Width="150" | |||||
FontSize="16" | |||||
Foreground="Aqua" | |||||
IcoText="" | |||||
Cursor="Hand" | |||||
Style="{StaticResource NewButtonStyle}" | |||||
Command="{Binding SaveRecipe}"> | |||||
</pry:IcoButton> | |||||
</StackPanel> | |||||
</UniformGrid> | |||||
<TextBlock Grid.Row="1" Text="配方信息" Foreground="Aquamarine" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="18" Margin="0,5" ></TextBlock> | |||||
<ScrollViewer Grid.Row="2" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden"> | |||||
<ItemsControl ItemsSource="{Binding recipeModels}"> | |||||
<ItemsControl.ItemsPanel> | |||||
<ItemsPanelTemplate> | |||||
<StackPanel></StackPanel> | |||||
</ItemsPanelTemplate> | |||||
</ItemsControl.ItemsPanel> | |||||
<ItemsControl.ItemTemplate> | |||||
<DataTemplate> | |||||
<RadioButton> | |||||
<RadioButton.Template> | |||||
<ControlTemplate> | |||||
<Grid x:Name="gr"> | |||||
<Grid.ColumnDefinitions> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
<ColumnDefinition></ColumnDefinition> | |||||
</Grid.ColumnDefinitions> | |||||
<TextBlock Text="{Binding RecipeId}" Grid.Column="0" FontSize="16" HorizontalAlignment="Left" VerticalAlignment="Center" | |||||
Foreground="Aqua" | |||||
Margin="5,0,0,5"></TextBlock> | |||||
<TextBlock Text="{Binding RecipeName}" Grid.Column="1" Margin="5,0,0,5" | |||||
HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Aqua" FontSize="16"></TextBlock> | |||||
<Grid Grid.Column="3"> | |||||
<Button FontSize="16" | |||||
Margin="5,0,0,5" Content="编辑配方" Style="{StaticResource buttonStyle}" Command="{Binding DataContext.EditRecipeCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" | |||||
CommandParameter="{Binding RecipeId}"></Button> | |||||
</Grid> | |||||
<Grid Grid.Column="4"> | |||||
<Button Margin="5,0,0,5" FontSize="16" Content="删除配方" Style="{StaticResource buttonStyle}" Command="{Binding DataContext.DeleteRecipeCommand,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=ItemsControl}}" CommandParameter="{Binding RecipeId}"> | |||||
</Button> | |||||
</Grid> | |||||
</Grid> | |||||
<ControlTemplate.Triggers> | |||||
<Trigger Property="IsMouseOver" Value="true"> | |||||
<Setter TargetName="gr" Property="Background" Value="#3300ccff" /> | |||||
</Trigger> | |||||
</ControlTemplate.Triggers> | |||||
</ControlTemplate> | |||||
</RadioButton.Template> | |||||
</RadioButton> | |||||
</DataTemplate> | |||||
</ItemsControl.ItemTemplate> | |||||
</ItemsControl> | |||||
</ScrollViewer> | |||||
</Grid> | |||||
</UserControl> |
@@ -0,0 +1,30 @@ | |||||
using FryPot_DosingSystem.ViewModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Controls; | |||||
using System.Windows.Data; | |||||
using System.Windows.Documents; | |||||
using System.Windows.Input; | |||||
using System.Windows.Media; | |||||
using System.Windows.Media.Imaging; | |||||
using System.Windows.Navigation; | |||||
using System.Windows.Shapes; | |||||
namespace FryPot_DosingSystem.View | |||||
{ | |||||
/// <summary> | |||||
/// RecipeSetView.xaml 的交互逻辑 | |||||
/// </summary> | |||||
public partial class RecipeSetView : UserControl | |||||
{ | |||||
public RecipeSetView() | |||||
{ | |||||
InitializeComponent(); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,172 @@ | |||||
using BPA.Message; | |||||
using BPASmartClient.Helper; | |||||
using FryPot_DosingSystem.Model; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using Newtonsoft.Json; | |||||
using System; | |||||
using System.Collections.ObjectModel; | |||||
using System.IO; | |||||
using System.Windows; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
public class AdministratorLoginViewModel : ObservableObject | |||||
{ | |||||
/// <summary> | |||||
/// 按钮内容修改:注册/修改 | |||||
/// </summary> | |||||
private string _registOrChange; | |||||
public string RegistOrChange { get { return _registOrChange; } set { _registOrChange = value; OnPropertyChanged(); } } | |||||
public string Admin { get { return _admin; } set { _admin = value; OnPropertyChanged(); } } | |||||
private string _admin; | |||||
public string Password { get { return _password; } set { _password = value; OnPropertyChanged(); } } | |||||
private string _password; | |||||
public string ErrorMessage { get { return _errorMessage; } set { _errorMessage = value; OnPropertyChanged(); } } | |||||
private string _errorMessage; | |||||
public string SelectText { get { return _mSelectText; } set { _mSelectText = value; OnPropertyChanged(); } } | |||||
private string _mSelectText; | |||||
private UserInfo _userInfo; | |||||
public UserInfo UserInfo { get { return _userInfo; }set { _userInfo = value;OnPropertyChanged(); } } | |||||
private string _account; | |||||
public string Account { get { return _account; } set { _account = value;OnPropertyChanged(); } } | |||||
private string _txtpassword; | |||||
public string Txtpassword { get { return _txtpassword; } set { _txtpassword = value; OnPropertyChanged(); } } | |||||
public RelayCommand AdminLoginCommand { get; set; } | |||||
public RelayCommand RegistCommand { get; set; } | |||||
public ObservableCollection<string> permission { get; set; } = new ObservableCollection<string>(); | |||||
public AdministratorLoginViewModel() | |||||
{ | |||||
permission.Add("管理员"); | |||||
permission.Add("操作员"); | |||||
permission.Add("观察员"); | |||||
permission.Add("技术员"); | |||||
SelectText = permission[0]; | |||||
var content = ActionManage.GetInstance.SendResult("ContentUpdate"); | |||||
if (content != null && content is string strContent) | |||||
{ | |||||
RegistOrChange = strContent; | |||||
} | |||||
var loginInfo = ActionManage.GetInstance.SendResult("LoginInfo"); | |||||
if (loginInfo != null && loginInfo is UserInfo LoginInfo) | |||||
{ | |||||
UserInfo = LoginInfo; | |||||
if (UserInfo != null) | |||||
{ | |||||
switch (UserInfo.Authority) | |||||
{ | |||||
case Authority.管理员: SelectText = permission[0]; break; | |||||
case Authority.操作员: SelectText = permission[1]; break; | |||||
case Authority.观察员: SelectText = permission[2]; break; | |||||
case Authority.技术员: SelectText = permission[3]; break; | |||||
} | |||||
Account = UserInfo.UserName; | |||||
Txtpassword = UserInfo.Password; | |||||
} | |||||
} | |||||
RegistCommand = new RelayCommand(() => | |||||
{ | |||||
if (RegistOrChange != null) | |||||
{ | |||||
if (RegistOrChange == "注册") | |||||
{ | |||||
if (Admin == null || Admin == string.Empty || Password == null || Password == string.Empty) | |||||
{ | |||||
ErrorMessage = "注册信息不能为空!!!"; | |||||
} | |||||
else | |||||
{ | |||||
ep: | |||||
string guid=Guid.NewGuid().ToString();//用户唯一ID | |||||
var resultManage = JsonConvert.DeserializeObject<UserManage>(File.ReadAllText("LoginUp.hbl").AESDecrypt()); | |||||
if (resultManage != null && resultManage is UserManage manage) | |||||
{ | |||||
int a= manage.userInfos.FindIndex(p => p.UserId == guid); | |||||
if (a == -1) | |||||
{ | |||||
switch (SelectText) | |||||
{ | |||||
case "管理员": Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.管理员, UserName = Admin, Password = Password,UserId=guid }); break; | |||||
case "技术员": Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.技术员, UserName = Admin, Password = Password,UserId = guid }); break; | |||||
case "操作员": Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.操作员, UserName = Admin, Password = Password, UserId = guid }); break; | |||||
case "观察员": Global.userManager.userInfos.Add(new UserInfo() { Authority = Authority.观察员, UserName = Admin, Password = Password, UserId = guid }); break; | |||||
} | |||||
File.WriteAllText("LoginUp.hbl", JsonConvert.SerializeObject(Global.userManager).AESEncrypt()); | |||||
var result = JsonConvert.DeserializeObject<UserManage>(File.ReadAllText("LoginUp.hbl").AESDecrypt()); | |||||
Global.userManager = result; | |||||
ErrorMessage = "注册成功"; | |||||
} | |||||
else | |||||
{ | |||||
goto ep; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
if (RegistOrChange == "修改") | |||||
{ | |||||
//执行密码修改操作 | |||||
try | |||||
{ | |||||
if (UserInfo != null) | |||||
{ | |||||
UserInfo info = Global.userManager.userInfos.Find(p => p.UserId == UserInfo.UserId); | |||||
if (info != null) | |||||
{ | |||||
switch (SelectText) | |||||
{ | |||||
case "管理员": info.Authority = Authority.管理员; info.UserName = Admin; info.Password = Password; break; | |||||
case "技术员": info.Authority = Authority.技术员; info.UserName = Admin; info.Password = Password; break; | |||||
case "操作员": info.Authority = Authority.操作员; info.UserName = Admin; info.Password = Password; break; | |||||
case "观察员": info.Authority = Authority.观察员; info.UserName = Admin; info.Password = Password; break; | |||||
} | |||||
File.WriteAllText("LoginUp.hbl", JsonConvert.SerializeObject(Global.userManager).AESEncrypt()); | |||||
var result = JsonConvert.DeserializeObject<UserManage>(File.ReadAllText("LoginUp.hbl").AESDecrypt()); | |||||
Global.userManager = result; | |||||
ErrorMessage = "修改成功"; | |||||
} | |||||
else | |||||
{ | |||||
ErrorMessage = "修改失败"; | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
ErrorMessage = "修改失败"; | |||||
} | |||||
} | |||||
catch (Exception) | |||||
{ | |||||
ErrorMessage = "修改失败"; | |||||
} | |||||
} | |||||
} | |||||
}); | |||||
AdminLoginCommand = new RelayCommand(() => | |||||
{ | |||||
var rest = ActionManage.GetInstance.SendResult("LoginDosingSystem", $"{Admin}-={Password}-={SelectText}"); | |||||
if (rest != null && rest is string str) | |||||
{ | |||||
Account = String.Empty; | |||||
Txtpassword = String.Empty; | |||||
ErrorMessage = str; | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,13 @@ | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class AdministratorPasswordChangeViewModel | |||||
{ | |||||
} | |||||
} |
@@ -0,0 +1,61 @@ | |||||
using BPASmartClient.Helper; | |||||
using FryPot_DosingSystem.Model; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class DeviceListViewModel : ObservableObject | |||||
{ | |||||
public ObservableCollection<string> DeviceName { get; set; } = new ObservableCollection<string>(); | |||||
public ObservableCollection<DeviceInfo> devices { get; set; } = new ObservableCollection<DeviceInfo>(); | |||||
public RelayCommand AddDeviceCommand { get; set; } | |||||
public RelayCommand SaveDeviceConfig { get; set; } | |||||
public RelayCommand<string> DeleteDevice { get; set; } | |||||
public DeviceListViewModel() | |||||
{ | |||||
Json<DeviceManage>.Read(); | |||||
devices = Json<DeviceManage>.Data.Devices; | |||||
DeviceName.Add("滚筒输送线"); | |||||
DeviceName.Add("炒锅1"); | |||||
DeviceName.Add("炒锅2"); | |||||
DeviceName.Add("炒锅3"); | |||||
DeviceName.Add("炒锅4"); | |||||
DeviceName.Add("炒锅5"); | |||||
AddDeviceCommand = new RelayCommand(() => | |||||
{ | |||||
erp: | |||||
string guid = Guid.NewGuid().ToString(); | |||||
DeviceInfo info = devices.FirstOrDefault(p => p.DeviceNum == guid); | |||||
if (info == null) | |||||
{ | |||||
devices.Add(new DeviceInfo() { DeviceNum = guid }); | |||||
} | |||||
else | |||||
{ | |||||
goto erp; | |||||
} | |||||
}); | |||||
DeleteDevice = new RelayCommand<string>((str) => | |||||
{ | |||||
DeviceInfo device = devices.FirstOrDefault(p => p.DeviceNum == str); | |||||
if (device != null) | |||||
{ | |||||
devices.Remove(device); | |||||
} | |||||
}); | |||||
SaveDeviceConfig = new RelayCommand(() => | |||||
{ | |||||
Json<DeviceManage>.Data.Devices = devices; | |||||
Json<DeviceManage>.Save(); | |||||
}); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,76 @@ | |||||
using BPASmartClient.Message; | |||||
using FryPot_DosingSystem.Model; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows.Media; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class LogViewModel:ObservableObject | |||||
{ | |||||
public static LogViewModel _instance; | |||||
public static LogViewModel GetInstance=>_instance?? (_instance = new LogViewModel()); | |||||
private string _logTime; | |||||
public string LogTime { get { return _logTime; } set { _logTime = value; OnPropertyChanged(); } } | |||||
private string _logType; | |||||
public string LogType { get { return _logType; } set { _logType = value; OnPropertyChanged(); } } | |||||
private string _logMessage; | |||||
public string LogMessage { get { return _logMessage; } set { _logMessage = value; OnPropertyChanged(); } } | |||||
private Brush _foreColor; | |||||
public Brush ForeColor { get { return _foreColor; } set { _foreColor = value; OnPropertyChanged(); } } | |||||
public ObservableCollection<LogModel> LogDatas { get; set; } = new ObservableCollection<LogModel>(); | |||||
public LogViewModel() | |||||
{ | |||||
Inite(); | |||||
} | |||||
public void Inite() | |||||
{ | |||||
//一般日志 MessageLog.GetInstance.Show(""); | |||||
MessageLog.GetInstance.InfoNotify = new Action<string>((s) => | |||||
{ | |||||
System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => | |||||
{ | |||||
LogModel logModel = new LogModel { LogMessage= s, LogType = "一般日志" }; | |||||
LogDatas.Add(logModel); | |||||
})); | |||||
}); | |||||
//设备日志 MessageLog.GetInstance.DeviceProcessLogShow(id,message) | |||||
MessageLog.GetInstance.DeviceProcessLogNotify = new Action<string, string>((id, s) => | |||||
{ | |||||
System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => | |||||
{ | |||||
LogModel logModel = new LogModel { LogMessage = s, LogType = "设备日志" }; | |||||
LogDatas.Add(logModel); | |||||
})); | |||||
}); | |||||
//设备告警日志 MessageLog.GetInstance.AddDeviceAlarmLogShow(id,message) | |||||
MessageLog.GetInstance.DeviceAlarmLogNotify = new Action<string, string>((id, s) => | |||||
{ | |||||
System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => | |||||
{ | |||||
LogModel logModel = new LogModel { LogMessage = id, LogType = "报警日志" }; | |||||
LogDatas.Add(logModel); | |||||
})); | |||||
}); | |||||
//错误日志MessageLog.GetInstance.ShowEx(message) | |||||
MessageLog.GetInstance.ExInfoNotify = new Action<string>((s) => | |||||
{ | |||||
System.Windows.Application.Current?.Dispatcher.Invoke((Action)(() => | |||||
{ | |||||
LogModel logModel = new LogModel { LogMessage = s, LogType = "错误日志" }; | |||||
LogDatas.Add(logModel); | |||||
})); | |||||
}); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,151 @@ | |||||
| |||||
using BPASmartClient.Helper; | |||||
using FryPot_DosingSystem.Control; | |||||
using FryPot_DosingSystem.Model; | |||||
using FryPot_DosingSystem.View; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Reflection; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
using System.Windows; | |||||
using System.Windows.Forms; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class MainViewModel : ObservableObject | |||||
{ | |||||
public ObservableCollection<ActionMenu> menus { get; set; } = new ObservableCollection<ActionMenu>(); | |||||
public RelayCommand Login { get; set; } | |||||
public RelayCommand PasswordChange { get; set; } | |||||
public RelayCommand ExitLogin { get; set; } | |||||
public RelayCommand<object> TogglePag { get; set; } | |||||
public bool UserManagement { get { return _mUserManagement; } set { _mUserManagement = value; OnPropertyChanged(); } } | |||||
private bool _mUserManagement; | |||||
/// <summary> | |||||
/// 当前登陆信息 | |||||
/// </summary> | |||||
private UserInfo _currentLoginAccount; | |||||
public UserInfo CurrentLoginAccount { get { return _currentLoginAccount; } set { _currentLoginAccount = value;OnPropertyChanged(); } } | |||||
/// <summary> | |||||
/// 不同权限显示不同菜单 | |||||
/// </summary> | |||||
public ObservableCollection<ActionMenu> DisplayMenus { get; set; } = new ObservableCollection<ActionMenu>(); | |||||
public FrameworkElement MyWindow { get { return _mMyWindow; } set { _mMyWindow = value; OnPropertyChanged(); } } | |||||
private FrameworkElement _mMyWindow; | |||||
public string WindowTitleName { get { return _mWindowTitleName; } set { _mWindowTitleName = value; OnPropertyChanged(); } } | |||||
private string _mWindowTitleName; | |||||
/// <summary> | |||||
/// 开机自启 | |||||
/// </summary> | |||||
public bool AutoStart { get { return SystemHelper.GetInstance.IsAutoStart(); } set { SystemHelper.GetInstance.AutoStart(value); OnPropertyChanged(); } } | |||||
private Authority authority; | |||||
public Authority Authority | |||||
{ | |||||
get { return authority; } | |||||
set | |||||
{ | |||||
var res = menus.Where(p => Array.FindIndex(p.Authority, au => au == value) >= 0).ToList(); | |||||
if (res != null && res.Count > 0) | |||||
{ | |||||
DisplayMenus.Clear(); | |||||
res.ForEach(p => DisplayMenus.Add(p)); | |||||
DoNavChanged(res[0].CommandParameter); | |||||
} | |||||
authority = value; | |||||
} | |||||
} | |||||
public MainViewModel() | |||||
{ | |||||
LogViewModel model= LogViewModel.GetInstance; | |||||
DeviceOperate deviceOperate=DeviceOperate.GetInstance;//开启实时PLC数据读取 | |||||
DosingLogicControl logigControl = DosingLogicControl.GetInstance;//开启逻辑控制任务程序 | |||||
TogglePag = new RelayCommand<object>(DoNavChanged); | |||||
Login = new RelayCommand(() => | |||||
{ | |||||
ActionManage.GetInstance.CancelRegister("ContentUpdate"); | |||||
ActionManage.GetInstance.Register(new Func<object>(() => { return "注册"; }), "ContentUpdate"); | |||||
DoNavChanged("AdministratorLoginView.用户登陆"); | |||||
UserManagement = false; | |||||
}); | |||||
PasswordChange = new RelayCommand(() => | |||||
{ | |||||
ActionManage.GetInstance.CancelRegister("ContentUpdate"); | |||||
ActionManage.GetInstance.Register(new Func<object>(() => { return "修改"; }), "ContentUpdate"); | |||||
ActionManage.GetInstance.CancelRegister("LoginInfo"); | |||||
ActionManage.GetInstance.Register(new Func<object>(() => { return CurrentLoginAccount; }), "LoginInfo"); | |||||
DoNavChanged("AdministratorLoginView.密码修改"); | |||||
UserManagement = false; | |||||
}); | |||||
ExitLogin = new RelayCommand(() => | |||||
{ | |||||
//DoNavChanged("LoginView.退出登录"); | |||||
CurrentLoginAccount = null; | |||||
Authority = Authority.观察员; | |||||
UserManagement = false; | |||||
}); | |||||
LoginInfoConfig.GetInstance.Init();//用户数据初始化 | |||||
LoginRegister(); | |||||
MenusDefaultInit(); | |||||
Authority = Authority.管理员; | |||||
} | |||||
private void MenusDefaultInit() | |||||
{ | |||||
menus.Add(new ActionMenu() { MenuName = "配方设置", CommandParameter = "RecipeSetView.配方设置", Authority = new Authority[] { Authority.管理员, Authority.技术员 } }); | |||||
menus.Add(new ActionMenu() { MenuName = "配方下发", CommandParameter = "RecipeSendDownView.配方下发", Authority = new Authority[] { Authority.管理员, Authority.技术员, Authority.操作员 } }); | |||||
menus.Add(new ActionMenu() { MenuName = "设备列表", CommandParameter = "DeviceListVIew.设备列表", Authority = new Authority[] { Authority.管理员, Authority.技术员, Authority.操作员, Authority.观察员 } }); | |||||
menus.Add(new ActionMenu() { MenuName = "状态监测", CommandParameter = "HardWareStatusView.状态监测", Authority = new Authority[] { Authority.管理员, Authority.技术员, Authority.操作员, Authority.观察员 } }); | |||||
menus.Add(new ActionMenu() { MenuName = "日志信息", CommandParameter = "LogView.日志信息", Authority = new Authority[] { Authority.管理员, Authority.技术员, Authority.操作员, Authority.观察员 } }); | |||||
menus.Add(new ActionMenu() { MenuName = "报警记录", CommandParameter = "", Authority = new Authority[] { Authority.管理员, Authority.技术员, Authority.操作员, Authority.观察员 } }); | |||||
} | |||||
public void DoNavChanged(object obj) | |||||
{ | |||||
if (obj != null && obj is string stobj) | |||||
{ | |||||
var strs = stobj.Split('.'); | |||||
if (strs != null && strs.Length == 2) | |||||
{ | |||||
Type type = Type.GetType($"FryPot_DosingSystem.View.{strs[0]}"); | |||||
var res = type?.GetConstructor(System.Type.EmptyTypes)?.Invoke(null); | |||||
if (res != null && res is FrameworkElement fe) MyWindow = fe; | |||||
WindowTitleName = strs[1]; | |||||
} | |||||
} | |||||
} | |||||
/// <summary> | |||||
/// 登陆验证 | |||||
/// </summary> | |||||
private void LoginRegister() | |||||
{ | |||||
ActionManage.GetInstance.Register(new Func<object, object>((o) => | |||||
{ | |||||
if (o != null && o is string str) | |||||
{ | |||||
var strs = str.Split("-="); | |||||
if (strs != null && strs.Length == 3) | |||||
{ | |||||
var us = Global.userManager.userInfos.FirstOrDefault(p => p.UserName == strs[0] && p.Password == strs[1]&& strs[2] == p.Authority.ToString()); | |||||
if (us != null) | |||||
{ | |||||
Authority = us.Authority; | |||||
CurrentLoginAccount = us;//记录当前登陆信息 | |||||
return string.Empty; | |||||
} | |||||
} | |||||
} | |||||
return "用户名或密码错误"; | |||||
}), "LoginDosingSystem"); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,98 @@ | |||||
using BPASmartClient.Helper; | |||||
using FryPot_DosingSystem.Model; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class NewRecipeViewModel : ObservableObject | |||||
{ | |||||
/// <summary> | |||||
/// 配方唯一编码,用于编辑配方 | |||||
/// </summary> | |||||
public string recipeId { get; set; } | |||||
/// <summary> | |||||
/// 配料名称 | |||||
/// </summary> | |||||
private string _recipeName; | |||||
public string RecipeName { get { return _recipeName; } set { _recipeName = value; OnPropertyChanged(); } } | |||||
public ObservableCollection<MaterialType> materials { get; set; } = new ObservableCollection<MaterialType>(); | |||||
public ObservableCollection<string> materialNames { get; set; } = new ObservableCollection<string>() { "肉","葱","蒜"}; | |||||
public RelayCommand AddRecipe { get; set; } | |||||
public RelayCommand<string> RemoveRecipe { get; set; } | |||||
public RelayCommand Comfirm { get; set; } | |||||
public NewRecipeViewModel() | |||||
{ | |||||
ActionManage.GetInstance.Register(new Action<object>(Id => { | |||||
if (Id != null && Id is string strId) | |||||
{ | |||||
var res = Json<RecipeManage>.Data.Recipes.FirstOrDefault(p => p.RecipeId == strId); | |||||
if (res != null && res is NewRecipeModel rom) | |||||
{ | |||||
RecipeName = rom.RecipeName; | |||||
foreach (var item in rom.materialCollection) | |||||
{ | |||||
materials.Add(item); | |||||
} | |||||
recipeId = strId; | |||||
} | |||||
} | |||||
}),"EditRecipe"); | |||||
AddRecipe = new RelayCommand(() => | |||||
{ | |||||
pr: | |||||
string materialCode = Guid.NewGuid().ToString();//原料唯一ID ,后期需要根据实际要求更改 | |||||
var res = materials.FirstOrDefault(p => p.MaterialCode == materialCode); | |||||
if (res == null) | |||||
{ | |||||
materials.Add(new MaterialType() { MaterialCode = materialCode }); | |||||
} | |||||
else | |||||
{ | |||||
goto pr; | |||||
} | |||||
}); | |||||
RemoveRecipe = new RelayCommand<string>(code => | |||||
{ | |||||
var res = materials.FirstOrDefault(m => m.MaterialCode == code); | |||||
if (res != null) | |||||
materials.Remove(res); | |||||
}); | |||||
Comfirm = new RelayCommand(() => | |||||
{ | |||||
var bom = Json<RecipeManage>.Data.Recipes.FirstOrDefault(p => p.RecipeId == recipeId); | |||||
if (bom == null)//新配方 | |||||
{ | |||||
prop: string recipeID = Guid.NewGuid().ToString();//配方唯一ID,后期根据实际要求更改 | |||||
var res = Json<RecipeManage>.Data.Recipes.FirstOrDefault(p => p.RecipeId == recipeID); | |||||
if (res == null) | |||||
{ | |||||
Json<RecipeManage>.Data.Recipes.Add(new NewRecipeModel { RecipeId = recipeID, RecipeName = RecipeName, materialCollection = materials });//配方添加 | |||||
} | |||||
else | |||||
{ | |||||
goto prop; | |||||
} | |||||
ActionManage.GetInstance.Send("CloseNewRecipeView"); | |||||
} | |||||
else //已有配方,用于编辑 | |||||
{ | |||||
bom.materialCollection= materials; | |||||
bom.RecipeName = RecipeName; | |||||
ActionManage.GetInstance.Send("CloseNewRecipeView"); | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,62 @@ | |||||
using BPASmartClient.Helper; | |||||
using FryPot_DosingSystem.Model; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class RecipeSetDownViewModel : ObservableObject | |||||
{ | |||||
/// <summary> | |||||
/// 配方下发 | |||||
/// </summary> | |||||
public RelayCommand<object> RecipeSetDownCommand { get; set; } | |||||
/// <summary> | |||||
/// 配方一键下发 | |||||
/// </summary> | |||||
public RelayCommand AllRecipeSetDownCommand { get; set; } | |||||
public ObservableCollection<NewRecipeModel> Recipes { get; set; } = new ObservableCollection<NewRecipeModel>(); | |||||
public RecipeSetDownViewModel() | |||||
{ | |||||
Json<RecipeManage>.Read(); | |||||
Recipes = Json<RecipeManage>.Data.Recipes; | |||||
RecipeSetDownCommand = new RelayCommand<object>((Id) => | |||||
{ | |||||
if (Id != null && Id is string strId) | |||||
{ | |||||
var res = Recipes.FirstOrDefault(p => p.RecipeId == strId); | |||||
if (res != null) | |||||
{ | |||||
RecipeSetDown(res); | |||||
} | |||||
} | |||||
}); | |||||
AllRecipeSetDownCommand = new RelayCommand(() => | |||||
{ | |||||
if (Recipes!=null) | |||||
{ | |||||
foreach (var recipeModel in Recipes) | |||||
{ | |||||
RecipeSetDown(recipeModel); | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
/// <summary> | |||||
/// 数据下发方法 | |||||
/// </summary> | |||||
public void RecipeSetDown(NewRecipeModel recipeModel) | |||||
{ | |||||
recipeModel.RecipeSetInfo = "下发成功"; | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,80 @@ | |||||
using BPASmartClient.Helper; | |||||
using BPASmartClient.Message; | |||||
using FryPot_DosingSystem.Model; | |||||
using FryPot_DosingSystem.View; | |||||
using Microsoft.Toolkit.Mvvm.ComponentModel; | |||||
using Microsoft.Toolkit.Mvvm.Input; | |||||
using System; | |||||
using System.Collections.Generic; | |||||
using System.Collections.ObjectModel; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace FryPot_DosingSystem.ViewModel | |||||
{ | |||||
internal class RecipeSetViewModel : ObservableObject | |||||
{ | |||||
///// <summary> | |||||
///// 配方编号 | |||||
///// </summary> | |||||
//private int _serialNumber; | |||||
//public int SerialNumber { get { return _serialNumber; } set { _serialNumber = value;OnPropertyChanged(); } } | |||||
///// <summary> | |||||
///// 配方名称 | |||||
///// </summary> | |||||
//private string _recipeName; | |||||
//public string RecipeName { get { return _recipeName; } set { _recipeName = value; OnPropertyChanged(); } } | |||||
public ObservableCollection<NewRecipeModel> recipeModels { get; set; } = new ObservableCollection<NewRecipeModel>(); | |||||
public Action NewRecipe { get; set; } | |||||
public Action SaveRecipe { get; set; } | |||||
/// <summary> | |||||
/// 编辑配方 | |||||
/// </summary> | |||||
public RelayCommand<object> EditRecipeCommand { get; set; } | |||||
/// <summary> | |||||
/// 删除配方 | |||||
/// </summary> | |||||
public RelayCommand<object> DeleteRecipeCommand { get; set; } | |||||
public RecipeSetViewModel() | |||||
{ | |||||
Json<RecipeManage>.Read(); | |||||
recipeModels = Json<RecipeManage>.Data.Recipes; | |||||
NewRecipe = new Action(() => | |||||
{ | |||||
NewRecipeView nrv = new NewRecipeView(); | |||||
nrv.ShowDialog(); | |||||
MessageLog.GetInstance.Show("新建配方"); | |||||
}); | |||||
SaveRecipe = new Action(() => { | |||||
Json<RecipeManage>.Save(); | |||||
}); | |||||
EditRecipeCommand = new RelayCommand<object>((Id) => | |||||
{ | |||||
if (Id != null) | |||||
{ | |||||
ActionManage.GetInstance.CancelRegister("EditRecipe"); | |||||
NewRecipeView nrv = new NewRecipeView(); | |||||
ActionManage.GetInstance.Send("EditRecipe", Id); | |||||
nrv.ShowDialog(); | |||||
} | |||||
}); | |||||
DeleteRecipeCommand = new RelayCommand<object>((Id) => | |||||
{ | |||||
if (Id != null && Id is String strId) | |||||
{ | |||||
var res= recipeModels.FirstOrDefault(p => p.RecipeId == strId); | |||||
if (res != null && res is NewRecipeModel nes) | |||||
{ | |||||
recipeModels.Remove(res);//删除配方 | |||||
Json<RecipeManage>.Save();//保存配方 | |||||
} | |||||
} | |||||
}); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1 @@ | |||||
deac37237d550f2bb590b1d004aab120f4401e4504fd380cf9afa150f1f019d624ce5842ec9c5a8b2120413b2d623477a5b1c93800f28232dfcce895649de806a90a33c6aa3e437981381bb5e28745b8c5a9df97b8b94372d1b9dcac16580901 |
@@ -98,7 +98,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DosingSystem", "DosingSyste | |||||
EndProject | EndProject | ||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MorkTJuicer", "BPASmartClient.MorkTJuicer\BPASmartClient.MorkTJuicer.csproj", "{724087A3-E7E7-4494-B844-414FF5CD1D40}" | Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.MorkTJuicer", "BPASmartClient.MorkTJuicer\BPASmartClient.MorkTJuicer.csproj", "{724087A3-E7E7-4494-B844-414FF5CD1D40}" | ||||
EndProject | EndProject | ||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BPASmartClient.AGV", "BPASmartClient.AGV\BPASmartClient.AGV.csproj", "{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}" | |||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BPASmartClient.AGV", "BPASmartClient.AGV\BPASmartClient.AGV.csproj", "{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}" | |||||
EndProject | |||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FryPot_DosingSystem", "FryPot_DosingSystem\FryPot_DosingSystem.csproj", "{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}" | |||||
EndProject | EndProject | ||||
Global | Global | ||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution | GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
@@ -914,6 +916,26 @@ Global | |||||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Release|x64.Build.0 = Release|Any CPU | {507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Release|x64.Build.0 = Release|Any CPU | ||||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Release|x86.ActiveCfg = Release|Any CPU | {507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Release|x86.ActiveCfg = Release|Any CPU | ||||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Release|x86.Build.0 = Release|Any CPU | {507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8}.Release|x86.Build.0 = Release|Any CPU | ||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|Any CPU.Build.0 = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|ARM.ActiveCfg = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|ARM.Build.0 = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|ARM64.ActiveCfg = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|ARM64.Build.0 = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|x64.ActiveCfg = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|x64.Build.0 = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|x86.ActiveCfg = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Debug|x86.Build.0 = Debug|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|Any CPU.ActiveCfg = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|Any CPU.Build.0 = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|ARM.ActiveCfg = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|ARM.Build.0 = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|ARM64.ActiveCfg = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|ARM64.Build.0 = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|x64.ActiveCfg = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|x64.Build.0 = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|x86.ActiveCfg = Release|Any CPU | |||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E}.Release|x86.Build.0 = Release|Any CPU | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(SolutionProperties) = preSolution | GlobalSection(SolutionProperties) = preSolution | ||||
HideSolutionNode = FALSE | HideSolutionNode = FALSE | ||||
@@ -959,6 +981,7 @@ Global | |||||
{4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB} = {8712125E-14CD-4E1B-A1CE-4BDE03805942} | {4E0B01AD-CFD0-4BD5-BBE6-AD2A4183B4DB} = {8712125E-14CD-4E1B-A1CE-4BDE03805942} | ||||
{724087A3-E7E7-4494-B844-414FF5CD1D40} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F} | {724087A3-E7E7-4494-B844-414FF5CD1D40} = {9FB27073-61A0-4FE3-94DB-5FDDE062332F} | ||||
{507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625} | {507A30E2-246E-4AC9-82F4-BE8FBBC1C5B8} = {3D1D0E04-03FD-480A-8CF8-6E01A2E28625} | ||||
{BF0BCA66-BAE3-4293-9C3A-51537AB8580E} = {8712125E-14CD-4E1B-A1CE-4BDE03805942} | |||||
EndGlobalSection | EndGlobalSection | ||||
GlobalSection(ExtensibilityGlobals) = postSolution | GlobalSection(ExtensibilityGlobals) = postSolution | ||||
SolutionGuid = {9AEC9B81-0222-4DE9-B642-D915C29222AC} | SolutionGuid = {9AEC9B81-0222-4DE9-B642-D915C29222AC} | ||||
@@ -0,0 +1 @@ | |||||
deac37237d550f2bb590b1d004aab120481999a41282f0d8eed6fa9049bb2b58cf766ac542f7a79f9082f942d0190d731890e60eebc260ec3b9e76773b3e4e83443ee7e834210c4de2f560a9b4a6dffbc2a95b696b61aa07653dc4afdd31b551dc9f238426fc95486e3cf08d9387518bf125481cbfd4003d593f7f0c83167badfca9e6b0e585bf724542d50252bd672d2650e1146dd47b395b9b5d22b4fba4e75f528e15f91b5eb98112d2b1a3d5b1e1305cd1a1086a71336213e2a7cf83b262e36d4f33428a80c089f2f1ed81695a6c2d431dd7aaf64d71262dd132539e26900ebb7a6d1cc5923550c6612fdfee2a0a |