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;
|
|
/// <summary>
|
/// 销售托盘管理服务
|
/// </summary>
|
public class SalesPalletManager : Repository<SalesPallet>
|
{
|
/// <summary>
|
/// 获取销售托盘分页数据
|
/// </summary>
|
/// <param name="request">查询请求参数</param>
|
/// <returns></returns>
|
public (List<SalesPalletQueryDto> item, int TotalCount)
|
GetSalesPalletPage(SalesPalletSearchDto request)
|
{
|
var query = Db.Queryable<SalesPallet>()
|
.LeftJoin<SalesDeliveryNotice>((z, a) => a.BillNo == z.BillNo)
|
.LeftJoin<SalesDeliveryNoticeDetail>((z, a, b) =>
|
a.ErpId == b.ErpHeadId && z.ItemId.ToString() == b.MaterialId)
|
.LeftJoin<MesItems>((z, a, b, s) => s.Id.ToString() == b.MaterialId)
|
.LeftJoin<MesUnit>((z, a, b, s, u) =>
|
u.Id.ToString() == b.SalesUnitId)
|
.LeftJoin<SysUser>((z, a, b, s, u, su) => su.Fcode == z.CheckUser)
|
.LeftJoin<MesDepots>((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<SalesPalletDetailQueryDto>
|
GetSalesPalletDetail(SalesPalletDetailQueryDto request)
|
{
|
var subQuery = Db.Queryable<MesPalletBinding1>()
|
.LeftJoin<Womdaa>((a, b) => a.TicketNo == b.Daa001)
|
.LeftJoin<MesItems>((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<SalesPalletDetail>()
|
.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();
|
}
|
|
/// <summary>
|
/// 创建销售订单发货
|
/// </summary>
|
/// <param name="request">发货请求参数</param>
|
/// <returns></returns>
|
public int CreateSalesOrderShipping(CreateSalesOrderShippingRequestDto request)
|
{
|
//验证request.PalletIds是否为空
|
if (request.PalletIds == null || !request.PalletIds.Any())
|
{
|
throw new Exception("销售托盘ID列表不能为空");
|
}
|
|
//调用GetSalesPalletDetail方法拿到返回值
|
var allDetails = new List<SalesPalletDetailQueryDto>();
|
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<MesInvItemStocks>()
|
.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;
|
}
|
}
|