| | |
| | | using HH.WCS.Mobox3.YNJT_BZP_PT.models; |
| | | using HH.WCS.Mobox3.YNJT_PT.api; |
| | | using HH.WCS.Mobox3.YNJT_PT.dispatch; |
| | | using HH.WCS.Mobox3.YNJT_PT.models; |
| | | using HH.WCS.Mobox3.YNJT_PT.models.other; |
| | | using HH.WCS.Mobox3.YNJT_PT.util; |
| | |
| | | var offLineRecord = db.Queryable<OffLineRecord>().Where(a => a.S_RFID == record.S_RFID).First(); |
| | | if (offLineRecord != null) |
| | | { |
| | | offLineRecord.S_LOC = record.S_LOC; |
| | | offLineRecord.S_DEVICE_NO = record.S_DEVICE_NO; |
| | | offLineRecord.N_IS_URGENT = record.N_IS_URGENT; |
| | | offLineRecord.T_OFF_TIME = record.T_OFF_TIME; |
| | | offLineRecord.N_IS_FULL = record.N_IS_FULL; |
| | |
| | | /// <summary> |
| | | /// 查询入库终点货位 |
| | | /// </summary> |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="locNum">1.单货位 2.双货位</param> |
| | | /// <returns></returns> |
| | | public static List<Location> getInStockEndLoc(string itemCode, int locNum) |
| | | public static EndLocGroup getInStockEndLoc(int locNum) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | EndLocGroup endLocGroup = new EndLocGroup(); |
| | | List<Location> locations = new List<Location>(); |
| | | // 1.按容积率从大到小,对巷道进行排序 |
| | | var roadwayOrderList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y") |
| | |
| | | .ToList(); |
| | | |
| | | // 查询单货位 |
| | | if (locNum == 1) |
| | | foreach (var order in roadwayOrderList) |
| | | { |
| | | foreach (var order in roadwayOrderList) |
| | | if (locNum == 1) |
| | | { |
| | | // 1. 查询1号货位是否有相同物料,有,则查询对应的2号货位是否为空 |
| | | var oneLocList = 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.S_AREA_CODE == Settings.stockArea |
| | | && a.N_ROADWAY == order.roadway |
| | | && a.N_COL % 2 == 1 |
| | | && a.N_CURRENT_NUM == 1 |
| | | && a.N_LOCK_STATE == 0 |
| | | && a.C_ENABLE == "Y" |
| | | && c.S_ITEM_CODE == itemCode |
| | | ) |
| | | .OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL) |
| | | .ToList(); |
| | | if (oneLocList.Count > 0) |
| | | /*// 查询所有相同物料货位 |
| | | var sameItemLocList = 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.S_AREA_CODE == Settings.stockArea |
| | | && a.N_ROADWAY == order.roadway |
| | | && a.N_CURRENT_NUM == 1 |
| | | && a.N_LOCK_STATE == 0 |
| | | && a.C_ENABLE == "Y" |
| | | && b.S_CNTR_CODE != null |
| | | && c.S_ITEM_CODE == itemCode |
| | | ) |
| | | .OrderBy((a, b, c) => new { a.N_LAYER, a.N_COL }) |
| | | .ToList(); |
| | | |
| | | // 查询相同物料的左右是否有空货位 |
| | | foreach (var loc in sameItemLocList) |
| | | { |
| | | foreach (var loc in oneLocList) |
| | | var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (leftLoc != null) |
| | | { |
| | | var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (twoLoc != null) |
| | | { |
| | | locations.Add(twoLoc); |
| | | return locations; |
| | | } |
| | | locations.Add(leftLoc); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // 2.查询2号货位是否有相同物料,有,则查询对应的1号位是否为空 |
| | | if (locations.Count == 0) |
| | | var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (rightLoc != null) |
| | | { |
| | | locations.Add(leftLoc); |
| | | break; |
| | | } |
| | | }*/ |
| | | |
| | | // 查询空货位 |
| | | var emptyLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).First(); |
| | | if (emptyLoc != null) |
| | | { |
| | | var twoLocList = 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.S_AREA_CODE == Settings.stockArea |
| | | && a.N_ROADWAY == order.roadway |
| | | && a.N_COL % 2 == 0 |
| | | && a.N_CURRENT_NUM == 1 |
| | | && a.N_LOCK_STATE == 0 |
| | | && a.C_ENABLE == "Y" |
| | | && c.S_ITEM_CODE == itemCode |
| | | ) |
| | | .OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL) |
| | | .ToList(); |
| | | |
| | | if (twoLocList.Count > 0) |
| | | { |
| | | foreach (var loc in twoLocList) |
| | | { |
| | | var oneLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (oneLoc != null) |
| | | { |
| | | locations.Add(oneLoc); |
| | | return locations; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 3.没有相同物料的,优先放禁用货位旁边(单一货位) |
| | | if (locations.Count == 0) |
| | | { |
| | | var disableLocList= db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.C_ENABLE == "N").OrderBy(a => a.N_LAYER).ToList(); |
| | | foreach (var loc in disableLocList) |
| | | { |
| | | // 货位为1号位,则查询对应二号位是否为空 |
| | | if (loc.N_LAYER % 2 == 1) |
| | | { |
| | | var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (twoLoc != null) |
| | | { |
| | | locations.Add(twoLoc); |
| | | return locations; |
| | | } |
| | | } |
| | | |
| | | // 货位为2号位,则查询对应一号位是否为空 |
| | | if (loc.N_LAYER % 2 == 0) |
| | | { |
| | | var oneLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (oneLoc != null) |
| | | { |
| | | locations.Add(oneLoc); |
| | | return locations; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 4.没有相同物料的,且禁用货位旁边没有空货位,则优先放1号位 |
| | | if (locations.Count == 0) |
| | | { |
| | | oneLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_COL % 2 == 1 && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => a.N_LAYER).OrderByDescending(a => a.N_COL).ToList(); |
| | | if (oneLocList.Count > 0) |
| | | { |
| | | locations.Add(oneLocList[0]); |
| | | return locations; |
| | | } |
| | | locations.Add(emptyLoc); |
| | | endLocGroup.endLocList = locations; |
| | | return endLocGroup; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // 查询双货位 |
| | | if (locNum == 2) |
| | | { |
| | | foreach (var order in roadwayOrderList) |
| | | if (locNum == 2) |
| | | { |
| | | var oneLocList = db.Queryable<Location>().Where( a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_COL % 2 == 1 && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => a.N_LAYER).OrderBy(a => a.N_COL).ToList(); |
| | | foreach (var loc in oneLocList) |
| | | var emptyLocList = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").OrderBy(a => new { a.N_LAYER, a.N_COL }).ToList(); |
| | | |
| | | if (emptyLocList.Count > 0) |
| | | { |
| | | var twoLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (twoLoc != null) |
| | | // 查询双拖空货位 |
| | | if (locations.Count == 0) |
| | | { |
| | | foreach (var loc in emptyLocList) |
| | | { |
| | | var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (leftLoc != null) |
| | | { |
| | | locations.Add(loc); |
| | | locations.Add(leftLoc); |
| | | break; |
| | | } |
| | | |
| | | var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == order.roadway && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (rightLoc != null) |
| | | { |
| | | locations.Add(loc); |
| | | locations.Add(leftLoc); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (locations.Count == locNum) |
| | | { |
| | | endLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo(); |
| | | endLocGroup.endLocList = locations; |
| | | return endLocGroup; |
| | | } |
| | | } |
| | | |
| | | // 查询单拖货位 |
| | | foreach (var loc in emptyLocList) |
| | | { |
| | | locations.Add(loc); |
| | | locations.Add(twoLoc); |
| | | return locations; |
| | | if (locations.Count == locNum) |
| | | { |
| | | endLocGroup.endLocList = locations; |
| | | return endLocGroup; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return endLocGroup; |
| | | } |
| | | |
| | | public class EndLocGroup |
| | | { |
| | | public string groupNo { get; set; } |
| | | public List<Location> endLocList { get; set; } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询出库开始货位 |
| | | /// 计算(1.巷道不报警、2.物料状态OK、3.小于失效时间 大于等于生效时间 4.加急料先出、5.先入先出(生产时间))出库物料 |
| | | /// </summary> |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="locNum"></param> |
| | | public static StartLocGroup getOutStockStartLoc(string itemCode, int locNum ) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | StartLocGroup startLocGroup = new StartLocGroup(); |
| | | |
| | | // 1.查询(物料状态OK ,且小于失效时间,大于等于生效时间)出库物料,并按加急料先出,先入先出(生产时间)的原则进行排序 |
| | | var query = 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.S_AREA_CODE == Settings.stockArea |
| | | && a.N_CURRENT_NUM == 1 |
| | | && a.N_LOCK_STATE == 0 |
| | | && a.C_ENABLE == "Y" |
| | | && b.S_CNTR_CODE != null |
| | | ); |
| | | |
| | | if (itemCode != null) |
| | | { |
| | | query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode |
| | | && c.S_ITEM_STATE == "OK" |
| | | && SqlFunc.ToDate(c.S_EFFECTIVE_TIME) <= SqlFunc.GetDate() // 生效时间早于当前时间 |
| | | && SqlFunc.ToDate(c.S_EXPIRATION_TIME) >= SqlFunc.GetDate() // 失效时间晚于当前时间 |
| | | && c.S_EFFECTIVE_TIME != null |
| | | && c.S_EXPIRATION_TIME != null) |
| | | .OrderByDescending((a, b, c) => c.N_URGENT_FLAG) |
| | | .OrderBy((a, b, c) => c.S_TXNDATE); |
| | | } |
| | | else |
| | | { |
| | | query = query.Where((a, b, c) => c.S_ITEM_CODE == itemCode); |
| | | } |
| | | var outLocList = query.ToList(); |
| | | |
| | | if (outLocList.Count > 0) |
| | | { |
| | | foreach (var loc in outLocList) |
| | | { |
| | | // 查询巷道是否正常,异常跳过 |
| | | var stackerStates = WCSDispatch.getStackerState(loc.N_ROADWAY); |
| | | if (stackerStates.Count == 0 || stackerStates[0].roadway_state == "0" || stackerStates[0].roadway_state == "3") |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | var cntrItemRel = db.Queryable<CntrItemRel>().LeftJoin<LocCntrRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE).Where((a, b) => b.S_LOC_CODE == loc.S_CODE).First(); |
| | | if (cntrItemRel != null) |
| | | { |
| | | startLocGroup.startLocList.Add(loc); |
| | | if (locNum == startLocGroup.startLocList.Count) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | var leftLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL - 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (leftLoc != null) |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>() |
| | | .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE) |
| | | .Where((a, b) => a.S_LOC_CODE == leftLoc.S_CODE && b.S_ITEM_CODE == itemCode) |
| | | .First(); |
| | | if (locCntrRel != null) |
| | | { |
| | | startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo(); |
| | | startLocGroup.startLocList.Add(leftLoc); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | var rightLoc = db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.stockArea && a.N_ROADWAY == loc.N_ROADWAY && a.N_ROW == loc.N_ROW && a.N_COL == loc.N_COL + 1 && a.N_LAYER == loc.N_LAYER && a.N_CURRENT_NUM == 1 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | if (rightLoc != null && startLocGroup.startLocList.Count == 0) |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>() |
| | | .LeftJoin<CntrItemRel>((a, b) => a.S_CNTR_CODE == b.S_CNTR_CODE) |
| | | .Where((a, b) => a.S_LOC_CODE == rightLoc.S_CODE && b.S_ITEM_CODE == itemCode) |
| | | .First(); |
| | | if (locCntrRel != null) |
| | | { |
| | | startLocGroup.groupNo = WMSHelper.GenerateTaskGroupNo(); |
| | | startLocGroup.startLocList.Add(rightLoc); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return locations; |
| | | return startLocGroup; |
| | | |
| | | } |
| | | |
| | | public class StartLocGroup |
| | | { |
| | | public string groupNo { get; set; } |
| | | public List<Location> startLocList { get; set; } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | { |
| | | Location location = new Location(); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | |
| | | var roadwayGroup = db.Queryable<Location>() |
| | | .LeftJoin<WCSTask>((a,b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3) |
| | | .Where((a, b) => a.S_AREA_CODE == Settings.stockArea && b.S_CODE != null ) |
| | | .GroupBy((a, b) => a.N_ROADWAY) |
| | | .Select( (a, b) => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateDistinctCount(a.S_CODE)}) |
| | | .OrderBy(a => a.num) |
| | | .ToList(); |
| | | .LeftJoin<WCSTask>((a, b) => a.S_CODE == b.S_END_LOC && b.N_B_STATE < 3) |
| | | .Where((a, b) => a.S_AREA_CODE == Settings.stockArea) |
| | | .GroupBy((a, b) => a.N_ROADWAY) |
| | | .Select((a, b) => new { roadway = a.N_ROADWAY, num = SqlFunc.AggregateDistinctCount(b.S_CODE != null) }) |
| | | .OrderBy(a => a.num) |
| | | .ToList(); |
| | | |
| | | foreach (var item in roadwayGroup) |
| | | { |
| | |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 绑定条码物料信息 |
| | | /// </summary> |
| | | /// <param name="cntrCode"></param> |
| | | /// <param name="greenTireInformation"></param> |
| | | /// <returns></returns> |
| | | public static bool bindBarcodeItemInfo( string cntrCode,GreenTireInformation greenTireInformation) |
| | | { |
| | | bool result = false; |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询硫化工单 |
| | | /// </summary> |
| | | /// <param name="dateShift"></param> |
| | | /// <param name="mcn"></param> |
| | | /// <param name="shift"></param> |
| | | /// <returns></returns> |
| | | public static ProductionShedule getProductionShedule(string dateShift ,string mcn ,string shift) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | return db.Queryable<ProductionShedule>().Where(a => a.DATESHIFT == dateShift && a.MCN == mcn && a.SHIFT == shift).First(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询胚胎完成硫化的数量 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static int getEmbryoFinishNum(string dateShift, string mcn, string shift) |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | return db.Queryable<EmbryoFinishRecord>().Where(a => a.DATE_SHIFT == dateShift && a.CUR_MCN == mcn && a.CUR_SHIFT == shift).Count(); |
| | | } |
| | | } |
| | | } |