海波 张
2 天以前 5b9da592f9bc117c88244f469418d5a5b29e4266
wms/LocationHelper.cs
@@ -4,7 +4,9 @@
using HH.WCS.ZhongCeJinTan.wms;
using Microsoft.Owin;
using Newtonsoft.Json;
using Org.BouncyCastle.Utilities;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
@@ -118,6 +120,14 @@
            return result;
        }
        internal static Location GetConnectionByEnd(string S_AREA_CODE,int rodway)
        {
            var db = new SqlHelper<object>().GetInstance();
            return db.Queryable<Location>().Where(s => s.S_AREA_CODE == S_AREA_CODE && s.C_ENABLE == "Y" &&s.CONNEC_ROADWAY==rodway).First();
        }
        /// <summary>
        /// 返回均衡的接驳位集合
        /// </summary>
@@ -138,6 +148,17 @@
                result.Add(re);
            }
            return result.OrderBy(a => a.taskCount).ToList();
        }
        /// <summary>
        /// 返回出库agv任务
        /// </summary>
        internal static WMSTask GetConnectionTask(string jbLoc,string type)
        {
            var db = new SqlHelper<object>().GetInstance();
          return db.Queryable<WMSTask>().Where(a => ( a.S_START_LOC.Contains(jbLoc)&& a.S_SCHEDULE_TYPE.Contains(type)  && a.S_B_STATE != "完成" && a.S_B_STATE != "取消" && a.S_B_STATE != "失败" && a.S_B_STATE != "已完成" && a.S_B_STATE != "未执行")).OrderBy(b=>b.T_CREATE).First();
        }
        /// <summary>
@@ -282,7 +303,7 @@
        /// </summary>
        /// <param name="locations"></param>
        /// <returns></returns>
        internal static Location FindBalanceEndcolByLocList(List<Location> locations, string endArea, string rodway = "")
        internal static Location FindBalanceEndcolByLocList(List<Location> locations, string endArea, string rodway = "",string CONNECTION = "",string taskNo="")
        {
            try
            {
@@ -293,6 +314,41 @@
                //作业流程的巷道
                var xd = new List<string>();
                //获取string接驳位集合
                var connectionList = LocationHelper.GetConnectionList(CONNECTION);
                //不可用接驳位集合
                var flaseConnectionList = LocationHelper.GetConnectionListByst(connectionList);
                List<Location> jblist = new List<Location>();
                //询问立库可用接驳位
                var usableConnectionList = WcsTask.WcsPositionAvailable(taskNo,connectionList);
                if (usableConnectionList != null && usableConnectionList.code == "0")
                {
                    var balanceConnectionList = LocationHelper.GetConnectionListByst(usableConnectionList.available);
                    List<Location> difference = flaseConnectionList
    .Where(loc1 => !balanceConnectionList.Any(loc2 => loc2.S_CODE == loc1.S_CODE))
    .ToList();
                    jblist = difference;
                    LogHelper.Info($"ZCSendTask入库任务下发不可用接驳位" + JsonConvert.SerializeObject(jblist), "Mes任务下发");
                }
                else
                {
                    LogHelper.Info($"ZCSendTask入库任务{taskNo}下发失败,接驳位返回失败", "Mes任务下发");
                    throw new Exception($"{taskNo}下发失败,接驳位返回失败");
                }
                List<RoadWayEnable> rowdwa = null;
@@ -316,6 +372,7 @@
                    var flag = false;
                    var flag1 = false;
                    var flag2 = false;
                    foreach (var item in rowdwa)
                    {
@@ -337,7 +394,17 @@
                        }
                    }
                    if (flag1 || flag)
                    foreach (var item2 in jblist)
                    {
                        if (rowList.Count(a => a.N_ROADWAY == item2.CONNEC_ROADWAY) > 0)
                        {
                            flag2 = true;
                            break;
                        }
                    }
                    if (flag1 || flag || flag2)
                    {
                       locations.RemoveAll(a => a.N_ROW == rows[i]);
                    }
@@ -353,6 +420,143 @@
                foreach (var item in balanceLocList)
                {
                    if (item.S_LOCK_STATE=="无" && item.N_CURRENT_NUM==0)
                    {
                        end = item;
                        break;
                    }
                }
                return end;
            }
            catch (Exception)
            {
                throw;
            }
        }
        /// <summary>
        /// 找终点巷道可用空货位  巷道均衡物料均衡
        /// </summary>
        /// <param name="locations"></param>
        /// <returns></returns>
        internal static Location FindBalanceEndcolByLocListItem(List<Location> locations, string endArea, string rodway = "", string CONNECTION = "", string taskNo = "",string itemCode="")
        {
            try
            {
                var db = new SqlHelper<object>().GetInstance();
                Location end = null;
                //根据终点货位找空闲货位
                var rows = locations.Select(a => a.N_ROW).Distinct().ToList();
                //作业流程的巷道
                var xd = new List<string>();
                //获取string接驳位集合
                var connectionList = LocationHelper.GetConnectionList(CONNECTION);
                //不可用接驳位集合
                var flaseConnectionList = LocationHelper.GetConnectionListByst(connectionList);
                List<Location> jblist = new List<Location>();
                //询问立库可用接驳位
                var usableConnectionList = WcsTask.WcsPositionAvailable(taskNo, connectionList);
                if (usableConnectionList != null && usableConnectionList.code == "0")
                {
                    var balanceConnectionList = LocationHelper.GetConnectionListByst(usableConnectionList.available);
                    List<Location> difference = flaseConnectionList
                    .Where(loc1 => !balanceConnectionList.Any(loc2 => loc2.S_CODE == loc1.S_CODE))
                    .ToList();
                    jblist = difference;
                    LogHelper.Info($"ZCSendTask入库任务下发不可用接驳位" + JsonConvert.SerializeObject(jblist), "Mes任务下发");
                }
                else
                {
                    LogHelper.Info($"ZCSendTask入库任务{taskNo}下发失败,接驳位返回失败", "Mes任务下发");
                    throw new Exception($"{taskNo}下发失败,接驳位返回失败");
                }
                List<RoadWayEnable> rowdwa = null;
                if (!string.IsNullOrEmpty(rodway))
                {
                    xd = rodway.Split('-').ToList();
                    rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0" && xd.Contains(x.roadWay)).ToList();
                }
                else
                {
                    //查找可用巷道
                    rowdwa = db.Queryable<RoadWayEnable>().Where(x => x.areaCode == endArea && x.status == "0").ToList();
                }
                for (int i = 0; i < rows.Count; i++)
                {
                    var rowList = locations.Where(r => r.N_ROW == rows[i]).ToList();
                    var flag = false;
                    var flag1 = false;
                    var flag2 = false;
                    foreach (var item in rowdwa)
                    {
                        if (rowList.Count(a => a.N_ROADWAY.ToString() == item.roadWay) > 0)
                        {
                            flag = true;
                            break;
                        }
                    }
                    foreach (var item1 in xd)
                    {
                        if (rowList.Count(a => a.N_ROADWAY.ToString() != item1) > 0)
                        {
                            flag1 = true;
                            break;
                        }
                    }
                    foreach (var item2 in jblist)
                    {
                        if (rowList.Count(a => a.N_ROADWAY == item2.CONNEC_ROADWAY) > 0)
                        {
                            flag2 = true;
                            break;
                        }
                    }
                    if (flag1 || flag || flag2)
                    {
                        locations.RemoveAll(a => a.N_ROW == rows[i]);
                    }
                    if (rowList.Count(a => a.N_CURRENT_NUM == 0) == 0)
                    {
                        locations.RemoveAll(a => a.N_ROW == rows[i]);
                    }
                }
                var balanceLocList = RoadWayBalance(locations);
                balanceLocList = LocationHelper.RoadWayBalance1ByItem(balanceLocList, itemCode);
                foreach (var item in balanceLocList)
                {
                    if (item.S_LOCK_STATE == "无")
                    {
                        end = item;
                        break;
@@ -566,13 +770,15 @@
                result.Add(re);
            }
               result =  result.OrderBy(a=>a.taskCount).ToList();
                foreach (var item in result)
                {
                    location_roadray.Add(item.loc);
                    var loclist = lstTrueLocation.Where(o => o.N_ROADWAY == item.loc.N_ROADWAY && o.N_CURRENT_NUM==0 ).OrderBy(b => b.N_ROW).OrderBy(b => b.N_COL).ToList();
                    foreach (var item1 in loclist)
                    {
                        location_roadray.Add(item1);
                    }
                }
@@ -1053,6 +1259,9 @@
                var balanceConnectionList = LocationHelper.GetConnectionListByst(connectionList);
                LogHelper.Info($"ZCSendTask出库任务排除不可用巷道开始", "Mes任务下发");
                //作业流程的巷道
@@ -1155,6 +1364,11 @@
                        }
                    }
                //var queryable = db.Queryable<Location>().LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE)
                //    .LeftJoin<CntrItemRel>((a, b, c) => b.S_CNTR_CODE == c.S_CNTR_CODE)
                //    .Where((a, b, c) => a.N_CURRENT_NUM > 0 && a.N_LOCK_STATE == 0 && a.S_AREA_CODE == endArea);
                    LogHelper.Info($"ZCSendTask出库任务下发起点合格物料数量{startList.Count}", "Mes任务下发");
                    var startItem = startList.OrderBy(a => a.PRODUCTIONDATE).FirstOrDefault();