using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using BO; using BO.Utils; using BO.Utils.BillRpc; using BWP.WinFormControl.WeightDataFormat; using TrunksIousOutInStore.Dto; namespace TrunksIousOutInStore { public partial class TrunksIousOutInStoreForm : Form, IAfterLogin { BardCodeHooK BarCode = new BardCodeHooK(); #region weightNeed SerialPort weightPort; private IDataFormat _dataFormat; private Thread _inQueryThread; private bool _mainProcessIsRun; readonly StringBuilder _dataStrBuilder = new StringBuilder(); #endregion public TrunksIousOutInStoreForm() { InitializeComponent(); gridUnCheck.AutoGenerateColumns = false; gridChecked.AutoGenerateColumns = false; weightPort = new SerialPort(); this.FormClosing += delegate { if (_inQueryThread != null && _inQueryThread.IsAlive) DisableWeight(); // if (syncWork != null && syncWork.IsAlive) // syncWork.Abort(); // if (syncToServer != null && syncToServer.IsAlive) // syncToServer.Abort(); }; BarCode.BarCodeEvent += new BardCodeHooK.BardCodeDeletegate(BarCode_BarCodeEvent); } void BarCode_BarCodeEvent(BardCodeHooK.BarCodes barCode) { ShowInfo(barCode); } private delegate void ShowInfoDelegate(BardCodeHooK.BarCodes barCode); private void ShowInfo(BardCodeHooK.BarCodes barCode) { if (this.InvokeRequired) { this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] { barCode }); } else { if (barCode.IsValid) { doInsertUnSubmit(barCode.BarCode, null); } } } #region weightNeed void OpenSerialPort() { if (enableWeight.Checked) return; if (TrunksIousOutInStoreContext.Config.RateSet == null) throw new Exception("请先配置称相关信息"); weightPort.PortName = TrunksIousOutInStoreContext.Config.ComSet; weightPort.BaudRate = TrunksIousOutInStoreContext.Config.RateSet.Value; weightPort.DataBits = TrunksIousOutInStoreContext.Config.BitSet.Value; weightPort.ReadBufferSize = 4096 * 100; if (!string.IsNullOrEmpty(TrunksIousOutInStoreContext.Config.Format)) format = "{0:{format}}".Replace("{format}", TrunksIousOutInStoreContext.Config.Format); switch (TrunksIousOutInStoreContext.Config.WeightSet) { case "IND560": _dataFormat = new IND560DataFormat(); break; case "Xk3124": _dataFormat = new Xk3124DataFormat(); break; case "Xk3190A9": _dataFormat = new Xk3190A9DataFormat(); break; default: _dataFormat = new Xk3190D10DataFormat(); break; } if (!weightPort.IsOpen) { try { weightPort.Open(); } catch (InvalidOperationException) { MessageBox.Show(@"指定的端口已打开"); } catch (UnauthorizedAccessException) { MessageBox.Show(@"对端口的访问被拒绝"); } } } void ReadData() { _inQueryThread = new Thread(InQuery); _inQueryThread.Start(); } string format = "{0:0.00}"; private void InQuery() { while (_mainProcessIsRun) { int availableCount = weightPort.BytesToRead; if (availableCount == 0) { Thread.Sleep(1); } char[] buffer = new char[availableCount]; if (!weightPort.IsOpen) { continue; } weightPort.Read(buffer, 0, availableCount); foreach (var c in buffer) { if (c == _dataFormat.Beginchar) { _dataStrBuilder.Clear(); _dataStrBuilder.Append(c); } else if (c == _dataFormat.Endchar && _dataStrBuilder.Length == _dataFormat.DataLength - 1) { _dataStrBuilder.Append(c); bool isStatic; string str; if (_dataFormat.ParseAscii(_dataStrBuilder.ToString(), out str, out isStatic)) { if (TrunksIousOutInStoreContext.Config.WeightType == 0) { if (string.IsNullOrEmpty(str)) str = "0"; this.Invoke(new Action(delegate () { lblChengZhong.Text = string.Format(format, decimal.Parse(str)); if (str != "0") { //AddWeightDetail(decimal.Parse(lblChengZhong.Text)); doInsertUnSubmit("", decimal.Parse(lblChengZhong.Text)); } })); } else { decimal num = 0; if (decimal.TryParse(str, out num)) { this.Invoke(new Action(delegate () { lblChengZhong.Text = string.Format(format, num); })); // LocalGradeAndWeightBL.SaveWeightData(num); WeighAvgControl.Add(num, isStatic); } if (WeighAvgControl.TryGetValue(out num)) { this.Invoke(new Action(delegate () { //lblChengZhong.Text = string.Format(format, num); if (str != "0") { doInsertUnSubmit("",decimal.Parse(string.Format(format, num))); //AddWeightDetail(decimal.Parse(string.Format(format, num))); } })); } } } _dataStrBuilder.Clear(); } else if (_dataStrBuilder.Length != 0) { _dataStrBuilder.Append(c); } } } } private class WeighAvgControl { public static bool TryGetValue(out decimal result) { List> list; if (mWeighList.TryDequeue(out list)) { var r = list.Where(x => x.Item2).Select(x => x.Item1).GroupBy(x => x); var firstOrDefault = r.OrderByDescending(x => x.Count()).FirstOrDefault(); if (firstOrDefault != null) { result = firstOrDefault.Key; return true; } result = 0; return false; } result = 0; return false; } static ConcurrentQueue>> mWeighList = new ConcurrentQueue>>(); static List> _list = new List>(); public static void Add(decimal value, bool isStatic) { if (value >= TrunksIousOutInStoreContext.Config.MinWeight && value <= TrunksIousOutInStoreContext.Config.MaxWeight) { _list.Add(new Tuple(value, isStatic)); } else { if (_list.Count > 0) { mWeighList.Enqueue(_list); _list = new List>(); } } } } void DisableWeight() { _mainProcessIsRun = false; lblChengZhong.Text = string.Format(format, 0); format = "{0:0.00}"; Thread.Sleep(10); if (_inQueryThread.IsAlive) { _inQueryThread.Abort(); } if (weightPort.IsOpen) weightPort.Close(); } public void enableWeight_Click(object sender, EventArgs e) { if (!enableWeight.Checked) { OpenSerialPort(); _mainProcessIsRun = true; ReadData(); } else { DisableWeight(); } enableWeight.CheckState = enableWeight.Checked ? CheckState.Unchecked : CheckState.Checked; } #endregion private string barCode; private void TrunksIousOutInStoreForm_KeyUp(object sender, KeyEventArgs e) { // switch (e.KeyData) // { // case Keys.Enter: // barCode = ""; // break; // // default: // barCode += (char)e.KeyValue; // barCode = barCode.Replace("\r", "").Replace("\t", ""); // if (barCode.Length == 4) // { // // doInsertUnSubmit(barCode, null); // barCode = ""; // } // break; // } } static object _obj = new object(); private void doInsertUnSubmit(string barCode, decimal? weight) { lock (_obj) { var dto = new TrunksIousOutInStoreFormDto(); dto.Goods_Name = "白条"; dto.Goods_Name = "规格"; dto.Number = 1; if (!string.IsNullOrWhiteSpace(barCode)) {//扫码 dto.Code = barCode; //找到条码为空但是重量不为空的 var fd = unSumbitList.FirstOrDefault(x => string.IsNullOrWhiteSpace(x.Code) && x.Weight.HasValue); if (fd == null) { unSumbitList.Add(dto); } else { //给条码赋值 fd.Code = barCode; } } if (weight.HasValue) {//称重 dto.Weight = weight; //找到称重为空条码不为空的 var fd = unSumbitList.FirstOrDefault(x => !string.IsNullOrWhiteSpace(x.Code) && x.Weight==null); if (fd == null) { unSumbitList.Add(dto); } else { //给条码赋值 fd.Weight = weight; } } BindUnCheckGrid(); } // barCodequeue.Enqueue(barCode); } public string RoleName { get { return "胴体白条出入库"; } } public Form Generate() { return this; } private void TrunksIousOutInStoreForm_Load(object sender, EventArgs e) { var enableScanBarCode = BarCode.Start(); } private void TrunksIousOutInStoreForm_FormClosing(object sender, FormClosingEventArgs e) { if (unSumbitList.Count > 0) { if (MessageBox.Show("待提交区域不为空,确定关闭?", "确定关闭", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK) { e.Cancel = false; } else { e.Cancel = true; } } } BindingList unSumbitList = new BindingList(); BindingList sumbitedList = new BindingList(); // ConcurrentQueue barCodequeue=new ConcurrentQueue(); private void timer1_Tick(object sender, EventArgs e) { var canSubmitList = unSumbitList.Where(x => !string.IsNullOrWhiteSpace(x.Code) && x.Weight != null).ToList(); foreach (TrunksIousOutInStoreFormDto canSubmitDto in canSubmitList) { unSumbitList.Remove(canSubmitDto); //todo 插入数据库操作 sumbitedList.Insert(0, canSubmitDto); } BindUnCheckGrid(); BindCheckedGrid(); } void BindUnCheckGrid() { gridUnCheck.DataSource = unSumbitList; } void BindCheckedGrid() { gridChecked.DataSource = sumbitedList; } private void btnWeightSet_Click(object sender, EventArgs e) { var f = new WeightSettingFrom(); if (f.ShowDialog() == DialogResult.OK) { enableWeight_Click(sender, e); } } private void TrunksIousOutInStoreForm_FormClosed(object sender, FormClosedEventArgs e) { BarCode.Stop(); } private void TrunksIousOutInStoreForm_KeyDown(object sender, KeyEventArgs e) { gridUnCheck.Focus(); } } }