using Microsoft.Extensions.Logging;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.LocationEnum;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_Common.TaskEnum;
|
using WIDESEA_Core;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_DTO.Basic;
|
using WIDESEA_Model.Models;
|
|
namespace WIDESEA_TaskInfoService
|
{
|
public partial class TaskService
|
{
|
/// <summary>
|
/// ESS扫码请求入库
|
/// </summary>
|
/// <param name="palletCode"></param>
|
/// <param name="stationCode"></param>
|
/// <returns></returns>
|
public async Task<WebResponseContent> RequestInboundTask(string palletCode, string stationCode)
|
{
|
try
|
{
|
Dt_Task dbtask = Repository.Db.Queryable<Dt_Task>().Where(x => x.PalletCode == palletCode).OrderByDescending(x=>x.CreateDate).First();
|
if (dbtask != null)
|
{
|
_logger.LogInformation($"任务类型{dbtask.TaskType.ToString()} ,{dbtask.TaskNum} ");
|
if (dbtask.TaskType == TaskTypeEnum.Outbound.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"出库待分拣任务");
|
}
|
else if (dbtask.TaskType == TaskTypeEnum.OutAllocate.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"出库待分拣任务");
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error($"该托盘已生成任务");
|
}
|
}
|
|
Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First();
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到组盘信息");
|
}
|
|
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
|
}
|
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
|
{
|
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
|
}
|
|
Dt_LocationInfo? locationInfo = _locationInfoService.AssignLocation(stockInfo.LocationType);
|
if (locationInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
|
}
|
|
|
var newTask = new Dt_Task()
|
{
|
CurrentAddress = stationCode,
|
Grade = 0,
|
NextAddress = stations.GetValueOrDefault(stationCode) ?? "",
|
PalletCode = palletCode,
|
Roadway = locationInfo.RoadwayNo,
|
SourceAddress = stationCode,
|
TargetAddress = locationInfo.LocationCode,
|
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = stockInfo.WarehouseId,
|
PalletType = stockInfo.PalletType,
|
OrderNo= stockInfo.Details.FirstOrDefault()?.OrderNo
|
|
};
|
//空箱
|
if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
|
{
|
_unitOfWorkManage.BeginTran();
|
newTask.TaskType = TaskTypeEnum.InEmpty.ObjToInt();
|
int taskId = BaseDal.AddData(newTask);
|
newTask.TaskId = taskId;
|
|
locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
|
_locationInfoService.UpdateData(locationInfo);
|
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
|
_stockRepository.UpdateData(stockInfo);
|
_unitOfWorkManage.CommitTran();
|
}
|
else
|
{
|
//获取是否存在入库单
|
Dt_InboundOrder? inboundOrder = null;
|
if (stockInfo != null && stockInfo.Details.Count > 0)
|
{
|
string? orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? "";
|
inboundOrder = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt());
|
|
}
|
|
|
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
|
LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus;
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
newTask.TaskId = taskId;
|
|
_locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, locationInfo.LocationStatus, StockChangeType.Inbound.ObjToInt(), inboundOrder?.InboundOrderNo, newTask.TaskNum);
|
|
locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
|
_locationInfoService.UpdateData(locationInfo);
|
|
_stockRepository.UpdateData(stockInfo);
|
_unitOfWorkManage.CommitTran();
|
}
|
TaskModel esstask = new TaskModel()
|
{
|
taskType = "putaway",
|
taskGroupCode = "",
|
groupPriority = 0,
|
tasks = new List<TasksType>
|
{
|
new()
|
{
|
taskCode=newTask.TaskNum.ToString(),
|
taskPriority=0,
|
taskDescribe=new TaskDescribeType{
|
containerCode=palletCode,
|
containerType= "CT_KUBOT_STANDARD",
|
fromLocationCode=stations.GetValueOrDefault(stationCode)??"",
|
toStationCode="",
|
toLocationCode=locationInfo.LocationCode,
|
deadline=0,storageTag=""
|
}
|
}
|
}
|
};
|
|
var result = await _eSSApiService.CreateTaskAsync(esstask);
|
|
_logger.LogInformation("创建任务返回: " + result);
|
if (result)
|
{
|
try
|
{
|
await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest
|
{
|
slotCode = stationCode,
|
containerCode = palletCode
|
});
|
}
|
catch (Exception ex) {
|
|
|
}
|
return WebResponseContent.Instance.OK();
|
}
|
else
|
{
|
return WebResponseContent.Instance.Error("下发机器人任务失败!");
|
}
|
}
|
catch (Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
/// <summary>
|
/// 入空箱
|
/// </summary>
|
/// <param name="palletCode"></param>
|
/// <param name="address"></param>
|
/// <param name="WarehouseId"></param>
|
/// <returns></returns>
|
public WebResponseContent InEmpty(string palletCode, string address, int WarehouseId)
|
{
|
try
|
{
|
|
Dt_Task dbtask = Repository.QueryFirst(x => x.PalletCode == palletCode);
|
if (dbtask != null)
|
{
|
return WebResponseContent.Instance.Error($"该托盘已生成任务");
|
}
|
|
Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).First();
|
if (stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"未找到组盘信息");
|
}
|
if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库");
|
}
|
if (!string.IsNullOrEmpty(stockInfo.LocationCode))
|
{
|
return WebResponseContent.Instance.Error($"该托盘已绑定货位");
|
}
|
//stockInfo = new Dt_StockInfo()
|
//{
|
// PalletCode = barcode,
|
// StockStatus = StockStatusEmun.入库确认.ObjToInt(),
|
// WarehouseId = WarehouseId,
|
// PalletType = PalletTypeEnum.Empty.ObjToInt(),
|
// Details = new List<Dt_StockInfoDetail>()
|
//};
|
|
var locationInfo = _locationInfoService.AssignLocation();
|
if (locationInfo == null)
|
{
|
return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位");
|
}
|
|
Dt_Task newTask = new Dt_Task()
|
{
|
CurrentAddress = address,
|
Grade = 0,
|
NextAddress = locationInfo.LocationCode,
|
PalletCode = palletCode,
|
Roadway = locationInfo.RoadwayNo,
|
SourceAddress = address,
|
TargetAddress = locationInfo.LocationCode,
|
TaskType = TaskTypeEnum.InEmpty.ObjToInt(),
|
TaskStatus = TaskStatusEnum.New.ObjToInt(),
|
WarehouseId = stockInfo.WarehouseId,
|
PalletType = stockInfo.PalletType
|
};
|
locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
|
_unitOfWorkManage.BeginTran();
|
int taskId = BaseDal.AddData(newTask);
|
newTask.TaskId = taskId;
|
_locationInfoService.UpdateData(locationInfo);
|
stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
_stockRepository.AddData(stockInfo);
|
_unitOfWorkManage.CommitTran();
|
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
}
|
}
|