You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
527 lines
15 KiB
527 lines
15 KiB
using EC.AutoWeightServer.Center;
|
|
using EC.AutoWeightServer.Model.Config;
|
|
using EC.AutoWeightServer.Model.EventArgsEx;
|
|
using EC.AutoWeightServer.Model.State;
|
|
using EC.Entity.Transport;
|
|
using EC.Utils;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace EC.AutoWeightServer.UI.UC
|
|
{
|
|
public partial class UCCarIn : UserControl
|
|
{
|
|
private FrmMainServer _mainServer;
|
|
|
|
public UCCarIn()
|
|
{
|
|
InitializeComponent();
|
|
txtBillWeight.GotFocus += TxtBillWeight_Enter; //获取焦点前发生事件
|
|
}
|
|
|
|
internal void SetMainServer(FrmMainServer server)
|
|
{
|
|
_mainServer = server;
|
|
}
|
|
|
|
#region 界面组件内容读写方法
|
|
|
|
internal string GetLabelSerialNo()
|
|
{
|
|
return txtSerialNo.Text;
|
|
}
|
|
|
|
internal void SetLabelSerialNo(string txt)
|
|
{
|
|
txtSerialNo.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
txtSerialNo.Text = txt;
|
|
});
|
|
}
|
|
|
|
internal void SetLabelMaterialNo(string txt)
|
|
{
|
|
txtMaterialNo.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
txtMaterialNo.Text = txt;
|
|
});
|
|
}
|
|
|
|
internal string GetLabelBillWeight()
|
|
{
|
|
return txtBillWeight.Text;
|
|
}
|
|
|
|
internal void SetLabelBillWeight(string txt)
|
|
{
|
|
txtBillWeight.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
txtBillWeight.Text = txt;
|
|
});
|
|
}
|
|
|
|
internal string GetLabelPlate()
|
|
{
|
|
return txtPlate.Text;
|
|
}
|
|
|
|
internal void SetLabelPlate(string txt)
|
|
{
|
|
txtPlate.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
txtPlate.Text = txt;
|
|
});
|
|
}
|
|
|
|
internal string GetComboBoxTrailerPlate()
|
|
{
|
|
return comboBoxTrailer.SelectedItem?.ToString();
|
|
}
|
|
|
|
internal string GetLabelInWeight()
|
|
{
|
|
return txtInWeight.Text;
|
|
}
|
|
|
|
internal void SetLabelInWeight(decimal? weightDec)
|
|
{
|
|
txtInWeight.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
var txt = (weightDec != null) ? CommonUtil.WeightDecToStr((decimal)weightDec, 3, '0') : string.Empty;
|
|
txtInWeight.Text = txt;
|
|
});
|
|
}
|
|
|
|
internal void SetLabelDriver1(string name)
|
|
{
|
|
labelDriver1.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
labelDriver1.Text = name;
|
|
});
|
|
}
|
|
|
|
internal void SetLabelDriver2(string name)
|
|
{
|
|
labelDriver2.Invoke((MethodInvoker)delegate ()
|
|
{
|
|
labelDriver2.Text = name;
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 初始化组件内容
|
|
/// </summary>
|
|
/// <param name="serialNo"></param>
|
|
/// <param name="plate"></param>
|
|
/// <param name="materialNo"></param>
|
|
private void InitBillComponent(string serialNo, string plate, string materialNo)
|
|
{
|
|
SetLabelSerialNo(serialNo);
|
|
SetLabelPlate(plate);
|
|
SetLabelMaterialNo(materialNo);
|
|
InitCombBoxTrailer(plate);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清空组件内容
|
|
/// </summary>
|
|
internal void ClearBillComponent()
|
|
{
|
|
Invoke((MethodInvoker)delegate ()
|
|
{
|
|
var empty = string.Empty;
|
|
txtSerialNo.Text = empty;
|
|
txtMaterialNo.Text = empty;
|
|
txtPlate.Text = empty;
|
|
comboBoxTrailer.Items.Clear();
|
|
txtBillWeight.Text = empty;
|
|
txtInWeight.Text = empty;
|
|
btnConfirm.Enabled = true;
|
|
TxtBillWeight_Leave(null, null);
|
|
labelDriver1.Text = empty;
|
|
labelDriver2.Text = empty;
|
|
driver1Entity = null;
|
|
driver2Entity = null;
|
|
});
|
|
}
|
|
|
|
#endregion 界面组件内容读写方法
|
|
|
|
#region 界面操作响应事件
|
|
|
|
private DriverEntity driver1Entity { get; set; }
|
|
private DriverEntity driver2Entity { get; set; }
|
|
|
|
internal void Btn_Finger1_Click(object sender, EventArgs e)
|
|
{
|
|
var plate = GetLabelPlate();
|
|
var tempDriver = CheckFingerPrint(plate);
|
|
if (tempDriver == null)
|
|
{
|
|
_mainServer?.SetScrollLabelText($"指纹对比失败!{DateTime.Now:yyyy/MM/dd HH:mm:ss}");
|
|
return;
|
|
}
|
|
driver1Entity = tempDriver;
|
|
SetLabelDriver1(driver1Entity.Name);
|
|
}
|
|
|
|
internal void Btn_Finger2_Click(object sender, EventArgs e)
|
|
{
|
|
var plate = GetLabelPlate();
|
|
var tempDriver = CheckFingerPrint(plate);
|
|
if (tempDriver == null)
|
|
{
|
|
_mainServer?.SetScrollLabelText($"指纹对比失败!{DateTime.Now:yyyy/MM/dd HH:mm:ss}");
|
|
return;
|
|
}
|
|
driver2Entity = tempDriver;
|
|
SetLabelDriver2(driver2Entity.Name);
|
|
}
|
|
|
|
private void ComboBox_Trailer_DropDownClosed(object sender, EventArgs e)
|
|
{
|
|
label4.Focus();//让 ComboBoxTrailer 失去焦点,避免整个Box获取焦点为蓝色
|
|
}
|
|
|
|
private void ComboBox_Trailer_DrawItem(object sender, DrawItemEventArgs e)
|
|
{
|
|
if (e.Index < 0)
|
|
{
|
|
return;
|
|
}
|
|
//comboBoxTrailer.ItemHeight = 40;
|
|
e.DrawBackground();
|
|
e.DrawFocusRectangle();
|
|
e.Graphics.DrawString(comboBoxTrailer.Items[e.Index].ToString(), e.Font, new SolidBrush(e.ForeColor), e.Bounds.X, e.Bounds.Y + 5);
|
|
}
|
|
|
|
private void Btn_ResetTrailer_Click(object sender, EventArgs e)
|
|
{
|
|
var plate = GetLabelPlate();
|
|
InitCombBoxTrailer(plate);
|
|
}
|
|
|
|
private void Btn_ResetWeight_Click(object sender, EventArgs e)
|
|
{
|
|
SetLabelInWeight(null);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 指纹对比
|
|
/// </summary>
|
|
/// <param name="plate"></param>
|
|
/// <returns></returns>
|
|
public DriverEntity CheckFingerPrint(string plate)
|
|
{
|
|
var verFp = _mainServer.DeviceCenter.GetVerFingerPrint();
|
|
if (string.IsNullOrEmpty(verFp))
|
|
return null;
|
|
|
|
//var authList = _authService.SelectEntityListByWhere($"TruckPlate = '{plate}'");
|
|
//foreach (var auth in authList)
|
|
//{
|
|
//var driver = _driverService.SelectEntityByWhere($"Id='{auth.DriverId}'");
|
|
//if (driver == null)
|
|
//continue;
|
|
//if (_mainServer.MatchFingerPrint(verFp, driver.Finger1))
|
|
//return driver;
|
|
//if (_mainServer.MatchFingerPrint(verFp, driver.Finger2))
|
|
//return driver;
|
|
//}
|
|
|
|
var truck = ServiceCenter.TruckService.SelectEntityByWhere($"LicensePlate = '{plate}'");
|
|
var driverList = ServiceCenter.DriverService.SelectEntityListByWhere($"SupplierId = '{truck.SupplierId}'");
|
|
//var driverList = _driverService.SelectEntityListByWhere($"SupplierName = '{truck.SupplierName}'");
|
|
foreach (var driver in driverList)
|
|
{
|
|
if (driver == null)
|
|
continue;
|
|
if (_mainServer.DeviceCenter.MatchFingerPrint(verFp, driver.Finger1))
|
|
return driver;
|
|
if (_mainServer.DeviceCenter.MatchFingerPrint(verFp, driver.Finger2))
|
|
return driver;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private void InitCombBoxTrailer(string plate)
|
|
{
|
|
comboBoxTrailer.Items.Clear();
|
|
var truck = ServiceCenter.TruckService.SelectEntityByWhere($"LicensePlate = '{plate}'");
|
|
var trailerList = ServiceCenter.TrailerService.SelectEntityListByWhere($"SupplierId = '{truck.SupplierId}'");
|
|
foreach (var trailer in trailerList)
|
|
{
|
|
comboBoxTrailer.Items.Add(trailer.LicensePlate);
|
|
}
|
|
}
|
|
|
|
#region 数字键盘输入事件
|
|
|
|
/// <summary>
|
|
/// 进入输入框,打开数值输入面板
|
|
/// </summary>
|
|
private void TxtBillWeight_Enter(object sender, EventArgs e)
|
|
{
|
|
numberPanel.Show();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 离开输入框,关闭数值输入面板
|
|
/// </summary>
|
|
private void TxtBillWeight_Leave(object sender, EventArgs e)
|
|
{
|
|
panelOut.Focus();
|
|
numberPanel.Hide();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 数值输入面板下的数字输入按钮响应事件
|
|
/// </summary>
|
|
private void Btn_Number_Click(object sender, EventArgs e)
|
|
{
|
|
var btn = (Button)sender;
|
|
var txt = GetLabelBillWeight();
|
|
txt += btn.Text;
|
|
SetLabelBillWeight(txt);
|
|
txtBillWeight.Focus();
|
|
txtBillWeight.SelectionStart = txt.Length;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 数值输入面板下的逗号输入按钮响应事件
|
|
/// </summary>
|
|
private void Btn_dh_Click(object sender, EventArgs e)
|
|
{
|
|
var txt = GetLabelBillWeight();
|
|
if (txt.IndexOf(".", StringComparison.Ordinal) >= 0)
|
|
return;
|
|
txt += ".";
|
|
SetLabelBillWeight(txt);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 数值输入面板下的退格按钮响应事件
|
|
/// </summary>
|
|
private void Btn_tg_Click(object sender, EventArgs e)
|
|
{
|
|
var txt = GetLabelBillWeight();
|
|
if (txt.Length <= 0)
|
|
return;
|
|
SetLabelBillWeight(txt.Substring(0, txt.Length - 1));
|
|
}
|
|
|
|
#endregion 数字键盘输入事件
|
|
|
|
#endregion 界面操作响应事件
|
|
|
|
#region 流程
|
|
|
|
/// <summary>
|
|
/// 入场开始
|
|
/// </summary>
|
|
/// <param name="plateArgs"></param>
|
|
internal void InStartBill(PlateEventArgs plateArgs)
|
|
{
|
|
var plate = plateArgs.Plate;
|
|
var ex = new Exception();
|
|
|
|
//判断车辆有无入场权限
|
|
if (!ServiceCenter.AuthService.CheckTruckAuth(plate))
|
|
{
|
|
ex.Data["msg"] = $"{plate},无运输权限!";
|
|
ex.Data["help"] = $"{plate},无运输权限!请联系管理人员!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
return;
|
|
}
|
|
|
|
//判断有无中断的入场记录
|
|
var tempBill = ServiceCenter.BillService.GetLastBillByLicensePlate(plate);
|
|
if (tempBill != null)//有记录,则继续判断;无记录,则继续(第一次入场)
|
|
{
|
|
if (tempBill.State == (int)BillState.InStart)//入场中断,则继续;其它,则退出
|
|
{
|
|
InitBillComponent(tempBill.SerialNumber, tempBill.LicensePlate, tempBill.MaterialNo);//初始化组件内容
|
|
_mainServer.SetInStartState(plate);//进入入场界面
|
|
return;
|
|
}
|
|
}
|
|
|
|
var siteEntity = _mainServer.LocalAttrCenter.Site;
|
|
var truckEntity = ServiceCenter.TruckService.GetTruckByPlate(plate);
|
|
var planEntity = ServiceCenter.MonthPlanService.GetLastPlan(siteEntity.CompanyId, truckEntity.SupplierId);
|
|
//判断月计划是否记录
|
|
if (planEntity == null)
|
|
{
|
|
ex.Data["msg"] = $"{plate},月计划获取失败!";
|
|
ex.Data["help"] = $"{plate},月计划获取失败!请重试或联系管理人员!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
return;
|
|
}
|
|
|
|
//入场开始属性
|
|
var state = (int)BillState.InStart;
|
|
var serialNo = ServiceCenter.IniService.GetNewBillSerialNo();
|
|
var photoEntity = ServiceCenter.PhotoService.InsertPhoto(plateArgs.FileName, state);
|
|
|
|
var result = ServiceCenter.BillService.InsertBillInStart(serialNo, siteEntity, planEntity, truckEntity, photoEntity, state);
|
|
if (result <= 0)
|
|
{
|
|
ex.Data["msg"] = $"{plate},运单添加失败!";
|
|
ex.Data["help"] = $"{plate},运单添加失败!请重试或联系管理人员!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
return;
|
|
}
|
|
|
|
InitBillComponent(serialNo, truckEntity.LicensePlate, planEntity.MaterialNo);//初始化组件内容
|
|
_mainServer.SetInStartState(plate);//进入入场界面
|
|
}
|
|
|
|
/// <summary>
|
|
/// 入场结束
|
|
/// </summary>
|
|
private void InFinishBill(object sender, EventArgs e)
|
|
{
|
|
var plate = GetLabelPlate();
|
|
var ex = new Exception();
|
|
|
|
if (comboBoxTrailer.SelectedIndex < 0)
|
|
{
|
|
ex.Data["msg"] = $"{plate},未选择挂车号!";
|
|
ex.Data["help"] = $"{plate},未选择挂车号,请选择挂车号!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
comboBoxTrailer.DroppedDown = true;
|
|
return;
|
|
}
|
|
if (string.IsNullOrEmpty(GetLabelBillWeight()))
|
|
{
|
|
ex.Data["msg"] = $"{plate},未输入运单重量!";
|
|
ex.Data["help"] = $"{plate},未输入运单重量,请输入运单重量!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
txtBillWeight.Focus();
|
|
return;
|
|
}
|
|
if (string.IsNullOrEmpty(GetLabelInWeight()))
|
|
{
|
|
ex.Data["msg"] = $"{plate},未完成自动计重!";
|
|
ex.Data["help"] = $"{plate},未完成自动计重,请等待自动计重!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
return;
|
|
}
|
|
|
|
if (!IsWeightConfirm())
|
|
{
|
|
btnResetWeight.PerformClick();
|
|
return;
|
|
}
|
|
|
|
//入场结束属性
|
|
var state = (int)BillState.InFinish;
|
|
var serialNumber = GetLabelSerialNo();
|
|
var trailerPlate = GetComboBoxTrailerPlate();
|
|
var billWeight = CommonUtil.StrToDec(GetLabelBillWeight());
|
|
var inWeight = CommonUtil.StrToDec(GetLabelInWeight());
|
|
|
|
if (driver1Entity == null)
|
|
{
|
|
ex.Data["msg"] = $"{plate},运输员指纹对比失败!";
|
|
ex.Data["help"] = $"{plate},运输员指纹对比失败,请进行指纹对比!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
Btn_Finger1_Click(null, null);
|
|
return;
|
|
}
|
|
|
|
if (driver2Entity == null)
|
|
{
|
|
ex.Data["msg"] = $"{plate},押运员指纹对比失败!";
|
|
ex.Data["help"] = $"{plate},押运员指纹对比失败,请进行指纹对比!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
Btn_Finger2_Click(null, null);
|
|
return;
|
|
}
|
|
|
|
var trailerEntity = ServiceCenter.TrailerService.SelectEntityByWhere($"LicensePlate = '{trailerPlate}'");
|
|
//保存图片信息
|
|
var photoEntity = ServiceCenter.PhotoService.InsertPhoto(_mainServer.DeviceCenter.GetInPicture2(GetLabelPlate()), state);
|
|
|
|
var result = ServiceCenter.BillService.UpdateBillInFinish(serialNumber, billWeight, inWeight, trailerEntity, driver1Entity, driver2Entity, photoEntity, state);//更新入场结束记录
|
|
if (result <= 0)
|
|
{
|
|
ex.Data["msg"] = $"{plate},运单更新失败!";
|
|
ex.Data["help"] = $"{plate},运单更新失败!请重试或联系管理人员!";
|
|
_mainServer.ShowOperateException(ex, false, true, true);
|
|
return;
|
|
}
|
|
|
|
btnConfirm.Enabled = false;
|
|
_mainServer.SetInFinishState(plate);//离开入场界面
|
|
}
|
|
|
|
#endregion 流程
|
|
|
|
#region Other
|
|
|
|
private bool IsWeightConfirm()
|
|
{
|
|
return Equals(_mainServer.GetLabelWeight(), GetLabelInWeight());
|
|
}
|
|
|
|
internal void SafeTempBill()
|
|
{
|
|
var serialNo = GetLabelSerialNo();
|
|
var plate = GetLabelPlate();
|
|
var inWeightStr = GetLabelInWeight();
|
|
if (string.IsNullOrEmpty(serialNo))
|
|
return;
|
|
if (string.IsNullOrEmpty(inWeightStr))
|
|
return;
|
|
var billEntity = ServiceCenter.BillService.GetBillBySerialNumber(serialNo);
|
|
var inWeight = CommonUtil.StrToDec(inWeightStr);
|
|
var msg = $"{plate},检测到未确认入场!";
|
|
var help = $"{plate},检测到未确认入场,已临时保存并记录!";
|
|
if (!string.IsNullOrEmpty(inWeightStr))
|
|
{
|
|
billEntity.InWeight = inWeight;
|
|
billEntity.Remark += $"{DateTime.Now}:检测到未确认入场(重量 - {inWeight}t)!\n";
|
|
help += $"已取得稳定重量({inWeight}t)";
|
|
}
|
|
else
|
|
{
|
|
billEntity.InWeight = 0;
|
|
billEntity.Remark += $"{DateTime.Now}:检测到未确认入场(重量 - {inWeight}t)!\n";
|
|
help += "未取得稳定重量";
|
|
}
|
|
|
|
if (driver1Entity != null)
|
|
{
|
|
billEntity.DriverId = driver1Entity.Id;
|
|
billEntity.DriverName = driver1Entity.Name;
|
|
}
|
|
if (driver2Entity != null)
|
|
{
|
|
billEntity.Driver2Id = driver2Entity.Id;
|
|
billEntity.Driver2Name = driver2Entity.Name;
|
|
}
|
|
|
|
billEntity.InFinishTime = DateTime.Now;
|
|
billEntity.State = (int)BillState.InFinish;
|
|
ServiceCenter.BillService.SaveForm(billEntity);
|
|
|
|
_mainServer.SetResetState(msg, help);
|
|
}
|
|
|
|
internal bool IsJustInFinish(string plate)
|
|
{
|
|
var bill = ServiceCenter.BillService.GetLastBillByLicensePlate(plate);
|
|
if (bill == null)
|
|
return false;
|
|
if (bill.State != (int)BillState.InFinish)
|
|
return false;
|
|
var span = DateTime.Now - bill.InFinishTime;
|
|
return span.TotalSeconds <= ServerConfig.BillInterval;
|
|
}
|
|
|
|
#endregion Other
|
|
}
|
|
}
|