admin
14 小时以前 daf065f5894352e5b739c66fb6fa12d8d028d5c3
Wms/WMS.BLL/DataServer/StockServer.cs
@@ -1,8 +1,10 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Linq.Expressions;
using System.Net.WebSockets;
using System.Runtime.Intrinsics.X86;
using System.Security.Claims;
using System.Text;
@@ -14,6 +16,7 @@
using Model.ModelVm.SysVm;
using MySqlConnector;
using SqlSugar;
using Talk.Extensions;
using WMS.DAL;
using WMS.Entity.BllAsnEntity;
using WMS.Entity.BllQualityEntity;
@@ -28,9 +31,152 @@
    public class StockServer : DbHelper<DataStock>, IStockServer
    {
        private static readonly SqlSugarScope Db = DataContext.Db;
        public StockServer() : base(Db)
        {
        }
        /// <summary>
        /// 获取库存物料类型分布
        /// </summary>
        /// <returns></returns>
        public IEnumerable<IdNameNumRateDto> GetGoodsTypeFb()
        {
            string stockNumSql = $@"select a.Type,sum(b.num) as num
   from SysMaterials a
   inner join (select SkuNo,sum(Qty) as num from DataStockDetail where IsDel='0' group by SkuNo) b on b.SkuNo=a.SkuNo
   where a.IsDel='0'
   group by a.Type";
            DataTable stockNumDt = Db.Ado.GetDataTable(stockNumSql);
            var stockNumIE = stockNumDt.Rows.Cast<DataRow>().Select(e => new
            {
                typeName = e["Type"] + "",
                num = e["num"] + ""
            });
            //物料类型
            string goodsTypeSql = $@"select DictNo,DictName,0.00 as num
   from SysDictionary
   where IsDel='0' and ParentNo='MaterialType'
   order by Id";
            DataTable goodsTypeDt = Db.Ado.GetDataTable(goodsTypeSql);
            IEnumerable<IdNameNumRateDto> result = goodsTypeDt.Rows.Cast<DataRow>().Select(e => new IdNameNumRateDto
            {
                TypeId = e["DictNo"] + "",
                TypeName = e["DictName"] + "",
                TypeNum = Convert.ToDouble((stockNumIE.FirstOrDefault(f => f.typeName == e["DictNo"] + "") == null) ? "0.00" : stockNumIE.First(f => f.typeName == e["DictNo"] + "").num),
            });
            return result;
        }
        /// <summary>
        /// 获取库存质量状态分布
        /// </summary>
        /// <returns></returns>
        public IEnumerable<IdNameNumRateDto> GetQualityStatusFb()
        {
            string stockNumSql = $@"select InspectStatus,sum(Qty) as num
   from DataStockDetail
   where IsDel='0' and InspectStatus is not null
   group by InspectStatus";
            DataTable stockNumDt = Db.Ado.GetDataTable(stockNumSql);
            object totalObj = stockNumDt.Compute("sum(num)", "");
            var stockNumIE = stockNumDt.Rows.Cast<DataRow>().Select(e => new
            {
                typeName = e["InspectStatus"] + "",
                num = e["num"] + ""
            });
            //物料类型
            string inspectStatusSql = $@"select DictNo,DictName,0.00 as num,'0%' as rate
   from SysDictionary
   where IsDel='0' and ParentNo='InspectStatus'
   order by Id";
            DataTable goodsTypeDt = Db.Ado.GetDataTable(inspectStatusSql);
            foreach (DataRow dr in goodsTypeDt.Rows)
            {
                var stockNum = stockNumIE.FirstOrDefault(e => e.typeName == dr["DictNo"] + "");
                if (stockNum != null)
                {
                    dr["num"] = stockNum.num;
                    dr["rate"] = (stockNum.num.ToDouble() / Convert.ToDouble(totalObj) * 100.00).ToString("0.00") + "%";
                }
            }
            IEnumerable<IdNameNumRateDto> result = goodsTypeDt.Rows.Cast<DataRow>().Select(e => new IdNameNumRateDto
            {
                TypeId = e["DictNo"] + "",
                TypeName = e["DictName"] + "",
                TypeNum = Convert.ToDouble(e["num"]),
                TypeRate = e["rate"] + ""
            });
            return result;
        }
        /// <summary>
        /// 获取仓库状况总
        /// </summary>
        /// <returns></returns>
        public WarehouseStateDto GetWareHouseState()
        {
            //库区总数
            string houseNumSql = $@"select count(Id) as num
   from SysWareHouse
   where IsDel='0'";
            int houseNum = Db.Ado.GetInt(houseNumSql);
            //库位总数
            string stockNumSql = $@"select count(Id) as num
   from SysStorageLocat
   where IsDel='0'";
            int stockNum = Db.Ado.GetInt(stockNumSql);
            //已使用库位
            string stockUseNumSql = $@"select count(Id) as num
   from SysStorageLocat
   where IsDel='0' and Status='1'";
            int stockUseNum = Db.Ado.GetInt(stockUseNumSql);
            WarehouseStateDto result = new WarehouseStateDto()
            {
                WarehouseNum = houseNum + "",
                StockAllNum = stockNum + "",
                StockUseNum = stockUseNum + "",
                StockUseRate = ((double)stockUseNum / stockNum * 100.00).ToString("0.00") + "%"
            };
            return result;
        }
        /// <summary>
        /// 获取仓库详情
        /// </summary>
        /// <returns></returns>
        public IEnumerable<WarehouseUseDto> GetWareHouseStateInfo()
        {
            string stockUseSql = $@"select a.Id,a.WareHouseNo,a.WareHouseName,b.num as stockNum,c.num as useNum
   from SysWareHouse a
   left join (select WareHouseNo,count(Id) as num from SysStorageLocat where IsDel='0' group by WareHouseNo) b on b.WareHouseNo=a.WareHouseNo
   left join (select WareHouseNo,count(Id) as num from SysStorageLocat where IsDel='0' and Status='1' group by WareHouseNo) c on c.WareHouseNo=a.WareHouseNo
   where a.IsDel='0'
   order by a.WareHouseNo";
            DataTable stockUseDt = Db.Ado.GetDataTable(stockUseSql);
            IEnumerable<WarehouseUseDto> result = stockUseDt.Rows.Cast<DataRow>().Select(e => new WarehouseUseDto
            {
                WarehouseName = e["WareHouseName"] + "",
                StockAllNum = e["stockNum"] + "",
                StockUseNum = e["useNum"] + ""
            });
            return result;
        }
@@ -50,7 +196,7 @@
        /// <param name="wareHouseNo">所属仓库</param>
        /// <param name="areaNo">所属区域</param>
        /// <returns></returns>
        public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo,
        public async Task<List<MateDataStockDto>> GetDataStockList(string selectType, string skuNo, string skuName, string ownerNo,
            string ownerName, string lotNo, string status, string inspectStatus, string wareHouseNo, string areaNo)
        {
            Expression<Func<DataStockDetail, bool>> item = Expressionable.Create<DataStockDetail>()
@@ -70,53 +216,53 @@
            var data = Db.Queryable<DataStockDetail>().Where(item);
            List<MateDataStockDto> data2;
            switch (selectType)
            switch (selectType)
            {
                // 按物料统计
                case "0":
                     data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
                            SkuName = a.SkuName, //物料名称
                            Standard = a.Standard, //规格
                            //LotNo = a.LotNo, //批次
                            //LotText = a.LotText, //批次描述
                            //OwnerNo = a.OwnerNo, //货主编码
                            //OwnerName = a.OwnerName, //货主名称
                            Status = status, //库存状态
                            InspectStatus = inspectStatus, //质检状态
                            Qty =  SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                            LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                        }).ToListAsync();
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard })
                       .Select(a => new MateDataStockDto()
                       {
                           SkuNo = a.SkuNo, //物料编码
                           SkuName = a.SkuName, //物料名称
                           Standard = a.Standard, //规格
                                                  //LotNo = a.LotNo, //批次
                                                  //LotText = a.LotText, //批次描述
                                                  //OwnerNo = a.OwnerNo, //货主编码
                                                  //OwnerName = a.OwnerName, //货主名称
                           Status = status, //库存状态
                           InspectStatus = inspectStatus, //质检状态
                           Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                           LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                           FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                           InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                       }).ToListAsync();
                    break;
                // 按批次统计
                case "1":
                     data2 = await data.GroupBy(a => new { a.LotNo, a.LotText, a.SkuNo, a.SkuName, a.Standard })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
                            SkuName = a.SkuName, //物料名称
                            Standard = a.Standard, //规格
                            LotNo = a.LotNo, //批次
                            LotText = a.LotText, //批次描述
                            //OwnerNo = a.OwnerNo, //货主编码
                            //OwnerName = a.OwnerName, //货主名称
                            Status = status, //库存状态
                            InspectStatus = inspectStatus, //质检状态
                            Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                            LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                        }).ToListAsync();
                    data2 = await data.GroupBy(a => new { a.LotNo, a.LotText, a.SkuNo, a.SkuName, a.Standard })
                       .Select(a => new MateDataStockDto()
                       {
                           SkuNo = a.SkuNo, //物料编码
                           SkuName = a.SkuName, //物料名称
                           Standard = a.Standard, //规格
                           LotNo = a.LotNo, //批次
                           LotText = a.LotText, //批次描述
                                                //OwnerNo = a.OwnerNo, //货主编码
                                                //OwnerName = a.OwnerName, //货主名称
                           Status = status, //库存状态
                           InspectStatus = inspectStatus, //质检状态
                           Qty = SqlFunc.AggregateSumNoNull(a.Qty), //库存数量
                           LockQty = SqlFunc.AggregateSumNoNull(a.LockQty), //锁定数量
                           FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                           InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty)
                       }).ToListAsync();
                    break;
                // 按质检状态统计
                case "2":
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard,a.InspectStatus})
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.InspectStatus })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
@@ -133,7 +279,7 @@
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty),
                        }).ToListAsync();
                    break;
                    break;
                // 按货主统计
                case "3":
@@ -154,11 +300,11 @@
                            FrozenQty = SqlFunc.AggregateSumNoNull(a.LockQty),
                            InspectQty = SqlFunc.AggregateSumNoNull(a.InspectQty),
                        }).ToListAsync();
                     break;
                    break;
                // 默认统计(物料 批次 质检 库存状态 货主)
                default:
                    data2 = await data.GroupBy(a => new {  a.SkuNo, a.SkuName, a.Standard ,a.LotNo, a.LotText, a.OwnerNo, a.OwnerName , a.InspectStatus })
                    data2 = await data.GroupBy(a => new { a.SkuNo, a.SkuName, a.Standard, a.LotNo, a.LotText, a.OwnerNo, a.OwnerName, a.InspectStatus })
                        .Select(a => new MateDataStockDto()
                        {
                            SkuNo = a.SkuNo, //物料编码
@@ -348,9 +494,9 @@
                .GroupBy(a => new { a.LotNo, a.SkuNo, a.SkuName })
                .Select(a => new TotalRecordDto()
                {
                    LotNo=a.LotNo,
                    SkuNo=a.SkuNo,
                    SkuName=a.SkuName,
                    LotNo = a.LotNo,
                    SkuNo = a.SkuNo,
                    SkuName = a.SkuName,
                    RQty = SqlFunc.AggregateSumNoNull(a.Qty),
                    RFactQty = (decimal)SqlFunc.AggregateSum(a.FactQty),
                    RCompleteQty = (decimal)SqlFunc.AggregateSum(a.CompleteQty),
@@ -435,22 +581,22 @@
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <returns></returns>
        public List<TotalRecordDto> GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo,string startTime, string endTime)
        public List<TotalRecordDto> GetDetailedRecord(string skuNo, string skuName, string lotNo, string palletNo, string startTime, string endTime)
        {
            // 获取入库单明细信息
            var asnList = Db.Queryable<BllPalletBind,BllArrivalNoticeDetail>
                ((tb1,tb2)=>new JoinQueryInfos(
            var asnList = Db.Queryable<BllPalletBind, BllArrivalNoticeDetail>
                ((tb1, tb2) => new JoinQueryInfos(
                 JoinType.Left, tb1.ASNDetailNo == tb2.Id
                ))
                .Where((tb1,tb2) => tb1.IsDel == "0" && tb2.IsDel == "0")
                .Where((tb1, tb2) => tb1.IsDel == "0" && tb2.IsDel == "0")
                .WhereIF(!string.IsNullOrWhiteSpace(startTime), tb1 => tb1.CompleteTime >= Convert.ToDateTime(startTime))
                .WhereIF(!string.IsNullOrWhiteSpace(endTime), tb1 => tb1.CompleteTime <= Convert.ToDateTime(endTime).AddDays(1))
                .WhereIF(!string.IsNullOrEmpty(palletNo), tb1 => tb1.PalletNo.Contains(palletNo))
                .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1,tb2) => tb2.SkuNo.Contains(skuNo))
                .WhereIF(!string.IsNullOrEmpty(skuNo), (tb1, tb2) => tb2.SkuNo.Contains(skuNo))
                .WhereIF(!string.IsNullOrEmpty(skuName), (tb1, tb2) => tb2.SkuName.Contains(skuName))
                .WhereIF(!string.IsNullOrEmpty(lotNo), (tb1, tb2) => tb2.LotNo.Contains(lotNo))
                //.GroupBy((tb1,tb2) => new { tb2.LotNo, tb2.SkuNo, tb2.SkuName })
                .Select((tb1,tb2) => new TotalRecordDto()
                .Select((tb1, tb2) => new TotalRecordDto()
                {
                    ASNNo = tb2.ASNNo,
                    LotNo = tb1.LotNo,
@@ -463,7 +609,7 @@
                    CompleteTime = tb2.CreateTime,
                    LotText = tb1.LotText,
                    SupplierLot = tb2.SupplierLot,
                    SONo = "",
                    CTaskNo = "",
                    CCreateTime = null,