using System; using System.Collections.Generic; using System.Linq; using System.ServiceModel; using System.ServiceModel.Description; using SSWMS.Common; namespace SSWMS.Server { [ServiceBehavior(IncludeExceptionDetailInFaults = true, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, MaxItemsInObjectGraph = int.MaxValue, UseSynchronizationContext = false)] public class S_ManageService : I_ManageService { // 立库入库 public bool ManageInCell(STORAGE_MAIN sm, IList lStorageList, string sEndCellCode, bool isManual, string sOperator, out string sResult) { sResult = string.Empty; try { S_BaseService._P_Base_House.BeginTransaction(); // 校验 if (!StringUtils.StockBarcodeValidate(sm.STOCK_BARCODE)) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sm.STOCK_BARCODE} 格式错误"; return false; } if (sm.CELL_CODE.Contains("-")) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {sm.CELL_CODE} 不能立库入库"; return false; } if (isManual && S_BaseService._P_MANAGE_MAIN.GetModelByInSend(sm.CELL_CODE) != null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {sm.CELL_CODE} 已存在入库任务"; return false; } // 库存 if (lStorageList.Count > 2) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = "一个托盘最多绑定两个物料条码"; return false; } if (sm.STORAGE_ID == 0) { // 更新库存 if (lStorageList == null || lStorageList.Count == 0) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = "请输入托盘物料"; return false; } if (!this.ManageInUpdateStorage(sm, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } } else { // 申请入库 if (S_BaseService._P_MANAGE_MAIN.GetModelByStockBarcode(sm.STOCK_BARCODE) != null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在任务"; return false; } lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(sm.STORAGE_ID); if (lStorageList == null || lStorageList.Count == 0) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sm.STOCK_BARCODE} 未找到库存"; return false; } } // 目标位置 WH_CELL wcEndDevice = null; if (string.IsNullOrWhiteSpace(sEndCellCode)) { wcEndDevice = S_BaseService._S_CellService.GetEndCell(sm, null, 0, 0, out sResult); if (wcEndDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } } else { wcEndDevice = S_BaseService._P_WH_CELL.GetModelByCellCode(sEndCellCode); if (wcEndDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"未找到目标位置 {sEndCellCode}"; return false; } if (lStorageList[0].STORAGE_PROPERTY_10 == SystemCode.STOCK_SIZE.Square) { if (S_BaseService._P_IO_CONTROL_ROUTE.GetModelByDeviceCode(sm.CELL_CODE, wcEndDevice.DEVICE_CODE) == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"{sm.CELL_CODE}-{wcEndDevice.DEVICE_CODE} 路径不可用"; return false; } } else { if (S_BaseService._P_IO_CONTROL_ROUTE.GetModelByDeviceCode_L(sm.CELL_CODE, wcEndDevice.DEVICE_CODE) == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"{sm.CELL_CODE}-{wcEndDevice.DEVICE_CODE} 长托路径不可用"; return false; } } if (!S_BaseService._S_CellService.CheckEndCell(wcEndDevice)) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"目标位置 {wcEndDevice.CELL_CODE} 状态不可用"; return false; } //if (sm.CELL_MODEL == SystemCode.CELL_MODEL.High && // wcEndDevice.CELL_MODEL == SystemCode.CELL_MODEL.Low) //{ // S_BaseService._P_Base_House.RollBackTransaction(); // sResult = "高物料不能入库低货位"; // return false; //} } string sLockCellCode = wcEndDevice.CELL_CODE; if (wcEndDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar) { sLockCellCode = wcEndDevice.CELL_CODE_P; } // 更新计划 if (sm.PLAN_ID > 0 && !ManageUpdatePlan(sm.PLAN_ID, true, true, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } // 新增任务 立库入库 this.ManageCreate(sm.CELL_CODE, wcEndDevice.CELL_CODE, sLockCellCode, SystemCode.MANAGE_TYPE.InCell, isManual ? SystemCode.MANAGE_STATUS.Send : SystemCode.MANAGE_STATUS.Waiting, sm, lStorageList, sm.PLAN_ID, 0, sOperator); S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = ex.Message; return false; } return true; } // 暂存入库 public bool ManageInStation(STORAGE_MAIN sm, IList lStorageList, string sOperator, out string sResult) { sResult = string.Empty; try { S_BaseService._P_Base_House.BeginTransaction(); // 校验 if (!StringUtils.StockBarcodeValidate(sm.STOCK_BARCODE)) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sm.STOCK_BARCODE} 格式错误"; return false; } if (sm.CELL_CODE.Contains("-")) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"货位编码 {sm.CELL_CODE} 不能暂存入库"; return false; } // 更新库存 if (lStorageList == null || lStorageList.Count == 0) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = "请输入托盘物料"; return false; } if (!this.ManageInUpdateStorage(sm, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } // 更新计划 if (sm.PLAN_ID > 0 && !this.ManageUpdatePlan(sm.PLAN_ID, true, false, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } // 新增入出库记录 暂存入库 S_BaseService._S_ControlService.CreateRecord(sm.CELL_CODE.Contains("-") ? SystemCode.MANAGE_TYPE.InPing : SystemCode.MANAGE_TYPE.InStation, sm, lStorageList, sOperator); S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = ex.Message; return false; } return true; } // 入库 更新库存 public bool ManageInUpdateStorage(STORAGE_MAIN sm, IList lStorageList, out string sResult) { sResult = string.Empty; // 校验任务 if (S_BaseService._P_MANAGE_MAIN.GetModelByStockBarcode(sm.STOCK_BARCODE) != null) { sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在任务"; return false; } List lBoxBarcode = new List(); List lGoodsBarcode = new List(); foreach (STORAGE_LIST sl in lStorageList) { if (string.IsNullOrWhiteSpace(sl.BOX_BARCODE)) { //if (sl.GOODS_ID > SystemCode.GOODS_ID.MaxStock) //{ // sResult = $"请输入箱条码"; // return false; //} } else if (lBoxBarcode.Contains(sl.BOX_BARCODE)) { //sResult = $"箱条码 {vsl.BOX_BARCODE} 重复"; //return false; } else { lBoxBarcode.Add(sl.BOX_BARCODE); if (S_BaseService._P_MANAGE_LIST.GetListByBoxBarcode(sl.BOX_BARCODE).Count > 0) { sResult = $"箱条码 {sl.BOX_BARCODE} 存在任务"; return false; } } if (string.IsNullOrWhiteSpace(sl.GOODS_BARCODE)) { //if (sl.GOODS_ID > SystemCode.GOODS_ID.MaxStock) //{ // sResult = $"请输入物料条码"; // return false; //} } else if (lGoodsBarcode.Contains(sl.GOODS_BARCODE)) { sResult = $"物料条码 {sl.GOODS_BARCODE} 重复"; return false; } else { lGoodsBarcode.Add(sl.GOODS_BARCODE); if (S_BaseService._P_MANAGE_LIST.GetModelByGoodsBarcode(sl.GOODS_BARCODE) != null) { sResult = $"物料条码 {sl.GOODS_BARCODE} 存在任务"; return false; } } } // 更新库存 STORAGE_MAIN smBase = S_BaseService._P_STORAGE_MAIN.GetModelByStockBarcode(sm.STOCK_BARCODE); if (smBase != null) { //IList lStorageListBase = S_BaseService._P_STORAGE_LIST.GetListByStorageID(smBase.STORAGE_ID); //foreach (STORAGE_LIST slBase in lStorageListBase) //{ // if (slBase.GOODS_ID > SystemCode.GOODS_ID.MaxStock) // { // sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在库存"; // return false; // } //} //if (!smBase.CELL_CODE.Contains("-")) //{ // S_BaseService._P_STORAGE_LIST.DeleteByStorageID(smBase.STORAGE_ID); // S_BaseService._P_STORAGE_MAIN.Delete(smBase.STORAGE_ID); // smBase = null; //} sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在库存"; return false; //WH_CELL wcBase = S_BaseService._P_WH_CELL.GetModelByCellCode(smBase.CELL_CODE); //if (wcEndDevice.CELL_TYPE != SystemCode.CELL_TYPE.Station) //{ // if (wcBase.CELL_TYPE != SystemCode.CELL_TYPE.Station) // { // sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在库存"; // return false; // } // S_BaseService._P_STORAGE_MAIN.Delete(smBase.STORAGE_ID); // S_BaseService._P_STORAGE_LIST.DeleteByStorageID(smBase.STORAGE_ID); //} //else if (smBase.GOODS_ID > 0 && smBase.GOODS_ID < SystemCode.GOODS_ID.MaxStock && // (wcBase.CELL_CODE == wcEndDevice.CELL_CODE || wcBase.CELL_TYPE == SystemCode.CELL_TYPE.Station)) //{ // S_BaseService._P_STORAGE_MAIN.Delete(smBase.STORAGE_ID); // S_BaseService._P_STORAGE_LIST.DeleteByStorageID(smBase.STORAGE_ID); //} //else if (wcBase.CELL_CODE == wcEndDevice.CELL_CODE || // (wcBase.CELL_TYPE == SystemCode.CELL_TYPE.Station && wcEndDevice.CELL_TYPE == SystemCode.CELL_TYPE.Station)) //{ // IList lStorageListBase = S_BaseService._P_STORAGE_LIST.GetListByStorageID(smBase.STORAGE_ID); // foreach (STORAGE_LIST slBase in lStorageListBase) // { // if (slBase.GOODS_ID < SystemCode.GOODS_ID.MaxStock) // { // sResult = $"托盘条码 {sm.STOCK_BARCODE} 库存异常"; // return false; // } // } // smBase.UPDATE_TIME = StringUtils.GetCurrentTime(); // smBase.CELL_CODE = wcEndDevice.CELL_CODE; // if (smBase.GOODS_ID > 0 && smBase.GOODS_ID < SystemCode.GOODS_ID.MaxStock) // { // smBase.GOODS_ID = lStorageList[0].GOODS_ID; // } // foreach (STORAGE_LIST sl in lStorageList) // { // if (sl.GOODS_ID < SystemCode.GOODS_ID.MaxStock) // { // sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在库存"; // return false; // } // if (smBase.GOODS_ID != sl.GOODS_ID) // { // smBase.GOODS_ID = 0; // break; // } // } // S_BaseService._P_STORAGE_MAIN.Update(smBase); // foreach (STORAGE_LIST sl in lStorageList) // { // bool bAdd = true; // bool bAddBox = true; // foreach (STORAGE_LIST slBase in lStorageListBase) // { // if (slBase.BOX_BARCODE == sl.BOX_BARCODE) // { // bAddBox = false; // } // if (slBase.GOODS_ID > SystemCode.GOODS_ID.MaxStock && // slBase.BOX_BARCODE == sl.BOX_BARCODE && // slBase.GOODS_BARCODE == sl.GOODS_BARCODE && // slBase.GOODS_ID == sl.GOODS_ID) // { // slBase.STORAGE_LIST_QUANTITY += sl.STORAGE_LIST_QUANTITY; // S_BaseService._P_STORAGE_LIST.Update(slBase); // bAdd = false; // break; // } // } // if (bAdd) // { // if (!string.IsNullOrWhiteSpace(sl.BOX_BARCODE) && bAddBox) // { // if (S_BaseService._P_STORAGE_LIST.GetListByBoxBarcode(sl.BOX_BARCODE).Count > 0) // { // sResult = $"箱条码 {sl.BOX_BARCODE} 存在库存"; // return false; // } // } // if (!string.IsNullOrWhiteSpace(sl.GOODS_BARCODE)) // { // if (S_BaseService._P_STORAGE_LIST.GetModelByGoodsBarcode(sl.GOODS_BARCODE) != null) // { // sResult = $"物料条码 {sl.GOODS_BARCODE} 存在库存"; // return false; // } // } // S_BaseService._P_STORAGE_LIST.Add(new STORAGE_LIST() // { // STORAGE_ID = smBase.STORAGE_ID, // GOODS_ID = sl.GOODS_ID, // BOX_BARCODE = sl.BOX_BARCODE, // GOODS_BARCODE = sl.GOODS_BARCODE, // STORAGE_LIST_QUANTITY = sl.STORAGE_LIST_QUANTITY // }); // } // } // return true; //} //else //{ // sResult = $"托盘条码 {sm.STOCK_BARCODE} 存在库存"; // return false; //} } // 新增库存 if (sm.CELL_CODE.Contains("-")) { sResult = $"货位编码 {sm.CELL_CODE} 不能入库"; return false; //if (S_BaseService._P_STORAGE_MAIN.GetModelByCellCode(sEndCellCode) != null) //{ // sResult = $"目标位置 {sEndCellCode} 存在库存"; // return false; //} } foreach (string sBoxBarcode in lBoxBarcode) { if (S_BaseService._P_STORAGE_LIST.GetListByBoxBarcode(sBoxBarcode).Count > 0) { sResult = $"箱条码 {sBoxBarcode} 存在库存"; return false; } } foreach (string sGoodsBarcode in lGoodsBarcode) { if (S_BaseService._P_STORAGE_LIST.GetModelByGoodsBarcode(sGoodsBarcode) != null) { sResult = $"物料条码 {sGoodsBarcode} 存在库存"; return false; } } sm.ENTRY_TIME = StringUtils.GetCurrentTime(); sm.UPDATE_TIME = sm.ENTRY_TIME; S_BaseService._S_StorageService.UpdateStorageProperty(sm, lStorageList); S_BaseService._P_STORAGE_MAIN.Add(sm); foreach (STORAGE_LIST sl in lStorageList) { sl.STORAGE_ID = sm.STORAGE_ID; S_BaseService._P_STORAGE_LIST.Add(sl); } return true; } // 多选立库出库 public bool ManageOutCellMulti(List lStockBarcode, string sEndDeviceCode, int iPlanID, string sManageType, string sOperator, out string sResult) { bool bResult = true; sResult = string.Empty; try { string sSingleResult = string.Empty; foreach (string sStockBarcode in lStockBarcode) { if (this.ManageOutCell(sStockBarcode, sEndDeviceCode, 0, iPlanID, 0, sManageType, sOperator, out sSingleResult)) { sResult += $"托盘条码 {sStockBarcode} 出库成功\n"; } else { bResult = false; sResult += $"托盘条码 {sStockBarcode} 出库失败 {sSingleResult}\n"; } } } catch (Exception ex) { sResult += ex.Message; return false; } sResult.TrimEnd('\n'); return bResult; } // 立库出库 public bool ManageOutCell(string sStockBarcode, string sEndDeviceCode, int iGoodsID, int iPlanID, int iPlanListID, string sManageType, string sOperator, out string sResult) { sResult = string.Empty; try { S_BaseService._P_Base_House.BeginTransaction(); // 起始位置 库存 WH_CELL wcStartDevice = null; STORAGE_MAIN sm = null; if (!string.IsNullOrWhiteSpace(sStockBarcode)) { sm = S_BaseService._P_STORAGE_MAIN.GetModelByStockBarcode(sStockBarcode); if (sm == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sStockBarcode} 未找到库存"; return false; } wcStartDevice = S_BaseService._P_WH_CELL.GetModelByCellCode(sm.CELL_CODE); if (wcStartDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"未找到起始位置 {sm.CELL_CODE}"; return false; } if (wcStartDevice.CELL_TYPE != SystemCode.CELL_TYPE.Cell) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {wcStartDevice.CELL_CODE} 不能立库出库"; return false; } } else if (iGoodsID > 0) { wcStartDevice = S_BaseService._S_CellService.GetStartCell(sEndDeviceCode, new PLAN_LIST() { GOODS_ID = iGoodsID }, 0, 0, out sResult); if (wcStartDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } sm = S_BaseService._P_STORAGE_MAIN.GetModelByCellCode(wcStartDevice.CELL_CODE); if (sm == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"货位编码 {wcStartDevice.CELL_CODE} 未找到库存"; return false; } sStockBarcode = sm.STOCK_BARCODE; } else if (iPlanListID > 0) { wcStartDevice = S_BaseService._S_CellService.GetStartCell(sEndDeviceCode, S_BaseService._P_PLAN_LIST.GetModel(iPlanListID), 0, 0, out sResult); if (wcStartDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } sm = S_BaseService._P_STORAGE_MAIN.GetModelByCellCode(wcStartDevice.CELL_CODE); if (sm == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"货位编码 {wcStartDevice.CELL_CODE} 未找到库存"; return false; } sStockBarcode = sm.STOCK_BARCODE; } else { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"请设置出库参数"; return false; } IList lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(sm.STORAGE_ID); if (lStorageList == null || lStorageList.Count == 0) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sStockBarcode} 未找到库存"; return false; } string sLockCellCode = wcStartDevice.CELL_CODE; if (wcStartDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar) { sLockCellCode = string.Empty; } // 目标位置 if (lStorageList[0].STORAGE_PROPERTY_10 == SystemCode.STOCK_SIZE.Square) { if (S_BaseService._P_IO_CONTROL_ROUTE.GetModelByDeviceCode(wcStartDevice.DEVICE_CODE, sEndDeviceCode) == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"{wcStartDevice.DEVICE_CODE}-{sEndDeviceCode} 路径不可用"; return false; } } else { if (S_BaseService._P_IO_CONTROL_ROUTE.GetModelByDeviceCode_L(wcStartDevice.DEVICE_CODE, sEndDeviceCode) == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"{wcStartDevice.DEVICE_CODE}-{sEndDeviceCode} 长托路径不可用"; return false; } } // 校验任务 MANAGE_MAIN mm = S_BaseService._P_MANAGE_MAIN.GetModelByStockBarcode(sStockBarcode); if (mm == null) { if (!S_BaseService._S_CellService.CheckStartCell(wcStartDevice)) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {wcStartDevice.CELL_CODE} 状态不可用"; return false; } } else { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {sStockBarcode} 存在任务"; return false; } // 更新计划 if (iPlanID > 0 && !this.ManageUpdatePlan(iPlanID, false, true, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } if (mm == null) { // 新增任务 立库出库 this.ManageCreate(wcStartDevice.CELL_CODE, sEndDeviceCode, sLockCellCode, sManageType, wcStartDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar ? SystemCode.MANAGE_STATUS.Send : SystemCode.MANAGE_STATUS.Waiting, sm, lStorageList, iPlanID, 0, sOperator); } S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = ex.Message; return false; } return true; } // 多选暂存出库 public bool ManageOutStationMulti(Dictionary dStorageStockBarcode, IList lStorageList, int iPlanID, string sOperator, out string sResult) { bool bResult = true; sResult = string.Empty; try { string sSingleResult = string.Empty; int iStorageID = 0; List lStorageListSingle = null; foreach (STORAGE_LIST sl in lStorageList.OrderBy(sl => sl.STORAGE_ID).ThenBy(sl => sl.STORAGE_LIST_ID)) { if (sl.STORAGE_ID == iStorageID) { lStorageListSingle.Add(new STORAGE_LIST() { STORAGE_ID = sl.STORAGE_ID, STORAGE_LIST_ID = sl.STORAGE_LIST_ID, STORAGE_LIST_QUANTITY = sl.STORAGE_LIST_QUANTITY }); } else { if (lStorageListSingle != null && lStorageListSingle.Count > 0) { string sStockBarcode = string.Empty; if (dStorageStockBarcode != null && dStorageStockBarcode.ContainsKey(lStorageListSingle[0].STORAGE_ID)) { sStockBarcode = $"托盘条码 {dStorageStockBarcode[lStorageListSingle[0].STORAGE_ID]} "; } if (this.ManageOutStation(lStorageListSingle, iPlanID, sOperator, out sSingleResult)) { sResult += $"{sStockBarcode}出库成功\n"; } else { bResult = false; sResult += $"{sStockBarcode}出库失败 {sSingleResult}\n"; } } iStorageID = sl.STORAGE_ID; lStorageListSingle = new List() { new STORAGE_LIST() { STORAGE_ID = sl.STORAGE_ID, STORAGE_LIST_ID = sl.STORAGE_LIST_ID, STORAGE_LIST_QUANTITY = sl.STORAGE_LIST_QUANTITY } }; } } if (lStorageListSingle != null && lStorageListSingle.Count > 0) { string sStockBarcode = string.Empty; if (dStorageStockBarcode != null && dStorageStockBarcode.ContainsKey(lStorageListSingle[0].STORAGE_ID)) { sStockBarcode = $"托盘条码 {dStorageStockBarcode[lStorageListSingle[0].STORAGE_ID]} "; } if (this.ManageOutStation(lStorageListSingle, iPlanID, sOperator, out sSingleResult)) { sResult += $"{sStockBarcode}出库成功\n"; } else { bResult = false; sResult += $"{sStockBarcode}出库失败 {sSingleResult}\n"; } } } catch (Exception ex) { sResult += ex.Message; return false; } sResult.TrimEnd('\n'); return bResult; } // 暂存出库 private bool ManageOutStation(List lStorageList, int iPlanID, string sOperator, out string sResult) { sResult = string.Empty; try { S_BaseService._P_Base_House.BeginTransaction(); // 库存 int iStorageID = lStorageList[0].STORAGE_ID; STORAGE_MAIN smBase = S_BaseService._P_STORAGE_MAIN.GetModel(iStorageID); IList lStorageListBase = S_BaseService._P_STORAGE_LIST.GetListByStorageID(iStorageID); if (smBase == null || lStorageListBase == null || lStorageListBase.Count == 0) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"未找到库存ID {iStorageID}"; return false; } if (S_BaseService._P_MANAGE_MAIN.GetModelByStorageID(smBase.STORAGE_ID) != null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"托盘条码 {smBase.STOCK_BARCODE} 存在任务"; return false; } if (smBase.CELL_CODE.Contains("-")) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"立库货位编码 {smBase.CELL_CODE} 不能暂存出库"; return false; } // 更新库存 更新货位状态 if (!ManageOutStationUpdateStorage(smBase, lStorageListBase, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } // 更新计划 smBase.PLAN_ID = iPlanID; if (iPlanID > 0 && !ManageUpdatePlan(iPlanID, false, false, lStorageList, out sResult)) { S_BaseService._P_Base_House.RollBackTransaction(); return false; } // 新增入出库记录 暂存出库 S_BaseService._S_ControlService.CreateRecord(smBase.CELL_CODE.Contains("-") ? SystemCode.MANAGE_TYPE.OutPing : SystemCode.MANAGE_TYPE.OutStation, smBase, lStorageList, sOperator); S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = ex.Message; return false; } return true; } // 暂存出库 更新库存 更新货位状态 private bool ManageOutStationUpdateStorage(STORAGE_MAIN smBase, IList lStorageListBase, IList lStorageList, out string sResult) { sResult = string.Empty; if (S_BaseService._P_MANAGE_MAIN.GetModelByStockBarcode(smBase.STOCK_BARCODE) != null) //if (S_BaseService._P_MANAGE_MAIN.GetModelByStorageID(smBase.STORAGE_ID) != null) { sResult = $"托盘条码 {smBase.STOCK_BARCODE} 存在任务"; return false; } foreach (STORAGE_LIST sl in lStorageList) { bool bNotExists = true; foreach (STORAGE_LIST slBase in lStorageListBase) { if (slBase.STORAGE_LIST_ID == sl.STORAGE_LIST_ID) { bNotExists = false; sl.STORAGE_PROPERTY_01 = slBase.STORAGE_PROPERTY_01; sl.STORAGE_PROPERTY_02 = slBase.STORAGE_PROPERTY_02; sl.STORAGE_PROPERTY_03 = slBase.STORAGE_PROPERTY_03; sl.STORAGE_PROPERTY_04 = slBase.STORAGE_PROPERTY_04; sl.STORAGE_PROPERTY_05 = slBase.STORAGE_PROPERTY_05; sl.STORAGE_PROPERTY_06 = slBase.STORAGE_PROPERTY_06; sl.STORAGE_PROPERTY_07 = slBase.STORAGE_PROPERTY_07; sl.STORAGE_PROPERTY_08 = slBase.STORAGE_PROPERTY_08; sl.STORAGE_PROPERTY_09 = slBase.STORAGE_PROPERTY_09; sl.STORAGE_PROPERTY_10 = slBase.STORAGE_PROPERTY_10; sl.STORAGE_PROPERTY_11 = slBase.STORAGE_PROPERTY_11; sl.STORAGE_PROPERTY_12 = slBase.STORAGE_PROPERTY_12; sl.BOX_BARCODE = slBase.BOX_BARCODE; sl.GOODS_BARCODE = slBase.GOODS_BARCODE; sl.GOODS_ID = slBase.GOODS_ID; if (slBase.STORAGE_LIST_QUANTITY < sl.STORAGE_LIST_QUANTITY) { GOODS_MAIN gm = S_BaseService._P_GOODS_MAIN.GetModel(sl.GOODS_ID); sResult = gm == null ? $"未找到物料ID {sl.GOODS_ID}" : $"物料编码 {gm.GOODS_CODE} 出库数量 {sl.STORAGE_LIST_QUANTITY} 多于库存数量 {slBase.STORAGE_LIST_QUANTITY}"; return false; } else if (slBase.STORAGE_LIST_QUANTITY == sl.STORAGE_LIST_QUANTITY) { //slBase.STORAGE_LIST_QUANTITY -= sl.STORAGE_LIST_QUANTITY; S_BaseService._P_STORAGE_LIST.Delete(slBase.STORAGE_LIST_ID); } else { slBase.STORAGE_LIST_QUANTITY -= sl.STORAGE_LIST_QUANTITY; S_BaseService._P_STORAGE_LIST.Update(slBase); } break; } } if (bNotExists) { sResult = $"未找到库存列表ID {sl.STORAGE_LIST_ID}"; return false; } } lStorageListBase = S_BaseService._P_STORAGE_LIST.GetListByStorageID(smBase.STORAGE_ID); S_BaseService._S_StorageService.UpdateStorageProperty(smBase, lStorageListBase); if (lStorageListBase == null || lStorageListBase.Count == 0) { S_BaseService._P_STORAGE_MAIN.Delete(smBase.STORAGE_ID); } else { smBase.UPDATE_TIME = StringUtils.GetCurrentTime(); S_BaseService._P_STORAGE_MAIN.Update(smBase); } return true; } // 立库移库 public bool ManageMoveCell(string sStartCellCode, string sEndCellCode, string sOperator, out string sResult) { bool bResult = true; sResult = string.Empty; try { S_BaseService._P_Base_House.BeginTransaction(); // 起始位置 目标位置 WH_CELL wcStartDevice = S_BaseService._P_WH_CELL.GetModelByCellCode(sStartCellCode); if (wcStartDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"未找到起始位置 {sStartCellCode}"; return false; } WH_CELL wcEndDevice = S_BaseService._P_WH_CELL.GetModelByCellCode(sEndCellCode); if (wcEndDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"未找到目标位置 {sEndCellCode}"; return false; } if (S_BaseService._P_IO_CONTROL_ROUTE.GetModelByDeviceCode(wcStartDevice.DEVICE_CODE, wcEndDevice.DEVICE_CODE) == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"{wcStartDevice.DEVICE_CODE}-{wcEndDevice.DEVICE_CODE} 路径不可用"; return false; } if (!S_BaseService._S_CellService.CheckMoveCell(wcStartDevice, wcEndDevice)) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {wcStartDevice.CELL_CODE} 目标位置 {wcEndDevice.CELL_CODE} 状态不可用"; return false; } //if (wcStartDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar && // wcStartDevice.CELL_CODE_P == wcEndDevice.CELL_CODE) //{ // S_BaseService._P_Base_House.RollBackTransaction(); // sResult = "远货位不能移库到近货位"; // return false; //} if (Convert.ToInt32(wcStartDevice.CELL_MODEL) > Convert.ToInt32(wcEndDevice.CELL_MODEL)) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = "高物料不能入库低货位"; return false; } string sLockCellCode = wcEndDevice.CELL_CODE; if (wcEndDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar) { sLockCellCode = wcEndDevice.CELL_CODE_P; } // 库存 STORAGE_MAIN sm = S_BaseService._P_STORAGE_MAIN.GetModelByCellCode(wcStartDevice.CELL_CODE); if (sm == null) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {wcStartDevice.CELL_CODE} 未找到库存"; return false; } IList lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(sm.STORAGE_ID); if (lStorageList == null || lStorageList.Count == 0) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"起始位置 {wcStartDevice.CELL_CODE} 未找到库存"; return false; } // 新增任务 立库移库 this.ManageCreate(wcStartDevice.CELL_CODE, wcEndDevice.CELL_CODE, sLockCellCode, SystemCode.MANAGE_TYPE.MoveCell, wcStartDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar ? SystemCode.MANAGE_STATUS.Send : SystemCode.MANAGE_STATUS.Waiting, sm, lStorageList, 0, 0, sOperator); S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = ex.Message; bResult = false; } return bResult; } // 更新计划 private bool ManageUpdatePlan(int iPlanID, bool isPlanIn, bool isCell, IList lStorageList, out string sResult) { PLAN_MAIN pm = S_BaseService._P_PLAN_MAIN.GetModel(iPlanID); IList lPlanList = S_BaseService._P_PLAN_LIST.GetListByPlanID(iPlanID); if (pm == null || lPlanList == null || lPlanList.Count == 0) { sResult = $"未找到计划ID {iPlanID}"; return false; } if (pm.PLAN_STATUS != SystemCode.PLAN_STATUS.Executing && pm.PLAN_STATUS != SystemCode.PLAN_STATUS.Auto) { sResult = $"请确认拣货单号 {pm.PLAN_CODE} 正在执行"; return false; } if (isPlanIn && pm.PLAN_TYPE != SystemCode.PLAN_TYPE.PlanIn || !isPlanIn && pm.PLAN_TYPE != SystemCode.PLAN_TYPE.PlanOut) { sResult = $"拣货单号 {pm.PLAN_CODE} 计划类型错误"; return false; } sResult = string.Empty; foreach (STORAGE_LIST sl in lStorageList) { bool bNotExists = true; foreach (PLAN_LIST pl in lPlanList) { if (!string.IsNullOrWhiteSpace(pl.GOODS_BARCODE) && sl.GOODS_BARCODE != pl.GOODS_BARCODE) { continue; } if (pl.PLAN_LIST_FINISHED_QUANTITY + sl.STORAGE_LIST_QUANTITY > pl.PLAN_LIST_QUANTITY) { string sPlanType = isPlanIn ? "入库" : "出库"; sResult = $"物料条码 {sl.GOODS_BARCODE} 已{sPlanType}"; return false; } pl.PLAN_LIST_FINISHED_QUANTITY += sl.STORAGE_LIST_QUANTITY; S_BaseService._P_PLAN_LIST.Update(pl); bNotExists = false; break; } if (bNotExists) { sResult = $"物料条码 {sl.GOODS_BARCODE} 不是计划物料"; return false; } } bool bComplete = true; foreach (PLAN_LIST pl in lPlanList) { if (pl.PLAN_LIST_FINISHED_QUANTITY < pl.PLAN_LIST_QUANTITY) { bComplete = false; break; } } if (bComplete && !isCell && S_BaseService._P_MANAGE_MAIN.GetListByPlanID(iPlanID).Count == 0) { pm.PLAN_END_TIME = StringUtils.GetCurrentTime(); pm.PLAN_STATUS = SystemCode.PLAN_STATUS.Complete; S_BaseService._P_PLAN_MAIN.Update(pm); } return true; } // 新增任务 public void ManageCreate(string sStartCellCode, string sEndCellCode, string sLockCellCode, string sManageType, string sManageStatus, STORAGE_MAIN sm, IList lStorageList, int iPlanID, int iApplyID, string sOperator) { string sCurrentTime = StringUtils.GetCurrentTime(); MANAGE_MAIN mm = new MANAGE_MAIN { MANAGE_TYPE = sManageType, MANAGE_STATUS = sManageStatus, STORAGE_ID = sm.STORAGE_ID, STOCK_BARCODE = sm.STOCK_BARCODE, MANAGE_CREATE_TIME = sCurrentTime, MANAGE_OPERATOR = sOperator, START_CELL_CODE = sStartCellCode, END_CELL_CODE = sEndCellCode, LOCK_CELL_CODE = sLockCellCode, PLAN_ID = iPlanID, APPLY_ID = iApplyID, MANAGE_REMARK = string.Empty }; S_BaseService._P_MANAGE_MAIN.Add(mm); foreach (STORAGE_LIST sl in lStorageList) { S_BaseService._P_MANAGE_LIST.Add(new MANAGE_LIST { MANAGE_ID = mm.MANAGE_ID, STORAGE_LIST_ID = sl.STORAGE_LIST_ID, MANAGE_LIST_QUANTITY = sl.STORAGE_LIST_QUANTITY }); } if (sManageStatus == SystemCode.MANAGE_STATUS.Waiting) { S_BaseService._S_ControlService.CreateIOControl(mm, sm, lStorageList, sCurrentTime); } } private void ManageUpdateErrorText(MANAGE_MAIN mm, string sErrorText) { if (mm.ERROR_TEXT != sErrorText) { mm.ERROR_TEXT = sErrorText; S_BaseService._P_MANAGE_MAIN.Update(mm); } } // 任务线程 等待下达 public bool ManageTask(out string sResult) { bool bResult = true; sResult = string.Empty; foreach (MANAGE_MAIN mm in S_BaseService._P_MANAGE_MAIN.GetListByStatus(SystemCode.MANAGE_STATUS.Send)) { // 出库 移库 if (mm.START_CELL_CODE.Contains("-")) { try { S_BaseService._P_Base_House.BeginTransaction(); WH_CELL wcStartDevice = S_BaseService._P_WH_CELL.GetModelByCellCode(mm.START_CELL_CODE); if (wcStartDevice == null || wcStartDevice.FORK_TYPE != SystemCode.FORK_TYPE.CellFar) { S_BaseService._P_Base_House.RollBackTransaction(); continue; } WH_CELL wcPairDevice = S_BaseService._P_WH_CELL.GetModelByCellCode(wcStartDevice.CELL_CODE_P); if (wcPairDevice == null) { S_BaseService._P_Base_House.RollBackTransaction(); continue; } if (mm.END_CELL_CODE == wcStartDevice.CELL_CODE_P || (wcPairDevice.STORAGE_ID == 0 && wcPairDevice.MANAGE_ID == 0) || (wcPairDevice.STORAGE_ID > 0 && wcPairDevice.MANAGE_ID > 0)) { mm.ERROR_TEXT = string.Empty; mm.MANAGE_STATUS = SystemCode.MANAGE_STATUS.Waiting; if (mm.MANAGE_TYPE == SystemCode.MANAGE_TYPE.OutCell || mm.MANAGE_TYPE == SystemCode.MANAGE_TYPE.OutPick) { string sLockCellCode = wcStartDevice.CELL_CODE; if (wcStartDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar) { sLockCellCode = wcStartDevice.CELL_CODE_P; } mm.LOCK_CELL_CODE = sLockCellCode; } S_BaseService._P_MANAGE_MAIN.Update(mm); STORAGE_MAIN sm = S_BaseService._P_STORAGE_MAIN.GetModel(mm.STORAGE_ID); IList lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(mm.STORAGE_ID); if (sm == null || lStorageList == null || lStorageList.Count == 0) { ManageUpdateErrorText(mm, $"货位编码 {mm.START_CELL_CODE} 未找到库存"); S_BaseService._P_Base_House.CommitTransaction(); continue; } S_BaseService._S_ControlService.CreateIOControl(mm, sm, lStorageList, StringUtils.GetCurrentTime()); } else if (wcPairDevice.STORAGE_ID > 0 && wcPairDevice.MANAGE_ID == 0) { // 库存 STORAGE_MAIN sm = S_BaseService._P_STORAGE_MAIN.GetModelByCellCode(wcPairDevice.CELL_CODE); if (sm == null) { ManageUpdateErrorText(mm, $"货位编码 {wcPairDevice.CELL_CODE} 未找到库存"); S_BaseService._P_Base_House.CommitTransaction(); continue; } IList lStorageList = S_BaseService._P_STORAGE_LIST.GetListByStorageID(sm.STORAGE_ID); if (lStorageList == null || lStorageList.Count == 0) { ManageUpdateErrorText(mm, $"货位编码 {wcPairDevice.CELL_CODE} 未找到库存"); S_BaseService._P_Base_House.CommitTransaction(); continue; } // 目标位置 sm.CELL_MODEL = wcPairDevice.CELL_MODEL; string sSingleResult = string.Empty; WH_CELL wcEndDevice = S_BaseService._S_CellService.GetEndCell(sm, wcPairDevice, wcPairDevice.CELL_X, wcPairDevice.CELL_Y, out sSingleResult); if (wcEndDevice == null) { ManageUpdateErrorText(mm, "未找到可用移库货位"); S_BaseService._P_Base_House.CommitTransaction(); continue; } string sLockCellCode = wcEndDevice.CELL_CODE; if (wcEndDevice.FORK_TYPE == SystemCode.FORK_TYPE.CellFar) { sLockCellCode = wcEndDevice.CELL_CODE_P; } // 新增任务 立库移库 this.ManageCreate(wcPairDevice.CELL_CODE, wcEndDevice.CELL_CODE, sLockCellCode, SystemCode.MANAGE_TYPE.MoveCell, SystemCode.MANAGE_STATUS.Waiting, sm, lStorageList, 0, 0, "自动移库"); } else { ManageUpdateErrorText(mm, $"近叉货位 {wcPairDevice.CELL_CODE} 状态不可用"); } S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult += $"{ex.Message}\n"; bResult = false; } } } sResult.Trim('\n'); return bResult; } public bool RecordInterface(List lRecordID, string sOperator, out string sResult) { bool bResult = true; sResult = string.Empty; try { string sSingleResult = string.Empty; lRecordID.Sort(); foreach (int iRecordID in lRecordID) { RECORD_MAIN rm = S_BaseService._P_RECORD_MAIN.GetModel(iRecordID); if (rm == null) { bResult = false; sResult += $"未找到任务历史ID {iRecordID}\n"; } else if (S_BaseService._S_ERPService.ERPInterface(rm, out sSingleResult)) { } else { bResult = false; sResult += $"托盘条码 {rm.STOCK_BARCODE} 调用接口失败 {sSingleResult}\n"; } } } catch (Exception ex) { sResult += $"{ex.Message}\n"; bResult = false; } sResult.Trim('\n'); return bResult; } public bool RecordComplete(List lRecordID, string sOperator, out string sResult) { bool bResult = true; sResult = string.Empty; try { S_BaseService._P_Base_House.BeginTransaction(); foreach (int iRecordID in lRecordID) { RECORD_MAIN rm = S_BaseService._P_RECORD_MAIN.GetModel(iRecordID); if (rm == null) { bResult = false; sResult += $"未找到任务历史ID {iRecordID}\n"; } else { rm.MANAGE_STATUS = SystemCode.MANAGE_STATUS.Complete; rm.ERROR_TEXT = string.Empty; S_BaseService._P_RECORD_MAIN.Update(rm); } } S_BaseService._P_Base_House.CommitTransaction(); } catch (Exception ex) { S_BaseService._P_Base_House.RollBackTransaction(); sResult = $"{ex.Message}\n"; bResult = false; } sResult.Trim('\n'); return bResult; } } }