Add project files.
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
<UserControl x:Class="SafeBagDE70.CollectionUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<hc:SimpleStackPanel Background="White" VerticalAlignment="Center" Margin="20">
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Red" Text="TÚI ĐÃ ĐẦY, HÃY THỰC HIỆN LẤY TÚI TIỀN RA KHỎI MÁY:" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Blue" Text="1. KIỂM TRA VÀ LẤY TIỀN KHỎI TẤT CẢ CÁC NGĂN"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Blue" Text="2. THỰC HIỆN LẤY TÚI TIỀN RA KHỎI MÁY (NẾU BẠN LÀ NHÂN VIÊN VIETINBANK)"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Blue" Text="3. ẤN THIẾT LẬP BỘ ĐẾM (NẾU BẠN LÀ NHÂN VIÊN VIETINBANK)"/>
|
||||
<Separator/>
|
||||
</hc:SimpleStackPanel>
|
||||
</UserControl>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,20 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : Application
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,189 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using SafeBagDE70.Services;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
///
|
||||
public partial class MainWindow : HandyControl.Controls.Window
|
||||
{
|
||||
private WelcomeUC _welcomeUC;
|
||||
private DepositSMUCv2 _depositUC;
|
||||
private CollectionUC _collectionUC;
|
||||
private InformationUC _informationUC;
|
||||
private ErrorUC _errorUC;
|
||||
private UserControl _currentUC;
|
||||
private UserControl _prevUC;
|
||||
private TimeoutUC _timeoutUC;
|
||||
private MaintainanceUC _maintainanceUC;
|
||||
private EndSessionUC _endSessionUC;
|
||||
private object objLock = new object();
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
Loaded += MainWindow_Loaded;
|
||||
}
|
||||
|
||||
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.Init();
|
||||
if (_welcomeUC == null) _welcomeUC = new WelcomeUC();
|
||||
if (_collectionUC == null) _collectionUC = new CollectionUC();
|
||||
if (_informationUC == null) _informationUC = new InformationUC();
|
||||
if (_errorUC == null) _errorUC = new ErrorUC();
|
||||
if (_depositUC == null) _depositUC = new DepositSMUCv2();
|
||||
if (_timeoutUC == null) _timeoutUC = new TimeoutUC();
|
||||
if (_maintainanceUC == null) _maintainanceUC = new MaintainanceUC();
|
||||
if (_endSessionUC == null) _endSessionUC = new EndSessionUC();
|
||||
|
||||
|
||||
gridMain.Children.Add(_welcomeUC);
|
||||
gridMain.Children.Add(_depositUC);
|
||||
gridMain.Children.Add(_collectionUC);
|
||||
gridMain.Children.Add(_informationUC);
|
||||
gridMain.Children.Add(_errorUC);
|
||||
gridMain.Children.Add(_timeoutUC);
|
||||
gridMain.Children.Add(_maintainanceUC);
|
||||
gridMain.Children.Add(_endSessionUC);
|
||||
|
||||
ShowWelcomeScreen();
|
||||
//ShowDepositScreen();
|
||||
}
|
||||
|
||||
public void HideAll()
|
||||
{
|
||||
lock(objLock)
|
||||
{
|
||||
foreach (var item in gridMain.Children)
|
||||
{
|
||||
if (item != null)
|
||||
(item as UserControl).Visibility = Visibility.Hidden;
|
||||
}
|
||||
//_collectionUC.Visibility = Visibility.Hidden;
|
||||
//_informationUC.Visibility = Visibility.Hidden;
|
||||
//_errorUC.Visibility = Visibility.Hidden;
|
||||
//_depositUC.Visibility = Visibility.Hidden;
|
||||
//_welcomeUC.Visibility = Visibility.Hidden;
|
||||
//_maintainanceUC.Visibility=Visibility.Hidden;
|
||||
//_endSessionUC.Visibility = Visibility.Hidden;
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
|
||||
}
|
||||
public void ShowEndSessionScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
HideAll();
|
||||
_endSessionUC.Visibility= Visibility.Visible;
|
||||
}
|
||||
public void ShowInformationScreen(string strInfor,bool bContinue=false,bool bPlaySound=true,List<Control> lstControls=null)
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _informationUC;
|
||||
HideAll();
|
||||
_informationUC.Visibility = Visibility.Visible;
|
||||
_informationUC.ShowInfor(strInfor, bContinue, bPlaySound,lstControls);
|
||||
}
|
||||
public void ShowErrorScreen(string strError)
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _errorUC;
|
||||
HideAll();
|
||||
_errorUC.Visibility = Visibility.Visible;
|
||||
_errorUC.ShowInfor(strError);
|
||||
}
|
||||
public void ShowWelcomeScreen()
|
||||
{
|
||||
_depositUC.StopTimers();
|
||||
_depositUC.StopWelcomeTimer();
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _welcomeUC;
|
||||
HideAll();
|
||||
_welcomeUC.Init();
|
||||
|
||||
_welcomeUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public void ShowDepositScreen(bool bInit=true)
|
||||
{
|
||||
_depositUC.ResetTimers();
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _depositUC;
|
||||
HideAll();
|
||||
_depositUC.Visibility = Visibility.Visible;
|
||||
if(bInit)
|
||||
{
|
||||
_depositUC.EndTransaction();
|
||||
_depositUC.InitTransaction();
|
||||
}
|
||||
}
|
||||
|
||||
public void ShowCollectionScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _collectionUC;
|
||||
HideAll();
|
||||
_collectionUC.Init();
|
||||
_collectionUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public bool IsMaintainanceScreen()
|
||||
{
|
||||
return _currentUC == _maintainanceUC;
|
||||
}
|
||||
public DepositSMUCv2 GetDepositScreen()
|
||||
{
|
||||
return _depositUC;
|
||||
}
|
||||
public void ShowMaintainanceScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
HideAll();
|
||||
_maintainanceUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public void ShowTimeoutScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
HideAll();
|
||||
_timeoutUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public void StopTimers()
|
||||
{
|
||||
_depositUC.StopTimers();
|
||||
}
|
||||
|
||||
public bool DoCheck()
|
||||
{
|
||||
return _depositUC.DoCheck();
|
||||
}
|
||||
public void ResetTimers()
|
||||
{
|
||||
_depositUC.ResetTimers();
|
||||
}
|
||||
public void BackScreen()
|
||||
{
|
||||
HideAll();
|
||||
_prevUC.Visibility = Visibility.Visible;
|
||||
_currentUC = _prevUC;
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,211 @@
|
||||
using CoreScanner;
|
||||
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.Automation;
|
||||
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 System.Xml;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WelcomeWindow.xaml
|
||||
/// </summary>
|
||||
public partial class WelcomeUC : UserControl
|
||||
{
|
||||
public string? QRCodeContent = null;
|
||||
public string? PinCode = null;
|
||||
public bool IsAuthenticated = false;
|
||||
public CCoreScannerClass? cCoreScannerClass=null;
|
||||
public WelcomeUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitQRCodeScanner();
|
||||
}
|
||||
private void LoginButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string pin = PinCodeBox.Password;
|
||||
|
||||
if (ValidatePin(pin))
|
||||
{
|
||||
PinCode=PinCodeBox.Password.ToString();
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (PinCode != null)
|
||||
{
|
||||
var strPincode = PinCode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
//DialogResult = true;
|
||||
//this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblPincodeError.Content = "PINCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Invalid PIN. Please try again.");
|
||||
}
|
||||
}
|
||||
|
||||
private void ForgotPin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Forgot PIN clicked.");
|
||||
}
|
||||
|
||||
private void Help_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Help clicked.");
|
||||
}
|
||||
|
||||
private bool ValidatePin(string pin)
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
private async void PinCodeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var onScreenKeyboardProcess = new ProcessStartInfo("osk.exe")
|
||||
{
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(onScreenKeyboardProcess);
|
||||
try
|
||||
{
|
||||
//var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
|
||||
//var keyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
|
||||
//Process.Start(keyboardPath);
|
||||
// AutomationElement.FromHandle(-1);
|
||||
|
||||
// string keyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
|
||||
// Process.Start(keyboardPath);
|
||||
//await Launcher.LaunchUriAsync(new Uri("ms-inputapp://"));
|
||||
|
||||
//var onScreenKeyboardProcess = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
|
||||
//{
|
||||
// UseShellExecute = true
|
||||
//};
|
||||
//Process.Start(onScreenKeyboardProcess);
|
||||
|
||||
QrCodePanel.Visibility = Visibility.Collapsed;
|
||||
PinCodePanel.Visibility = Visibility.Visible;
|
||||
|
||||
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
private void btnQRCodeLogin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
PinCodePanel.Visibility = Visibility.Collapsed;
|
||||
QrCodePanel.Visibility=Visibility.Visible;
|
||||
cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
|
||||
|
||||
}
|
||||
public void InitQRCodeScanner()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Instantiate CoreScanner Class
|
||||
cCoreScannerClass = new CCoreScannerClass();
|
||||
|
||||
// Call Open API
|
||||
short[] scannerTypes = new short[1]; // Scanner Types you are interested in
|
||||
scannerTypes[0] = 1; // 1 for all scanner types
|
||||
short numberOfScannerTypes = 1; // Size of the scannerTypes array
|
||||
int status; // Extended API return code
|
||||
|
||||
cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
|
||||
|
||||
// Subscribe for barcode events in cCoreScannerClass
|
||||
|
||||
|
||||
// Let's subscribe for events
|
||||
int opcode = 1001; // Method for Subscribe events
|
||||
string outXML; // XML Output
|
||||
string inXML = "<inArgs>" +
|
||||
"<cmdArgs>" +
|
||||
"<arg-int>1</arg-int>" + // Number of events you want to subscribe
|
||||
"<arg-int>1</arg-int>" + // Comma separated event IDs
|
||||
"</cmdArgs>" +
|
||||
"</inArgs>";
|
||||
|
||||
cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Console.WriteLine("Something wrong please check... " + exp.Message);
|
||||
}
|
||||
}
|
||||
private void OnBarcodeEvent(short eventType, ref string pscanData)
|
||||
{
|
||||
string xmlString = pscanData;
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlString);
|
||||
|
||||
XmlNode rawDataNode = xmlDoc.SelectSingleNode("//datalabel");
|
||||
string rawDataHex = rawDataNode.InnerText.Trim();
|
||||
|
||||
QRCodeContent = HexStringToString(rawDataHex);
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
|
||||
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (QRCodeContent != null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == QRCodeContent).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
//DialogResult = true;
|
||||
//this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblQRcodeError.Content = "QRCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
static string HexStringToString(string hexString)
|
||||
{
|
||||
string[] hexValues = hexString.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
byte[] bytes = new byte[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexValues[i], 16);
|
||||
}
|
||||
return Encoding.ASCII.GetString(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,826 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
using SafeBagDE70.Model;
|
||||
using HandyControl.Tools;
|
||||
using System.Drawing.Printing;
|
||||
using System.Drawing;
|
||||
using static HandyControl.Tools.Interop.InteropValues;
|
||||
using SafeBagDE70.API;
|
||||
using Newtonsoft.Json;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using DE70_CMDv2;
|
||||
using System.Configuration;
|
||||
|
||||
|
||||
namespace SafeBagDE70
|
||||
{ //Summary
|
||||
|
||||
|
||||
public partial class DepositUC : UserControl
|
||||
{
|
||||
SerialPort serialPortDE70 = new SerialPort();
|
||||
SerialPort serialPortSensor= new SerialPort();
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
ObservableCollection<LvCountItem> lvCountItems = new ObservableCollection<LvCountItem>();
|
||||
private DispatcherTimer timer;
|
||||
private DispatcherTimer sensorTimer;
|
||||
|
||||
int countTimer = 0;
|
||||
CCmdRsp cCmdRsp = null;
|
||||
bool bInitialized = false;
|
||||
|
||||
|
||||
public DepositUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
}
|
||||
|
||||
private void UserControl_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
InitTransaction();
|
||||
|
||||
}
|
||||
public void InitTransaction()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (AppData.IsAuthenticated)
|
||||
{
|
||||
lblUser.Content = $"Xin chào khách hàng: {AppData.CurrentCustomerAccount.Name} (Gian hàng {AppData.CurrentCustomerAccount.CustomerId})";
|
||||
}
|
||||
|
||||
// LoginUsingQRCode();
|
||||
if (serialPortDE70.IsOpen) serialPortDE70.Close();
|
||||
if (serialPortSensor.IsOpen) serialPortSensor.Close();
|
||||
|
||||
serialPortDE70.ReadBufferSize = 4096;
|
||||
serialPortDE70.WriteBufferSize = 4096;
|
||||
cCmdRsp = new CCmdRsp(serialPortDE70);
|
||||
AppData.cCmdRsp = cCmdRsp;
|
||||
|
||||
serialPortDE70.PortName = "COM4";
|
||||
serialPortDE70.BaudRate = 9600;
|
||||
serialPortDE70.Parity = Parity.Even;
|
||||
serialPortDE70.DataBits = 8;
|
||||
serialPortDE70.StopBits = StopBits.One;
|
||||
serialPortDE70.ReadTimeout = 10000;
|
||||
serialPortDE70.WriteTimeout = 10000;
|
||||
|
||||
serialPortSensor.PortName = "COM3";
|
||||
serialPortSensor.BaudRate = 9600;
|
||||
serialPortSensor.Parity = Parity.None;
|
||||
serialPortSensor.DataBits = 8;
|
||||
serialPortSensor.StopBits = StopBits.One;
|
||||
serialPortSensor.ReadTimeout = 1000;
|
||||
serialPortSensor.WriteTimeout = 1000;
|
||||
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
if (!serialPortDE70.IsOpen)
|
||||
serialPortDE70.Open();
|
||||
|
||||
if (!serialPortSensor.IsOpen)
|
||||
serialPortSensor.Open();
|
||||
|
||||
bInitialized = InitSession();
|
||||
|
||||
timer = new DispatcherTimer();
|
||||
timer.Interval = new TimeSpan(0, 0, 10); //10 seconds
|
||||
timer.Tick += Timer_Tick;
|
||||
timer.Start();
|
||||
|
||||
sensorTimer = new DispatcherTimer();
|
||||
sensorTimer.Interval = new TimeSpan(0, 0, 1); //1 seconds
|
||||
sensorTimer.Tick += SensorTimer_Tick;
|
||||
sensorTimer.Start();
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError("LỖI CỔNG KẾT NỐI, VUI LÒNG KIỂM TRA LẠI CỔNG KẾT NỐI");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void EndTransaction()
|
||||
{
|
||||
try
|
||||
{
|
||||
AppData.IsInTransaction = false;
|
||||
if (timer != null)
|
||||
{
|
||||
timer.Tick -= Timer_Tick;
|
||||
timer.Stop();
|
||||
}
|
||||
if (sensorTimer != null)
|
||||
{
|
||||
sensorTimer.Tick -= SensorTimer_Tick;
|
||||
sensorTimer.Stop();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void SetStep(int step)
|
||||
{
|
||||
switch(step)
|
||||
{
|
||||
case 0:
|
||||
btnStart.IsEnabled = true;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = false;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 1:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled =false;
|
||||
break;
|
||||
case 2:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 3:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSessionCount()
|
||||
{
|
||||
if (lvCount.Items.Count == 11) {
|
||||
foreach(var item in lvCountItems)
|
||||
{
|
||||
item.Quantity = "0";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "1000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "2000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "5000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "10000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "20000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "50000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "100000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "200000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "Tổng",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems[10].Quantity = "0";
|
||||
lvCountItems[10].Value = "0";
|
||||
}
|
||||
|
||||
|
||||
lvCount.ItemsSource = lvCountItems;
|
||||
|
||||
//lvCountItems[0].Quantity = "10";
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
public int quantityStored = 0;
|
||||
public int totalAllDenominations = 0;
|
||||
public int posDenomi;
|
||||
public bool printerFlag = false;
|
||||
public static string? recvDataString;
|
||||
public int[] TempQuantity = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
public int[] TempNote = new int[5] { 0, 0, 0, 0, 0 };
|
||||
public int[] Notes = new int[5] { 0, 0, 0, 0, 0 };
|
||||
|
||||
private void SensorTimer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
GetSensorValue();
|
||||
if (AppData.IsInTransaction)
|
||||
{
|
||||
if (AppData.WDTCount == 30)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowTimeoutScreen();
|
||||
}
|
||||
else if (AppData.WDTCount == 60)
|
||||
{
|
||||
//Nhận tiền và Kết thúc
|
||||
StoreStart();
|
||||
EndSession();
|
||||
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
AppData.IsInTransaction = false;
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
AppData.WDTCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Stopwatch watch = new Stopwatch();
|
||||
private void GetSensorValue()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
int state = 0;
|
||||
if (serialPortSensor.IsOpen == true)
|
||||
{
|
||||
//serialPortSensor.DiscardInBuffer();
|
||||
//serialPortSensor.DiscardOutBuffer();
|
||||
|
||||
serialPortSensor.Write(new byte[] { (byte)'S', 13, 10 }, 0, 3);
|
||||
var buffer = new byte[16];
|
||||
|
||||
int n = serialPortSensor.Read(buffer, 0, buffer.Length);
|
||||
|
||||
|
||||
for (int i = 1; i < n - 1; i++)
|
||||
{
|
||||
if ((buffer[i] == 13) && (buffer[i + 1] == 10))
|
||||
{
|
||||
state = buffer[i - 1] - 48;
|
||||
if (bInitialized)
|
||||
{
|
||||
if (state != 0)
|
||||
gridMain.IsEnabled = false;
|
||||
else
|
||||
gridMain.IsEnabled = true;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
lblStatus.Content = "NGĂN KÉT: ĐÓNG, NGĂN TÚI: ĐÓNG";
|
||||
break;
|
||||
case 1:
|
||||
lblStatus.Content = "NGĂN KÉT: ĐÓNG, NGĂN TÚI: MỞ";
|
||||
break;
|
||||
case 2:
|
||||
lblStatus.Content = "NGĂN KÉT: MỞ, NGĂN TÚI: ĐÓNG";
|
||||
break;
|
||||
case 3:
|
||||
lblStatus.Content = "NGĂN KÉT: MỞ, NGĂN TÚI: MỞ";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// the code that you want to measure comes here
|
||||
watch.Stop();
|
||||
|
||||
var elapsedMs = watch.ElapsedMilliseconds;
|
||||
Debug.WriteLine(elapsedMs);
|
||||
watch.Start();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException("GetSensorValue", ex.ToString());
|
||||
if(serialPortSensor.IsOpen)
|
||||
serialPortSensor.Close();
|
||||
serialPortSensor.Open();
|
||||
serialPortSensor.DiscardInBuffer();
|
||||
serialPortSensor.DiscardOutBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
|
||||
APIModels.SendHealthCheck();
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
public int UpdateTotalQuantity()
|
||||
{
|
||||
int total = 0;
|
||||
foreach (var item in lvCountItems)
|
||||
{
|
||||
if (item.Name != "Tổng")
|
||||
{
|
||||
int quantity = 0;
|
||||
if (int.TryParse(item.Quantity, out quantity))
|
||||
{
|
||||
total += quantity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
public int AutoSerialGet(SerialPort serialPort)
|
||||
{
|
||||
int ret;
|
||||
ushort seri_num = 0;
|
||||
ushort get_num = 0;
|
||||
bool endflg = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
ret = cCmdRsp.SendSerialSense();
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
ret = cCmdRsp.GetSerialNum(out seri_num);
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
// Serial number acquisition
|
||||
|
||||
if (cCmdRsp.ChkCntEnd())
|
||||
{
|
||||
endflg = true;
|
||||
Debug.WriteLine("END FLAG: "+cCmdRsp.recv_dat.dat[1]);
|
||||
}
|
||||
Debug.WriteLine("START");
|
||||
Debug.WriteLine($"Num Serial: {seri_num}");
|
||||
|
||||
while (get_num < seri_num)
|
||||
{
|
||||
get_num++;
|
||||
ret = cCmdRsp.SendGetSerial(get_num);
|
||||
|
||||
|
||||
switch (cCmdRsp.recv_dat.dat[18])
|
||||
{
|
||||
case 0x00: TempNote[0] ++; Notes[0] += TempNote[0]; break;
|
||||
case 0x02:
|
||||
//TempNote[1] ++;
|
||||
switch (cCmdRsp.recv_dat.dat[17])
|
||||
{
|
||||
case 0x00: TempQuantity[0]++; break;
|
||||
case 0x01: TempQuantity[1]++; break;
|
||||
case 0x02: TempQuantity[2]++; break;
|
||||
case 0x03: TempQuantity[3]++; break;
|
||||
case 0x04: TempQuantity[4]++; break;
|
||||
case 0x05: TempQuantity[5]++; break;
|
||||
case 0x06: TempQuantity[6]++; break;
|
||||
case 0x07: TempQuantity[7]++; break;
|
||||
case 0x08: TempQuantity[8]++; break;
|
||||
case 0x09: TempQuantity[9]++; break;
|
||||
|
||||
}
|
||||
break;
|
||||
case 0x03: TempNote[2] ++; Notes[2] += TempNote[2]; break;
|
||||
case 0x0b: TempNote[3] ++; Notes[3] += TempNote[3]; break;
|
||||
case 0x0c: TempNote[4] ++; Notes[4] += TempNote[4]; break;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine("END");
|
||||
//Debug.WriteLine("Ellapsed Time: " + timeSpan.TotalSeconds);
|
||||
if (endflg)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END GET SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END SEND SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CountStart();
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
|
||||
private void CountStart()
|
||||
{
|
||||
printerFlag = false;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
try
|
||||
{
|
||||
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
AppData.LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CNTSTART);
|
||||
//var recvData = DE70_CMD.SendxxCmd((byte)CMD_BYTE.CMD_DE_CNTSTART, serialPort);
|
||||
|
||||
//Thread.Sleep(20000);
|
||||
if (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[2] != 43) { }
|
||||
do
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_SENSE);
|
||||
}
|
||||
while (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[1] == 0x09); //SR2 = 0x09 : Counting Status
|
||||
|
||||
//SR3 = 0x43 : Stacker full
|
||||
|
||||
AutoSerialGet(serialPortDE70);
|
||||
|
||||
if (sessions == null || sessions.Count == 0)
|
||||
{
|
||||
double tempSum = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
lvCountItems[i].Quantity = TempQuantity[9 - i].ToString();
|
||||
tempSum += lvCountItems[i].getValue();
|
||||
}
|
||||
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = tempSum.ToString();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
double sum = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
|
||||
}
|
||||
|
||||
a += TempQuantity[9 - i];
|
||||
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sum += lvCountItems[i].getValue();
|
||||
|
||||
}
|
||||
//Update amount of money
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sum.ToString();
|
||||
|
||||
}
|
||||
SetStep(2);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
AppData.LogAction(currentMethod, null);
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
double sumStored;
|
||||
|
||||
//TempNote[1] = 0;
|
||||
|
||||
if (sessions != null)
|
||||
{
|
||||
sumStored = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
//quantityStored += lvCountItems[i].getQuantity();
|
||||
}
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sumStored += lvCountItems[i].getValue();
|
||||
}
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sumStored.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
StoreStart();
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
|
||||
private void StoreStart()
|
||||
{
|
||||
printerFlag = true;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
AppData.LogAction(currentMethod, null);
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
sessions[sessions.Count - 1].QuantityDenomi = (int[])TempQuantity.Clone();
|
||||
quantityStored = UpdateTotalQuantity();
|
||||
|
||||
Debug.WriteLine(quantityStored);
|
||||
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_STORESTART);
|
||||
SetStep(3);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
InitSession();
|
||||
AppData.IsInTransaction= true;
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
AppData.LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_SENSE);
|
||||
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
SetStep(1);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.IsInTransaction = false;
|
||||
AppData.WDTCount = 0;
|
||||
EndSession();
|
||||
}
|
||||
|
||||
private void EndSession()
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
var totalQuantity = lvCountItems[10].Quantity;
|
||||
var totalValue = lvCountItems[10].Value;
|
||||
try
|
||||
{
|
||||
AppData.LogAction(currentMethod, null);
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
//SendData2Server
|
||||
var data2Send = new CountingData2Send
|
||||
{
|
||||
Sessions = sessions,
|
||||
MachineId = null,
|
||||
UserId = AppData.CurrentCustomerAccount.CustomerId,
|
||||
MachineTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
||||
RejectNotes = Notes[0],
|
||||
GenuineNotes = quantityStored,
|
||||
UnfitNotes = Notes[2],
|
||||
CounterfeitNotes = Notes[3],
|
||||
SuspendNotes = Notes[4]
|
||||
|
||||
};
|
||||
var str = JsonConvert.SerializeObject(data2Send);
|
||||
|
||||
APIModels.SendCountingData(data2Send);
|
||||
//Reset all and ready to next session
|
||||
|
||||
if (printerFlag == true)
|
||||
{
|
||||
PrintReceipt();
|
||||
printerFlag = false;
|
||||
|
||||
}
|
||||
InitSession();
|
||||
//Debug.WriteLine("Reject Note: " + Notes[0] );
|
||||
//Debug.WriteLine("Genuine note stored: " + quantityStored);
|
||||
//Debug.WriteLine("Unfit note: " + Notes[2]);
|
||||
//Debug.WriteLine("Counterfeit: " + Notes[3]);
|
||||
//Debug.WriteLine("Suspend: " + Notes[4]);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
|
||||
|
||||
String strNotify = $"BẠN VỪA THỰC HIỆN TIỀN VÀO MÁY CDM:\r\n"
|
||||
+ $"SỐ LƯỢNG TỜ: {totalQuantity}\r\n"
|
||||
+ $"SỐ TIỀN: {totalValue} VND\r\n";
|
||||
|
||||
((MainWindow)Application.Current.MainWindow).ShowInformationScreen(strNotify);
|
||||
}
|
||||
|
||||
private void ShowError(string strError)
|
||||
{
|
||||
//gridMain.IsEnabled = false;
|
||||
//btnCollect2.Visibility=Visibility.Collapsed;
|
||||
//panelError.Visibility = Visibility.Visible;
|
||||
//lblError.Text = strError;
|
||||
//((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
((MainWindow)Application.Current.MainWindow).ShowErrorScreen(strError);
|
||||
}
|
||||
|
||||
private bool InitSession()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Check status
|
||||
cCmdRsp.SendDeSense();
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
int IsCassetteFull = 0;
|
||||
int IsNotesInEscrow = 0;
|
||||
IsCassetteFull = data[17] & 0x08;
|
||||
IsNotesInEscrow = data[4] & 0x01;
|
||||
|
||||
if (IsCassetteFull != 0)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowCollectionScreen();
|
||||
return false;
|
||||
}
|
||||
else if (IsNotesInEscrow != 0)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowInformationScreen("ĐỀ NGHỊ BỎ TIỀN TRONG NGĂN PHỤ ĐỂ TIẾP TỤC");
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
sessions.Clear();
|
||||
Array.Clear(TempNote, 0, TempNote.Length);
|
||||
Array.Clear(Notes, 0, Notes.Length);
|
||||
quantityStored = 0;
|
||||
maxQuantitySheet = 0;
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
SetStep(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
AppData.LogException("InitSession", ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PrintReceipt()
|
||||
{
|
||||
var shopName = AppData.CurrentCustomerAccount.Name;
|
||||
var shopCode = AppData.CurrentCustomerAccount.CustomerId;
|
||||
var tradingCode = "TRA04052024CDM";
|
||||
var storeAccountNumber = 686868686688;
|
||||
var currentTime = DateTime.Now;
|
||||
var printDocument = new PrintDocument();
|
||||
printDocument.PrinterSettings.PrinterName = "CUSTOM K80";
|
||||
printDocument.PrintPage += (sender, e) =>
|
||||
{
|
||||
e.Graphics.DrawString("Biên nhận nộp tiền", new Font("Arial", 15), System.Drawing.Brushes.Black, new PointF(80, 10));
|
||||
e.Graphics.DrawString("Mã máy CDM: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 60));
|
||||
e.Graphics.DrawString("Batch no: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 90));
|
||||
e.Graphics.DrawString("Thời gian GD: " + currentTime.ToString("dd/MM/yyyy HH:mm:ss"), new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 120));
|
||||
e.Graphics.DrawString("Mã GD: " + tradingCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 150));
|
||||
e.Graphics.DrawString("Mã gian hàng: " + shopCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 180));
|
||||
e.Graphics.DrawString("Tên gian hàng: " + shopName, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 210));
|
||||
e.Graphics.DrawString("STK gian hàng: " + storeAccountNumber, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 240));
|
||||
e.Graphics.DrawString("Số tiền nộp: " + lvCountItems[10].Value, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 270));
|
||||
e.Graphics.DrawString("*****Xin cám ơn******", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(100, 300));
|
||||
// To send raw ESC/POS commands, you'd typically use e.Graphics.DrawString() with the command string,
|
||||
// or for more complex scenarios, directly manipulate the byte stream sent to the printer.
|
||||
};
|
||||
printDocument.Print();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
EndTransaction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
using DE70_CMDv2;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
public static class AppData
|
||||
{
|
||||
public static List<CustomerAccount>? customerAccounts = null;
|
||||
public static CustomerAccount? CurrentCustomerAccount{get;set;}
|
||||
public static CCmdRsp? cCmdRsp=null;
|
||||
public static bool IsAuthenticated = false;
|
||||
public static bool IsInTransaction = false;
|
||||
public static int WDTCount = 0;
|
||||
public static void Init()
|
||||
{
|
||||
customerAccounts = new List<CustomerAccount>{
|
||||
new CustomerAccount{Name="NGUYỄN ĐÌNH THUẬN",CustomerId="HUE_0000000001",QRCode="HUE_0000000001",PINCode="H0001" },
|
||||
new CustomerAccount{Name="HOÀNG VĂN HIỆP",CustomerId="HUE_0000000002",QRCode="HUE_0000000002",PINCode="H0002" },
|
||||
new CustomerAccount{Name="PHẠM NGỌC HƯNG",CustomerId="HUE_0000000003",QRCode="HUE_0000000003",PINCode="H0003" }
|
||||
};
|
||||
CurrentCustomerAccount = customerAccounts[0];
|
||||
}
|
||||
public static void LogAction(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("log.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
public static void LogException(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("logException.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
}
|
||||
public class CustomerAccount
|
||||
{
|
||||
public string? Name { get; set; }
|
||||
public string? CustomerId { get; set; }
|
||||
public string? QRCode { get; set; }
|
||||
public string? PINCode { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,211 @@
|
||||
<UserControl x:Class="SafeBagDE70.DepositSMUC"
|
||||
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:SafeBagDE70"
|
||||
mc:Ignorable="d"
|
||||
Width="1280"
|
||||
Height="1024"
|
||||
Background="#F0F0F0"
|
||||
Loaded="UserControl_Loaded"
|
||||
Unloaded="UserControl_Unloaded">
|
||||
<UserControl.Resources>
|
||||
<local:LastItemIndexConverter x:Key="LastItemIndexConverter" />
|
||||
<DataTemplate x:Key="BoldTemplateWithSeparator">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<!-- Separator Row -->
|
||||
<RowDefinition Height="2"/>
|
||||
<!-- Data Row -->
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Separator Line -->
|
||||
<Rectangle Grid.Row="0" Height="2" Fill="Gray" HorizontalAlignment="Stretch"/>
|
||||
|
||||
<!-- Data Content for Last Row -->
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="200"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="0" />
|
||||
<TextBlock Text="{Binding Quantity}" FontWeight="Bold" Grid.Column="1" />
|
||||
<TextBlock Text="{Binding Value}" FontWeight="Bold" Grid.Column="2" />
|
||||
</Grid>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</UserControl.Resources>
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="10">
|
||||
<Grid x:Name="gridMainPanel">
|
||||
<!--<ContentControl x:Name="MainContent" />-->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="40"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Border BorderThickness="0" Background="#003366">
|
||||
<StackPanel Grid.Row="0" >
|
||||
<Label
|
||||
x:Name="lblName"
|
||||
Background="Transparent"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontWeight="Bold"
|
||||
FontSize="30"
|
||||
Height="50"/>
|
||||
|
||||
<Label HorizontalAlignment="Center"
|
||||
x:Name="lblUser"
|
||||
Background="Transparent"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Height="50"/>
|
||||
<Border BorderThickness="1" BorderBrush="Gray">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Grid Grid.Row="1" x:Name="gridMain" VerticalAlignment="Center" Margin="5" >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="300"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="300"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Grid.Column="0">
|
||||
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="BẮT ĐẦU"
|
||||
x:Name="btnStart"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10,0,10,10"
|
||||
Background="#4CAF50" Foreground="White"/>
|
||||
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="NỘP TIỀN"
|
||||
x:Name="btnCountStart"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="#2196F3" Foreground="White"/>
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="KIỂM TRA"
|
||||
x:Name="btnCheck"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="#2196F3" Foreground="White"
|
||||
/>
|
||||
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="2">
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="LƯU TRỮ"
|
||||
x:Name="btnStoreStart"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10,0,10,10"
|
||||
Background="#4CAF50" Foreground="White"/>
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="KẾT THÚC"
|
||||
FontWeight="Bold"
|
||||
x:Name="btnEnd"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="#4CAF50" Foreground="White"/>
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="THOÁT"
|
||||
FontWeight="Bold"
|
||||
x:Name="btnLogout"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="Red" Foreground="White"/>
|
||||
</StackPanel>
|
||||
<Grid Grid.Column="1">
|
||||
<ListView HorizontalAlignment="Center" FontSize="30" Width="600" x:Name="lvCount"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Visible"
|
||||
ScrollViewer.CanContentScroll="False"
|
||||
Background="Transparent">
|
||||
<ListView.Resources>
|
||||
<!-- Style for GridViewColumnHeader to set font to bold -->
|
||||
<Style TargetType="GridViewColumnHeader">
|
||||
<Setter Property="FontWeight" Value="Bold"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
</Style>
|
||||
<Style TargetType="ListViewItem">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Right"/>
|
||||
</Style>
|
||||
|
||||
</ListView.Resources>
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
<GridViewColumn Header="Mệnh giá"
|
||||
|
||||
DisplayMemberBinding="{Binding Name}"
|
||||
Width="200"/>
|
||||
<GridViewColumn Header="Số lượng"
|
||||
DisplayMemberBinding="{Binding Quantity}"
|
||||
Width="150"/>
|
||||
<GridViewColumn Header="Thành tiền"
|
||||
DisplayMemberBinding="{Binding Value}"
|
||||
Width="200"/>
|
||||
</GridView>
|
||||
</ListView.View>
|
||||
<ListView.ItemContainerStyle>
|
||||
<Style TargetType="ListViewItem">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Right"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
<Style.Triggers>
|
||||
<MultiDataTrigger>
|
||||
<MultiDataTrigger.Conditions>
|
||||
<!-- Condition 1: Check if AlternationIndex equals Item Count - 1 -->
|
||||
<Condition Value="True">
|
||||
<Condition.Binding>
|
||||
<MultiBinding Converter="{StaticResource LastItemIndexConverter}">
|
||||
<Binding Path="Name"/>
|
||||
</MultiBinding>
|
||||
</Condition.Binding>
|
||||
</Condition>
|
||||
</MultiDataTrigger.Conditions>
|
||||
<Setter Property="FontWeight" Value="Bold" />
|
||||
</MultiDataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</ListView.ItemContainerStyle>
|
||||
</ListView>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="2" Background="#003366">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
<Label Height="40" x:Name="lblStatus" Background="Transparent" BorderThickness="0" Foreground="Red" FontSize="20" Content="TRẠNG THÁI"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Border>
|
||||
</UserControl>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
<UserControl x:Class="SafeBagDE70.CollectionUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<hc:SimpleStackPanel Background="White" VerticalAlignment="Center" Margin="20">
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Red" Text="TÚI ĐÃ ĐẦY, HÃY THỰC HIỆN LẤY TÚI TIỀN RA KHỎI MÁY:" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Blue" Text="1. KIỂM TRA VÀ LẤY TIỀN KHỎI TẤT CẢ CÁC NGĂN"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Blue" Text="2. THỰC HIỆN LẤY TÚI TIỀN RA KHỎI MÁY (NẾU BẠN LÀ NHÂN VIÊN VIETINBANK)"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Blue" Text="3. ẤN THIẾT LẬP BỘ ĐẾM (NẾU BẠN LÀ NHÂN VIÊN VIETINBANK)"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock x:Name="lblStatus" FontSize="20" FontWeight="Bold" Foreground="Green" Text="TRẠNG THÁI: BỘ ĐẾM ĐẦY"/>
|
||||
<Separator/>
|
||||
<Grid Margin="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button x:Name="btnCollect" Click="btnCollect_Click" Grid.Column="0" Style="{StaticResource ButtonDanger}" Content="THIẾT LẬP BỘ ĐẾM" Height="50"/>
|
||||
<Button x:Name="btnCancel" Click="btnCancel_Click" Grid.Column="1" Style="{StaticResource ButtonWarning}" Content="MỞ NGĂN PHỤ" Height="50"/>
|
||||
</Grid>
|
||||
</hc:SimpleStackPanel>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,53 @@
|
||||
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 SafeBagDE70.Admin
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for AdminSettingsUC.xaml
|
||||
/// </summary>
|
||||
public partial class AdminMainUC : UserControl
|
||||
{
|
||||
public AdminMainUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void LogoutButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void UserManagementButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void DashboardButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void SettingsButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void ReportsButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
<ItemGroup>
|
||||
<ApplicationDefinition Update="App.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</ApplicationDefinition>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Update="CollectionUC.xaml.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Update="old\QRCodeWindow.xaml.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
<Compile Update="old\WelcomeWindow.xaml.cs">
|
||||
<SubType>Code</SubType>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Page Update="ErrorUC.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="InformationUC.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="CollectionUC.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="DepositUC.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="old\MainUserWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="old\PinCodeWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="old\QRCodeZebraWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="old\QRCodeWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="WelcomeUC.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
<Page Update="old\WelcomeWindow.xaml">
|
||||
<SubType>Designer</SubType>
|
||||
</Page>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,766 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
using SafeBagDE70.Model;
|
||||
using HandyControl.Tools;
|
||||
using System.Drawing.Printing;
|
||||
using System.Drawing;
|
||||
using static HandyControl.Tools.Interop.InteropValues;
|
||||
using SafeBagDE70.API;
|
||||
using Newtonsoft.Json;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using DE70_CMDv2;
|
||||
using System.Configuration;
|
||||
|
||||
|
||||
namespace SafeBagDE70
|
||||
{ //Summary
|
||||
public class CountSession
|
||||
{
|
||||
public int[] QuantityDenomi { get; set; }
|
||||
public int[] SumDenomi { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class CountingData2Send
|
||||
{
|
||||
public List<CountSession>? Sessions { get; set; }
|
||||
public string? UserId { get; set; }
|
||||
public string? MachineId { get; set; }
|
||||
public string? MachineTime { get; set; }
|
||||
public int RejectNotes { get; set; }
|
||||
public int GenuineNotes { get; set; }
|
||||
public int UnfitNotes { get; set; }
|
||||
public int CounterfeitNotes { get; set; }
|
||||
public int SuspendNotes { get; set; }
|
||||
}
|
||||
|
||||
public partial class MainUserWindow : HandyControl.Controls.Window
|
||||
{
|
||||
SerialPort serialPortDE70 = new SerialPort();
|
||||
SerialPort serialPortSensor= new SerialPort();
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
ObservableCollection<LvCountItem> lvCountItems = new ObservableCollection<LvCountItem>();
|
||||
private DispatcherTimer timer;
|
||||
private DispatcherTimer sensorTimer;
|
||||
int countTimer = 0;
|
||||
CCmdRsp cCmdRsp = null;
|
||||
bool bInitialized = false;
|
||||
|
||||
public MainUserWindow()
|
||||
{
|
||||
//Need to update: auto detect COM Port
|
||||
try
|
||||
{
|
||||
InitializeComponent();
|
||||
//string queuePath = ConfigurationManager.AppSettings["SensorPort"].ToString();
|
||||
AppData.Init();
|
||||
//this.gridMain.IsEnabled = false;
|
||||
LoginUsingQRCode();
|
||||
|
||||
|
||||
|
||||
serialPortDE70.ReadBufferSize = 4096;
|
||||
serialPortDE70.WriteBufferSize = 4096;
|
||||
cCmdRsp = new CCmdRsp(serialPortDE70);
|
||||
|
||||
serialPortDE70.PortName = "COM4";
|
||||
serialPortDE70.BaudRate = 9600;
|
||||
serialPortDE70.Parity = Parity.Even;
|
||||
serialPortDE70.DataBits = 8;
|
||||
serialPortDE70.StopBits = StopBits.One;
|
||||
|
||||
serialPortSensor.PortName = "COM3";
|
||||
serialPortSensor.BaudRate = 9600;
|
||||
serialPortSensor.Parity = Parity.None;
|
||||
serialPortSensor.DataBits = 8;
|
||||
serialPortSensor.StopBits = StopBits.One;
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
|
||||
serialPortDE70.Open();
|
||||
serialPortSensor.Open();
|
||||
|
||||
bInitialized= InitSession();
|
||||
|
||||
timer = new DispatcherTimer();
|
||||
timer.Interval = new TimeSpan(0, 0, 10); //10 seconds
|
||||
timer.Tick += Timer_Tick;
|
||||
timer.Start();
|
||||
|
||||
sensorTimer = new DispatcherTimer();
|
||||
sensorTimer.Interval = new TimeSpan(0, 0, 1); //10 seconds
|
||||
sensorTimer.Tick += SensorTimer_Tick;
|
||||
sensorTimer.Start();
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError("LỖI CỔNG KẾT NỐI, VUI LÒNG KIỂM TRA LẠI CỔNG KẾT NỐI");
|
||||
//MessageBox.Show("Cổng đang mở, kiểm tra lại cổng kết nối");
|
||||
//this.Close();
|
||||
}
|
||||
}
|
||||
public void SetStep(int step)
|
||||
{
|
||||
switch(step)
|
||||
{
|
||||
case 0:
|
||||
btnStart.IsEnabled = true;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = false;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 1:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled =false;
|
||||
break;
|
||||
case 2:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 3:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSessionCount()
|
||||
{
|
||||
lvCountItems.Clear();
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "1000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "2000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "5000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "10000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "20000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "50000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "100000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "200000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "Tổng",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems[10].Quantity = "0";
|
||||
lvCountItems[10].Value = "0";
|
||||
|
||||
lvCount.ItemsSource = lvCountItems;
|
||||
|
||||
//lvCountItems[0].Quantity = "10";
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
public int quantityStored = 0;
|
||||
public int totalAllDenominations = 0;
|
||||
public int posDenomi;
|
||||
public bool printerFlag = false;
|
||||
public static string? recvDataString;
|
||||
public int[] TempQuantity = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
public int[] TempNote = new int[5] { 0, 0, 0, 0, 0 };
|
||||
public int[] Notes = new int[5] { 0, 0, 0, 0, 0 };
|
||||
|
||||
private void SensorTimer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
int state = 0;
|
||||
if (serialPortSensor.IsOpen==true)
|
||||
{
|
||||
serialPortSensor.Write(new byte[] { (byte)'S', 13, 10 }, 0, 3);
|
||||
var buffer = new byte[16];
|
||||
|
||||
int n = serialPortSensor.Read(buffer, 0, buffer.Length);
|
||||
|
||||
for (int i = 1; i < n - 1; i++)
|
||||
{
|
||||
if ((buffer[i] == 13) && (buffer[i + 1] == 10))
|
||||
{
|
||||
state = buffer[i - 1]-48;
|
||||
if(bInitialized)
|
||||
{
|
||||
if (state != 0)
|
||||
gridMain.IsEnabled = false;
|
||||
else
|
||||
gridMain.IsEnabled = true;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
lblStatus.Content = "Két: đóng, Túi: đóng";
|
||||
break;
|
||||
case 1:
|
||||
lblStatus.Content = "Két: đóng, Túi: đã bị lấy ra";
|
||||
break;
|
||||
case 2:
|
||||
lblStatus.Content = "Két: mở, Túi: đóng";
|
||||
break;
|
||||
case 3:
|
||||
lblStatus.Content = "Két: mở, Túi: đã bị lấy ra";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
|
||||
APIModels.SendHealthCheck();
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
public int UpdateTotalQuantity()
|
||||
{
|
||||
int total = 0;
|
||||
foreach (var item in lvCountItems)
|
||||
{
|
||||
if (item.Name != "Tổng")
|
||||
{
|
||||
int quantity = 0;
|
||||
if (int.TryParse(item.Quantity, out quantity))
|
||||
{
|
||||
total += quantity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
public int AutoSerialGet(SerialPort serialPort)
|
||||
{
|
||||
int ret;
|
||||
ushort seri_num = 0;
|
||||
ushort get_num = 0;
|
||||
bool endflg = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
ret = cCmdRsp.SendSerialSense();
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
ret = cCmdRsp.GetSerialNum(out seri_num);
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
// Serial number acquisition
|
||||
|
||||
if (cCmdRsp.ChkCntEnd())
|
||||
{
|
||||
endflg = true;
|
||||
Debug.WriteLine("END FLAG: "+cCmdRsp.recv_dat.dat[1]);
|
||||
}
|
||||
Debug.WriteLine("START");
|
||||
Debug.WriteLine($"Num Serial: {seri_num}");
|
||||
|
||||
while (get_num < seri_num)
|
||||
{
|
||||
get_num++;
|
||||
ret = cCmdRsp.SendGetSerial(get_num);
|
||||
|
||||
|
||||
switch (cCmdRsp.recv_dat.dat[18])
|
||||
{
|
||||
case 0x00: TempNote[0] ++; Notes[0] += TempNote[0]; break;
|
||||
case 0x02:
|
||||
//TempNote[1] ++;
|
||||
switch (cCmdRsp.recv_dat.dat[17])
|
||||
{
|
||||
case 0x00: TempQuantity[0]++; break;
|
||||
case 0x01: TempQuantity[1]++; break;
|
||||
case 0x02: TempQuantity[2]++; break;
|
||||
case 0x03: TempQuantity[3]++; break;
|
||||
case 0x04: TempQuantity[4]++; break;
|
||||
case 0x05: TempQuantity[5]++; break;
|
||||
case 0x06: TempQuantity[6]++; break;
|
||||
case 0x07: TempQuantity[7]++; break;
|
||||
case 0x08: TempQuantity[8]++; break;
|
||||
case 0x09: TempQuantity[9]++; break;
|
||||
|
||||
}
|
||||
break;
|
||||
case 0x03: TempNote[2] ++; Notes[2] += TempNote[2]; break;
|
||||
case 0x0b: TempNote[3] ++; Notes[3] += TempNote[3]; break;
|
||||
case 0x0c: TempNote[4] ++; Notes[4] += TempNote[4]; break;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine("END");
|
||||
//Debug.WriteLine("Ellapsed Time: " + timeSpan.TotalSeconds);
|
||||
if (endflg)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END GET SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END SEND SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = false;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
try
|
||||
{
|
||||
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CNTSTART);
|
||||
//var recvData = DE70_CMD.SendxxCmd((byte)CMD_BYTE.CMD_DE_CNTSTART, serialPort);
|
||||
|
||||
//Thread.Sleep(20000);
|
||||
if (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[2] != 43) { }
|
||||
do
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_SENSE);
|
||||
}
|
||||
while (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[1] == 0x09); //SR2 = 0x09 : Counting Status
|
||||
|
||||
//SR3 = 0x43 : Stacker full
|
||||
|
||||
AutoSerialGet(serialPortDE70);
|
||||
|
||||
if (sessions == null || sessions.Count == 0)
|
||||
{
|
||||
double tempSum = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
lvCountItems[i].Quantity = TempQuantity[9 - i].ToString();
|
||||
tempSum += lvCountItems[i].getValue();
|
||||
}
|
||||
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = tempSum.ToString();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
double sum = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
|
||||
}
|
||||
|
||||
a += TempQuantity[9 - i];
|
||||
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sum += lvCountItems[i].getValue();
|
||||
|
||||
}
|
||||
//Update amount of money
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sum.ToString();
|
||||
|
||||
}
|
||||
SetStep(2);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
double sumStored;
|
||||
|
||||
//TempNote[1] = 0;
|
||||
|
||||
if (sessions != null)
|
||||
{
|
||||
sumStored = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
//quantityStored += lvCountItems[i].getQuantity();
|
||||
}
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sumStored += lvCountItems[i].getValue();
|
||||
}
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sumStored.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = true;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
sessions[sessions.Count - 1].QuantityDenomi = (int[])TempQuantity.Clone();
|
||||
quantityStored = UpdateTotalQuantity();
|
||||
|
||||
Debug.WriteLine(quantityStored);
|
||||
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_STORESTART);
|
||||
SetStep(3);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
InitSession();
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_SENSE);
|
||||
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
SetStep(1);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
LogAction(currentMethod, null);
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
//SendData2Server
|
||||
var data2Send = new CountingData2Send
|
||||
{
|
||||
Sessions = sessions,
|
||||
MachineId = null,
|
||||
UserId = AppData.CurrentCustomerAccount.CustomerId,
|
||||
MachineTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
||||
RejectNotes = Notes[0],
|
||||
GenuineNotes = quantityStored,
|
||||
UnfitNotes = Notes[2],
|
||||
CounterfeitNotes = Notes[3],
|
||||
SuspendNotes = Notes[4]
|
||||
|
||||
};
|
||||
var str = JsonConvert.SerializeObject(data2Send);
|
||||
|
||||
APIModels.SendCountingData(data2Send);
|
||||
//Reset all and ready to next session
|
||||
|
||||
if(printerFlag == true)
|
||||
{
|
||||
PrintReceipt();
|
||||
printerFlag = false;
|
||||
|
||||
}
|
||||
InitSession();
|
||||
//Debug.WriteLine("Reject Note: " + Notes[0] );
|
||||
//Debug.WriteLine("Genuine note stored: " + quantityStored);
|
||||
//Debug.WriteLine("Unfit note: " + Notes[2]);
|
||||
//Debug.WriteLine("Counterfeit: " + Notes[3]);
|
||||
//Debug.WriteLine("Suspend: " + Notes[4]);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
LoginUsingQRCode();
|
||||
|
||||
}
|
||||
private void ShowError(string strError)
|
||||
{
|
||||
gridMain.IsEnabled = false;
|
||||
|
||||
panelError.Visibility = Visibility.Visible;
|
||||
lblError.Text = strError;
|
||||
}
|
||||
|
||||
private bool InitSession()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Check status
|
||||
cCmdRsp.SendDeSense();
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
int IsCassetteFull=data[17] & 0x08;
|
||||
if(IsCassetteFull != 0)
|
||||
{
|
||||
ShowError("TÚI ĐẦY, ĐỀ NGHỊ LẤY TÚI TRƯỚC KHI TIẾP TỤC THAO TÁC");
|
||||
btnCollect2.Visibility=Visibility.Visible;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
sessions.Clear();
|
||||
Array.Clear(TempNote, 0, TempNote.Length);
|
||||
Array.Clear(Notes, 0, Notes.Length);
|
||||
quantityStored = 0;
|
||||
maxQuantitySheet = 0;
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
SetStep(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
LogException("InitSession", ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PrintReceipt()
|
||||
{
|
||||
var shopName = AppData.CurrentCustomerAccount.Name;
|
||||
var shopCode = AppData.CurrentCustomerAccount.CustomerId;
|
||||
var tradingCode = "TRA04052024CDM";
|
||||
var storeAccountNumber = 686868686688;
|
||||
var currentTime = DateTime.Now;
|
||||
var printDocument = new PrintDocument();
|
||||
printDocument.PrinterSettings.PrinterName = "CUSTOM K80";
|
||||
printDocument.PrintPage += (sender, e) =>
|
||||
{
|
||||
e.Graphics.DrawString("Biên nhận nộp tiền", new Font("Arial", 15), System.Drawing.Brushes.Black, new PointF(80, 10));
|
||||
e.Graphics.DrawString("Mã máy CDM: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 60));
|
||||
e.Graphics.DrawString("Batch no: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 90));
|
||||
e.Graphics.DrawString("Thời gian GD: " + currentTime.ToString("dd/MM/yyyy HH:mm:ss"), new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 120));
|
||||
e.Graphics.DrawString("Mã GD: " + tradingCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 150));
|
||||
e.Graphics.DrawString("Mã gian hàng: " + shopCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 180));
|
||||
e.Graphics.DrawString("Tên gian hàng: " + shopName, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 210));
|
||||
e.Graphics.DrawString("STK gian hàng: " + storeAccountNumber, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 240));
|
||||
e.Graphics.DrawString("Số tiền nộp: " + lvCountItems[10].Value, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 270));
|
||||
e.Graphics.DrawString("*****Xin cám ơn******", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(100, 300));
|
||||
// To send raw ESC/POS commands, you'd typically use e.Graphics.DrawString() with the command string,
|
||||
// or for more complex scenarios, directly manipulate the byte stream sent to the printer.
|
||||
};
|
||||
printDocument.Print();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void LogAction(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("log.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
public void LogException(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("logException.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
private void LoginUsingQRCode()
|
||||
{
|
||||
var wnd = new WelcomeWindow();
|
||||
wnd.ShowDialog();
|
||||
|
||||
lblUser.Content = "";
|
||||
//var wnd = new QRCodeZebraWindow();
|
||||
//wnd.ShowDialog();
|
||||
if (wnd.DialogResult == true)
|
||||
{
|
||||
var strQR = wnd.QRCodeContent;
|
||||
var strPincode = wnd.PinCode;
|
||||
if (AppData.customerAccounts!=null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if(strQR!=null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == strQR).FirstOrDefault();
|
||||
}
|
||||
else if(strPincode!=null)
|
||||
{
|
||||
strPincode = strPincode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
lblUser.Content = $"Xin chào khách hàng: {cca.Name} (Gian hàng {cca.CustomerId})";
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("QRCode không đúng, vui lòng thử lại");
|
||||
LoginUsingQRCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnLoginByPINCode_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var wnd = new PinCodeWindow();
|
||||
wnd.ShowDialog();
|
||||
}
|
||||
|
||||
private void btnCollect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var currentMode = cCmdRsp.GetLockParam().mode;
|
||||
cCmdRsp.GetLockParam().mode = Mode.MODE_COLLECTION;
|
||||
cCmdRsp.SendLock();
|
||||
MessageBox.Show(cCmdRsp.GetSendDat(false));
|
||||
Thread.Sleep(5000);
|
||||
cCmdRsp.GetLockParam().mode = currentMode;
|
||||
cCmdRsp.SendLock();
|
||||
|
||||
InitSession();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
using DE70_CMDv2;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class CollectionUC : UserControl
|
||||
{
|
||||
public CollectionUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
private void btnCollect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(AppData.cCmdRsp!=null)
|
||||
{
|
||||
CCmdRsp cCmdRsp = AppData.cCmdRsp;
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
//Event fix
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
|
||||
var currentMode = cCmdRsp.GetLockParam().mode;
|
||||
cCmdRsp.GetLockParam().mode = Mode.MODE_COLLECTION;
|
||||
cCmdRsp.SendLock();
|
||||
Thread.Sleep(10000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] != recvData.dat[16])
|
||||
{
|
||||
lblStatus.Text="TRẠNG THÁI: KHỞI TẠO BỘ ĐẾM THÀNH CÔNG";
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(AppData.cCmdRsp!=null)
|
||||
AppData.cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<Application x:Class="SafeBagDE70.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
StartupUri="MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<hc:ThemeResources RequestedTheme="Light">
|
||||
<ResourceDictionary x:Key="Light" hc:ThemeDictionary.Key="Light">
|
||||
|
||||
<!-- Put the resources you want to use in the Light theme Here -->
|
||||
|
||||
<SolidColorBrush x:Key="PrimaryBrush" Color="Red" />
|
||||
<SolidColorBrush x:Key="AppBackgroundBrush" Color="LightBlue" />
|
||||
</ResourceDictionary>
|
||||
</hc:ThemeResources>
|
||||
<hc:Theme/>
|
||||
<ResourceDictionary Source="pack://application:,,,/VirtualKeyboard;component/ResourceDictionaries/DefaultStyles.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
@@ -0,0 +1,146 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
///
|
||||
|
||||
//public class CountSession
|
||||
//{
|
||||
// public int[] QuantityDenomi { get; set; }
|
||||
// public int[] SumDenomi { get; set; }
|
||||
|
||||
//}
|
||||
public partial class MainWindow : HandyControl.Controls.Window
|
||||
{
|
||||
private WelcomeUC _welcomeUC;
|
||||
private DepositUC _depositUC;
|
||||
private CollectionUC _collectionUC;
|
||||
private InformationUC _informationUC;
|
||||
private ErrorUC _errorUC;
|
||||
private UserControl _currentUC;
|
||||
private UserControl _prevUC;
|
||||
private TimeoutUC _timeoutUC;
|
||||
private object objLock = new object();
|
||||
public MainWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
Loaded += MainWindow_Loaded;
|
||||
|
||||
}
|
||||
|
||||
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.Init();
|
||||
if (_welcomeUC == null) _welcomeUC = new WelcomeUC();
|
||||
if (_collectionUC == null) _collectionUC = new CollectionUC();
|
||||
if (_informationUC == null) _informationUC = new InformationUC();
|
||||
if (_errorUC == null) _errorUC = new ErrorUC();
|
||||
if (_depositUC == null) _depositUC = new DepositUC();
|
||||
if (_timeoutUC == null) _timeoutUC = new TimeoutUC();
|
||||
|
||||
gridMain.Children.Add(_welcomeUC);
|
||||
gridMain.Children.Add(_depositUC);
|
||||
gridMain.Children.Add(_collectionUC);
|
||||
gridMain.Children.Add(_informationUC);
|
||||
gridMain.Children.Add(_errorUC);
|
||||
gridMain.Children.Add(_timeoutUC);
|
||||
|
||||
ShowWelcomeScreen();
|
||||
}
|
||||
|
||||
public void HideAll()
|
||||
{
|
||||
lock(objLock)
|
||||
{
|
||||
foreach (var item in gridMain.Children)
|
||||
{
|
||||
if (item != null)
|
||||
(item as UserControl).Visibility = Visibility.Hidden;
|
||||
}
|
||||
_collectionUC.Visibility = Visibility.Hidden;
|
||||
_informationUC.Visibility = Visibility.Hidden;
|
||||
_errorUC.Visibility = Visibility.Hidden;
|
||||
_depositUC.Visibility = Visibility.Hidden;
|
||||
_welcomeUC.Visibility = Visibility.Hidden;
|
||||
}
|
||||
|
||||
}
|
||||
public void ShowInformationScreen(string strInfor)
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _informationUC;
|
||||
HideAll();
|
||||
_informationUC.Visibility = Visibility.Visible;
|
||||
_informationUC.ShowInfor(strInfor);
|
||||
|
||||
}
|
||||
public void ShowErrorScreen(string strError)
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _errorUC;
|
||||
HideAll();
|
||||
_errorUC.Visibility = Visibility.Visible;
|
||||
_errorUC.ShowInfor(strError);
|
||||
}
|
||||
public void ShowWelcomeScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _welcomeUC;
|
||||
HideAll();
|
||||
_welcomeUC.Init();
|
||||
_welcomeUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public void ShowDepositScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _depositUC;
|
||||
HideAll();
|
||||
_depositUC.Visibility = Visibility.Visible;
|
||||
_depositUC.EndTransaction();
|
||||
_depositUC.InitTransaction();
|
||||
}
|
||||
public void ShowCollectionScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
_currentUC = _collectionUC;
|
||||
HideAll();
|
||||
_collectionUC.Init();
|
||||
_collectionUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public void ShowTimeoutScreen()
|
||||
{
|
||||
_prevUC = _currentUC;
|
||||
|
||||
HideAll();
|
||||
_timeoutUC.Visibility = Visibility.Visible;
|
||||
}
|
||||
public void BackScreen()
|
||||
{
|
||||
HideAll();
|
||||
_prevUC.Visibility = Visibility.Visible;
|
||||
_currentUC = _prevUC;
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<TargetFramework>net8.0-windows</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<UseWPF>true</UseWPF>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,62 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
namespace XamlGeneratedNamespace {
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// GeneratedInternalTypeHelper
|
||||
/// </summary>
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "8.0.7.0")]
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||
public sealed class GeneratedInternalTypeHelper : System.Windows.Markup.InternalTypeHelper {
|
||||
|
||||
/// <summary>
|
||||
/// CreateInstance
|
||||
/// </summary>
|
||||
protected override object CreateInstance(System.Type type, System.Globalization.CultureInfo culture) {
|
||||
return System.Activator.CreateInstance(type, ((System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic)
|
||||
| (System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.CreateInstance)), null, null, culture);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// GetPropertyValue
|
||||
/// </summary>
|
||||
protected override object GetPropertyValue(System.Reflection.PropertyInfo propertyInfo, object target, System.Globalization.CultureInfo culture) {
|
||||
return propertyInfo.GetValue(target, System.Reflection.BindingFlags.Default, null, null, culture);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// SetPropertyValue
|
||||
/// </summary>
|
||||
protected override void SetPropertyValue(System.Reflection.PropertyInfo propertyInfo, object target, object value, System.Globalization.CultureInfo culture) {
|
||||
propertyInfo.SetValue(target, value, System.Reflection.BindingFlags.Default, null, null, culture);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// CreateDelegate
|
||||
/// </summary>
|
||||
protected override System.Delegate CreateDelegate(System.Type delegateType, object target, string handler) {
|
||||
return ((System.Delegate)(target.GetType().InvokeMember("_CreateDelegate", (System.Reflection.BindingFlags.InvokeMethod
|
||||
| (System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)), null, target, new object[] {
|
||||
delegateType,
|
||||
handler}, null)));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// AddEventHandler
|
||||
/// </summary>
|
||||
protected override void AddEventHandler(System.Reflection.EventInfo eventInfo, object target, System.Delegate handler) {
|
||||
eventInfo.AddEventHandler(target, handler);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("VirtualKeyboard")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("VirtualKeyboard")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("VirtualKeyboard")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
|
||||
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
|
||||
|
||||
// Generated by the MSBuild WriteCodeFragment class.
|
||||
|
||||
@@ -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 SafeBagDE70.Admin
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for AdminSettingsUC.xaml
|
||||
/// </summary>
|
||||
public partial class AdminSettingsUC : UserControl
|
||||
{
|
||||
public AdminSettingsUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
<UserControl x:Class="SafeBagDE70.Admin.LogViewerUC"
|
||||
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:SafeBagDE70.Admin"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<Grid>
|
||||
<StackPanel>
|
||||
<TextBlock Text="Realtime Logs" FontSize="20" Margin="10"/>
|
||||
<ListBox x:Name="LogListBox" Height="500" Margin="10"/>
|
||||
<Button Content="Log Information" Width="200" Margin="10" Click="LogInfoButton_Click"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,21 @@
|
||||
<UserControl x:Class="SafeBagDE70.EndSessionUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<hc:SimpleStackPanel Background="White" VerticalAlignment="Center" Margin="20">
|
||||
<hc:HighlightTextBlock x:Name="lblInfor" Text="MÁY ĐANG THỰC HIỆN KẾT THÚC PHIÊN TỰ ĐỘNG" FontSize="20" TextWrapping="Wrap" FontWeight="Bold" Foreground="Blue" HorizontalAlignment="Center"/>
|
||||
<hc:HighlightTextBlock Text="VUI LÒNG CHỜ" FontSize="20" TextWrapping="Wrap" FontWeight="Bold" Foreground="DarkRed" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<Grid Margin="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
</Grid>
|
||||
</hc:SimpleStackPanel>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"C:\\Users\\DELL Precision 7530\\Desktop\\Test\\VK\\VK\\WPFKeyboard\\VirtualKeyboard\\VirtualKeyboard.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"C:\\Users\\DELL Precision 7530\\Desktop\\Test\\VK\\VK\\WPFKeyboard\\VirtualKeyboard\\VirtualKeyboard.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\DELL Precision 7530\\Desktop\\Test\\VK\\VK\\WPFKeyboard\\VirtualKeyboard\\VirtualKeyboard.csproj",
|
||||
"projectName": "VirtualKeyboard",
|
||||
"projectPath": "C:\\Users\\DELL Precision 7530\\Desktop\\Test\\VK\\VK\\WPFKeyboard\\VirtualKeyboard\\VirtualKeyboard.csproj",
|
||||
"packagesPath": "C:\\Users\\DELL Precision 7530\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\DELL Precision 7530\\Desktop\\Test\\VK\\VK\\WPFKeyboard\\VirtualKeyboard\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"fallbackFolders": [
|
||||
"C:\\Program Files (x86)\\DevExpress 20.2\\Components\\Offline Packages",
|
||||
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages",
|
||||
"C:\\Program Files\\dotnet\\sdk\\NuGetFallbackFolder"
|
||||
],
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\DELL Precision 7530\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\DevExpress 20.2.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net8.0-windows"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\DevExpress 20.2\\Components\\System\\Components\\Packages": {},
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net8.0-windows7.0": {
|
||||
"targetAlias": "net8.0-windows",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net8.0-windows7.0": {
|
||||
"targetAlias": "net8.0-windows",
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
},
|
||||
"Microsoft.WindowsDesktop.App.WPF": {
|
||||
"privateAssets": "none"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.200/PortableRuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
using DE70_CMDv2;
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class TimeoutUC : UserControl
|
||||
{
|
||||
public TimeoutUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowInfor(string strInfor)
|
||||
{
|
||||
lblInfor.Text = strInfor;
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.WDTCount = 0;
|
||||
((MainWindow)Application.Current.MainWindow).BackScreen();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppData.cCmdRsp != null)
|
||||
AppData.cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,60 @@
|
||||
<UserControl x:Class="SafeBagDE70.WelcomeUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
x:Name="ucWelcome"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Top Section -->
|
||||
<StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0">
|
||||
<Image Source="icon/logo.ico" Width="200" Height="200" Margin="0,10,0,10" Stretch="UniformToFill"/>
|
||||
<TextBlock Text="Xin chào! Hãy lựa chọn hình thức đăng nhập để tiếp tục" FontSize="24" FontWeight="Bold" TextAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Middle Section -->
|
||||
<Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Button hc:IconElement.Geometry="{StaticResource FullScreenGeometry}" Grid.Column="0" Grid.Row="0" x:Name="btnQRCodeLogin" Content="QR CODE" Width="200" Height="100" Margin="0,0,10,0" FontSize="20" FontWeight="Bold" Click="btnQRCodeLogin_Click"/>
|
||||
<Button Grid.Column="2" Grid.Row="0" x:Name="btnPinCodeLogin" Content="PIN CODE" Width="200" Height="100" Margin="10,0,0,0" Click="PinCodeButton_Click" FontSize="20" FontWeight="Bold"/>
|
||||
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="PinCodePanel">
|
||||
<PasswordBox x:Name="PinCodeBox" Width="300" Height="60" FontSize="20" HorizontalContentAlignment="Center" Margin="0,10,0,0"/>
|
||||
<TextBlock Text="Quên mã PIN?" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" Margin="0,5,0,0" MouseLeftButtonUp="ForgotPin_Click"/>
|
||||
<Button Content="Đăng nhập" Width="200" Height="40" Margin="0,10,0,0" Click="LoginButton_Click"/>
|
||||
<Label x:Name="lblPincodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="QrCodePanel">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Đưa QR Code của bạn vào đầu đọc" FontSize="20"/>
|
||||
<hc:LoadingCircle Background="Transparent" VerticalAlignment="Bottom" Width="50" Height="50" Margin="10"/>
|
||||
<Label x:Name="lblQRcodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<!-- Bottom Section -->
|
||||
<StackPanel Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<TextBlock Text="TRỢ GIÚP" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" MouseLeftButtonUp="Help_Click"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
</UserControl>
|
||||
@@ -0,0 +1,21 @@
|
||||
<hc:Window
|
||||
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:hc="https://handyorg.github.io/handycontrol"
|
||||
xmlns:local="clr-namespace:SafeBagDE70"
|
||||
x:Class="SafeBagDE70.PinCodeWindow"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
mc:Ignorable="d"
|
||||
ShowNonClientArea="False"
|
||||
Title="QRCodeWindow" Height="400" Width="600">
|
||||
<Grid>
|
||||
<StackPanel VerticalAlignment="Center">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Nhập PINCODE của bạn" FontSize="30"/>
|
||||
<hc:TextBox HorizontalAlignment="Center" Height="50" Width="200" Margin="10"/>
|
||||
<Button x:Name="btnOK" Content="OK" Width="100" Height="50" Margin="10"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
</hc:Window>
|
||||
@@ -0,0 +1,39 @@
|
||||
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:sys="clr-namespace:System;assembly=mscorlib"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
|
||||
<SolidColorBrush x:Key="KeyboardBackgroundBrush" Color="#2f2f2f"/>
|
||||
<SolidColorBrush x:Key="KeyboardBackgroundAccentBrush" Color="#FFA0A0A0"/>
|
||||
<SolidColorBrush x:Key="KeyboardForegroundBrush" Color="White"/>
|
||||
<sys:Double x:Key="KeyboardIconSize">50</sys:Double>
|
||||
<!--<SolidColorBrush x:Key="UppercaseBrush" Color="#FF006DA0"/>-->
|
||||
|
||||
<Style x:Key="KeyboardButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource {x:Type Button}}">
|
||||
<Setter Property="FontSize" Value="30"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Background" Value="{StaticResource KeyboardBackgroundBrush}"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource KeyboardForegroundBrush}"/>
|
||||
<Setter Property="Focusable" Value="False"/>
|
||||
<Setter Property="Margin" Value="5" />
|
||||
<Setter Property="Height" Value="Auto"/>
|
||||
<Setter Property="Width" Value="Auto" />
|
||||
</Style>
|
||||
|
||||
<Style x:Key="KeyboardRepeatButtonStyle" TargetType="{x:Type RepeatButton}" BasedOn="{StaticResource {x:Type RepeatButton}}">
|
||||
<Setter Property="FontSize" Value="30"/>
|
||||
<Setter Property="BorderThickness" Value="0"/>
|
||||
<Setter Property="Background" Value="{StaticResource KeyboardBackgroundBrush}"/>
|
||||
<Setter Property="Foreground" Value="{StaticResource KeyboardForegroundBrush}"/>
|
||||
<Setter Property="Focusable" Value="False"/>
|
||||
<Setter Property="Margin" Value="5" />
|
||||
<Setter Property="Height" Value="Auto"/>
|
||||
<Setter Property="Width" Value="Auto" />
|
||||
</Style>
|
||||
|
||||
<Style x:Key="KeyboardValueBoxStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
|
||||
<Setter Property="FontSize" Value="40" />
|
||||
<Setter Property="VerticalContentAlignment" Value="Center" />
|
||||
<Setter Property="Foreground" Value="{StaticResource KeyboardForegroundBrush}"/>
|
||||
<Setter Property="Background" Value="{StaticResource KeyboardBackgroundBrush}"/>
|
||||
<Setter Property="Margin" Value="25" />
|
||||
</Style>
|
||||
</ResourceDictionary>
|
||||
@@ -0,0 +1,58 @@
|
||||
using DE70_CMDv2;
|
||||
using SafeBagDE70.Services;
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class InformationUC : UserControl
|
||||
{
|
||||
private bool _bContinue = false;
|
||||
private bool _bPlaySound = false;
|
||||
public InformationUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowInfor(string strInfor, bool bContinue = false, bool bPlaySound=true)
|
||||
{
|
||||
lblInfor.Text = strInfor;
|
||||
_bContinue = bContinue;
|
||||
_bPlaySound = bPlaySound;
|
||||
if (_bPlaySound)
|
||||
SoundManager.StartWarningSound();
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(_bContinue)
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen(false);
|
||||
else
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppData.cCmdRsp != null)
|
||||
AppData.cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
<Application x:Class="SafeBagDE70.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
StartupUri="MainWindow.xaml">
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<hc:ThemeResources RequestedTheme="Light">
|
||||
<ResourceDictionary x:Key="Light" hc:ThemeDictionary.Key="Light">
|
||||
|
||||
<!-- Put the resources you want to use in the Light theme Here -->
|
||||
|
||||
<SolidColorBrush x:Key="PrimaryBrush" Color="Red" />
|
||||
<SolidColorBrush x:Key="AppBackgroundBrush" Color="LightBlue" />
|
||||
</ResourceDictionary>
|
||||
</hc:ThemeResources>
|
||||
<hc:Theme/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
@@ -0,0 +1,113 @@
|
||||
<UserControl x:Class="SafeBagDE70.DepositUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
Background="#9edaf7"
|
||||
Loaded="UserControl_Loaded"
|
||||
Unloaded="UserControl_Unloaded">
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="10">
|
||||
<Grid x:Name="gridMainPanel">
|
||||
<!--<ContentControl x:Name="MainContent" />-->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="40"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Border BorderThickness="0" BorderBrush="Gray">
|
||||
<StackPanel Grid.Row="0" hc:BorderElement.Circular="True">
|
||||
<Label Content="Vietinbank"
|
||||
Background="Transparent"
|
||||
Foreground="#1d619b"
|
||||
BorderThickness="0"
|
||||
FontWeight="Bold"
|
||||
FontSize="30"
|
||||
Height="50"/>
|
||||
|
||||
<Label HorizontalAlignment="Center"
|
||||
x:Name="lblUser"
|
||||
Background="Transparent"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Height="50"/>
|
||||
<Border BorderThickness="1" BorderBrush="Gray">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Grid Grid.Row="1" x:Name="gridMain" VerticalAlignment="Center" Margin="5" >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="300"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="300"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid Grid.Column="0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Button Grid.Row="0" HorizontalAlignment="Stretch" Content="BẮT ĐẦU" x:Name="btnStart" Click="btnStart_Click" FontSize="30" Height="80" />
|
||||
<Button Grid.Row="1" HorizontalAlignment="Stretch" Content="KẾT THÚC" x:Name="btnEnd" Click="btnEnd_Click" FontSize="30" Height="80"/>
|
||||
<Button Grid.Row="2" HorizontalAlignment="Stretch" Content="KT LẤY TÚI" x:Name="btnCollect" Click="btnCollect_Click" FontSize="30" Height="80"/>
|
||||
</Grid>
|
||||
<Grid Grid.Column="2">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Button Grid.Row="0" HorizontalAlignment="Stretch" Content="NỘP TIỀN" x:Name="btnCountStart" Click="btnCountStart_Click" FontSize="30" Height="80"/>
|
||||
<Button Grid.Row="1" HorizontalAlignment="Stretch" Content="KIỂM TRA" x:Name="btnCheck" Click="btnCheck_Click" FontSize="30" Height="80"/>
|
||||
<Button Grid.Row="2" HorizontalAlignment="Stretch" Content="LƯU TRỮ" x:Name="btnStoreStart" Click="btnStoreStart_Click" FontSize="30" Height="80" />
|
||||
</Grid>
|
||||
<Grid Grid.Column="1">
|
||||
<ListView HorizontalAlignment="Center" FontSize="30" Width="600" x:Name="lvCount" Style="{StaticResource ListViewBaseStyle}">
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
<GridViewColumn Header="Mệnh giá"
|
||||
DisplayMemberBinding="{Binding Name}"
|
||||
Width="200"/>
|
||||
<GridViewColumn Header="Số lượng"
|
||||
DisplayMemberBinding="{Binding Quantity}"
|
||||
Width="200"/>
|
||||
<GridViewColumn Header="Thành tiền"
|
||||
DisplayMemberBinding="{Binding Value}"
|
||||
Width="200"/>
|
||||
</GridView>
|
||||
</ListView.View>
|
||||
<ListView.ItemContainerStyle>
|
||||
<Style TargetType="ListViewItem">
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="Margin" Value="0"/>
|
||||
<Setter Property="BorderBrush" Value="Gray"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
</Style>
|
||||
</ListView.ItemContainerStyle>
|
||||
</ListView>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="2">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
<Label Height="40" x:Name="lblStatus" Background="Transparent" BorderThickness="0" Foreground="Red" FontSize="20" Content="Trạng thái"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Border>
|
||||
</UserControl>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
using DE70_CMDv2;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
public static class AppData
|
||||
{
|
||||
public static List<CustomerAccount>? customerAccounts = null;
|
||||
public static CustomerAccount? CurrentCustomerAccount{get;set;}
|
||||
public static CCmdRsp? cCmdRsp=null;
|
||||
public static void Init()
|
||||
{
|
||||
customerAccounts = new List<CustomerAccount>{
|
||||
new CustomerAccount{Name="NGUYỄN ĐÌNH THUẬN",CustomerId="HUE_0000000001",QRCode="HUE_0000000001",PINCode="H0001" },
|
||||
new CustomerAccount{Name="HOÀNG VĂN HIỆP",CustomerId="HUE_0000000002",QRCode="HUE_0000000002",PINCode="H0002" },
|
||||
new CustomerAccount{Name="PHẠM NGỌC HƯNG",CustomerId="HUE_0000000003",QRCode="HUE_0000000003",PINCode="H0003" }
|
||||
};
|
||||
CurrentCustomerAccount = customerAccounts[0];
|
||||
}
|
||||
}
|
||||
public class CustomerAccount
|
||||
{
|
||||
public string? Name { get; set; }
|
||||
public string? CustomerId { get; set; }
|
||||
public string? QRCode { get; set; }
|
||||
public string? PINCode { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SafeBagDE70.StateMachine
|
||||
{
|
||||
public class Transition
|
||||
{
|
||||
public List<string> From { get; set; }
|
||||
public List<string> To { get; set; }
|
||||
public List<ActionWithFlag> Actions { get; set; }
|
||||
public bool RequireAtLeastOneActionSuccess { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
using DE70_CMDv2;
|
||||
using SafeBagDE70.Services;
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class InformationUC : UserControl
|
||||
{
|
||||
private bool _bContinue = false;
|
||||
private bool _bPlaySound = false;
|
||||
private List<Control> _controls = null;
|
||||
public InformationUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowInfor(string strInfor, bool bContinue = false, bool bPlaySound=true,List<Control> controls=null)
|
||||
{
|
||||
lblInfor.Text = strInfor;
|
||||
_bContinue = bContinue;
|
||||
_bPlaySound = bPlaySound;
|
||||
_controls = controls;
|
||||
if (_bPlaySound)
|
||||
SoundManager.StartWarningSound();
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(_controls!=null)
|
||||
{
|
||||
foreach (var item in _controls)
|
||||
{
|
||||
item.IsEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (_bContinue)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen(false);
|
||||
((MainWindow)Application.Current.MainWindow).ResetTimers();
|
||||
}
|
||||
else
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppData.cCmdRsp != null)
|
||||
AppData.cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
#pragma checksum "..\..\..\DefaultKeyboardHost.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "8509DC7DAD84ED248634BE5108571E782945BD81"
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Automation;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Controls.Ribbon;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Media.Effects;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Media.Media3D;
|
||||
using System.Windows.Media.TextFormatting;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Shell;
|
||||
using VirtualKeyboard.Wpf;
|
||||
|
||||
|
||||
namespace VirtualKeyboard.Wpf {
|
||||
|
||||
|
||||
internal partial class DefaultKeyboardHost : System.Windows.Window, System.Windows.Markup.IComponentConnector {
|
||||
|
||||
|
||||
#line 19 "..\..\..\DefaultKeyboardHost.xaml"
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||
internal System.Windows.Controls.ContentControl KeyboardValueContent;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
|
||||
|
||||
#line 22 "..\..\..\DefaultKeyboardHost.xaml"
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1823:AvoidUnusedPrivateFields")]
|
||||
internal System.Windows.Controls.ContentControl KeyboardContent;
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
|
||||
private bool _contentLoaded;
|
||||
|
||||
/// <summary>
|
||||
/// InitializeComponent
|
||||
/// </summary>
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "8.0.7.0")]
|
||||
public void InitializeComponent() {
|
||||
if (_contentLoaded) {
|
||||
return;
|
||||
}
|
||||
_contentLoaded = true;
|
||||
System.Uri resourceLocater = new System.Uri("/VirtualKeyboard;component/defaultkeyboardhost.xaml", System.UriKind.Relative);
|
||||
|
||||
#line 1 "..\..\..\DefaultKeyboardHost.xaml"
|
||||
System.Windows.Application.LoadComponent(this, resourceLocater);
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "8.0.7.0")]
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
||||
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
||||
switch (connectionId)
|
||||
{
|
||||
case 1:
|
||||
this.KeyboardValueContent = ((System.Windows.Controls.ContentControl)(target));
|
||||
return;
|
||||
case 2:
|
||||
this.KeyboardContent = ((System.Windows.Controls.ContentControl)(target));
|
||||
return;
|
||||
}
|
||||
this._contentLoaded = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,211 @@
|
||||
<UserControl x:Class="SafeBagDE70.DepositSMUCv2"
|
||||
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:SafeBagDE70"
|
||||
mc:Ignorable="d"
|
||||
Width="1280"
|
||||
Height="1024"
|
||||
Background="#F0F0F0"
|
||||
Loaded="UserControl_Loaded"
|
||||
Unloaded="UserControl_Unloaded">
|
||||
<UserControl.Resources>
|
||||
<local:LastItemIndexConverter x:Key="LastItemIndexConverter" />
|
||||
<DataTemplate x:Key="BoldTemplateWithSeparator">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<!-- Separator Row -->
|
||||
<RowDefinition Height="2"/>
|
||||
<!-- Data Row -->
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Separator Line -->
|
||||
<Rectangle Grid.Row="0" Height="2" Fill="Gray" HorizontalAlignment="Stretch"/>
|
||||
|
||||
<!-- Data Content for Last Row -->
|
||||
<Grid Grid.Row="1">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="200"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
<ColumnDefinition Width="100"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock Text="{Binding Name}" FontWeight="Bold" Grid.Column="0" />
|
||||
<TextBlock Text="{Binding Quantity}" FontWeight="Bold" Grid.Column="1" />
|
||||
<TextBlock Text="{Binding Value}" FontWeight="Bold" Grid.Column="2" />
|
||||
</Grid>
|
||||
</Grid>
|
||||
</DataTemplate>
|
||||
</UserControl.Resources>
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="10">
|
||||
<Grid x:Name="gridMainPanel">
|
||||
<!--<ContentControl x:Name="MainContent" />-->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="40"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Border BorderThickness="0" Background="#003366">
|
||||
<StackPanel Grid.Row="0" >
|
||||
<Label
|
||||
x:Name="lblName"
|
||||
Background="Transparent"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontWeight="Bold"
|
||||
FontSize="30"
|
||||
Height="50"/>
|
||||
|
||||
<Label HorizontalAlignment="Center"
|
||||
x:Name="lblUser"
|
||||
Background="Transparent"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Height="50"/>
|
||||
<Border BorderThickness="1" BorderBrush="Gray">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Grid Grid.Row="1" x:Name="gridMain" VerticalAlignment="Center" Margin="5" >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="300"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="300"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Grid.Column="0">
|
||||
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="BẮT ĐẦU"
|
||||
x:Name="btnStart"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10,0,10,10"
|
||||
Background="#4CAF50" Foreground="White"/>
|
||||
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="NỘP TIỀN"
|
||||
x:Name="btnCountStart"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="#2196F3" Foreground="White"/>
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="KIỂM TRA"
|
||||
x:Name="btnCheck"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="#2196F3" Foreground="White"
|
||||
/>
|
||||
|
||||
</StackPanel>
|
||||
<StackPanel Grid.Column="2">
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="LƯU TRỮ"
|
||||
x:Name="btnStoreStart"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
FontWeight="Bold"
|
||||
Height="80"
|
||||
Margin="10,0,10,10"
|
||||
Background="#4CAF50" Foreground="White"/>
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="KẾT THÚC"
|
||||
FontWeight="Bold"
|
||||
x:Name="btnEnd"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="#4CAF50" Foreground="White"/>
|
||||
<Button HorizontalAlignment="Stretch"
|
||||
Content="THOÁT"
|
||||
FontWeight="Bold"
|
||||
x:Name="btnLogout"
|
||||
Click="btnCommon_Click"
|
||||
FontSize="30"
|
||||
Height="80"
|
||||
Margin="10"
|
||||
Background="Red" Foreground="White"/>
|
||||
</StackPanel>
|
||||
<Grid Grid.Column="1">
|
||||
<ListView HorizontalAlignment="Center" FontSize="30" Width="600" x:Name="lvCount"
|
||||
ScrollViewer.VerticalScrollBarVisibility="Visible"
|
||||
ScrollViewer.CanContentScroll="False"
|
||||
Background="Transparent">
|
||||
<ListView.Resources>
|
||||
<!-- Style for GridViewColumnHeader to set font to bold -->
|
||||
<Style TargetType="GridViewColumnHeader">
|
||||
<Setter Property="FontWeight" Value="Bold"/>
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
</Style>
|
||||
<Style TargetType="ListViewItem">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Right"/>
|
||||
</Style>
|
||||
|
||||
</ListView.Resources>
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
<GridViewColumn Header="Mệnh giá"
|
||||
|
||||
DisplayMemberBinding="{Binding Name}"
|
||||
Width="200"/>
|
||||
<GridViewColumn Header="Số lượng"
|
||||
DisplayMemberBinding="{Binding Quantity}"
|
||||
Width="150"/>
|
||||
<GridViewColumn Header="Thành tiền"
|
||||
DisplayMemberBinding="{Binding Value}"
|
||||
Width="200"/>
|
||||
</GridView>
|
||||
</ListView.View>
|
||||
<ListView.ItemContainerStyle>
|
||||
<Style TargetType="ListViewItem">
|
||||
<Setter Property="HorizontalContentAlignment" Value="Right"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
<Style.Triggers>
|
||||
<MultiDataTrigger>
|
||||
<MultiDataTrigger.Conditions>
|
||||
<!-- Condition 1: Check if AlternationIndex equals Item Count - 1 -->
|
||||
<Condition Value="True">
|
||||
<Condition.Binding>
|
||||
<MultiBinding Converter="{StaticResource LastItemIndexConverter}">
|
||||
<Binding Path="Name"/>
|
||||
</MultiBinding>
|
||||
</Condition.Binding>
|
||||
</Condition>
|
||||
</MultiDataTrigger.Conditions>
|
||||
<Setter Property="FontWeight" Value="Bold" />
|
||||
</MultiDataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</ListView.ItemContainerStyle>
|
||||
</ListView>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="2" Background="#003366">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
<Label Height="40" x:Name="lblStatus" Background="Transparent" BorderThickness="0" Foreground="Red" FontSize="20" Content="TRẠNG THÁI"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Border>
|
||||
</UserControl>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,102 @@
|
||||
<hc:Window x:Class="SafeBagDE70.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:local="clr-namespace:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
Title="MainWindow" Height="465" Width="810">
|
||||
<Grid RenderTransformOrigin="0.499,0.444">
|
||||
<Grid.RenderTransform>
|
||||
<TransformGroup>
|
||||
<ScaleTransform/>
|
||||
<SkewTransform/>
|
||||
<RotateTransform Angle="0.075"/>
|
||||
<TranslateTransform/>
|
||||
</TransformGroup>
|
||||
</Grid.RenderTransform>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="60*"/>
|
||||
<RowDefinition Height="40*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="22*"/>
|
||||
<RowDefinition Height="65*"/>
|
||||
<RowDefinition Height="65*"/>
|
||||
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="270*"/>
|
||||
<ColumnDefinition Width="270*"/>
|
||||
<ColumnDefinition Width="270*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Button Grid.Row="0" Grid.Column="0" Content="Bắt đầu" x:Name="btnStart" Click="btnStart_Click" Background="#33CC33" FontSize="30" />
|
||||
<Button Grid.Row="0" Grid.Column="2" Content="Kết thúc" x:Name="btnEnd" Click="btnEnd_Click" Background="#FF4500" FontSize="30"/>
|
||||
<Button Grid.Row="13" Grid.Column="0" Content="Đếm" x:Name="btnCountStart" Click="btnCountStart_Click" Background="#63B8FF" FontSize="30" Grid.RowSpan="2"/>
|
||||
<Button Grid.Row="13" Grid.Column="1" Content="Kiểm tra" x:Name="btnCheck" Click="btnCheck_Click" Background="#87CEFF" FontSize="30" Grid.RowSpan="2" />
|
||||
<Button Grid.Row="13" Grid.Column="2" Content="Lưu trữ" x:Name="btnStoreStart" Click="btnStoreStart_Click" Background="#00F5FF" FontSize="30" Grid.RowSpan="2" />
|
||||
|
||||
|
||||
|
||||
<!--<TextBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="Denomination" IsReadOnly="True" Text ="Denomination" TextWrapping="Wrap" FontSize="25" BorderBrush="White" Padding="30,0"/>-->
|
||||
|
||||
<TextBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="Denomination" IsReadOnly="True" Text="Mệnh giá" TextWrapping="Wrap" FontSize="20" Padding="90,5" BorderBrush="White" />
|
||||
|
||||
<TextBox Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi0" IsReadOnly="True" Text="500đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi1" IsReadOnly="True" Text="1.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi2" IsReadOnly="True" Text="2.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="5" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi3" IsReadOnly="True" Text="5.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="6" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi4" IsReadOnly="True" Text="10.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="7" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi5" IsReadOnly="True" Text="20.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="8" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi6" IsReadOnly="True" Text="50.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="9" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi7" IsReadOnly="True" Text="100.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="10" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi8" IsReadOnly="True" Text="200.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="11" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="denomi9" IsReadOnly="True" Text="500.000đ" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
|
||||
<!--Quantity of each Denomination -->
|
||||
|
||||
<TextBox Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi0" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi1" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="4" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi2" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="5" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi3" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="6" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi4" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="7" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi5" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="8" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi6" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="9" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi7" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="10" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi8" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="11" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="quantityDenomi9" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
|
||||
<!--Total amount of each denomination-->
|
||||
|
||||
<TextBox Grid.Row="2" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi0" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="3" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi1" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="4" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi2" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="5" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi3" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="6" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi4" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="7" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi5" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="8" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi6" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="9" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi7" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="10" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi8" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
<TextBox Grid.Row="11" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="totalAmountQuantityDenomi9" IsReadOnly="True" TextWrapping="Wrap" FontSize="15" Padding="100,0" BorderBrush="White" />
|
||||
|
||||
<TextBox Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="Quantity" IsReadOnly="True" Text="Số lượng" TextWrapping="Wrap" FontSize="20" Padding="90,5" BorderBrush="White" />
|
||||
|
||||
<TextBox Grid.Row="1" Grid.Column="2" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="Total" IsReadOnly="True" Text="Tổng" TextWrapping="Wrap" FontSize="20" Padding="105,5" BorderBrush="White" />
|
||||
|
||||
<TextBox Grid.Row="12" Grid.Column="0" Grid.ColumnSpan="1" Grid.RowSpan="1" x:Name="txtFixed" IsReadOnly="True" Text ="Tổng tiền" TextWrapping="Wrap" FontSize="30" Padding="80,10" BorderBrush="White" />
|
||||
|
||||
<TextBox Grid.Row="12" Grid.Column="2" Grid.RowSpan="1" x:Name="txtTotalMoney" IsReadOnly="True" TextWrapping="Wrap" FontSize="30" Padding="90,10" BorderBrush="White" />
|
||||
</Grid>
|
||||
|
||||
</hc:Window>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
<UserControl x:Class="SafeBagDE70.InformationUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<hc:SimpleStackPanel Background="White" VerticalAlignment="Center" Margin="20">
|
||||
<hc:HighlightTextBlock x:Name="lblInfor" FontSize="30" TextWrapping="Wrap" FontWeight="Bold" Foreground="Blue" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<Grid Margin="10">
|
||||
<Button Width="200" x:Name="btnEnd" Click="btnEnd_Click" Grid.Column="0" Style="{StaticResource ButtonPrimary}" Content="TIẾP TỤC" Height="50"/>
|
||||
</Grid>
|
||||
</hc:SimpleStackPanel>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,129 @@
|
||||
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Newtonsoft.Json;
|
||||
using SafeBagDE70.Admin;
|
||||
using SafeBagDE70.Model;
|
||||
using SafeBagDE70.StateMachine;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Forms;
|
||||
using VirtualKeyboard.Wpf;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for App.xaml
|
||||
/// </summary>
|
||||
public partial class App : System.Windows.Application
|
||||
{
|
||||
public static StateMachineConfig StateMachineConfig { get; private set; }
|
||||
private static Mutex mutex;
|
||||
public App()
|
||||
{
|
||||
}
|
||||
protected override void OnStartup(StartupEventArgs e)
|
||||
{
|
||||
base.OnStartup(e);
|
||||
|
||||
CheckInstance();
|
||||
LoadConfig();
|
||||
LoadDualScreens();
|
||||
}
|
||||
private static void CheckInstance()
|
||||
{
|
||||
bool isNewInstance;
|
||||
string mutexName = "9f5b55c9-c6eb-443a-8e28-027defa46fb5";
|
||||
|
||||
mutex = new Mutex(true, mutexName, out isNewInstance);
|
||||
|
||||
if (!isNewInstance)
|
||||
{
|
||||
// If an instance is already running, exit the application
|
||||
System.Windows.MessageBox.Show("Ứng dụng đã khởi chạy");
|
||||
System.Windows.Application.Current.Shutdown();
|
||||
return;
|
||||
}
|
||||
}
|
||||
private static void LoadConfig()
|
||||
{
|
||||
try
|
||||
{
|
||||
AppData.CurrentVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
||||
VKeyboard.Listen<System.Windows.Controls.TextBox>(e => e.Text);
|
||||
var configuration = new ConfigurationBuilder()
|
||||
.AddJsonFile("appsettings.json")
|
||||
.Build();
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.ReadFrom.Configuration(configuration)
|
||||
.WriteTo.Sink(new RealTimeLogSink())
|
||||
.CreateLogger();
|
||||
AppData.CDMPort = configuration["SerialPort:CDMPort"];
|
||||
AppData.SensorPort = configuration["SerialPort:SensorPort"];
|
||||
StateMachineConfig = new StateMachineConfig();
|
||||
configuration.GetSection("StateMachine").Bind(StateMachineConfig);
|
||||
Log.Information("START APP");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
System.Windows.MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
private void LoadDualScreens()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Create instances of the windows you want to open
|
||||
var mainWindow = new MainWindow();
|
||||
|
||||
// Show both windows
|
||||
mainWindow.Show();
|
||||
|
||||
// Get all available screens
|
||||
var screens = Screen.AllScreens;
|
||||
|
||||
// Open the Main Window on the primary screen
|
||||
var primaryScreen = screens.FirstOrDefault(s => s.Primary) ?? screens.First();
|
||||
PositionWindowOnScreen(mainWindow, primaryScreen);
|
||||
mainWindow.Show();
|
||||
|
||||
// Open the Secondary Window on the secondary screen, if available
|
||||
if (screens.Length > 1)
|
||||
{
|
||||
var adminWindow = new AdminWindow(); // Replace this with your actual window class
|
||||
adminWindow.Show();
|
||||
var secondaryScreen = screens.First(s => !s.Primary);
|
||||
PositionWindowOnScreen(adminWindow, secondaryScreen);
|
||||
adminWindow.Show();
|
||||
}
|
||||
}catch (Exception ex)
|
||||
{
|
||||
Log.Fatal(ex,"START APP");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void PositionWindowOnScreen(Window window, Screen screen)
|
||||
{
|
||||
// Convert screen bounds to WPF units (96 DPI)
|
||||
var screenLeft = screen.WorkingArea.Left / (double)Screen.PrimaryScreen.WorkingArea.Width * SystemParameters.PrimaryScreenWidth;
|
||||
var screenTop = screen.WorkingArea.Top / (double)Screen.PrimaryScreen.WorkingArea.Height * SystemParameters.PrimaryScreenHeight;
|
||||
|
||||
// Set window position and state
|
||||
window.WindowStartupLocation = WindowStartupLocation.Manual;
|
||||
window.Left = screenLeft;
|
||||
window.Top = screenTop;
|
||||
window.Width = screen.WorkingArea.Width;
|
||||
window.Height = screen.WorkingArea.Height;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
// <autogenerated />
|
||||
using System;
|
||||
using System.Reflection;
|
||||
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "0AU11qKXzf8=",
|
||||
"success": true,
|
||||
"projectFilePath": "D:\\SRC\\VirtualKeyboard\\VirtualKeyboard.csproj",
|
||||
"expectedPackageFiles": [],
|
||||
"logs": []
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,279 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for MainWindow.xaml
|
||||
/// </summary>
|
||||
///
|
||||
|
||||
//public class CountSession
|
||||
//{
|
||||
// public int[] QuantityDenomi { get; set; }
|
||||
// public int[] SumDenomi { get; set; }
|
||||
|
||||
//}
|
||||
public partial class MainWindow : HandyControl.Controls.Window
|
||||
{
|
||||
SerialPort serialPort = new SerialPort();
|
||||
|
||||
private int[] denominations = { 500000, 200000, 100000, 50000, 20000, 10000, 5000, 2000, 1000, 500 };
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
public MainWindow()
|
||||
{
|
||||
|
||||
InitializeComponent();
|
||||
|
||||
serialPort.PortName = "COM3";
|
||||
serialPort.BaudRate = 9600;
|
||||
serialPort.Parity = Parity.Even;
|
||||
serialPort.DataBits = 8;
|
||||
serialPort.StopBits = StopBits.One;
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
|
||||
serialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
|
||||
|
||||
//serialPort.Open();
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
|
||||
|
||||
public int totalAllDenominations = 0;
|
||||
|
||||
public int flag = 0;
|
||||
|
||||
|
||||
public string hexReceivedString = "";
|
||||
|
||||
public void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
|
||||
{
|
||||
int bytesToRead = serialPort.BytesToRead;
|
||||
byte[] receivedBytes = new byte[bytesToRead];
|
||||
serialPort.Read(receivedBytes, 0, bytesToRead);
|
||||
|
||||
|
||||
//Convert to hex string
|
||||
|
||||
|
||||
string newHexString = BitConverter.ToString(receivedBytes).Replace("-", " ");
|
||||
|
||||
hexReceivedString = newHexString;
|
||||
|
||||
|
||||
}
|
||||
public async void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
string deSenseExpectedString0 = "10 02 30 38 34 60 40 07 41 00 01 00 00 00 00 00 00 10 10 00 00 00 00 00 F0 12";
|
||||
string deSenseExpectedString1 = "10 02 30 38 34 60 40 07 41 00 01 00 00 00 00 00 00 10 10 00 00 01 00 01 F0 12";
|
||||
string deSenseExpectedString2 = "10 02 30 38 34 60 40 07 41 00 01 00 00 00 00 00 00 10 10 00 00 02 00 02 F0 12";
|
||||
string deSenseExpectedString3 = "10 02 30 38 34 60 40 07 41 00 01 00 00 00 00 00 00 10 10 00 00 03 00 03 F0 12";
|
||||
string deSenseExpectedString4 = "10 02 30 38 34 60 40 07 41 00 01 00 00 00 00 00 00 10 10 00 00 04 00 04 F0 12";
|
||||
string deSenseExpectedString5 = "10 02 30 38 34 60 40 07 41 00 01 00 00 00 00 00 00 10 10 00 00 05 00 05 F0 12";
|
||||
|
||||
|
||||
var countStart = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x73, 0x10, 0x03, 0x41 };
|
||||
serialPort.Write(countStart, 0, countStart.Length);
|
||||
|
||||
await Task.Delay(2500);
|
||||
|
||||
|
||||
|
||||
//int[] quantityValues = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
//int[] sessions[sessions.Count - 1].SumDenomi = new int[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
|
||||
|
||||
|
||||
var deSense = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x60, 0x10, 0x03, 0x52 };
|
||||
|
||||
serialPort.Write(deSense, 0, deSense.Length);
|
||||
|
||||
await Task.Delay(300);
|
||||
|
||||
if (hexReceivedString.Contains(deSenseExpectedString0) || hexReceivedString.Contains(deSenseExpectedString1) || hexReceivedString.Contains(deSenseExpectedString2) || hexReceivedString.Contains(deSenseExpectedString3) || hexReceivedString.Contains(deSenseExpectedString4) || hexReceivedString.Contains(deSenseExpectedString5))
|
||||
{
|
||||
//Hexa string data received process
|
||||
string[] hexValues = hexReceivedString.Split(' ');
|
||||
|
||||
|
||||
int[] values = new int[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
values[i] = Convert.ToInt32(hexValues[i], 16);
|
||||
}
|
||||
|
||||
//Take amount of each denomination
|
||||
|
||||
sessions[0].QuantityDenomi = values.Skip(26).Take(10).ToArray();
|
||||
|
||||
//Total money of each denomination.
|
||||
|
||||
|
||||
for (int i = 0; i < sessions[0].QuantityDenomi.Length; i++)
|
||||
{
|
||||
sessions[sessions.Count - 1].SumDenomi[i] = sessions[sessions.Count - 1].QuantityDenomi[i] * denominations[i];
|
||||
}
|
||||
//Total amount of each denomination
|
||||
|
||||
// Total money of all denominations
|
||||
totalAllDenominations = sessions[sessions.Count - 1].SumDenomi.Sum();
|
||||
|
||||
}
|
||||
|
||||
Dispatcher.Invoke(() =>
|
||||
{
|
||||
//Update UI
|
||||
txtTotalMoney.Text = totalAllDenominations.ToString();
|
||||
|
||||
quantityDenomi0.Text = sessions[sessions.Count - 1].QuantityDenomi[9].ToString();
|
||||
quantityDenomi1.Text = sessions[sessions.Count - 1].QuantityDenomi[8].ToString();
|
||||
quantityDenomi2.Text = sessions[sessions.Count - 1].QuantityDenomi[7].ToString();
|
||||
quantityDenomi3.Text = sessions[sessions.Count - 1].QuantityDenomi[6].ToString();
|
||||
quantityDenomi4.Text = sessions[sessions.Count - 1].QuantityDenomi[5].ToString();
|
||||
quantityDenomi5.Text = sessions[sessions.Count - 1].QuantityDenomi[4].ToString();
|
||||
quantityDenomi6.Text = sessions[sessions.Count - 1].QuantityDenomi[3].ToString();
|
||||
quantityDenomi7.Text = sessions[sessions.Count - 1].QuantityDenomi[2].ToString();
|
||||
quantityDenomi8.Text = sessions[sessions.Count - 1].QuantityDenomi[1].ToString();
|
||||
quantityDenomi9.Text = sessions[sessions.Count - 1].QuantityDenomi[0].ToString();
|
||||
|
||||
totalAmountQuantityDenomi0.Text = sessions[sessions.Count - 1].SumDenomi[9].ToString();
|
||||
totalAmountQuantityDenomi1.Text = sessions[sessions.Count - 1].SumDenomi[8].ToString();
|
||||
totalAmountQuantityDenomi2.Text = sessions[sessions.Count - 1].SumDenomi[7].ToString();
|
||||
totalAmountQuantityDenomi3.Text = sessions[sessions.Count - 1].SumDenomi[6].ToString();
|
||||
totalAmountQuantityDenomi4.Text = sessions[sessions.Count - 1].SumDenomi[5].ToString();
|
||||
totalAmountQuantityDenomi5.Text = sessions[sessions.Count - 1].SumDenomi[4].ToString();
|
||||
totalAmountQuantityDenomi6.Text = sessions[sessions.Count - 1].SumDenomi[3].ToString();
|
||||
totalAmountQuantityDenomi7.Text = sessions[sessions.Count - 1].SumDenomi[2].ToString();
|
||||
totalAmountQuantityDenomi8.Text = sessions[sessions.Count - 1].SumDenomi[1].ToString();
|
||||
totalAmountQuantityDenomi9.Text = sessions[sessions.Count - 1].SumDenomi[0].ToString();
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//Xóa tiền đã đếm trong lần trước, cập nhật lại giao diện
|
||||
|
||||
|
||||
var check = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x76, 0x10, 0x03, 0x44 };
|
||||
serialPort.Write(check, 0, check.Length);
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var storeStart = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x75, 0x10, 0x03, 0x47 };
|
||||
serialPort.Write(storeStart, 0, storeStart.Length);
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string deSenseDataRev01 = "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 00 00 01 70 00 10 03 35";
|
||||
string deSenseDataRev02 = "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 01 00 02 70 00 10 03 37";
|
||||
string deSenseDataRev03 = "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 02 00 03 70 00 10 03 35";
|
||||
string deSenseDataRev04 = "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 03 00 04 70 00 10 03 33";
|
||||
string deSenseDataRev05 = "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 04 00 05 70 00 10 03 35";
|
||||
string deSenseDataRev00 = "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 05 00 00 70 00 10 03 31";
|
||||
|
||||
string[] deSenseDataRevSatisfy = { "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 05 00 05 70 00 10 03 34", "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 04 00 04 70 00 10 03 34", "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 03 00 03 70 00 10 03 34", "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 02 00 02 70 00 10 03 34", "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 01 00 01 70 00 10 03 34", "10 02 30 32 30 60 40 04 41 00 00 00 00 00 00 00 00 10 10 00 00 00 00 00 70 00 10 03 34" };
|
||||
|
||||
|
||||
var deSense = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x60, 0x10, 0x03, 0x52 };
|
||||
serialPort.Write(deSense, 0, deSense.Length);
|
||||
|
||||
Thread.Sleep(100);
|
||||
|
||||
if (hexReceivedString == deSenseDataRev01)
|
||||
{
|
||||
flag = 1;
|
||||
var eventDataFixed_1 = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x01, 0x10, 0x03, 0x54 };
|
||||
|
||||
serialPort.Write(eventDataFixed_1, 0, eventDataFixed_1.Length);
|
||||
} else if (hexReceivedString == deSenseDataRev02)
|
||||
{
|
||||
flag = 1;
|
||||
var eventDataFixed_2 = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x02, 0x10, 0x03, 0x57 };
|
||||
|
||||
serialPort.Write(eventDataFixed_2, 0, eventDataFixed_2.Length);
|
||||
}
|
||||
else if (hexReceivedString == deSenseDataRev03)
|
||||
{
|
||||
flag = 1;
|
||||
var eventDataFixed_3 = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x03, 0x10, 0x03, 0x56 };
|
||||
|
||||
serialPort.Write(eventDataFixed_3, 0, eventDataFixed_3.Length);
|
||||
}
|
||||
else if (hexReceivedString == deSenseDataRev04)
|
||||
{
|
||||
flag = 1;
|
||||
var eventDataFixed_4 = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x04, 0x10, 0x03, 0x51 };
|
||||
|
||||
serialPort.Write(eventDataFixed_4, 0, eventDataFixed_4.Length);
|
||||
}
|
||||
else if (hexReceivedString == deSenseDataRev05)
|
||||
{
|
||||
flag = 1;
|
||||
var eventDataFixed_5 = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x05, 0x10, 0x03, 0x50 };
|
||||
|
||||
serialPort.Write(eventDataFixed_5, 0, eventDataFixed_5.Length);
|
||||
}
|
||||
else if (hexReceivedString == deSenseDataRev00)
|
||||
{
|
||||
flag = 1;
|
||||
var eventDataFixed_0 = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x00, 0x10, 0x03, 0x55 };
|
||||
|
||||
serialPort.Write(eventDataFixed_0, 0, eventDataFixed_0.Length);
|
||||
} else if (deSenseDataRevSatisfy.Contains(hexReceivedString))
|
||||
{
|
||||
flag = 1;
|
||||
};
|
||||
|
||||
|
||||
if(flag == 1)
|
||||
{
|
||||
var start = new byte[] { 0x10, 0x02, 0x30, 0x31, 0x33, 0x70, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, 0x00, 0x10, 0x03, 0x48 }; //lock
|
||||
serialPort.Write(start, 0, start.Length);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
//Đặt lại tất cả , kết thúc phiên và sẵn sàng vào phiên mới
|
||||
|
||||
//int[] numbers = new int[] {1,2,3,4,5,6};
|
||||
//Array.Clear(numbers, 0, numbers.Length);
|
||||
var end = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x71, 0x10, 0x03, 0x43 };
|
||||
serialPort.Write(end, 0, end.Length);
|
||||
flag = 0;
|
||||
maxQuantitySheet = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using DE70_CMDv2;
|
||||
using SafeBagDE70.Services;
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class InformationUC : UserControl
|
||||
{
|
||||
private bool _bContinue = false;
|
||||
private bool _bPlaySound = false;
|
||||
private List<Control> _controls = null;
|
||||
public InformationUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowInfor(string strInfor, bool bContinue = false, bool bPlaySound=true,List<Control> controls=null)
|
||||
{
|
||||
lblInfor.Text = strInfor;
|
||||
_bContinue = bContinue;
|
||||
_bPlaySound = bPlaySound;
|
||||
_controls = controls;
|
||||
if (_bPlaySound)
|
||||
SoundManager.StartWarningSound();
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(_controls!=null)
|
||||
{
|
||||
foreach (var item in _controls)
|
||||
{
|
||||
item.IsEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(_bContinue)
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen(false);
|
||||
else
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppData.cCmdRsp != null)
|
||||
AppData.cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v8.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v8.0": {}
|
||||
},
|
||||
"libraries": {}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<hc:Window x:Class="SafeBagDE70.WelcomeWindow"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
ShowInTaskbar="False"
|
||||
ShowNonClientArea="False"
|
||||
IsFullScreen="True"
|
||||
Topmost="True"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
Title="WelcomeWindow" Height="600" Width="800">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Top Section -->
|
||||
<StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0">
|
||||
<Image Source="icon/logo.ico" Width="200" Height="200" Margin="0,10,0,10" Stretch="UniformToFill"/>
|
||||
<TextBlock Text="Xin chào! Hãy lựa chọn hình thức đăng nhập để tiếp tục" FontSize="24" FontWeight="Bold" TextAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Middle Section -->
|
||||
<Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Button hc:IconElement.Geometry="{StaticResource FullScreenGeometry}" Grid.Column="0" Grid.Row="0" x:Name="btnQRCodeLogin" Content="QR CODE" Width="200" Height="100" Margin="0,0,10,0" FontSize="20" FontWeight="Bold" Click="btnQRCodeLogin_Click"/>
|
||||
<Button Grid.Column="2" Grid.Row="0" x:Name="btnPinCodeLogin" Content="PIN CODE" Width="200" Height="100" Margin="10,0,0,0" Click="PinCodeButton_Click" FontSize="20" FontWeight="Bold"/>
|
||||
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="PinCodePanel">
|
||||
<PasswordBox x:Name="PinCodeBox" Width="300" Height="60" FontSize="20" HorizontalContentAlignment="Center" Margin="0,10,0,0"/>
|
||||
<TextBlock Text="Quên mã PIN?" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" Margin="0,5,0,0" MouseLeftButtonUp="ForgotPin_Click"/>
|
||||
<Button Content="Đăng nhập" Width="200" Height="40" Margin="0,10,0,0" Click="LoginButton_Click"/>
|
||||
<Label x:Name="lblPincodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="QrCodePanel">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Đưa QR Code của bạn vào đầu đọc" FontSize="20"/>
|
||||
<hc:LoadingCircle Background="Transparent" VerticalAlignment="Bottom" Width="50" Height="50" Margin="10"/>
|
||||
<Label x:Name="lblQRcodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<!-- Bottom Section -->
|
||||
<StackPanel Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<TextBlock Text="TRỢ GIÚP" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" MouseLeftButtonUp="Help_Click"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
</hc:Window>
|
||||
@@ -0,0 +1,13 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net8.0-windows
|
||||
build_property.TargetPlatformMinVersion = 7.0
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = VirtualKeyboard_dsmyrzi2_wpftmp
|
||||
build_property.ProjectDir = C:\Users\DELL Precision 7530\Desktop\Test\VK\VK\WPFKeyboard\VirtualKeyboard\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
@@ -0,0 +1,20 @@
|
||||
<UserControl x:ClassModifier="internal"
|
||||
x:Class="VirtualKeyboard.Wpf.Views.VirtualKeyboardView"
|
||||
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:VirtualKeyboard.Wpf"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<UserControl.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="../ResourceDictionaries/KeyboardCore.xaml"/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</UserControl.Resources>
|
||||
<Grid Background="{DynamicResource KeyboardBackgroundAccentBrush}">
|
||||
<ContentControl Content="{Binding KeyboardType, Converter={StaticResource KeyboardTypeConverter}}"/>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,19 @@
|
||||
<UserControl x:Class="SafeBagDE70.ErrorUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<hc:SimpleStackPanel Background="White" VerticalAlignment="Center" Margin="20">
|
||||
<hc:HighlightTextBlock FontSize="20" FontWeight="Bold" Foreground="Red" Text="ĐÃ XẢY RA LỖI" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<hc:HighlightTextBlock x:Name="lblError" FontSize="20" TextWrapping="Wrap" FontWeight="Bold" Foreground="Blue" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<Grid Margin="10">
|
||||
<Button Grid.Column="0" Style="{StaticResource ButtonPrimary}" Content="THỬ LẠI" Height="50"/>
|
||||
</Grid>
|
||||
</hc:SimpleStackPanel>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,31 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.7.34202.233
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SafeBagDE70", "SafeBagDE70.csproj", "{DCA4F90E-EB1C-4038-BEAC-73BC15158E05}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualKeyboard", "VirtualKeyboard\VirtualKeyboard.csproj", "{F7B9604B-FC5A-493E-98C1-38E54329E33F}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{DCA4F90E-EB1C-4038-BEAC-73BC15158E05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DCA4F90E-EB1C-4038-BEAC-73BC15158E05}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DCA4F90E-EB1C-4038-BEAC-73BC15158E05}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DCA4F90E-EB1C-4038-BEAC-73BC15158E05}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{F7B9604B-FC5A-493E-98C1-38E54329E33F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{F7B9604B-FC5A-493E-98C1-38E54329E33F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{F7B9604B-FC5A-493E-98C1-38E54329E33F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{F7B9604B-FC5A-493E-98C1-38E54329E33F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {471DAFF3-9038-41B5-8763-7F24A56B5F19}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
Binary file not shown.
@@ -0,0 +1,6 @@
|
||||
// <auto-generated/>
|
||||
global using global::System;
|
||||
global using global::System.Collections.Generic;
|
||||
global using global::System.Linq;
|
||||
global using global::System.Threading;
|
||||
global using global::System.Threading.Tasks;
|
||||
@@ -0,0 +1,95 @@
|
||||
using DE70_CMDv2;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
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 SafeBagDE70.Admin
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for AdminConfigurationUC.xaml
|
||||
/// </summary>
|
||||
public partial class AdminConfigurationUC : UserControl
|
||||
{
|
||||
public AdminConfigurationUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void btnResetCounter_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppData.cCmdRsp != null)
|
||||
{
|
||||
Log.Information("[ADMIN] reset counter");
|
||||
CCmdRsp cCmdRsp = AppData.cCmdRsp;
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
//Event fix
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
|
||||
var currentMode = cCmdRsp.GetLockParam().mode;
|
||||
cCmdRsp.GetLockParam().mode = Mode.MODE_COLLECTION;
|
||||
cCmdRsp.SendLock();
|
||||
Thread.Sleep(10000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] != recvData.dat[16])
|
||||
{
|
||||
Log.Information("[ADMIN] reset counter success");
|
||||
lblStatus.Text = "TRẠNG THÁI: KHỞI TẠO BỘ ĐẾM THÀNH CÔNG";
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
Task.Run(() =>
|
||||
{
|
||||
Thread.Sleep(2);
|
||||
lblStatus.Text = "";
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Information("[ADMIN] reset counter fail");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnOpenEscrow_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
Log.Information("[ADMIN] Do Check");
|
||||
var mainWindow = ((MainWindow)Application.Current.MainWindow);
|
||||
if (mainWindow!=null)
|
||||
mainWindow.DoCheck();
|
||||
}
|
||||
|
||||
private void btnGetCDMState_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.GetCDMState();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
is_global = true
|
||||
build_property.TargetFramework = net8.0-windows
|
||||
build_property.TargetPlatformMinVersion = 7.0
|
||||
build_property.UsingMicrosoftNETSdkWeb =
|
||||
build_property.ProjectTypeGuids =
|
||||
build_property.InvariantGlobalization =
|
||||
build_property.PlatformNeutralAssembly =
|
||||
build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = VirtualKeyboard_haw2ca4l_wpftmp
|
||||
build_property.ProjectDir = D:\SRC\VirtualKeyboard\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
@@ -0,0 +1,113 @@
|
||||
<UserControl x:Class="SafeBagDE70.DepositUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
Background="#9edaf7"
|
||||
Loaded="UserControl_Loaded"
|
||||
Unloaded="UserControl_Unloaded">
|
||||
<Border BorderThickness="1" BorderBrush="Gray" Margin="10">
|
||||
<Grid x:Name="gridMainPanel">
|
||||
<!--<ContentControl x:Name="MainContent" />-->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="*"/>
|
||||
<RowDefinition Height="40"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Border BorderThickness="0" BorderBrush="Gray">
|
||||
<StackPanel Grid.Row="0" hc:BorderElement.Circular="True">
|
||||
<Label Content="Vietinbank"
|
||||
Background="Transparent"
|
||||
Foreground="#1d619b"
|
||||
BorderThickness="0"
|
||||
FontWeight="Bold"
|
||||
FontSize="30"
|
||||
Height="50"/>
|
||||
|
||||
<Label HorizontalAlignment="Center"
|
||||
x:Name="lblUser"
|
||||
Background="Transparent"
|
||||
Foreground="White"
|
||||
BorderThickness="0"
|
||||
FontSize="20"
|
||||
FontWeight="Bold"
|
||||
Height="50"/>
|
||||
<Border BorderThickness="1" BorderBrush="Gray">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
</Border>
|
||||
</StackPanel>
|
||||
</Border>
|
||||
|
||||
<Grid Grid.Row="1" x:Name="gridMain" VerticalAlignment="Center" Margin="5" >
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="300"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="300"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<Grid Grid.Column="0">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<Button Grid.Row="0" HorizontalAlignment="Stretch" Content="BẮT ĐẦU" x:Name="btnStart" Click="btnStart_Click" FontSize="30" Height="80" />
|
||||
<Button Grid.Row="1" HorizontalAlignment="Stretch" Content="KẾT THÚC" x:Name="btnEnd" Click="btnEnd_Click" FontSize="30" Height="80"/>
|
||||
<Button Grid.Row="2" HorizontalAlignment="Stretch" Content="KT LẤY TÚI" x:Name="btnCollect" Click="btnCollect_Click" FontSize="30" Height="80"/>
|
||||
</Grid>
|
||||
<Grid Grid.Column="2">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
<RowDefinition Height="100"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Button Grid.Row="0" HorizontalAlignment="Stretch" Content="NỘP TIỀN" x:Name="btnCountStart" Click="btnCountStart_Click" FontSize="30" Height="80"/>
|
||||
<Button Grid.Row="1" HorizontalAlignment="Stretch" Content="KIỂM TRA" x:Name="btnCheck" Click="btnCheck_Click" FontSize="30" Height="80"/>
|
||||
<Button Grid.Row="2" HorizontalAlignment="Stretch" Content="LƯU TRỮ" x:Name="btnStoreStart" Click="btnStoreStart_Click" FontSize="30" Height="80" />
|
||||
</Grid>
|
||||
<Grid Grid.Column="1">
|
||||
<ListView HorizontalAlignment="Center" FontSize="30" Width="600" x:Name="lvCount" Style="{StaticResource ListViewBaseStyle}">
|
||||
<ListView.View>
|
||||
<GridView>
|
||||
<GridViewColumn Header="Mệnh giá"
|
||||
DisplayMemberBinding="{Binding Name}"
|
||||
Width="200"/>
|
||||
<GridViewColumn Header="Số lượng"
|
||||
DisplayMemberBinding="{Binding Quantity}"
|
||||
Width="200"/>
|
||||
<GridViewColumn Header="Thành tiền"
|
||||
DisplayMemberBinding="{Binding Value}"
|
||||
Width="200"/>
|
||||
</GridView>
|
||||
</ListView.View>
|
||||
<ListView.ItemContainerStyle>
|
||||
<Style TargetType="ListViewItem">
|
||||
<Setter Property="Padding" Value="0"/>
|
||||
<Setter Property="Margin" Value="0"/>
|
||||
<Setter Property="BorderBrush" Value="Gray"/>
|
||||
<Setter Property="BorderThickness" Value="0,0,0,1"/>
|
||||
</Style>
|
||||
</ListView.ItemContainerStyle>
|
||||
</ListView>
|
||||
</Grid>
|
||||
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Row="2">
|
||||
<Separator BorderThickness="2" BorderBrush="Gray"/>
|
||||
<Label Height="40" x:Name="lblStatus" Background="Transparent" BorderThickness="0" Foreground="Red" FontSize="20" Content="TRẠNG THÁI"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
</Border>
|
||||
</UserControl>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
<UserControl x:Class="SafeBagDE70.Admin.AdminMainUC"
|
||||
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:SafeBagDE70.Admin"
|
||||
d:DesignHeight="1024" d:DesignWidth="1280"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<!-- Define Rows and Columns -->
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50"/>
|
||||
<!-- Top Bar -->
|
||||
<RowDefinition Height="*"/>
|
||||
<!-- Main Content Area -->
|
||||
<RowDefinition Height="30"/>
|
||||
<!-- Footer -->
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="200"/>
|
||||
<!-- Sidebar -->
|
||||
<ColumnDefinition Width="*"/>
|
||||
<!-- Main Content Area -->
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<!-- Top Bar -->
|
||||
<StackPanel Grid.Row="0" Grid.ColumnSpan="2" Orientation="Horizontal" Background="Gray" Height="50">
|
||||
<TextBlock Text="Admin Panel" VerticalAlignment="Center" Margin="10" Foreground="White" FontSize="20"/>
|
||||
<Button Content="Log Out"
|
||||
HorizontalAlignment="Right"
|
||||
Margin="0,0,10,0"
|
||||
Click="LogoutButton_Click"
|
||||
Background="Red"
|
||||
Foreground="White" Width="100"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Sidebar -->
|
||||
<StackPanel Grid.Row="1" Grid.Column="0" Background="LightGray" VerticalAlignment="Top">
|
||||
<Button
|
||||
Content="Dashboard"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Click="DashboardButton_Click"/>
|
||||
<Button
|
||||
Content="User Management"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Click="UserManagementButton_Click"/>
|
||||
<Button
|
||||
Content="Settings"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Click="SettingsButton_Click"/>
|
||||
<Button
|
||||
Content="Reports"
|
||||
HorizontalAlignment="Stretch"
|
||||
Height="40"
|
||||
Margin="10"
|
||||
Padding="10"
|
||||
Click="ReportsButton_Click"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Main Content Area -->
|
||||
<ContentControl Grid.Row="1" Grid.Column="1" x:Name="MainContentControl" Margin="10"/>
|
||||
|
||||
<!-- Footer -->
|
||||
<StackPanel Grid.Row="2" Grid.ColumnSpan="2" Orientation="Horizontal" Background="Gray" Height="30">
|
||||
<TextBlock Text="Admin Panel - Version 1.0" VerticalAlignment="Center" Margin="10" Foreground="White"/>
|
||||
<TextBlock Text="Status: Connected" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="0,0,10,0" Foreground="Green"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</UserControl>
|
||||
@@ -0,0 +1,19 @@
|
||||
<hc:Window x:Class="SafeBagDE70.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:local="clr-namespace:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
Title="MainWindow" Height="465" Width="810"
|
||||
ShowInTaskbar="False"
|
||||
ShowNonClientArea="False"
|
||||
IsFullScreen="True">
|
||||
<Grid>
|
||||
<ContentControl Name="MainContentControl"/>
|
||||
</Grid>
|
||||
</hc:Window>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
4a056bf95b46531a2877476e4e0992b8c717c7956a532dafc823bd29f67e8c0f
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -0,0 +1,56 @@
|
||||
using DE70_CMDv2;
|
||||
using SafeBagDE70.Services;
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class MaintainanceUC : UserControl
|
||||
{
|
||||
private bool _bContinue = false;
|
||||
private bool _bPlaySound = false;
|
||||
public MaintainanceUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowInfor(string strInfor, bool bContinue = false, bool bPlaySound=true)
|
||||
{
|
||||
lblInfor.Text = strInfor;
|
||||
_bContinue = bContinue;
|
||||
_bPlaySound = bPlaySound;
|
||||
if (_bPlaySound)
|
||||
SoundManager.StartWarningSound();
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if(_bContinue)
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen(false);
|
||||
else
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
|
||||
private void btnCancel_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (AppData.cCmdRsp != null)
|
||||
AppData.cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
SoundManager.StopWarningSound();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,909 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
using SafeBagDE70.Model;
|
||||
using HandyControl.Tools;
|
||||
using System.Drawing.Printing;
|
||||
using System.Drawing;
|
||||
using static HandyControl.Tools.Interop.InteropValues;
|
||||
using SafeBagDE70.API;
|
||||
using Newtonsoft.Json;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using DE70_CMDv2;
|
||||
using System.Configuration;
|
||||
|
||||
|
||||
namespace SafeBagDE70
|
||||
{ //Summary
|
||||
|
||||
|
||||
public partial class DepositUC : UserControl
|
||||
{
|
||||
SerialPort serialPortDE70 = new SerialPort();
|
||||
SerialPort serialPortSensor= new SerialPort();
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
ObservableCollection<LvCountItem> lvCountItems = new ObservableCollection<LvCountItem>();
|
||||
private DispatcherTimer timer;
|
||||
private DispatcherTimer sensorTimer;
|
||||
|
||||
int countTimer = 0;
|
||||
CCmdRsp cCmdRsp = null;
|
||||
bool bInitialized = false;
|
||||
|
||||
|
||||
public DepositUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
}
|
||||
|
||||
private void UserControl_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
InitTransaction();
|
||||
|
||||
}
|
||||
public void InitTransaction()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (AppData.IsAuthenticated)
|
||||
{
|
||||
lblUser.Content = $"Xin chào khách hàng: {AppData.CurrentCustomerAccount.Name} (Gian hàng {AppData.CurrentCustomerAccount.CustomerId})";
|
||||
}
|
||||
|
||||
// LoginUsingQRCode();
|
||||
if (serialPortDE70.IsOpen) serialPortDE70.Close();
|
||||
if (serialPortSensor.IsOpen) serialPortSensor.Close();
|
||||
|
||||
serialPortDE70.ReadBufferSize = 4096;
|
||||
serialPortDE70.WriteBufferSize = 4096;
|
||||
cCmdRsp = new CCmdRsp(serialPortDE70);
|
||||
AppData.cCmdRsp = cCmdRsp;
|
||||
|
||||
serialPortDE70.PortName = "COM4";
|
||||
serialPortDE70.BaudRate = 9600;
|
||||
serialPortDE70.Parity = Parity.Even;
|
||||
serialPortDE70.DataBits = 8;
|
||||
serialPortDE70.StopBits = StopBits.One;
|
||||
serialPortDE70.ReadTimeout = 10000;
|
||||
serialPortDE70.WriteTimeout = 10000;
|
||||
|
||||
serialPortSensor.PortName = "COM3";
|
||||
serialPortSensor.BaudRate = 9600;
|
||||
serialPortSensor.Parity = Parity.None;
|
||||
serialPortSensor.DataBits = 8;
|
||||
serialPortSensor.StopBits = StopBits.One;
|
||||
serialPortSensor.ReadTimeout = 1000;
|
||||
serialPortSensor.WriteTimeout = 1000;
|
||||
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
if (!serialPortDE70.IsOpen)
|
||||
serialPortDE70.Open();
|
||||
|
||||
if (!serialPortSensor.IsOpen)
|
||||
serialPortSensor.Open();
|
||||
|
||||
bInitialized = InitSession();
|
||||
|
||||
timer = new DispatcherTimer();
|
||||
timer.Interval = new TimeSpan(0, 0, 10); //10 seconds
|
||||
timer.Tick += Timer_Tick;
|
||||
timer.Start();
|
||||
|
||||
sensorTimer = new DispatcherTimer();
|
||||
sensorTimer.Interval = new TimeSpan(0, 0, 1); //1 seconds
|
||||
sensorTimer.Tick += SensorTimer_Tick;
|
||||
sensorTimer.Start();
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError("LỖI CỔNG KẾT NỐI, VUI LÒNG KIỂM TRA LẠI CỔNG KẾT NỐI");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void EndTransaction()
|
||||
{
|
||||
try
|
||||
{
|
||||
AppData.IsInTransaction = false;
|
||||
if (timer != null)
|
||||
{
|
||||
timer.Tick -= Timer_Tick;
|
||||
timer.Stop();
|
||||
}
|
||||
if (sensorTimer != null)
|
||||
{
|
||||
sensorTimer.Tick -= SensorTimer_Tick;
|
||||
sensorTimer.Stop();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void SetStep(int step)
|
||||
{
|
||||
switch(step)
|
||||
{
|
||||
case 0:
|
||||
btnStart.IsEnabled = true;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = false;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 1:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled =false;
|
||||
break;
|
||||
case 2:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 3:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSessionCount()
|
||||
{
|
||||
if (lvCount.Items.Count == 11) {
|
||||
foreach(var item in lvCountItems)
|
||||
{
|
||||
item.Quantity = "0";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "1000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "2000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "5000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "10000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "20000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "50000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "100000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "200000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "Tổng",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems[10].Quantity = "0";
|
||||
lvCountItems[10].Value = "0";
|
||||
}
|
||||
|
||||
|
||||
lvCount.ItemsSource = lvCountItems;
|
||||
|
||||
//lvCountItems[0].Quantity = "10";
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
public int quantityStored = 0;
|
||||
public int totalAllDenominations = 0;
|
||||
public int posDenomi;
|
||||
public bool printerFlag = false;
|
||||
public static string? recvDataString;
|
||||
public int[] TempQuantity = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
public int[] TempNote = new int[5] { 0, 0, 0, 0, 0 };
|
||||
public int[] Notes = new int[5] { 0, 0, 0, 0, 0 };
|
||||
|
||||
private void SensorTimer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
GetSensorValue();
|
||||
if (AppData.IsInTransaction)
|
||||
{
|
||||
if (AppData.WDTCount == 30)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowTimeoutScreen();
|
||||
}
|
||||
else if (AppData.WDTCount == 60)
|
||||
{
|
||||
//Nhận tiền và Kết thúc
|
||||
StoreStart();
|
||||
EndSession();
|
||||
|
||||
((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
AppData.IsInTransaction = false;
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
AppData.WDTCount++;
|
||||
}
|
||||
else
|
||||
{
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Stopwatch watch = new Stopwatch();
|
||||
private void GetSensorValue()
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
int state = 0;
|
||||
if (serialPortSensor.IsOpen == true)
|
||||
{
|
||||
//serialPortSensor.DiscardInBuffer();
|
||||
//serialPortSensor.DiscardOutBuffer();
|
||||
|
||||
serialPortSensor.Write(new byte[] { (byte)'S', 13, 10 }, 0, 3);
|
||||
var buffer = new byte[16];
|
||||
|
||||
int n = serialPortSensor.Read(buffer, 0, buffer.Length);
|
||||
|
||||
|
||||
for (int i = 1; i < n - 1; i++)
|
||||
{
|
||||
if ((buffer[i] == 13) && (buffer[i + 1] == 10))
|
||||
{
|
||||
state = buffer[i - 1] - 48;
|
||||
if (bInitialized)
|
||||
{
|
||||
if (state != 0)
|
||||
gridMain.IsEnabled = false;
|
||||
else
|
||||
gridMain.IsEnabled = true;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
lblStatus.Content = "NGĂN KÉT: ĐÓNG, NGĂN TÚI: ĐÓNG";
|
||||
break;
|
||||
case 1:
|
||||
lblStatus.Content = "NGĂN KÉT: ĐÓNG, NGĂN TÚI: MỞ";
|
||||
break;
|
||||
case 2:
|
||||
lblStatus.Content = "NGĂN KÉT: MỞ, NGĂN TÚI: ĐÓNG";
|
||||
break;
|
||||
case 3:
|
||||
lblStatus.Content = "NGĂN KÉT: MỞ, NGĂN TÚI: MỞ";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// the code that you want to measure comes here
|
||||
watch.Stop();
|
||||
|
||||
var elapsedMs = watch.ElapsedMilliseconds;
|
||||
Debug.WriteLine(elapsedMs);
|
||||
watch.Start();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException("GetSensorValue", ex.ToString());
|
||||
if(serialPortSensor.IsOpen)
|
||||
serialPortSensor.Close();
|
||||
serialPortSensor.Open();
|
||||
serialPortSensor.DiscardInBuffer();
|
||||
serialPortSensor.DiscardOutBuffer();
|
||||
}
|
||||
}
|
||||
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
|
||||
APIModels.SendHealthCheck();
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
public int UpdateTotalQuantity()
|
||||
{
|
||||
int total = 0;
|
||||
foreach (var item in lvCountItems)
|
||||
{
|
||||
if (item.Name != "Tổng")
|
||||
{
|
||||
int quantity = 0;
|
||||
if (int.TryParse(item.Quantity, out quantity))
|
||||
{
|
||||
total += quantity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
public int AutoSerialGet(SerialPort serialPort)
|
||||
{
|
||||
int ret;
|
||||
ushort seri_num = 0;
|
||||
ushort get_num = 0;
|
||||
bool endflg = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
ret = cCmdRsp.SendSerialSense();
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
ret = cCmdRsp.GetSerialNum(out seri_num);
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
// Serial number acquisition
|
||||
|
||||
if (cCmdRsp.ChkCntEnd())
|
||||
{
|
||||
endflg = true;
|
||||
Debug.WriteLine("END FLAG: "+cCmdRsp.recv_dat.dat[1]);
|
||||
}
|
||||
Debug.WriteLine("START");
|
||||
Debug.WriteLine($"Num Serial: {seri_num}");
|
||||
|
||||
while (get_num < seri_num)
|
||||
{
|
||||
get_num++;
|
||||
ret = cCmdRsp.SendGetSerial(get_num);
|
||||
|
||||
|
||||
switch (cCmdRsp.recv_dat.dat[18])
|
||||
{
|
||||
case 0x00: TempNote[0] ++; Notes[0] += TempNote[0]; break;
|
||||
case 0x02:
|
||||
//TempNote[1] ++;
|
||||
switch (cCmdRsp.recv_dat.dat[17])
|
||||
{
|
||||
case 0x00: TempQuantity[0]++; break;
|
||||
case 0x01: TempQuantity[1]++; break;
|
||||
case 0x02: TempQuantity[2]++; break;
|
||||
case 0x03: TempQuantity[3]++; break;
|
||||
case 0x04: TempQuantity[4]++; break;
|
||||
case 0x05: TempQuantity[5]++; break;
|
||||
case 0x06: TempQuantity[6]++; break;
|
||||
case 0x07: TempQuantity[7]++; break;
|
||||
case 0x08: TempQuantity[8]++; break;
|
||||
case 0x09: TempQuantity[9]++; break;
|
||||
|
||||
}
|
||||
break;
|
||||
case 0x03: TempNote[2] ++; Notes[2] += TempNote[2]; break;
|
||||
case 0x0b: TempNote[3] ++; Notes[3] += TempNote[3]; break;
|
||||
case 0x0c: TempNote[4] ++; Notes[4] += TempNote[4]; break;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine("END");
|
||||
//Debug.WriteLine("Ellapsed Time: " + timeSpan.TotalSeconds);
|
||||
if (endflg)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END GET SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END SEND SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
CountStart();
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
|
||||
private void CountStart()
|
||||
{
|
||||
printerFlag = false;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
try
|
||||
{
|
||||
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
AppData.LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CNTSTART);
|
||||
//var recvData = DE70_CMD.SendxxCmd((byte)CMD_BYTE.CMD_DE_CNTSTART, serialPort);
|
||||
|
||||
//Thread.Sleep(20000);
|
||||
if (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[2] != 43) { }
|
||||
do
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_SENSE);
|
||||
}
|
||||
while (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[1] == 0x09); //SR2 = 0x09 : Counting Status
|
||||
|
||||
//SR3 = 0x43 : Stacker full
|
||||
|
||||
AutoSerialGet(serialPortDE70);
|
||||
|
||||
if (sessions == null || sessions.Count == 0)
|
||||
{
|
||||
double tempSum = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
lvCountItems[i].Quantity = TempQuantity[9 - i].ToString();
|
||||
tempSum += lvCountItems[i].getValue();
|
||||
}
|
||||
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = tempSum.ToString();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
double sum = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
|
||||
}
|
||||
|
||||
a += TempQuantity[9 - i];
|
||||
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sum += lvCountItems[i].getValue();
|
||||
|
||||
}
|
||||
//Update amount of money
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sum.ToString();
|
||||
|
||||
}
|
||||
SetStep(2);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
AppData.LogAction(currentMethod, null);
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
double sumStored;
|
||||
|
||||
//TempNote[1] = 0;
|
||||
|
||||
if (sessions != null)
|
||||
{
|
||||
sumStored = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
//quantityStored += lvCountItems[i].getQuantity();
|
||||
}
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sumStored += lvCountItems[i].getValue();
|
||||
}
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sumStored.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
StoreStart();
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
|
||||
private void StoreStart()
|
||||
{
|
||||
printerFlag = true;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
AppData.LogAction(currentMethod, null);
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
sessions[sessions.Count - 1].QuantityDenomi = (int[])TempQuantity.Clone();
|
||||
quantityStored = UpdateTotalQuantity();
|
||||
|
||||
Debug.WriteLine(quantityStored);
|
||||
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_STORESTART);
|
||||
SetStep(3);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
InitSession();
|
||||
AppData.IsInTransaction= true;
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
AppData.LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_SENSE);
|
||||
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
SetStep(1);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
AppData.WDTCount = 0;
|
||||
}
|
||||
|
||||
private async void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.IsInTransaction = false;
|
||||
AppData.WDTCount = 0;
|
||||
EndSession();
|
||||
}
|
||||
|
||||
private void EndSession()
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
var totalQuantity = lvCountItems[10].Quantity;
|
||||
var totalValue = lvCountItems[10].Value;
|
||||
try
|
||||
{
|
||||
AppData.LogAction(currentMethod, null);
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
//SendData2Server
|
||||
var data2Send = new CountingData2Send
|
||||
{
|
||||
Sessions = sessions,
|
||||
MachineId = null,
|
||||
UserId = AppData.CurrentCustomerAccount.CustomerId,
|
||||
MachineTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
||||
RejectNotes = Notes[0],
|
||||
GenuineNotes = quantityStored,
|
||||
UnfitNotes = Notes[2],
|
||||
CounterfeitNotes = Notes[3],
|
||||
SuspendNotes = Notes[4]
|
||||
|
||||
};
|
||||
|
||||
SyncData(data2Send);
|
||||
//Reset all and ready to next session
|
||||
|
||||
if (printerFlag == true)
|
||||
{
|
||||
PrintReceipt();
|
||||
printerFlag = false;
|
||||
|
||||
}
|
||||
InitSession();
|
||||
//Debug.WriteLine("Reject Note: " + Notes[0] );
|
||||
//Debug.WriteLine("Genuine note stored: " + quantityStored);
|
||||
//Debug.WriteLine("Unfit note: " + Notes[2]);
|
||||
//Debug.WriteLine("Counterfeit: " + Notes[3]);
|
||||
//Debug.WriteLine("Suspend: " + Notes[4]);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
AppData.LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
|
||||
|
||||
String strNotify = $"BẠN VỪA THỰC HIỆN TIỀN VÀO MÁY CDM:\r\n"
|
||||
+ $"SỐ LƯỢNG TỜ: {totalQuantity}\r\n"
|
||||
+ $"SỐ TIỀN: {totalValue} VND\r\n";
|
||||
|
||||
((MainWindow)Application.Current.MainWindow).ShowInformationScreen(strNotify);
|
||||
}
|
||||
|
||||
private async Task SyncData(CountingData2Send data2Send)
|
||||
{
|
||||
var history = Save2DB(data2Send);
|
||||
bool bSuccess = await APIModels.SendCountingData(data2Send);
|
||||
if (bSuccess)
|
||||
{
|
||||
history.IsSent = true;
|
||||
Update2DB(history);
|
||||
}
|
||||
}
|
||||
|
||||
public History Save2DB(CountingData2Send data2Send)
|
||||
{
|
||||
var data = JsonConvert.SerializeObject(data2Send);
|
||||
var history = new History
|
||||
{
|
||||
Data = data,
|
||||
DepositTime = DateTime.Now,
|
||||
IsSent = false,
|
||||
UserCode = AppData.CurrentCustomerAccount.CustomerId
|
||||
};
|
||||
try
|
||||
{
|
||||
using (var db = new CDMDbContext())
|
||||
{
|
||||
|
||||
db.Histories.Add(history);
|
||||
db.SaveChanges();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
return history;
|
||||
}
|
||||
public History Update2DB(History history)
|
||||
{
|
||||
|
||||
try
|
||||
{
|
||||
using (var db = new CDMDbContext())
|
||||
{
|
||||
db.Histories.Update(history);
|
||||
db.SaveChanges();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
return history;
|
||||
}
|
||||
|
||||
private void ShowError(string strError)
|
||||
{
|
||||
//gridMain.IsEnabled = false;
|
||||
//btnCollect2.Visibility=Visibility.Collapsed;
|
||||
//panelError.Visibility = Visibility.Visible;
|
||||
//lblError.Text = strError;
|
||||
//((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
((MainWindow)Application.Current.MainWindow).ShowErrorScreen(strError);
|
||||
}
|
||||
|
||||
private bool InitSession()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Check status
|
||||
cCmdRsp.SendDeSense();
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
int IsCassetteFull = 0;
|
||||
int IsNotesInEscrow = 0;
|
||||
IsCassetteFull = data[17] & 0x08;
|
||||
IsNotesInEscrow = data[4] & 0x01;
|
||||
|
||||
if (IsCassetteFull != 0)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowCollectionScreen();
|
||||
return false;
|
||||
}
|
||||
else if (IsNotesInEscrow != 0)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowInformationScreen("ĐỀ NGHỊ BỎ TIỀN TRONG NGĂN PHỤ ĐỂ TIẾP TỤC");
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
sessions.Clear();
|
||||
Array.Clear(TempNote, 0, TempNote.Length);
|
||||
Array.Clear(Notes, 0, Notes.Length);
|
||||
quantityStored = 0;
|
||||
maxQuantitySheet = 0;
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
SetStep(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
AppData.LogException("InitSession", ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PrintReceipt()
|
||||
{
|
||||
var shopName = AppData.CurrentCustomerAccount.Name;
|
||||
var shopCode = AppData.CurrentCustomerAccount.CustomerId;
|
||||
var tradingCode = "TRA04052024CDM";
|
||||
var storeAccountNumber = 686868686688;
|
||||
var currentTime = DateTime.Now;
|
||||
var printDocument = new PrintDocument();
|
||||
|
||||
System.Drawing.Image LogoAeonMall = System.Drawing.Image.FromFile("Logo\\logoAeonmall.png");
|
||||
System.Drawing.Image LogoVietin = System.Drawing.Image.FromFile("Logo\\logoVietin.png");
|
||||
|
||||
printDocument.PrinterSettings.PrinterName = "CUSTOM K80";
|
||||
printDocument.PrintPage += (sender, e) =>
|
||||
{
|
||||
int fontSize = 8;
|
||||
int lineSpace = 20;
|
||||
float marginLeft = 25;
|
||||
float marginTop = 5;
|
||||
float width = 275;
|
||||
float height = 280;
|
||||
|
||||
float LogoAeonWidth = 90; // Chiều rộng của LogoAeon
|
||||
float LogoAeonHeight = 30; // Chiều cao của LogoAeon
|
||||
float LogoAeonX = marginLeft + 25; // Đặt LogoAeon ở giữa theo chiều ngang
|
||||
float LogoAeonY = marginTop + 10; // Khoảng cách từ mép trên của viền đến LogoAeon
|
||||
|
||||
float LogoVietinWidth = 90; // Chiều rộng của LogoVietin
|
||||
float LogoVietinHeight = 30; // Chiều cao của LogoVietin
|
||||
float LogoVietinX = marginLeft + 165; // Đặt LogoVietin ở giữa theo chiều ngang
|
||||
float LogoVietinY = marginTop + 10; // Khoảng cách từ mép trên của viền đến LogoVietin
|
||||
|
||||
e.Graphics.DrawImage(LogoVietin, LogoVietinX, LogoVietinY, LogoVietinWidth, LogoVietinHeight);
|
||||
e.Graphics.DrawImage(LogoAeonMall, LogoAeonX, LogoAeonY, LogoAeonWidth, LogoAeonHeight);
|
||||
|
||||
|
||||
e.Graphics.DrawImage(LogoVietin, LogoVietinX, LogoVietinY, LogoVietinWidth, LogoVietinHeight);
|
||||
e.Graphics.DrawImage(LogoAeonMall, LogoAeonX, LogoAeonY, LogoAeonWidth, LogoAeonHeight);
|
||||
|
||||
e.Graphics.DrawRectangle(new System.Drawing.Pen(System.Drawing.Color.Black, 1), marginLeft, marginTop, width, height);
|
||||
|
||||
|
||||
e.Graphics.DrawString("Biên nhận nộp tiền", new Font("Arial", 12, System.Drawing.FontStyle.Bold), System.Drawing.Brushes.Black, new PointF(80, 50));
|
||||
e.Graphics.DrawString("Mã máy CDM: ", new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 1 + 65));
|
||||
e.Graphics.DrawString("Thời gian giao dịch: " + currentTime.ToString("dd/MM/yyyy HH:mm:ss"), new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 2 + 65));
|
||||
e.Graphics.DrawString("Mã giao dịch: " + tradingCode, new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 3 + 65));
|
||||
e.Graphics.DrawString("Mã Gian hàng: " + shopCode, new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 4 + 65));
|
||||
e.Graphics.DrawString("Tên Gian hàng: " + shopName, new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 5 + 65));
|
||||
e.Graphics.DrawString("Số tài khoản gian hàng: " + storeAccountNumber, new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 6 + 65));
|
||||
e.Graphics.DrawString("Nội dung giao dịch: Nop doanh so tien mat_", new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 7 + 65));
|
||||
e.Graphics.DrawString(shopCode, new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 8 + 65));
|
||||
e.Graphics.DrawString("Số tiền nộp: " + lvCountItems[10].Value, new Font("Arial", fontSize), System.Drawing.Brushes.Black, new PointF(50, lineSpace * 9 + 65));
|
||||
e.Graphics.DrawString("*****Xin cám ơn*****", new Font("Arial", 7), System.Drawing.Brushes.Black, new PointF(120, lineSpace * 10 + 65));
|
||||
// To send raw ESC/POS commands, you'd typically use e.Graphics.DrawString() with the command string,
|
||||
// or for more complex scenarios, directly manipulate the byte stream sent to the printer.
|
||||
};
|
||||
printDocument.Print();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
EndTransaction();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 105 KiB |
@@ -0,0 +1,840 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
using SafeBagDE70.Model;
|
||||
using HandyControl.Tools;
|
||||
using System.Drawing.Printing;
|
||||
using System.Drawing;
|
||||
using static HandyControl.Tools.Interop.InteropValues;
|
||||
using SafeBagDE70.API;
|
||||
using Newtonsoft.Json;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using DE70_CMDv2;
|
||||
using System.Configuration;
|
||||
|
||||
|
||||
namespace SafeBagDE70
|
||||
{ //Summary
|
||||
public class CountSession
|
||||
{
|
||||
public CountSession() {
|
||||
for(int i= 0; i < QuantityDenomi.Count(); i++)
|
||||
{
|
||||
QuantityDenomi[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < SumDenomi.Count(); i++)
|
||||
{
|
||||
SumDenomi[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < TempNotes.Count(); i++)
|
||||
{
|
||||
TempNotes[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int[] QuantityDenomi { get; set; } = new int[10];
|
||||
public int[] SumDenomi { get; set; } = new int[10];
|
||||
public bool IsStored = false;
|
||||
public int[] TempNotes { get; set; } = new int[5];
|
||||
|
||||
}
|
||||
|
||||
public class CountingData2Send
|
||||
{
|
||||
public string? TransactionCode { get; set; }
|
||||
public List<CountSession>? Sessions { get; set; }
|
||||
public string? UserId { get; set; }
|
||||
public string? MachineId { get; set; }
|
||||
public string? MachineTime { get; set; }
|
||||
public int RejectNotes { get; set; }
|
||||
public int GenuineNotes { get; set; }
|
||||
public int UnfitNotes { get; set; }
|
||||
public int CounterfeitNotes { get; set; }
|
||||
public int SuspendNotes { get; set; }
|
||||
}
|
||||
|
||||
public partial class MainUserWindow : HandyControl.Controls.Window
|
||||
{
|
||||
SerialPort serialPortDE70 = new SerialPort();
|
||||
SerialPort serialPortSensor= new SerialPort();
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
ObservableCollection<LvCountItem> lvCountItems = new ObservableCollection<LvCountItem>();
|
||||
private DispatcherTimer timer;
|
||||
private DispatcherTimer sensorTimer;
|
||||
int countTimer = 0;
|
||||
CCmdRsp cCmdRsp = null;
|
||||
bool bInitialized = false;
|
||||
|
||||
public MainUserWindow()
|
||||
{
|
||||
//Need to update: auto detect COM Port
|
||||
try
|
||||
{
|
||||
InitializeComponent();
|
||||
//string queuePath = ConfigurationManager.AppSettings["SensorPort"].ToString();
|
||||
AppData.Init();
|
||||
//this.gridMain.IsEnabled = false;
|
||||
|
||||
|
||||
InitApp();
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError("LỖI CỔNG KẾT NỐI, VUI LÒNG KIỂM TRA LẠI CỔNG KẾT NỐI");
|
||||
//MessageBox.Show("Cổng đang mở, kiểm tra lại cổng kết nối");
|
||||
//this.Close();
|
||||
}
|
||||
}
|
||||
public void InitApp()
|
||||
{
|
||||
LoginUsingQRCode();
|
||||
panelError.Visibility = Visibility.Collapsed;
|
||||
|
||||
serialPortDE70.ReadBufferSize = 4096;
|
||||
serialPortDE70.WriteBufferSize = 4096;
|
||||
cCmdRsp = new CCmdRsp(serialPortDE70);
|
||||
|
||||
serialPortDE70.PortName = AppData.CDMPort;
|
||||
serialPortDE70.BaudRate = 9600;
|
||||
serialPortDE70.Parity = Parity.Even;
|
||||
serialPortDE70.DataBits = 8;
|
||||
serialPortDE70.StopBits = StopBits.One;
|
||||
|
||||
serialPortSensor.PortName = AppData.SensorPort;
|
||||
serialPortSensor.BaudRate = 9600;
|
||||
serialPortSensor.Parity = Parity.None;
|
||||
serialPortSensor.DataBits = 8;
|
||||
serialPortSensor.StopBits = StopBits.One;
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
|
||||
serialPortDE70.Open();
|
||||
serialPortSensor.Open();
|
||||
|
||||
bInitialized = InitSession();
|
||||
|
||||
timer = new DispatcherTimer();
|
||||
timer.Interval = new TimeSpan(0, 0, 10); //10 seconds
|
||||
timer.Tick += Timer_Tick;
|
||||
timer.Start();
|
||||
|
||||
sensorTimer = new DispatcherTimer();
|
||||
sensorTimer.Interval = new TimeSpan(0, 0, 1); //10 seconds
|
||||
sensorTimer.Tick += SensorTimer_Tick;
|
||||
sensorTimer.Start();
|
||||
}
|
||||
|
||||
public void ShutdownApp()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (serialPortDE70.IsOpen)
|
||||
serialPortDE70.Close();
|
||||
if (serialPortSensor.IsOpen)
|
||||
serialPortSensor.Close();
|
||||
|
||||
if (timer != null)
|
||||
{
|
||||
timer.Tick -= Timer_Tick;
|
||||
timer.Stop();
|
||||
}
|
||||
if (sensorTimer != null)
|
||||
{
|
||||
sensorTimer.Tick -= SensorTimer_Tick;
|
||||
sensorTimer.Stop();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void SetStep(int step)
|
||||
{
|
||||
switch(step)
|
||||
{
|
||||
case 0:
|
||||
btnStart.IsEnabled = true;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = false;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 1:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled =false;
|
||||
break;
|
||||
case 2:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 3:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSessionCount()
|
||||
{
|
||||
lvCountItems.Clear();
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "1000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "2000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "5000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "10000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "20000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "50000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "100000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "200000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "Tổng",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems[10].Quantity = "0";
|
||||
lvCountItems[10].Value = "0";
|
||||
|
||||
lvCount.ItemsSource = lvCountItems;
|
||||
|
||||
//lvCountItems[0].Quantity = "10";
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
public int quantityStored = 0;
|
||||
public int totalAllDenominations = 0;
|
||||
public int posDenomi;
|
||||
public bool printerFlag = false;
|
||||
public static string? recvDataString;
|
||||
public int[] TempQuantity = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
public int[] TempNote = new int[5] { 0, 0, 0, 0, 0 };
|
||||
public int[] Notes = new int[5] { 0, 0, 0, 0, 0 };
|
||||
|
||||
private void SensorTimer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
int state = 0;
|
||||
if (serialPortSensor.IsOpen==true)
|
||||
{
|
||||
serialPortSensor.Write(new byte[] { (byte)'S', 13, 10 }, 0, 3);
|
||||
var buffer = new byte[16];
|
||||
|
||||
int n = serialPortSensor.Read(buffer, 0, buffer.Length);
|
||||
|
||||
for (int i = 1; i < n - 1; i++)
|
||||
{
|
||||
if ((buffer[i] == 13) && (buffer[i + 1] == 10))
|
||||
{
|
||||
state = buffer[i - 1]-48;
|
||||
if(bInitialized)
|
||||
{
|
||||
if (state != 0)
|
||||
gridMain.IsEnabled = false;
|
||||
else
|
||||
gridMain.IsEnabled = true;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
lblStatus.Content = "Két: đóng, Túi: đóng";
|
||||
break;
|
||||
case 1:
|
||||
lblStatus.Content = "Két: đóng, Túi: đã bị lấy ra";
|
||||
break;
|
||||
case 2:
|
||||
lblStatus.Content = "Két: mở, Túi: đóng";
|
||||
break;
|
||||
case 3:
|
||||
lblStatus.Content = "Két: mở, Túi: đã bị lấy ra";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
|
||||
APIModels.SendHealthCheck();
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
public int UpdateTotalQuantity()
|
||||
{
|
||||
int total = 0;
|
||||
foreach (var item in lvCountItems)
|
||||
{
|
||||
if (item.Name != "Tổng")
|
||||
{
|
||||
int quantity = 0;
|
||||
if (int.TryParse(item.Quantity, out quantity))
|
||||
{
|
||||
total += quantity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
public int AutoSerialGet(SerialPort serialPort)
|
||||
{
|
||||
int ret;
|
||||
ushort seri_num = 0;
|
||||
ushort get_num = 0;
|
||||
bool endflg = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
ret = cCmdRsp.SendSerialSense();
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
ret = cCmdRsp.GetSerialNum(out seri_num);
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
// Serial number acquisition
|
||||
|
||||
if (cCmdRsp.ChkCntEnd())
|
||||
{
|
||||
endflg = true;
|
||||
Debug.WriteLine("END FLAG: "+cCmdRsp.recv_dat.dat[1]);
|
||||
}
|
||||
Debug.WriteLine("START");
|
||||
Debug.WriteLine($"Num Serial: {seri_num}");
|
||||
|
||||
while (get_num < seri_num)
|
||||
{
|
||||
get_num++;
|
||||
ret = cCmdRsp.SendGetSerial(get_num);
|
||||
|
||||
|
||||
switch (cCmdRsp.recv_dat.dat[18])
|
||||
{
|
||||
case 0x00: TempNote[0] ++; Notes[0] += TempNote[0]; break;
|
||||
case 0x02:
|
||||
//TempNote[1] ++;
|
||||
switch (cCmdRsp.recv_dat.dat[17])
|
||||
{
|
||||
case 0x00: TempQuantity[0]++; break;
|
||||
case 0x01: TempQuantity[1]++; break;
|
||||
case 0x02: TempQuantity[2]++; break;
|
||||
case 0x03: TempQuantity[3]++; break;
|
||||
case 0x04: TempQuantity[4]++; break;
|
||||
case 0x05: TempQuantity[5]++; break;
|
||||
case 0x06: TempQuantity[6]++; break;
|
||||
case 0x07: TempQuantity[7]++; break;
|
||||
case 0x08: TempQuantity[8]++; break;
|
||||
case 0x09: TempQuantity[9]++; break;
|
||||
|
||||
}
|
||||
break;
|
||||
case 0x03: TempNote[2] ++; Notes[2] += TempNote[2]; break;
|
||||
case 0x0b: TempNote[3] ++; Notes[3] += TempNote[3]; break;
|
||||
case 0x0c: TempNote[4] ++; Notes[4] += TempNote[4]; break;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine("END");
|
||||
//Debug.WriteLine("Ellapsed Time: " + timeSpan.TotalSeconds);
|
||||
if (endflg)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END GET SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END SEND SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = false;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
try
|
||||
{
|
||||
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CNTSTART);
|
||||
//var recvData = DE70_CMD.SendxxCmd((byte)CMD_BYTE.CMD_DE_CNTSTART, serialPort);
|
||||
|
||||
//Thread.Sleep(20000);
|
||||
if (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[2] != 43) { }
|
||||
do
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_SENSE);
|
||||
}
|
||||
while (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[1] == 0x09); //SR2 = 0x09 : Counting Status
|
||||
|
||||
//SR3 = 0x43 : Stacker full
|
||||
|
||||
AutoSerialGet(serialPortDE70);
|
||||
|
||||
if (sessions == null || sessions.Count == 0)
|
||||
{
|
||||
double tempSum = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
lvCountItems[i].Quantity = TempQuantity[9 - i].ToString();
|
||||
tempSum += lvCountItems[i].getValue();
|
||||
}
|
||||
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = tempSum.ToString();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
double sum = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
|
||||
}
|
||||
|
||||
a += TempQuantity[9 - i];
|
||||
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sum += lvCountItems[i].getValue();
|
||||
|
||||
}
|
||||
//Update amount of money
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sum.ToString();
|
||||
|
||||
}
|
||||
SetStep(2);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
double sumStored;
|
||||
|
||||
//TempNote[1] = 0;
|
||||
|
||||
if (sessions != null)
|
||||
{
|
||||
sumStored = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
//quantityStored += lvCountItems[i].getQuantity();
|
||||
}
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sumStored += lvCountItems[i].getValue();
|
||||
}
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sumStored.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = true;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
sessions[sessions.Count - 1].QuantityDenomi = (int[])TempQuantity.Clone();
|
||||
quantityStored = UpdateTotalQuantity();
|
||||
|
||||
Debug.WriteLine(quantityStored);
|
||||
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_STORESTART);
|
||||
SetStep(3);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
InitSession();
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_SENSE);
|
||||
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
SetStep(1);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
LogAction(currentMethod, null);
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
//SendData2Server
|
||||
var data2Send = new CountingData2Send
|
||||
{
|
||||
Sessions = sessions,
|
||||
MachineId = null,
|
||||
UserId = AppData.CurrentCustomerAccount.CustomerId,
|
||||
MachineTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
||||
RejectNotes = Notes[0],
|
||||
GenuineNotes = quantityStored,
|
||||
UnfitNotes = Notes[2],
|
||||
CounterfeitNotes = Notes[3],
|
||||
SuspendNotes = Notes[4]
|
||||
|
||||
};
|
||||
var str = JsonConvert.SerializeObject(data2Send);
|
||||
|
||||
APIModels.SendCountingData(data2Send);
|
||||
//Reset all and ready to next session
|
||||
|
||||
if(printerFlag == true)
|
||||
{
|
||||
PrintReceipt();
|
||||
printerFlag = false;
|
||||
|
||||
}
|
||||
InitSession();
|
||||
//Debug.WriteLine("Reject Note: " + Notes[0] );
|
||||
//Debug.WriteLine("Genuine note stored: " + quantityStored);
|
||||
//Debug.WriteLine("Unfit note: " + Notes[2]);
|
||||
//Debug.WriteLine("Counterfeit: " + Notes[3]);
|
||||
//Debug.WriteLine("Suspend: " + Notes[4]);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
LoginUsingQRCode();
|
||||
|
||||
}
|
||||
private void ShowError(string strError)
|
||||
{
|
||||
gridMain.IsEnabled = false;
|
||||
btnCollect2.Visibility=Visibility.Collapsed;
|
||||
panelError.Visibility = Visibility.Visible;
|
||||
lblError.Text = strError;
|
||||
}
|
||||
|
||||
private bool InitSession()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Check status
|
||||
cCmdRsp.SendDeSense();
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
int IsCassetteFull=data[17] & 0x08;
|
||||
if(IsCassetteFull != 0)
|
||||
{
|
||||
ShowError("TÚI ĐẦY, ĐỀ NGHỊ LẤY TÚI TRƯỚC KHI TIẾP TỤC THAO TÁC");
|
||||
btnCollect2.Visibility=Visibility.Visible;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
sessions.Clear();
|
||||
Array.Clear(TempNote, 0, TempNote.Length);
|
||||
Array.Clear(Notes, 0, Notes.Length);
|
||||
quantityStored = 0;
|
||||
maxQuantitySheet = 0;
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
SetStep(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
LogException("InitSession", ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PrintReceipt()
|
||||
{
|
||||
var shopName = AppData.CurrentCustomerAccount.Name;
|
||||
var shopCode = AppData.CurrentCustomerAccount.CustomerId;
|
||||
var tradingCode = "TRA04052024CDM";
|
||||
var storeAccountNumber = 686868686688;
|
||||
var currentTime = DateTime.Now;
|
||||
var printDocument = new PrintDocument();
|
||||
printDocument.PrinterSettings.PrinterName = "CUSTOM K80";
|
||||
printDocument.PrintPage += (sender, e) =>
|
||||
{
|
||||
e.Graphics.DrawString("Biên nhận nộp tiền", new Font("Arial", 15), System.Drawing.Brushes.Black, new PointF(80, 10));
|
||||
e.Graphics.DrawString("Mã máy CDM: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 60));
|
||||
e.Graphics.DrawString("Batch no: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 90));
|
||||
e.Graphics.DrawString("Thời gian GD: " + currentTime.ToString("dd/MM/yyyy HH:mm:ss"), new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 120));
|
||||
e.Graphics.DrawString("Mã GD: " + tradingCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 150));
|
||||
e.Graphics.DrawString("Mã gian hàng: " + shopCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 180));
|
||||
e.Graphics.DrawString("Tên gian hàng: " + shopName, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 210));
|
||||
e.Graphics.DrawString("STK gian hàng: " + storeAccountNumber, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 240));
|
||||
e.Graphics.DrawString("Số tiền nộp: " + lvCountItems[10].Value, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 270));
|
||||
e.Graphics.DrawString("*****Xin cám ơn******", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(100, 300));
|
||||
// To send raw ESC/POS commands, you'd typically use e.Graphics.DrawString() with the command string,
|
||||
// or for more complex scenarios, directly manipulate the byte stream sent to the printer.
|
||||
};
|
||||
printDocument.Print();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void LogAction(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("log.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
public void LogException(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("logException.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
private void LoginUsingQRCode()
|
||||
{
|
||||
var wnd = new WelcomeWindow();
|
||||
wnd.ShowDialog();
|
||||
|
||||
lblUser.Content = "";
|
||||
//var wnd = new QRCodeZebraWindow();
|
||||
//wnd.ShowDialog();
|
||||
if (wnd.DialogResult == true)
|
||||
{
|
||||
var strQR = wnd.QRCodeContent;
|
||||
var strPincode = wnd.PinCode;
|
||||
if (AppData.customerAccounts!=null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if(strQR!=null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == strQR).FirstOrDefault();
|
||||
}
|
||||
else if(strPincode!=null)
|
||||
{
|
||||
strPincode = strPincode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
lblUser.Content = $"Xin chào khách hàng: {cca.Name} (Gian hàng {cca.CustomerId})";
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("QRCode không đúng, vui lòng thử lại");
|
||||
LoginUsingQRCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnLoginByPINCode_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var wnd = new PinCodeWindow();
|
||||
wnd.ShowDialog();
|
||||
}
|
||||
|
||||
private void btnCollect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
//Event fix
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
|
||||
var currentMode = cCmdRsp.GetLockParam().mode;
|
||||
cCmdRsp.GetLockParam().mode = Mode.MODE_COLLECTION;
|
||||
cCmdRsp.SendLock();
|
||||
Thread.Sleep(10000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] != recvData.dat[16])
|
||||
{
|
||||
ShowError("Khởi tạo bộ đếm thành công");
|
||||
ShutdownApp();
|
||||
InitApp();
|
||||
}
|
||||
//Thread.Sleep(5000);
|
||||
//cCmdRsp.GetLockParam().mode = currentMode;
|
||||
//cCmdRsp.SendLock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
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 SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for CollectionUC.xaml
|
||||
/// </summary>
|
||||
public partial class ErrorUC : UserControl
|
||||
{
|
||||
public ErrorUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
public void ShowInfor(string strInfor)
|
||||
{
|
||||
lblError.Text = strInfor;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
using CoreScanner;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Automation;
|
||||
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 System.Xml;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WelcomeWindow.xaml
|
||||
/// </summary>
|
||||
public partial class WelcomeUC : UserControl
|
||||
{
|
||||
public string? QRCodeContent = null;
|
||||
public string? PinCode = null;
|
||||
public bool IsAuthenticated = false;
|
||||
public CCoreScannerClass? cCoreScannerClass=null;
|
||||
public WelcomeUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitQRCodeScanner();
|
||||
Loaded += WelcomeUC_Loaded;
|
||||
}
|
||||
|
||||
private void WelcomeUC_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
}
|
||||
|
||||
private void LoginButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string pin = PinCodeBox.Password;
|
||||
|
||||
if (ValidatePin(pin))
|
||||
{
|
||||
PinCode=PinCodeBox.Password.ToString();
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (PinCode != null)
|
||||
{
|
||||
var strPincode = PinCode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.IsAuthenticated=true;
|
||||
AppData.CurrentCustomerAccount=cca;
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
//DialogResult = true;
|
||||
//this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblPincodeError.Content = "PINCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Invalid PIN. Please try again.");
|
||||
}
|
||||
}
|
||||
|
||||
private void ForgotPin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Forgot PIN clicked.");
|
||||
}
|
||||
|
||||
private void Help_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Help clicked.");
|
||||
}
|
||||
|
||||
private bool ValidatePin(string pin)
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
private async void PinCodeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var onScreenKeyboardProcess = new ProcessStartInfo("osk.exe")
|
||||
{
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(onScreenKeyboardProcess);
|
||||
try
|
||||
{
|
||||
//var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
|
||||
//var keyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
|
||||
//Process.Start(keyboardPath);
|
||||
// AutomationElement.FromHandle(-1);
|
||||
|
||||
// string keyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
|
||||
// Process.Start(keyboardPath);
|
||||
//await Launcher.LaunchUriAsync(new Uri("ms-inputapp://"));
|
||||
|
||||
//var onScreenKeyboardProcess = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
|
||||
//{
|
||||
// UseShellExecute = true
|
||||
//};
|
||||
//Process.Start(onScreenKeyboardProcess);
|
||||
|
||||
QrCodePanel.Visibility = Visibility.Collapsed;
|
||||
PinCodePanel.Visibility = Visibility.Visible;
|
||||
|
||||
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
private void btnQRCodeLogin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
PinCodePanel.Visibility = Visibility.Collapsed;
|
||||
QrCodePanel.Visibility=Visibility.Visible;
|
||||
cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
|
||||
|
||||
}
|
||||
public void InitQRCodeScanner()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Instantiate CoreScanner Class
|
||||
cCoreScannerClass = new CCoreScannerClass();
|
||||
|
||||
// Call Open API
|
||||
short[] scannerTypes = new short[1]; // Scanner Types you are interested in
|
||||
scannerTypes[0] = 1; // 1 for all scanner types
|
||||
short numberOfScannerTypes = 1; // Size of the scannerTypes array
|
||||
int status; // Extended API return code
|
||||
|
||||
cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
|
||||
|
||||
// Subscribe for barcode events in cCoreScannerClass
|
||||
|
||||
|
||||
// Let's subscribe for events
|
||||
int opcode = 1001; // Method for Subscribe events
|
||||
string outXML; // XML Output
|
||||
string inXML = "<inArgs>" +
|
||||
"<cmdArgs>" +
|
||||
"<arg-int>1</arg-int>" + // Number of events you want to subscribe
|
||||
"<arg-int>1</arg-int>" + // Comma separated event IDs
|
||||
"</cmdArgs>" +
|
||||
"</inArgs>";
|
||||
|
||||
cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Console.WriteLine("Something wrong please check... " + exp.Message);
|
||||
}
|
||||
}
|
||||
private void OnBarcodeEvent(short eventType, ref string pscanData)
|
||||
{
|
||||
string xmlString = pscanData;
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlString);
|
||||
|
||||
XmlNode rawDataNode = xmlDoc.SelectSingleNode("//datalabel");
|
||||
string rawDataHex = rawDataNode.InnerText.Trim();
|
||||
|
||||
QRCodeContent = HexStringToString(rawDataHex);
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
|
||||
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (QRCodeContent != null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == QRCodeContent).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
AppData.IsAuthenticated = true;
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblQRcodeError.Content = "QRCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
static string HexStringToString(string hexString)
|
||||
{
|
||||
string[] hexValues = hexString.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
byte[] bytes = new byte[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexValues[i], 16);
|
||||
}
|
||||
return Encoding.ASCII.GetString(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<UserControl x:Class="SafeBagDE70.TimeoutUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
d:DesignHeight="450" d:DesignWidth="800">
|
||||
<hc:SimpleStackPanel Background="White" VerticalAlignment="Center" Margin="20">
|
||||
<hc:HighlightTextBlock x:Name="lblInfor" Text="BẠN CÓ MUỐN TIẾP TỤC?" FontSize="20" TextWrapping="Wrap" FontWeight="Bold" Foreground="Blue" HorizontalAlignment="Center"/>
|
||||
<Separator/>
|
||||
<Grid Margin="10">
|
||||
<Button x:Name="btnEnd" Click="btnEnd_Click" Grid.Column="0" Style="{StaticResource ButtonPrimary}" Content="TIẾP TỤC" Height="50" Width="200"/>
|
||||
</Grid>
|
||||
</hc:SimpleStackPanel>
|
||||
</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 VirtualKeyboard.Wpf.Views
|
||||
{
|
||||
/// <summary>
|
||||
/// Logika interakcji dla klasy KeyboardValueView.xaml
|
||||
/// </summary>
|
||||
partial class KeyboardValueView : UserControl
|
||||
{
|
||||
public KeyboardValueView()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,229 @@
|
||||
using CoreScanner;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Automation;
|
||||
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 System.Xml;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WelcomeWindow.xaml
|
||||
/// </summary>
|
||||
public partial class WelcomeUC : UserControl
|
||||
{
|
||||
public string? QRCodeContent = null;
|
||||
public string? PinCode = null;
|
||||
public bool IsAuthenticated = false;
|
||||
public CCoreScannerClass? cCoreScannerClass=null;
|
||||
public WelcomeUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitQRCodeScanner();
|
||||
Loaded += WelcomeUC_Loaded;
|
||||
}
|
||||
|
||||
private void WelcomeUC_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
}
|
||||
public void Init()
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
AppData.CurrentCustomerAccount = null;
|
||||
lblPincodeError.Content = "";
|
||||
PinCodeBox.Text = "";
|
||||
}
|
||||
|
||||
private void LoginButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string pin = PinCodeBox.Text;
|
||||
|
||||
if (ValidatePin(pin))
|
||||
{
|
||||
PinCode=PinCodeBox.Text.ToString();
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (PinCode != null)
|
||||
{
|
||||
var strPincode = PinCode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.IsAuthenticated=true;
|
||||
AppData.CurrentCustomerAccount=cca;
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
//DialogResult = true;
|
||||
//this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblPincodeError.Content = "PINCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Invalid PIN. Please try again.");
|
||||
}
|
||||
}
|
||||
|
||||
private void ForgotPin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Forgot PIN clicked.");
|
||||
}
|
||||
|
||||
private void Help_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Help clicked.");
|
||||
}
|
||||
|
||||
private bool ValidatePin(string pin)
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
private async void PinCodeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var onScreenKeyboardProcess = new ProcessStartInfo("osk.exe")
|
||||
{
|
||||
UseShellExecute = true
|
||||
};
|
||||
try
|
||||
{
|
||||
//var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
|
||||
//var keyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
|
||||
//Process.Start(keyboardPath);
|
||||
// AutomationElement.FromHandle(-1);
|
||||
|
||||
// string keyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
|
||||
// Process.Start(keyboardPath);
|
||||
//await Launcher.LaunchUriAsync(new Uri("ms-inputapp://"));
|
||||
|
||||
//var onScreenKeyboardProcess = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
|
||||
//{
|
||||
// UseShellExecute = true
|
||||
//};
|
||||
//Process.Start(onScreenKeyboardProcess);
|
||||
|
||||
QrCodePanel.Visibility = Visibility.Collapsed;
|
||||
PinCodePanel.Visibility = Visibility.Visible;
|
||||
|
||||
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
private void btnQRCodeLogin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
PinCodePanel.Visibility = Visibility.Collapsed;
|
||||
QrCodePanel.Visibility=Visibility.Visible;
|
||||
cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
|
||||
|
||||
}
|
||||
public void InitQRCodeScanner()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Instantiate CoreScanner Class
|
||||
cCoreScannerClass = new CCoreScannerClass();
|
||||
|
||||
// Call Open API
|
||||
short[] scannerTypes = new short[1]; // Scanner Types you are interested in
|
||||
scannerTypes[0] = 1; // 1 for all scanner types
|
||||
short numberOfScannerTypes = 1; // Size of the scannerTypes array
|
||||
int status; // Extended API return code
|
||||
|
||||
cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
|
||||
|
||||
// Subscribe for barcode events in cCoreScannerClass
|
||||
|
||||
|
||||
// Let's subscribe for events
|
||||
int opcode = 1001; // Method for Subscribe events
|
||||
string outXML; // XML Output
|
||||
string inXML = "<inArgs>" +
|
||||
"<cmdArgs>" +
|
||||
"<arg-int>1</arg-int>" + // Number of events you want to subscribe
|
||||
"<arg-int>1</arg-int>" + // Comma separated event IDs
|
||||
"</cmdArgs>" +
|
||||
"</inArgs>";
|
||||
|
||||
cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Console.WriteLine("Something wrong please check... " + exp.Message);
|
||||
}
|
||||
}
|
||||
private void OnBarcodeEvent(short eventType, ref string pscanData)
|
||||
{
|
||||
string xmlString = pscanData;
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlString);
|
||||
|
||||
XmlNode rawDataNode = xmlDoc.SelectSingleNode("//datalabel");
|
||||
string rawDataHex = rawDataNode.InnerText.Trim();
|
||||
|
||||
QRCodeContent = HexStringToString(rawDataHex);
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
|
||||
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (QRCodeContent != null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == QRCodeContent).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
AppData.IsAuthenticated = true;
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblQRcodeError.Content = "QRCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
static string HexStringToString(string hexString)
|
||||
{
|
||||
string[] hexValues = hexString.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
byte[] bytes = new byte[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexValues[i], 16);
|
||||
}
|
||||
return Encoding.ASCII.GetString(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
#pragma checksum "..\..\..\..\Views\KeyboardValueView.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "7CEB2F6BE0031A78F4843553F03A6F9656DD4608"
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// This code was generated by a tool.
|
||||
// Runtime Version:4.0.30319.42000
|
||||
//
|
||||
// Changes to this file may cause incorrect behavior and will be lost if
|
||||
// the code is regenerated.
|
||||
// </auto-generated>
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Windows;
|
||||
using System.Windows.Automation;
|
||||
using System.Windows.Controls;
|
||||
using System.Windows.Controls.Primitives;
|
||||
using System.Windows.Controls.Ribbon;
|
||||
using System.Windows.Data;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Ink;
|
||||
using System.Windows.Input;
|
||||
using System.Windows.Markup;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Media.Animation;
|
||||
using System.Windows.Media.Effects;
|
||||
using System.Windows.Media.Imaging;
|
||||
using System.Windows.Media.Media3D;
|
||||
using System.Windows.Media.TextFormatting;
|
||||
using System.Windows.Navigation;
|
||||
using System.Windows.Shapes;
|
||||
using System.Windows.Shell;
|
||||
using VirtualKeyboard.Wpf.Controls;
|
||||
using VirtualKeyboard.Wpf.Views;
|
||||
|
||||
|
||||
namespace VirtualKeyboard.Wpf.Views {
|
||||
|
||||
|
||||
internal partial class KeyboardValueView : System.Windows.Controls.UserControl, System.Windows.Markup.IComponentConnector {
|
||||
|
||||
private bool _contentLoaded;
|
||||
|
||||
/// <summary>
|
||||
/// InitializeComponent
|
||||
/// </summary>
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "8.0.7.0")]
|
||||
public void InitializeComponent() {
|
||||
if (_contentLoaded) {
|
||||
return;
|
||||
}
|
||||
_contentLoaded = true;
|
||||
System.Uri resourceLocater = new System.Uri("/VirtualKeyboard;component/views/keyboardvalueview.xaml", System.UriKind.Relative);
|
||||
|
||||
#line 1 "..\..\..\..\Views\KeyboardValueView.xaml"
|
||||
System.Windows.Application.LoadComponent(this, resourceLocater);
|
||||
|
||||
#line default
|
||||
#line hidden
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "8.0.7.0")]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
|
||||
internal System.Delegate _CreateDelegate(System.Type delegateType, string handler) {
|
||||
return System.Delegate.CreateDelegate(delegateType, this, handler);
|
||||
}
|
||||
|
||||
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
|
||||
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "8.0.7.0")]
|
||||
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
|
||||
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
|
||||
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
|
||||
this._contentLoaded = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
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 SafeBagDE70.Admin
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for AdminLoginUC.xaml
|
||||
/// </summary>
|
||||
public partial class AdminLoginUC : UserControl
|
||||
{
|
||||
public AdminLoginUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
private void LoginButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string username = UsernameTextBox.Text;
|
||||
string password = PasswordBox.Password;
|
||||
|
||||
// Simple authentication logic
|
||||
if (username == "admin" && password == "password") // Replace with actual logic
|
||||
{
|
||||
// Load Settings UserControl
|
||||
var mainWindow = (MainWindow)Window.GetWindow(this);
|
||||
//mainWindow.LoadUserControl(new SettingsUserControl());
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Invalid username or password.", "Login Failed", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
using DE70_CMDv2;
|
||||
using SafeBagDE70.Model;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
public static class AppData
|
||||
{
|
||||
public static string CDMPort = "COM4";
|
||||
public static string SensorPort = "COM3";
|
||||
public static Version? CurrentVersion = null;
|
||||
public static List<CustomerAccount>? customerAccounts = null;
|
||||
public static CustomerAccount? CurrentCustomerAccount{get;set;}
|
||||
public static CCmdRsp? cCmdRsp=null;
|
||||
public static bool IsAuthenticated = false;
|
||||
public static bool IsInTransaction = false;
|
||||
public static int WDTCount = 0;
|
||||
public static ObservableCollection<string> logCollection = new ObservableCollection<string>();
|
||||
public static ListView logListView = null;
|
||||
public static int MaxLogCount = 500;
|
||||
public static void Init()
|
||||
{
|
||||
|
||||
customerAccounts = new List<CustomerAccount>{
|
||||
new CustomerAccount{Name="NGUYỄN ĐÌNH THUẬN",CustomerId="HUE_0000000001",QRCode="HUE_0000000001",PINCode="H0001" },
|
||||
new CustomerAccount{Name="HOÀNG VĂN HIỆP",CustomerId="HUE_0000000002",QRCode="HUE_0000000002",PINCode="H0002" },
|
||||
new CustomerAccount{Name="PHẠM NGỌC HƯNG",CustomerId="HUE_0000000003",QRCode="HUE_0000000003",PINCode="H0003" },
|
||||
new CustomerAccount{Name="AMHUE-ESTELLETEST",CustomerId="00DZAMHUE0004",QRCode="00DZAMHUE0004",PINCode="H0004" },
|
||||
new CustomerAccount{Name="AMHUE-ECCOTEST",CustomerId="00DZAMHUE0005",QRCode="00DZAMHUE0005",PINCode="H0005" },
|
||||
new CustomerAccount{Name="AMHUE-ALDOTEST",CustomerId="00DZAMHUE0006",QRCode="00DZAMHUE0006",PINCode="H0006" },
|
||||
new CustomerAccount{Name="AMHUE-MLBTEST",CustomerId="00DZAMHUE0007",QRCode="00DZAMHUE0007",PINCode="H0007" },
|
||||
new CustomerAccount{Name="AMHUE-PEDROTEST",CustomerId="00DZAMHUE0008",QRCode="00DZAMHUE0008",PINCode="H0008" }
|
||||
};
|
||||
CurrentCustomerAccount = customerAccounts[0];
|
||||
}
|
||||
private static DateTime CutOffTime = new DateTime(1, 1, 1, 12, 0, 0); // 12:00 noon as cut-off time
|
||||
|
||||
public static void GetNewTransactionCode()
|
||||
{
|
||||
DateTime transactionDateTime = DateTime.Now;
|
||||
string merchantCode = CurrentCustomerAccount.CustomerId;
|
||||
|
||||
// Adjust transaction date if it's past cut-off time (12:00 noon)
|
||||
DateTime prevadjustedDate = CurrentCustomerAccount.TransactionTime.Hour >= CutOffTime.Hour ? transactionDateTime.Date : transactionDateTime.Date.AddDays(-1);
|
||||
|
||||
DateTime adjustedDate = transactionDateTime.Hour >= CutOffTime.Hour ? transactionDateTime.Date : transactionDateTime.Date.AddDays(-1);
|
||||
if ((adjustedDate - prevadjustedDate).Days > 0)
|
||||
{
|
||||
CurrentCustomerAccount.TransactionCount =1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentCustomerAccount.TransactionCount++;
|
||||
}
|
||||
var transactionCount = CurrentCustomerAccount.TransactionCount;
|
||||
string datePart = adjustedDate.ToString("yyyyMMdd");
|
||||
string timePart = transactionDateTime.ToString("HHmmss");
|
||||
string transactionCountPart = transactionCount.ToString("D2"); // Ensure 2 digits
|
||||
|
||||
// Combine all parts to form the transaction ID
|
||||
string transactionId = $"{datePart}{timePart}{merchantCode}{transactionCountPart}";
|
||||
|
||||
CurrentCustomerAccount.TransactionCode = transactionId;
|
||||
CurrentCustomerAccount.TransactionTime = transactionDateTime;
|
||||
}
|
||||
|
||||
}
|
||||
public class CustomerAccount
|
||||
{
|
||||
public string? Name { get; set; }
|
||||
public string? CustomerId { get; set; }
|
||||
public string? QRCode { get; set; }
|
||||
public string? PINCode { get; set; }
|
||||
public int TransactionCount { get; set; } = 1;
|
||||
public DateTime TransactionTime { get; set; }
|
||||
public string TransactionCode { get; set; }
|
||||
}
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,60 @@
|
||||
<UserControl x:Class="SafeBagDE70.WelcomeUC"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
x:Name="ucWelcome"
|
||||
mc:Ignorable="d">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Top Section -->
|
||||
<StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0">
|
||||
<Image Source="icon/logo.ico" Width="200" Height="200" Margin="0,10,0,10" Stretch="UniformToFill"/>
|
||||
<TextBlock Text="Xin chào! Hãy lựa chọn hình thức đăng nhập để tiếp tục" FontSize="24" FontWeight="Bold" TextAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Middle Section -->
|
||||
<Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Button hc:IconElement.Geometry="{StaticResource FullScreenGeometry}" Grid.Column="0" Grid.Row="0" x:Name="btnQRCodeLogin" Content="QR CODE" Width="200" Height="100" Margin="0,0,10,0" FontSize="20" FontWeight="Bold" Click="btnQRCodeLogin_Click"/>
|
||||
<Button Grid.Column="2" Grid.Row="0" x:Name="btnPinCodeLogin" Content="PIN CODE" Width="200" Height="100" Margin="10,0,0,0" Click="PinCodeButton_Click" FontSize="20" FontWeight="Bold"/>
|
||||
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="PinCodePanel">
|
||||
<TextBox x:Name="PinCodeBox" Width="300" Height="60" FontSize="20" HorizontalContentAlignment="Center" Margin="0,10,0,0"/>
|
||||
<TextBlock Text="Quên mã PIN?" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" Margin="0,5,0,0" MouseLeftButtonUp="ForgotPin_Click"/>
|
||||
<Button Content="Đăng nhập" Width="200" Height="40" Margin="0,10,0,0" Click="LoginButton_Click"/>
|
||||
<Label x:Name="lblPincodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="QrCodePanel">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Đưa QR Code của bạn vào đầu đọc" FontSize="20"/>
|
||||
<hc:LoadingCircle Background="Transparent" VerticalAlignment="Bottom" Width="50" Height="50" Margin="10"/>
|
||||
<Label x:Name="lblQRcodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<!-- Bottom Section -->
|
||||
<StackPanel Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<TextBlock x:Name="txtVersion" Text="TRỢ GIÚP" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" MouseLeftButtonUp="Help_Click"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
</UserControl>
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SafeBagDE70.StateMachine
|
||||
{
|
||||
public class StateMachineConfig
|
||||
{
|
||||
public List<string> States { get; set; }
|
||||
public List<Transition> Transitions { get; set; }
|
||||
public Dictionary<string, string> Actions { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
using CoreScanner;
|
||||
using SafeBagDE70.Model;
|
||||
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 System.Windows.Threading;
|
||||
using System.Xml;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for QRCodeWindow.xaml
|
||||
/// </summary>
|
||||
public partial class QRCodeZebraWindow : HandyControl.Controls.Window
|
||||
{
|
||||
|
||||
public string QRCodeContent = null;
|
||||
public CCoreScannerClass cCoreScannerClass;
|
||||
public QRCodeZebraWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
Init();
|
||||
}
|
||||
public void Init()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Instantiate CoreScanner Class
|
||||
cCoreScannerClass = new CCoreScannerClass();
|
||||
|
||||
// Call Open API
|
||||
short[] scannerTypes = new short[1]; // Scanner Types you are interested in
|
||||
scannerTypes[0] = 1; // 1 for all scanner types
|
||||
short numberOfScannerTypes = 1; // Size of the scannerTypes array
|
||||
int status; // Extended API return code
|
||||
|
||||
cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
|
||||
|
||||
// Subscribe for barcode events in cCoreScannerClass
|
||||
cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
|
||||
// Let's subscribe for events
|
||||
int opcode = 1001; // Method for Subscribe events
|
||||
string outXML; // XML Output
|
||||
string inXML = "<inArgs>" +
|
||||
"<cmdArgs>" +
|
||||
"<arg-int>1</arg-int>" + // Number of events you want to subscribe
|
||||
"<arg-int>1</arg-int>" + // Comma separated event IDs
|
||||
"</cmdArgs>" +
|
||||
"</inArgs>";
|
||||
|
||||
cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Console.WriteLine("Something wrong please check... " + exp.Message);
|
||||
}
|
||||
}
|
||||
private void OnBarcodeEvent(short eventType, ref string pscanData)
|
||||
{
|
||||
string xmlString = pscanData;
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlString);
|
||||
|
||||
XmlNode rawDataNode = xmlDoc.SelectSingleNode("//datalabel");
|
||||
string rawDataHex = rawDataNode.InnerText.Trim();
|
||||
|
||||
QRCodeContent = HexStringToString(rawDataHex);
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
DialogResult = true;
|
||||
this.Close();
|
||||
});
|
||||
}
|
||||
|
||||
static string HexStringToString(string hexString)
|
||||
{
|
||||
string[] hexValues = hexString.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
byte[] bytes = new byte[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexValues[i], 16);
|
||||
}
|
||||
return Encoding.ASCII.GetString(bytes);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 16 KiB |
@@ -0,0 +1,62 @@
|
||||
using HandyControl.Tools.Extension;
|
||||
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 SafeBagDE70.Admin
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for AdminWindow.xaml
|
||||
/// </summary>
|
||||
public partial class AdminWindow : HandyControl.Controls.Window
|
||||
{
|
||||
LogViewerUC loguc;
|
||||
AdminConfigurationUC configuration;
|
||||
public AdminWindow()
|
||||
{
|
||||
InitializeComponent();
|
||||
loguc= new LogViewerUC(AppData.logCollection);
|
||||
configuration = new AdminConfigurationUC();
|
||||
this.MainContentControl.Content = loguc;
|
||||
}
|
||||
private void LogoutButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void UserManagementButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void DashboardButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
this.MainContentControl.Content = loguc;
|
||||
}
|
||||
|
||||
private void SettingsButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void ReportsButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private void ConfigurationButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
this.MainContentControl.Content = configuration;
|
||||
}
|
||||
}
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 78 KiB |
@@ -0,0 +1,23 @@
|
||||
<Application x:Class="SafeBagDE70.App"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
xmlns:local="clr-namespace:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol">
|
||||
<Application.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/VirtualKeyboard;component/ResourceDictionaries/DefaultStyles.xaml"/>
|
||||
<hc:ThemeResources RequestedTheme="Light">
|
||||
<ResourceDictionary x:Key="Light" hc:ThemeDictionary.Key="Light">
|
||||
|
||||
<!-- Put the resources you want to use in the Light theme Here -->
|
||||
|
||||
<SolidColorBrush x:Key="PrimaryBrush" Color="Red" />
|
||||
<SolidColorBrush x:Key="AppBackgroundBrush" Color="LightBlue" />
|
||||
</ResourceDictionary>
|
||||
</hc:ThemeResources>
|
||||
<hc:Theme/>
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Application.Resources>
|
||||
</Application>
|
||||
@@ -0,0 +1,9 @@
|
||||
D:\SRC\VirtualKeyboard\obj\Debug\net8.0-windows\GeneratedInternalTypeHelper.g.cs
|
||||
|
||||
FD:\SRC\VirtualKeyboard\DefaultKeyboardHost.xaml;;
|
||||
FD:\SRC\VirtualKeyboard\ResourceDictionaries\KeyboardCore.xaml;;
|
||||
FD:\SRC\VirtualKeyboard\Views\AlphabetView.xaml;;
|
||||
FD:\SRC\VirtualKeyboard\Views\KeyboardValueView.xaml;;
|
||||
FD:\SRC\VirtualKeyboard\Views\SpecialCharactersView.xaml;;
|
||||
FD:\SRC\VirtualKeyboard\Views\VirtualKeyboardView.xaml;;
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
using CoreScanner;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Automation;
|
||||
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 System.Xml;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WelcomeWindow.xaml
|
||||
/// </summary>
|
||||
public partial class WelcomeUC : UserControl
|
||||
{
|
||||
public string? QRCodeContent = null;
|
||||
public string? PinCode = null;
|
||||
public bool IsAuthenticated = false;
|
||||
public CCoreScannerClass? cCoreScannerClass=null;
|
||||
public WelcomeUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitQRCodeScanner();
|
||||
Loaded += WelcomeUC_Loaded;
|
||||
}
|
||||
|
||||
private void WelcomeUC_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
}
|
||||
public void Init()
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
AppData.CurrentCustomerAccount = null;
|
||||
lblPincodeError.Content = "";
|
||||
PinCodeBox.Text = "";
|
||||
}
|
||||
|
||||
private void LoginButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string pin = PinCodeBox.Text;
|
||||
|
||||
if (ValidatePin(pin))
|
||||
{
|
||||
PinCode=PinCodeBox.Text.ToString();
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (PinCode != null)
|
||||
{
|
||||
var strPincode = PinCode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.IsAuthenticated=true;
|
||||
AppData.CurrentCustomerAccount=cca;
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
//DialogResult = true;
|
||||
//this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblPincodeError.Content = "PINCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Invalid PIN. Please try again.");
|
||||
}
|
||||
}
|
||||
|
||||
private void ForgotPin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Forgot PIN clicked.");
|
||||
}
|
||||
|
||||
private void Help_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Help clicked.");
|
||||
}
|
||||
|
||||
private bool ValidatePin(string pin)
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
private async void PinCodeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var onScreenKeyboardProcess = new ProcessStartInfo("osk.exe")
|
||||
{
|
||||
UseShellExecute = true
|
||||
};
|
||||
Process.Start(onScreenKeyboardProcess);
|
||||
try
|
||||
{
|
||||
//var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
|
||||
//var keyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
|
||||
//Process.Start(keyboardPath);
|
||||
// AutomationElement.FromHandle(-1);
|
||||
|
||||
// string keyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
|
||||
// Process.Start(keyboardPath);
|
||||
//await Launcher.LaunchUriAsync(new Uri("ms-inputapp://"));
|
||||
|
||||
//var onScreenKeyboardProcess = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
|
||||
//{
|
||||
// UseShellExecute = true
|
||||
//};
|
||||
//Process.Start(onScreenKeyboardProcess);
|
||||
|
||||
QrCodePanel.Visibility = Visibility.Collapsed;
|
||||
PinCodePanel.Visibility = Visibility.Visible;
|
||||
|
||||
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
private void btnQRCodeLogin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
PinCodePanel.Visibility = Visibility.Collapsed;
|
||||
QrCodePanel.Visibility=Visibility.Visible;
|
||||
cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
|
||||
|
||||
}
|
||||
public void InitQRCodeScanner()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Instantiate CoreScanner Class
|
||||
cCoreScannerClass = new CCoreScannerClass();
|
||||
|
||||
// Call Open API
|
||||
short[] scannerTypes = new short[1]; // Scanner Types you are interested in
|
||||
scannerTypes[0] = 1; // 1 for all scanner types
|
||||
short numberOfScannerTypes = 1; // Size of the scannerTypes array
|
||||
int status; // Extended API return code
|
||||
|
||||
cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
|
||||
|
||||
// Subscribe for barcode events in cCoreScannerClass
|
||||
|
||||
|
||||
// Let's subscribe for events
|
||||
int opcode = 1001; // Method for Subscribe events
|
||||
string outXML; // XML Output
|
||||
string inXML = "<inArgs>" +
|
||||
"<cmdArgs>" +
|
||||
"<arg-int>1</arg-int>" + // Number of events you want to subscribe
|
||||
"<arg-int>1</arg-int>" + // Comma separated event IDs
|
||||
"</cmdArgs>" +
|
||||
"</inArgs>";
|
||||
|
||||
cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Console.WriteLine("Something wrong please check... " + exp.Message);
|
||||
}
|
||||
}
|
||||
private void OnBarcodeEvent(short eventType, ref string pscanData)
|
||||
{
|
||||
string xmlString = pscanData;
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlString);
|
||||
|
||||
XmlNode rawDataNode = xmlDoc.SelectSingleNode("//datalabel");
|
||||
string rawDataHex = rawDataNode.InnerText.Trim();
|
||||
|
||||
QRCodeContent = HexStringToString(rawDataHex);
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
|
||||
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (QRCodeContent != null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == QRCodeContent).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
AppData.IsAuthenticated = true;
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblQRcodeError.Content = "QRCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
static string HexStringToString(string hexString)
|
||||
{
|
||||
string[] hexValues = hexString.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
byte[] bytes = new byte[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexValues[i], 16);
|
||||
}
|
||||
return Encoding.ASCII.GetString(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,769 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
using SafeBagDE70.Model;
|
||||
using HandyControl.Tools;
|
||||
using System.Drawing.Printing;
|
||||
using System.Drawing;
|
||||
using static HandyControl.Tools.Interop.InteropValues;
|
||||
using SafeBagDE70.API;
|
||||
using Newtonsoft.Json;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using DE70_CMDv2;
|
||||
using System.Configuration;
|
||||
|
||||
|
||||
namespace SafeBagDE70
|
||||
{ //Summary
|
||||
|
||||
|
||||
public partial class DepositUC : UserControl
|
||||
{
|
||||
SerialPort serialPortDE70 = new SerialPort();
|
||||
SerialPort serialPortSensor= new SerialPort();
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
ObservableCollection<LvCountItem> lvCountItems = new ObservableCollection<LvCountItem>();
|
||||
private DispatcherTimer timer;
|
||||
private DispatcherTimer sensorTimer;
|
||||
int countTimer = 0;
|
||||
CCmdRsp cCmdRsp = null;
|
||||
bool bInitialized = false;
|
||||
|
||||
public DepositUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
}
|
||||
private void UserControl_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
try
|
||||
{
|
||||
InitApp();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError("LỖI CỔNG KẾT NỐI, VUI LÒNG KIỂM TRA LẠI CỔNG KẾT NỐI");
|
||||
}
|
||||
}
|
||||
public void InitApp()
|
||||
{
|
||||
// LoginUsingQRCode();
|
||||
|
||||
serialPortDE70.ReadBufferSize = 4096;
|
||||
serialPortDE70.WriteBufferSize = 4096;
|
||||
cCmdRsp = new CCmdRsp(serialPortDE70);
|
||||
AppData.cCmdRsp = cCmdRsp;
|
||||
|
||||
serialPortDE70.PortName = "COM4";
|
||||
serialPortDE70.BaudRate = 9600;
|
||||
serialPortDE70.Parity = Parity.Even;
|
||||
serialPortDE70.DataBits = 8;
|
||||
serialPortDE70.StopBits = StopBits.One;
|
||||
|
||||
serialPortSensor.PortName = "COM3";
|
||||
serialPortSensor.BaudRate = 9600;
|
||||
serialPortSensor.Parity = Parity.None;
|
||||
serialPortSensor.DataBits = 8;
|
||||
serialPortSensor.StopBits = StopBits.One;
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
if(!serialPortDE70.IsOpen)
|
||||
serialPortDE70.Open();
|
||||
|
||||
if (!serialPortSensor.IsOpen)
|
||||
serialPortSensor.Open();
|
||||
|
||||
bInitialized = InitSession();
|
||||
|
||||
timer = new DispatcherTimer();
|
||||
timer.Interval = new TimeSpan(0, 0, 10); //10 seconds
|
||||
timer.Tick += Timer_Tick;
|
||||
timer.Start();
|
||||
|
||||
sensorTimer = new DispatcherTimer();
|
||||
sensorTimer.Interval = new TimeSpan(0, 0, 1); //10 seconds
|
||||
sensorTimer.Tick += SensorTimer_Tick;
|
||||
sensorTimer.Start();
|
||||
}
|
||||
|
||||
public void ShutdownApp()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (serialPortDE70.IsOpen)
|
||||
serialPortDE70.Close();
|
||||
if (serialPortSensor.IsOpen)
|
||||
serialPortSensor.Close();
|
||||
|
||||
if (timer != null)
|
||||
{
|
||||
timer.Tick -= Timer_Tick;
|
||||
timer.Stop();
|
||||
}
|
||||
if (sensorTimer != null)
|
||||
{
|
||||
sensorTimer.Tick -= SensorTimer_Tick;
|
||||
sensorTimer.Stop();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void SetStep(int step)
|
||||
{
|
||||
switch(step)
|
||||
{
|
||||
case 0:
|
||||
btnStart.IsEnabled = true;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = false;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 1:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled =false;
|
||||
break;
|
||||
case 2:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 3:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSessionCount()
|
||||
{
|
||||
lvCountItems.Clear();
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "1000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "2000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "5000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "10000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "20000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "50000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "100000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "200000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "Tổng",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems[10].Quantity = "0";
|
||||
lvCountItems[10].Value = "0";
|
||||
|
||||
lvCount.ItemsSource = lvCountItems;
|
||||
|
||||
//lvCountItems[0].Quantity = "10";
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
public int quantityStored = 0;
|
||||
public int totalAllDenominations = 0;
|
||||
public int posDenomi;
|
||||
public bool printerFlag = false;
|
||||
public static string? recvDataString;
|
||||
public int[] TempQuantity = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
public int[] TempNote = new int[5] { 0, 0, 0, 0, 0 };
|
||||
public int[] Notes = new int[5] { 0, 0, 0, 0, 0 };
|
||||
|
||||
private void SensorTimer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
int state = 0;
|
||||
if (serialPortSensor.IsOpen==true)
|
||||
{
|
||||
serialPortSensor.Write(new byte[] { (byte)'S', 13, 10 }, 0, 3);
|
||||
var buffer = new byte[16];
|
||||
|
||||
int n = serialPortSensor.Read(buffer, 0, buffer.Length);
|
||||
|
||||
for (int i = 1; i < n - 1; i++)
|
||||
{
|
||||
if ((buffer[i] == 13) && (buffer[i + 1] == 10))
|
||||
{
|
||||
state = buffer[i - 1]-48;
|
||||
if(bInitialized)
|
||||
{
|
||||
if (state != 0)
|
||||
gridMain.IsEnabled = false;
|
||||
else
|
||||
gridMain.IsEnabled = true;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
lblStatus.Content = "Két: đóng, Túi: đóng";
|
||||
break;
|
||||
case 1:
|
||||
lblStatus.Content = "Két: đóng, Túi: đã bị lấy ra";
|
||||
break;
|
||||
case 2:
|
||||
lblStatus.Content = "Két: mở, Túi: đóng";
|
||||
break;
|
||||
case 3:
|
||||
lblStatus.Content = "Két: mở, Túi: đã bị lấy ra";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
|
||||
APIModels.SendHealthCheck();
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
public int UpdateTotalQuantity()
|
||||
{
|
||||
int total = 0;
|
||||
foreach (var item in lvCountItems)
|
||||
{
|
||||
if (item.Name != "Tổng")
|
||||
{
|
||||
int quantity = 0;
|
||||
if (int.TryParse(item.Quantity, out quantity))
|
||||
{
|
||||
total += quantity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
public int AutoSerialGet(SerialPort serialPort)
|
||||
{
|
||||
int ret;
|
||||
ushort seri_num = 0;
|
||||
ushort get_num = 0;
|
||||
bool endflg = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
ret = cCmdRsp.SendSerialSense();
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
ret = cCmdRsp.GetSerialNum(out seri_num);
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
// Serial number acquisition
|
||||
|
||||
if (cCmdRsp.ChkCntEnd())
|
||||
{
|
||||
endflg = true;
|
||||
Debug.WriteLine("END FLAG: "+cCmdRsp.recv_dat.dat[1]);
|
||||
}
|
||||
Debug.WriteLine("START");
|
||||
Debug.WriteLine($"Num Serial: {seri_num}");
|
||||
|
||||
while (get_num < seri_num)
|
||||
{
|
||||
get_num++;
|
||||
ret = cCmdRsp.SendGetSerial(get_num);
|
||||
|
||||
|
||||
switch (cCmdRsp.recv_dat.dat[18])
|
||||
{
|
||||
case 0x00: TempNote[0] ++; Notes[0] += TempNote[0]; break;
|
||||
case 0x02:
|
||||
//TempNote[1] ++;
|
||||
switch (cCmdRsp.recv_dat.dat[17])
|
||||
{
|
||||
case 0x00: TempQuantity[0]++; break;
|
||||
case 0x01: TempQuantity[1]++; break;
|
||||
case 0x02: TempQuantity[2]++; break;
|
||||
case 0x03: TempQuantity[3]++; break;
|
||||
case 0x04: TempQuantity[4]++; break;
|
||||
case 0x05: TempQuantity[5]++; break;
|
||||
case 0x06: TempQuantity[6]++; break;
|
||||
case 0x07: TempQuantity[7]++; break;
|
||||
case 0x08: TempQuantity[8]++; break;
|
||||
case 0x09: TempQuantity[9]++; break;
|
||||
|
||||
}
|
||||
break;
|
||||
case 0x03: TempNote[2] ++; Notes[2] += TempNote[2]; break;
|
||||
case 0x0b: TempNote[3] ++; Notes[3] += TempNote[3]; break;
|
||||
case 0x0c: TempNote[4] ++; Notes[4] += TempNote[4]; break;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine("END");
|
||||
//Debug.WriteLine("Ellapsed Time: " + timeSpan.TotalSeconds);
|
||||
if (endflg)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END GET SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END SEND SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = false;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
try
|
||||
{
|
||||
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CNTSTART);
|
||||
//var recvData = DE70_CMD.SendxxCmd((byte)CMD_BYTE.CMD_DE_CNTSTART, serialPort);
|
||||
|
||||
//Thread.Sleep(20000);
|
||||
if (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[2] != 43) { }
|
||||
do
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_SENSE);
|
||||
}
|
||||
while (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[1] == 0x09); //SR2 = 0x09 : Counting Status
|
||||
|
||||
//SR3 = 0x43 : Stacker full
|
||||
|
||||
AutoSerialGet(serialPortDE70);
|
||||
|
||||
if (sessions == null || sessions.Count == 0)
|
||||
{
|
||||
double tempSum = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
lvCountItems[i].Quantity = TempQuantity[9 - i].ToString();
|
||||
tempSum += lvCountItems[i].getValue();
|
||||
}
|
||||
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = tempSum.ToString();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
double sum = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
|
||||
}
|
||||
|
||||
a += TempQuantity[9 - i];
|
||||
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sum += lvCountItems[i].getValue();
|
||||
|
||||
}
|
||||
//Update amount of money
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sum.ToString();
|
||||
|
||||
}
|
||||
SetStep(2);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
double sumStored;
|
||||
|
||||
//TempNote[1] = 0;
|
||||
|
||||
if (sessions != null)
|
||||
{
|
||||
sumStored = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
//quantityStored += lvCountItems[i].getQuantity();
|
||||
}
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sumStored += lvCountItems[i].getValue();
|
||||
}
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sumStored.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = true;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
sessions[sessions.Count - 1].QuantityDenomi = (int[])TempQuantity.Clone();
|
||||
quantityStored = UpdateTotalQuantity();
|
||||
|
||||
Debug.WriteLine(quantityStored);
|
||||
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_STORESTART);
|
||||
SetStep(3);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
InitSession();
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_SENSE);
|
||||
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
SetStep(1);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
var totalQuantity = lvCountItems[10].Quantity;
|
||||
var totalValue = lvCountItems[11].Quantity;
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
LogAction(currentMethod, null);
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
//SendData2Server
|
||||
var data2Send = new CountingData2Send
|
||||
{
|
||||
Sessions = sessions,
|
||||
MachineId = null,
|
||||
UserId = AppData.CurrentCustomerAccount.CustomerId,
|
||||
MachineTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
||||
RejectNotes = Notes[0],
|
||||
GenuineNotes = quantityStored,
|
||||
UnfitNotes = Notes[2],
|
||||
CounterfeitNotes = Notes[3],
|
||||
SuspendNotes = Notes[4]
|
||||
|
||||
};
|
||||
var str = JsonConvert.SerializeObject(data2Send);
|
||||
|
||||
APIModels.SendCountingData(data2Send);
|
||||
//Reset all and ready to next session
|
||||
|
||||
if(printerFlag == true)
|
||||
{
|
||||
PrintReceipt();
|
||||
printerFlag = false;
|
||||
|
||||
}
|
||||
InitSession();
|
||||
//Debug.WriteLine("Reject Note: " + Notes[0] );
|
||||
//Debug.WriteLine("Genuine note stored: " + quantityStored);
|
||||
//Debug.WriteLine("Unfit note: " + Notes[2]);
|
||||
//Debug.WriteLine("Counterfeit: " + Notes[3]);
|
||||
//Debug.WriteLine("Suspend: " + Notes[4]);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
String strNotify = $"BẠN VỪA THỰC HIỆN TIỀN VÀO MÁY CDM:\r\n"
|
||||
+ $"SỐ LƯỢNG TỜ: {totalQuantity}\r\n"
|
||||
+ $"SỐ TIỀN: {totalValue} VND\r\n";
|
||||
((MainWindow)Application.Current.MainWindow).ShowInformationScreen(strNotify);
|
||||
}
|
||||
private void ShowError(string strError)
|
||||
{
|
||||
//gridMain.IsEnabled = false;
|
||||
//btnCollect2.Visibility=Visibility.Collapsed;
|
||||
//panelError.Visibility = Visibility.Visible;
|
||||
//lblError.Text = strError;
|
||||
//((MainWindow)Application.Current.MainWindow).ShowWelcomeScreen();
|
||||
((MainWindow)Application.Current.MainWindow).ShowErrorScreen(strError);
|
||||
}
|
||||
|
||||
private bool InitSession()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Check status
|
||||
cCmdRsp.SendDeSense();
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
int IsCassetteFull=data[17] & 0x08;
|
||||
if(IsCassetteFull != 0)
|
||||
{
|
||||
((MainWindow)Application.Current.MainWindow).ShowCollectionScreen();
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
sessions.Clear();
|
||||
Array.Clear(TempNote, 0, TempNote.Length);
|
||||
Array.Clear(Notes, 0, Notes.Length);
|
||||
quantityStored = 0;
|
||||
maxQuantitySheet = 0;
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
SetStep(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
LogException("InitSession", ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PrintReceipt()
|
||||
{
|
||||
var shopName = AppData.CurrentCustomerAccount.Name;
|
||||
var shopCode = AppData.CurrentCustomerAccount.CustomerId;
|
||||
var tradingCode = "TRA04052024CDM";
|
||||
var storeAccountNumber = 686868686688;
|
||||
var currentTime = DateTime.Now;
|
||||
var printDocument = new PrintDocument();
|
||||
printDocument.PrinterSettings.PrinterName = "CUSTOM K80";
|
||||
printDocument.PrintPage += (sender, e) =>
|
||||
{
|
||||
e.Graphics.DrawString("Biên nhận nộp tiền", new Font("Arial", 15), System.Drawing.Brushes.Black, new PointF(80, 10));
|
||||
e.Graphics.DrawString("Mã máy CDM: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 60));
|
||||
e.Graphics.DrawString("Batch no: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 90));
|
||||
e.Graphics.DrawString("Thời gian GD: " + currentTime.ToString("dd/MM/yyyy HH:mm:ss"), new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 120));
|
||||
e.Graphics.DrawString("Mã GD: " + tradingCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 150));
|
||||
e.Graphics.DrawString("Mã gian hàng: " + shopCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 180));
|
||||
e.Graphics.DrawString("Tên gian hàng: " + shopName, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 210));
|
||||
e.Graphics.DrawString("STK gian hàng: " + storeAccountNumber, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 240));
|
||||
e.Graphics.DrawString("Số tiền nộp: " + lvCountItems[10].Value, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 270));
|
||||
e.Graphics.DrawString("*****Xin cám ơn******", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(100, 300));
|
||||
// To send raw ESC/POS commands, you'd typically use e.Graphics.DrawString() with the command string,
|
||||
// or for more complex scenarios, directly manipulate the byte stream sent to the printer.
|
||||
};
|
||||
printDocument.Print();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void LogAction(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("log.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
public void LogException(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("logException.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
private void LoginUsingQRCode()
|
||||
{
|
||||
|
||||
}
|
||||
private void btnCollect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
//Event fix
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
|
||||
var currentMode = cCmdRsp.GetLockParam().mode;
|
||||
cCmdRsp.GetLockParam().mode = Mode.MODE_COLLECTION;
|
||||
cCmdRsp.SendLock();
|
||||
Thread.Sleep(10000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] != recvData.dat[16])
|
||||
{
|
||||
ShowError("Khởi tạo bộ đếm thành công");
|
||||
// ShutdownApp();
|
||||
// InitApp();
|
||||
}
|
||||
//Thread.Sleep(5000);
|
||||
//cCmdRsp.GetLockParam().mode = currentMode;
|
||||
//cCmdRsp.SendLock();
|
||||
}
|
||||
|
||||
private void UserControl_Unloaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
ShutdownApp();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
<hc:Window
|
||||
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:hc="https://handyorg.github.io/handycontrol"
|
||||
xmlns:local="clr-namespace:SafeBagDE70"
|
||||
x:Class="SafeBagDE70.QRCodeWindow"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
ShowNonClientArea="False"
|
||||
mc:Ignorable="d"
|
||||
Title="QRCodeWindow" Height="400" Width="600">
|
||||
<Grid>
|
||||
<StackPanel VerticalAlignment="Center">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Đưa QR Code của bạn vào đầu đọc" FontSize="30"/>
|
||||
<hc:LoadingCircle VerticalAlignment="Bottom" Width="50" Height="50" Margin="10"/>
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
</hc:Window>
|
||||
@@ -0,0 +1,344 @@
|
||||
using CoreScanner;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
using System.Windows.Automation;
|
||||
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 System.Xml;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
/// <summary>
|
||||
/// Interaction logic for WelcomeWindow.xaml
|
||||
/// </summary>
|
||||
public partial class WelcomeUC : UserControl
|
||||
{
|
||||
public string? PinCode = null;
|
||||
public bool IsAuthenticated = false;
|
||||
public CCoreScannerClass? cCoreScannerClass=null;
|
||||
public WelcomeUC()
|
||||
{
|
||||
InitializeComponent();
|
||||
InitQRCodeScanner();
|
||||
Loaded += WelcomeUC_Loaded;
|
||||
}
|
||||
|
||||
private void WelcomeUC_Loaded(object sender, RoutedEventArgs e)
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
txtVersion.Text = "Version " + AppData.CurrentVersion;
|
||||
}
|
||||
public void Init()
|
||||
{
|
||||
AppData.IsAuthenticated = false;
|
||||
AppData.CurrentCustomerAccount = null;
|
||||
lblPincodeError.Content = "";
|
||||
PinCodeBox.Text = "";
|
||||
}
|
||||
|
||||
private void LoginButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
string pin = PinCodeBox.Text;
|
||||
|
||||
if (ValidatePin(pin))
|
||||
{
|
||||
PinCode=PinCodeBox.Text.ToString();
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (PinCode != null)
|
||||
{
|
||||
var strPincode = PinCode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.IsAuthenticated=true;
|
||||
AppData.CurrentCustomerAccount=cca;
|
||||
AppData.GetNewTransactionCode();
|
||||
AppData.GetNewTransactionCode();
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
//DialogResult = true;
|
||||
//this.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblPincodeError.Content = "PINCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("Invalid PIN. Please try again.");
|
||||
}
|
||||
}
|
||||
|
||||
private void ForgotPin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Forgot PIN clicked.");
|
||||
}
|
||||
|
||||
private void Help_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
MessageBox.Show("Phiên bản đang sử dụng là phiên bản mới nhất");
|
||||
}
|
||||
|
||||
private bool ValidatePin(string pin)
|
||||
{
|
||||
return true;
|
||||
|
||||
}
|
||||
private async void PinCodeButton_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
//var onScreenKeyboardProcess = new ProcessStartInfo("osk.exe")
|
||||
//{
|
||||
// UseShellExecute = true
|
||||
//};
|
||||
try
|
||||
{
|
||||
//var progFiles = @"C:\Program Files\Common Files\Microsoft Shared\ink";
|
||||
//var keyboardPath = System.IO.Path.Combine(progFiles, "TabTip.exe");
|
||||
//Process.Start(keyboardPath);
|
||||
// AutomationElement.FromHandle(-1);
|
||||
|
||||
// string keyboardPath = @"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe";
|
||||
// Process.Start(keyboardPath);
|
||||
//await Launcher.LaunchUriAsync(new Uri("ms-inputapp://"));
|
||||
|
||||
//var onScreenKeyboardProcess = new ProcessStartInfo(@"C:\Program Files\Common Files\Microsoft Shared\ink\TabTip.exe")
|
||||
//{
|
||||
// UseShellExecute = true
|
||||
//};
|
||||
//Process.Start(onScreenKeyboardProcess);
|
||||
|
||||
QrCodePanel.Visibility = Visibility.Collapsed;
|
||||
PinCodePanel.Visibility = Visibility.Visible;
|
||||
|
||||
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
private void btnQRCodeLogin_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
PinCodePanel.Visibility = Visibility.Collapsed;
|
||||
QrCodePanel.Visibility=Visibility.Visible;
|
||||
cCoreScannerClass.BarcodeEvent += new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
|
||||
|
||||
}
|
||||
public void InitQRCodeScanner()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Instantiate CoreScanner Class
|
||||
cCoreScannerClass = new CCoreScannerClass();
|
||||
|
||||
// Call Open API
|
||||
short[] scannerTypes = new short[1]; // Scanner Types you are interested in
|
||||
scannerTypes[0] = 1; // 1 for all scanner types
|
||||
short numberOfScannerTypes = 1; // Size of the scannerTypes array
|
||||
int status; // Extended API return code
|
||||
|
||||
cCoreScannerClass.Open(0, scannerTypes, numberOfScannerTypes, out status);
|
||||
|
||||
// Subscribe for barcode events in cCoreScannerClass
|
||||
|
||||
|
||||
// Let's subscribe for events
|
||||
int opcode = 1001; // Method for Subscribe events
|
||||
string outXML; // XML Output
|
||||
string inXML = "<inArgs>" +
|
||||
"<cmdArgs>" +
|
||||
"<arg-int>1</arg-int>" + // Number of events you want to subscribe
|
||||
"<arg-int>1</arg-int>" + // Comma separated event IDs
|
||||
"</cmdArgs>" +
|
||||
"</inArgs>";
|
||||
|
||||
cCoreScannerClass.ExecCommand(opcode, ref inXML, out outXML, out status);
|
||||
}
|
||||
catch (Exception exp)
|
||||
{
|
||||
Console.WriteLine("Something wrong please check... " + exp.Message);
|
||||
}
|
||||
}
|
||||
private void OnBarcodeEvent(short eventType, ref string pscanData)
|
||||
{
|
||||
string xmlString = pscanData;
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
xmlDoc.LoadXml(xmlString);
|
||||
|
||||
XmlNode rawDataNode = xmlDoc.SelectSingleNode("//datalabel");
|
||||
string rawDataHex = rawDataNode.InnerText.Trim();
|
||||
|
||||
var QRCodeContentFull = HexStringToString(rawDataHex);
|
||||
string? CustomerID = null;
|
||||
VerifyQRCode(QRCodeContentFull, out CustomerID);
|
||||
if(CustomerID!=null)
|
||||
{
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
if (AppData.customerAccounts != null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if (CustomerID != null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == CustomerID).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
cCoreScannerClass.BarcodeEvent -= new _ICoreScannerEvents_BarcodeEventEventHandler(OnBarcodeEvent);
|
||||
AppData.IsAuthenticated = true;
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
AppData.GetNewTransactionCode();
|
||||
((MainWindow)Application.Current.MainWindow).ShowDepositScreen();
|
||||
}
|
||||
else
|
||||
{
|
||||
lblQRcodeError.Content = "QRCODE không đúng, vui lòng thử lại";
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
private void VerifyQRCode(string decodedString,out string? ConsumerID)
|
||||
{
|
||||
ConsumerID = null;
|
||||
try
|
||||
{
|
||||
var qrCodeData = decodedString;
|
||||
// Extract the CRC from the QR code string
|
||||
string extractedCRC = qrCodeData.Substring(qrCodeData.Length - 4);
|
||||
// Get the data without the CRC part
|
||||
string dataWithoutCRC = qrCodeData.Substring(0, qrCodeData.Length - 8);
|
||||
|
||||
// Calculate CRC
|
||||
string calculatedCRC = CalculateCRC(dataWithoutCRC);
|
||||
|
||||
// Verify CRC
|
||||
if (extractedCRC.Equals(calculatedCRC, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
lblQRcodeError.Content = "CRC is valid.";
|
||||
});
|
||||
|
||||
Dictionary<string, (int Length, string Value)> fields = ExtractFields(qrCodeData);
|
||||
|
||||
foreach (var field in fields)
|
||||
{
|
||||
Console.WriteLine($"ID: {field.Key}, Length: {field.Value.Length}, Value: {field.Value.Value}");
|
||||
}
|
||||
var fields2 = ExtractFields(fields["38"].Value);
|
||||
var fields3 = ExtractFields(fields2["01"].Value);
|
||||
ConsumerID = fields3["01"].Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
lblQRcodeError.Content = "CRC is invalid.";
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
this.Dispatcher.Invoke(() =>
|
||||
{
|
||||
lblQRcodeError.Content = e.Message;
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
Dictionary<string, (int Length, string Value)> ExtractFields(string qrCodeData)
|
||||
{
|
||||
Dictionary<string, (int Length, string Value)> fields = new Dictionary<string, (int Length, string Value)>();
|
||||
|
||||
int currentIndex = 0;
|
||||
|
||||
while (currentIndex < qrCodeData.Length)
|
||||
{
|
||||
// Extract ID
|
||||
string id = qrCodeData.Substring(currentIndex, 2);
|
||||
currentIndex += 2;
|
||||
|
||||
// Extract Length
|
||||
int length = int.Parse(qrCodeData.Substring(currentIndex, 2));
|
||||
currentIndex += 2;
|
||||
|
||||
// Extract Value
|
||||
string value = qrCodeData.Substring(currentIndex, length);
|
||||
currentIndex += length;
|
||||
|
||||
// Add the field to the dictionary
|
||||
fields[id] = (length, value);
|
||||
}
|
||||
|
||||
return fields;
|
||||
}
|
||||
string CalculateCRC(string data)
|
||||
{
|
||||
ushort polynomial = 0x1021; // CRC-16-CCITT polynomial
|
||||
ushort crc = 0xFFFF; // Initial value
|
||||
|
||||
// Convert the string to a byte array
|
||||
byte[] bytes = Encoding.ASCII.GetBytes(data + "6304"); // Append "6304" for CRC calculation as per standard
|
||||
|
||||
foreach (byte b in bytes)
|
||||
{
|
||||
crc ^= (ushort)(b << 8);
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
if ((crc & 0x8000) != 0)
|
||||
{
|
||||
crc = (ushort)((crc << 1) ^ polynomial);
|
||||
}
|
||||
else
|
||||
{
|
||||
crc <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure CRC is a 16-bit value
|
||||
crc &= 0xFFFF;
|
||||
|
||||
// Return CRC as a hexadecimal string
|
||||
return crc.ToString("X4");
|
||||
}
|
||||
static string HexStringToString(string hexString)
|
||||
{
|
||||
string[] hexValues = hexString.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
byte[] bytes = new byte[hexValues.Length];
|
||||
|
||||
for (int i = 0; i < hexValues.Length; i++)
|
||||
{
|
||||
bytes[i] = Convert.ToByte(hexValues[i], 16);
|
||||
}
|
||||
return Encoding.ASCII.GetString(bytes);
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,135 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using VirtualKeyboard.Wpf.Types;
|
||||
|
||||
namespace VirtualKeyboard.Wpf.ViewModels
|
||||
{
|
||||
class VirtualKeyboardViewModel : INotifyPropertyChanged
|
||||
{
|
||||
private string _keyboardText;
|
||||
public string KeyboardText {
|
||||
get => _keyboardText;
|
||||
set
|
||||
{
|
||||
_keyboardText = value;
|
||||
NotifyPropertyChanged(nameof(KeyboardText));
|
||||
}
|
||||
}
|
||||
private KeyboardType _keyboardType;
|
||||
public KeyboardType KeyboardType {
|
||||
get => _keyboardType;
|
||||
private set
|
||||
{
|
||||
_keyboardType = value;
|
||||
NotifyPropertyChanged(nameof(KeyboardType));
|
||||
}
|
||||
}
|
||||
private bool _uppercase;
|
||||
public bool Uppercase
|
||||
{
|
||||
get => _uppercase;
|
||||
private set
|
||||
{
|
||||
_uppercase = value;
|
||||
NotifyPropertyChanged(nameof(Uppercase));
|
||||
}
|
||||
}
|
||||
private int _caretPosition;
|
||||
public int CaretPosition
|
||||
{
|
||||
get => _caretPosition;
|
||||
set
|
||||
{
|
||||
if (value < 0) _caretPosition = 0;
|
||||
else if (value > KeyboardText.Length) _caretPosition = KeyboardText.Length;
|
||||
else _caretPosition = value;
|
||||
NotifyPropertyChanged(nameof(CaretPosition));
|
||||
}
|
||||
}
|
||||
private string _selectedValue;
|
||||
public string SelectedValue
|
||||
{
|
||||
get => _selectedValue;
|
||||
set
|
||||
{
|
||||
_selectedValue = value;
|
||||
NotifyPropertyChanged(nameof(SelectedValue));
|
||||
}
|
||||
}
|
||||
public Command AddCharacter { get; }
|
||||
public Command ChangeCasing { get; }
|
||||
public Command RemoveCharacter { get; }
|
||||
public Command ChangeKeyboardType { get; }
|
||||
public Command Accept { get; }
|
||||
|
||||
public VirtualKeyboardViewModel(string initialValue)
|
||||
{
|
||||
_keyboardText = initialValue;
|
||||
_keyboardType = KeyboardType.Alphabet;
|
||||
_uppercase = false;
|
||||
CaretPosition = _keyboardText.Length;
|
||||
|
||||
AddCharacter = new Command(a =>
|
||||
{
|
||||
if (a is string character)
|
||||
if (character.Length == 1)
|
||||
{
|
||||
if (Uppercase) character = character.ToUpper();
|
||||
if (!string.IsNullOrEmpty(SelectedValue))
|
||||
{
|
||||
RemoveSubstring(SelectedValue);
|
||||
KeyboardText = KeyboardText.Insert(CaretPosition, character);
|
||||
CaretPosition++;
|
||||
SelectedValue = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
KeyboardText = KeyboardText.Insert(CaretPosition, character);
|
||||
CaretPosition++;
|
||||
}
|
||||
}
|
||||
});
|
||||
ChangeCasing = new Command(a => Uppercase = !Uppercase);
|
||||
RemoveCharacter = new Command(a =>
|
||||
{
|
||||
if(!string.IsNullOrEmpty(SelectedValue))
|
||||
{
|
||||
RemoveSubstring(SelectedValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
var position = CaretPosition - 1;
|
||||
if (position >= 0)
|
||||
{
|
||||
KeyboardText = KeyboardText.Remove(position, 1);
|
||||
if (position < KeyboardText.Length) CaretPosition--;
|
||||
else CaretPosition = KeyboardText.Length;
|
||||
}
|
||||
}
|
||||
});
|
||||
ChangeKeyboardType = new Command(a =>
|
||||
{
|
||||
if (KeyboardType == KeyboardType.Alphabet) KeyboardType = KeyboardType.Special;
|
||||
else KeyboardType = KeyboardType.Alphabet;
|
||||
});
|
||||
Accept = new Command(a => VKeyboard.Close());
|
||||
}
|
||||
|
||||
private void RemoveSubstring(string substring)
|
||||
{
|
||||
var position = KeyboardText.IndexOf(substring);
|
||||
KeyboardText = KeyboardText.Remove(position, substring.Length);
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
|
||||
private void NotifyPropertyChanged(string prop)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
<hc:Window x:Class="SafeBagDE70.WelcomeWindow"
|
||||
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:SafeBagDE70"
|
||||
xmlns:hc="https://handyorg.github.io/handycontrol"
|
||||
mc:Ignorable="d"
|
||||
ShowInTaskbar="False"
|
||||
ShowNonClientArea="False"
|
||||
IsFullScreen="True"
|
||||
Topmost="True"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
Title="WelcomeWindow" Height="600" Width="800">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="4*"/>
|
||||
<RowDefinition Height="*"/>
|
||||
</Grid.RowDefinitions>
|
||||
|
||||
<!-- Top Section -->
|
||||
<StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0">
|
||||
<Image Source="icon/logo.ico" Width="200" Height="200" Margin="0,10,0,10" Stretch="UniformToFill"/>
|
||||
<TextBlock Text="Xin chào! Hãy lựa chọn hình thức đăng nhập để tiếp tục" FontSize="24" FontWeight="Bold" TextAlignment="Center"/>
|
||||
</StackPanel>
|
||||
|
||||
<!-- Middle Section -->
|
||||
<Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
<RowDefinition Height="Auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="*"/>
|
||||
<ColumnDefinition Width="Auto"/>
|
||||
<ColumnDefinition Width="*"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<Button hc:IconElement.Geometry="{StaticResource FullScreenGeometry}" Grid.Column="0" Grid.Row="0" x:Name="btnQRCodeLogin" Content="QR CODE" Width="200" Height="100" Margin="0,0,10,0" FontSize="20" FontWeight="Bold" Click="btnQRCodeLogin_Click"/>
|
||||
<Button Grid.Column="2" Grid.Row="0" x:Name="btnPinCodeLogin" Content="PIN CODE" Width="200" Height="100" Margin="10,0,0,0" Click="PinCodeButton_Click" FontSize="20" FontWeight="Bold"/>
|
||||
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="PinCodePanel">
|
||||
<PasswordBox x:Name="PinCodeBox" Width="300" Height="60" FontSize="20" HorizontalContentAlignment="Center" Margin="0,10,0,0"/>
|
||||
<TextBlock Text="Quên mã PIN?" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" Margin="0,5,0,0" MouseLeftButtonUp="ForgotPin_Click"/>
|
||||
<Button Content="Đăng nhập" Width="200" Height="40" Margin="0,10,0,0" Click="LoginButton_Click"/>
|
||||
<Label x:Name="lblPincodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
<StackPanel Grid.ColumnSpan="3" Grid.Row="1" HorizontalAlignment="Center" Visibility="Collapsed" x:Name="QrCodePanel">
|
||||
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" Text="Đưa QR Code của bạn vào đầu đọc" FontSize="20"/>
|
||||
<hc:LoadingCircle Background="Transparent" VerticalAlignment="Bottom" Width="50" Height="50" Margin="10"/>
|
||||
<Label x:Name="lblQRcodeError" Background="Transparent" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="Red" />
|
||||
</StackPanel>
|
||||
|
||||
</Grid>
|
||||
|
||||
<!-- Bottom Section -->
|
||||
<StackPanel Grid.Row="2" HorizontalAlignment="Center" VerticalAlignment="Center">
|
||||
<TextBlock Text="TRỢ GIÚP" Foreground="Blue" TextDecorations="Underline" Cursor="Hand" MouseLeftButtonUp="Help_Click"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
|
||||
</hc:Window>
|
||||
@@ -0,0 +1,104 @@
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Text;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Linq;
|
||||
using System;
|
||||
using System.Windows.Documents;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json.Serialization;
|
||||
using Newtonsoft.Json;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SafeBagDE70.API
|
||||
{
|
||||
public static class APIModels
|
||||
{
|
||||
public static string URL = "https://203.171.20.94:9090/Safebag/";
|
||||
public static async void SendHealthCheck(string? ID=null)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (ID == null) ID = GetMACAddress();
|
||||
HttpClientHandler clientHandler = new HttpClientHandler();
|
||||
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
|
||||
|
||||
// Pass the handler to httpclient(from you are calling api)
|
||||
HttpClient httpClient = new HttpClient(clientHandler);
|
||||
using HttpResponseMessage response = await httpClient.GetAsync(URL + "HealthCheck?Id=" + ID);
|
||||
|
||||
if (response.EnsureSuccessStatusCode().StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static async Task<bool> SendCountingData(CountingData2Send data2Send)
|
||||
{
|
||||
bool bSuccess=false;
|
||||
try{
|
||||
HttpClientHandler clientHandler = new HttpClientHandler();
|
||||
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
|
||||
|
||||
// Pass the handler to httpclient(from you are calling api)
|
||||
HttpClient httpClient = new HttpClient(clientHandler);
|
||||
string strJsonObj = JsonConvert.SerializeObject(data2Send);
|
||||
var content = new StringContent(strJsonObj, Encoding.UTF8, "application/json");
|
||||
|
||||
using HttpResponseMessage response = await httpClient.PostAsync(URL + "UpdateCountingData", content);
|
||||
|
||||
if (response.EnsureSuccessStatusCode().StatusCode == HttpStatusCode.OK)
|
||||
{
|
||||
var jsonResponse = await response.Content.ReadAsStringAsync();
|
||||
bSuccess = true;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
|
||||
}
|
||||
return bSuccess;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static string GetMACAddress()
|
||||
{
|
||||
string? MACAdress = null;
|
||||
foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
|
||||
{
|
||||
if (nic.OperationalStatus == OperationalStatus.Up)
|
||||
{
|
||||
MACAdress = AddressBytesToString(nic.GetPhysicalAddress().GetAddressBytes());
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (MACAdress == null) MACAdress = "N/A";
|
||||
return MACAdress;
|
||||
}
|
||||
|
||||
private static string? AddressBytesToString(byte[] addressBytes)
|
||||
{
|
||||
if (addressBytes != null)
|
||||
{
|
||||
var str = string.Join(":", (from b in addressBytes
|
||||
select b.ToString("X2")).ToArray());
|
||||
return str;
|
||||
}
|
||||
else
|
||||
return null;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,821 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO.Ports;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Threading.Channels;
|
||||
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 System.Xml.Serialization;
|
||||
using System.Windows.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.ObjectModel;
|
||||
using SafeBagDE70.Model;
|
||||
using HandyControl.Tools;
|
||||
using System.Drawing.Printing;
|
||||
using System.Drawing;
|
||||
using static HandyControl.Tools.Interop.InteropValues;
|
||||
using SafeBagDE70.API;
|
||||
using Newtonsoft.Json;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using DE70_CMDv2;
|
||||
using System.Configuration;
|
||||
|
||||
|
||||
namespace SafeBagDE70
|
||||
{ //Summary
|
||||
public class CountSession
|
||||
{
|
||||
public int[] QuantityDenomi { get; set; }
|
||||
public int[] SumDenomi { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class CountingData2Send
|
||||
{
|
||||
public List<CountSession>? Sessions { get; set; }
|
||||
public string? UserId { get; set; }
|
||||
public string? MachineId { get; set; }
|
||||
public string? MachineTime { get; set; }
|
||||
public int RejectNotes { get; set; }
|
||||
public int GenuineNotes { get; set; }
|
||||
public int UnfitNotes { get; set; }
|
||||
public int CounterfeitNotes { get; set; }
|
||||
public int SuspendNotes { get; set; }
|
||||
}
|
||||
|
||||
public partial class MainUserWindow : HandyControl.Controls.Window
|
||||
{
|
||||
SerialPort serialPortDE70 = new SerialPort();
|
||||
SerialPort serialPortSensor= new SerialPort();
|
||||
|
||||
List<CountSession> sessions = new List<CountSession>();
|
||||
ObservableCollection<LvCountItem> lvCountItems = new ObservableCollection<LvCountItem>();
|
||||
private DispatcherTimer timer;
|
||||
private DispatcherTimer sensorTimer;
|
||||
int countTimer = 0;
|
||||
CCmdRsp cCmdRsp = null;
|
||||
bool bInitialized = false;
|
||||
|
||||
public MainUserWindow()
|
||||
{
|
||||
//Need to update: auto detect COM Port
|
||||
try
|
||||
{
|
||||
InitializeComponent();
|
||||
//string queuePath = ConfigurationManager.AppSettings["SensorPort"].ToString();
|
||||
AppData.Init();
|
||||
//this.gridMain.IsEnabled = false;
|
||||
|
||||
|
||||
InitApp();
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ShowError("LỖI CỔNG KẾT NỐI, VUI LÒNG KIỂM TRA LẠI CỔNG KẾT NỐI");
|
||||
//MessageBox.Show("Cổng đang mở, kiểm tra lại cổng kết nối");
|
||||
//this.Close();
|
||||
}
|
||||
}
|
||||
public void InitApp()
|
||||
{
|
||||
LoginUsingQRCode();
|
||||
panelError.Visibility = Visibility.Collapsed;
|
||||
|
||||
serialPortDE70.ReadBufferSize = 4096;
|
||||
serialPortDE70.WriteBufferSize = 4096;
|
||||
cCmdRsp = new CCmdRsp(serialPortDE70);
|
||||
|
||||
serialPortDE70.PortName = "COM4";
|
||||
serialPortDE70.BaudRate = 9600;
|
||||
serialPortDE70.Parity = Parity.Even;
|
||||
serialPortDE70.DataBits = 8;
|
||||
serialPortDE70.StopBits = StopBits.One;
|
||||
|
||||
serialPortSensor.PortName = "COM3";
|
||||
serialPortSensor.BaudRate = 9600;
|
||||
serialPortSensor.Parity = Parity.None;
|
||||
serialPortSensor.DataBits = 8;
|
||||
serialPortSensor.StopBits = StopBits.One;
|
||||
|
||||
//Subscrible to the DataReveied event
|
||||
|
||||
serialPortDE70.Open();
|
||||
serialPortSensor.Open();
|
||||
|
||||
bInitialized = InitSession();
|
||||
|
||||
timer = new DispatcherTimer();
|
||||
timer.Interval = new TimeSpan(0, 0, 10); //10 seconds
|
||||
timer.Tick += Timer_Tick;
|
||||
timer.Start();
|
||||
|
||||
sensorTimer = new DispatcherTimer();
|
||||
sensorTimer.Interval = new TimeSpan(0, 0, 1); //10 seconds
|
||||
sensorTimer.Tick += SensorTimer_Tick;
|
||||
sensorTimer.Start();
|
||||
}
|
||||
|
||||
public void ShutdownApp()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (serialPortDE70.IsOpen)
|
||||
serialPortDE70.Close();
|
||||
if (serialPortSensor.IsOpen)
|
||||
serialPortSensor.Close();
|
||||
|
||||
if (timer != null)
|
||||
{
|
||||
timer.Tick -= Timer_Tick;
|
||||
timer.Stop();
|
||||
}
|
||||
if (sensorTimer != null)
|
||||
{
|
||||
sensorTimer.Tick -= SensorTimer_Tick;
|
||||
sensorTimer.Stop();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
}
|
||||
}
|
||||
public void SetStep(int step)
|
||||
{
|
||||
switch(step)
|
||||
{
|
||||
case 0:
|
||||
btnStart.IsEnabled = true;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = false;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 1:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = false;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = false;
|
||||
btnEnd.IsEnabled =false;
|
||||
break;
|
||||
case 2:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = false;
|
||||
break;
|
||||
case 3:
|
||||
btnStart.IsEnabled = false;
|
||||
btnCheck.IsEnabled = true;
|
||||
btnCountStart.IsEnabled = true;
|
||||
btnStoreStart.IsEnabled = true;
|
||||
btnEnd.IsEnabled = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public void InitSessionCount()
|
||||
{
|
||||
lvCountItems.Clear();
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "1000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "2000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "5000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "10000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "20000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "50000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "100000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "200000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "500000",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems.Add(new LvCountItem
|
||||
{
|
||||
Name = "Tổng",
|
||||
Quantity = "0"
|
||||
});
|
||||
lvCountItems[10].Quantity = "0";
|
||||
lvCountItems[10].Value = "0";
|
||||
|
||||
lvCount.ItemsSource = lvCountItems;
|
||||
|
||||
//lvCountItems[0].Quantity = "10";
|
||||
}
|
||||
public long maxQuantitySheet = 10000;
|
||||
public int quantityStored = 0;
|
||||
public int totalAllDenominations = 0;
|
||||
public int posDenomi;
|
||||
public bool printerFlag = false;
|
||||
public static string? recvDataString;
|
||||
public int[] TempQuantity = new int[10] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
||||
public int[] TempNote = new int[5] { 0, 0, 0, 0, 0 };
|
||||
public int[] Notes = new int[5] { 0, 0, 0, 0, 0 };
|
||||
|
||||
private void SensorTimer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
int state = 0;
|
||||
if (serialPortSensor.IsOpen==true)
|
||||
{
|
||||
serialPortSensor.Write(new byte[] { (byte)'S', 13, 10 }, 0, 3);
|
||||
var buffer = new byte[16];
|
||||
|
||||
int n = serialPortSensor.Read(buffer, 0, buffer.Length);
|
||||
|
||||
for (int i = 1; i < n - 1; i++)
|
||||
{
|
||||
if ((buffer[i] == 13) && (buffer[i + 1] == 10))
|
||||
{
|
||||
state = buffer[i - 1]-48;
|
||||
if(bInitialized)
|
||||
{
|
||||
if (state != 0)
|
||||
gridMain.IsEnabled = false;
|
||||
else
|
||||
gridMain.IsEnabled = true;
|
||||
}
|
||||
switch (state)
|
||||
{
|
||||
case 0:
|
||||
lblStatus.Content = "Két: đóng, Túi: đóng";
|
||||
break;
|
||||
case 1:
|
||||
lblStatus.Content = "Két: đóng, Túi: đã bị lấy ra";
|
||||
break;
|
||||
case 2:
|
||||
lblStatus.Content = "Két: mở, Túi: đóng";
|
||||
break;
|
||||
case 3:
|
||||
lblStatus.Content = "Két: mở, Túi: đã bị lấy ra";
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
timer.IsEnabled = false;
|
||||
|
||||
APIModels.SendHealthCheck();
|
||||
|
||||
timer.IsEnabled = true;
|
||||
}
|
||||
public int UpdateTotalQuantity()
|
||||
{
|
||||
int total = 0;
|
||||
foreach (var item in lvCountItems)
|
||||
{
|
||||
if (item.Name != "Tổng")
|
||||
{
|
||||
int quantity = 0;
|
||||
if (int.TryParse(item.Quantity, out quantity))
|
||||
{
|
||||
total += quantity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
public int AutoSerialGet(SerialPort serialPort)
|
||||
{
|
||||
int ret;
|
||||
ushort seri_num = 0;
|
||||
ushort get_num = 0;
|
||||
bool endflg = false;
|
||||
|
||||
while (true)
|
||||
{
|
||||
ret = cCmdRsp.SendSerialSense();
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
ret = cCmdRsp.GetSerialNum(out seri_num);
|
||||
if (ret == Constants.E_OK)
|
||||
{
|
||||
// Serial number acquisition
|
||||
|
||||
if (cCmdRsp.ChkCntEnd())
|
||||
{
|
||||
endflg = true;
|
||||
Debug.WriteLine("END FLAG: "+cCmdRsp.recv_dat.dat[1]);
|
||||
}
|
||||
Debug.WriteLine("START");
|
||||
Debug.WriteLine($"Num Serial: {seri_num}");
|
||||
|
||||
while (get_num < seri_num)
|
||||
{
|
||||
get_num++;
|
||||
ret = cCmdRsp.SendGetSerial(get_num);
|
||||
|
||||
|
||||
switch (cCmdRsp.recv_dat.dat[18])
|
||||
{
|
||||
case 0x00: TempNote[0] ++; Notes[0] += TempNote[0]; break;
|
||||
case 0x02:
|
||||
//TempNote[1] ++;
|
||||
switch (cCmdRsp.recv_dat.dat[17])
|
||||
{
|
||||
case 0x00: TempQuantity[0]++; break;
|
||||
case 0x01: TempQuantity[1]++; break;
|
||||
case 0x02: TempQuantity[2]++; break;
|
||||
case 0x03: TempQuantity[3]++; break;
|
||||
case 0x04: TempQuantity[4]++; break;
|
||||
case 0x05: TempQuantity[5]++; break;
|
||||
case 0x06: TempQuantity[6]++; break;
|
||||
case 0x07: TempQuantity[7]++; break;
|
||||
case 0x08: TempQuantity[8]++; break;
|
||||
case 0x09: TempQuantity[9]++; break;
|
||||
|
||||
}
|
||||
break;
|
||||
case 0x03: TempNote[2] ++; Notes[2] += TempNote[2]; break;
|
||||
case 0x0b: TempNote[3] ++; Notes[3] += TempNote[3]; break;
|
||||
case 0x0c: TempNote[4] ++; Notes[4] += TempNote[4]; break;
|
||||
}
|
||||
}
|
||||
|
||||
Debug.WriteLine("END");
|
||||
//Debug.WriteLine("Ellapsed Time: " + timeSpan.TotalSeconds);
|
||||
if (endflg)
|
||||
{
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END GET SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine("END SEND SERIAL: "+ret);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public void btnCountStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = false;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
try
|
||||
{
|
||||
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CNTSTART);
|
||||
//var recvData = DE70_CMD.SendxxCmd((byte)CMD_BYTE.CMD_DE_CNTSTART, serialPort);
|
||||
|
||||
//Thread.Sleep(20000);
|
||||
if (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[2] != 43) { }
|
||||
do
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_SENSE);
|
||||
}
|
||||
while (cCmdRsp.recv_dat != null && cCmdRsp.recv_dat.dat[1] == 0x09); //SR2 = 0x09 : Counting Status
|
||||
|
||||
//SR3 = 0x43 : Stacker full
|
||||
|
||||
AutoSerialGet(serialPortDE70);
|
||||
|
||||
if (sessions == null || sessions.Count == 0)
|
||||
{
|
||||
double tempSum = 0;
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
lvCountItems[i].Quantity = TempQuantity[9 - i].ToString();
|
||||
tempSum += lvCountItems[i].getValue();
|
||||
}
|
||||
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = tempSum.ToString();
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
double sum = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
|
||||
}
|
||||
|
||||
a += TempQuantity[9 - i];
|
||||
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sum += lvCountItems[i].getValue();
|
||||
|
||||
}
|
||||
//Update amount of money
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sum.ToString();
|
||||
|
||||
}
|
||||
SetStep(2);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnCheck_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_CANCEL);
|
||||
|
||||
double sumStored;
|
||||
|
||||
//TempNote[1] = 0;
|
||||
|
||||
if (sessions != null)
|
||||
{
|
||||
sumStored = 0;
|
||||
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
int a = 0;
|
||||
for (int j = 0; j < sessions.Count; j++)
|
||||
{
|
||||
|
||||
a += sessions[j].QuantityDenomi[9 - i];
|
||||
//quantityStored += lvCountItems[i].getQuantity();
|
||||
}
|
||||
lvCountItems[i].Quantity = a.ToString();
|
||||
sumStored += lvCountItems[i].getValue();
|
||||
}
|
||||
lvCountItems[10].Quantity = UpdateTotalQuantity().ToString();
|
||||
lvCountItems[10].Value = sumStored.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
private void btnStoreStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
printerFlag = true;
|
||||
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
LogAction(currentMethod, null);
|
||||
sessions.Add(new CountSession());
|
||||
|
||||
sessions[sessions.Count - 1].QuantityDenomi = (int[])TempQuantity.Clone();
|
||||
quantityStored = UpdateTotalQuantity();
|
||||
|
||||
Debug.WriteLine(quantityStored);
|
||||
|
||||
Array.Clear(TempQuantity, 0, TempQuantity.Length);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_STORESTART);
|
||||
SetStep(3);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnStart_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
InitSession();
|
||||
try
|
||||
{
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
LogAction(currentMethod, null);
|
||||
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_SENSE);
|
||||
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
SetStep(1);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
private void btnEnd_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
string currentMethod = MethodBase.GetCurrentMethod().Name;
|
||||
|
||||
try
|
||||
{
|
||||
LogAction(currentMethod, null);
|
||||
serialPortDE70.DiscardInBuffer();
|
||||
serialPortDE70.DiscardOutBuffer();
|
||||
|
||||
//SendData2Server
|
||||
var data2Send = new CountingData2Send
|
||||
{
|
||||
Sessions = sessions,
|
||||
MachineId = null,
|
||||
UserId = AppData.CurrentCustomerAccount.CustomerId,
|
||||
MachineTime = DateTime.Now.ToString("yyyyMMddHHmmss"),
|
||||
RejectNotes = Notes[0],
|
||||
GenuineNotes = quantityStored,
|
||||
UnfitNotes = Notes[2],
|
||||
CounterfeitNotes = Notes[3],
|
||||
SuspendNotes = Notes[4]
|
||||
|
||||
};
|
||||
var str = JsonConvert.SerializeObject(data2Send);
|
||||
|
||||
APIModels.SendCountingData(data2Send);
|
||||
//Reset all and ready to next session
|
||||
|
||||
if(printerFlag == true)
|
||||
{
|
||||
PrintReceipt();
|
||||
printerFlag = false;
|
||||
|
||||
}
|
||||
InitSession();
|
||||
//Debug.WriteLine("Reject Note: " + Notes[0] );
|
||||
//Debug.WriteLine("Genuine note stored: " + quantityStored);
|
||||
//Debug.WriteLine("Unfit note: " + Notes[2]);
|
||||
//Debug.WriteLine("Counterfeit: " + Notes[3]);
|
||||
//Debug.WriteLine("Suspend: " + Notes[4]);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
LogException(currentMethod, ex.ToString());
|
||||
}
|
||||
LoginUsingQRCode();
|
||||
|
||||
}
|
||||
private void ShowError(string strError)
|
||||
{
|
||||
gridMain.IsEnabled = false;
|
||||
btnCollect2.Visibility=Visibility.Collapsed;
|
||||
panelError.Visibility = Visibility.Visible;
|
||||
lblError.Text = strError;
|
||||
}
|
||||
|
||||
private bool InitSession()
|
||||
{
|
||||
try
|
||||
{
|
||||
//Check status
|
||||
cCmdRsp.SendDeSense();
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
int IsCassetteFull=data[17] & 0x08;
|
||||
if(IsCassetteFull != 0)
|
||||
{
|
||||
ShowError("TÚI ĐẦY, ĐỀ NGHỊ LẤY TÚI TRƯỚC KHI TIẾP TỤC THAO TÁC");
|
||||
btnCollect2.Visibility=Visibility.Visible;
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
InitSessionCount();
|
||||
sessions.Clear();
|
||||
Array.Clear(TempNote, 0, TempNote.Length);
|
||||
Array.Clear(Notes, 0, Notes.Length);
|
||||
quantityStored = 0;
|
||||
maxQuantitySheet = 0;
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
SetStep(0);
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
LogException("InitSession", ex.ToString());
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void PrintReceipt()
|
||||
{
|
||||
var shopName = AppData.CurrentCustomerAccount.Name;
|
||||
var shopCode = AppData.CurrentCustomerAccount.CustomerId;
|
||||
var tradingCode = "TRA04052024CDM";
|
||||
var storeAccountNumber = 686868686688;
|
||||
var currentTime = DateTime.Now;
|
||||
var printDocument = new PrintDocument();
|
||||
printDocument.PrinterSettings.PrinterName = "CUSTOM K80";
|
||||
printDocument.PrintPage += (sender, e) =>
|
||||
{
|
||||
e.Graphics.DrawString("Biên nhận nộp tiền", new Font("Arial", 15), System.Drawing.Brushes.Black, new PointF(80, 10));
|
||||
e.Graphics.DrawString("Mã máy CDM: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 60));
|
||||
e.Graphics.DrawString("Batch no: ", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 90));
|
||||
e.Graphics.DrawString("Thời gian GD: " + currentTime.ToString("dd/MM/yyyy HH:mm:ss"), new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 120));
|
||||
e.Graphics.DrawString("Mã GD: " + tradingCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 150));
|
||||
e.Graphics.DrawString("Mã gian hàng: " + shopCode, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 180));
|
||||
e.Graphics.DrawString("Tên gian hàng: " + shopName, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 210));
|
||||
e.Graphics.DrawString("STK gian hàng: " + storeAccountNumber, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 240));
|
||||
e.Graphics.DrawString("Số tiền nộp: " + lvCountItems[10].Value, new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(50, 270));
|
||||
e.Graphics.DrawString("*****Xin cám ơn******", new Font("Arial", 9), System.Drawing.Brushes.Black, new PointF(100, 300));
|
||||
// To send raw ESC/POS commands, you'd typically use e.Graphics.DrawString() with the command string,
|
||||
// or for more complex scenarios, directly manipulate the byte stream sent to the printer.
|
||||
};
|
||||
printDocument.Print();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public void LogAction(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("log.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
public void LogException(string strAction, string? strData)
|
||||
{
|
||||
if (strData != null) strData = "Data: " + strData;
|
||||
File.AppendAllText("logException.txt", "\r\n" + DateTime.Now.ToString("yyyyMMddHHmmss: ") +
|
||||
"Action: " + strAction + " " + strData);
|
||||
}
|
||||
|
||||
private void LoginUsingQRCode()
|
||||
{
|
||||
var wnd = new WelcomeWindow();
|
||||
wnd.ShowDialog();
|
||||
|
||||
lblUser.Content = "";
|
||||
//var wnd = new QRCodeZebraWindow();
|
||||
//wnd.ShowDialog();
|
||||
if (wnd.DialogResult == true)
|
||||
{
|
||||
var strQR = wnd.QRCodeContent;
|
||||
var strPincode = wnd.PinCode;
|
||||
if (AppData.customerAccounts!=null)
|
||||
{
|
||||
CustomerAccount? cca = null;
|
||||
if(strQR!=null)
|
||||
{
|
||||
cca = AppData.customerAccounts.Where(x => x.QRCode == strQR).FirstOrDefault();
|
||||
}
|
||||
else if(strPincode!=null)
|
||||
{
|
||||
strPincode = strPincode.ToUpper();
|
||||
cca = AppData.customerAccounts.Where(x => x.PINCode == strPincode).FirstOrDefault();
|
||||
}
|
||||
|
||||
if (cca != null)
|
||||
{
|
||||
AppData.CurrentCustomerAccount = cca;
|
||||
lblUser.Content = $"Xin chào khách hàng: {cca.Name} (Gian hàng {cca.CustomerId})";
|
||||
}
|
||||
else
|
||||
{
|
||||
MessageBox.Show("QRCode không đúng, vui lòng thử lại");
|
||||
LoginUsingQRCode();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void btnLoginByPINCode_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
var wnd = new PinCodeWindow();
|
||||
wnd.ShowDialog();
|
||||
}
|
||||
|
||||
private void btnCollect_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendXXCmd((byte)Command.CMD_DE_UNLOCK);
|
||||
Thread.Sleep(1000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
//Event fix
|
||||
var recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] == recvData.dat[16])
|
||||
{
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
else
|
||||
{
|
||||
cCmdRsp.SendEventFix(recvData.dat[16]);
|
||||
cCmdRsp.SendLock();
|
||||
}
|
||||
|
||||
var currentMode = cCmdRsp.GetLockParam().mode;
|
||||
cCmdRsp.GetLockParam().mode = Mode.MODE_COLLECTION;
|
||||
cCmdRsp.SendLock();
|
||||
Thread.Sleep(10000);
|
||||
cCmdRsp.SendDeSense();
|
||||
Thread.Sleep(1000);
|
||||
recvData = cCmdRsp.recv_dat;
|
||||
|
||||
if (recvData.dat[14] != recvData.dat[16])
|
||||
{
|
||||
ShowError("Khởi tạo bộ đếm thành công");
|
||||
ShutdownApp();
|
||||
InitApp();
|
||||
}
|
||||
//Thread.Sleep(5000);
|
||||
//cCmdRsp.GetLockParam().mode = currentMode;
|
||||
//cCmdRsp.SendLock();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
static public class DE70Commands
|
||||
{
|
||||
//public static string ReadyToCountResponse = "40 07 41 00 01 00 00 00 00 00 00 10 00";
|
||||
public static string CountingResponse = "40 09 41 01 01 00 00 00 00 00 00 10 00";
|
||||
public static string ExceptionResponse = "40 07 41 10 10 01 00 00 00 00 00 00 10 10 00 00";
|
||||
public static string DESenseResponse1 = "40 04 41 00 00 00 00 00 00 00 00 10 00 00 00 00 01 70 00";
|
||||
public static string DESenseResponse2 = "40 04 41 00 00 00 00 00 00 00 00 10 00 00 01 00 02 70 00 ";
|
||||
public static string DESenseResponse3 = "40 04 41 00 00 00 00 00 00 00 00 10 00 00 02 00 03 70 00 ";
|
||||
public static string DESenseResponse4 = "40 04 41 00 00 00 00 00 00 00 00 10 00 00 03 00 04 70 00 ";
|
||||
public static string DESenseResponse5 = "40 04 41 00 00 00 00 00 00 00 00 10 00 00 04 00 05 70 00 ";
|
||||
public static string DESenseResponse0 = "40 04 41 00 00 00 00 00 00 00 00 10 00 00 05 00 00 70 00 ";
|
||||
|
||||
public static string[] DESenseSatisfyResponse = { "40 04 41 00 00 00 00 00 00 00 00 10 00 00 05 00 05 70 00",
|
||||
"40 04 41 00 00 00 00 00 00 00 00 10 00 00 04 00 04 70 00",
|
||||
"40 04 41 00 00 00 00 00 00 00 00 10 00 00 03 00 03 70 00",
|
||||
"40 04 41 00 00 00 00 00 00 00 00 10 00 00 02 00 02 70 00",
|
||||
"40 04 41 00 00 00 00 00 00 00 00 10 00 00 01 00 01 70 00",
|
||||
"40 04 41 00 00 00 00 00 00 00 00 10 00 00 00 00 00 70 00" };
|
||||
|
||||
//public static byte[] CountStartCmd= new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x73, 0x10, 0x03, 0x41 };
|
||||
//public static byte[] DESenseCmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x60, 0x10, 0x03, 0x52 };
|
||||
//public static byte[] UnlockCmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x71, 0x10, 0x03, 0x43 };
|
||||
//public static byte[] CancelCmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x76, 0x10, 0x03, 0x44 };
|
||||
//public static byte[] StoreStartCmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x31, 0x75, 0x10, 0x03, 0x47 };
|
||||
public static byte[] LockCmd = new byte[] { 0x10, 0x02, 0x30, 0x31, 0x33, 0x70, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x09, 0x00, 0x01, 0x01, 0x00, 0x10, 0x03, 0x48 };
|
||||
|
||||
//Event data fix
|
||||
|
||||
public static byte[] EventDataFixed_01_Cmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x01, 0x10, 0x03, 0x54 };
|
||||
public static byte[] EventDataFixed_02_Cmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x02, 0x10, 0x03, 0x57 };
|
||||
public static byte[] EventDataFixed_03_Cmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x03, 0x10, 0x03, 0x56 };
|
||||
public static byte[] EventDataFixed_04_Cmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x04, 0x10, 0x03, 0x51 };
|
||||
public static byte[] EventDataFixed_05_Cmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x05, 0x10, 0x03, 0x50 };
|
||||
public static byte[] EventDataFixed_00_Cmd = new byte[] { 0x10, 0x02, 0x30, 0x30, 0x33, 0x65, 0x00, 0x00, 0x10, 0x03, 0x55 };
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,290 @@
|
||||
using DE70_CMDv2;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using SafeBagDE70.Model;
|
||||
using Serilog;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.ComponentModel;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Controls;
|
||||
|
||||
namespace SafeBagDE70
|
||||
{
|
||||
public static class AppData
|
||||
{
|
||||
public static string CDMPort = "COM4";
|
||||
public static string SensorPort = "COM3";
|
||||
public static Version? CurrentVersion = null;
|
||||
public static List<CustomerAccount>? customerAccounts = null;
|
||||
public static CustomerAccount? CurrentCustomerAccount{get;set;}
|
||||
public static CCmdRsp? cCmdRsp=null;
|
||||
public static bool IsAuthenticated = false;
|
||||
public static bool IsInTransaction = false;
|
||||
public static int WDTCount = 0;
|
||||
public static ObservableCollection<string> logCollection = new ObservableCollection<string>();
|
||||
public static ListView logListView = null;
|
||||
public static int MaxLogCount = 500;
|
||||
public static void Init()
|
||||
{
|
||||
|
||||
customerAccounts = new List<CustomerAccount>{
|
||||
new CustomerAccount{Name="NGUYỄN ĐÌNH THUẬN",CustomerId="HUE_0000000001",QRCode="HUE_0000000001",PINCode="H0001" },
|
||||
new CustomerAccount{Name="HOÀNG VĂN HIỆP",CustomerId="HUE_0000000002",QRCode="HUE_0000000002",PINCode="H0002" },
|
||||
new CustomerAccount{Name="PHẠM NGỌC HƯNG",CustomerId="HUE_0000000003",QRCode="HUE_0000000003",PINCode="H0003" },
|
||||
new CustomerAccount{Name="AMHUE-ESTELLETEST",CustomerId="00DZAMHUE0004",QRCode="00DZAMHUE0004",PINCode="H0004" },
|
||||
new CustomerAccount{Name="AMHUE-ECCOTEST",CustomerId="00DZAMHUE0005",QRCode="00DZAMHUE0005",PINCode="H0005" },
|
||||
new CustomerAccount{Name="AMHUE-ALDOTEST",CustomerId="00DZAMHUE0006",QRCode="00DZAMHUE0006",PINCode="H0006" },
|
||||
new CustomerAccount{Name="AMHUE-MLBTEST",CustomerId="00DZAMHUE0007",QRCode="00DZAMHUE0007",PINCode="H0007" },
|
||||
new CustomerAccount{Name="AMHUE-PEDROTEST",CustomerId="00DZAMHUE0008",QRCode="00DZAMHUE0008",PINCode="H0008" }
|
||||
};
|
||||
CurrentCustomerAccount = customerAccounts[0];
|
||||
CDMSTATE=new CDMSTATE();
|
||||
}
|
||||
public static CDMSTATE? CDMSTATE = null;
|
||||
private static DateTime CutOffTime = new DateTime(1, 1, 1, 12, 0, 0); // 12:00 noon as cut-off time
|
||||
|
||||
public static void GetNewTransactionCode()
|
||||
{
|
||||
DateTime transactionDateTime = DateTime.Now;
|
||||
string merchantCode = CurrentCustomerAccount.CustomerId;
|
||||
|
||||
// Adjust transaction date if it's past cut-off time (12:00 noon)
|
||||
DateTime prevadjustedDate = CurrentCustomerAccount.TransactionTime.Hour >= CutOffTime.Hour ? transactionDateTime.Date : transactionDateTime.Date.AddDays(-1);
|
||||
|
||||
DateTime adjustedDate = transactionDateTime.Hour >= CutOffTime.Hour ? transactionDateTime.Date : transactionDateTime.Date.AddDays(-1);
|
||||
if ((adjustedDate - prevadjustedDate).Days > 0)
|
||||
{
|
||||
CurrentCustomerAccount.TransactionCount =1;
|
||||
}
|
||||
else
|
||||
{
|
||||
CurrentCustomerAccount.TransactionCount++;
|
||||
}
|
||||
var transactionCount = CurrentCustomerAccount.TransactionCount;
|
||||
string datePart = adjustedDate.ToString("yyyyMMdd");
|
||||
string timePart = transactionDateTime.ToString("HHmmss");
|
||||
string transactionCountPart = transactionCount.ToString("D2"); // Ensure 2 digits
|
||||
|
||||
// Combine all parts to form the transaction ID
|
||||
string transactionId = $"{datePart}{timePart}{merchantCode}{transactionCountPart}";
|
||||
|
||||
CurrentCustomerAccount.TransactionCode = transactionId;
|
||||
CurrentCustomerAccount.TransactionTime = transactionDateTime;
|
||||
}
|
||||
public static CDMSTATE? GetCDMState()
|
||||
{
|
||||
if(cCmdRsp!=null)
|
||||
{
|
||||
cCmdRsp.SendDeSense();
|
||||
string strSend = cCmdRsp.GetSendDat(false);
|
||||
string strRecv = cCmdRsp.GetRecvDat();
|
||||
Log.Information($"[SEND] {strSend}");
|
||||
Log.Information($"[RECV] {strRecv}");
|
||||
var data = cCmdRsp.recv_dat.dat;
|
||||
if(AppData.CDMSTATE!=null)
|
||||
{
|
||||
AppData.CDMSTATE.IsCassetteFull = data[17] & 0x08;
|
||||
AppData.CDMSTATE.IsNotesInEscrow = data[4] & 0x01;
|
||||
AppData.CDMSTATE.IsRejectPocketFull = data[3] & 0x40;
|
||||
AppData.CDMSTATE.IsNotesInRejectPocket = data[3] & 0x10;
|
||||
AppData.CDMSTATE.IsNotesInHopper = data[3] & 0x01;
|
||||
AppData.CDMSTATE.RequestTime = DateTime.Now;
|
||||
AppData.CDMSTATE.SR1 = data[0];
|
||||
AppData.CDMSTATE.SR2 = data[1];
|
||||
AppData.CDMSTATE.SR3 = data[2];
|
||||
}
|
||||
|
||||
}
|
||||
return AppData.CDMSTATE;
|
||||
}
|
||||
|
||||
}
|
||||
public class CustomerAccount
|
||||
{
|
||||
public string? Name { get; set; }
|
||||
public string? CustomerId { get; set; }
|
||||
public string? QRCode { get; set; }
|
||||
public string? PINCode { get; set; }
|
||||
public int TransactionCount { get; set; } = 1;
|
||||
public DateTime TransactionTime { get; set; }
|
||||
public string TransactionCode { get; set; }
|
||||
}
|
||||
public class CountSession
|
||||
{
|
||||
public CountSession()
|
||||
{
|
||||
for (int i = 0; i < QuantityDenomi.Count(); i++)
|
||||
{
|
||||
QuantityDenomi[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < SumDenomi.Count(); i++)
|
||||
{
|
||||
SumDenomi[i] = 0;
|
||||
}
|
||||
for (int i = 0; i < TempNotes.Count(); i++)
|
||||
{
|
||||
TempNotes[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int[] QuantityDenomi { get; set; } = new int[10];
|
||||
public int[] SumDenomi { get; set; } = new int[10];
|
||||
public bool IsStored = false;
|
||||
public int[] TempNotes { get; set; } = new int[5];
|
||||
|
||||
}
|
||||
|
||||
public class CountingData2Send
|
||||
{
|
||||
public string? TransactionCode { get; set; }
|
||||
public List<CountSession>? Sessions { get; set; }
|
||||
public string? UserId { get; set; }
|
||||
public string? MachineId { get; set; }
|
||||
public string? MachineTime { get; set; }
|
||||
public int RejectNotes { get; set; }
|
||||
public int GenuineNotes { get; set; }
|
||||
public int UnfitNotes { get; set; }
|
||||
public int CounterfeitNotes { get; set; }
|
||||
public int SuspendNotes { get; set; }
|
||||
public int CountingState { get; set; }//0-Normal End, 1-Timeout End
|
||||
}
|
||||
|
||||
public class NotesInSession : INotifyPropertyChanged
|
||||
{
|
||||
|
||||
private int _GenuineNotes;
|
||||
public int GenuineNotes
|
||||
{
|
||||
get
|
||||
{
|
||||
return _GenuineNotes;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_GenuineNotes != value)
|
||||
{
|
||||
_GenuineNotes = value;
|
||||
OnPropertyChanged(nameof(GenuineNotes));
|
||||
}
|
||||
}
|
||||
}
|
||||
private int _RejectNotes;
|
||||
public int RejectNotes
|
||||
{
|
||||
get
|
||||
{
|
||||
return _RejectNotes;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_RejectNotes != value)
|
||||
{
|
||||
_RejectNotes = value;
|
||||
OnPropertyChanged(nameof(RejectNotes));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
public class CDMSTATE : INotifyPropertyChanged
|
||||
{
|
||||
public int IsCassetteFull = 0;
|
||||
public int IsNotesInEscrow = 0;
|
||||
public int IsRejectPocketFull = 0;
|
||||
public int IsNotesInRejectPocket = 0;
|
||||
public int IsNotesInHopper = 0;
|
||||
private byte _SR1;
|
||||
public byte SR1 {
|
||||
get
|
||||
{
|
||||
return _SR1;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_SR1 != value)
|
||||
{
|
||||
_SR1 = value;
|
||||
UpdateCDMStatus();
|
||||
OnPropertyChanged(nameof(SR1));
|
||||
}
|
||||
}
|
||||
}
|
||||
private byte _SR2;
|
||||
public byte SR2
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SR2;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_SR2 != value)
|
||||
{
|
||||
_SR2 = value;
|
||||
UpdateCDMStatus();
|
||||
OnPropertyChanged(nameof(SR2));
|
||||
}
|
||||
}
|
||||
}
|
||||
private byte _SR3;
|
||||
public byte SR3
|
||||
{
|
||||
get
|
||||
{
|
||||
return _SR3;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_SR3 != value)
|
||||
{
|
||||
_SR3 = value;
|
||||
UpdateCDMStatus();
|
||||
OnPropertyChanged(nameof(SR3));
|
||||
}
|
||||
}
|
||||
}
|
||||
public void UpdateCDMStatus()
|
||||
{
|
||||
if (AppData.cCmdRsp != null) {
|
||||
CDMStatus = RequestTime.ToString("yyyyMMdd HHmmss")+ " SR1: " + AppData.cCmdRsp.GetSR1Summary(SR1) + " SR2: " + AppData.cCmdRsp.GetSR2Summary(SR2);
|
||||
}
|
||||
}
|
||||
private string? _CDMStatus;
|
||||
public string? CDMStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
return _CDMStatus;
|
||||
}
|
||||
set
|
||||
{
|
||||
if (_CDMStatus != value)
|
||||
{
|
||||
_CDMStatus = value;
|
||||
|
||||
OnPropertyChanged(nameof(CDMStatus));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public DateTime RequestTime = DateTime.Now;
|
||||
|
||||
public event PropertyChangedEventHandler PropertyChanged;
|
||||
protected virtual void OnPropertyChanged(string propertyName)
|
||||
{
|
||||
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace VirtualKeyboard.Wpf.Types
|
||||
{
|
||||
enum UppercaseMode
|
||||
{
|
||||
None,
|
||||
FirstUpper,
|
||||
AlwaysUpper
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"version": 3,
|
||||
"targets": {
|
||||
"net8.0-windows7.0": {}
|
||||
},
|
||||
"libraries": {},
|
||||
"projectFileDependencyGroups": {
|
||||
"net8.0-windows7.0": []
|
||||
},
|
||||
"packageFolders": {
|
||||
"C:\\Users\\Admin\\.nuget\\packages\\": {}
|
||||
},
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "D:\\SRC\\VirtualKeyboard\\VirtualKeyboard.csproj",
|
||||
"projectName": "VirtualKeyboard",
|
||||
"projectPath": "D:\\SRC\\VirtualKeyboard\\VirtualKeyboard.csproj",
|
||||
"packagesPath": "C:\\Users\\Admin\\.nuget\\packages\\",
|
||||
"outputPath": "D:\\SRC\\VirtualKeyboard\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\Admin\\AppData\\Roaming\\NuGet\\NuGet.Config",
|
||||
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
|
||||
],
|
||||
"originalTargetFrameworks": [
|
||||
"net8.0-windows"
|
||||
],
|
||||
"sources": {
|
||||
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
|
||||
"https://api.nuget.org/v3/index.json": {}
|
||||
},
|
||||
"frameworks": {
|
||||
"net8.0-windows7.0": {
|
||||
"targetAlias": "net8.0-windows",
|
||||
"projectReferences": {}
|
||||
}
|
||||
},
|
||||
"warningProperties": {
|
||||
"warnAsError": [
|
||||
"NU1605"
|
||||
]
|
||||
},
|
||||
"restoreAuditProperties": {
|
||||
"enableAudit": "true",
|
||||
"auditLevel": "low",
|
||||
"auditMode": "direct"
|
||||
}
|
||||
},
|
||||
"frameworks": {
|
||||
"net8.0-windows7.0": {
|
||||
"targetAlias": "net8.0-windows",
|
||||
"imports": [
|
||||
"net461",
|
||||
"net462",
|
||||
"net47",
|
||||
"net471",
|
||||
"net472",
|
||||
"net48",
|
||||
"net481"
|
||||
],
|
||||
"assetTargetFallback": true,
|
||||
"warn": true,
|
||||
"frameworkReferences": {
|
||||
"Microsoft.NETCore.App": {
|
||||
"privateAssets": "all"
|
||||
},
|
||||
"Microsoft.WindowsDesktop.App.WPF": {
|
||||
"privateAssets": "none"
|
||||
}
|
||||
},
|
||||
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.303/PortableRuntimeIdentifierGraph.json"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user