test
2 天以前 887103a2ad70fef2669384859d532d9b74159cf1
修改库存统计导出,修改入库作业
4个文件已修改
645 ■■■■■ 已修改文件
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs 325 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/DataServer/StockServer.cs 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.IBLL/IDataServer/IStockServer.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/Wms/Controllers/StatisticalController.cs 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Wms/WMS.BLL/BllAsnServer/ArrivalNoticeServer.cs
@@ -500,38 +500,35 @@
            }
        }
        //编辑入库单据
        /// <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;
@@ -540,142 +537,131 @@
                    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,
@@ -690,89 +676,81 @@
                                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
@@ -787,6 +765,7 @@
                throw ex;
            }
        }
        //删除入库单
        public string DelArrivalNotice(ArrivalNoticeVm model)
        {
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -866,75 +866,37 @@
        /// </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>
@@ -944,127 +906,114 @@
        /// <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
    }
Wms/WMS.IBLL/IDataServer/IStockServer.cs
@@ -112,7 +112,7 @@
        /// <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>
        /// 导出库存明细
@@ -127,7 +127,7 @@
        /// <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
    }
}
Wms/Wms/Controllers/StatisticalController.cs
@@ -329,11 +329,12 @@
        /// </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,
@@ -341,7 +342,7 @@
                msg = "导出库存总量成功"
            });
        }
        /// <summary>
        /// <summary>GetDataStockListDaoChu
        /// 导出库存明细
        /// </summary>
        /// <param name="skuNo">物料编码</param>
@@ -353,9 +354,9 @@
        /// <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,