| | |
| | | using HH.WCS.Mobox3.YNJT_BZP.api; |
| | | using HH.WCS.Mobox3.YNJT_BZP.dispatch; |
| | | using HH.WCS.Mobox3.YNJT_BZP.models; |
| | | using HH.WCS.Mobox3.YNJT_BZP.models.other; |
| | | using HH.WCS.Mobox3.YNJT_BZP.util; |
| | |
| | | using NLog.Fluent; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Reflection; |
| | |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取空托开始货位 |
| | | /// </summary> |
| | | /// <param name="trayType"></param> |
| | | /// <returns></returns> |
| | | public static Location GetEmptyTrayStartLoc(int trayType) |
| | | /// <summary> |
| | | /// 获取空托开始货位 |
| | | /// </summary> |
| | | /// <param name="trayType"></param> |
| | | /// <param name="exclude">是否排除母拖缓存位 0.不排除 1.排除</param> |
| | | /// <returns></returns> |
| | | public static Location GetEmptyTrayStartLoc(int trayType ,int exclude = 1) |
| | | { |
| | | Location result = null; |
| | | try |
| | | { |
| | | // 1、查询当前库区-排-物料 有托盘的货位 |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | result = db.Queryable<Location>() |
| | | var query = db.Queryable<Location>() |
| | | .LeftJoin<LocCntrRel>((a, b) => a.S_CODE == b.S_LOC_CODE) |
| | | .LeftJoin<Container>((a, b, c) => b.S_CNTR_CODE == c.S_CODE) |
| | | .LeftJoin<CntrItemRel>((a,b,c,d) => c.S_CODE == d.S_CNTR_CODE) |
| | | .Where((a, b, c, d) => a.S_AREA_CODE == Settings.storeAreaCode && (trayType == 0 && a.N_CURRENT_NUM == 1 || trayType > 0 && a.N_CURRENT_NUM > 0) && a.N_LOCK_STATE == 0 && (a.C_ENABLE != "禁用" && a.C_ENABLE != "N") && c.N_TYPE == trayType && d.S_ITEM_CODE == null) |
| | | .OrderByDescending((a, b, c, d) => a.N_LAYER) |
| | | .First(); |
| | | .LeftJoin<CntrItemRel>((a, b, c, d) => c.S_CODE == d.S_CNTR_CODE) |
| | | .Where((a, b, c, d) => a.S_AREA_CODE == Settings.storeAreaCode && (trayType == 0 && a.N_CURRENT_NUM == 1 || trayType > 0 && a.N_CURRENT_NUM > 0) && a.N_LOCK_STATE == 0 && (a.C_ENABLE != "禁用" && a.C_ENABLE != "N") && c.N_TYPE == trayType && d.S_ITEM_CODE == null); |
| | | |
| | | if (exclude == 1) |
| | | { |
| | | List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList(); |
| | | query = query.Where((a, b, c, d) => !bufferInLocs.Contains(a.S_CODE)); |
| | | } |
| | | else |
| | | { |
| | | List<string> bufferInLocs = Settings.baseTrayBufferLocList.Select(a => a.bufferInLoc).ToList(); |
| | | query = query.OrderByDescending((a, b, c, d) => bufferInLocs.Contains(a.S_CODE)); |
| | | } |
| | | |
| | | result = query.OrderByDescending((a, b, c, d) => a.N_LAYER).First(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// </summary> |
| | | /// <param name="itemCode"></param> |
| | | /// <param name="jbLoc"></param> |
| | | /// <param name="trayCode"></param> |
| | | /// <returns></returns> |
| | | public static Location GetoutStockStartLoc(string itemCode ,string jbLoc = null) |
| | | public static Location GetoutStockStartLoc(string itemCode ,string trayCode = null ,string jbLoc = null) |
| | | { |
| | | LogHelper.Info("【获取出库开始货位】", "WMS"); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | |
| | | && c.S_EFFECTIVE_TIME != null |
| | | && c.S_EXPIRATION_TIME != null |
| | | ); |
| | | |
| | | if (trayCode != null) |
| | | { |
| | | query = query.Where((a, b, c) => c.S_CNTR_CODE == trayCode); |
| | | } |
| | | |
| | | if (jbLoc != null) |
| | | { |
| | |
| | | |
| | | /// <summary> |
| | | /// 获取入库终点货位 |
| | | /// 入库策略 |
| | | /// 1.巷道均衡 |
| | | /// 2.物料均衡 |
| | | /// </summary> |
| | | /// <param name="locCode"></param> |
| | | /// <param name="trayType"></param> |
| | | /// <param name="inWay">入库方式 1.自动入库 2.人工入库</param> |
| | | /// <returns></returns> |
| | | public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1) |
| | | public static Location GetInstockEndLoc(int trayType , string locCode = null , int inWay = 1 ,string itemCode = null) |
| | | { |
| | | LogHelper.Info("【获取入库终点货位】开始获取入库终点货位", "WMS"); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | |
| | | LogHelper.Info($"【获取入库终点货位】满足条件的空货位数量:{locList.Count}", "WMS"); |
| | | } |
| | | |
| | | |
| | | LogHelper.Info($"【获取入库终点货位】开始查询巷道的容积率", "WMS"); |
| | | var roadwayVolumeList = db.Queryable<Location>() |
| | | .Where(a => a.N_CURRENT_NUM == 0 && a.S_AREA_CODE == Settings.storeAreaCode && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && roadwayList.Contains(a.N_ROADWAY) && layerList.Contains(a.N_LAYER)) |
| | |
| | | .Select(a => new { roadway = a.N_ROADWAY , num = SqlFunc.AggregateDistinctCount(a.S_CODE)}) |
| | | .OrderBy(a => a.num) |
| | | .ToList(); |
| | | LogHelper.Info($"【获取入库终点货位】查询巷道的容积率,并按从大到小排序:{JsonConvert.SerializeObject(roadwayVolumeList)}", "WMS"); |
| | | LogHelper.Info($"【获取入库终点货位】查询巷道的容积率,并按从小到大排序:{JsonConvert.SerializeObject(roadwayVolumeList)}", "WMS"); |
| | | |
| | | Dictionary<int,int> roadwayDic = new Dictionary<int,int>(); |
| | | foreach (var item in roadwayVolumeList) |
| | | { |
| | | roadwayDic.Add(item.roadway, item.num); |
| | | } |
| | | |
| | | LogHelper.Info($"【获取入库终点货位】开始查询巷道的同物料数量", "WMS"); |
| | | var roadwayItemNumList = 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.storeAreaCode && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y" && roadwayList.Contains(a.N_ROADWAY) && layerList.Contains(a.N_LAYER)) |
| | | .GroupBy((a, b, c) => a.N_ROADWAY) |
| | | .Select((a, b, c) => new { roadway = a.N_ROADWAY, volumNum = SqlFunc.AggregateDistinctCount(c.S_ITEM_CODE == itemCode) }) |
| | | .ToList(); |
| | | LogHelper.Info($"【获取入库终点货位】查询巷道的同物料数量,并按从小到到排序:{JsonConvert.SerializeObject(roadwayItemNumList)}", "WMS"); |
| | | |
| | | roadwayItemNumList = roadwayItemNumList.OrderBy(a => a.volumNum).ThenBy(a => roadwayDic[a.roadway]).ToList(); |
| | | |
| | | if (inWay == 1) |
| | | { |
| | | LogHelper.Info($"【获取入库终点货位】开始循环查询巷道对应接驳位的状态", "WMS"); |
| | | foreach (var roadwayVolume in roadwayVolumeList) |
| | | foreach (var roadwayVolume in roadwayItemNumList) |
| | | { |
| | | int roadway = 0; |
| | | if (roadwayVolume != null) |
| | | { |
| | | roadway = roadwayVolume.roadway; |
| | | } |
| | | int roadway = roadwayVolume.roadway; |
| | | LogHelper.Info($"【获取入库终点货位】查询巷道内堆垛机的设备状态", "WMS"); |
| | | |
| | | var agvJbLocList = Settings.getAgvJBLocList(inWay, roadway, 1); |
| | | List<string> deviceNos = new List<string>() { roadway.ToString()}; |
| | | LogHelper.Info($"调用WCS的设备状态查询接口,参数:{deviceNos}", "WMS"); |
| | | var deviceStatuses = WCSDispatch.getDeviceStatus(deviceNos); |
| | | |
| | | var agvJbLocList = Settings.getAgvJBLocList( roadway, 1); |
| | | if (agvJbLocList.Count > 0) |
| | | { |
| | | foreach (var agvLocCode in agvJbLocList) |
| | |
| | | return db.Queryable<Location>().Where(a => a.S_AREA_CODE == Settings.errorBufferArea && a.N_CURRENT_NUM == 0 && a.N_LOCK_STATE == 0 && a.C_ENABLE == "Y").First(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取库区排的货位列表 |
| | | /// </summary> |
| | | /// <param name="area"></param> |
| | | /// <param name="row"></param> |
| | | /// <returns></returns> |
| | | public static List<Location> GetLocationList(string area , int row) { |
| | | List<Location> result = new List<Location> (); |
| | | try { |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | |
| | | public static bool updateShiftOrderDetail(TN_YiKuDetail detail) { |
| | | bool result = false; |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | ///获取空托缓存信号列表 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public static List<EmptyTrayBuffer> getEmptyTrayBufferList() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | return db.Queryable<EmptyTrayBuffer>().Where(a => a.IS_CREATED == "N").ToList(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 添加空托缓存信号 |
| | | /// </summary> |
| | | /// <param name="emptyTrayBuffer"></param> |
| | | /// <returns></returns> |
| | | public static bool addEmptyTrayBuffer(EmptyTrayBuffer emptyTrayBuffer) |
| | | { |
| | | bool result = true; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | result = db.Insertable<EmptyTrayBuffer>(emptyTrayBuffer).ExecuteCommand() > 0; |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新空托缓存信号 |
| | | /// </summary> |
| | | /// <param name="emptyTrayBuffer"></param> |
| | | /// <returns></returns> |
| | | public static bool updateEmptyTrayBuffer(EmptyTrayBuffer emptyTrayBuffer) |
| | | { |
| | | bool result = true; |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | result = db.Updateable<EmptyTrayBuffer>(emptyTrayBuffer).ExecuteCommand() > 0; |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 批量添加物料条码信息 |
| | | /// </summary> |
| | | /// <returns></returns> |
| | |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | itemBarcodeInfos.ForEach(a => { |
| | | var bo = db.Insertable<ItemBarcodeInfo>(a).ExecuteCommand() > 0; |
| | | if (!bo) |
| | | itemBarcodeInfos.ForEach(item => { |
| | | var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == item.S_BC_ENTRIED).First(); |
| | | if (itemBarcodeInfo == null) |
| | | { |
| | | result = false; |
| | | LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(a)}", "GT"); |
| | | var bo = db.Insertable<ItemBarcodeInfo>(item).ExecuteCommand() > 0; |
| | | if (!bo) |
| | | { |
| | | result = false; |
| | | LogHelper.Info($"添加物料条码信息失败,物料条码信息:{JsonConvert.SerializeObject(item)}", "GT"); |
| | | } |
| | | } |
| | | }); |
| | | if (result) |
| | |
| | | { |
| | | db.BeginTran(); |
| | | updateMatlStatuses.ForEach(update => { |
| | | var bo = db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand() > 0; |
| | | if (!bo) |
| | | var itemBarcodeInfo = db.Queryable<ItemBarcodeInfo>().Where(a => a.S_BC_ENTRIED == update.bc_entried).First(); |
| | | if (itemBarcodeInfo != null) |
| | | { |
| | | result = false; |
| | | LogHelper.Info($"批量更新物料状态失败,物料条码信息:{JsonConvert.SerializeObject(update)}", "GT"); |
| | | itemBarcodeInfo.S_JDGE = update.jdge; |
| | | db.Updateable(itemBarcodeInfo).ExecuteCommand(); |
| | | var cntrItemRel = db.Queryable<CntrItemRel>().Where(a => a.S_CG_ID == update.bc_entried).First(); |
| | | if (cntrItemRel != null) |
| | | { |
| | | // 将MES的物料状态转化成WMS可识别的物料状态 |
| | | if (update.jdge == "" || update.jdge == null) |
| | | { |
| | | update.jdge = "OK"; |
| | | } |
| | | else if (update.jdge != "OK") |
| | | { |
| | | update.jdge = "HOLD"; |
| | | } |
| | | db.Updateable<CntrItemRel>().SetColumns(a => new CntrItemRel() { S_ITEM_STATE = update.jdge }).Where(a => a.S_CG_ID == update.bc_entried).ExecuteCommand(); |
| | | } |
| | | } |
| | | }); |
| | | if (result) |
| | | { |
| | | db.CommitTran(); |
| | | } |
| | | else |
| | | { |
| | | db.RollbackTran(); |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"批量更新物料状态错误,错误信息:{ex.Message}", "GT"); |
| | | db.RollbackTran(); |
| | | result = false; |
| | | } |
| | | return result; |
| | | } |
| | |
| | | db.BeginTran(); |
| | | foreach (Overage overage in overages) |
| | | { |
| | | bool bo = false; |
| | | var overage1 = db.Queryable<Overage>().Where(a => a.MCNGRP == overage.MCNGRP && a.ITEMPATT == overage.ITEMPATT).First(); |
| | | var overage1 = db.Queryable<Overage>().Where(a => a.RECID == overage.RECID).First(); |
| | | if (overage1 != null) |
| | | { |
| | | overage1.MCNGRP = overage.MCNGRP; |
| | | overage1.ITEMPATT = overage.ITEMPATT; |
| | | overage1.OVERAGE = overage.OVERAGE; |
| | | overage1.MINHOUR = overage.MINHOUR; |
| | | overage1.FLAG_STS = overage.FLAG_STS; |
| | | bo = db.Updateable(overage1).ExecuteCommand() > 0; |
| | | db.Updateable(overage1).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | overage1 = new Overage() |
| | | { |
| | | MCNGRP = overage.MCNGRP, |
| | | ITEMPATT = overage.ITEMPATT, |
| | | OVERAGE = overage.OVERAGE, |
| | | MINHOUR = overage.MINHOUR, |
| | | FLAG_STS = overage.FLAG_STS |
| | | }; |
| | | bo = db.Insertable(overage1).ExecuteCommand() > 0; |
| | | } |
| | | if (!bo) |
| | | { |
| | | result = false; |
| | | LogHelper.Info($"批量更新物料存放时间配置信息失败,配置信息:{JsonConvert.SerializeObject(overage)}", "GT"); |
| | | break; |
| | | db.Insertable(overage).ExecuteCommand(); |
| | | } |
| | | } |
| | | |
| | | if (result) |
| | | { |
| | | db.CommitTran(); |
| | | } |
| | | else |
| | | { |
| | | db.RollbackTran(); |
| | | } |
| | | db.CommitTran(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"批量更新物料存放时间配置信息错误,错误信息:{ex.Message}", "GT"); |
| | | db.RollbackTran(); |
| | | result = false; |
| | | } |
| | | return result; |
| | | } |
| | |
| | | /// <returns></returns> |
| | | public static Overage getOverage(string bc_entried) |
| | | { |
| | | Overage overage = null; |
| | | |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | overage = db.Queryable<Overage>().Where(a => a.ITEMPATT == bc_entried && a.MCNGRP == "1").First(); |
| | | |
| | | if (overage == null) |
| | | { |
| | | string sub = bc_entried.Substring(0, 3); |
| | | overage = db.Queryable<Overage>().Where(a => a.ITEMPATT.Contains(sub) && a.MCNGRP == "1").First(); |
| | | } |
| | | // 直接执行 SQL(参数化查询) |
| | | var sql = "SELECT get_ovg_bar(@barcode, @mcngrp) AS overage_value"; |
| | | var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value"; |
| | | |
| | | if (overage == null) |
| | | // 使用匿名对象传递参数 |
| | | var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}).First(); |
| | | var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}).First(); |
| | | Overage overage = new Overage() |
| | | { |
| | | string sub = bc_entried.Substring(0, 7); |
| | | overage = db.Queryable<Overage>().Where(a => a.ITEMPATT.Contains(sub) && a.MCNGRP == "1").First(); |
| | | } |
| | | MINHOUR = minhour_bar, |
| | | OVERAGE = ovg_bar |
| | | }; |
| | | return overage; |
| | | } |
| | | |
| | |
| | | try |
| | | { |
| | | db.BeginTran(); |
| | | result = db.Insertable(record).ExecuteCommand()> 0; |
| | | var synDataTimeRecord = db.Queryable<SynDataTimeRecord>().Where(a => a.S_SYN_TIME == record.S_SYN_TIME && a.RECORD_TABLE == record.RECORD_TABLE).First(); |
| | | if (synDataTimeRecord == null) |
| | | { |
| | | result = db.Insertable(record).ExecuteCommand() > 0; |
| | | } |
| | | else |
| | | { |
| | | synDataTimeRecord.N_SYN_NUM = record.N_SYN_NUM; |
| | | synDataTimeRecord.S_SYN_TIME = record.S_SYN_TIME; |
| | | result = db.Updateable(synDataTimeRecord).ExecuteCommand() > 0; |
| | | } |
| | | |
| | | if (result) |
| | | { |
| | | db.CommitTran(); |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | LogHelper.Info($"添加同步数据时间记录错误,错误信息:{ex.Message}", "GT"); |
| | | LogHelper.Info($"添加数据同步时间记录错误,错误信息:{ex.Message}", "GT"); |
| | | db.RollbackTran(); |
| | | } |
| | | return result; |