米其林项目Giraf的新接口,采用WebAPI形式,会应用在上海玉兰,印度米其林及波兰米其林项目中
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.

232 lines
10 KiB

using Microsoft.EntityFrameworkCore;
using Serilog;
using System.Drawing;
using WMS_GIRAF_Interface.Data;
using WMS_GIRAF_Interface.Entities;
using WMS_GIRAF_Interface.Helper;
using WMS_GIRAF_Interface.Models;
using WMS_GIRAF_Interface.Repositories.Implement;
using WMS_GIRAF_Interface.Repositories.Interface;
using static WMS_GIRAF_Interface.Helper.Enum;
using Enum = WMS_GIRAF_Interface.Helper.Enum;
namespace WMS_GIRAF_Interface.TaskServices;
public class ManageTaskService(
MichelinDbContext context,
IManageMainRepository mangeMainRepository,
IIoControlRepository ioControlRepository,
HelperService helperService,
IWhCellRepository whCellRepository)
{
/// <summary>
/// 生成入库到line任务逻辑/一楼手工入库的任务逻辑
/// </summary>
/// <param name="inputRequest">产品信息</param>
/// <param name="startPostNumber">起始post number</param>
/// <param name="supportType">类型信息</param>
/// <param name="isBlocked">block属性</param>
/// <param name="trans">事务属性</param>
/// <param name="IssendControl">是否生成控制任务</param>
/// <param name="sResult">返回信息</param>
public bool CreateInputTaskFromGiraf( InputRequest.Product inputRequest,string startPostNumber,int endLaneWay,string sku,string supportType,string requestNumber,bool isBlocked,bool trans,bool IssendControl ,out string sResult)
{
bool bResult = true;
sResult = string.Empty;
//判断当前胎号是否有任务
var cellInfoStart = context.Wh_Cell.FirstOrDefault(x => x.CELL_CODE == startPostNumber);
//获取起点信息
if (cellInfoStart != null)
{
var manageMain = mangeMainRepository.GetManageMain("barcode", inputRequest.identifier);
if (manageMain != null)
{
//更新当前任务信息
manageMain.END_CELL_ID = endLaneWay;
manageMain.requestNumber = requestNumber;
manageMain.CELL_MODEL = supportType;
manageMain.START_CELL_ID = cellInfoStart.CELL_ID;
manageMain.LOTNUMBER = sku;
manageMain.POPULATIONNUMBER = inputRequest.productClass;
manageMain.keepRequestInMemoryEvenIfLackOfProductIssue = true;
manageMain.keepRequestInMemoryEvenIfMechanicalIssue = true;
bResult = mangeMainRepository.UpdateManageMain(manageMain);
}
else
{
//创建任务
var transaction = context.Database.BeginTransaction();
var newManageMain = new MANAGE_MAIN
{
STOCK_BARCODE = inputRequest.identifier,
requestNumber = requestNumber,
MANAGE_TYPE_CODE = cellInfoStart.CELL_MODEL == "DP" ? "ManageLineMove" : "ManageInlocal",
MANAGE_STATUS = "WaitingSend",
MANAGE_OPERATOR = "AUTO",
MANAGE_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
CELL_MODEL = supportType,
START_CELL_ID = cellInfoStart.CELL_ID,
END_CELL_ID = endLaneWay,
LOTNUMBER = sku,
POPULATIONNUMBER = inputRequest.productClass,
keepRequestInMemoryEvenIfLackOfProductIssue = true,
keepRequestInMemoryEvenIfMechanicalIssue = true,
};
bResult = mangeMainRepository.AddManageMain(newManageMain, out int manageId);
if (bResult)
{
//TODO:添加日志
Log.Information($"Create input task success! Stock barcode :{inputRequest.identifier}");
}
else
{
//TODO:添加错误信息
}
}
}
else
{
//起点信息出问题
}
return bResult;
}
public bool CreateOutputTaskFromGiraf(MANAGE_MAIN manageMain,int startCellId,bool trans,out string sResult)
{
bool bResult = true;
sResult = string.Empty;
//验证当前出库任务信息是否正确
if (manageMain.STOCK_BARCODE != null && mangeMainRepository.GetManageMain("barcode",manageMain.STOCK_BARCODE)!=null)
{
bResult = false;
sResult = "This tire barcode already have task in WMS";
return bResult;
}
if (whCellRepository.GetCell(startCellId)==null)
{
bResult = false;
sResult = "The start position is not exist in WMS database";
return bResult;
}
var startCellInfo = whCellRepository.GetCell(startCellId);
if (whCellRepository.GetCell(manageMain.END_CELL_ID)==null)
{
bResult = false;
sResult = "The end position is not exist in WMS database";
return bResult;
}
var endCellInfo = whCellRepository.GetCell(manageMain.END_CELL_ID);
helperService.BeginTransaction(trans);
try
{
//更新货位状态
if (whCellRepository.UpdateCellStatusAndRunStatus(manageMain.START_CELL_ID, string.Empty, Enum.RunStatus.Selected.ToString(), out sResult)!=true)
{
bResult = false;
sResult= "Update run status failed: "+sResult;
helperService.RollBackTransaction(trans);
return bResult;
}
mangeMainRepository.AddManageMain(manageMain,out int manageId);
if (manageId!=0)
{
Log.Information($"Add unloading task success! tire number :{manageMain.STOCK_BARCODE}");
//生成控制任务
int controlTaskType =
$"{startCellInfo?.CELL_TYPE}-{endCellInfo?.CELL_TYPE}"
.ToLower() switch
{
"station-cell" => //站台-货位-入
Convert.ToInt32(ControlType.Up.ToString("d")),
"cell-station" => //货位-站台-出
Convert.ToInt32(ControlType.Down.ToString("d")),
"cell-cell" => //货位-货位-移
Convert.ToInt32(ControlType.Move.ToString("d")),
"station-station" => //站台-站台-移
Convert.ToInt32(ControlType.MoveStation.ToString("d")),
_ => 0
};
var ioControlTask = new IO_CONTROL()
{
MANAGE_ID = manageMain.MANAGE_ID,
STOCK_BARCODE = manageMain.STOCK_BARCODE,
//mIO_CONTROL.CELL_GROUP = mEND_CELL.CELL_GROUP;
CONTROL_TASK_LEVEL = string.IsNullOrEmpty(manageMain.MANAGE_LEVEL) ? "0" : manageMain.MANAGE_LEVEL,
PRE_CONTROL_STATUS = string.Empty,
CONTROL_TASK_TYPE = controlTaskType,
START_DEVICE_CODE = startCellInfo?.CELL_CODE,
END_DEVICE_CODE = endCellInfo?.CELL_CODE,
CONTROL_BEGIN_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
POPULATION = manageMain.POPULATIONNUMBER,
//单叉状态25 双叉状态0 string.IsNullOrEmpty(mMANAGE_MAIN.MANAGE_FORK) || !mMANAGE_MAIN.MANAGE_FORK.Equals("1") ? 0 : 25;
CONTROL_STATUS = 0,
CONTROL_REMARK = manageMain.MANAGE_REMARK,
START_WAREHOUSE_CODE = "1",
END_WAREHOUSE_CODE = "1",
targetOutputDateInUtc = manageMain.TargetOutputDateInUtc.ToString(),
requestNumber = manageMain.requestNumber,
keepRequestInMemoryEvenIfLackOfProductIssue = manageMain.keepRequestInMemoryEvenIfLackOfProductIssue.ToString(),
keepRequestInMemoryEvenIfMechanicalIssue = manageMain.keepRequestInMemoryEvenIfMechanicalIssue.ToString(),
RELATIVE_CONTROL_ID = startCellInfo?.LOGIC_ID
};
bResult = ioControlRepository.AddIoControlTask(ioControlTask, out int? controlId);
if (bResult)
{
manageMain.MANAGE_STATUS = ManageStatus.WaitingExecute.ToString();
mangeMainRepository.UpdateManageMain(manageMain);
Log.Information($"Create unloading control task OK;update manage task status;tire barcode:{manageMain.STOCK_BARCODE}");
}
else
{
bResult = false;
sResult = $"WMS can not Create control task for tire barcode {manageMain.STOCK_BARCODE}";
return false;
}
}
else
{
bResult = false;
sResult = $"Add unloading task failed!tire barcode is {manageMain.STOCK_BARCODE}";
helperService.RollBackTransaction(trans);
return bResult;
}
}
catch(Exception e)
{
Log.Fatal($"Create unloading task failed!Reason:{e.Message}");
helperService.RollBackTransaction(trans);
}
finally
{
if (bResult)
{
helperService.CommitTransaction(trans);
}
else
{
helperService.RollBackTransaction(trans);
}
}
return bResult;
}
}