using AngleSharp.Io; using COSXML.Network; using Elastic.Clients.Elasticsearch; using Elastic.Clients.Elasticsearch.Inference; using Furion.Logging; using NewLife.Http; using Newtonsoft.Json; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using WCS.Application.Entity; namespace WCS.Application; /// /// 示例开放接口 /// [ApiDescriptionSettings("开放接口", Name = "Demo", Order = 100)] //[Authorize(AuthenticationSchemes = SignatureAuthenticationDefaults.AuthenticationScheme)] [AllowAnonymous] public class DemoOpenApi : IDynamicApiController { private static readonly ISqlSugarClient _db = SqlSugarSetup.ITenant.GetConnectionScope(SqlSugarConst.MainConfigId); private readonly UserManager _userManager; public DemoOpenApi(UserManager userManager) { _userManager = userManager; } //[HttpGet("helloWord")] //public Task HelloWord() //{ // return Task.FromResult($"Hello word. {_userManager.Account}"); //} // /// WCS接受WMS下发的任务 /// /// 任务信息 /// 反馈信息 [AllowAnonymous] public ResponseModel AddWcsTasks(List modelList) { ResponseModel result = new ResponseModel(); result.StatusCode = 0; try { foreach (var models in modelList) { var res = AddWcsTask(models); if (res.StatusCode == -1) { result.StatusCode = -1; result.Msg = res.Msg; } else if (res.StatusCode == 0) { result.StatusCode = 0; result.Msg = models.TaskNo + "任务" + res.Msg; } } } catch (Exception ex) { return new ResponseModel() { StatusCode = -1, Msg = ex.Message }; } return result; } /// /// WCS接受WMS下发的任务(单条任务) /// /// 任务信息 /// 反馈信息 [AllowAnonymous] public ResponseModel AddWcsTask(ResponseTasksModel models) { ResponseModel result = new ResponseModel(); try { // 验证任务是否已存在 var taskInfo = _db.Queryable().First(w => w.TaskNo == models.TaskNo); if (taskInfo != null) { result.StatusCode = -1; result.Msg = "任务:" + models.TaskNo + ";已存在!"; return result; } if (models.TaskType == "0") { models.Order = 1; } else { models.Order = 2; } int aaa = int.Parse(models.TaskType); var taskAdd = new WcsTask() { TaskNo = models.TaskNo, TaskType = (TaskTypeEnum)aaa, Status = TaskStatusEnum.Wait, //IsSuccess =TaskSuccessEnum.Success, Origin = "WMS", StartRoadway = models.StartRoadway, StartLocate = models.StartLocate, EndLocate = models.EndLocate, EndRoadway = models.EndRoadway, PalletNo = models.PalletNo, Levels = 999 //LotNo =models.LotNo, //SkuNo=models.SkuNo, //SkuName=models.SkuName, //Qty=models.Qty }; _db.Insertable(taskAdd).ExecuteCommand(); return new ResponseModel() { StatusCode = 0, Msg = "插入成功" }; } catch (Exception ex) { return new ResponseModel() { StatusCode = -1, Msg = ex.Message }; } } /// /// WCS接收WMS下发的入库单任务 /// /// /// [AllowAnonymous] public ResponseModel AddOrderTask(List models) { ResponseModel result = new ResponseModel(); try { foreach (var item in models) { // 验证任务是否已存在 //var taskInfo = _db.Queryable().First(w => w.OrderNo == item.OrderNo && w.SkuNo == item.SkuNo && w.LotNo == item.LotNo); //if (taskInfo == null) //{ var orderAdd = new WcsOderTask() { OrderNo = item.OrderNo.Trim(), TaskNo = "", LotNo = item.LotNo.Trim(), SkuNo = item.SkuNo.Trim(), SkuName = item.SkuName.Trim(), BoxType = item.BoxType, Qty = item.Qty, TaskType = (TaskTypeEnum)item.TaskType, Status=TaskStatusEnum.Wait }; _db.Insertable(orderAdd).ExecuteCommand(); //} } return new ResponseModel() { StatusCode = 0, Msg = "插入成功" }; } catch (Exception ex) { return new ResponseModel() { StatusCode = -1, Msg = ex.Message }; } } /// /// 获取空托盘垛申请入库工位 /// /// [AllowAnonymous] [HttpPost] public ResponseModel GetNullPalletRukuStation() { try { string rukuAdress = ""; var conveyList4 = new List() { "266", "265" };//四楼入库工位 foreach (var item in conveyList4) { // 根据目标工位号获取输送线链接 var plcCconn = PLCCommon.GetPlcIp(item); // 读取目标工位当前状态 var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == item && m.DeviceType == DeviceTypeEnum.Business); var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos); if (result.IsSucceed) { if (value.ToString() == "120")//空闲状态 { // 判断该工位是否存在未完成的出库任务 var modInTask = _db.Queryable().OrderBy(m => m.Levels, OrderByType.Asc).OrderBy(m => m.CreateTime, OrderByType.Asc) .First(s => (s.Status == TaskStatusEnum.Wait || s.Status == TaskStatusEnum.Doing) && s.TaskType == TaskTypeEnum.Out && s.EndLocate == item); if (modInTask == null) { // 若空闲并没有未完成的出库任务提前占用此工位 var ret = plcCconn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "130"); if (ret.IsSucceed) { rukuAdress = item; break; } } } } } if (!string.IsNullOrEmpty(rukuAdress)) { return new ResponseModel() { StatusCode = 0, Msg = rukuAdress }; } else { return new ResponseModel() { StatusCode = -1, Msg = "无空闲入库工位" }; } } catch (Exception ex) { return new ResponseModel() { StatusCode = -1, Msg = ex.Message }; } } /// /// 小车入库口放货完成,WMS调用WCS更改PLC /// /// /// [AllowAnonymous] [HttpPost] public ResponseModel UpdatePlcPosAgvTaskFinsh(AgvTaskFinshModel model) { try { var conveyList4 = new List() { "266", "265" };//四楼入库工位 if (!conveyList4.Contains(model.StationNum)) { return new ResponseModel() { StatusCode = -1, Msg = "工位号无效" }; } // 根据目标工位号获取输送线链接 var plcCconn = PLCCommon.GetPlcIp(model.StationNum); // 读取目标工位当前状态 var ConveyorMod = PLCTaskAction.plcDevices.First(m => m.StationNum == model.StationNum && m.DeviceType == DeviceTypeEnum.Business); var (result, value) = plcCconn.GetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.PlcPos); if (result.IsSucceed) { if (value.ToString() != "150")//空闲状态 { return new ResponseModel() { StatusCode = -1, Msg = "工位号PLC状态异常" }; } // 写入160,放货完成 var ret = plcCconn.SetPlcDBValue(ConveyorMod.PosType, ConveyorMod.DbNumber, ConveyorMod.WcsPos, "160"); if (ret.IsSucceed) { return new ResponseModel() { StatusCode = 0, Msg = "成功" }; } else { return new ResponseModel() { StatusCode = -1, Msg = "写入PLC失败" }; } } else { return new ResponseModel() { StatusCode = -1, Msg = "连接PLC失败" }; } } catch (Exception ex) { return new ResponseModel() { StatusCode = -1, Msg = ex.Message }; } } /// /// WCS接受赋码系统推送的箱码信息 /// /// 箱码信息 /// 反馈信息 [HttpPost("AddHttpBoxInfo")] [AllowAnonymous] public ResponseFuMaModel AddHttpBoxInfo(FumaBoxModel models) { try { string str = JsonConvert.SerializeObject(models); Log.Information("接收赋码推送的箱码信息:" + str); var num = _db.Queryable().Where(m => m.BoxNo == models.Product.BoxNo && m.IsDelete == false).ToList(); var type = "add"; if (num.Count > 0) { //WCS存在箱码信息,更新箱码信息(需判断箱码是否已组盘入库) var num2 = num.Count(m => m.Status != "0" || !string.IsNullOrWhiteSpace(m.PalletNo)); if (num2 > 0) { throw new Exception("该箱已入盘入库,不可更新信息"); } type = "edit"; } if (models.Product.Barcodes.Count == 0) { throw new Exception("盒码集合不能为空"); } var listBox = new List(); foreach (var item in models.Product.Barcodes) { if (string.IsNullOrWhiteSpace(models.Product.ProductionTime) || string.IsNullOrWhiteSpace(models.Product.ExpirationTime)) { throw new Exception("生产日期或过期日期不能为空"); } DateTime proTime; DateTime expTime; var isValid = DateTime.TryParse(models.Product.ProductionTime, out proTime); var isValid2 = DateTime.TryParse(models.Product.ExpirationTime, out expTime); if (!isValid || !isValid2) { throw new Exception("生产日期或失效日期格式错误"); }; var boxAdd = new WcsBoxInfo() { SkuNo = models.Product.SkuNo, SkuName = models.Product.SkuName, LotNo = models.Product.LotNo, LotText = models.Product.LotText, Custom = models.Product.Custom, CustomName = models.Product.CustomName, ProductionTime = proTime, ExpirationTime = expTime, LineNo=models.Product.Line_No, Standard = models.Product.Standard, PackageStandard = models.Product.PackageStandard, PackUnit = models.Product.PackUnit, StoreTime = DateTime.Parse(models.Product.StoreTime), BitBoxMark = models.Product.BitBoxMark, BoxNo = models.Product.BoxNo, Qty = 1,//数量 FullQty = 0,//整箱数量 InsPectMark = models.Product.InsPectMark,//抽检标记 BoxNo2 = item.BoxNo2, BoxNo3 = "", Level = item.Level, EndLotFlag = string.IsNullOrWhiteSpace(models.Product.BitBoxMark) ? "0" : models.Product.BitBoxMark,//结批标识 QtyCount = 0,//总件数 QtyOrd = 0,//第几件 Status = "0", IsDelete = false }; listBox.Add(boxAdd); } _db.Insertable(listBox).ExecuteCommand(); if (type == "edit") { _db.Deleteable(num).ExecuteCommand(); } return new ResponseFuMaModel() { Success = true, Message = "ok" }; } catch (Exception ex) { return new ResponseFuMaModel() { Success = false, Message = ex.Message }; } } }