using BO.BO; using BO.Utils; using BO.Utils.BillRpc; using BWP.WinFormControl; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace ButcherWeight { public partial class WeightForm : Form, IAfterLogin { #region IAfterLogin Member public string RoleName { get { return "过磅员"; } } public Form Generate() { return this; } #endregion private delegate void InvokeHandler(); bool mainIsRun = false; public WeightForm() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; supplierSelect.Init("BaseInfoRpc/GetSupplierList"); purchaseTypeSelect.Init("BaseInfoRpc/GetPurchaseTypeList"); carSelect.Init("BaseInfoRpc/GetCarList"); liveVarietiesSelect.Init("BaseInfoRpc/GetLiveVarietiesList"); employeeSelect.Init("BaseInfoRpc/GetEmployeeList"); hogGradeSelect.Init("BaseInfoRpc/GetHogGradeList"); zoneSelect.Init("BaseInfoRpc/GetZoneList"); farmerSelect.Init("BaseInfoRpc/GetFarmerList"); qCarSelect.Init("BaseInfoRpc/GetCarList"); qSupplierSelect.Init("BaseInfoRpc/GetSupplierList"); farmerSelect.EnableTopItem = false; weightTimeSelect.Date = DateTime.Now; testTimeInput.Date = null; dmoList = WeightBillRpc.GetWeightBillList(null, null); billGrid.AutoGenerateColumns = false; farmerGrid.AutoGenerateColumns = false; weightGrid.AutoGenerateColumns = false; houseGird.AutoGenerateColumns = false; abnormalGrid.AutoGenerateColumns = false; BindWeightBill(); mainIsRun = true; var syncThread = new Thread(SyncTask) { IsBackground = true }; syncThread.Start(); this.FormClosing += delegate { if (syncThread.IsAlive) syncThread.Abort(); if (_inQueryThread != null && _inQueryThread.IsAlive) DisableWeight(); }; } private void SyncTask() { while (mainIsRun) { Thread.Sleep(2000); bool changed = false; var ids = dmoList.Where(x => x.B3ID == null).Select(x => (long?)x.ID).ToList(); if (ids.Any()) { var result = WeightBillRpc.SyncBillB3Ids(ids); foreach (var item in result) { var first = dmoList.FirstOrDefault(x => x.ID == item.Item1); if (first != null) { first.B3ID = item.Item2; if (!changed) changed = true; } } } var detailChange = SyncWeightDetailFirstNumber(); if (changed || detailChange) { this.Invoke(new InvokeHandler(delegate() { billGrid.Refresh(); })); } var details = new List(); var farms = new List(); foreach (var dmo in dmoList) { details.AddRange(dmo.Details.Where(x => x.B3ID == null)); farms.AddRange(dmo.FarmerDetails.Where(x => x.B3ID == null)); } if (details.Any()) { var dids = details.Select(x => (long?)x.ID).ToList(); var result2 = WeightBillRpc.SyncWeightDetailB3Ids(dids); foreach (var item in result2) { var first = details.FirstOrDefault(x => x.ID == item.Item1); if (first != null) { first.B3ID = item.Item2; } } } if (farms.Any()) { var dids = farms.Select(x => (long?)x.ID).ToList(); var result2 = WeightBillRpc.SyncFarmerDetailB3Ids(dids); foreach (var item in result2) { var first = details.FirstOrDefault(x => x.ID == item.Item1); if (first != null) { first.B3ID = item.Item2; } } } } } bool SyncWeightDetailFirstNumber() { var details = new List(); foreach (var item in dmoList) { if (item.Details.Any()) details.Add(item.Details.First()); } if (details.Any()) { var result = WeightBillRpc.SyncWeightDetailFirstNumber(details.Select(x => (long?)x.ID).ToList()); bool change = false; foreach (var item in result) { var first = details.First(x => x.ID == item.Item2); if (first.Number != item.Item3) { first.Number = item.Item3; if (!change) change = true; if (first.WeightBill_ID == Dmo.ID) { _details.First(x => x.ID == first.ID).Number = first.Number; weightGrid.DataSource = _details; weightGrid.Refresh(); } } } return change; } return false; } void BindWeightBill() { billGrid.DataSource = dmoList.OrderByDescending(x => x.ID).ToList(); billGrid.Refresh(); } private List dmoList = new List(); private WeightBill Dmo = new WeightBill(); private List _farmerDetails = new List(); private List _details = new List(); private void exitBtn_Click(object sender, EventArgs e) { if (enableCheckBox.Checked) enableCheckBox.Checked = false; this.Close(); } private void commitBtn_Click(object sender, EventArgs e) { if (!_details.Any()) throw new Exception("没有称重记录"); //if (!_farmerDetails.Any()) //throw new Exception("没有养殖户信息"); GetFromUI(); Dmo.Details.Clear(); Dmo.Details.AddRange(_details.ToList()); Dmo.FarmerDetails.Clear(); Dmo.FarmerDetails.AddRange(_farmerDetails.ToList()); var isNew = Dmo.ID == 0; var result = WeightBillRpc.Send(Dmo); if (isNew) dmoList.Add(Dmo); BindWeightBill(); if (result) MessageBox.Show("保存成功!"); } private void createBtn_Click(object sender, EventArgs e) { Dmo = new WeightBill(); Dmo.WeighTime = DateTime.Now; AppToUI(); } private void readMaoBtn_Click(object sender, EventArgs e) { var d = new WeightBill_Detail(); if (weightGrid.CurrentRow == null) { _details.Add(d); d.Index = _details.Max(x => x.Index) + 1; d.WeightBill_ID = Dmo.ID; } else d = weightGrid.CurrentRow.DataBoundItem as WeightBill_Detail; d.MaoWeight = WeightValue; d.Weight = (d.MaoWeight ?? 0) - (d.PiWeight ?? 0); weightGrid.DataSource = _details; weightGrid.Refresh(); WeightValue = null; } private void readPiBtn_Click(object sender, EventArgs e) { if (weightGrid.SelectedRows.Count == 0) { MessageBox.Show("请选中过磅记录"); return; } var target = weightGrid.CurrentRow.DataBoundItem as WeightBill_Detail; target.PiWeight = WeightValue; target.Weight = target.MaoWeight - target.PiWeight; weightGrid.Refresh(); WeightValue = null; } private void farmerSelect_SelectedIndexChanged(object sender, EventArgs e) { if (farmerSelect.IsEmpty) return; var detail = new WeightBill_FarmerDetail(); detail.Farmer_ID = farmerSelect.LongValue.Value; if (_farmerDetails.Any(x => x.Farmer_ID == detail.Farmer_ID)) return; detail.Farmer_Name = farmerSelect.DisplayValue; _farmerDetails.Add(detail); detail.Index = _farmerDetails.Max(x => x.Index) + 1; detail.WeightBill_ID = Dmo.ID; farmerGrid.DataSource = null; farmerGrid.DataSource = _farmerDetails; farmerGrid.Refresh(); farmerSelect.Clear(); } void GetFromUI() { if (!employeeSelect.IsEmpty) { Dmo.Employee_ID = long.Parse(employeeSelect.Value); Dmo.Employee_Name = employeeSelect.DisplayValue; } Dmo.WeighTime = weightTimeSelect.Date; if (!supplierSelect.IsEmpty) { Dmo.Supplier_ID = long.Parse(supplierSelect.Value); Dmo.Supplier_Name = supplierSelect.DisplayValue; } if (!zoneSelect.IsEmpty) { Dmo.Zone_ID = long.Parse(zoneSelect.Value); Dmo.Zone_Name = zoneSelect.DisplayValue; } if (!purchaseTypeSelect.IsEmpty) { Dmo.PurchaseType_ID = short.Parse(purchaseTypeSelect.Value); Dmo.PurchaseType_Name = purchaseTypeSelect.DisplayValue; } if (!carSelect.IsEmpty) { Dmo.Car_ID = long.Parse(carSelect.Value); Dmo.Car_Name = carSelect.DisplayValue; } if (!liveVarietiesSelect.IsEmpty) { Dmo.LiveVarieties_ID = long.Parse(liveVarietiesSelect.Value); Dmo.LiveVarieties_Name = liveVarietiesSelect.DisplayValue; } if (!hogGradeSelect.IsEmpty) { Dmo.HogGrade_ID = long.Parse(hogGradeSelect.Value); Dmo.HogGrade_Name = hogGradeSelect.DisplayValue; } if (!string.IsNullOrEmpty(penWeightInput.Text)) { decimal pw = 0; if (!decimal.TryParse(penWeightInput.Text.Trim(), out pw)) throw new Exception("棚前重量输入错误"); Dmo.ShackWeight = pw; } if (!string.IsNullOrEmpty(penPriceInput.Text)) { decimal pp = 0; if (!decimal.TryParse(penPriceInput.Text.Trim(), out pp)) throw new Exception("棚前单价输入错误"); Dmo.ShackPrice = pp; } if (!string.IsNullOrEmpty(testCardNumberInput.Text)) Dmo.AnimalTestNumber = testCardNumberInput.Text; if (!string.IsNullOrEmpty(testTimeInput.Text)) Dmo.AnimalTestDate = testTimeInput.Date; if (!string.IsNullOrEmpty(testManInput.Text)) Dmo.AnimalTestMan = testManInput.Text; if (!string.IsNullOrEmpty(remarkInput.Text)) Dmo.Remark = remarkInput.Text; foreach (DataGridViewRow data in farmerGrid.Rows) { var detail = data.DataBoundItem as WeightBill_FarmerDetail; var first =_farmerDetails.First(x => x.Index == detail.Index); first.Number = detail.Number; first.Weight = detail.Weight; } foreach (DataGridViewRow data in weightGrid.Rows) { var detail = data.DataBoundItem as WeightBill_Detail; var first = _details.First(x => x.Index == detail.Index); first.Number = detail.Number; first.MaoWeight = detail.MaoWeight; first.PiWeight = detail.PiWeight; first.Weight = (detail.MaoWeight ?? 0) - (detail.PiWeight ?? 0); } } void AppToUI() { ResetControl(); if (Dmo.Employee_ID.HasValue) employeeSelect.Fill(Dmo.Employee_Name, Dmo.Employee_ID.ToString()); if (Dmo.WeighTime.HasValue) weightTimeSelect.Date = Dmo.WeighTime; if (Dmo.Supplier_ID.HasValue) supplierSelect.Fill(Dmo.Supplier_Name, Dmo.Supplier_ID.ToString()); if (Dmo.Zone_ID.HasValue) zoneSelect.Fill(Dmo.Zone_Name, Dmo.Zone_ID.ToString()); if (Dmo.PurchaseType_ID.HasValue) purchaseTypeSelect.Fill(Dmo.PurchaseType_Name, Dmo.PurchaseType_ID.ToString()); if (Dmo.Car_ID.HasValue) carSelect.Fill(Dmo.Car_Name, Dmo.Car_ID.ToString()); if (Dmo.LiveVarieties_ID.HasValue) liveVarietiesSelect.Fill(Dmo.LiveVarieties_Name, Dmo.LiveVarieties_ID.ToString()); if (Dmo.HogGrade_ID.HasValue) hogGradeSelect.Fill(Dmo.HogGrade_Name, Dmo.HogGrade_ID.ToString()); if (Dmo.ShackWeight.HasValue) penWeightInput.Text = Dmo.ShackWeight.Value.ToString(); if (Dmo.ShackPrice.HasValue) penPriceInput.Text = Dmo.ShackPrice.Value.ToString(); if (Dmo.ShackMoney.HasValue) penMoneyInput.Text = Dmo.ShackMoney.Value.ToString(); if (!string.IsNullOrEmpty(Dmo.AnimalTestNumber)) testCardNumberInput.Text = Dmo.AnimalTestNumber; if (Dmo.AnimalTestDate.HasValue) testTimeInput.Date = Dmo.AnimalTestDate.Value; if (!string.IsNullOrEmpty(Dmo.AnimalTestMan)) testManInput.Text = Dmo.AnimalTestMan; if (!string.IsNullOrEmpty(Dmo.Remark)) remarkInput.Text = Dmo.Remark; _farmerDetails = Dmo.FarmerDetails.ToList(); _details = Dmo.Details.ToList(); if (_farmerDetails.Any()) farmerGrid.DataSource = _farmerDetails; if (_details.Any()) weightGrid.DataSource = _details; } void ResetControl() { employeeSelect.Clear(); weightTimeSelect.Date = null; supplierSelect.Clear(); zoneSelect.Clear(); purchaseTypeSelect.Clear(); carSelect.Clear(); liveVarietiesSelect.Clear(); hogGradeSelect.Clear(); penWeightInput.Text = null; penPriceInput.Text = null; penMoneyInput.Text = null; testCardNumberInput.Text = null; testTimeInput.Date = null; testManInput.Text = null; remarkInput.Text = null; farmerGrid.DataSource = null; weightGrid.DataSource = null; } private void billGrid_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { if (e.RowIndex < 0) return; var id = Convert.ToInt64(billGrid.CurrentRow.Cells["M_ID"].Value); Dmo = dmoList.First(x => x.ID == id); AppToUI(); } private void weightSet_Click(object sender, EventArgs e) { new WeightConfig().ShowDialog(); } private void deleteBtn_Click(object sender, EventArgs e) { if (Dmo.ID != 0) WeightBillRpc.Delete(Dmo.ID); if (dmoList.Any(x => x.ID == Dmo.ID)) { dmoList.Remove(Dmo); BindWeightBill(); } createBtn_Click(sender, e); MessageBox.Show("删除成功!"); } private void queryBtn_Click(object sender, EventArgs e) { dmoList = WeightBillRpc.GetWeightBillList(qCarSelect.LongValue, qSupplierSelect.LongValue); BindWeightBill(); } } }