using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using iWareSql; using System.Data.Entity.Migrations; using iWareSql.Orm; using iWareCommon; using iWareCommon.Utils; using iWareSql.Entity.ViewMode; using iWareSql.DBModel; using iWareModel; using iWareCommon.Common.Globle; using XiGang.Core.Model; namespace iWareSql.DataAccess { /// /// 库存处理类 /// public class StoreHandler { private static readonly object lockObject = new object(); private static readonly object lockRemoveObject = new object(); private static Dictionary lockPlaceDict = new Dictionary(); /// /// 增加空托盘的库存 /// /// /// /// public static void AddStoreForEmptySalverTransfer(DbModel edm, string remark, Base_Station place, int qty, string user, ref Base_Salver salver, ref Base_Material newMaterial) { //绑定托盘和站点的关系 //新建物料 newMaterial = MaterialHandler.CreateEmptySlaverMaterial(edm, remark, qty); //判断托盘是否存在,如果存在,就不需要重建,如果不存在,就新建托盘 salver = SalverHandler.CreateVirtualSalver(edm, remark); //绑定托盘和物料的关系 Salver_Material_Handler.CreateCvIRelation(edm, user, salver, newMaterial, remark); //绑定托盘和站点的关系 Salver_Station_Handler.CreateCvPRelation(edm, user, salver, place, Salver_V_Station_StateEnum.入库绑定, remark); } /// /// 根据RGV站点号获取库存 /// /// /// /// public static V_AllStore GetV_AllStoreByRgvStationCode(DbModel context, string rgvStationCode) { return context.V_AllStore.Where(x => x.RgvStationCode == rgvStationCode).FirstOrDefault(); } /// /// 根据库位ID获取库存 /// /// /// /// public static V_AllStore GetV_AllStoreByPlaceId(DbModel context, int placeId) { return context.V_AllStore.Where(x => x.StationId == placeId).FirstOrDefault(); } /// /// 发动机是否有货 /// /// /// true:系统有货,false:系统无货 public static bool IsSys_HasCatogryForOrderNo(DbModel context, string orderNo, ref V_AllStore store) { store = context.V_AllStore.Where(x => x.OrderNo == orderNo).FirstOrDefault(); if (store != null) {//有货 return true; } return false; } /// /// 托盘是否有货 /// /// /// true:系统有货,false:系统无货 public static bool IsSys_HasCatogryForSalverCode(DbModel context, string salverCode, ref V_AllStore store) { store = context.V_AllStore.Where(x => x.SalverCode == salverCode).FirstOrDefault(); if (store != null) {//有货 return true; } return false; } #region 出库计划下发时,寻找库存 /// /// 出库计划下发时,寻找库存 /// /// /// /// /// 缺料原因 public static V_Store FindStoreForOutPlan(DbModel context, Plan_OutTaskDetail outDetailTask, ref string errMsg, ref string queliaoReason) { var isOrderByInStoreTimeForOut = Base_CodeItemsHandler.IsOrderByInStoreTimeForOut(context); List findStoreList = null; if (outDetailTask.StationId != null && outDetailTask.StationId > 0) { findStoreList = context.V_Store.Where(x => x.StationId == outDetailTask.StationId && x.StationIsHasTaskDoing == false && x.StationIsLock == false && x.StationIsDeleted == false).ToList(); } else if (!string.IsNullOrEmpty(outDetailTask.SerialNumber)) {//按序列号出库 findStoreList = context.V_Store.Where(x => x.SerialNumber == outDetailTask.SerialNumber && x.StationIsHasTaskDoing == false && x.StationIsLock == false && x.StationIsDeleted == false).ToList(); } else if (!string.IsNullOrEmpty(outDetailTask.OrderNo)) {//按订货号出库,按照入库时间升序排序 findStoreList = context.V_Store.Where(x => x.OrderNo == outDetailTask.OrderNo && x.StationIsHasTaskDoing == false && x.StationIsLock == false && x.StationIsDeleted == false).ToList(); //增加动态排序 【Editby shaocx,2024-07-02】 if (isOrderByInStoreTimeForOut.data) { findStoreList = findStoreList.OrderBy(x => x.InStoreTime).ToList();//按照入库时间排序 } else { findStoreList = findStoreList.OrderBy(x => x.SerialNumber).ToList();//按照序列化排序 } } else { throw new Exception("出库明细既不是按照序列号出库,也不是按照订货号出库,明细ID:" + outDetailTask.Id); } if (findStoreList == null || findStoreList.Count == 0) { errMsg = "未找到库存,序列号:" + (string.IsNullOrEmpty(outDetailTask.SerialNumber) ? "" : outDetailTask.SerialNumber) + ",订货号:" + (string.IsNullOrEmpty(outDetailTask.OrderNo) ? "" : outDetailTask.OrderNo) + ",计划号:" + outDetailTask.M_PlanNo; queliaoReason = "立体库中无库存"; return null; } else { //过滤掉 堆垛机故障的库区 findStoreList = StationHandler.FindPlacesFilterByBreakdown(findStoreList);//通过设备状态来过滤库位 [EditBy shaocx,2020-12-13] } if (findStoreList == null || findStoreList.Count == 0) { errMsg = "未找到库存,序列号:" + (string.IsNullOrEmpty(outDetailTask.SerialNumber) ? "" : outDetailTask.SerialNumber) + ",订货号:" + (string.IsNullOrEmpty(outDetailTask.OrderNo) ? "" : outDetailTask.OrderNo) + ",计划号:" + outDetailTask.M_PlanNo; queliaoReason = "有库存,但由于该区域堆垛机故障,不能出库"; return null; } //重新排序 if (isOrderByInStoreTimeForOut.data) { findStoreList = findStoreList.OrderBy(x => x.InStoreTime).ToList();//按照入库时间排序 } else { findStoreList = findStoreList.OrderBy(x => x.SerialNumber).ToList();//按照序列化排序 } List new_findStoreList = new List(); //增加该库位是否被任务占用的筛选 [EditBy shaocx,2022-06-02] if (findStoreList != null && findStoreList.Count > 0) { foreach (var _findStore in findStoreList) { var isExistOtherTaskDoing = PartTaskHandler.IsExistOtherTaskDoing(context, _findStore.StationId); if (!isExistOtherTaskDoing) { new_findStoreList.Add(_findStore); } } } //重新排序 //new_findStoreList = new_findStoreList.OrderBy(x => x.InStoreTime).ToList(); if (isOrderByInStoreTimeForOut.data) { new_findStoreList = new_findStoreList.OrderBy(x => x.InStoreTime).ToList();//按照入库时间排序 } else { new_findStoreList = new_findStoreList.OrderBy(x => x.SerialNumber).ToList();//按照序列化排序 } V_Store findStore = new_findStoreList.FirstOrDefault(); if (findStore == null) { errMsg = "未找到库存,序列号:" + (string.IsNullOrEmpty(outDetailTask.SerialNumber) ? "" : outDetailTask.SerialNumber) + ",订货号:" + (string.IsNullOrEmpty(outDetailTask.OrderNo) ? "" : outDetailTask.OrderNo) + ",计划号:" + outDetailTask.M_PlanNo; queliaoReason = "有库存,但由于该库位被其他任务占用,不能出库"; return null; } return findStore; } /// /// 出库计划下发时,寻找库存,库存从虚拟库存中查找 【Editby shaocx,2022-07-28】 /// /// /// /// public static Wms_VirtualStore FindStoreForOutPlanByVirtual(DbModel context, Plan_OutTaskDetail outDetailTask, ref string errMsg) { var isOrderByInStoreTimeForOut = Base_CodeItemsHandler.IsOrderByInStoreTimeForOut(context); List findStoreList = null; if (outDetailTask.StationId != null && outDetailTask.StationId > 0) { return null; } else if (!string.IsNullOrEmpty(outDetailTask.SerialNumber)) {//按序列号出库 findStoreList = context.Wms_VirtualStore.Where(x => x.SerialNumber == outDetailTask.SerialNumber && (x.IsDeleted == null || x.IsDeleted == false) //只查没有被锁定的库存数据 ).ToList(); } else if (!string.IsNullOrEmpty(outDetailTask.OrderNo)) {//按订货号出库,按照入库时间升序排序 findStoreList = context.Wms_VirtualStore.Where(x => x.OrderNo == outDetailTask.OrderNo && (x.IsDeleted == null || x.IsDeleted == false) //只查没有被锁定的库存数据 ).ToList(); if (isOrderByInStoreTimeForOut.data) { findStoreList = findStoreList.OrderBy(x => x.InStoreTime).ToList();//按照入库时间排序 } else { findStoreList = findStoreList.OrderBy(x => x.SerialNumber).ToList();//按照序列化排序 } } else { throw new Exception("出库明细既不是按照序列号出库,也不是按照订货号出库,明细ID:" + outDetailTask.Id); } if (findStoreList == null || findStoreList.Count == 0) { errMsg = "未找到库存,序列号:" + (string.IsNullOrEmpty(outDetailTask.SerialNumber) ? "" : outDetailTask.SerialNumber) + ",订货号:" + (string.IsNullOrEmpty(outDetailTask.OrderNo) ? "" : outDetailTask.OrderNo) + ",计划号:" + outDetailTask.M_PlanNo; return null; } else { } if (findStoreList == null || findStoreList.Count == 0) { errMsg = "未找到库存,序列号:" + (string.IsNullOrEmpty(outDetailTask.SerialNumber) ? "" : outDetailTask.SerialNumber) + ",订货号:" + (string.IsNullOrEmpty(outDetailTask.OrderNo) ? "" : outDetailTask.OrderNo) + ",计划号:" + outDetailTask.M_PlanNo; return null; } //重新排序 if (isOrderByInStoreTimeForOut.data) { findStoreList = findStoreList.OrderBy(x => x.InStoreTime).ToList();//按照入库时间排序 } else { findStoreList = findStoreList.OrderBy(x => x.SerialNumber).ToList();//按照序列化排序 } Wms_VirtualStore findStore = findStoreList.FirstOrDefault(); if (findStore == null) { errMsg = "未找到库存,序列号:" + (string.IsNullOrEmpty(outDetailTask.SerialNumber) ? "" : outDetailTask.SerialNumber) + ",订货号:" + (string.IsNullOrEmpty(outDetailTask.OrderNo) ? "" : outDetailTask.OrderNo) + ",计划号:" + outDetailTask.M_PlanNo; return null; } return findStore; } #endregion /// /// 校验库存是否允许被出库 /// /// /// /// private static bool ValidateStoreIsAllowOut(V_Store findStore, ref string errMsg) { var stationName = "库号:" + findStore.SrmStationCode; if (findStore.StationIsLock == true) { errMsg = stationName + "被锁定,不允许出库"; return false; } if (findStore.StationIsDeleted == true) { errMsg = stationName + "被禁用,不允许出库"; return false; } if (findStore.StationIsHasTaskDoing == true) { errMsg = stationName + "有任务被占用,不允许出库"; return false; } return true; } /// /// 根据库位Id去清空库存(慎用!) /// /// public static void ClearStockByPlaceId(DbModel edm, Base_Station place, string remark) { try { if (place != null) { place.Remark = remark; place.IsFull = false; place.IsLock = false; var cvps = edm.Base_Salver_V_Station.Where(x => x.StationId == place.Id); List removeCVP = new List(); List removeIVC = new List(); #region 计算 if (cvps != null) { foreach (var cvp in cvps) { removeCVP.Add(cvp); var cviList = edm.Base_Salver_V_Material.Where(x => x.SalverId == cvp.SalverId).ToList(); if (cviList != null) { foreach (var item in cviList) { removeIVC.Add(item); } } } } #endregion foreach (var item in removeCVP) { edm.Base_Salver_V_Station.Remove(item); } foreach (var item in removeIVC) { edm.Base_Salver_V_Material.Remove(item); //删除物料表 var material = edm.Base_Material.Where(x => x.Id == item.MaterialId).FirstOrDefault(); if (material != null) { edm.Base_Material.Remove(material); } } } } catch (Exception) { throw; } } /// /// 根据托盘号去清空库存(慎用!) /// /// public static void ClearStockBySalverCode(DbModel edm, Base_Salver salver, string remark) { try { if (salver != null) { var cvps = edm.Base_Salver_V_Station.Where(x => x.SalverCode == salver.SalverCode); List removeCVP = new List(); List removeIVC = new List(); #region 计算 if (cvps != null && cvps.Count() > 0) { foreach (var cvp in cvps) { removeCVP.Add(cvp); } } //增加 获取svm 数据加载 [Editby shaocx,2023-01-14] var cviList = edm.Base_Salver_V_Material.Where(x => x.SalverId == salver.Id).ToList(); if (cviList != null) { foreach (var item in cviList) { removeIVC.Add(item); } } #endregion foreach (var item in removeCVP) { //查找Station,并处理Station Base_Station station = edm.Base_Station.Where(x => x.Id == item.StationId).FirstOrDefault(); if (station != null) { station.Remark = remark; station.IsFull = false; station.IsLock = false; } edm.Base_Salver_V_Station.Remove(item); } foreach (var item in removeIVC) { edm.Base_Salver_V_Material.Remove(item); //删除物料表 var material = edm.Base_Material.Where(x => x.Id == item.MaterialId).FirstOrDefault(); if (material != null) { edm.Base_Material.Remove(material); } } } } catch (Exception) { throw; } } } }