using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_WCS.IRepositories; using WIDESEA_WCS.Repositories; using WIDESEA_Core.EFDbContext; using WIDESEA_Core.FreeDB; using WIDESEA_Entity.DomainModels; using WIDESEA_Comm; namespace WIDESEA_WCS.JobsPart.Common { public class StationTask { FreeDB freeDB = new FreeDB(); public void CreateTask() { VOLContext context = new VOLContext(); Idt_stationinfoRepository stationinfoRepository = new dt_stationinfoRepository(context); Idt_WorkinfoRepository workinfoRepository = new dt_WorkinfoRepository(context); List stationinfos = stationinfoRepository.Find(x => x.stationCode.Contains('X')); foreach (var item in stationinfos) { //根据下料口的绑定信息查询对应工单,检测此工单是否已完成 完成即可将其送入库 dt_Workinfo workinfo = workinfoRepository.FindFirst(x => x.WorkNumber == item.Number); int CompeletedNum = Convert.ToInt32(workinfo.PlannedQuantity) - Convert.ToInt32(workinfo.QuantityCompletion); //判定任务是否已创建//如已存在 if (freeDB.Select().Where(x => x.agv_fromaddress == item.stationCode).Count() > 0) continue; if (item.quantity == 5 || CompeletedNum == 0) //循环读取车轮数为5或者订单已完成数量的下料口 →工单人工关闭的工单 { dt_stationinfo TargetLocation = GetEmptyLocation(stationinfoRepository, workinfo, item); if (TargetLocation != null) { //todo: 调用WMS接口创建任务 dt_agvtask agvtask = new dt_agvtask() { agv_fromaddress = item.stationCode, agv_id = Guid.NewGuid(), agv_grade = 0, agv_barcode = "", agv_createtime = DateTime.Now, agv_taskstate = TaskStatus.Created.ToString(), agv_toaddress = TargetLocation.stationCode, }; freeDB.Add(agvtask); TargetLocation.location_state = LocationStateEnum.Busy.ToString(); freeDB.Update(TargetLocation); } } } } /// /// 获取空库位 /// /// 库存 /// 订单 /// 下料口信息 /// private dt_stationinfo GetEmptyLocation(Idt_stationinfoRepository stationinfoRepository, dt_Workinfo workinfo, dt_stationinfo stationinfo) { //放货位 dt_stationinfo TargetLocation = null; //根据订单数量来寻找对应库区且同物料类型库位 if (workinfo.PlannedQuantity < 50) //库区1 物料类型多 { dt_stationinfo station = stationinfoRepository.Find(x => x.stationType == stationinfo.stationType && x.area == "1").OrderByDescending(x => x.lastUpdateTime).FirstOrDefault(); if (station != null) { //如存在同物料类型且在1行的库存则新入库的物料放至同列 不存在则寻找新行库位 if (station.line == 1) { TargetLocation = stationinfoRepository.Find(x => x.area == station.area && x.location_state == LocationStateEnum.Empty.ToString() && x.column == station.column && x.enable).OrderBy(x => x.line).ThenBy(x => x.column).FirstOrDefault(); } TargetLocation = stationinfoRepository.Find(x => x.area == station.area && x.location_state == LocationStateEnum.Empty.ToString() && x.line == 1 && x.enable).OrderBy(x => x.line).ThenBy(x => x.column).FirstOrDefault(); } else { TargetLocation = stationinfoRepository.Find(x => x.area == "1" && x.location_state == LocationStateEnum.Empty.ToString() && x.line == 1 && x.enable).OrderBy(x => x.line).ThenBy(x => x.column).FirstOrDefault(); } } else { //int quantity = Convert.ToInt32(workinfo.PlannedQuantity); //string area = GetArea(quantity); dt_materielinfo materielinfo = freeDB.Select().Where(x => x.materiel_id == stationinfo.stationType).First(); if (materielinfo == null) throw new Exception($"无此物料类型{stationinfo.stationType}库区"); string area = materielinfo.materiel_areaid.ToString(); //如存在同类型物料则放置同行库位 不存在则放置新行的第一列中 dt_stationinfo station = stationinfoRepository.Find(x => x.stationType == stationinfo.stationType && x.area == area).OrderBy(x => x.lastUpdateTime).FirstOrDefault(); if (station != null) { TargetLocation = stationinfoRepository.Find(x => x.area == station.area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.line == station.line).OrderBy(x => x.column).FirstOrDefault(); if (TargetLocation == null) { TargetLocation = stationinfoRepository.Find(x => x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.column == '1').OrderBy(x => x.line).FirstOrDefault(); } } else { TargetLocation = stationinfoRepository.Find(x => x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.column == '1').OrderBy(x => x.line).FirstOrDefault(); } //todo 如物料已满则放置其他库区 //if (TargetLocation == null) //{ // stationinfoRepository.Find(x => x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.column == '1').OrderBy(x => x.line).FirstOrDefault(); //} } if (TargetLocation == null) { throw new Exception("库位已满"); } //else if (workinfo.PlannedQuantity >= 50 && workinfo.PlannedQuantity < 110) //库区2 //{ // //如存在同类型物料则放置同行库位 不存在则放置新行的第一列中 // dt_stationinfo station = stationinfoRepository.Find(x => x.stationType == stationinfo.stationType && x.area == "2").OrderBy(x => x.lastUpdateTime).FirstOrDefault(); // if (station != null) // { // TargetLocation = stationinfoRepository.Find(x => x.area == station.area && x.location_state == LocationStateEnum.Empty.ToString() && x.line == station.line).OrderBy(x => x.column).FirstOrDefault(); // } // else // { // TargetLocation = stationinfoRepository.Find(x => x.area == "2" && x.location_state == LocationStateEnum.Empty.ToString() && x.column == '1').OrderBy(x => x.line).FirstOrDefault(); // } //} //else if(workinfo.PlannedQuantity >= 110 && workinfo.PlannedQuantity < 180) //{ //} return TargetLocation; } /// /// 根据订单数量返回库区(暂时弃用) //更换为库位类型匹配 /// /// /// private string GetArea(int quantity) { if (quantity >= 50 && quantity < 180) return "2"; else if (quantity >= 180 && quantity < 180) return "3"; else if (quantity >= 180 && quantity < 220) return "4"; return null; } } }