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 = "成功" }; } } }