using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Data; namespace SiaSun.LMS.Implement { public class StockOut : ManageBase { /// /// 生成【容器下架】任务 /// /// /// /// /// /// /// //public bool ManageCreate(SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN, // List lsMANAGE_LIST, // bool bTrans, // bool bAutoSendControl, // out string sResult) //{ // bool bResult = true; // sResult = string.Empty; // try // { // #region 校验 // #region 校验容器条码 // if (string.IsNullOrEmpty(mMANAGE_MAIN.STOCK_BARCODE)) // { // bResult = false; // sResult = string.Format("容器条码不能为空"); // return bResult; // } // SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN_OLD = this._P_MANAGE_MAIN.GetModelStockBarcode(mMANAGE_MAIN.STOCK_BARCODE); // if (mMANAGE_MAIN_OLD != null) // { // bResult = false; // sResult = string.Format("容器[{0}]已经存在任务[{1}]", mMANAGE_MAIN_OLD.STOCK_BARCODE, mMANAGE_MAIN_OLD.MANAGE_ID); // return bResult; // } // #endregion // #region 校验库存 // Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelStockBarcode(mMANAGE_MAIN.STOCK_BARCODE); // if (null == mSTORAGE_MAIN) // { // bResult = false; // sResult = string.Format("容器条码[{0}]不存在库存", mMANAGE_MAIN.STOCK_BARCODE); // return bResult; // } // IList lsSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID); // if (lsSTORAGE_LIST.Count == 0) // { // bResult = false; // sResult = string.Format("容器条码[{0}]不存在库存", mMANAGE_MAIN.STOCK_BARCODE); // return bResult; // } // #endregion // #region 起始位置 // Model.WH_CELL mSTART_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.START_CELL_ID); // if (null == mSTART_WH_CELL) // { // bResult = false; // sResult = string.Format("起始位置索引[{0}]不存在", mSTORAGE_MAIN.CELL_ID); // return bResult; // } // if (!mSTART_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Cell.ToString())) // { // bResult = false; // sResult = string.Format("起始位置[{0}]类型不合法", mSTART_WH_CELL.CELL_CODE); // return bResult; // } // SiaSun.LMS.Model.WH_AREA mSTART_WH_AREA = this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID); // if (mSTART_WH_AREA.AREA_TYPE == SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString()) // { // bResult = false; // sResult = string.Format("起始位置[{0}]库区类型[{1}]不合法", mSTART_WH_CELL.CELL_CODE, mSTART_WH_AREA.AREA_TYPE); // return bResult; // } // #endregion // #region 终止位置 // if (mMANAGE_MAIN.END_CELL_ID != 0) // { // #region 校验终止站台 // SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.END_CELL_ID); // if (null == mEND_WH_CELL) // { // bResult = false; // sResult = string.Format(" 终止位置索引[{0}]不存在", mMANAGE_MAIN.END_CELL_ID); // return bResult; // } // if (!mEND_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Station.ToString())) // { // bResult = false; // sResult = string.Format(" 终止位置[{0}]类型不合法", mEND_WH_CELL.CELL_NAME); // return bResult; // } // if (mEND_WH_CELL.CELL_INOUT.ToString().Equals(SiaSun.LMS.Enum.CELL_INOUT.In.ToString())) // { // bResult = false; // sResult = string.Format(" 终止位置[{0}]入出类型[{1}]不合法", mEND_WH_CELL.CELL_NAME, mEND_WH_CELL.CELL_INOUT); // return bResult; // } // #endregion // } // else // { // #region 根据起始位置,获得终止站台 // int END_CELL_ID = 0; // bResult = this._S_CellService.GetOutStation(mMANAGE_MAIN.START_CELL_ID, out END_CELL_ID, out sResult); // if (!bResult) // { // return bResult; // } // mMANAGE_MAIN.END_CELL_ID = END_CELL_ID; // #endregion // } // #endregion // #endregion // #region 下达任务 // bResult = new ManageOut().ManageCreate(mMANAGE_MAIN, lsMANAGE_LIST, bTrans, bAutoSendControl, false, out sResult); // //直接报完成 // if ((!bAutoSendControl) && bResult) // { // bResult = this.ManageComplete(mMANAGE_MAIN.MANAGE_ID, bTrans, out sResult); // } // #endregion // } // catch (Exception ex) // { // bResult = false; // sResult = ex.Message; // this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex); // } // return bResult; //} /// /// 指定下架位置,批量生成【容器下架】任务 /// /// /// /// /// /// /// /// /// /// /// public bool ManageCreate(string Operator, string MANAGE_TYPE_CODE, int GOODS_ID, string GOODS_PROPERTY_CONDITION, decimal MANAGE_LIST_QUANTITY, int END_CELL_ID, bool bTrans, bool bAutoSendControl, out string sResult) { bool bResult = false; sResult = string.Empty; try { #region 校验 if (!bAutoSendControl) { bResult = false; sResult = string.Format("不关联调度的下架任务,必须指定起始位置"); return bResult; } #region 终止位置 if (END_CELL_ID == 0) { bResult = false; sResult = string.Format("请选择下架的终止位置"); return bResult; } SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(END_CELL_ID); if (null == mEND_WH_CELL) { bResult = false; sResult = string.Format(" 终止位置索引[{0}]不存在", END_CELL_ID); return bResult; } if (!mEND_WH_CELL.CELL_TYPE.Equals(SiaSun.LMS.Enum.CELL_TYPE.Station.ToString())) { bResult = false; sResult = string.Format(" 终止位置[{0}]类型不合法", mEND_WH_CELL.CELL_NAME); return bResult; } if (mEND_WH_CELL.CELL_INOUT.ToString().Equals(SiaSun.LMS.Enum.CELL_INOUT.In.ToString())) { bResult = false; sResult = string.Format(" 终止位置[{0}]入出类型[{1}]不合法", mEND_WH_CELL.CELL_NAME, mEND_WH_CELL.CELL_INOUT); return bResult; } #endregion #region 校验物料 Model.GOODS_MAIN mGOODS_MAIN = this._P_GOODS_MAIN.GetModel(GOODS_ID); if (mGOODS_MAIN == null) { bResult = false; sResult = string.Format("请选择自动下架的容器类型"); return bResult; } #endregion #endregion #region 获得出库巷道,并校验库存 DataTable dtLANEWAY = null; bResult = this._S_CellService.LaneWayGetList(END_CELL_ID, GOODS_ID, GOODS_PROPERTY_CONDITION, out dtLANEWAY, out sResult); if (!bResult) { return bResult; } int iSumQuantity = 0; foreach (DataRow drLANEWAY in dtLANEWAY.Rows) { iSumQuantity += Convert.ToInt32(drLANEWAY["STORAGE_BALANCE"]); } bResult = iSumQuantity >= MANAGE_LIST_QUANTITY; if (!bResult) { sResult = string.Format("库存{0}小于需求{1},请重新输入数量!", iSumQuantity, MANAGE_LIST_QUANTITY); return bResult; } #endregion this._P_Base_House.BeginTransaction(bTrans); decimal MANAGE_LIST_QUANTITY_FINISHED = 0; while (MANAGE_LIST_QUANTITY_FINISHED < MANAGE_LIST_QUANTITY) { int START_CELL_ID = 0; string STOCK_BARCODE = string.Empty; decimal MANAGE_ORDERED_QUANTITY = 0; DataView dvLANEWAY = dtLANEWAY.DefaultView; dvLANEWAY.RowFilter = "STORAGE_BALANCE > 0"; dvLANEWAY.Sort = "OUT_TASK_BALANCE asc,STORAGE_BALANCE desc"; bResult = dvLANEWAY.Count > 0; if (!bResult) { sResult = "库存数量不足"; this._P_Base_House.RollBackTransaction(bTrans); return bResult; } #region 获得出库货位 int iLANEWAY = Convert.ToInt32(dvLANEWAY[0]["LANE_WAY"]); bResult = this._S_CellService.CellOutAllocate(iLANEWAY, END_CELL_ID, GOODS_ID, GOODS_PROPERTY_CONDITION, MANAGE_LIST_QUANTITY - MANAGE_LIST_QUANTITY_FINISHED, out START_CELL_ID, out STOCK_BARCODE, out MANAGE_ORDERED_QUANTITY, out sResult); if (!bResult) { this._P_Base_House.RollBackTransaction(bTrans); return bResult; } #endregion #region 校验库存 Model.STORAGE_MAIN mSTORAGE_MAIN = this._P_STORAGE_MAIN.GetModelStockBarcode(STOCK_BARCODE); if (null == mSTORAGE_MAIN) { bResult = false; sResult = string.Format("容器条码[{0}]不存在库存", STOCK_BARCODE); return bResult; } IList lsSTORAGE_LIST = this._P_STORAGE_LIST.GetListStorageID(mSTORAGE_MAIN.STORAGE_ID); if (lsSTORAGE_LIST.Count == 0) { bResult = false; sResult = string.Format("容器条码[{0}]不存在库存", STOCK_BARCODE); return bResult; } #endregion #region 下达任务 #region MANAGE_MAIN Model.MANAGE_MAIN mMANAGE_MAIN = new SiaSun.LMS.Model.MANAGE_MAIN(); mMANAGE_MAIN.MANAGE_TYPE_CODE = MANAGE_TYPE_CODE; mMANAGE_MAIN.PLAN_ID = 0; mMANAGE_MAIN.PLAN_TYPE_CODE = string.Empty; mMANAGE_MAIN.STOCK_BARCODE = STOCK_BARCODE; mMANAGE_MAIN.MANAGE_STATUS = SiaSun.LMS.Enum.MANAGE_STATUS.WaitingExecute.ToString(); mMANAGE_MAIN.MANAGE_BEGIN_TIME = SiaSun.LMS.Common.StringUtil.GetDateTime(); mMANAGE_MAIN.CELL_MODEL = mSTORAGE_MAIN.CELL_MODEL; mMANAGE_MAIN.START_CELL_ID = START_CELL_ID; mMANAGE_MAIN.END_CELL_ID = END_CELL_ID; mMANAGE_MAIN.MANAGE_OPERATOR = Operator; mMANAGE_MAIN.MANAGE_REMARK = mSTORAGE_MAIN.STORAGE_REMARK; #endregion #region MANAGE_LIST List lsMANAGE_LIST = new List(); foreach (SiaSun.LMS.Model.STORAGE_LIST mSTORAGE_LIST in lsSTORAGE_LIST) { SiaSun.LMS.Model.MANAGE_LIST mMANAGE_LIST = new SiaSun.LMS.Model.MANAGE_LIST(); mMANAGE_LIST.GOODS_ID = mSTORAGE_LIST.GOODS_ID; mMANAGE_LIST.MANAGE_LIST_QUANTITY = mSTORAGE_LIST.STORAGE_LIST_QUANTITY; mMANAGE_LIST.STORAGE_LIST_ID = mSTORAGE_LIST.STORAGE_LIST_ID; mMANAGE_LIST.PLAN_LIST_ID = mSTORAGE_LIST.PLAN_LIST_ID; mMANAGE_LIST.MANAGE_LIST_REMARK = mSTORAGE_LIST.STORAGE_LIST_REMARK; bResult = this._S_GoodsService.GoodsPropertySetValue(mSTORAGE_LIST.GOODS_ID, mMANAGE_LIST, mSTORAGE_LIST, out sResult); if (!bResult) { return bResult; } lsMANAGE_LIST.Add(mMANAGE_LIST); } #endregion #endregion bResult = new ManageOut().ManageCreate(mMANAGE_MAIN, lsMANAGE_LIST, false, bAutoSendControl, false, out sResult); if (!bResult) { this._P_Base_House.RollBackTransaction(bTrans); return bResult; } dvLANEWAY[0].Row["STORAGE_BALANCE"] = Convert.ToDecimal(dvLANEWAY[0].Row["STORAGE_BALANCE"]) - MANAGE_ORDERED_QUANTITY; if (dvLANEWAY.Count > 0) dvLANEWAY[0].Row["OUT_TASK_BALANCE"] = Convert.ToDecimal(dvLANEWAY[0].Row["OUT_TASK_BALANCE"]) + 1; MANAGE_LIST_QUANTITY_FINISHED += MANAGE_ORDERED_QUANTITY; } this._P_Base_House.CommitTransaction(bTrans); } catch (Exception ex) { this._P_Base_House.RollBackTransaction(bTrans); bResult = false; sResult = ex.Message; this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex); } return bResult; } /// /// 任务完成 /// /// /// /// /// public new bool ManageComplete(int MANAGE_ID, bool bTrans, out string sResult) { bool bResult = true; sResult = string.Empty; try { this._P_Base_House.BeginTransaction(bTrans); #region 校验 SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN = this._P_MANAGE_MAIN.GetModel(MANAGE_ID); bResult = null != mMANAGE_MAIN; if (!bResult) { sResult = string.Format("管理任务索引[{0}]不存在", MANAGE_ID.ToString()); return bResult; } SiaSun.LMS.Model.IO_CONTROL mIO_CONTROL = this._P_IO_CONTROL.GetModelManageID(MANAGE_ID); if ((null != mIO_CONTROL) && (!mIO_CONTROL.CONTROL_STATUS.Equals(999))) { bResult = false; sResult = string.Format("控制任务索引[{0}]的控制任务未完成", mIO_CONTROL.CONTROL_ID); return bResult; } SiaSun.LMS.Model.WH_CELL mSTART_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.START_CELL_ID); if (null == mSTART_WH_CELL) { bResult = false; sResult = string.Format("起始位置索引[{0}]不存在", mMANAGE_MAIN.START_CELL_ID); return bResult; } SiaSun.LMS.Model.WH_CELL mEND_WH_CELL = this._P_WH_CELL.GetModel(mMANAGE_MAIN.END_CELL_ID); if (null == mEND_WH_CELL) { bResult = false; sResult = string.Format("终止位置索引[{0}]不存在", mMANAGE_MAIN.END_CELL_ID); return bResult; } #endregion #region 更新库存-删除容器库存 bResult = new StorageBase().StorageDelete(MANAGE_ID, out sResult); if (!bResult) { return bResult; } #endregion #region 更新货位状态 if (!this._P_WH_AREA.GetModel(mSTART_WH_CELL.AREA_ID).AREA_TYPE.Equals(SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString())) { bResult = this._S_CellService.CellUpdateStatus(mMANAGE_MAIN.START_CELL_ID, SiaSun.LMS.Enum.CELL_STATUS.Nohave.ToString(), SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString(), out sResult); if (!bResult) { return bResult; } } if (!this._P_WH_AREA.GetModel(mEND_WH_CELL.AREA_ID).AREA_TYPE.Equals(SiaSun.LMS.Enum.AREA_TYPE.XuNiKu.ToString())) { bResult = this._S_CellService.CellUpdateStatus(mMANAGE_MAIN.END_CELL_ID, SiaSun.LMS.Enum.CELL_STATUS.Pallet.ToString(), SiaSun.LMS.Enum.RUN_STATUS.Enable.ToString(), out sResult); if (!bResult) { return bResult; } } #endregion #region 调用基类-更新管理任务;更新计划;生成入出库记录 bResult = new ManageBase().ManageComplete(MANAGE_ID, false, out sResult); if (!bResult) { return bResult; } #endregion #region 删除任务信息 this._P_IO_CONTROL.DeleteManageID(mMANAGE_MAIN.MANAGE_ID); this._P_MANAGE_DETAIL.DeleteManageID(mMANAGE_MAIN.MANAGE_ID); this._P_MANAGE_LIST.DeleteManageID(mMANAGE_MAIN.MANAGE_ID); this._P_MANAGE_MAIN.Delete(mMANAGE_MAIN.MANAGE_ID); #endregion } catch (Exception ex) { bResult = false; sResult = ex.Message; this._log.Fatal(string.Format("调用方法{0}发生异常。", MethodBase.GetCurrentMethod().Name), ex); } finally { if (bResult) { this._P_Base_House.CommitTransaction(bTrans); } else { this._P_Base_House.RollBackTransaction(bTrans); } } return bResult; } } }