using DevComponents.DotNetBar.Controls; using HH.WMS.Entitys; using HH.WMS.Client.bll; using HH.WMS.Client.Common; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using HH.WMS.Entitys.Entitys; using DevComponents.DotNetBar; using Newtonsoft.Json.Linq; using HH.WMS.Common; using HH.WMS.Entitys.Basic; using HH.WMS.Client.CustomControl; namespace HH.WMS.Client.frm { public partial class frmUpShelves : frmTemplet { /// /// 当前物料PAK码 /// private string currentPak; /// /// 已扫唯一码(判断是否重复扫描) /// private List haveAlreadyScan = new List(); /// /// 当前容器实体 /// private TN_WM_B_TRAY_INFOEntity trayInfoModel = new TN_WM_B_TRAY_INFOEntity(); /// /// 当前容器内原有物料实体 /// private List originalTrayItemList = new List(); /// /// 当前扫描物料实体 /// private AutoBomItemEntity itemTempModel = new AutoBomItemEntity(); /// /// 物料缓存实体 /// private List itemModelCacheList = new List(); /// /// 是否允许混放 /// private bool isAllowMixing = true; /// /// 物料混放上限 /// private int limitQty = 0; /// /// 等待入容器的重量 /// private decimal allAddInWeight = 0; #region 等待容器 private List _waitTray = new List(); /// /// 等待容器 /// public List WaitTray { get { return _waitTray; } set { _waitTray = value; lblWaitTray.Text = string.Join(",", _waitTray.ToArray()); if (lblWaitTray.Text != "等待容器..........") { lblWaitTray.ForeColor = Color.Red; } } } #endregion public CusTray tray = new CusTray(1, 1); /// /// 已扫描未处理的物料(码盘物料/移除物料) /// private List scanedWaitExecuteItems = new List(); public frmUpShelves() { InitializeComponent(); this.ScanTrayEvent += frmUpShelves_ScanTrayEvent; this.ScanItemEvent += frmUpShelves_ScanItemEvent; this.ScanEnterEvent += frmUpShelves_ScanEnterEvent; this.ScanItemUniqueCodeEvent += frmUpShelves_ScanItemUniqueCodeEvent; this.dgvData.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; this.dgvThisUp.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; this.dgvWaitUp.DataError += delegate (object sender, DataGridViewDataErrorEventArgs e) { }; this.KeyDown += frmTemplet_KeyDown; this.dgvData.AutoGenerateColumns = false; this.dgvThisUp.AutoGenerateColumns = false; this.dgvWaitUp.AutoGenerateColumns = false; } /// /// 扫描唯一码 /// void frmUpShelves_ScanItemUniqueCodeEvent(object sender, frmTemplet.ScanItemUniqueCodeEventArgs e) { #region 是否重复扫码判断 var scanCode = e.itemInfo.CN_S_UNIQUE_CODE; if (haveAlreadyScan != null && haveAlreadyScan.Contains(scanCode)) { //该唯一码已被扫过,请勿重复扫码 ***********无法判断此编码是否已存在于原容器中 MessageBoxEx.Show("该唯一码已被扫过,请勿重复扫码!"); return; } #endregion if (lblItemTray.Text.Trim() == "_______________") { //判断待上架区是否存在物料 List CheckWaitUpData = (List)dgvWaitUp.DataSource; if (CheckWaitUpData != null) { //该物料不存在待上架的信息 MessageBoxEx.Show("待上架列表中已存在物料数据,请先指引!"); return; } //不存在容器码,指引物料 //获取待上架的所有物料 string str = WebApiManager.HttpWMS_Get("/api/Up/GetWaitUpShelvesItems?itemCode=" + e.itemInfo.CN_S_ITEM_CODE); OperateResult or = JsonConvert.DeserializeObject(str); if (or.Status == ResultStatus.Success) { List waitList = JsonConvert.DeserializeObject>(or.Data.ToString()); //绑定待上架的物料 if (waitList.Count > 0) { //dgvWaitUp.AutoGenerateColumns = false; dgvWaitUp.DataSource = waitList; btnEnter.Text = "确认指引"; } else { //该物料不存在待上架的信息 MessageBoxEx.Show("暂存区未找到该物料待上架的信息!"); return; } } } else { //存储类别、物料毛重、最大承受重量判断 var endAreaCode = StaticUtil.WorkArea; //获取物料实体 itemTempModel = GetItemEntity(e.itemInfo.CN_S_ITEM_CODE); if (itemTempModel == null) { MessageBoxEx.Show("未获取到物料 " + e.itemInfo.CN_S_ITEM_CODE + " 的实体!"); return; } //当待上架区有物料时,需要用户扫描待上架物料,不准扫其他物料 List CheckWaitUpData = (List)dgvWaitUp.DataSource; if (CheckWaitUpData.Count > 0) { var hasWaitData = CheckWaitUpData.Where(x => x.CN_S_ITEM_CODE == itemTempModel.CN_S_ITEM_CODE).ToList(); if (hasWaitData.Count == 0) { MessageBoxEx.Show("请扫描待上架区物料!"); return; } } if (itemTempModel.CN_S_STORE_TYPE != endAreaCode) { MessageBoxEx.Show("物料存储类别与目的库区不符!"); return; } if (itemTempModel.CN_F_TW == 0) { MessageBoxEx.Show("物料" + e.itemInfo.CN_S_ITEM_CODE + "没维护毛重!"); return; } var packNum = e.itemInfo.CN_F_PACKING_QTY; if (packNum * itemTempModel.CN_F_TW > trayInfoModel.CN_F_LOADBEARING) { MessageBoxEx.Show("物料" + e.itemInfo.CN_S_ITEM_CODE + "已超出容器最大承受重量!"); return; } #region 物料混放上限判断 if (trayInfoModel.CN_N_GOODUPLINE != 0) { //原始容器物料个数汇总 var haveOld = originalTrayItemList.GroupBy(x => x.CN_S_ITEM_CODE).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim() }).ToList(); //刚扫物料集合内物料个数汇总 var haveNew = scanedWaitExecuteItems.GroupBy(x => x.CN_S_ITEM_CODE).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim() }).ToList(); haveOld.AddRange(haveNew); var distinctEntity = haveOld.Distinct().ToList(); if (distinctEntity.Where(x => x.CN_S_ITEM_CODE == e.itemInfo.CN_S_ITEM_CODE).ToList().Count == 0) { if (distinctEntity.Count + 1 > trayInfoModel.CN_N_GOODUPLINE) { MessageBoxEx.Show("已超出物料混放上限 " + trayInfoModel.CN_N_GOODUPLINE + " !"); return; } } } #endregion //存放规格判断 OperateResult resultTrayInfo = new TrayBll().GetTrayCapacityInfo(e.itemInfo.CN_S_ITEM_CODE); if (resultTrayInfo.Success) { TN_WM_B_TRAY_CAPACITYEntity itemCapacityModel = JsonConvert.DeserializeObject(resultTrayInfo.Data.ToString()); var trayGrid = trayInfoModel.CN_N_ROW_NUM * trayInfoModel.CN_N_COLUMN_NUM; if (!(itemCapacityModel.CN_S_SPEC == trayInfoModel.CN_S_SPEC && (trayGrid != 1 ? itemCapacityModel.CN_S_STORE_UNIT == trayGrid.ToString() : true))) { MessageBoxEx.Show("物料" + e.itemInfo.CN_S_ITEM_CODE + "设置存放规格与当前容器规格不符!"); return; } } int PutInGrid = DoPutItemInTray(e.itemInfo.CN_S_ITEM_CODE, e.itemInfo); //返回True或者False if (PutInGrid != 0) { #region 表格联动 //如果待上架预分配有数据,那就是指引出来的容器补料上架 //联动待上架减物料 List waitUpData = (List)dgvWaitUp.DataSource; if (waitUpData.Count > 0) { foreach (var item in waitUpData) { if (item.CN_S_ITEM_CODE == e.itemInfo.CN_S_ITEM_CODE) { item.CN_F_QUANTITY = item.CN_F_QUANTITY - e.itemInfo.CN_F_PACKING_QTY; } } waitUpData = waitUpData.Where(x => x.CN_F_QUANTITY > 0).ToList(); dgvWaitUp.DataSource = waitUpData; } //联动已扫描加物料 List ThisUpData = (List)dgvThisUp.DataSource; //如果已存在于已扫描物料区,则直接加数量 if (ThisUpData != null && ThisUpData.Where(x => x.CN_S_ITEM_CODE == e.itemInfo.CN_S_ITEM_CODE).ToList().Count > 0) { foreach (var item in ThisUpData) { if (item.CN_S_ITEM_CODE == e.itemInfo.CN_S_ITEM_CODE) { item.CN_F_QUANTITY = item.CN_F_QUANTITY + e.itemInfo.CN_F_PACKING_QTY; } } dgvThisUp.DataSource = ThisUpData; dgvThisUp.Refresh(); } //如果不存在于已扫描物料区,则直接加一行 else { List newRowList = new List(); newRowList.Add(new TN_WM_B_TRAY_ITEM_MSTEntity() { TokenId = StaticUtil.TokenId, CN_GUID = Guid.NewGuid().ToString(), CN_S_TRAY_CODE = trayInfoModel.CN_S_TRAY_CODE, CN_S_TRAY_GRID = PutInGrid.ToString(), CN_S_ITEM_CODE = e.itemInfo.CN_S_ITEM_CODE, CN_S_ITEM_NAME = e.itemInfo.CN_S_ITEM_NAME, CN_S_FIGURE_NO = e.itemInfo.CN_S_FIGURE_NO, CN_F_QUANTITY = e.itemInfo.CN_F_PACKING_QTY, CN_S_ITEM_STATE = Constants.ItemState_Qualified,//默认 CN_S_MEASURE_UNIT = e.itemInfo.CN_S_PACKING_UNIT, CN_S_MODEL = e.itemInfo.CN_S_MODEL, CN_S_OWNER = e.itemInfo.CN_S_OWNER }); dgvThisUp.DataSource = newRowList; } #endregion #region 容器样式联动 tray.SetNumByTrayGrid(PutInGrid, allAddInWeight, trayInfoModel.CN_F_LOADBEARING.HasValue ? trayInfoModel.CN_F_LOADBEARING.Value : 1); //tray.Refresh(); #endregion //存在容器码,扫描物料则是需要码盘 TN_WM_B_TRAY_ITEM_MSTEntity mst = new TN_WM_B_TRAY_ITEM_MSTEntity() { TokenId = StaticUtil.TokenId, CN_GUID = Guid.NewGuid().ToString(), CN_S_UNIQUE_CODE = e.itemInfo.CN_S_UNIQUE_CODE, CN_S_TRAY_CODE = trayInfoModel.CN_S_TRAY_CODE, CN_S_TRAY_GRID = PutInGrid.ToString(), CN_S_ITEM_CODE = e.itemInfo.CN_S_ITEM_CODE, CN_S_LOT_NO = e.itemInfo.CN_S_LOT_NO, CN_S_ITEM_NAME = e.itemInfo.CN_S_ITEM_NAME, CN_S_FIGURE_NO = e.itemInfo.CN_S_FIGURE_NO, CN_F_QUANTITY = e.itemInfo.CN_F_PACKING_QTY, CN_S_ITEM_STATE = Constants.ItemState_Qualified,//默认 CN_S_MEASURE_UNIT = string.IsNullOrEmpty(e.itemInfo.CN_S_PACKING_UNIT) ? GetItemEntity(e.itemInfo.CN_S_ITEM_CODE.ToString()).CN_S_MEASURE_UNIT : e.itemInfo.CN_S_PACKING_UNIT, CN_S_MODEL = e.itemInfo.CN_S_MODEL, CN_S_OWNER = e.itemInfo.CN_S_OWNER }; List trayitemrelDtl = new List(); trayitemrelDtl.Add(new TN_WM_B_TRAY_ITEM_DTLEntity() { CN_PARENT_GUID = mst.CN_GUID, CN_S_PACKING_UNIT = e.itemInfo.CN_S_PACKING_UNIT, CN_F_PACKING_QTY = e.itemInfo.CN_F_PACKING_QTY, CN_S_LOT_NO = e.itemInfo.CN_S_LOT_NO, CN_S_PRODUCTION_BATCH = e.itemInfo.CN_S_PRODUCTION_BATCH }); mst.TrayItemDtlList = trayitemrelDtl; scanedWaitExecuteItems.Add(mst); haveAlreadyScan.Add(e.itemInfo.CN_S_UNIQUE_CODE); } else { MessageBoxEx.Show("未找到有效位置!"); return; } } } /// /// 判断物料是否可以放到容器上 /// /// 物料编码 /// 扫描物料唯一码返回的实体,如果扫描的是物料编码,则此值为null /// private int DoPutItemInTray(string itemCode, MONGO_PRINT_BARCODE scanItemModel) { //循环容器分格 for (var a = 1; a <= trayInfoModel.CN_N_COLUMN_NUM * trayInfoModel.CN_N_ROW_NUM; a++) { #region 判断重量是否超标 var trayGrid = a; var groupList_1 = originalTrayItemList.GroupBy(x => new { x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_WEIGHT }).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_WEIGHT = g.Sum(p => p.CN_F_QUANTITY) * (GetItemEntity(g.FirstOrDefault().CN_S_ITEM_CODE.Trim())).CN_F_TW }).ToList(); var groupList_2 = groupList_1.GroupBy(x => new { x.CN_S_TRAY_GRID, x.CN_S_WEIGHT }).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_WEIGHT = g.Sum(p => p.CN_S_WEIGHT) }).ToList(); var selectItem = groupList_2.Where(x => x.CN_S_TRAY_GRID == trayGrid.ToString()).ToList(); decimal haveWeight = 0;//容器分格内原有物料重量(已汇总) if (selectItem.Count != 0) { haveWeight = selectItem[0].CN_S_WEIGHT; } //************************************************************** var groupList_3 = scanedWaitExecuteItems.GroupBy(x => new { x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_WEIGHT }).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_WEIGHT = g.Sum(p => p.CN_F_QUANTITY) * (GetItemEntity(g.FirstOrDefault().CN_S_ITEM_CODE.Trim())).CN_F_TW }).ToList(); var groupList_4 = groupList_3.GroupBy(x => new { x.CN_S_TRAY_GRID, x.CN_S_WEIGHT }).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_WEIGHT = g.Sum(p => p.CN_S_WEIGHT) }).ToList(); var scanItem = groupList_4.Where(x => x.CN_S_TRAY_GRID == trayGrid.ToString()).ToList(); decimal scanWeight = 0;//容器分格本次已经放置物料重量(已汇总) if (scanItem.Count != 0) { scanWeight = scanItem[0].CN_S_WEIGHT; } //************************************************************** //准备入容器分格的重量 decimal PrepareWeight = (itemTempModel.CN_F_TW) * (scanItemModel == null ? itemTempModel.CN_F_MIN_PACK_QTY : scanItemModel.CN_F_PACKING_QTY); //容器内原有重量+已扫描放置重量+本次待放置重量+实际重量 allAddInWeight = haveWeight + scanWeight + PrepareWeight + Convert.ToDecimal(trayInfoModel.CN_F_WEIGHT); #endregion if (allAddInWeight <= Convert.ToDecimal(trayInfoModel.CN_F_LOADBEARING)) { //物料是否存在于原始容器中 var haveOld = originalTrayItemList.Where(x => x.CN_S_ITEM_CODE == itemCode).ToList(); //物料是否存在于刚扫物料集合内 var haveNew = scanedWaitExecuteItems.Where(x => x.CN_S_ITEM_CODE == itemCode).ToList(); if (haveOld.Count == 0 && haveNew.Count == 0) { //新物料,直接放 return trayGrid; } else { //判断批次是否允许混放 if (isAllowMixing) { //判断是否质保件 if (itemTempModel.CN_C_IS_WARRNTY_PARTS == "Y") { if (scanItemModel.CN_S_LOT_NO == originalTrayItemList[0].CN_S_LOT_NO)//批次相同 { return trayGrid; } } else { return trayGrid; } } else { if (originalTrayItemList.Count > 0) { if (scanItemModel.CN_S_LOT_NO == originalTrayItemList[0].CN_S_LOT_NO)//批次相同 { return trayGrid; } } if (scanedWaitExecuteItems.Count > 0) { if (scanItemModel.CN_S_LOT_NO == scanedWaitExecuteItems[0].CN_S_LOT_NO)//批次相同 { return trayGrid; } } } } } } return 0; } /// /// 获取物料实体,并加页面缓存 /// /// 物料编码 /// public AutoBomItemEntity GetItemEntity(string itemCode) { AutoBomItemEntity itemMode = new AutoBomItemEntity(); if (itemModelCacheList != null) { foreach (var item in itemModelCacheList) { if (item.CN_S_ITEM_CODE == itemCode) { itemMode = item; break; } } } if (string.IsNullOrEmpty(itemMode.CN_S_ITEM_CODE)) { string itemStr = WebApiManager.HttpWMS_Get("/api/Item/GetItemModel?itemCode=" + itemCode); OperateResult results = JsonConvert.DeserializeObject(itemStr); if (results.Success) { itemTempModel = JsonConvert.DeserializeObject(results.Data.ToString()); itemMode = itemTempModel; itemModelCacheList.Add(itemTempModel); } } if (string.IsNullOrEmpty(itemMode.CN_S_ITEM_CODE)) { MessageBoxEx.Show("物料 " + itemCode + " 不存在!"); } return itemMode; } /// /// 扫描物料 /// void frmUpShelves_ScanItemEvent(object sender, frmTemplet.ScanItemEventArgs e) { if (lblItemTray.Text.Trim() == "_______________") { //不存在容器码,指引物料 //获取待上架的所有物料 string str = WebApiManager.HttpWMS_Get("/api/Up/GetWaitUpShelvesItems?itemCode=" + e.itemInfo.CN_S_ITEM_CODE); OperateResult or = JsonConvert.DeserializeObject(str); if (or.Status == ResultStatus.Success) { if (((JArray)or.Data).Count > 0) { //绑定待上架的物料 dgvWaitUp.AutoGenerateColumns = false; dgvWaitUp.DataSource = or.Data; btnEnter.Text = "确认指引"; } else { MessageBoxEx.Show("无待上架的物料"); } } } else { // 存在容器码,扫描物料则是需要码盘 TN_WM_B_TRAY_ITEM_MSTEntity mst = new TN_WM_B_TRAY_ITEM_MSTEntity() { TokenId = StaticUtil.TokenId, CN_S_ITEM_CODE = e.itemInfo.CN_S_ITEM_CODE, CN_S_ITEM_NAME = e.itemInfo.CN_S_ITEM_NAME, CN_S_FIGURE_NO = e.itemInfo.CN_S_FIGURE_NO, CN_S_MEASURE_UNIT = e.itemInfo.CN_S_MEASURE_UNIT, CN_F_QUANTITY = e.itemInfo.CN_F_MIN_PACK_QTY, CN_S_ITEM_STATE = Constants.ItemState_Qualified,//默认 CN_S_OWNER = Constants.DefaultOwner }; mst.TrayItemDtlList.Add(new TN_WM_B_TRAY_ITEM_DTLEntity() { CN_PARENT_GUID = mst.CN_GUID, CN_S_PACKING_UNIT = e.itemInfo.CN_S_PACK_UNIT, CN_F_PACKING_QTY = e.itemInfo.CN_F_MIN_PACK_QTY }); scanedWaitExecuteItems.Add(mst); } txtCode.Clear(); } /// /// 扫描容器号 /// /// /// void frmUpShelves_ScanTrayEvent(object sender, frmTemplet.ScanTrayEventArgs e) { if (lblItemTray.Text.Trim() != "_______________") { MessageBoxEx.Show("请把当前容器 " + lblItemTray.Text.Trim() + " 处理完成后再切换容器!"); return; } #region 判断:根据容器找所在货位信息 OperateResult resultLocation = new TrayBll().GetLocationByTray(e.trayInfo.CN_S_TRAY_CODE); if (resultLocation.Success) { if (resultLocation.Data != null) { TN_WM_B_TRAY_LOCATIONEntity items = JsonConvert.DeserializeObject(resultLocation.Data.ToString()); if (!string.IsNullOrEmpty(items.CN_S_LOCATION_CODE)) { MessageBoxEx.Show("容器 " + e.trayInfo.CN_S_TRAY_CODE + " 已在货位 " + items.CN_S_LOCATION_CODE + " 上,禁止扫码!"); return; } } } #endregion #region 判断:根据容器找所在任务信息 OperateResult resultTask = new TrayBll().GetTaskByTray(e.trayInfo.CN_S_TRAY_CODE); if (resultTask.Success) { List items = JsonConvert.DeserializeObject>(resultTask.Data.ToString()); if (items.Any()) { MessageBoxEx.Show("容器 " + e.trayInfo.CN_S_TRAY_CODE + " 已在任务 " + items[0].CN_S_TASK_NO + " 中,禁止扫码!"); return; } } #endregion if (lblWaitTray.Text != "等待容器..........") { if (_waitTray.Contains(e.trayInfo.CN_S_TRAY_CODE)) { lblWaitTray.Text = "容器 " + e.trayInfo.CN_S_TRAY_CODE + " 正在执行"; } else { MessageBoxEx.Show("请扫描等待容器!"); return; } } lblItemTray.Text = e.trayInfo.CN_S_TRAY_CODE; txtCode.Clear(); //加载容器信息 OperateResult resultTrayInfo = new TrayBll().GetTrayInfo(e.trayInfo.CN_S_TRAY_CODE); if (resultTrayInfo.Success) { trayInfoModel = JsonConvert.DeserializeObject(resultTrayInfo.Data.ToString()); tray = new CusTray(trayInfoModel.CN_N_ROW_NUM, trayInfoModel.CN_N_COLUMN_NUM); tray.Dock = DockStyle.Fill; panelCurrentTray.Controls.Add(tray); } //加载容器中的物料信息 OperateResult result = new TrayBll().GetItems(e.trayInfo.CN_S_TRAY_CODE); if (result.Success) { List items = JsonConvert.DeserializeObject>(result.Data.ToString()); originalTrayItemList = items; dgvData.DataSource = items; } //加载容器的预预分配信息 result = new TrayBll().GetTrayAlloc(e.trayInfo.CN_S_TRAY_CODE); if (result.Status == ResultStatus.Success) { List allocs = JsonConvert.DeserializeObject>(result.Data.ToString()); List itemMstList = new List(); foreach (var item in allocs) { itemMstList.Add(new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_TRAY_GRID = item.CN_S_TRAY_GRID, CN_S_TRAY_CODE = item.CN_S_TRAY_CODE, CN_S_ITEM_CODE = item.CN_S_ITEM_CODE, CN_S_ITEM_NAME = item.CN_S_ITEM_NAME, CN_S_FIGURE_NO = item.CN_S_FIGURE_NO, CN_F_QUANTITY = item.CN_F_QUANTITY.HasValue ? item.CN_F_QUANTITY.Value : 0, CN_S_ITEM_STATE = Constants.ItemState_Qualified,//默认 CN_S_MEASURE_UNIT = GetItemEntity(item.CN_S_ITEM_CODE.ToString()).CN_S_MEASURE_UNIT, CN_S_MODEL = item.CN_S_MODEL }); } dgvWaitUp.DataSource = itemMstList; } //扫描容器后,可以直接“回库”或“入库” btnEnter.Text = "入库"; } private void frmUpShelves_Load(object sender, EventArgs e) { this.txtCode.Focus(); //获取物料是否允许混放 GetAllowMixing(); } #region 获取策略:物料不同批次是否允许混放 private void GetAllowMixing() { string str = WebApiManager.HttpWMS_Get("/api/TrayItemRel/GetStrategyListByAreaCode?areaCode=" + StaticUtil.WorkArea); OperateResult or = JsonConvert.DeserializeObject(str); if (or.Status == ResultStatus.Success) { List lstStrategy = JsonConvert.DeserializeObject>(or.Data.ToString()); var returnList = lstStrategy.Where(x => x.CN_S_CODE == StrategyKey.MixedBatchesOrNot).ToList(); if (returnList.Count > 0) { isAllowMixing = true; } else { isAllowMixing = false; } } } #endregion void frmUpShelves_ScanEnterEvent(object sender, EventArgs e) { btnEnter_Click(sender, e); } //提交操作 private void btnEnter_Click(object sender, EventArgs e) { switch (btnEnter.Text) { case "入库": #region 入库功能 List waitUpData = (List)dgvWaitUp.DataSource; //是否继续指引 bool isContinueAlloc = false; if (waitUpData.Count > 0) { DialogResult dr = MessageBoxEx.Show("待上架区剩余物料是否继续指引容器?", "", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2); if (dr == DialogResult.Yes) { //点确定的代码 // MessageBoxEx.Show("点确定"); isContinueAlloc = true; } else { //点取消的代码 //继续放物料 return; } } TN_WM_TASKEntity task = new TN_WM_TASKEntity() { CN_N_PRIORITY = 1, CN_S_END_AREA = StaticUtil.WorkArea, CN_S_FROM_OP = "", CN_S_FROM_NO = "", CN_S_START_AREA = StaticUtil.WorkBench, CN_S_START_BIT = StaticUtil.WorkBenchTrayBit, CN_S_STOCK_CODE = StaticUtil.StockCode, CN_S_TASK_TYPE = "上架", CN_S_TRAY_CODE = lblItemTray.Text.Trim(), TokenId = StaticUtil.TokenId }; OperateResult orTrayItem = new OperateResult(); if (scanedWaitExecuteItems.Any()) { #region 拼接最终提交数据 List mstNewList = new List(); //批量克隆 scanedWaitExecuteItems.ForEach(x => { mstNewList.Add(TransExpV2.Trans(x)); }); var mstNewList_GroupList = mstNewList.GroupBy(x => new { x.CN_S_ITEM_CODE, x.CN_S_ITEM_STATE, x.CN_S_OWNER, x.CN_S_TRAY_GRID }).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(), CN_S_TRAY_GRID = g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME.Trim(), CN_S_FIGURE_NO = g.FirstOrDefault().CN_S_FIGURE_NO.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_S_MEASURE_UNIT = g.FirstOrDefault().CN_S_MEASURE_UNIT.Trim(), CN_S_MODEL = g.FirstOrDefault().CN_S_MODEL.Trim(), CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); List _FinallyScanData = new List(); foreach (var item in mstNewList_GroupList) { var itemCode = item.CN_S_ITEM_CODE; var trayGrid = item.CN_S_TRAY_GRID; var itemState = item.CN_S_ITEM_STATE; var owner = item.CN_S_OWNER; TN_WM_B_TRAY_ITEM_MSTEntity mstData = new TN_WM_B_TRAY_ITEM_MSTEntity(); mstData = item; mstData.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); mstData.TokenId = scanedWaitExecuteItems[0].TokenId; List dtlList = new List(); var _findDtlList = mstNewList.Where(x => x.CN_S_ITEM_CODE == itemCode && x.CN_S_TRAY_GRID == trayGrid && x.CN_S_OWNER == owner && x.CN_S_ITEM_STATE == itemState).ToList(); if (_findDtlList.Count > 0) { foreach (var itemDtl in _findDtlList) { dtlList.AddRange(itemDtl.TrayItemDtlList); } } List dtlResultList = new List(); dtlResultList = dtlList.GroupBy(x => new { x.CN_S_LOT_NO, x.CN_S_PRODUCTION_BATCH, x.CN_S_PACKING_UNIT }).Select(g => new TN_WM_B_TRAY_ITEM_DTLEntity { CN_F_PURCHASE_PRICE = g.FirstOrDefault().CN_F_PURCHASE_PRICE, CN_F_RETAIL_PRICE = g.FirstOrDefault().CN_F_PURCHASE_PRICE, CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_F_QUANTITY = g.FirstOrDefault().CN_F_QUANTITY, CN_S_CREATOR = g.FirstOrDefault().CN_S_CREATOR, CN_S_CREATOR_BY = g.FirstOrDefault().CN_S_CREATOR_BY, CN_T_CREATE = g.FirstOrDefault().CN_T_CREATE, CN_S_MODIFY = g.FirstOrDefault().CN_S_MODIFY, CN_S_MODIFY_BY = g.FirstOrDefault().CN_S_MODIFY_BY, CN_T_MODIFY = g.FirstOrDefault().CN_T_MODIFY, CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO, CN_S_PRODUCTION_BATCH = g.FirstOrDefault().CN_S_PRODUCTION_BATCH, CN_S_SERIAL_NO = g.FirstOrDefault().CN_S_SERIAL_NO, CN_S_NOTE = g.FirstOrDefault().CN_S_NOTE, CN_S_PACKING_UNIT = g.FirstOrDefault().CN_S_PACKING_UNIT, CN_S_VENDOR_NO = g.FirstOrDefault().CN_S_VENDOR_NO, CN_S_VENDOR_NAME = g.FirstOrDefault().CN_S_VENDOR_NAME, CN_T_EXPIRATION = g.FirstOrDefault().CN_T_EXPIRATION, CN_T_PRODUCTION = g.FirstOrDefault().CN_T_PRODUCTION, CN_S_UNIQUE_CODE = g.FirstOrDefault().CN_S_UNIQUE_CODE, CN_PARENT_GUID = mstData.CN_GUID, CN_F_PACKING_QTY = g.Sum(p => p.CN_F_PACKING_QTY) }).ToList(); mstData.TrayItemDtlList = dtlResultList; _FinallyScanData.Add(mstData); } #endregion string strTrayItem = WebApiManager.HttpWMS_Post("/api/Up/CommitTrayItem", JsonConvert.SerializeObject(_FinallyScanData)); orTrayItem = JsonConvert.DeserializeObject(strTrayItem); if (orTrayItem.Status == ResultStatus.Success) { scanedWaitExecuteItems = new List(); } else { MessageBoxEx.Show(orTrayItem.Msg); } } else { orTrayItem.Success = true; } if (orTrayItem.Success) { string strup = WebApiManager.HttpWMS_Post("/api/Up/CommitUp", JsonConvert.SerializeObject(task)); OperateResult orup = JsonConvert.DeserializeObject(strup); if (orup.Status == ResultStatus.Success) { MessageBoxEx.Show("入库成功!"); //继续指引托盘出库 #region 指引托盘出库 if (isContinueAlloc) { List oCon = new List(); foreach (DataGridViewRow r in dgvWaitUp.Rows) { oCon.Add(new { item = r.Cells["CN_S_ITEM_CODE"].Value.ToString(), qty = r.Cells["CN_F_QUANTITY"].Value.ToString(), sortingPlatfrom = StaticUtil.WorkBench, trayEndBit = StaticUtil.WorkBenchTrayBit, workAreaCode = StaticUtil.WorkArea, tokenId = StaticUtil.TokenId }); } string strCon = WebApiManager.HttpWMS_Post("/api/Up/CommitUpGuide", JsonConvert.SerializeObject(oCon)); OperateResult orCon = JsonConvert.DeserializeObject(strCon); if (orCon.Status != ResultStatus.Success) { MessageBoxEx.Show(orCon.Msg); } else { //等待容器 List returnWt = JsonConvert.DeserializeObject>(orCon.Data.ToString()); WaitTray.AddRange(returnWt); } } #endregion //上架完成后 if (lblWaitTray.Text != "等待容器..........") { _waitTray.Remove(lblItemTray.Text); WaitTray = _waitTray; } UpClearForm(); return; } else { MessageBoxEx.Show(orup.Msg); } } #endregion break; case "确认指引": #region 指引功能 if (dgvWaitUp.Rows.Count == 0) { MessageBoxEx.Show("无待上架物料可供指引!"); return; } List o = new List(); foreach (DataGridViewRow r in dgvWaitUp.Rows) { o.Add(new { item = r.Cells["CN_S_ITEM_CODE"].Value.ToString(), qty = r.Cells["CN_F_QUANTITY"].Value.ToString(), sortingPlatfrom = StaticUtil.WorkBench, trayEndBit = StaticUtil.WorkBenchTrayBit, workAreaCode = StaticUtil.WorkArea, tokenId = StaticUtil.TokenId }); } string str = WebApiManager.HttpWMS_Post("/api/Up/CommitUpGuide", JsonConvert.SerializeObject(o)); OperateResult or = JsonConvert.DeserializeObject(str); if (or.Status != ResultStatus.Success) { MessageBoxEx.Show(or.Msg); } else { //等待容器 MessageBoxEx.Show("指引成功!"); UpClearForm(); List returnWt = JsonConvert.DeserializeObject>(or.Data.ToString()); WaitTray = returnWt; } #endregion break; } } /// /// 初始化控件 /// private void UpClearForm() { lblItemTray.Text = "_______________"; btnEnter.Text = "Enter"; panelCurrentTray.Controls.Clear(); dgvData.DataSource = null; dgvThisUp.DataSource = null; dgvWaitUp.DataSource = null; } /// /// 物料移除 /// /// /// private void btn_ItemRemove_Click(object sender, EventArgs e) { if (scanedWaitExecuteItems.Any()) { List scanedWaitExecuteItems_New = new List(); frmItemRemove frm = new frmItemRemove(scanedWaitExecuteItems); if (frm.ShowDialog() == DialogResult.OK) { scanedWaitExecuteItems_New = frm.RemoveList; //批量克隆 //frm.RemoveList.ForEach(x => //{ // scanedWaitExecuteItems_New.Add(TransExpV2.Trans(x)); //}); if (scanedWaitExecuteItems_New.Count > 0) { List _groupList = new List(); _groupList = scanedWaitExecuteItems_New.GroupBy(x => new { x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, }).Select(g => new TN_WM_B_TRAY_ITEM_MSTEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); #region 表格联动 //联动待上架加物料 List waitUpData = (List)dgvWaitUp.DataSource; List waitNewRow = new List(); foreach (var itemWait in scanedWaitExecuteItems_New) { if (waitUpData.Count > 0) { foreach (var itemNew in waitUpData) { if (itemNew.CN_S_ITEM_CODE == itemWait.CN_S_ITEM_CODE) { itemNew.CN_F_QUANTITY = itemNew.CN_F_QUANTITY + itemWait.CN_F_QUANTITY; } else { foreach (var itemExist in waitNewRow) { if (itemExist.CN_S_ITEM_CODE == itemWait.CN_S_ITEM_CODE) { itemExist.CN_F_QUANTITY = itemExist.CN_F_QUANTITY + itemWait.CN_F_QUANTITY; } else { TN_WM_B_TRAY_ITEM_MSTEntity add = TransExpV2.Trans(itemWait); waitNewRow.Add(add); } } } } } else { if (waitNewRow.Count > 0) { foreach (var itemExist in waitNewRow) { if (itemExist.CN_S_ITEM_CODE == itemWait.CN_S_ITEM_CODE) { itemExist.CN_F_QUANTITY = itemExist.CN_F_QUANTITY + itemWait.CN_F_QUANTITY; } else { TN_WM_B_TRAY_ITEM_MSTEntity add = TransExpV2.Trans(itemWait); waitNewRow.Add(add); } } } else { TN_WM_B_TRAY_ITEM_MSTEntity add = TransExpV2.Trans(itemWait); waitNewRow.Add(add); } } } if (waitNewRow.Count > 0) { waitUpData.AddRange(waitNewRow); } dgvWaitUp.DataSource = null; dgvWaitUp.DataSource = waitUpData; dgvWaitUp.Refresh(); //联动已扫描减物料 List ThisUpData = (List)dgvThisUp.DataSource; foreach (var itemThis in ThisUpData) { foreach (var itemNew in scanedWaitExecuteItems_New) { if (itemNew.CN_S_ITEM_CODE == itemThis.CN_S_ITEM_CODE) { itemThis.CN_F_QUANTITY = itemThis.CN_F_QUANTITY - itemNew.CN_F_QUANTITY; } } } ThisUpData = ThisUpData.Where(x => x.CN_F_QUANTITY > 0).ToList(); dgvThisUp.DataSource = ThisUpData; dgvThisUp.Refresh(); #endregion #region 已扫描剔除 List haveAlreadyScan_New = new List(); foreach (var item in haveAlreadyScan) { var isre = scanedWaitExecuteItems_New.Where(x => x.CN_S_UNIQUE_CODE == item).ToList(); if (isre.Count == 0) { haveAlreadyScan_New.Add(item); } } haveAlreadyScan = haveAlreadyScan_New; #endregion #region 初始化托盘 panelCurrentTray.Controls.Clear(); tray = new CusTray(trayInfoModel.CN_N_ROW_NUM, trayInfoModel.CN_N_COLUMN_NUM); tray.Dock = DockStyle.Fill; panelCurrentTray.Controls.Add(tray); #endregion #region 最终提交数据 foreach (var itemThis in scanedWaitExecuteItems) { foreach (var itemNew in scanedWaitExecuteItems_New) { if (itemNew.CN_S_UNIQUE_CODE == itemThis.CN_S_UNIQUE_CODE && itemNew.CN_S_ITEM_CODE == itemThis.CN_S_ITEM_CODE) { itemThis.CN_F_QUANTITY = itemThis.CN_F_QUANTITY - itemNew.CN_F_QUANTITY; } } } //处理子表数量-基本单条子表 foreach (var item in scanedWaitExecuteItems) { foreach (var itemDtl in item.TrayItemDtlList) { itemDtl.CN_F_QUANTITY = item.CN_F_QUANTITY; } } scanedWaitExecuteItems = scanedWaitExecuteItems.Where(x => x.CN_F_QUANTITY > 0).ToList(); #endregion } } } else { MessageBoxEx.Show("当前无可移除物料!"); } } } }