using DevComponents.DotNetBar.SuperGrid; using POSV.Card; using POSV.Entity; using POSV.Report; using POSV.Template; using POSV.Utils; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace POSV.Stock { public partial class StoreStorageConsumeAddForm : BusinessForm { private List _ids = new List(); private string _oldId; private OperateType _OperateType; public StoreStorageConsumeAddForm(OperateType type, string id) { InitializeComponent(); _OperateType = type; if (type == OperateType.ADD) { this.controlBox1.Text = "新增耗料单"; this.txtStatus.Text = "新建"; } else if(type == OperateType.EDIT) { this.controlBox1.Text = "修改耗料单"; _oldId = id; } } protected override void OnLoad(EventArgs e) { base.OnLoad(e); BuilderOrderGrid(); InstallStorage(); //单据编号 if(_OperateType == OperateType.ADD) { this.txtBusNo.Text = string.Format("{0}{1}{2}", "SO", Global.Instance.Authc.PosNo, DateTime.Now.ToString("yyyyMMddHHmmss")); this.txtSetMan.Text = Global.Instance.Worker.Name; this.txtSetDate.Text = DateTimeUtils.GetNowFormat(); } else { InstallEditInfo(); } } /// /// 加载修改的订单信息 /// private void InstallEditInfo() { Task.Factory.StartNew(() => { var res = StockUtils.QueryStoreStorageOutTicketList(null, "id", _oldId, 1, 1, null, null, null); if (res.Item1 && res.Item3.List != null && res.Item3.List.Count > 0) { //获取单据成功 //获取单据明细 var detailRes = StockUtils.QueryStoreStorageOutTicketDetailList(_oldId, 1, 500); if (detailRes.Item1) { return new Tuple>(res.Item3.List[0], detailRes.Item3.List); } else { this.ShowToastNotify(this, detailRes.Item2); } } else { this.ShowToastNotify(this, res.Item2); } return new Tuple>(null, null); }).ContinueWith(task => { if (task.IsFaulted) { LOGGER.Error(task.Exception.GetBaseException(), "加载耗料单异常"); } else { var res = task.Result; if(res.Item1 != null && res.Item2 != null) { if (this.IsDisposed || !this.IsHandleCreated) return; this.Invoke(new Action(() => { var order = res.Item1; this.txtBusNo.Text = order.No; this.txtStatus.Text = order.StatusStr; this.boxStorage.Text = order.StorageName; this.txtMemo.Text = order.Description; this.txtSetMan.Text = order.SetMan; this.txtSetDate.Text = order.SetDate; var detailList = res.Item2; List gridList = new List(); foreach(var detail in detailList) { GridRow row = new GridRow("", detail.ProductId, detail.ProductNo, detail.ProductName, detail.SpecId, detail.SpecName, detail.ProductDescription, detail.StockUnitId, detail.StockUnitName, detail.Amount, detail.Price, StringUtils.FormatDataTwoDigit(detail.Money), detail.Description); gridList.Add(row); } this.detailGrid.PrimaryGrid.Rows.AddRange(gridList); })); } } }); } private void InstallStorage() { List storeList = null; using(var db = Global.Instance.OpenDataBase) { storeList = db.Query("order by no").ToList(); } this.boxStorage.DataSource = storeList; this.boxStorage.DisplayMember = "Name"; } private void BuilderOrderGrid() { var panel = detailGrid.PrimaryGrid; panel.DefaultRowHeight = 40; panel.RowHeaderIndexOffset = 1; var cols = ReportUtils.GetGridObject("POSV.Stock.", "StoreStorageConsumeAddTicketDetail.json"); if (cols != null) { Assembly asmb = Assembly.LoadFrom("DevComponents.DotNetBar.SuperGrid.dll"); foreach (var col in cols) { panel.Columns.Add(new DevComponents.DotNetBar.SuperGrid.GridColumn() { Name = col.Name, HeaderText = col.HeaderText, DataPropertyName = col.DataPropertyName, Visible = col.Display, Width = col.Width, AllowEdit = col.AllowEdit, EditorType = asmb.GetType(col.EditorType, true) }); } //可编辑cell颜色特殊标注 Color bgColor = ColorTranslator.FromHtml("193,255,192"); panel.Columns["amount"].CellStyles.Default.Background.Color1 = bgColor; panel.Columns["price"].CellStyles.Default.Background.Color1 = bgColor; panel.Columns["description"].CellStyles.Default.Background.Color1 = bgColor; } else { panel.NoRowsText = "加载报表错误,请联系管理员"; } } /// /// 选择商品 /// /// /// private void OnSelectProductClick(object sender, EventArgs e) { _ids = new List(); foreach(GridRow row in detailGrid.PrimaryGrid.Rows) { _ids.Add(row.Cells["specId"].Value.ToString()); } var form = new SelectProductForm(_ids, null); form.OnProductClick += Form_OnProductClick; ; TransparentForm trans = new TransparentForm(this, form); trans.ShowDialog(this); } private void Form_OnProductClick(object sender, MaterialDetailEventArgs e) { var product = e.Detail; var rows = this.detailGrid.PrimaryGrid.Rows; bool isExist = false; if(rows.Count > 0) { foreach(GridRow row in rows) { if (product.SpecId.Equals(StringUtils.GetString(row["specId"]))) { isExist = true; break; } } } if (!isExist) { GridRow row = new GridRow("", product.ProductId, product.ProductNo, product.ProductName, product.SpecId, product.SpecName, product.Memo, product.PackUnitId, product.PackUnitName, 0.00, product.Price, 0.00, ""); rows.Add(row); } } /// /// 关闭 /// /// /// private void OnCloseClick(object sender, EventArgs e) { if(this.Owner != null) { this.Owner.Close(); } this.Close(); } private void OnExistClick(object sender, EventArgs e) { OnCloseClick(sender, e); } private void OnBeginEdit(object sender, GridEditEventArgs e) { var cell = e.GridCell; var cellPoint = this.detailGrid.PointToScreen(cell.LocationRelative); if(cell.GridColumn.Name == "amount" || cell.GridColumn.Name == "price") { cellPoint.Y -= this.detailGrid.VScrollOffset; var p = NumericKeyboard.CalculateLocation(cellPoint, cell.GridColumn.Width); NumericKeyboard.ShowKeyboard(this, p); } else { var txtForm = new TxtKeyboardForm(StringUtils.GetString(cell.Value)); txtForm.NotifyChanged += (o, args) => { cell.Value = args.Data; }; var trans = new TransparentForm(this, .5, txtForm); trans.Show(this); } } private void OnCloseEdit(object sender, GridCloseEditEventArgs e) { NumericKeyboard.CloseKeyboard(); } private void OnCellValueChanged(object sender, GridCellValueChangedEventArgs e) { var cell = e.GridCell; if (cell.GridColumn.Name == "amount" || cell.GridColumn.Name == "price") { var row = cell.GridRow; var amount = StringUtils.GetDecimal(row.Cells["amount"].Value); if (amount < 0) { this.ShowToastNotify(this, "数量非法"); row.Cells["amount"].Value = 0; amount = 0; } var price = StringUtils.GetDecimal(row.Cells["price"].Value); var money = StringUtils.FormatDataTwoDigit(amount * price); row.Cells["money"].Value = money; } } private void OnMemoClick(object sender, EventArgs e) { var txtForm = new TxtKeyboardForm(StringUtils.GetString(this.txtMemo.Text)); txtForm.NotifyChanged += (o, args) => { this.txtMemo.Text = args.Data.ToString(); }; var trans = new TransparentForm(this, .5, txtForm); trans.Show(this); } private void OnSaveClick(object sender, EventArgs e) { this.buttonX4.Focus(); StoreStorageInTicketAndDetail ticket = new StoreStorageInTicketAndDetail(); if(_OperateType == OperateType.EDIT) { ticket.Id = _oldId; } ticket.No = this.txtBusNo.Text; ticket.Type = 2; var storage = this.boxStorage.SelectedValue as StoreStorage; if(storage == null) { this.ShowToastNotify(this, "请选择耗料仓库"); return; } ticket.StorageId = storage.Id; ticket.StorageName = storage.Name; ticket.Description = this.txtMemo.Text; ticket.SetMan = Global.Instance.Worker.Name; ticket.SetDate = this.txtSetDate.Text; List detailList = new List(); var rows = detailGrid.PrimaryGrid.Rows; if(rows.Count > 0) { foreach (GridRow row in rows) { StoreStorageInDetail detail = new StoreStorageInDetail(); detail.ProductId = StringUtils.GetString(row.Cells["productId"].Value); detail.ProductNo = StringUtils.GetString(row.Cells["productNo"].Value); detail.ProductName = StringUtils.GetString(row.Cells["productName"].Value); detail.SpecId = StringUtils.GetString(row.Cells["specId"].Value); detail.SpecName = StringUtils.GetString(row.Cells["specName"].Value); detail.ProductDescription = StringUtils.GetString(row.Cells["productDescription"].Value); detail.StockUnitId = StringUtils.GetString(row.Cells["stockUnitId"].Value); detail.StockUnitName = StringUtils.GetString(row.Cells["stockUnitName"].Value); detail.Amount = StringUtils.GetDecimal(row.Cells["amount"].Value); detail.Price = StringUtils.GetDecimal(row.Cells["price"].Value); detail.Money = StringUtils.GetDecimal(row.Cells["money"].Value); detail.Description = StringUtils.GetString(row.Cells["description"].Value); if(detail.Amount <= 0) { this.ShowToastNotify(this, string.Format("<{0}>耗料数量<{1}>不合法", detail.ProductName, detail.Amount)); row.IsSelected = true; return; } detailList.Add(detail); } ticket.DetailList = detailList; Tuple res = null; if (_OperateType == OperateType.ADD) { res = StockUtils.AddStoreStorageOutTicket(ticket); } else { res = StockUtils.ModifyStoreStorageOutTicket(ticket); } if (res.Item1) { DialogForm dialog = new DialogForm("提示", "耗料单保存成功", MessageBoxIcon.Warning, MessageBoxButtons.OK); dialog.ShowDialog(this); NotifyParent(); OnCloseClick(sender, e); } else { this.ShowToastNotify(this, res.Item2); return; } } else { this.ShowToastNotify(this, "请选择耗料商品"); return; } } public virtual void NotifyParent() { OnSaveSuccess?.Invoke(this, null); } public delegate void EventHandler(object sender, EventArgs e); public event EventHandler OnSaveSuccess; /// /// 删除明细 /// /// /// private void OnDeleteItemClick(object sender, EventArgs e) { GridRow row = this.detailGrid.PrimaryGrid.ActiveRow as GridRow; if(row == null) { this.ShowToastNotify(this, "请选择删除的明细"); return; } else { this.detailGrid.PrimaryGrid.Rows.Remove(row); _ids.Remove(row.Cells["specId"].Value.ToString()); } } } }