using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using SqlSugar;
namespace MES.Service.service.Warehouse;
///
/// 销售托盘管理服务
///
public class SalesPalletManager : Repository
{
///
/// 获取销售托盘分页数据
///
/// 查询请求参数
///
public (List item, int TotalCount)
GetSalesPalletPage(SalesPalletSearchDto request)
{
var query = Db.Queryable()
.LeftJoin((z, a) => a.BillNo == z.BillNo)
.LeftJoin((z, a, b) =>
a.ErpId == b.ErpHeadId && z.ItemId.ToString() == b.MaterialId)
.LeftJoin((z, a, b, s) => s.Id.ToString() == b.MaterialId)
.LeftJoin((z, a, b, s, u) =>
u.Id.ToString() == b.SalesUnitId)
.LeftJoin((z, a, b, s, u, su) => su.Fcode == z.CheckUser)
.LeftJoin((z, a, b, s, u, su, d) =>
d.DepotId.ToString() == b.Warehouse)
.Where((z, a, b, s, u, su, d)=>z.SalesQuantity > 0)
.WhereIF(!string.IsNullOrEmpty(request.BillNo),
(z, a, b, s, u, su, d) => z.BillNo.Contains(request.BillNo))
.WhereIF(!string.IsNullOrEmpty(request.ItemNo),
(z, a, b, s, u, su, d) => s.ItemNo.Contains(request.ItemNo))
.WhereIF(!string.IsNullOrEmpty(request.ItemName),
(z, a, b, s, u, su, d) => s.ItemName.Contains(request.ItemName))
.WhereIF(request.Status.HasValue,
(z, a, b, s, u, su, d) => z.Status == request.Status)
.Select((z, a, b, s, u, su, d) => new SalesPalletQueryDto
{
Id = z.Id,
Status = z.Status,
CheckDate = z.CheckDate,
CheckUser = su.Fname,
BillNo = z.BillNo,
ItemNo = s.ItemNo,
ItemName = s.ItemName,
ItemModel = s.ItemModel,
UnitName = u.Fname,
Xsdd = b.SalesQuantity,
Yb = z.SalesQuantity,
Wyj = a.BillNo + s.Id.ToString()
});
var totalCount = 0;
var items = query.ToPageList(request.PageIndex, request.Limit,
ref totalCount);
return (items, totalCount);
}
public List
GetSalesPalletDetail(SalesPalletDetailQueryDto request)
{
var subQuery = Db.Queryable()
.LeftJoin((a, b) => a.TicketNo == b.Daa001)
.LeftJoin((a, b, it) => it.Id.ToString() == b.Daa002)
.GroupBy((a, b, it) => new { a.Stackcode, it.Id })
.Select((a, b, it) => new
{
StackCode = a.Stackcode,
ItemId = it.Id,
ItemNo = SqlFunc.AggregateMax(it.ItemNo),
ItemName = SqlFunc.AggregateMax(it.ItemName),
ItemModel = SqlFunc.AggregateMax(it.ItemModel)
});
var query = Db.Queryable()
.LeftJoin(subQuery, (b, o) => b.Stackcode == o.StackCode)
.Where((b, o) => b.Mid == request.Mid)
.Select((b, o) => new SalesPalletDetailQueryDto
{
Id = b.Id,
Mid = b.Mid,
BillNo = b.BillNo,
Stackcode = b.Stackcode,
Qty = b.Qty,
ItemNo = o.ItemNo,
ItemName = o.ItemName,
ItemModel = o.ItemModel
});
return query.ToList();
}
///
/// 创建销售订单发货
///
/// 发货请求参数
///
public int CreateSalesOrderShipping(CreateSalesOrderShippingRequestDto request)
{
//验证request.PalletIds是否为空
if (request.PalletIds == null || !request.PalletIds.Any())
{
throw new Exception("销售托盘ID列表不能为空");
}
//调用GetSalesPalletDetail方法拿到返回值
var allDetails = new List();
foreach (var palletId in request.PalletIds)
{
var detailQuery = new SalesPalletDetailQueryDto { Mid = palletId };
var details = GetSalesPalletDetail(detailQuery);
allDetails.AddRange(details);
}
if (!allDetails.Any())
{
throw new Exception("未找到销售托盘明细数据");
}
//提取出结果集的Stackcode并去重
var stackCodes = allDetails
.Where(d => !string.IsNullOrEmpty(d.Stackcode))
.Select(d => d.Stackcode)
.Distinct()
.ToList();
if (!stackCodes.Any())
{
throw new Exception("未找到有效的栈板码");
}
//select * from MES_INV_ITEM_STOCKS where STACKCODE in (Stackcode去重后的结果);
var stockItems = Db.Queryable()
.Where(s => stackCodes.Contains(s.StackCode) && s.Quantity > 0)
.ToList();
if (!stockItems.Any())
{
throw new Exception("未找到对应的库存数据");
}
//调用MesInvItemStocksManager.CreateReturnMaterialRequest方法
var stockManager = new MesInvItemStocksManager();
var itemStockQuery = new ItemStockQueryDto
{
UserCode = request.UserCode,
Station = request.Station,
ItemBarcodes = stackCodes
};
stockManager.CreateReturnMaterialRequest(itemStockQuery);
return stackCodes.Count;
}
}