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
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;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|