| | |
| | | } |
| | | } |
| | | |
| | | //编辑入库单据 |
| | | /// <summary> |
| | | /// 编辑入库单据 |
| | | /// </summary> |
| | | /// <param name="model"></param> |
| | | /// <returns></returns> |
| | | public string EditArrivalNotice(ArrivalNoticeVm model) |
| | | { |
| | | string strMessage = ""; |
| | | string sqlString = string.Empty; |
| | | string sqlDetailStr = string.Empty; |
| | | try |
| | | { |
| | | lock (AsnLock) |
| | | { |
| | | //判断是否为采购入库单据或车间余料退回入库 |
| | | // 判断单据类型及批次规则说明 |
| | | // 0:成品入库 1:采购入库 2:中间品入库 3:退货入库 4:车间余料退回入库 5:其它入库 6:代储入库 7:寄存入库 8 生产退料入库 |
| | | //0、2、3、4 批次不能为空 |
| | | //1、添加必须为空、编辑不可为空,不能更改 |
| | | //5、6 批次可为空可不为空 |
| | | //7 必须为空 |
| | | var TypeLot = " 5, 6, 7"; //批次为生成批次单据类型 |
| | | |
| | | var TypeLot = " 5, 6, 7"; // 批次为生成批次单据类型 |
| | | |
| | | // 验证单据存在性和状态 |
| | | var asnInfo = Db.Queryable<BllArrivalNotice>().First(m => m.ASNNo == model.ASNNo && m.IsDel == "0"); |
| | | if (asnInfo == null) |
| | | if (asnInfo == null) |
| | | { |
| | | strMessage = "-1:单号不存在,或已删除!;"; |
| | | return strMessage; |
| | | return "-1:单号不存在,或已删除!;"; |
| | | } |
| | | if (asnInfo.Status != "0") |
| | | { |
| | | strMessage = "-1:单据状态变更,不可编辑;"; |
| | | return strMessage; |
| | | return "-1:单据状态变更,不可编辑;"; |
| | | } |
| | | |
| | | var dateTime = DateTime.Now; |
| | | // 编辑总单 |
| | | // 更新主单据信息 |
| | | asnInfo.CustomerNo = model.CustomerNo; |
| | | asnInfo.CustomerName = model.CustomerName; |
| | | asnInfo.LotNo = model.LotNo; |
| | |
| | | asnInfo.UpdateUser = model.CreateUser; |
| | | |
| | | var detailModels = model.AsnDetail; |
| | | sqlDetailStr += $"SELECT * FROM BllArrivalNoticeDetail WHERE ASNNo = '{model.ASNNo}' and isDel = '0';"; |
| | | //var dbDetailModels = DataContext.Db.Ado.SqlQuery<BllArrivalNoticeDetail>(sqlDetailStr); |
| | | var dbDetailModels = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0").ToList(); |
| | | var dbDetailModels = Db.Queryable<BllArrivalNoticeDetail>() |
| | | .Where(m => m.ASNNo == model.ASNNo && m.IsDel == "0").ToList(); |
| | | |
| | | sqlDetailStr = string.Empty; |
| | | // 处理已删除的明细 |
| | | foreach (BllArrivalNoticeDetail dbDetailModel in dbDetailModels) |
| | | foreach (var dbDetail in dbDetailModels) |
| | | { |
| | | if (detailModels.Count(it => it.Id == dbDetailModel.Id) == 0) |
| | | if (!detailModels.Any(it => it.Id == dbDetail.Id)) |
| | | { |
| | | dbDetailModel.IsDel = "1"; |
| | | dbDetailModel.UpdateTime = dateTime; |
| | | dbDetailModel.UpdateUser = model.CreateUser; |
| | | dbDetail.IsDel = "1"; |
| | | dbDetail.UpdateTime = dateTime; |
| | | dbDetail.UpdateUser = model.CreateUser; |
| | | } |
| | | } |
| | | |
| | | // 处理修改和添加的明细 |
| | | // 处理修改和新增的明细 |
| | | string toDayTime = dateTime.ToString("yyyymmdd"); |
| | | List<BllArrivalNoticeDetail> addDetails = new List<BllArrivalNoticeDetail>(); |
| | | List<BllArrivalNoticeDetail> editDetails = new List<BllArrivalNoticeDetail>(); |
| | | var maxLotNo = ""; |
| | | foreach (ArrivalNoticeDetailVm detailModel in detailModels) |
| | | |
| | | foreach (var detailModel in detailModels) |
| | | { |
| | | // 基础验证 |
| | | if (string.IsNullOrEmpty(detailModel.SkuNo)) |
| | | { |
| | | strMessage = "-1:物料编码不可为空;"; |
| | | return strMessage; |
| | | } |
| | | return "-1:物料编码不可为空;"; |
| | | |
| | | if (string.IsNullOrEmpty(detailModel.SkuName)) |
| | | { |
| | | strMessage = "-1:物料名称不可为空;"; |
| | | return strMessage; |
| | | } |
| | | return "-1:物料名称不可为空;"; |
| | | |
| | | if (detailModel.Qty == null || detailModel.Qty <= 0) |
| | | { |
| | | strMessage = "-1:数量必须大于0;"; |
| | | return strMessage; |
| | | } |
| | | |
| | | //if (model.Type == "0" || model.Type == "2" || model.Type == "3" || model.Type == "4") |
| | | //{ |
| | | // if (string.IsNullOrWhiteSpace(detailModel.LotNo)) |
| | | // { |
| | | // throw new Exception("当前单据类型批次不可为空!"); |
| | | // } |
| | | //} |
| | | return "-1:数量必须大于0;"; |
| | | |
| | | if (TypeLot.Contains(model.Type)) |
| | | // 关键逻辑:获取物料的受控状态 |
| | | // 1. 根据物料编码查询物料信息 FirstOrDefault |
| | | var material = Db.Queryable<SysMaterials>() |
| | | .First(m => m.SkuNo == detailModel.SkuNo && m.IsDel == "0"); |
| | | if (material == null) |
| | | return $"-1:物料编码{detailModel.SkuNo}不存在或已删除;"; |
| | | |
| | | // 2. 将字符串类型的IsControlled转换为bool(根据实际取值规则调整) |
| | | // 比如:"1"表示受控,"0"表示不受控;或"True"/"False";或"是"/"否" |
| | | bool isControlled; |
| | | if (!bool.TryParse(material.IsControlled, out isControlled)) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(detailModel.Lot1)) |
| | | { |
| | | throw new Exception("生产日期不可为空!"); |
| | | } |
| | | // 处理非标准格式(如"1"/"0") |
| | | isControlled = material.IsControlled == "1" || |
| | | string.Equals(material.IsControlled, "是", StringComparison.OrdinalIgnoreCase); |
| | | } |
| | | |
| | | // 3. 根据受控状态验证日期 |
| | | if (isControlled) |
| | | { |
| | | // 受控状态:生产日期必填 |
| | | if (string.IsNullOrWhiteSpace(detailModel.Lot1)) |
| | | return $"-1:物料{detailModel.SkuNo}为受控物料,生产日期不可为空;"; |
| | | |
| | | // 受控状态:过期日期必填 |
| | | if (string.IsNullOrWhiteSpace(detailModel.Lot2)) |
| | | { |
| | | return $"-1:物料{detailModel.SkuNo}为受控物料,过期日期不可为空;"; |
| | | |
| | | // 验证日期格式有效性 |
| | | if (!DateTime.TryParse(detailModel.Lot1, out DateTime productionDate)) |
| | | return $"-1:物料{detailModel.SkuNo}的生产日期格式错误,请使用有效日期格式;"; |
| | | |
| | | if (!DateTime.TryParse(detailModel.Lot2, out DateTime expiryDate)) |
| | | return $"-1:物料{detailModel.SkuNo}的过期日期格式错误,请使用有效日期格式;"; |
| | | |
| | | // 验证过期日期不能早于生产日期 |
| | | if (expiryDate <= productionDate) |
| | | return $"-1:物料{detailModel.SkuNo}的过期日期不能早于生产日期;"; |
| | | } |
| | | // 不受控状态:日期非必填,无需验证 |
| | | |
| | | // 原有批次相关验证(保留) |
| | | if (TypeLot.Contains(model.Type)) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(detailModel.Lot1)) |
| | | throw new Exception("生产日期不可为空!"); |
| | | |
| | | if (string.IsNullOrWhiteSpace(detailModel.Lot2)) |
| | | throw new Exception("过期日期不可为空!"); |
| | | } |
| | | } |
| | | |
| | | // 判断是否已存在当前明细 |
| | | var com = dbDetailModels.Where(m => m.SkuNo == detailModel.SkuNo |
| | | && m.LotNo == detailModel.LotNo && m.Id != detailModel.Id && m.IsDel == "0").Count(); |
| | | if (com > 0) |
| | | // 验证物料和批次号是否重复 |
| | | if (dbDetailModels.Any(m => m.SkuNo == detailModel.SkuNo |
| | | && m.LotNo == detailModel.LotNo |
| | | && m.Id != detailModel.Id |
| | | && m.IsDel == "0")) |
| | | { |
| | | strMessage = "-1:物料和批次号重复;"; |
| | | return strMessage; |
| | | return "-1:物料和批次号重复;"; |
| | | } |
| | | |
| | | if (detailModel.Price == null) |
| | | { |
| | | detailModel.Price = 0; |
| | | } |
| | | //生成自有批次 |
| | | // 处理价格默认值 |
| | | detailModel.Price ??= 0; |
| | | |
| | | // 生成箱码(自有批次逻辑) |
| | | if (detailModel.Id == 0 || detailModel.Id == null || string.IsNullOrWhiteSpace(detailModel.LotNo)) |
| | | { |
| | | //var notice = Db.Queryable<BllArrivalNotice>().Where(m => m.IsDel == "0" && TypeLot.Contains(m.Type)).Select(m => m.ASNNo).ToList(); |
| | | //if (string.IsNullOrWhiteSpace(maxLotNo)) |
| | | //{ |
| | | // maxLotNo = Db.Queryable<BllArrivalNoticeDetail>().Where(m => m.IsDel == "0" && !string.IsNullOrWhiteSpace(m.LotNo) && notice.Contains(m.ASNNo)).Max(m => m.LotNo); |
| | | //} |
| | | //if (string.IsNullOrWhiteSpace(maxLotNo)) |
| | | //{ |
| | | // maxLotNo = toDayTime.Substring(2, 6) + "0001"; |
| | | //} |
| | | //else |
| | | //{ |
| | | // var lotStr = maxLotNo.Substring(0, 6); |
| | | // var timeStr = toDayTime.Substring(2, 6); |
| | | // if (lotStr == timeStr) |
| | | // { |
| | | // maxLotNo = toDayTime.Substring(2, 6) + (int.Parse(maxLotNo.Substring(6, 4)) + 1).ToString().PadLeft(4, '0'); |
| | | // } |
| | | // else |
| | | // { |
| | | // maxLotNo = timeStr + "0001"; |
| | | // } |
| | | //} |
| | | //detailModel.LotNo = maxLotNo; |
| | | var maxBoxCodeStr = Db.Queryable<BllArrivalNoticeDetail>() |
| | | .Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK") |
| | | && m.CreateTime.ToString("yyyyMM") == DateTime.Now.ToString("yyyyMM")).Max(m => m.BoxCodeStr); |
| | | if (string.IsNullOrWhiteSpace(maxBoxCodeStr)) |
| | | { |
| | | maxBoxCodeStr = "BK" + toDayTime.Substring(2, 4) + "0001"; |
| | | } |
| | | else |
| | | { |
| | | maxBoxCodeStr = "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString(); |
| | | } |
| | | detailModel.BoxCodeStr = maxBoxCodeStr; |
| | | .Where(m => m.IsDel == "0" && m.BoxCodeStr.Contains("BK") |
| | | && m.CreateTime.ToString("yyyyMM") == DateTime.Now.ToString("yyyyMM")) |
| | | .Max(m => m.BoxCodeStr); |
| | | |
| | | detailModel.BoxCodeStr = string.IsNullOrWhiteSpace(maxBoxCodeStr) |
| | | ? "BK" + toDayTime.Substring(2, 4) + "0001" |
| | | : "BK" + (int.Parse(maxBoxCodeStr.Replace("BK", "")) + 1).ToString(); |
| | | } |
| | | |
| | | // 处理新增明细 |
| | | if (detailModel.Id == 0 || detailModel.Id == null) |
| | | { |
| | | //if (model.Type == "1") |
| | | //{ |
| | | // strMessage = "-1:采购入库不可更改明细,只可编辑数量;"; |
| | | // return strMessage; |
| | | //} |
| | | // 计算出总金额 |
| | | detailModel.Money = detailModel.Price * detailModel.Qty; |
| | | |
| | | BllArrivalNoticeDetail addModel = new BllArrivalNoticeDetail() |
| | | addDetails.Add(new BllArrivalNoticeDetail |
| | | { |
| | | ASNNo = model.ASNNo, |
| | | SkuNo = detailModel.SkuNo, |
| | | SkuName = detailModel.SkuName, |
| | | Standard = detailModel.Standard, |
| | | LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(), |
| | | LotNo = detailModel.LotNo?.Trim() ?? "", |
| | | LotText = detailModel.LotText, |
| | | Qty = (decimal)detailModel.Qty, |
| | | PackagNo = detailModel.PackagNo, |
| | | Price = detailModel.Price, |
| | | Money = detailModel.Money, |
| | | FactQty = 0, // 已组数量 |
| | | CompleteQty = 0, // 完成数量 |
| | | FactQty = 0, |
| | | CompleteQty = 0, |
| | | IsBale = detailModel.IsBale, |
| | | IsBelt = detailModel.IsBelt, |
| | | SupplierLot = detailModel.SupplierLot, |
| | |
| | | UDF3 = detailModel.UDF3, |
| | | UDF4 = detailModel.UDF4, |
| | | UDF5 = detailModel.UDF5, |
| | | CreateUser=(int)model.CreateUser |
| | | }; |
| | | addDetails.Add(addModel); |
| | | CreateUser = (int)model.CreateUser |
| | | }); |
| | | } |
| | | // 处理编辑明细 |
| | | else |
| | | { |
| | | //判断是否更改 |
| | | int rowNum = dbDetailModels |
| | | .Count(it => it.Id == detailModel.Id |
| | | && it.Qty == detailModel.Qty |
| | | && it.LotNo == detailModel.LotNo |
| | | && it.LotText == detailModel.LotText |
| | | && it.SupplierLot == detailModel.SupplierLot |
| | | && it.IsBale == detailModel.IsBale |
| | | && it.IsBelt == detailModel.IsBelt |
| | | && it.Lot1 == detailModel.Lot1 // 生产日期 |
| | | && it.Lot2 == detailModel.Lot2 // 过期日期 |
| | | && it.BoxCodeStr == detailModel.BoxCodeStr |
| | | && it.UDF1 == detailModel.UDF1 |
| | | && it.UDF2 == detailModel.UDF2 |
| | | && it.UDF3 == detailModel.UDF3 |
| | | && it.UDF4 == detailModel.UDF4 |
| | | && it.UDF5 == detailModel.UDF5); |
| | | if (rowNum > 0) |
| | | // 检查是否有实际修改 |
| | | var existingDetail = dbDetailModels.First(m => m.Id == detailModel.Id); |
| | | if (existingDetail.Qty == detailModel.Qty |
| | | && existingDetail.LotNo == detailModel.LotNo |
| | | && existingDetail.LotText == detailModel.LotText |
| | | && existingDetail.SupplierLot == detailModel.SupplierLot |
| | | && existingDetail.IsBale == detailModel.IsBale |
| | | && existingDetail.IsBelt == detailModel.IsBelt |
| | | && existingDetail.Lot1 == detailModel.Lot1 |
| | | && existingDetail.Lot2 == detailModel.Lot2 |
| | | && existingDetail.BoxCodeStr == detailModel.BoxCodeStr |
| | | && existingDetail.UDF1 == detailModel.UDF1 |
| | | && existingDetail.UDF2 == detailModel.UDF2 |
| | | && existingDetail.UDF3 == detailModel.UDF3 |
| | | && existingDetail.UDF4 == detailModel.UDF4 |
| | | && existingDetail.UDF5 == detailModel.UDF5) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | var dbDetail = dbDetailModels.First(m => m.Id == detailModel.Id); |
| | | if (TypeLot.Contains(model.Type)) |
| | | // 批次不可更改验证 |
| | | if (TypeLot.Contains(model.Type) |
| | | && !string.IsNullOrWhiteSpace(existingDetail.LotNo) |
| | | && existingDetail.LotNo != detailModel.LotNo) |
| | | { |
| | | if (!string.IsNullOrWhiteSpace(dbDetail.LotNo)) |
| | | { |
| | | if (dbDetail.LotNo != detailModel.LotNo) |
| | | { |
| | | strMessage = "-1:当前单据类型不可更改批次;"; |
| | | continue; |
| | | } |
| | | } |
| | | |
| | | return "-1:当前单据类型不可更改批次;"; |
| | | } |
| | | // 计算出总金额 |
| | | detailModel.Money = detailModel.Price * detailModel.Qty; |
| | | |
| | | dbDetail.Qty = (decimal)detailModel.Qty; |
| | | dbDetail.LotNo = detailModel.LotNo == null ? "" : detailModel.LotNo.Trim(); |
| | | dbDetail.Money = detailModel.Money; |
| | | dbDetail.LotText = detailModel.LotText; |
| | | dbDetail.SupplierLot = detailModel.SupplierLot; |
| | | dbDetail.IsBale = detailModel.IsBale; |
| | | dbDetail.Lot1 = detailModel.Lot1; |
| | | dbDetail.Lot2 = detailModel.Lot2; |
| | | dbDetail.BoxCodeStr = detailModel.BoxCodeStr; |
| | | dbDetail.UDF1 = detailModel.UDF1; |
| | | dbDetail.UDF2 = detailModel.UDF2; |
| | | dbDetail.UDF3 = detailModel.UDF3; |
| | | dbDetail.UDF4 = detailModel.UDF4; |
| | | dbDetail.UDF5 = detailModel.UDF5; |
| | | dbDetail.UpdateTime = dateTime; |
| | | dbDetail.UpdateUser = model.CreateUser; |
| | | // 更新明细信息 |
| | | existingDetail.Qty = (decimal)detailModel.Qty; |
| | | existingDetail.LotNo = detailModel.LotNo?.Trim() ?? ""; |
| | | existingDetail.Money = detailModel.Price * detailModel.Qty; |
| | | existingDetail.LotText = detailModel.LotText; |
| | | existingDetail.SupplierLot = detailModel.SupplierLot; |
| | | existingDetail.IsBale = detailModel.IsBale; |
| | | existingDetail.Lot1 = detailModel.Lot1; |
| | | existingDetail.Lot2 = detailModel.Lot2; |
| | | existingDetail.BoxCodeStr = detailModel.BoxCodeStr; |
| | | existingDetail.UDF1 = detailModel.UDF1; |
| | | existingDetail.UDF2 = detailModel.UDF2; |
| | | existingDetail.UDF3 = detailModel.UDF3; |
| | | existingDetail.UDF4 = detailModel.UDF4; |
| | | existingDetail.UDF5 = detailModel.UDF5; |
| | | existingDetail.UpdateTime = dateTime; |
| | | existingDetail.UpdateUser = model.CreateUser; |
| | | |
| | | editDetails.Add(dbDetail); |
| | | editDetails.Add(existingDetail); |
| | | } |
| | | } |
| | | |
| | | // 事务处理 |
| | | Db.Ado.BeginTran(); |
| | | |
| | | Db.Updateable(dbDetailModels).ExecuteCommand(); |
| | | int rowCount = Db.Updateable(asnInfo).ExecuteCommand(); |
| | | var rowDetailCount = 1; |
| | | if (addDetails.Count > 0) |
| | | { |
| | | rowDetailCount = Db.Insertable(addDetails).ExecuteCommand(); |
| | | } |
| | | if (editDetails.Count > 0) |
| | | { |
| | | rowDetailCount += Db.Updateable(editDetails).ExecuteCommand(); |
| | | } |
| | | int rowDetailCount = 1; |
| | | |
| | | Db.Ado.CommitTran(); |
| | | if (addDetails.Any()) |
| | | rowDetailCount = Db.Insertable(addDetails).ExecuteCommand(); |
| | | |
| | | if (editDetails.Any()) |
| | | rowDetailCount += Db.Updateable(editDetails).ExecuteCommand(); |
| | | |
| | | if (rowCount > 0 && rowDetailCount > 0) |
| | | { |
| | | new OperationASNServer().AddLogOperationAsn("入库作业", "入库单据", model.ASNNo, "编辑", $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); |
| | | Db.Ado.CommitTran(); |
| | | new OperationASNServer().AddLogOperationAsn( |
| | | "入库作业", "入库单据", model.ASNNo, "编辑", |
| | | $"编辑了单据号为{model.ASNNo}的单据信息", Convert.ToInt32(model.CreateUser)); |
| | | return strMessage; |
| | | } |
| | | else |
| | |
| | | throw ex; |
| | | } |
| | | } |
| | | |
| | | //删除入库单 |
| | | public string DelArrivalNotice(ArrivalNoticeVm model) |
| | | { |
| | |
| | | /// </summary> |
| | | /// <param name="skuNo">物料编码</param> |
| | | /// <param name="skuName">物料名称</param> |
| | | /// <param name="InspectStatus">质检状态</param> |
| | | /// <returns></returns> |
| | | public List<MateDataStockDto> GetDataStockListDaoChu(string skuNo, string skuName) |
| | | public List<MateDataStockDto> GetDataStockListDaoChu(string skuNo, string skuName, string InspectStatus) |
| | | { |
| | | string str = "select stock.SkuNo,stock.SkuName,stock.Standard,stock.Qty,stock.LockQty,stock.FrozenQty,(mate.Weight * stock.Qty) WeightSum from DataStock stock left join SysMaterials mate on stock.SkuNo = mate.SkuNo Where stock.IsDel = @isdel"; |
| | | //判断物料编码是否为空 |
| | | if (!string.IsNullOrEmpty(skuNo)) |
| | | { |
| | | str += " and stock.SkuNo like @skuno"; |
| | | } |
| | | //判断物料名称是否为空 |
| | | if (!string.IsNullOrEmpty(skuName)) |
| | | { |
| | | str += " and stock.SkuName like @skuname"; |
| | | } |
| | | //排序 |
| | | str += " order by stock.SkuNo"; |
| | | List<MateDataStockDto> StockList = Db.Ado.SqlQuery<MateDataStockDto>(str, new |
| | | { |
| | | isdel = "0", //是否删除 |
| | | skuno = "%" + skuNo + "%", //物料编码 |
| | | skuname = "%" + skuName + "%" //物料名称 |
| | | }); |
| | | |
| | | //库存总量 |
| | | List<MateDataStockDto> StockListDto = new List<MateDataStockDto>(); |
| | | |
| | | foreach (var item in StockList) |
| | | { |
| | | //判断库存总量是否拥有物料 |
| | | if (StockListDto.Count > 0) |
| | | // 获取入库单明细信息 GetDataStockListDaoChu |
| | | var asnList = Db.Queryable<DataStockDetail>() |
| | | .Where(m => m.IsDel == "0") |
| | | .WhereIF(!string.IsNullOrEmpty(skuNo), a => a.SkuNo.Contains(skuNo)).Distinct() |
| | | .WhereIF(!string.IsNullOrEmpty(skuName), a => a.SkuName.Contains(skuName)).Distinct() |
| | | .WhereIF(!string.IsNullOrEmpty(InspectStatus), a => a.InspectStatus == InspectStatus) |
| | | .Select(a => new MateDataStockDto() |
| | | { |
| | | int i = 0; |
| | | //foreach循环库存总量 |
| | | foreach (var dto in StockListDto) |
| | | { |
| | | //判断物料是否相同 |
| | | if (dto.SkuNo == item.SkuNo) |
| | | { |
| | | dto.Qty = Convert.ToInt32(dto.Qty) + Convert.ToInt32(item.Qty); |
| | | dto.FrozenQty = Convert.ToInt32(dto.FrozenQty) + Convert.ToInt32(item.FrozenQty); |
| | | dto.LockQty = Convert.ToInt32(dto.LockQty) + Convert.ToInt32(item.LockQty); |
| | | dto.ResidueQty = (Convert.ToInt32(dto.ResidueQty) + Convert.ToInt32(item.ResidueQty)).ToString(); |
| | | break; |
| | | } |
| | | i += 1; |
| | | //判断已有相同物料 |
| | | if (i == StockListDto.Count) |
| | | { |
| | | StockListDto.Add(item); |
| | | break; |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | StockListDto.Add(item); |
| | | continue; |
| | | } |
| | | } |
| | | foreach (var item in StockListDto) |
| | | { |
| | | //物料编码,加上单引号是防止导出到excel自动把前面的0给去掉 |
| | | if (!string.IsNullOrEmpty(item.SkuNo) && item.SkuNo.Substring(0, 1) == "0") |
| | | { |
| | | item.SkuNo = $"'{item.SkuNo}"; |
| | | } |
| | | } |
| | | SkuNo = a.SkuNo,//物料编码 |
| | | SkuName = a.SkuName,//物料名称 |
| | | Standard = a.Standard,//物料规格 |
| | | LotNo = a.LotNo,//批次号 |
| | | OwnerNo = a.OwnerNo,//货主编号 |
| | | OwnerName = a.OwnerName,//货主名称 |
| | | Status = ((a.Status == "0") ? "待分配" : ((a.Status == "1") ? "部分分配" : ((a.Status == "2") ? "盘点锁定" : ((a.Status == "3") ? "移库锁定" : "异常锁定")))),//库存状态 |
| | | InspectStatus = ((a.InspectStatus == "0") ? "待质检" : (a.InspectStatus == "1" ? "检验合格" : "不合格")),//质检状态 |
| | | Qty = SqlFunc.AggregateSum(Convert.ToInt32((a.Qty))),//库存数量 |
| | | LockQty = SqlFunc.AggregateSum(Convert.ToInt32(a.LockQty)),//锁定数量 |
| | | FrozenQty = SqlFunc.AggregateSum(Convert.ToInt32(a.FrozenQty)),//冻结数量 |
| | | InspectQty = SqlFunc.AggregateSum(Convert.ToInt32(a.InspectQty))//可抽检数量 |
| | | }) |
| | | .Distinct() |
| | | .GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.LotNo, a.Status, a.InspectStatus, a.OwnerNo, a.OwnerName, a.Qty, a.LockQty, a.FrozenQty, a.InspectQty }) |
| | | .ToList(); |
| | | |
| | | return StockListDto; |
| | | Console.WriteLine("结果:" + asnList); |
| | | return asnList; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | /// <param name="skuName">物料名称</param> |
| | | /// <param name="lotNo">批次</param> |
| | | /// <param name="locatNo">储位地址</param> |
| | | /// <param name="palletNo">托盘条码</param> |
| | | /// <param name="status">库存状态</param> |
| | | /// <param name="inspectStatus">质检状态</param> |
| | | /// <param name="ownerNo">货物编号</param> |
| | | /// <param name="ownerName">货物名称</param> |
| | | /// <param name="startTime">开始时间</param> |
| | | /// <param name="endTime">结束时间</param> |
| | | /// <returns></returns> |
| | | public List<StockDetailDto> GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, |
| | | string palletNo, string status, string inspectStatus, string startTime, string endTime) |
| | | public List<StockDetailDto> GetDataStockList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string status, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTime) |
| | | { |
| | | string str = "select detail.*,house.WareHouseName as WareHouseName,roadway.RoadwayName as RoadwayName from DataStockDetail detail left join SysStorageRoadway roadway on detail.RoadwayNo = roadway.RoadwayNo left join SysWareHouse house on detail.WareHouseNo = house.WareHouseNo Where detail.IsDel = @isdel"; |
| | | //判断物料编码是否为空 |
| | | if (!string.IsNullOrEmpty(skuNo)) |
| | | { |
| | | str += " and detail.SkuNo = @skuno"; |
| | | } |
| | | //判断物料名称是否为空 |
| | | if (!string.IsNullOrEmpty(skuName)) |
| | | { |
| | | str += " and detail.SkuName = @skuname"; |
| | | } |
| | | //判断批次是否为空 |
| | | if (!string.IsNullOrEmpty(lotNo)) |
| | | { |
| | | str += " and detail.LotNo = @lotno"; |
| | | } |
| | | //判断储位地址是否为空 |
| | | if (!string.IsNullOrEmpty(locatNo)) |
| | | { |
| | | str += " and detail.LocatNo = @locatno"; |
| | | } |
| | | //判断托盘条码是否为空 |
| | | if (!string.IsNullOrEmpty(palletNo)) |
| | | { |
| | | str += " and detail.PalletNo = @palletno"; |
| | | } |
| | | //判断库存状态是否为空 |
| | | if (!string.IsNullOrEmpty(status)) |
| | | { |
| | | str += " and detail.Status = @status"; |
| | | } |
| | | //判断质检状态是否为空 |
| | | if (!string.IsNullOrEmpty(inspectStatus)) |
| | | { |
| | | str += " and detail.InspectStatus = @inspectstatus"; |
| | | } |
| | | if (!string.IsNullOrEmpty(startTime)) |
| | | { |
| | | str += $" and detail.CompleteTime >= '{startTime}'"; |
| | | } |
| | | if (!string.IsNullOrEmpty(endTime)) |
| | | { |
| | | endTime = Convert.ToDateTime(endTime).AddDays(1).ToString(); |
| | | str += $" and detail.CompleteTime < '{endTime}'"; |
| | | } |
| | | //排序 |
| | | str += " order by detail.SkuNo,detail.PalletNo,detail.LotNo"; |
| | | List<StockDetailDto> stockDetailsList = Db.Ado.SqlQuery<StockDetailDto>(str, new |
| | | { |
| | | isdel = "0", //是否删除 |
| | | skuno = skuNo, //物料编码 |
| | | skuname = skuName, //物料名称 |
| | | lotno = lotNo, //批次 |
| | | locatno = locatNo, //储位地址 |
| | | palletno = palletNo, //托盘条码 |
| | | status = status, //库存状态 |
| | | inspectstatus = inspectStatus //质检状态 |
| | | }); |
| | | foreach (var item in stockDetailsList) |
| | | { |
| | | //储位地址,加上单引号是防止导出到excel自动把前面的0给去掉 |
| | | if (!string.IsNullOrEmpty(item.LocatNo) && item.LocatNo.Substring(0, 1) == "0") |
| | | // 获取明细信息 |
| | | var asnList = Db.Queryable<DataStockDetail, DataStock> |
| | | ((tb1, tb2) => new JoinQueryInfos( |
| | | JoinType.Left, tb1.Id == tb2.Id |
| | | )) |
| | | .Where((tb1, tb2) => tb1.IsDel == "0" && tb2.IsDel == "0") |
| | | .WhereIF(!string.IsNullOrWhiteSpace(startTime), tb1 => tb1.CreateTime >= Convert.ToDateTime(startTime)) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(endTime), tb1 => tb1.CreateTime <= Convert.ToDateTime(endTime).AddDays(1)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1, tb2) => tb2.SkuNo.Contains(skuNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuName), (tb1, tb2) => tb2.SkuName.Contains(skuName)) |
| | | .WhereIF(!string.IsNullOrEmpty(ownerNo), (tb1, tb2) => tb2.OwnerNo.Contains(ownerNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(ownerName), (tb1, tb2) => tb2.OwnerName.Contains(ownerName)) |
| | | .WhereIF(!string.IsNullOrEmpty(lotNo), (tb1, tb2) => tb2.LotNo.Contains(lotNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(status), (tb1, tb2) => tb1.Status.Contains(status)) |
| | | .WhereIF(!string.IsNullOrEmpty(inspectStatus), (tb1, tb2) => tb1.InspectStatus.Contains(inspectStatus)) |
| | | //.GroupBy((tb1,tb2) => new { tb2.LotNo, tb2.SkuNo, tb2.SkuName }) |
| | | .Select((tb1, tb2) => new StockDetailDto() |
| | | { |
| | | item.LocatNo = $"'{item.LocatNo}"; |
| | | } |
| | | //物料编码 |
| | | if (!string.IsNullOrEmpty(item.SkuNo) && item.SkuNo.Substring(0, 1) == "0") |
| | | { |
| | | item.SkuNo = $"'{item.SkuNo}"; |
| | | } |
| | | //库存状态 |
| | | switch (item.Status) |
| | | { |
| | | case "0": |
| | | item.Status = "待分配"; |
| | | break; |
| | | case "1": |
| | | item.Status = "部分分配"; |
| | | break; |
| | | case "2": |
| | | item.Status = "已分配"; |
| | | break; |
| | | case "3": |
| | | item.Status = "盘点锁定"; |
| | | break; |
| | | case "4": |
| | | item.Status = "移库锁定"; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | //质检状态 |
| | | switch (item.InspectStatus) |
| | | { |
| | | case "0": |
| | | item.InspectStatus = "待检验"; |
| | | break; |
| | | case "1": |
| | | item.InspectStatus = "检验合格"; |
| | | break; |
| | | case "2": |
| | | item.InspectStatus = "不合格"; |
| | | break; |
| | | case "4": |
| | | item.InspectStatus = "放置期"; |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | Status = tb1.Status, |
| | | InspectStatus = tb1.InspectStatus, |
| | | LotNo = tb1.LotNo, |
| | | SkuNo = tb2.SkuNo, |
| | | SkuName = tb2.SkuName, |
| | | OwnerNo = tb2.OwnerNo, |
| | | OwnerName = tb2.OwnerName, |
| | | CompleteTime = tb2.CreateTime, |
| | | }); |
| | | |
| | | } |
| | | return stockDetailsList; |
| | | // 获取出库单明细信息 |
| | | var soList = Db.Queryable<DataStockDetail, DataStock> |
| | | (((tb1, tb2) => new JoinQueryInfos( |
| | | JoinType.Left, tb1.Id == tb2.Id |
| | | ))) |
| | | .Where((tb1, tb2) => tb1.IsDel == "0" && tb2.IsDel == "0") |
| | | .WhereIF(!string.IsNullOrWhiteSpace(startTime), tb1 => tb1.CreateTime >= Convert.ToDateTime(startTime)) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(endTime), tb1 => tb1.CreateTime <= Convert.ToDateTime(endTime).AddDays(1)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1, tb2) => tb2.SkuNo.Contains(skuNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuName), (tb1, tb2) => tb2.SkuName.Contains(skuName)) |
| | | .WhereIF(!string.IsNullOrEmpty(ownerNo), (tb1, tb2) => tb2.OwnerNo.Contains(ownerNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(ownerName), (tb1, tb2) => tb2.OwnerName.Contains(ownerName)) |
| | | .WhereIF(!string.IsNullOrEmpty(lotNo), (tb1, tb2) => tb2.LotNo.Contains(lotNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(status), (tb1, tb2) => tb1.Status.Contains(status)) |
| | | .WhereIF(!string.IsNullOrEmpty(inspectStatus), (tb1, tb2) => tb1.InspectStatus.Contains(inspectStatus)) |
| | | //.GroupBy(a => new { a.LotNo, a.SkuNo, a.SkuName }) |
| | | .Select((tb1, tb2) => new StockDetailDto() |
| | | { |
| | | Status = tb1.Status, |
| | | InspectStatus = tb1.InspectStatus, |
| | | LotNo = tb1.LotNo, |
| | | SkuNo = tb2.SkuNo, |
| | | SkuName = tb2.SkuName, |
| | | OwnerNo = tb2.OwnerNo, |
| | | OwnerName = tb2.OwnerName, |
| | | CompleteTime = tb2.CreateTime, |
| | | }); |
| | | |
| | | // 获取取样拣货信息 |
| | | var samplingList = Db.Queryable<DataStockDetail, DataStock> |
| | | (((tb1, tb2) => new JoinQueryInfos( |
| | | JoinType.Left, tb1.Id == tb2.Id |
| | | ))) |
| | | .Where((tb1, tb2) => tb1.IsDel == "0" && tb2.IsDel == "0") |
| | | .WhereIF(!string.IsNullOrWhiteSpace(startTime), tb1 => tb1.CreateTime >= Convert.ToDateTime(startTime)) |
| | | .WhereIF(!string.IsNullOrWhiteSpace(endTime), tb1 => tb1.CreateTime <= Convert.ToDateTime(endTime).AddDays(1)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1, tb2) => tb2.SkuNo.Contains(skuNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(skuName), (tb1, tb2) => tb2.SkuName.Contains(skuName)) |
| | | .WhereIF(!string.IsNullOrEmpty(ownerNo), (tb1, tb2) => tb2.OwnerNo.Contains(ownerNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(ownerName), (tb1, tb2) => tb2.OwnerName.Contains(ownerName)) |
| | | .WhereIF(!string.IsNullOrEmpty(lotNo), (tb1, tb2) => tb2.LotNo.Contains(lotNo)) |
| | | .WhereIF(!string.IsNullOrEmpty(status), (tb1, tb2) => tb1.Status.Contains(status)) |
| | | .WhereIF(!string.IsNullOrEmpty(inspectStatus), (tb1, tb2) => tb1.InspectStatus.Contains(inspectStatus)) |
| | | //.GroupBy(a => new { a.LotNo, a.SkuNo, a.SkuName }) |
| | | .Select((tb1, tb2) => new StockDetailDto() |
| | | { |
| | | Status = tb1.Status, |
| | | InspectStatus = tb1.InspectStatus, |
| | | LotNo = tb1.LotNo, |
| | | SkuNo = tb2.SkuNo, |
| | | SkuName = tb2.SkuName, |
| | | OwnerNo = tb2.OwnerNo, |
| | | OwnerName = tb2.OwnerName, |
| | | CompleteTime = tb2.CreateTime, |
| | | }); |
| | | |
| | | // 合并集合 |
| | | var dataList = Db.UnionAll(asnList, soList, samplingList) |
| | | .Select(a => new StockDetailDto() |
| | | { |
| | | Status = a.Status, |
| | | InspectStatus = a.InspectStatus, |
| | | LotNo = a.LotNo, |
| | | SkuNo = a.SkuNo, |
| | | SkuName = a.SkuName, |
| | | OwnerNo = a.OwnerNo, |
| | | OwnerName = a.OwnerName, |
| | | CompleteTime = a.CompleteTime, |
| | | }).ToList(); |
| | | |
| | | return dataList; |
| | | } |
| | | #endregion |
| | | } |
| | |
| | | /// <param name="skuNo">物料编码</param> |
| | | /// <param name="skuName">物料名称</param> |
| | | /// <returns></returns> |
| | | List<MateDataStockDto> GetDataStockListDaoChu(string skuNo, string skuName); |
| | | List<MateDataStockDto> GetDataStockListDaoChu(string skuNo, string skuName, string InspectStatus); |
| | | |
| | | /// <summary> |
| | | /// 导出库存明细 |
| | |
| | | /// <param name="startTime">开始时间</param> |
| | | /// <param name="endTime">结束时间</param> |
| | | /// <returns></returns> |
| | | List<StockDetailDto> GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus, string startTime, string endTime); |
| | | List<StockDetailDto> GetDataStockList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string status, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTime); |
| | | #endregion |
| | | } |
| | | } |
| | |
| | | /// </summary> |
| | | /// <param name="skuNo"></param> |
| | | /// <param name="skuName"></param> |
| | | /// <param name="InspectStatus">质检状态</param> |
| | | /// <returns></returns> |
| | | [HttpGet] |
| | | public IActionResult GetInventoryListDaoChu(string skuNo, string skuName) |
| | | public IActionResult GetInventoryListDaoChu(string skuNo, string skuName, string InspectStatus) |
| | | { |
| | | List<MateDataStockDto> StockList = _stock.GetDataStockListDaoChu(skuNo, skuName); |
| | | List<MateDataStockDto> StockList = _stock.GetDataStockListDaoChu(skuNo, skuName, InspectStatus); |
| | | return Ok(new |
| | | { |
| | | data = StockList, |
| | |
| | | msg = "导出库存总量成功" |
| | | }); |
| | | } |
| | | /// <summary> |
| | | /// <summary>GetDataStockListDaoChu |
| | | /// 导出库存明细 |
| | | /// </summary> |
| | | /// <param name="skuNo">物料编码</param> |
| | |
| | | /// <param name="inspectStatus">质检状态</param> |
| | | /// <returns></returns> |
| | | [HttpGet] |
| | | public IActionResult GetInventoryList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string palletNo, string status, string inspectStatus, string startTime, string endTime) |
| | | public IActionResult GetDataStockList1DaoChu(string skuNo, string skuName, string lotNo, string locatNo, string status, string inspectStatus, string ownerNo, string ownerName, string startTime, string endTime) |
| | | { |
| | | List<StockDetailDto> stockDetailsList = _stock.GetInventoryList1DaoChu(skuNo, skuName, lotNo, locatNo, palletNo, status, inspectStatus, startTime, endTime); |
| | | List<StockDetailDto> stockDetailsList = _stock.GetDataStockList1DaoChu(skuNo, skuName, lotNo, locatNo, status, inspectStatus, ownerNo, ownerName, startTime, endTime); |
| | | return Ok(new |
| | | { |
| | | data = stockDetailsList, |