基于Blazor开发的BS版WMS
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.
 
 
 
 

420 lines
16 KiB

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;
using System.Threading.Tasks;
using EFCoreDatabase.Data;
using EFCoreDatabase.Entities;
using EFCoreDatabase.Repositories.Interface;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using NewWMSWebAPI.TaskService.Interface;
namespace NewWMSWebAPI.TaskService.Implement
{
public class ManageHelper : IManageHelper
{
private readonly ILogger<ManageHelper> _logger;
private readonly DmDBContext _context;
private readonly IManageRepository _manageRepository;
private readonly IWhCellRepository _whCellRepository;
private readonly IStorageRepository _storageRepository;
private readonly IControlRepository _controlRepository;
public ManageHelper(ILogger<ManageHelper> logger, DmDBContext context, IManageRepository manageRepository, IWhCellRepository WhCellRepository, IStorageRepository storageRepository, IControlRepository controlRepository)
{
_logger = logger;
_context = context;
_manageRepository = manageRepository;
_whCellRepository = WhCellRepository;
_storageRepository = storageRepository;
_controlRepository = controlRepository;
}
/// <summary>
/// 生成入库任务
/// </summary>
/// <param name="mMANAGE_MAIN"></param>
/// <param name="lsMANAGE_LIST"></param>
/// <param name="bTrans"></param>
/// <param name="bComplete"></param>
/// <param name="bAutoSendControl"></param>
/// <param name="sResult"></param>
/// <returns></returns>
public bool ManageInTaskCreate(MANAGE_MAIN mMANAGE_MAIN,
List<MANAGE_LIST> lsMANAGE_LIST,
bool bTrans,
bool bComplete,
bool bAutoSendControl,
out string sResult)
{
bool bResult = true;
sResult = string.Empty;
int MANAGE_ID = 0;
if (_manageRepository.GetManageMain("stockBarcode", mMANAGE_MAIN.STOCK_BARCODE) != null)
{
bResult = false;
sResult = string.Format("托盘条码{0}已经存在任务", mMANAGE_MAIN.STOCK_BARCODE);
return bResult;
}
//判断任务信息是否完整
bResult = _manageRepository.AddManageMain(mMANAGE_MAIN, out MANAGE_ID);
if (bResult)
{
foreach (var mMANAGE_LIST in lsMANAGE_LIST)
{
mMANAGE_LIST.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID;
_manageRepository.AddManageList(mMANAGE_LIST);
}
}
_logger.LogInformation($"生成无计划入库任务:{mMANAGE_MAIN.STOCK_BARCODE}");
return bResult;
}
/// <summary>
/// 创建移库任务
/// </summary>
/// <param name="mMANAGE_MAIN"></param>
/// <param name="lsMANAGE_LIST"></param>
/// <param name="bTrans"></param>
/// <param name="bCheckStorage"></param>
/// <param name="bComplete"></param>
/// <param name="bAutoSendControl"></param>
/// <param name="sResult"></param>
/// <returns></returns>
public bool ManageMoveTaskCreate(MANAGE_MAIN mMANAGE_MAIN,
List<MANAGE_LIST> lsMANAGE_LIST,
bool bTrans,
bool bComplete,
bool bAutoSendControl,
out string sResult)
{
bool bResult = true;
sResult = string.Empty;
int MANAGE_ID = 0;
if (_manageRepository.GetManageMain("stockBarcode", mMANAGE_MAIN.STOCK_BARCODE) != null)
{
bResult = false;
sResult = string.Format("托盘条码{0}已经存在任务", mMANAGE_MAIN.STOCK_BARCODE);
return bResult;
}
WH_CELL mWH_CELL_START = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID);
WH_CELL mWH_CELL_END = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID);
STORAGE_MAIN storageMain = _storageRepository.GetStorageMainByCellId(mMANAGE_MAIN.START_CELL_ID);
if (storageMain != null)
{
var lsStorageList = _storageRepository.GetStorageLists(storageMain.STORAGE_ID);
bResult = _manageRepository.AddManageMain(mMANAGE_MAIN, out MANAGE_ID);
if (bResult)
{
foreach (var mMANAGE_LIST in lsMANAGE_LIST)
{
mMANAGE_LIST.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID;
_manageRepository.AddManageList(mMANAGE_LIST);
}
}
if (mWH_CELL_START != null)
{
mWH_CELL_START.RUN_STATUS = "Selected";
bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_START);
if (!bResult)
{
sResult = $"更新开始货位{mWH_CELL_START.CELL_CODE}状态错误\n{sResult}";
return false;
}
}
if (mWH_CELL_END != null)
{
mWH_CELL_END.RUN_STATUS = "Selected";
bResult = _whCellRepository.UpdateCellStatus(mWH_CELL_END);
if (!bResult)
{
sResult = $"更新结束货位{mWH_CELL_END.CELL_CODE}状态错误\n{sResult}";
return false;
}
}
if (bAutoSendControl)
{
bResult = ManageDownLoad(mMANAGE_MAIN.STOCK_BARCODE, false, out sResult);
if (!bResult)
{
return bResult;
}
}
}
else
{
//库存出现问题
}
return bResult;
}
private static readonly object locker = new object();
/// <summary>
/// 下达控制任务
/// </summary>
/// <param name="stockBarcode">托盘号</param>
/// <param name="bTrans">事务控制</param>
/// <param name="sResult">结果信息</param>
/// <returns></returns>
public bool ManageDownLoad(string stockBarcode, bool bTrans, out string sResult)
{
bool bResult = true;
sResult = string.Empty;
//tlt20231222:新增WebService接口,调用主程序生成控制任务;保证控制任务生成时,每个线程都保持在一个方法中
//MANAGE_MAIN mMANAGE_MAIN1 = _manageRepository.GetManageMain("stockBarcode", stockBarcode);
//WH_CELL mSTART_CELL1 = _whCellRepository.GetCell(mMANAGE_MAIN1.START_CELL_ID);
//Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
//I_ManageServiceClient client = new I_ManageServiceClient();
//ManageDownLoadByInterfaceRequest ControlRequest = new ManageDownLoadByInterfaceRequest();
//ControlRequest.MANAGE_ID = mMANAGE_MAIN1.MANAGE_ID;
//ControlRequest.START_CELL_CODE = mSTART_CELL1.CELL_CODE;
//ControlRequest.bTrans = bTrans;
//var response = client.ManageDownLoadByInterfaceAsync(ControlRequest);
//if (response.Result.ManageDownLoadByInterfaceResult)
//{
// IO_CONTROL mIO_CONTROL = _controlRepository.GetIoControl(mMANAGE_MAIN1.MANAGE_ID);
// _logger.LogInformation(
// $"Create Control task Success! Control_ID {mIO_CONTROL.CONTROL_ID} " +
// $"bucketId:{mIO_CONTROL.STOCK_BARCODE};" +
// $"Start position :{mIO_CONTROL.START_DEVICE_CODE};" +
// $"End position:{mIO_CONTROL.END_DEVICE_CODE};" +
// $"RFID string:{mIO_CONTROL.RF_DATA}\r\n");
// return true;
//}
//else
//{
// //tlt20231222:报错,出现问题
// sResult = response.Result.sResult;
// _logger.LogInformation($"Create Control task Failed! Manage main info {mMANAGE_MAIN1.STOCK_BARCODE};Error message:{sResult}");
// return false;
//}
int END_CELL_ID = 0;
lock(locker)
{
//获取主任务
MANAGE_MAIN mMANAGE_MAIN = _manageRepository.GetManageMain("stockBarcode", stockBarcode);
#region validation
if (null == mMANAGE_MAIN)
{
bResult = false;
sResult = $"Could not find task(bucket number:{stockBarcode})";
return false;
}
if (mMANAGE_MAIN.MANAGE_STATUS == "Error")
{
bResult = false;
sResult = $"Manage task error-{stockBarcode}";
return false;
}
WH_CELL mSTART_CELL = _whCellRepository.GetCell(mMANAGE_MAIN.START_CELL_ID);
if (null == mSTART_CELL)
{
bResult = false;
sResult = "Could not find starting position";
return false;
}
WH_CELL mEND_CELL = _whCellRepository.GetCell(mMANAGE_MAIN.END_CELL_ID);
if (null == mEND_CELL)
{
bResult = false;
sResult = "Could not find ending position";
return bResult;
}
//tlt20230327:所有的管理任务都不考虑路径状态,因为在接口中无法再次重新生成控制任务
if (!mMANAGE_MAIN.MANAGE_TYPE_CODE.Contains("Manage"))//&& mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManagePreIn"&& mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManagePreOut"&& mMANAGE_MAIN.MANAGE_TYPE_CODE!= "ManageException")
{
bResult = _controlRepository.GetControlRoutes(mSTART_CELL.DEVICE_CODE, mEND_CELL.DEVICE_CODE)
.Count > 0;
if (!bResult)
{
sResult =
$"{mSTART_CELL.CELL_CODE}-{mEND_CELL.CELL_CODE} have no path available,Please check the device status in WCS!";
return false;
}
}
#endregion
////路径校验
//if (mMANAGE_MAIN.MANAGE_TYPE_CODE != "ManageMove")
//{
// bResult = _controlRepository.GetControlRoutes(mSTART_CELL.DEVICE_CODE, mEND_CELL.DEVICE_CODE).Count > 0;
// if (!bResult)
// {
// sResult = $"{mSTART_CELL.CELL_CODE}-{mEND_CELL.CELL_CODE}之间无可用路径,请检查设备状态!";
// return bResult;
// }
//}
MANAGE_LIST bucketList = _manageRepository.GetManageList(mMANAGE_MAIN.MANAGE_ID)[0];
IO_CONTROL mIO_CONTROL = _controlRepository.GetIoControl(mMANAGE_MAIN.MANAGE_ID);
bResult = null == mIO_CONTROL;
if (!bResult)
{
sResult = $"{mMANAGE_MAIN.STOCK_BARCODE}'s control task already exists!";
return bResult;
}
int CONTROL_TASK_TYPE = 0;
mIO_CONTROL = new IO_CONTROL();
string IN_OUT_TYPE = $"{mSTART_CELL.CELL_TYPE}-{mEND_CELL.CELL_TYPE}".ToLower();
switch (IN_OUT_TYPE)
{
case "station-cell"://站台-货位-入
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Up.ToString("d"));
break;
case "cell-station"://货位-站台-出
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Down.ToString("d"));
break;
case "cell-cell"://货位-货位-移
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.Move.ToString("d"));
break;
case "station-station"://站台-站台-移
CONTROL_TASK_TYPE = Convert.ToInt32(Helper.CONTROL_TYPE.MoveStation.ToString("d"));
break;
}
mIO_CONTROL.RELATIVE_CONTROL_ID = -1;
mIO_CONTROL.MANAGE_ID = mMANAGE_MAIN.MANAGE_ID;
mIO_CONTROL.STOCK_BARCODE = mMANAGE_MAIN.STOCK_BARCODE;
//mIO_CONTROL.CELL_GROUP = mEND_CELL.CELL_GROUP;
mIO_CONTROL.CONTROL_TASK_LEVEL = string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_LEVEL) ? "0" : mMANAGE_MAIN.MANAGE_LEVEL;
mIO_CONTROL.PRE_CONTROL_STATUS = string.Empty;
mIO_CONTROL.CONTROL_TASK_TYPE = CONTROL_TASK_TYPE;
mIO_CONTROL.START_DEVICE_CODE = mSTART_CELL.CELL_CODE;
mIO_CONTROL.END_DEVICE_CODE = mEND_CELL.CELL_CODE;
mIO_CONTROL.CONTROL_BEGIN_TIME = Helper.StringFormat.GetCurDateTimeString();//当前系统时间
//单叉状态25 双叉状态0 string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_FORK) || !mMANAGE_MAIN.MANAGE_FORK.Equals("1") ? 0 : 25;
if (!string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_LEVEL) && mMANAGE_MAIN.MANAGE_LEVEL.Trim().Equals("fabricate_waiting_for_earlier_request_finishing"))
{
mIO_CONTROL.CONTROL_STATUS = 1024;
}
else
{
mIO_CONTROL.CONTROL_STATUS = mMANAGE_MAIN.MANAGE_REMARK == "Block" ? 233 : 0;
}
mIO_CONTROL.CONTROL_REMARK = mMANAGE_MAIN.MANAGE_REMARK;//出库任务用来传输最终站台
mIO_CONTROL.START_WAREHOUSE_CODE = "1";
mIO_CONTROL.END_WAREHOUSE_CODE = "1";
mIO_CONTROL.CELL_GROUP = "0";
mIO_CONTROL.RF_DATA = "0";
mIO_CONTROL.UNLOADING_TASK_COUNT = Convert.ToInt32(bucketList.GOODS_PROPERTY8);//tlt20230717:设置当前的出库任务数量
//mIO_CONTROL.CONTROL_REMARK = bucketList.BUCKET_TRANSACTION_NUMBER;
//添加控制任务
bResult = _controlRepository.AddIoControl(mIO_CONTROL);
if (bResult)
{
_logger.LogInformation(
$"Create Control task Success! Control_ID {mIO_CONTROL.CONTROL_ID} " +
$"bucketId:{mIO_CONTROL.STOCK_BARCODE};" +
$"Start position :{mIO_CONTROL.START_DEVICE_CODE};" +
$"End position:{mIO_CONTROL.END_DEVICE_CODE};" +
$"RFID string:{mIO_CONTROL.RF_DATA}\r\n");
mMANAGE_MAIN.MANAGE_STATUS = Helper.MANAGE_STATUS.WaitingExecute.ToString();
mMANAGE_MAIN.MANAGE_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
_manageRepository.UpdateManageMain(mMANAGE_MAIN);
}
else
{
_logger.LogInformation(
$"Create Control task Failed! Control_ID {mIO_CONTROL.CONTROL_ID} " +
$"bucketId:{mIO_CONTROL.STOCK_BARCODE};" +
$"Start position :{mIO_CONTROL.START_DEVICE_CODE};" +
$"End position:{mIO_CONTROL.END_DEVICE_CODE};" +
$"RFID string:{mIO_CONTROL.RF_DATA}\r\n");
}
return true;
}
}
}
}