using Newtonsoft.Json; using Org.BouncyCastle.Crypto; using SqlSugar; //using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.Stock; using WIDESEA_IBasicRepository; using WIDESEA_IStockRepository; using WIDESEA_Model; using WIDESEA_Model.Models; using WIDESEA_Model.Models.System.Reponse; using WIDESEA_Model.Models.System.Request; namespace WIDESEA_StockRepository { public class StockInfoRepository : RepositoryBase, IStockInfoRepository { private readonly ILabelMasterRepository _labelMasterRepository; public StockInfoRepository(IUnitOfWorkManage unitOfWorkManage, ILabelMasterRepository labelMasterRepository) : base(unitOfWorkManage) { _labelMasterRepository = labelMasterRepository; } public List GetAllStockViews() { ISugarQueryable sugarQueryable = Db.Queryable(); ISugarQueryable sugarQueryable1 = Db.Queryable(); return sugarQueryable.InnerJoin(sugarQueryable1, (a, b) => a.LocationCode == b.LocationCode).Select((a, b) => new StockViewDTO { AreaId = a.AreaId, LocationCode = b.LocationCode, Column = a.Column, CreateDate = b.CreateDate, Creater = b.Creater, Depth = a.Depth, EnalbeStatus = a.EnableStatus, IsFull = b.IsFull, Layer = a.Layer, LocationName = a.LocationName, LocationStatus = a.LocationStatus, LocationType = a.LocationType, Modifier = b.Modifier, ModifyDate = b.ModifyDate, PalletCode = b.PalletCode, StockRemark = b.Remark, RoadwayNo = a.RoadwayNo, Row = a.Row, StockId = b.Id, StockStatus = b.StockStatus, Details = b.Details, }).Includes(x => x.Details).ToList(); } public Dt_StockInfo GetStockInfo(string palletCode) { return Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); } public List GetStockInfos(string materielCode) { return Db.Queryable().Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)).ToList(); //ISugarQueryable sugarQueryable = Db.Queryable(); //ISugarQueryable sugarQueryable1 = Db.Queryable().Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)); //return sugarQueryable.InnerJoin(sugarQueryable1, (a, b) => a.LocationCode == b.LocationCode).Select((a, b) => b).Includes(x => x.Details).ToList(); } /// /// 根据批次号和物料编码获取库存信息 /// /// /// public List GetStockInfos(string materielCode, string batchNo) { return Db.Queryable().Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode && v.BatchNo == batchNo)).ToList(); } public List GetStockInfos(string materielCode, List locationCodes) { //修改只获取已上架状态的库存 return Db.Queryable().Where(x => locationCodes.Contains(x.LocationCode) && x.StockStatus == (int)StockStatusEmun.已上架).Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)).ToList(); //ISugarQueryable sugarQueryable = Db.Queryable().Where(x => locationCodes.Contains(x.LocationCode)); //ISugarQueryable sugarQueryable1 = Db.Queryable().Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)); //return sugarQueryable.InnerJoin(sugarQueryable1, (a, b) => a.LocationCode == b.LocationCode).Select((a, b) => b).OrderBy(a => a.CreateDate).Includes(a => a.Details).ToList(); } public List GetStockInfosByIds(List ids) { return Db.Queryable().Where(x => ids.Contains(x.Id)).Includes(x => x.Details).ToList(); } public List GetStockInfosByPalletCodes(List palletCodes) { return Db.Queryable().Where(x => palletCodes.Contains(x.PalletCode)).Includes(x => x.Details).ToList(); } public List GetStockInfosExclude(string materielCode, List palletCodes) { return Db.Queryable().Where(x => !palletCodes.Contains(x.PalletCode)).Includes(x => x.Details).Where(x => x.Details.Any(v => v.MaterielCode == materielCode)).ToList(); } public bool UpdateDataWithDetail(Dt_StockInfo stockInfo) { return Db.UpdateNav(stockInfo).Include(x => x.Details).ExecuteCommand(); } public Dt_StockInfo GetPalletStockInfo(string roadwayNo) { //ISugarQueryable locationCodes = Db.Queryable().Where(x => x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (x.EnalbeStatus == LocationEnalbeStatusEnum.OnlyOut.ObjToInt() || LocationEnalbeStatusEnum.Normal.ObjToInt() == x.EnalbeStatus)).Select(x => x.LocationCode); return Db.Queryable().Where(x => x.StockStatus == StockStatusEmun.已入库.ObjToInt() && SqlFunc.Subqueryable().Where(v => v.LocationCode == x.LocationCode && v.RoadwayNo == roadwayNo && v.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (EnableStatusEnum.Normal.ObjToInt() == v.EnableStatus)).Any()).OrderBy(x => x.ModifyDate).First(); } public Dt_StockInfo GetPalletStockInfo(string roadwayNo, string strayType) { //ISugarQueryable locationCodes = Db.Queryable().Where(x => x.RoadwayNo == roadwayNo && x.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (x.EnalbeStatus == LocationEnalbeStatusEnum.OnlyOut.ObjToInt() || LocationEnalbeStatusEnum.Normal.ObjToInt() == x.EnalbeStatus)).Select(x => x.LocationCode); if (strayType == "1") { return Db.Queryable().Where(x => x.StockStatus == StockStatusEmun.已入库.ObjToInt() && x.PalletCode.Substring(0, 1) == "T" && SqlFunc.Subqueryable().Where(v => v.LocationCode == x.LocationCode && v.RoadwayNo == roadwayNo && v.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (EnableStatusEnum.Normal.ObjToInt() == v.EnableStatus)).Any()).OrderBy(x => x.ModifyDate).First(); } else { return Db.Queryable().Where(x => x.StockStatus == StockStatusEmun.已入库.ObjToInt() && x.PalletCode.Substring(0, 1) == "B" && SqlFunc.Subqueryable().Where(v => v.LocationCode == x.LocationCode && v.RoadwayNo == roadwayNo && v.LocationStatus == LocationStatusEnum.Pallet.ObjToInt() && (EnableStatusEnum.Normal.ObjToInt() == v.EnableStatus)).Any()).OrderBy(x => x.ModifyDate).First(); } } /// /// 立库WMS库存信息接口,供上游系统调用 /// /// /// public InventoryQueryResponse InventoryQuery(string inventoryQueryRequeststr) { InventoryQueryResponse inventoryQueryResponse = new InventoryQueryResponse(); try { InventoryQueryRequest inventoryQueryRequest = JsonConvert.DeserializeObject(inventoryQueryRequeststr); if (inventoryQueryRequest != null) { List DATA = new List(); inventoryQueryResponse.DATA = DATA; List stockviews = GetAllStockViews(); foreach (var view in stockviews) { foreach (var detail in view.Details) { Dt_LabelMaster labelMaster = _labelMasterRepository.QueryFirst(x => x.LABEL_NO == detail.SerialNumber); StockItem stockItem = new StockItem(); stockItem.BATCH = detail.BatchNo; stockItem.LABEL_NO = detail.SerialNumber; stockItem.LGORT = "0030";//库位 if (labelMaster != null) { if (labelMaster.WH_NUMBER == inventoryQueryRequest.DATA[0].WH_NUMBER && labelMaster.WERKS == inventoryQueryRequest.DATA[0].WERKS) { stockItem.LIFNR = labelMaster.LIFNR; stockItem.LIKTX = labelMaster.LIKTX; stockItem.LK_BIN_CODE = view.LocationCode; stockItem.MAKTX = labelMaster.MAKTX; stockItem.MATNR = labelMaster.MATNR; stockItem.MEINS = labelMaster.UNIT; stockItem.QTY = labelMaster.BOX_QTY; var sobkz = "非限制"; if (labelMaster.SOBKZ == "0") { sobkz = "非限制"; } else if (labelMaster.SOBKZ == "1") { sobkz = "冻结"; } else if (labelMaster.SOBKZ == "2") { sobkz = "待质检"; } stockItem.SOBKZ = sobkz; stockItem.TPNUM = view.PalletCode; stockItem.WERKS = labelMaster.WERKS;//工厂 stockItem.WH_NUMBER = labelMaster.WH_NUMBER;//仓库号 DATA.Add(stockItem); } } } } if (DATA.Count > 0) { inventoryQueryResponse.MSGTY = "S"; inventoryQueryResponse.MSGTX = ""; } else { inventoryQueryResponse.MSGTY = "I"; inventoryQueryResponse.MSGTX = ""; } } } catch (Exception ex) { inventoryQueryResponse.MSGTY = "E"; inventoryQueryResponse.MSGTX = ex.Message; } return inventoryQueryResponse; } /// /// 立库WMS冻结/解冻信息接口,供上游系统调用 /// /// /// public freezeByCustomerResponse freezeByCustomer(string freezeRequeststr) { freezeByCustomerResponse freezeResponse = new freezeByCustomerResponse(); try { freezeByCustomerRequest freezeRequest = JsonConvert.DeserializeObject(freezeRequeststr); if (freezeRequest.WERKS == AppSettings.Configuration["WERKS"] && freezeRequest.WH_NUMBER == AppSettings.Configuration["WERKS"]) { //根据批次和物料号查找对应的托盘号,冻结库存,只有入库成功了,才能被冻结 List stockInfos = GetStockInfos(freezeRequest.MATNR, freezeRequest.BATCH); List labelInfos = _labelMasterRepository.QueryData(x => x.MATNR == freezeRequest.MATNR && x.BATCH == freezeRequest.BATCH); if (freezeRequest.YWLX == "00")//00冻结 { foreach (var item in stockInfos) { if (item.StockStatus == (int)StockStatusEmun.已入库) { item.StockStatus = (int)StockStatusEmun.出库冻结; UpdateData(item); } } foreach (var li in labelInfos) { li.SOBKZ = "1"; } _labelMasterRepository.UpdateData(labelInfos); freezeResponse.MSGTY = "S"; freezeResponse.MSGTX = ""; } else if (freezeRequest.YWLX == "01") //01解冻 { foreach (var item in stockInfos) { if (item.StockStatus == (int)StockStatusEmun.出库冻结) { item.StockStatus = (int)StockStatusEmun.已入库; UpdateData(item); } } foreach (var li in labelInfos) { //if (li.LABEL_STATUS == "01") //{ // li.SOBKZ = "2"; //} //else //{ li.SOBKZ = "0"; //} } _labelMasterRepository.UpdateData(labelInfos); freezeResponse.MSGTY = "S"; freezeResponse.MSGTX = ""; } else { freezeResponse.MSGTY = "E"; freezeResponse.MSGTX = "不支持该业务类型"; } } else { freezeResponse.MSGTY = "E"; freezeResponse.MSGTX = "请传入正确的工厂号和仓库号"; } } catch (Exception ex) { freezeResponse.MSGTY = "E"; freezeResponse.MSGTX = ex.Message; } return freezeResponse; } } }