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 System.Net.Http.Headers; using System.Security.Policy; using Newtonsoft.Json; namespace WIDESEA_TaskInfoService { public partial class TaskService { /// /// WCS IP地址 /// public string url = AppSettings.Configuration["WCS"]; /// /// AGV IP地址 /// public string AGVurl = AppSettings.Configuration["AGV"]; /// /// PDA申请入库--堆垛机立库入库 /// /// 起始地址 /// 任务类型--入空,入料 /// 托盘编号 /// 返回处理结果 public WebResponseContent GenerateInboundTask(string stationCode, int taskType, string palletCode) { string? name = Enum.GetName(typeof(TaskTypeEnum), taskType); MethodInfo? methodInfo = GetType().GetMethod(name + "Request"); if (methodInfo != null) { WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { stationCode, palletCode }); if (responseContent != null) { return responseContent; } } else { return WebResponseContent.Instance.Error("未找到该任务类型业务"); } return WebResponseContent.Instance.Error($"错误"); } /// /// 空托盘入库 /// /// 起始地址 /// 托盘编号 /// 返回处理结果 public WebResponseContent PalletInboundRequest(string stationCode, string palletCode) { WebResponseContent content = new WebResponseContent(); try { (bool, string) result = CheckRequestInbound(stationCode, palletCode, false); if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2); content = AssignLocUpdateData(stationCode, TaskTypeEnum.PalletInbound.ObjToInt(), palletCode, false); } catch (Exception ex) { content = WebResponseContent.Instance.Error($"{ex.Message}"); } return content; } /// /// 物料入库 /// /// 起始地址 /// 托盘编号 /// 返回处理结果 public WebResponseContent InboundRequest(string stationCode, string palletCode) { WebResponseContent content = new WebResponseContent(); try { Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(palletCode); (bool, string) result = CheckRequestInbound(stationCode, palletCode, true, stockInfo); if (!result.Item1) return content = WebResponseContent.Instance.Error(result.Item2); content = AssignLocUpdateData(stationCode, TaskTypeEnum.Inbound.ObjToInt(), palletCode, true, stockInfo); } catch (Exception ex) { content = WebResponseContent.Instance.Error($"{ex.Message}"); } return content; } /// /// 入库分配货位及处理数据 /// /// 起始地址 /// 任务类型 /// 托盘编号 /// 是否更新组盘信息--区分物料入库和空托入库 /// 组盘信息--可空 /// 订单号--可空 /// 返回处理结果 private WebResponseContent AssignLocUpdateData(string stationCode, int taskType, string palletCode, bool isUpdateStock = true, Dt_StockInfo? stockInfo = null, string orderNo = "") { WebResponseContent content = new WebResponseContent(); try { _unitOfWorkManage.BeginTran(); Dt_LocationInfo? locationInfo = _basicService.LocationInfoService.AssignLocation(ref stationCode, taskType); if (locationInfo != null) { List tasks = new List(); Dt_Task task = new() { CurrentAddress = stationCode, Grade = 2, PalletCode = palletCode, NextAddress = locationInfo.LocationCode, Roadway = locationInfo.RoadwayNo, SourceAddress = stationCode, TargetAddress = locationInfo.LocationCode, TaskStatus = InTaskStatusEnum.InNew.ObjToInt(), TaskType = taskType, Depth = locationInfo.Depth, }; BaseDal.AddData(task); int beforeStatus = locationInfo.LocationStatus; if (isUpdateStock) { locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); if (locationInfo.Depth == 2) { _basicService.LocationInfoService.UpdateLocationLock(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(), false); } if (stockInfo != null && stockInfo.Details != null && stockInfo.Details.Count > 0) { orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? ""; stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); stockInfo.Details.ForEach(x => { x.Status = StockStatusEmun.入库确认.ObjToInt(); }); _stockService.StockInfoService.Repository.UpdateData(stockInfo); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details); } else { return content.Error("未找到库存信息"); } } else { locationInfo.LocationStatus = LocationStatusEnum.PalletLock.ObjToInt(); if (locationInfo.Depth == 2) { _basicService.LocationInfoService.UpdateLocationLock(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(), false); } task.Grade = 1; } _basicService.LocationInfoService.Repository.UpdateData(locationInfo); tasks.Add(task); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), orderNo, task.TaskNum); var response = HttpHelper.Post(url + "ReceiveTask/", tasks, "入库任务下发"); if (!response.Status) { _unitOfWorkManage.RollbackTran(); return content.Error($"{response.Message}"); } _unitOfWorkManage.CommitTran(); return content.OK(); } return content.Error("未找到可分配货位"); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); content.Error(ex.Message); } return content; } /// /// 验证数据 /// /// 起始地址 /// 托盘编号 /// 是否检查组盘信息--区分物料入库和空托入库 /// 组盘信息--可空 /// 返回处理结果 private (bool, string) CheckRequestInbound(string stationCode, string palletCode, bool isCheckStock = true, Dt_StockInfo? stockInfo = null) { if (BaseDal.QueryFirst(x => x.PalletCode == palletCode) != null) { return (false, "该托盘号已有任务!"); } Dt_RoadwayInfo roadwayInfo = _basicService.RoadwayInfoService.Repository.QueryFirst(x => x.InStationCode == stationCode) ?? throw new Exception("未找到该站台对应的巷道,请检查基础配置信息!"); if (BaseDal.QueryFirst(x => (x.SourceAddress == roadwayInfo.InSCStationCode || x.CurrentAddress == roadwayInfo.InSCStationCode) && x.TaskStatus == InTaskStatusEnum.InNew.ObjToInt()) != null) { return (false, "当前入库站台已有一条新建任务!"); } if (isCheckStock) { if (stockInfo == null) { return (false, "未找到组盘信息!"); } if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt()) { return (false, "该组盘状态不可入库!"); } if (!string.IsNullOrEmpty(stockInfo.LocationCode)) { return (false, "该托盘已绑定货位!"); } if (stockInfo.Details == null || stockInfo.Details.Count == 0) { return (false, "没有库存明细信息!"); } } else { if (_stockService.StockInfoService.Repository.QueryFirst(x => x.PalletCode == palletCode) != null) { return (false, "该托盘已存在库内!"); } } return (true, "成功!"); } } }