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
{
///
/// ESS扫码请求入库
///
///
///
///
public async Task RequestInboundTask(string palletCode, string stationCode)
{
try
{
Dt_Task dbtask = Repository.Db.Queryable().Where(x => x.PalletCode == palletCode).OrderByDescending(x=>x.CreateDate).First();
if (dbtask != null)
{
_logger.LogInformation(dbtask.TaskType.ToString());
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().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
{
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);
}
}
///
/// 入空箱
///
///
///
///
///
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().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()
//};
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);
}
}
}
}