分支自 SuZhouGuanHong/TaiYuanTaiZhong

huanghongfeng
2024-07-19 bb929bd0809eefc1108dd779846ff07d997f7ef0
´úÂë¹ÜÀí/PCS/WCS_Server/WIDESEA_WCS/JobsPart/Common/ÐÂÎļþ¼Ð/GetLocation.cs
@@ -24,207 +24,134 @@
        /// <param name="mesinfo"></param>
        /// <param name="stationinfo"></param>
        /// <returns></returns>
        public static dt_stationinfo GetEmptyLocation(Idt_stationinfoRepository stationinfoRepository, VV_Mes_Workinfo mesinfo, dt_stationinfo stationinfo)
        public static dt_stationinfo GetEmptyLocation(Idt_stationinfoRepository stationinfoRepository, VV_Mes_Workinfo mesinfo, dt_agvtask agvtask)
        {
            lock (GetEmptyLocationobj)
            {
                try
                {
                    VOLContext context = new VOLContext();
                    //Idt_mes_detailRepository mes_DetailRepository = new dt_mes_detailRepository(context);
                    Idt_inventoryRepository inventoryRepository = new dt_inventoryRepository(context);
                    //var detail = mes_DetailRepository.Find(x => x.jobID == mesinfo.jobID).FirstOrDefault();
                    //if (detail == null)
                    //{
                    //    stationinfo.remark = "触发入库任务,但未找到工单子表!";
                    //    stationinfo.location_state = LocationStateEnum.Abnormal.ToString();
                    //    stationinfoRepository.Update(stationinfo, true);
                    //    return null;
                    //}
                    string area1 = "";
                    if (stationinfo.tray_type == "LargeTray")
                    if (agvtask.agv_Traytype == "LargeTray")
                        area1 = "4";
                    dt_stationinfo TargetLocation = null;
                    #region å¯»æ‰¾å·²åˆ†é…åŒå›¾å·å…¥åº“任务库位
                    //TargetLocation = area1 == "4" ? stationinfoRepository.Find(x => x.stationType == agvtask.agv_materielid && x.location_state == LocationStateEnum.InBusy.ToString() && x.enable && x.area == area1).FirstOrDefault() : stationinfoRepository.Find(x => x.stationType == agvtask.agv_materielid && x.location_state == LocationStateEnum.InBusy.ToString() && (x.area == "2" || x.area == "3") && x.enable).FirstOrDefault();
                    TargetLocation = area1 == "4" ? stationinfoRepository.Find(x => x.Number == agvtask.jobID && x.location_state == LocationStateEnum.InBusy.ToString() && x.enable && x.area == area1).FirstOrDefault() : stationinfoRepository.Find(x => x.Number == agvtask.jobID && x.location_state == LocationStateEnum.InBusy.ToString() && (x.area == "2" || x.area == "3") && x.enable).FirstOrDefault();
                    if (TargetLocation != null)
                    {
                        TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();
                        if (TargetLocation != null)
                            if (!GetStation.OutBusyStation(TargetLocation.stationCode) && !GetStation.QueueStation(TargetLocation.stationCode)) return TargetLocation;
                    }
                    #endregion
                    #region æŸ¥æ‰¾åº“å­˜
                    dt_inventory inventory = null;
                    inventory = inventoryRepository.Find(x => x.FigureNumber == mesinfo.drawingNo).OrderByDescending(x => x.OnlineTime).FirstOrDefault();
                    #region æ ¹æ®æ¡ä»¶æŸ¥è¯¢åº“å­˜
                    //if (mesinfo.heatID != null)
                    //{
                    //    inventory = inventoryRepository.Find(x => x.HeatNumber == mesinfo.heatID && x.FigureNumber == mesinfo.drawingNo && x.jobID == mesinfo.workOrder).OrderByDescending(x => x.OnlineTime).FirstOrDefault();
                    //}
                    //else
                    //{
                    //    inventory = inventoryRepository.Find(x => x.FigureNumber == mesinfo.drawingNo && x.jobID == mesinfo.workOrder).OrderByDescending(x => x.OnlineTime).FirstOrDefault();
                    //}
                    //inventory = area1 == "4" ? inventoryRepository.Find(x => x.FigureNumber == agvtask.agv_materielid && x.area == area1).OrderByDescending(x => x.OnlineTime).FirstOrDefault()
                    //  : inventoryRepository.Find(x => x.FigureNumber == agvtask.agv_materielid && (x.area == "2" || x.area == "3")).OrderByDescending(x => x.OnlineTime).FirstOrDefault();
                    inventory = area1 == "4" ? inventoryRepository.Find(x => x.workOrder == agvtask.jobID && x.area == area1).OrderByDescending(x => x.OnlineTime).FirstOrDefault()
                        : inventoryRepository.Find(x => x.FigureNumber == agvtask.agv_materielid && (x.area == "2" || x.area == "3")).OrderByDescending(x => x.OnlineTime).FirstOrDefault();
                    #endregion
                    #endregion
                    dt_stationinfo TargetLocation = null;
                    #region æ ¹æ®åº“存查找可入库空货位
                    if (inventory != null)
                    {
                        var station = stationinfoRepository.FindFirst(x => x.stationCode == inventory.stationCode);
                        if (!string.IsNullOrEmpty(area1) && station.area != area1)//入大托盘库区
                        #region å¯»æ‰¾å·²åˆ†é…åŒå›¾å·å…¥åº“任务库位
                        //TargetLocation = stationinfoRepository.Find(x => x.stationType == agvtask.agv_materielid && x.location_state == LocationStateEnum.InBusy.ToString() && x.area == station.area).FirstOrDefault();
                        //if (TargetLocation != null)
                        //{
                        //    TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();
                        //    if (TargetLocation != null)
                        //    {
                        //        if (!stationinfoRepository.Find(x => x.line == TargetLocation.line && x.area == TargetLocation.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                        //            return TargetLocation;
                        //    }
                        //}
                        #endregion
                        #region åˆ¤æ–­å½“前行是否还有空货位
                        TargetLocation = stationinfoRepository.Find(x => x.line == station.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == station.area).OrderBy(x => x.column).FirstOrDefault();
                        if (TargetLocation != null)
                        {
                            #region å¯»æ‰¾å·²åˆ†é…åŒå›¾å·å…¥åº“任务库位
                            TargetLocation = stationinfoRepository.Find(x => x.stationType == stationinfo.stationType && x.location_state == LocationStateEnum.InBusy.ToString() && x.area == area1).FirstOrDefault();
                            if (TargetLocation != null)
                            {
                                //if (TargetLocation.area == "1")
                                //{
                                //    //TargetLocation = stationinfoRepository.Find(x => x.column == TargetLocation.column && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderByDescending(x => x.line).FirstOrDefault();
                                //    TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();//按行存放
                                //    if (TargetLocation != null)
                                //    {
                                //        if (!stationinfoRepository.Find(x => x.column == TargetLocation.column && x.area == TargetLocation.area /*&& x.enable*/ && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                                //            return TargetLocation;
                                //    }
                                //}
                                //else
                                //{
                                    TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();
                                    if (TargetLocation != null)
                                    {
                                        if (!stationinfoRepository.Find(x => x.line == TargetLocation.line && x.area == TargetLocation.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                                            return TargetLocation;
                                    }
                                //}
                            }
                            #endregion
                            #region å¯»æ‰¾ç©ºè´§ä½
                            var TargetLocations1 = stationinfoRepository.Find(x => x.location_state == LocationStateEnum.Empty.ToString() && x.enable &&  x.area == area1).OrderBy(x => x.line).ThenBy(x => x.column).ToList();
                            foreach (var Location in TargetLocations1)
                            {
                                //if (Location.area == "1")
                                //{
                                //    if (stationinfoRepository.Find(x => x.column == Location.column && x.area == Location.area && x.stationType == stationinfo.stationType && x.location_state != LocationStateEnum.OutBusy.ToString()).Any()) return Location;
                                //}
                                //else
                                //{
                                    if (stationinfoRepository.Find(x => x.line == Location.line && x.area == Location.area && x.stationType == stationinfo.stationType && x.location_state != LocationStateEnum.OutBusy.ToString()).Any()) return Location;
                                //}
                            }
                            //if (TargetLocation != null)
                            //{
                            //    if (stationinfoRepository.Find(x => x.line == TargetLocation.line && x.column == 1 && x.stationType == stationinfo.stationType).Any()) return TargetLocation;
                            //}
                            #endregion
                            if (!GetStation.OutBusyStation(TargetLocation.stationCode) && !GetStation.QueueStation(TargetLocation.stationCode))
                                return TargetLocation;
                        }
                        if (station.area == "1")
                        {
                            //TargetLocation = stationinfoRepository.Find(x => x.column == station.column && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == inventory.area).OrderByDescending(x => x.line).FirstOrDefault();
                        #endregion
                            TargetLocation = stationinfoRepository.Find(x => x.line == station.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == station.area).OrderBy(x => x.column).FirstOrDefault();//按行存放
                        #region å¯»æ‰¾ç©ºè´§ä½
                        //var TargetLocations1 = stationinfoRepository.Find(x => x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == station.area).OrderBy(x => x.line).ThenBy(x => x.column).ToList();
                        //foreach (var Location in TargetLocations1)
                        //{
                        //    if (stationinfoRepository.Find(x => x.line == Location.line && x.area == Location.area && x.stationType == agvtask.agv_materielid).Any())
                        //        if (!stationinfoRepository.Find(x => x.line == Location.line && x.area == Location.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any()) return Location;
                        //}
                        #endregion
                            if (TargetLocation != null)
                            {
                                if (!stationinfoRepository.Find(x => x.column == TargetLocation.column && x.area == TargetLocation.area /*&& x.enable*/ && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                                    return TargetLocation;
                            }
                        }
                        else
                        {
                            TargetLocation = stationinfoRepository.Find(x => x.line == station.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == inventory.area).OrderBy(x => x.column).FirstOrDefault();
                            if (TargetLocation != null)
                            {
                                if (!stationinfoRepository.Find(x => x.line == TargetLocation.line && x.area == TargetLocation.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                                    return TargetLocation;
                            }
                        }
                        //if (TargetLocation != null) return TargetLocation;
                    }
                    #endregion
                    #region å¯»æ‰¾å·²åˆ†é…åŒå›¾å·å…¥åº“任务库位
                    TargetLocation = stationinfoRepository.Find(x => x.stationType == stationinfo.stationType && x.location_state == LocationStateEnum.InBusy.ToString() && (x.area == "1" || x.area == "2" || x.area == "3" || x.area == "4")).FirstOrDefault();
                    if (TargetLocation != null)
                    {
                        if (TargetLocation.area == "1")
                        {
                            //TargetLocation = stationinfoRepository.Find(x => x.column == TargetLocation.column && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderByDescending(x => x.line).FirstOrDefault();
                            TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();//按行存放
                            if (TargetLocation != null)
                            {
                                if (!stationinfoRepository.Find(x => x.column == TargetLocation.column && x.area == TargetLocation.area /*&& x.enable*/ && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                                    return TargetLocation;
                            }
                        }
                        else
                        {
                            TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();
                            if (TargetLocation != null)
                            {
                                if (!stationinfoRepository.Find(x => x.line == TargetLocation.line && x.area == TargetLocation.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                                    return TargetLocation;
                            }
                        }
                    }
                    #endregion
                    #region å¯»æ‰¾ç©ºè´§ä½
                    var TargetLocations = stationinfoRepository.Find(x => x.location_state == LocationStateEnum.Empty.ToString() && x.enable && (x.area == "1" || x.area == "2" || x.area == "3" || x.area == "4")).OrderBy(x => x.line).ThenBy(x => x.column).ToList();
                    foreach (var Location in TargetLocations)
                    {
                        if (Location.area == "1")
                        {
                            if (stationinfoRepository.Find(x => x.column == Location.column && x.area == Location.area && x.stationType == stationinfo.stationType && x.location_state != LocationStateEnum.OutBusy.ToString()).Any()) return Location;
                        }
                        else
                        {
                            if (stationinfoRepository.Find(x => x.line == Location.line && x.area == Location.area && x.stationType == stationinfo.stationType && x.location_state != LocationStateEnum.OutBusy.ToString()).Any()) return Location;
                        }
                    }
                    //TargetLocation = stationinfoRepository.Find(x => x.stationType == agvtask.agv_materielid && x.location_state == LocationStateEnum.InBusy.ToString() && (x.area == "1" || x.area == "2" || x.area == "3" || x.area == "4")).FirstOrDefault();
                    //if (TargetLocation != null)
                    //{
                    //    if (stationinfoRepository.Find(x => x.line == TargetLocation.line && x.column == 1 && x.stationType == stationinfo.stationType).Any()) return TargetLocation;
                    //    if (TargetLocation.area == "1")
                    //    {
                    //        TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();//按行存放
                    //        if (TargetLocation != null)
                    //        {
                    //            if (!stationinfoRepository.Find(x => x.column == TargetLocation.column && x.area == TargetLocation.area /*&& x.enable*/ && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                    //                return TargetLocation;
                    //        }
                    //    }
                    //    else
                    //    {
                    //        TargetLocation = stationinfoRepository.Find(x => x.line == TargetLocation.line && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == TargetLocation.area).OrderBy(x => x.column).FirstOrDefault();
                    //        if (TargetLocation != null)
                    //        {
                    //            if (!stationinfoRepository.Find(x => x.line == TargetLocation.line && x.area == TargetLocation.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any())
                    //                return TargetLocation;
                    //        }
                    //    }
                    //}
                    #endregion
                    #region æœªæ‰¾åˆ°åº“存或当前库存行已满,寻找新的一行
                    //var area1 = string.IsNullOrEmpty(mesinfo.area) ? GetArea(mesinfo.quantity, e) : mesinfo.area;(area == "2" ? 1 : 10)
                    //var area = string.IsNullOrEmpty(mesinfo.area) ? GetArea(mesinfo.quantity, stationinfo.tray_type) : mesinfo.area;
                    var area = GetArea(mesinfo.quantity, stationinfo.tray_type);
                    TargetLocation = stationinfoRepository.Find(x => x.column == 1 && x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable).OrderBy(x => x.line).ThenBy(x => x.column).FirstOrDefault();
                    var area = GetArea(mesinfo.quantity, agvtask.agv_Traytype);
                    TargetLocation = stationinfoRepository.Find(x => x.column == (area == "2" ? 1 : 2) && x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable).OrderBy(x => x.line).FirstOrDefault();
                    if (TargetLocation == null && area != "4")
                    {
                        if (area == "2")
                            area = "3";
                        else if (area == "3")
                            area = "2";
                        TargetLocation = stationinfoRepository.Find(x => x.column == 1 && x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable).OrderBy(x => x.line).ThenBy(x => x.column).FirstOrDefault();
                        if (TargetLocation == null)
                            TargetLocation = stationinfoRepository.Find(x => x.line == 2 && x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == "1").OrderBy(x => x.column).FirstOrDefault();
                        area = area == "2" ? "3" : "2";
                        TargetLocation = stationinfoRepository.Find(x => x.column == (area == "2" ? 1 : 2) && x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable).OrderBy(x => x.line).FirstOrDefault();
                    }
                    #region æŸ¥çœ‹å½“前空货位后是否存在有料
                    if (TargetLocation != null)
                        //if (GetStation.QueueStation(TargetLocation.stationCode)) TargetLocation = null;
                        if (!GetStation.QueueStation(TargetLocation.stationCode)) return TargetLocation;
                    #endregion
                    #endregion
                    #region å¯»æ‰¾å¯¹åº”库区空货位
                    var TargetLocations = area1 == "4" ? stationinfoRepository.Find(x => x.location_state == LocationStateEnum.Empty.ToString() && x.enable && x.area == "4").OrderBy(x => x.line).ThenBy(x => x.column).ToList()
                        : stationinfoRepository.Find(x => x.location_state == LocationStateEnum.Empty.ToString() && x.enable && (x.area == "2" || x.area == "3")).OrderBy(x => x.line).ThenBy(x => x.column).ToList();
                    foreach (var Location in TargetLocations)
                    {
                        if (TargetLocation.area == "1")
                        {
                            //第一行不为空货位则不能放置第二行
                            if (stationinfoRepository.Find(x => x.column == TargetLocation.column && x.area == TargetLocation.area && x.location_state != LocationStateEnum.Empty.ToString() && x.line == 1).Any()) TargetLocation = null;
                        }
                        else
                        {
                            if (stationinfoRepository.Find(x => x.line == TargetLocation.line && x.area == TargetLocation.area && x.location_state != LocationStateEnum.Empty.ToString()).Any()) TargetLocation = null;
                        }
                        if (stationinfoRepository.Find(x => x.line == Location.line && x.area == Location.area && x.Number == agvtask.jobID).Any())
                            if (!stationinfoRepository.Find(x => x.line == Location.line && x.area == Location.area && x.location_state == LocationStateEnum.OutBusy.ToString()).Any() && !GetStation.QueueStation(Location.stationCode)) return Location;
                    }
                    #endregion
                    #endregion
                    if (TargetLocation == null) throw new Exception("库位已满");
                    //if (TargetLocation == null) throw new Exception("库位已满");
                    return TargetLocation;
                }
                catch (Exception ex)
@@ -297,12 +224,10 @@
                                    return TargetLocation;
                            }
                        }
                        //if (TargetLocation != null) return TargetLocation;
                    }
                    #endregion
                    #region æœªæ‰¾åˆ°åº“存或当前库存行已满,寻找新的一行
                    //var area1 = string.IsNullOrEmpty(mesinfo.area) ? GetArea(mesinfo.quantity, e) : mesinfo.area;
                    var area = string.IsNullOrEmpty(mesinfo.area) ? GetArea(mesinfo.quantity, stationinfo.tray_type) : mesinfo.area;
                    TargetLocation = stationinfoRepository.Find(x => x.column == (area == "2" ? 1 : 10) && x.area == area && x.location_state == LocationStateEnum.Empty.ToString() && x.enable).OrderBy(x => x.line).ThenBy(x => x.column).FirstOrDefault();
                    if (TargetLocation == null)