宜昌华友成品库管理软件
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

643 lines
21 KiB

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
{
/// <summary>
/// 生成【容器下架】任务
/// </summary>
/// <param name="mMANAGE_MAIN"></param>
/// <param name="lsMANAGE_LIST"></param>
/// <param name="bTrans"></param>
/// <param name="bAutoSendControl"></param>
/// <param name="sResult"></param>
/// <returns></returns>
//public bool ManageCreate(SiaSun.LMS.Model.MANAGE_MAIN mMANAGE_MAIN,
// List<SiaSun.LMS.Model.MANAGE_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<SiaSun.LMS.Model.STORAGE_LIST> 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;
//}
/// <summary>
/// 指定下架位置,批量生成【容器下架】任务
/// </summary>
/// <param name="Operator"></param>
/// <param name="MANAGE_TYPE_CODE"></param>
/// <param name="GOODS_ID"></param>
/// <param name="GOODS_PROPERTY_CONDITION"></param>
/// <param name="MANAGE_LIST_QUANTITY"></param>
/// <param name="END_CELL_ID"></param>
/// <param name="bTrans"></param>
/// <param name="bAutoSendControl"></param>
/// <param name="sResult"></param>
/// <returns></returns>
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<SiaSun.LMS.Model.STORAGE_LIST> 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.Waitting.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<SiaSun.LMS.Model.MANAGE_LIST> lsMANAGE_LIST = new List<SiaSun.LMS.Model.MANAGE_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;
}
/// <summary>
/// 任务完成
/// </summary>
/// <param name="MANAGE_ID"></param>
/// <param name="bTrans"></param>
/// <param name="sResult"></param>
/// <returns></returns>
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;
}
}
}