using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Core;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_DTO.Stock;
|
using WIDESEA_IStockService;
|
using WIDESEA_Model.Models;
|
using WIDESEA_Core.Helper;
|
using WIDESEA_Core.Utilities;
|
using System.Reflection;
|
using System.Dynamic;
|
using Magicodes.ExporterAndImporter.Excel;
|
using Magicodes.ExporterAndImporter.Core;
|
using WIDESEA_Core.HostedService;
|
using WIDESEA_Core.DB.Models;
|
using WIDESEA_IOutboundRepository;
|
using WIDESEA_IStockRepository;
|
using WIDESEA_Common.StockEnum;
|
using WIDESEA_IBasicRepository;
|
using WIDESEA_Common.WareHouseEnum;
|
|
namespace WIDESEA_StockService
|
{
|
public partial class ProStockViewService : IProStockViewService
|
{
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly SqlSugarClient _dbBase;
|
private readonly IOutboundRepository _outboundRepository;
|
private readonly IStockRepository _stockRepository;
|
private readonly IBasicRepository _basicRepository;
|
|
public ProStockViewService(IUnitOfWorkManage unitOfWorkManage, IOutboundRepository outboundRepository, IStockRepository stockRepository,IBasicRepository basicRepository)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_dbBase = unitOfWorkManage.GetDbClient();
|
_outboundRepository = outboundRepository;
|
_stockRepository = stockRepository;
|
_basicRepository = basicRepository;
|
}
|
|
public virtual PageGridData<ProStockViewDTO> GetPageData(PageDataOptions options)
|
{
|
try
|
{
|
List<ProStockViewDTO> stockViewDTOs = new List<ProStockViewDTO>();
|
|
string where = string.Empty;
|
ISugarQueryable<Dt_ProStockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_ProStockInfo>().Includes(x => x.proStockInfoDetails);
|
if (!string.IsNullOrEmpty(options.Wheres))
|
{
|
try
|
{
|
List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
|
if (searchParametersList.Count > 0)
|
{
|
{
|
SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower());
|
if (searchParameters != null)
|
{
|
sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters.Value)));
|
}
|
}
|
|
{
|
SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower());
|
if (searchParameters != null)
|
{
|
sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(searchParameters.Value)));
|
}
|
}
|
{
|
SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.SpecifyVer).FirstLetterToLower());
|
if (searchParameters != null)
|
{
|
sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.SpecifyVer.Contains(searchParameters.Value)));
|
}
|
}
|
|
}
|
|
}
|
catch { }
|
}
|
string whereSto = GetDataRole(typeof(Dt_ProStockInfo));
|
sugarQueryable1 = sugarQueryable1.Where(whereSto);
|
EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
|
|
string whereLo = GetDataRole(typeof(Dt_LocationInfo));
|
ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>().Where(whereLo);
|
|
EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
|
|
ISugarQueryable<ProStockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
|
=> new ProStockViewDTO
|
{
|
ProStockAttribute=b.ProStockAttribute,
|
LocationCode = b.LocationCode,
|
Column = a.Column,
|
WarehouseId = b.WarehouseId,
|
CreateDate = b.CreateDate,
|
Creater = b.Creater,
|
EnalbeStatus = a.EnableStatus,
|
Layer = a.Layer,
|
LocationName = a.LocationName,
|
LocationStatus = a.LocationStatus,
|
Modifier = b.Modifier,
|
ModifyDate = b.ModifyDate,
|
PalletCode = b.PalletCode,
|
StockRemark = b.Remark,
|
Row = a.Row,
|
ProStockId = b.Id,
|
StockStatus = b.StockStatus,
|
Details = b.proStockInfoDetails,
|
SumStocks=b.proStockInfoDetails.Sum(x=>x.StockPcsQty)
|
});
|
|
var pklist = sugarQueryable1.Where(b => b.LocationCode == "成品待发货区" || b.LocationCode == "成品包装拣货区").Select(b => new ProStockViewDTO
|
{
|
ProStockAttribute = b.ProStockAttribute,
|
LocationCode = b.LocationCode,
|
WarehouseId = b.WarehouseId,
|
CreateDate = b.CreateDate,
|
Creater = b.Creater,
|
LocationName = b.LocationCode,
|
Modifier = b.Modifier,
|
ModifyDate = b.ModifyDate,
|
PalletCode = b.PalletCode,
|
StockRemark = b.Remark,
|
ProStockId = b.Id,
|
StockStatus = b.StockStatus,
|
Details = b.proStockInfoDetails,
|
SumStocks = b.proStockInfoDetails.Sum(x => x.StockPcsQty)
|
});
|
|
int totalCount = 0;
|
int pktotalCount = 0;
|
|
stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount);
|
stockViewDTOs.AddRange(pklist.ToPageList(options.Page, options.Rows, ref pktotalCount));
|
|
stockViewDTOs.ForEach(x =>
|
{
|
x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct());
|
x.ProductVersion = string.Join(",", x.Details.Select(x => x.ProductVersion).Distinct());
|
x.SpecifyVer = string.Join(",", x.Details.Select(x => x.SpecifyVer).Distinct());
|
x.DateCode = x.Details.FirstOrDefault()?.DateCode ?? "";
|
x.LotNumber = x.Details.FirstOrDefault()?.LotNumber ?? "";
|
x.ERPOrder = x.Details.FirstOrDefault()?.ERPOrder ?? "";
|
x.SaleOrder= x.Details.FirstOrDefault()?.SaleOrder ?? "";
|
x.MoNumber = x.Details.FirstOrDefault()?.MoNumber ?? "";
|
}
|
);
|
return new PageGridData<ProStockViewDTO>(totalCount + pktotalCount, stockViewDTOs.OrderByDescending(x=>x.CreateDate).ToList());
|
}
|
catch (Exception ex)
|
{
|
|
}
|
return new PageGridData<ProStockViewDTO>();
|
}
|
|
public virtual object GetDetailPage(PageDataOptions pageData)
|
{
|
Type t = typeof(ProStockViewDTO);
|
|
if (pageData.Value == null) return new PageGridData<object>(total: 0, null);
|
string keyName = t.GetKeyName();
|
////生成查询条件
|
//Expression<Func<TEntity, bool>> whereExpression = keyName.CreateExpression<TEntity>(pageData.Value, LinqExpressionType.Equal);
|
int totalCount = 0;
|
PropertyInfo? propertyInfo = t.GetProperties().FirstOrDefault(x => x.GetCustomAttribute<Navigate>() != null);
|
if (propertyInfo != null)
|
{
|
Type detailType = propertyInfo.PropertyType.GetGenericArguments()[0];
|
Navigate? navigate = propertyInfo.GetCustomAttribute<Navigate>();
|
if (navigate != null)
|
{
|
List<ExpandoObject> list = _dbBase.Queryable(detailType.Name, "detail").Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount);
|
return new PageGridData<ExpandoObject>(totalCount, list);
|
}
|
}
|
return new PageGridData<object>(total: 0, null);
|
}
|
public virtual WebResponseContent Export(PageDataOptions options)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Type t = typeof(ProStockViewDTO);
|
|
string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport";
|
IExporter exporter = new ExcelExporter();
|
options.Page = 1;
|
options.Rows = 30;
|
options.Order = "desc";
|
options.Sort = "proStockId";
|
List<ProStockViewDTO> stockViewDTOs = new List<ProStockViewDTO>();
|
List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.成品.ToString());
|
string where = string.Empty;
|
ISugarQueryable<Dt_ProStockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_ProStockInfo>().Includes(x => x.proStockInfoDetails);
|
if (!string.IsNullOrEmpty(options.Wheres))
|
{
|
try
|
{
|
List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>();
|
if (searchParametersList.Count > 0)
|
{
|
{
|
SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower());
|
if (searchParameters != null)
|
{
|
sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters.Value)));
|
}
|
}
|
|
{
|
SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower());
|
if (searchParameters != null)
|
{
|
sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(searchParameters.Value)));
|
}
|
}
|
|
}
|
|
}
|
catch { }
|
}
|
string whereSto = GetDataRole(typeof(Dt_ProStockInfo));
|
sugarQueryable1 = sugarQueryable1.Where(whereSto);
|
EntityProperties.ValidatePageOptions(options, ref sugarQueryable1);
|
|
string whereLo = GetDataRole(typeof(Dt_LocationInfo));
|
ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>().Where(whereLo);
|
|
EntityProperties.ValidatePageOptions(options, ref sugarQueryable);
|
|
ISugarQueryable<ProStockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a)
|
=> new ProStockViewDTO
|
{
|
ProStockAttribute = b.ProStockAttribute,
|
LocationCode = b.LocationCode,
|
Column = a.Column,
|
WarehouseId = b.WarehouseId,
|
CreateDate = b.CreateDate,
|
Creater = b.Creater,
|
EnalbeStatus = a.EnableStatus,
|
Layer = a.Layer,
|
LocationName = a.LocationName,
|
LocationStatus = a.LocationStatus,
|
Modifier = b.Modifier,
|
ModifyDate = b.ModifyDate,
|
PalletCode = b.PalletCode,
|
StockRemark = b.Remark,
|
Row = a.Row,
|
ProStockId = b.Id,
|
StockStatus = b.StockStatus,
|
Details = b.proStockInfoDetails,
|
SumStocks = b.proStockInfoDetails.Sum(x => x.StockPcsQty),
|
|
});
|
|
//var pklist = sugarQueryable1.Where(b => b.LocationCode == "平库位").Select(b => new StockViewDTO
|
//{
|
// LocationCode = b.LocationCode,
|
// Column = 0,
|
// WarehouseId = b.WarehouseId,
|
// CreateDate = b.CreateDate,
|
// Creater = b.Creater,
|
// Depth = 0,
|
// EnalbeStatus = EnableStatusEnum.Normal.ObjToInt(),
|
// Layer = 0,
|
// LocationName = "平库位",
|
// LocationStatus = LocationStatusEnum.InStock.ObjToInt(),
|
// LocationType = LocationTypeEnum.Undefined.ObjToInt(),
|
// Modifier = b.Modifier,
|
// ModifyDate = b.ModifyDate,
|
// PalletCode = b.PalletCode,
|
// StockRemark = b.Remark,
|
// RoadwayNo = "平库",
|
// Row = 0,
|
// StockId = b.Id,
|
// StockStatus = b.StockStatus,
|
// Details = b.Details,
|
//});
|
stockViewDTOs = list.ToList();
|
//stockViewDTOs.AddRange(pklist.ToList());
|
stockViewDTOs.ForEach(x =>
|
{
|
x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct());
|
x.ProductVersion = string.Join(",", x.Details.Select(x => x.ProductVersion).Distinct());
|
x.SpecifyVer = string.Join(",", x.Details.Select(x => x.SpecifyVer).Distinct());
|
x.DateCode = x.Details.FirstOrDefault()?.DateCode ?? "";
|
x.LotNumber = x.Details.FirstOrDefault()?.LotNumber ?? "";
|
x.ERPOrder = x.Details.FirstOrDefault()?.ERPOrder ?? "";
|
x.SaleOrder = x.Details.FirstOrDefault()?.SaleOrder ?? "";
|
x.MoNumber = x.Details.FirstOrDefault()?.MoNumber ?? "";
|
x.StockRemark = warehouses.FirstOrDefault(v => v.WarehouseId == x.WarehouseId).WarehouseName;
|
}
|
);
|
|
byte[] data = exporter.ExportAsByteArray(stockViewDTOs).Result;
|
|
string fileName = "成品库存视图.xlsx";
|
|
FileHelper.WriteFile(savePath, fileName, data);
|
|
content = WebResponseContent.Instance.OK(data: savePath + "\\" + fileName);
|
}
|
catch (Exception ex)
|
{
|
content = WebResponseContent.Instance.Error(ex.Message);
|
}
|
return content;
|
}
|
private string GetDataRole(Type type)
|
{
|
try
|
{
|
UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId);
|
if (userRole == null)
|
throw new Exception($"无权限");
|
|
if (type.IsAssignableFrom(typeof(BaseWarehouseEntity)) || type.GetProperty(nameof(BaseWarehouseEntity.WarehouseId)) != null)
|
{
|
if (userRole.WarehouseIds.Count > 0)
|
{
|
return $"{nameof(BaseWarehouseEntity.WarehouseId)} in ({userRole.WarehouseIds.Serialize().Replace("[", "").Replace("]", "")})";
|
}
|
|
else
|
return $"1 != 1";
|
}
|
else
|
{
|
return "1 = 1";
|
}
|
|
//UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId);
|
//if (userRole == null)
|
// throw new Exception($"无权限");
|
|
//if (userRole.AuthorityScope == (int)AuthorityScopeEnum.CurrentRole)
|
//{
|
// List<int> userId = PermissionDataHostService.UserRoles.Where(x => x.RoleId == userRole.RoleId).Select(x => x.UserId).ToList();
|
// return $"creater in ({userId.Serialize()})";
|
//}
|
//else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.OnlySelf)
|
//{
|
// return $"creater = '{userRole.UserName}'";
|
//}
|
//else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.None)
|
//{
|
// return $"1 != 1";
|
//}
|
//return "";
|
}
|
catch (Exception ex)
|
{
|
throw new Exception($"无权限,{ex.Message}");
|
}
|
}
|
public List<ProStockViewDTO> GetProPKSelectStocks(int orderId)
|
{
|
try
|
{
|
Dt_ProOutOrderDetail outOrderDetail = _outboundRepository.ProOutOrderDetailRepository.QueryFirst(x => x.Id == orderId);
|
if (outOrderDetail == null)
|
{
|
throw new Exception($"未找到出库单明细");
|
}
|
List<ProStockViewDTO> stockViewDTOs = new List<ProStockViewDTO>();
|
ISugarQueryable<Dt_ProStockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_ProStockInfo>().Includes(x => x.proStockInfoDetails);
|
var pklist = sugarQueryable1.Where(b => b.LocationCode == "成品待发货区" && b.StockStatus==StockStatusEmun.平库入库完成.ObjToInt() && (b.ShipmentOrder==null|| b.ShipmentOrder =="")).Where(x=>x.proStockInfoDetails.Any(v=>v.ProductCode== outOrderDetail.PCode)).Select(b => new ProStockViewDTO
|
{
|
ProStockAttribute = b.ProStockAttribute,
|
LocationCode = b.LocationCode,
|
WarehouseId = b.WarehouseId,
|
CreateDate = b.CreateDate,
|
Creater = b.Creater,
|
LocationName = b.LocationCode,
|
Modifier = b.Modifier,
|
ModifyDate = b.ModifyDate,
|
PalletCode = b.PalletCode,
|
StockRemark = b.Remark,
|
ProStockId = b.Id,
|
StockStatus = b.StockStatus,
|
Details = b.proStockInfoDetails,
|
});
|
stockViewDTOs.AddRange(pklist.ToList());
|
stockViewDTOs.ForEach(x =>
|
{
|
x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct());
|
x.ProductVersion = string.Join(",", x.Details.Select(x => x.ProductVersion).Distinct());
|
x.SpecifyVer = string.Join(",", x.Details.Select(x => x.SpecifyVer).Distinct());
|
x.DateCode = x.Details.FirstOrDefault()?.DateCode ?? "";
|
x.LotNumber = x.Details.FirstOrDefault()?.LotNumber ?? "";
|
x.ERPOrder = x.Details.FirstOrDefault()?.ERPOrder ?? "";
|
x.SaleOrder = x.Details.FirstOrDefault()?.SaleOrder ?? "";
|
x.MoNumber = x.Details.FirstOrDefault()?.MoNumber ?? "";
|
x.SumStocks = x.Details.Sum(x => x.StockPcsQty);
|
}
|
);
|
return stockViewDTOs.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList();
|
//return _stockRepository.ProStockInfoRepository.QueryTabs<Dt_ProStockInfo, Dt_ProStockInfoDetail, ProStockViewDTO>((a, b) => a.Id == b.ProStockId, (a, b) => new ProStockViewDTO
|
//{
|
// LocationCode = a.LocationCode,
|
// ProductCode = b.ProductCode,
|
// ProStockAttribute = a.ProStockAttribute,
|
// ProductVersion=b.ProductVersion,
|
// DateCode=b.DateCode,
|
// ProStockId=a.Id,
|
// SumStocks=b.StockPcsQty,
|
// SaleOrder=b.SaleOrder,
|
// PalletCode = a.PalletCode,
|
// CreateDate=a.CreateDate,
|
// ERPOrder=b.ERPOrder,
|
// MoNumber=b.MoNumber
|
//}, a => a.LocationCode == "成品待发货区", b => b.ProductCode == outOrderDetail.PCode, x => true).GroupBy(x => x.PalletCode).Select(x => new ProStockViewDTO
|
//{
|
// LocationCode = x.FirstOrDefault()?.LocationCode ?? "",
|
// ProductCode = x.FirstOrDefault()?.ProductCode ?? "",
|
// ProductVersion = x.FirstOrDefault()?.ProductVersion ?? "",
|
// DateCode = x.FirstOrDefault()?.DateCode ?? "",
|
// ProStockId = x.FirstOrDefault().ProStockId,
|
// SumStocks=x.FirstOrDefault().SumStocks,
|
// SaleOrder = x.FirstOrDefault()?.SaleOrder ?? "",
|
// ProStockAttribute=x.FirstOrDefault()?.ProStockAttribute ?? 0,
|
// PalletCode = x.Key,
|
// ERPOrder=x.FirstOrDefault()?.ERPOrder ?? "",
|
// MoNumber=x.FirstOrDefault()?.MoNumber ?? "",
|
// CreateDate=x.FirstOrDefault()?.CreateDate ?? new DateTime()
|
//}).ToList();
|
}
|
catch (Exception ex)
|
{
|
throw new Exception(ex.Message);
|
}
|
}
|
}
|
}
|