屠宰场客户端
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.

503 lines
15 KiB

using BO;
using BO.BO.Bill;
using BO.Utils;
using BO.Utils.BillRpc;
using BWP.WinFormControl;
using BWP.WinFormControl.WeightDataFormat;
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.Threading.Tasks;
using System.Windows.Forms;
namespace WeighAndGrading
{
public partial class GradeFrom : Form, IAfterLogin
{
#region IAfterLogin
public string RoleName
{
get { return "定级员"; }
}
public Form Generate()
{
return this;
}
#endregion
private delegate void InvokeHandler();
List<GradeAndWeight> list;
List<GradeAndWeight_Detail> details;
SerialPort weightPort;
int maxIndex = 0;
readonly ConcurrentQueue<GradeAndWeight_Detail> tempList = new ConcurrentQueue<GradeAndWeight_Detail>();
#region weightNeed
private IDataFormat _dataFormat;
private Thread _inQueryThread, _outQueryThread;
private bool _mainProcessIsRun;
readonly StringBuilder _dataStrBuilder = new StringBuilder();
readonly ConcurrentQueue<string> _dataQueue = new ConcurrentQueue<string>();
private string _displayValue;
#endregion
public GradeFrom()
{
InitializeComponent();
butcherTimeInput.Date = DateTime.Today;
dataGridView.AutoGenerateColumns = false;
dataGridView.DataSource = null;
historyGrid.AutoGenerateColumns = false;
AddLivestockBtn();
weightPort = new SerialPort();
this.FormClosing += delegate
{
if (_inQueryThread != null && _inQueryThread.IsAlive)
DisableWeight();
};
}
GradeAndWeight_Detail modifyDetail;
void AddLivestockBtn()
{
var livestocks = BaseInfoRpcUtil.GetLivestockList();
foreach (var item in livestocks)
{
var btn = new Button() { Name = "_" + item.Item1, Text = item.Item2, Tag = item, Size = new Size(70, 60), TextAlign = ContentAlignment.MiddleCenter, Margin = new Padding { All = 10 }, Font = new Font("宋体", 15) };
btn.Click += (sender, e) =>
{
var livestockTag = btn.Tag as CTuple<long, string, short>;
if (modifyDetail == null)
AddDetail(livestockTag);
else
{
if (modifyDetail.Technics != livestockTag.Item3)
{
MessageBox.Show("工艺选择错误!请重新选择");
return;
}
modifyDetail.Livestock_ID = livestockTag.Item1;
modifyDetail.Livestock_Name = livestockTag.Item2;
GradeAndWeightRpc.UpdateLivestock(modifyDetail.ID, modifyDetail.Livestock_ID, modifyDetail.Livestock_Name);
historyGrid.Refresh();
modifyDetail = null;
modifyPanel.Hide();
}
//var name = livestock.Technics == 0 ? "带皮白条" : "去皮白条";
//Print(name, entity.Index);
};
if (item.Item3 == 0)
ttPanel.Controls.Add(btn);
else
mbPanel.Controls.Add(btn);
}
}
private void closeBtn_Click(object sender, EventArgs e)
{
this.Close();
}
private void syncBtn_Click(object sender, EventArgs e)
{
var date = butcherTimeInput.Date.Value;
list = GradeAndWeightRpc.GetGradeAndWeightList(date);
BindDataGrid();
dataGridView.Refresh();
details = GradeAndWeightRpc.GetDetails(date, 15);
BindDetailGrid();
if (details.Any())
maxIndex = details.First().Index;
}
void BindDataGrid()
{
dataGridView.DataSource = list.OrderBy(x => x.Order).OrderBy(x => x.Finish).ToList();
foreach (DataGridViewRow row in dataGridView.Rows)
{
if ((bool)row.Cells["D_Finish"].Value)
row.DefaultCellStyle.BackColor = Color.YellowGreen;
}
dataGridView.ClearSelection();
tangRow = maoRow = null;
}
void BindDetailGrid()
{
historyGrid.DataSource = null;
if (details.Any())
historyGrid.DataSource = details;
historyGrid.Refresh();
}
private void printBtn_Click(object sender, EventArgs e)
{
var entity = new PrintEntity();
entity.AccountingUnit_Name = "青花瓷软件(北京)有限公司";
entity.Goods_Name = "B2/B3 ERP";
entity.Date = DateTime.Today;
entity.Checker = "管理员";
entity.StoreCondition = "0-4℃ 5日";
entity.Place = "北京市海淀区";
entity.TelNumber = "010-62701591";
entity.Address = "北京市北京市海淀区知春路49号";
entity.BarCode = string.Format("BWP{0}{1:00000}", DateTime.Today.ToString("yyyyMMdd"), new Random().Next(1, 1000));
entity._2DQRCode = string.Format("http://www.bwpsoft.com?code={0}", entity.BarCode);
PrintAPI.Print(entity);
}
private void configBtn_Click(object sender, EventArgs e)
{
new GradeSettingFrom().ShowDialog();
}
GradeAndWeight tangEntity;
GradeAndWeight maoEntity;
#region weightNeed
void OpenSerialPort()
{
if (enableWeight.Checked)
return;
if (GradeContext.Config.RateSet == null)
throw new Exception("请先配置称相关信息");
weightPort.PortName = GradeContext.Config.ComSet;
weightPort.BaudRate = GradeContext.Config.RateSet.Value;
weightPort.DataBits = GradeContext.Config.BitSet.Value;
weightPort.ReadBufferSize = 4096 * 100;
if (!string.IsNullOrEmpty(GradeContext.Config.Format))
format = "{0:{format}}".Replace("{format}", GradeContext.Config.Format);
switch (GradeContext.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();
_outQueryThread = new Thread(OutQuery);
_outQueryThread.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);
_dataQueue.Enqueue(_dataStrBuilder.ToString());
_dataStrBuilder.Clear();
}
else if (_dataStrBuilder.Length != 0)
{
_dataStrBuilder.Append(c);
}
}
}
}
private void OutQuery()
{
while (_mainProcessIsRun)
{
try
{
bool isStatic;
string str;
string subStr;
if (!_dataQueue.TryDequeue(out subStr))
{
Thread.Sleep(1);
continue;
}
// 解析接受的端口数据
if (_dataFormat.ParseAscii(subStr, out str, out isStatic))
{
if (string.IsNullOrEmpty(str))
str = "0";
_displayValue = string.Format(format, decimal.Parse(str));
if (str != "0")
{
this.Invoke(new InvokeHandler(delegate()
{
lblChengZhong.Text = _displayValue;
AddWeightDetail(decimal.Parse(_displayValue));
}));
}
}
}
catch (Exception)
{
Thread.Sleep(1000);
continue;
}
Thread.Sleep(1);
}
}
void DisableWeight()
{
_mainProcessIsRun = false;
lblChengZhong.Text = string.Format(format, 0);
format = "{0:0.00}";
Thread.Sleep(10);
if (_inQueryThread.IsAlive)
{
_inQueryThread.Abort();
}
if (_outQueryThread.IsAlive)
{
_outQueryThread.Abort();
}
if (weightPort.IsOpen)
weightPort.Close();
}
public void enableWeight_Click(object sender, EventArgs e)
{
if (details == null)
{
MessageBox.Show("请先同步数据");
return;
}
if (!enableWeight.Checked)
{
OpenSerialPort();
_mainProcessIsRun = true;
ReadData();
}
else
DisableWeight();
enableWeight.CheckState = enableWeight.Checked ? CheckState.Unchecked : CheckState.Checked;
}
#endregion
static object _obj = new object();
void AddDetail(CTuple<long, string, short> livestock)
{
lock (_obj)
{
var currentRow = livestock.Item3 == 0 ? tangEntity : maoEntity;
var tech = livestock.Item3 == 0 ? "烫褪" : "毛剥";
if (currentRow == null)
throw new Exception(string.Format("请先选择 {0} 的数据", tech));
GradeAndWeight_Detail first;
if (tempList.TryPeek(out first) && first.Livestock_ID == 0)
{
tempList.TryDequeue(out first);
first.OrderDetail_ID = currentRow.OrderDetail_ID;
first.Date = butcherTimeInput.Date.Value;
first.Livestock_ID = livestock.Item1;
first.Livestock_Name = livestock.Item2;
first.Technics = livestock.Item3;
first.Technics_Name = tech;
GradeAndWeightRpc.UpdateOrInsertDetail(first, true);
historyGrid.Refresh();
}
else//add
{
maxIndex++;
var entity = new GradeAndWeight_Detail();
entity.Index = maxIndex;
entity.OrderDetail_ID = currentRow.OrderDetail_ID;
entity.Date = butcherTimeInput.Date.Value;
entity.Livestock_ID = livestock.Item1;
entity.Livestock_Name = livestock.Item2;
entity.Technics = livestock.Item3;
entity.Technics_Name = tech;
entity.Time = DateTime.Now;
if (details.Count == 15)
details.RemoveAt(14);
details.Insert(0, entity);
GradeAndWeightRpc.UpdateOrInsertDetail(entity, true);
tempList.Enqueue(entity);
BindDetailGrid();
}
currentRow.Already = currentRow.Already + 1;
orderLabel.Text = currentRow.Order.ToString();
alreadyLabel.Text = currentRow.Already.ToString();
dataGridView.Refresh();
}
}
void AddWeightDetail(decimal weight)
{
lock (_obj)
{
weight -= (GradeContext.Config.Discont ?? 0);
GradeAndWeight_Detail first;
if (tempList.TryPeek(out first) && first.Weight == null)
{
tempList.TryDequeue(out first);
first.Weight = weight;
GradeAndWeightRpc.UpdateOrInsertDetail(first);
historyGrid.Refresh();
}
else//add
{
maxIndex++;
var entity = new GradeAndWeight_Detail();
entity.Index = maxIndex;
entity.Weight = weight;
entity.Time = DateTime.Now;
if (details.Count == 15)
details.RemoveAt(14);
details.Insert(0, entity);
GradeAndWeightRpc.UpdateOrInsertDetail(entity);
tempList.Enqueue(entity);
BindDetailGrid();
}
}
}
private void cancelBtn_Click(object sender, EventArgs e)
{
modifyDetail = null;
modifyPanel.Hide();
}
private void historyGrid_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex < 0)
return;
modifyDetail = historyGrid.Rows[e.RowIndex].DataBoundItem as GradeAndWeight_Detail;
stateLabel.Text = string.Format("您正在修改序号为 {0} 的等级", modifyDetail.Index);
modifyPanel.Show();
}
DataGridViewRow tangRow;
DataGridViewRow maoRow;
private void dataGridView_CellClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex == -1)
return;
var entity = dataGridView.CurrentRow.DataBoundItem as GradeAndWeight;
if (entity.Technics_Name == "烫褪")
{
if (tangRow != null)
{
if ((bool)tangRow.Cells["D_Finish"].Value)
tangRow.DefaultCellStyle.BackColor = Color.YellowGreen;
else
tangRow.DefaultCellStyle.BackColor = dataGridView.RowsDefaultCellStyle.BackColor;
}
tangRow = dataGridView.CurrentRow;
tangRow.DefaultCellStyle.BackColor = dataGridView.RowsDefaultCellStyle.SelectionBackColor;
tangEntity = entity;
}
else
{
if (maoRow != null)
{
if ((bool)maoRow.Cells["D_Finish"].Value)
maoRow.DefaultCellStyle.BackColor = Color.YellowGreen;
else
maoRow.DefaultCellStyle.BackColor = dataGridView.RowsDefaultCellStyle.BackColor;
}
maoRow = dataGridView.CurrentRow;
maoRow.DefaultCellStyle.BackColor = dataGridView.RowsDefaultCellStyle.SelectionBackColor;
maoEntity = entity;
}
if (e.ColumnIndex != dataGridView.ColumnCount - 1)
return;
if (entity.Finish)
return;
entity.Finish = true;
GradeAndWeightRpc.SetGradeFinish(entity.OrderDetail_ID, entity.Technics);
BindDataGrid();
if (entity.Technics == 0)
{
FindRowSetSelected(maoEntity);
tangEntity = null;
}
else
{
FindRowSetSelected(tangEntity);
maoEntity = null;
}
dataGridView.Refresh();
}
void FindRowSetSelected(GradeAndWeight tag)
{
if (tag == null)
return;
foreach (DataGridViewRow row in dataGridView.Rows)
{
if ((long)row.Cells["D_OrderDetail_ID"].Value == tag.OrderDetail_ID && (string)row.Cells["D_Technics_Name"].Value == tag.Technics_Name)
{
row.DefaultCellStyle.BackColor = dataGridView.RowsDefaultCellStyle.SelectionBackColor;
return;
}
}
}
}
}