using MailKit.Search;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common;
using WIDESEA_Core;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_DTO.WCSInfo;
using WIDESEA_Model.Models;
using WIDESEAWCS_DTO.WCSInfo;
namespace WIDESEA_TaskInfoService
{
public partial class TaskService
{
///
/// 立库出库AGV搬运
///
///
///
public WebResponseContent ShelfOutboundCarry(Dt_Task outTask)
{
Dt_CachePoint cachePoint = GetCachePointByStartPoint(outTask.TargetAddress);
Dt_Task task = new()
{
CurrentAddress = outTask.TargetAddress,
Grade = 0,
NextAddress = cachePoint.PointCode,
OrderNo = outTask.OrderNo,
PalletCode = outTask.PalletCode + "-AGV",
Roadway = "",
SourceAddress = outTask.TargetAddress,
TargetAddress = cachePoint.PointCode,
//SourceKey = outTask.TaskId,
TaskNum = outTask.TaskNum,
TaskState = AGVTaskStatusEnum.AGV_New.ObjToInt(),
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
};
cachePoint.PointStatus = LocationStatusEnum.OutLock.ObjToInt();
_basicService.CachePointService.Repository.UpdateData(cachePoint);
Repository.AddData(task);
return WebResponseContent.Instance.OK();
}
///
/// 叫料
///
///
///
public WebResponseContent CallMateriel(string endPoint)
{
Dt_CachePoint cachePoint = GetCachePointByEndPoint(endPoint);
Dt_Task task = new Dt_Task()
{
CurrentAddress = cachePoint.PointCode,
Grade = 0,
NextAddress = endPoint,
OrderNo = "",
PalletCode = cachePoint.Remark,
Roadway = "",
SourceAddress = cachePoint.PointCode,
TargetAddress = endPoint,
//SourceKey = 0,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
TaskState = AGVTaskStatusEnum.AGV_New.ObjToInt(),
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
};
cachePoint.PointStatus = LocationStatusEnum.OutLock.ObjToInt();
_basicService.CachePointService.Repository.UpdateData(cachePoint);
Repository.AddData(task);
return WebResponseContent.Instance.OK();
}
///
/// 物料搬运
///
///
///
public WebResponseContent MaterielCarry(string startPoint)
{
Dt_CachePoint cachePoint = GetCachePointByStartPoint(startPoint);
Dt_Task task = new()
{
CurrentAddress = startPoint,
Grade = 0,
NextAddress = cachePoint.PointCode,
OrderNo = "",
PalletCode = startPoint + "-AGV",
Roadway = "",
SourceAddress = startPoint,
TargetAddress = cachePoint.PointCode,
//SourceKey = 0,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
TaskState = AGVTaskStatusEnum.AGV_New.ObjToInt(),
TaskType = TaskTypeEnum.AGVCarry.ObjToInt(),
};
cachePoint.PointStatus = LocationStatusEnum.OutLock.ObjToInt();
_basicService.CachePointService.Repository.UpdateData(cachePoint);
Repository.AddData(task);
return WebResponseContent.Instance.OK();
}
///
/// 人工组盘入库
///
///
///
public WebResponseContent InMateriel(SaveModel saveModel)
{
WebResponseContent responseContent = new WebResponseContent();
try
{
var palletCode = saveModel.MainData["palletCode"].ToString();
if (string.IsNullOrEmpty(palletCode)) throw new Exception("托盘号不可为空");
var orderNo = saveModel.MainData["orderNo"].ToString();
if (string.IsNullOrEmpty(orderNo)) throw new Exception("批号不可为空");
var batchNo = saveModel.MainData["batchNo"].ToString();
if (string.IsNullOrEmpty(batchNo)) throw new Exception("柜号不可为空");
#region 查询库存、入库单
Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode);
if (stockInfo != null) throw new Exception($"托盘【{palletCode}】已存在库存信息");
stockInfo = new Dt_StockInfo();
stockInfo.Details = new List();
Dt_InboundOrder? inboundOrder = _inboundService.InbounOrderService.GetInboundOrder(orderNo);
if (inboundOrder == null) throw new Exception($"未找到批号为【{orderNo}】的入库单");
Dt_InboundOrderDetail? inboundOrderDetail = inboundOrder.Details.Where(x => x.BatchNo == batchNo).FirstOrDefault();
if (inboundOrderDetail == null) throw new Exception($"批号【{orderNo}】的入库单未找到柜号【{batchNo}】");
if (inboundOrderDetail.OrderQuantity - inboundOrderDetail.ReceiptQuantity < 1) throw new Exception($"批号【{orderNo}】的柜号【{batchNo}】可组盘数量不足");
#endregion
#region 创建任务
Dt_Task dt_Task = new Dt_Task()
{
CurrentAddress = "1001",
NextAddress = "1002",
SourceAddress = "RGRK",
TargetAddress = "SC01",
Creater = "System",
PalletCode = palletCode,
Roadway = "SC01",
OrderNo = orderNo + batchNo,
TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
TaskState = InTaskStatusEnum.AGV_InFinish.ObjToInt(),
TaskType = TaskTypeEnum.Inbound.ObjToInt(),
CreateDate = DateTime.Now,
Dispatchertime = DateTime.Now,
};
#endregion
#region 添加库存信息、处理入库单
inboundOrderDetail.ReceiptQuantity++;
inboundOrderDetail.OrderDetailStatus = inboundOrderDetail.OverInQuantity == inboundOrderDetail.OrderQuantity ? OrderDetailStatusEnum.Over.ObjToInt() : OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
if (inboundOrder.Details.FirstOrDefault(x => x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) == null)
{
inboundOrder.OrderStatus = InboundStatusEnum.入库完成.ObjToInt();
}
else if (inboundOrder.OrderStatus == InboundStatusEnum.未开始.ObjToInt())
{
inboundOrder.OrderStatus = InboundStatusEnum.入库中.ObjToInt();
}
Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
{
Status = StockStatusEmun.组盘暂存.ObjToInt(),
OrderNo = inboundOrder.OrderNo,
StockId = stockInfo.Id != 0 ? stockInfo.Id : 0,
MaterielName = inboundOrderDetail.MaterielName,
MaterielCode = inboundOrderDetail.MaterielCode,
BatchNo = inboundOrderDetail.BatchNo,
StockQuantity = 1,
SerialNumber = "",
Creater = "System"
};
if (stockInfo.Id == 0)
{
stockInfo.PalletCode = palletCode;
stockInfo.StockStatus = StockStatusEmun.组盘暂存.ObjToInt();
stockInfo.Creater = "System";
stockInfo.Remark = "人工组盘入库";
}
stockInfo.Details.Add(stockInfoDetail);
#endregion
Db.Ado.BeginTran();
_inboundService.InbounOrderService.UpdateDataWithDetail(inboundOrder);
_stockService.StockInfoService.AddMaterielGroup(stockInfo);
AddData(dt_Task);
List wMSTaskDTOs = _mapper.Map>(new List { dt_Task });
var ResultData = HttpHelper.PostAsync(WCSInterfaceAddress.ReceiveTask, wMSTaskDTOs.ToJson(), headers: new Dictionary());
if (ResultData.Result == null) throw new Exception($"向WCS下发人工组盘入库任务超时");
responseContent = JsonConvert.DeserializeObject(ResultData.Result);
if (responseContent == null) throw new Exception($"下发人工组盘入库任务WCS无响应");
if (!responseContent.Status) throw new Exception(responseContent.Message);
Db.Ado.CommitTran();
}
catch (Exception ex)
{
Db.Ado.RollbackTran();
responseContent.Error(ex.Message);
}
return responseContent;
}
private Dt_CachePoint GetCachePointByStartPoint(string startPoint)
{
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.StartArea == startPoint);
if (areaRouter == null)
{
throw new Exception("未找到路由信息");
}
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.NextArea);
if (areaInfo == null)
{
throw new Exception("未找到下一区域信息");
}
Dt_CachePoint? cachePoint = _basicService.CachePointService.AssignCachePoint(areaInfo.Id);
if (cachePoint == null)
{
throw new Exception("未找到空闲缓存点");
}
return cachePoint;
}
private Dt_CachePoint GetCachePointByEndPoint(string endPoint)
{
Dt_AreaRouter areaRouter = _basicService.AreaRouterService.Repository.QueryFirst(x => x.NextArea == endPoint);
if (areaRouter == null)
{
throw new Exception("未找到路由信息");
}
Dt_AreaInfo areaInfo = _basicService.AreaInfoService.Repository.QueryFirst(x => x.AreaCode == areaRouter.StartArea);
if (areaInfo == null)
{
throw new Exception("未找到起点缓存区域信息");
}
Dt_CachePoint? cachePoint = _basicService.CachePointService.GetIbStockCachePoint(areaInfo.Id);
if (cachePoint == null)
{
throw new Exception("未找到有货缓存点");
}
return cachePoint;
}
public object AGVTaskFeedBack(AGVTaskFeedBackModel model)
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskId == Convert.ToInt32(model.Task_id));
if (task == null)
{
return new { code = 404, message = "未找到该任务" };
}
Dt_CachePoint startCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.SourceAddress);
if (startCachePoint != null)
{
startCachePoint.PointStatus = LocationStatusEnum.Free.ObjToInt();
_basicService.CachePointService.Repository.UpdateData(startCachePoint);
}
Dt_CachePoint endCachePoint = _basicService.CachePointService.Repository.QueryFirst(x => x.PointCode == task.TargetAddress);
if (endCachePoint != null)
{
endCachePoint.PointStatus = LocationStatusEnum.InStock.ObjToInt();
_basicService.CachePointService.Repository.UpdateData(endCachePoint);
}
BaseDal.DeleteData(task);
return new { code = 200, message = "成功" };
}
}
}