巨石化纤
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.

1223 lines
56 KiB

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<STORAGE_LIST> 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<STORAGE_LIST> 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<STORAGE_LIST> 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<string> lBoxBarcode = new List<string>();
List<string> lGoodsBarcode = new List<string>();
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<STORAGE_LIST> 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<STORAGE_LIST> 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<string> 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<STORAGE_LIST> 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<int, string> dStorageStockBarcode,
IList<STORAGE_LIST> lStorageList, int iPlanID, string sOperator, out string sResult)
{
bool bResult = true;
sResult = string.Empty;
try
{
string sSingleResult = string.Empty;
int iStorageID = 0;
List<STORAGE_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<STORAGE_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<STORAGE_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<STORAGE_LIST> 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<STORAGE_LIST> lStorageListBase,
IList<STORAGE_LIST> 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<STORAGE_LIST> 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<STORAGE_LIST> lStorageList, out string sResult)
{
PLAN_MAIN pm = S_BaseService._P_PLAN_MAIN.GetModel(iPlanID);
IList<PLAN_LIST> 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<STORAGE_LIST> 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<STORAGE_LIST> 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<STORAGE_LIST> 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<int> 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<int> 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;
}
}
}