using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.Enums; using WIDESEA_Core; using WIDESEA_Model.Models; using WIDESEA_Core.Helper; using Microsoft.Extensions.Logging; using MailKit.Search; using System.Reflection.Metadata; using static WIDESEA_ITaskInfoService.ITaskService; using WIDESEA_Common; using WIDESEA_Core.LogHelper; using WIDESEA_DTO.Task; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.CommonEnum; using WIDESEA_DTO.ToMes; using System.Diagnostics; using WIDESEA_Common.OtherEnum; using WIDESEA_Core.Const; namespace WIDESEA_TaskInfoService { public partial class TaskService { /// /// 仅申请任务,让WCS根据路由确定下一地址 /// /// /// /// public WebResponseContent DeviceRequestInboundTaskSimple(string stationCode, string palletCode) { try { Dt_Task task = Repository.QueryFirst(x => x.PalletCode == palletCode); if (task != null) { PushTasksToWCS(new List { task }); return WebResponseContent.Instance.OK($"该托盘已生成任务", _mapper.Map(task)); } /* if (Repository.QueryFirst(x => x.SourceAddress == stationCode && x.TaskStatus == OutTaskStatusEnum.New.ObjToInt()) != null) { 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($"未找到组盘信息"); //} //var details = stockInfo.Details.FirstOrDefault(); //if (!string.IsNullOrEmpty(stockInfo.LocationCode)) //{ // return WebResponseContent.Instance.Error($"该托盘已绑定货位"); //} Dt_RoadwayInfo roadwayInfo = _roadwayInforepository.QueryFirst(x => x.InStationCode == stationCode); if (roadwayInfo == null) { return WebResponseContent.Instance.Error($"未找到刚入库站台地址"); } Dt_Warehouse warehouse = _warehouseRepository.QueryFirst(x => x.WarehouseCode == roadwayInfo.RoadwayNo); if (warehouse == null) { return WebResponseContent.Instance.Error("未找到该仓库"); } Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(roadwayInfo.RoadwayNo, warehouse.WarehouseId, "");// if (locationInfo == null) { return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位"); } var dt_Stock = new Dt_StockInfo { PalletCode = palletCode, PalletType = 1, LocationCode = locationInfo.LocationCode, StockStatus = (int)StockStatusEmun.组盘暂存, Creater = "WMS", CreateDate = DateTime.Now, WarehouseId = warehouse.WarehouseId, }; Dt_Task newTask = new Dt_Task() { CurrentAddress = stationCode, Grade = 0, NextAddress = stationCode,//堆垛机 PalletCode = palletCode, OrderNo = "1", Roadway = "1", SourceAddress = "", TargetAddress = locationInfo.LocationCode, TaskType = TaskInboundTypeEnum.Inbound.ObjToInt(), TaskStatus = TaskInStatusEnum.Line_InExecuting.ObjToInt(), WarehouseId = warehouse.WarehouseId, //PalletType = GetPalletType(warehouse, palletCode),//GetPalletType(warehouse, palletCode) Creater = "WCS", CreateDate = DateTime.Now, Depth = locationInfo.Depth, }; _unitOfWorkManage.BeginTran(); locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); int taskId = BaseDal.AddData(newTask); newTask.TaskId = taskId; _stockRepository.AddData(dt_Stock); //_stockRepository.UpdateData(stockInfo); _locationInfoRepository.UpdateData(locationInfo); _unitOfWorkManage.CommitTran(); WMSTaskDTO wMSTaskDTO = _mapper.Map(newTask); PushTasksToWCS(new List { newTask }); return WebResponseContent.Instance.OK(data: wMSTaskDTO); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// 创建入库任务 /// /// /// /// public ApiResponse sendEnTask(InOutboundTaskReceived inboundTask) { WebResponseContent webResponseContent = new WebResponseContent(); try { List AddtaskList = new List(); List Adddt_Locations = new List(); List Adddtstockt = new List(); if (inboundTask.palletInfoList.Count > 0) { List taskData = BaseDal.QueryData(); List Stockdata = _stockRepository.QueryData(); /*Dt_StationManger dt_Station = _stationMangerService.QueryPlatform(inboundTask.NodeCode); if (dt_Station == null) return MESresponse($"未找到站台信息,站台编号:{inboundTask.NodeCode}", false);*/ foreach (PalletInfo palletInfo in inboundTask.palletInfoList) { Dt_LocationInfo location = null; if (palletInfo.locationCode == null || palletInfo.locationCode == "") { location = _basicService.LocationInfoService.GetLocationInfo();//获取到新库位 } else { location = _locationInfoRepository.QueryFirst(x => x.LocationCode == palletInfo.locationCode); } if (location == null) return MESresponse($"未找到货位信息,条码:{palletInfo.palletCode}", false); if (location.LocationStatus != (int)LocationStatusEnum.Free) return MESresponse($"托盘条码:{palletInfo.palletCode},查找到的货位:{location.LocationCode},不为空货位!", false); Dt_StockInfo dt_ = Stockdata.Where(x => x.PalletCode == palletInfo.palletCode).FirstOrDefault(); if (dt_ == null) { //创建组盘信息 var dt_Stock = new Dt_StockInfo { PalletCode = palletInfo.palletCode, PalletType = 1, LocationCode = location.LocationCode, StockStatus = (int)StockStatusEmun.组盘暂存, Creater = "WMS", CreateDate = DateTime.Now, MESsubPalletCode = palletInfo.palletCode, }; Adddtstockt.Add(dt_Stock); } else { if(dt_.StockStatus == (int)StockStatusEmun.已入库) { return MESresponse($"该库存条码已入库,不可重复入库,条码:{palletInfo.palletCode}", false); } } string TaregtAddres = ""; if (inboundTask.NodeCode !="2011" && inboundTask.NodeCode != "2009") { int nextTaregt = int.Parse(inboundTask.NodeCode); //确认目标站台(固定) TaregtAddres = (nextTaregt + 1).ToString(); } else { TaregtAddres = location.RoadwayNo == "SC01" ? "2021" : "2020"; } location.LocationStatus = (int)LocationStatusEnum.InStockLock; //生成移动任务 Dt_Task dt_Task = new() { PalletCode = palletInfo.palletCode, TaskNum = GetTaskNum(nameof(SequenceEnum.SeqTaskNum)), Roadway = location.RoadwayNo, TaskType = TaskInboundTypeEnum.Inbound.ObjToInt(), TaskStatus = TaskInStatusEnum.Line_InExecuting.ObjToInt(), SourceAddress = TaregtAddres, TargetAddress = location.LocationCode, CurrentAddress = TaregtAddres, NextAddress = location.LocationCode, Grade = 1, Creater = "MES", Depth = location.Depth, CreateDate = DateTime.Now, MEStaskId = inboundTask.TaskId, MESbusinessId = inboundTask.BusinessId, MESsubPalletCode = palletInfo.subPalletCode, OutboundPlatform = inboundTask.NodeCode }; Adddt_Locations.Add(location); AddtaskList.Add(dt_Task); } if (Adddtstockt.Count > 0 && Adddt_Locations.Count > 0 && AddtaskList.Count > 0) { _unitOfWorkManage.BeginTran(); _stockRepository.AddData(Adddtstockt); _locationInfoRepository.UpdateData(Adddt_Locations); BaseDal.AddData(AddtaskList); var respon = PushTasksToWCS(AddtaskList, ""); if (respon.Status) { _unitOfWorkManage.CommitTran(); //提交事务 return MESresponse("", true); } else { _unitOfWorkManage.RollbackTran(); //回滚事务 return MESresponse($"下发出库失败,原因:{respon.Message}!", false); } } else { return MESresponse("任务生成失败!", false); } } else { return MESresponse("接收到MES托盘编码列表无数据!", false); } } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); //回滚事务 return MESresponse($"下发出库失败,原因:{ex.Message}!", false); throw; } } } }