using BO; using BO.BO.Bill; using BO.Utils.BillRpc; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace QualityAndOrder { partial class QualityOrderForm { List needOrderList; List orderList; Thread tb2SyncThread; void Tab2Init() { tab2DateSelect.Date = DateTime.Today; orderGrid.AutoGenerateColumns = false; preOrderGrid.AutoGenerateColumns = false; orderGrid.DataSource = null; preOrderGrid.DataSource = null; AddKeyPadForTab2(); } private void AddKeyPadForTab2() { for (var i = 1; i < 10; i++) { var btn = new Button() { Name = "_2" + i, Text = i.ToString(), Size = new Size(80, 60), TextAlign = ContentAlignment.MiddleCenter, Margin = new Padding { All = 10 }, Font = new Font("宋体", 15) }; btn.Click += (sender, e) => { InputPlanNumber(btn.Text); }; tab2KeyPanel.Controls.Add(btn); } var zero = new Button() { Name = "_20", Text = "0", Size = new Size(80, 60), TextAlign = ContentAlignment.MiddleCenter, Margin = new Padding { All = 10 }, Font = new Font("宋体", 15) }; zero.Click += (sender, e) => { InputPlanNumber(zero.Text); }; tab2KeyPanel.Controls.Add(zero); var back = new Button() { Name = "_2back", Text = "←", Size = new Size(80, 60), TextAlign = ContentAlignment.MiddleCenter, Margin = new Padding { All = 10 }, Font = new Font("宋体", 15) }; back.Click += (sender, e) => { InputPlanNumber(back.Text); }; tab2KeyPanel.Controls.Add(back); var clear = new Button() { Name = "_2clear", Text = "清空", Size = new Size(80, 60), TextAlign = ContentAlignment.MiddleCenter, Margin = new Padding { All = 10 }, Font = new Font("宋体", 15) }; clear.Click += (sender, e) => { InputPlanNumber(clear.Text); }; tab2KeyPanel.Controls.Add(clear); } void InputPlanNumber(string input) { if (orderGrid.CurrentCell == null) throw new Exception("请选择一条排宰明细"); var tag = orderGrid.CurrentRow.DataBoundItem as OrderDetail; tag.PlanNumber = GetAfterNumber(tag.PlanNumber, input) ?? 0; orderGrid.Refresh(); } private void tab2SyncBtn_Click(object sender, EventArgs e) { needOrderList = OrderDetailRpc.GetNeedOrderWeightBill(tab2DateSelect.Date.Value); BindPreOrderGrid(); orderList = OrderDetailRpc.GetOrderDetail(); BindOrderGrid(); if (tb2SyncThread == null) { tb2SyncThread = new Thread(Tab2SyncB3ID) { IsBackground = true }; tb2SyncThread.Start(); } } private void Tab2SyncB3ID() { while (true) { bool orderChange = false; bool needListChange = false; var ids = orderList.Where(x => x.B3WeighBill_ID == null).Select(x => (long?)x.WeightBill_ID).Distinct().ToList(); var needOrderIds = needOrderList.Where(x => x.B3ID == null).Select(x => (long?)x.WeightBill_ID); ids.AddRange(needOrderIds.Except(ids)); if (ids.Any()) { var result = WeightBillRpc.SyncBillB3Ids(ids); foreach (var item in result) { var left = orderList.Where(x => x.WeightBill_ID == item.Item1); foreach (var lEntity in left) { lEntity.B3WeighBill_ID = item.Item2; if (!orderChange) orderChange = true; } var rFirst = needOrderList.FirstOrDefault(x => x.WeightBill_ID == item.Item1); if (rFirst != null) { rFirst.B3ID = item.Item2; if (!needListChange) needListChange = true; } } } if (orderChange) { this.Invoke(new InvokeHandler(delegate() { orderGrid.Refresh(); })); } if (needListChange) { this.Invoke(new InvokeHandler(delegate() { preOrderGrid.Refresh(); })); } Thread.Sleep(2000); } } void BindPreOrderGrid() { preOrderGrid.DataSource = needOrderList.OrderBy(x => x.WeighTime).ToList(); preOrderGrid.Refresh(); } void BindOrderGrid() { orderGrid.DataSource = orderList.OrderByDescending(x => x.Order).ToList(); foreach (DataGridViewRow row in orderGrid.Rows) { if ((bool)row.Cells["O_IsHurryButcher"].Value) row.DefaultCellStyle.BackColor = Color.YellowGreen; } orderGrid.Refresh(); } private void preOrderGrid_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex == -1) return; if (e.ColumnIndex != preOrderGrid.ColumnCount - 1) return; var currentOrder = 0; if (orderGrid.CurrentRow != null) currentOrder = (int)orderGrid.CurrentRow.Cells["O_Order"].Value + 1; else currentOrder = OrderDetailRpc.GetMaxOrder(tab2DateSelect.Date.Value); var entity = preOrderGrid.CurrentRow.DataBoundItem as NeedOrderEntity; var order = new OrderDetail(); order.Order = currentOrder; order.LiveColonyHouse_Name = entity.HouseNames; order.PlanNumber = entity.LastNumber; order.WeightBill_ID = entity.WeightBill_ID; order.B3WeighBill_ID = entity.B3ID; var needUpdate = ReOrder(order, true); orderList.Add(order); OrderDetailRpc.Insert(needUpdate, order); BindOrderGrid(); needOrderList.Remove(entity); BindPreOrderGrid(); } private void orderGrid_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex == -1) return; if (e.ColumnIndex < orderGrid.ColumnCount - 2) return; var entity = orderGrid.CurrentRow.DataBoundItem as OrderDetail; if (e.ColumnIndex == orderGrid.ColumnCount - 2)//确定 { if (entity.PlanNumber < 0) throw new Exception("排宰头数不能小于0"); var backInfo = OrderDetailRpc.GetBackWeightBillInfo(entity.WeightBill_ID, entity.ID); if (entity.PlanNumber > backInfo.LastNumber) throw new Exception("排宰总头数多余过磅头数"); var item = needOrderList.FirstOrDefault(x => x.WeightBill_ID == backInfo.WeightBill_ID); if (entity.PlanNumber == backInfo.LastNumber) return; if (item == null) { item = new NeedOrderEntity(); needOrderList.Add(item); item.WeightBill_ID = backInfo.WeightBill_ID; item.Supplier_Name = backInfo.Supplier_Name; item.HouseNames = backInfo.HouseNames; item.Number = backInfo.Number; item.AlreadyNumber = backInfo.AlreadyNumber; item.WeighTime = backInfo.WeighTime; item.B3ID = entity.B3WeighBill_ID; } if (entity.PlanNumber == 0) { orderList.Remove(entity); var list = ReOrder(entity, false); OrderDetailRpc.Delete(list, entity.ID); } else OrderDetailRpc.UpdateNumber(entity.ID, entity.PlanNumber); item.AlreadyNumber = backInfo.AlreadyNumber + entity.PlanNumber; BindOrderGrid(); BindPreOrderGrid(); } else if ((e.ColumnIndex == orderGrid.ColumnCount - 1))//急宰 { entity.IsHurryButcher = !entity.IsHurryButcher; OrderDetailRpc.UpdateHurryFlag(entity.ID, entity.IsHurryButcher); BindOrderGrid(); } } List> ReOrder(OrderDetail dealDetail, bool isAdd) { var result = new List>(); foreach (var item in orderList.OrderByDescending(x => x.Order)) { if (item.Order < dealDetail.Order) break; item.Order += isAdd ? 1 : -1; result.Add(new CTuple(item.ID, item.Order)); } return result; } } }