Files
WMS-Api/src/WMS.Web.Repositories/InStockTaskRepositories.cs
2023-12-20 11:59:18 +08:00

544 lines
23 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WMS.Web.Core;
using WMS.Web.Core.Dto;
using WMS.Web.Core.Dto.Erp;
using WMS.Web.Core.Dto.Erp.Org;
using WMS.Web.Core.Dto.Erp.Supplier;
using WMS.Web.Core.Dto.InStockTask;
using WMS.Web.Core.Help;
using WMS.Web.Core.Internal.Results;
using WMS.Web.Domain.Entitys;
using WMS.Web.Domain.Infrastructure;
using WMS.Web.Domain.IService.Public;
using WMS.Web.Domain.Mappers;
using WMS.Web.Domain.Values;
using WMS.Web.Domain.Values.Single;
using WMS.Web.Repositories.Configuration;
namespace WMS.Web.Repositories
{
/// <summary>
/// 入库任务表-仓储
/// </summary>
public class InStockTaskRepositories : IAllFielRepositories<InStockTaskQueryRequest>, IInStockTaskRepositories
{
private readonly IMapper _mapper;
private readonly IServiceProvider _serviceProvider;
private readonly RepositoryDbContext _context;
private readonly ISingleDataService _singleDataService;
private readonly IBasicsRepositories _basicsRepositories;
private readonly ILoginRepositories _loginRepositories;
private readonly IErpService _erpService;
private readonly IErpBasicDataExtendService _erpBasicDataExtendService;
public InStockTaskRepositories(RepositoryDbContext context,
IMapper mapper,
IErpService erpService,
IBasicsRepositories basicsRepositories,
IServiceProvider serviceProvider,
ISingleDataService singleDataService,
ILoginRepositories loginRepositories,
IErpBasicDataExtendService erpBasicDataExtendService)
{
_context = context;
_mapper = mapper;
_erpService = erpService;
_basicsRepositories = basicsRepositories;
_serviceProvider = serviceProvider;
_singleDataService = singleDataService;
_loginRepositories = loginRepositories;
_erpBasicDataExtendService = erpBasicDataExtendService;
}
/// <summary>
/// 详情
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<InStockTask> Get(int id)
{
var entity = await _context.InStockTask
.Include(s => s.Details)
.FirstOrDefaultAsync(f => f.Id == id);
return entity;
}
/// <summary>
/// 实体:根据来源单号
/// </summary>
/// <param name="sourceBillNo"></param>
/// <returns></returns>
public async Task<InStockTask> GetBySource(string sourceBillNo)
{
var entity = await _context.InStockTask
.Include(s => s.Details)
.Where(w => w.SourceBillNo == sourceBillNo).FirstOrDefaultAsync();
return entity;
}
/// <summary>
/// 列表
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public async Task<List<InStockTask>> GetList(List<int> ids)
{
var entitys = await _context.InStockTask
.Include(s => s.Details)
.Where(f => ids.Contains(f.Id))
.ToListAsync();
return entitys;
}
/// <summary>
/// 列表-根据明细中的来源单号
/// </summary>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<List<InStockTask>> GetListBy(List<string> sourceBillNos)
{
var entitys = await _context.InStockTask
.Include(s => s.Details)
.Where(w => sourceBillNos.Contains(w.SourceBillNo))
.ToListAsync();
return entitys;
}
/// <summary>
/// 列表-根据来源单号模糊搜索
/// </summary>
/// <param name="sourceBillNos"></param>
/// <returns></returns>
public async Task<List<InStockTask>> GetListBy(string sourceBillNos)
{
var entitys = await _context.InStockTask
.Include(s => s.Details)
.Where(w => EF.Functions.Like(w.SourceBillNo, "%" + sourceBillNos + "%"))
.ToListAsync();
return entitys;
}
/// <summary>
/// 列表-根据来源单号模糊-采购上架使用
/// </summary>
/// <param name="sourceBillNo"></param>
/// <returns></returns>
public async Task<List<SourceBillNoQueryResponse>> GetListBy(InStockTaskBillNoQueryRequest dto)
{
//1.获取物料集合
var materials_result = await _erpService.BillQueryForMaterial();
var materials = new List<ErpMaterialDto>();
if (materials_result.IsSuccess)
materials = materials_result.Data.ToList();
//这里只查状态为:部分入库和等待收货
var query = _context.InStockTaskDetails
.GroupJoin(_context.InStockTask, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders })
.SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order })
.Where(w => EF.Functions.Like(w.order.SourceBillNo, "%" + dto.SourceBillNo + "%") && w.order.Type == InstockType.Purchase && (w.order.Status == InstockStatus.Part || w.order.Status == InstockStatus.Wait || w.order.Status== InstockStatus.WaitInStock));
//仓库
if (!string.IsNullOrEmpty(dto.StockCode))
query = query.Where(x => x.detail.StockCode == dto.StockCode);
var list = await query.Select(s => new SourceBillNoQueryResponse()
{
Id = s.order.Id,
DetailsId = s.detail.Id,
SupplierId = s.detail.SupplierId,
OrgId = s.detail.OrgId,
SourceBillNo = s.order.SourceBillNo,
MaterialId = s.detail.MaterialId,
StockCode = s.detail.StockCode,
StockName = _singleDataService.GetSingleData(SingleAction.StocksJoinOrgCode, _loginRepositories.CompanyId, s.detail.StockCode + s.detail.OrgCode),
MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.detail.MaterialId),
MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.detail.MaterialId),
Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.detail.MaterialId),
Qty = s.detail.AccruedQty,
DeliveredQty = s.detail.DeliveredQty,
ReceiveQty = s.detail.ReceiveQty,
//采购:可入库数量=应入库数量-收货数量-已交数量+该明细的入库数量之和;
AvailableQty = s.detail.AccruedQty - s.detail.ReceiveQty- s.detail.DeliveredQty,
Remark = s.detail.Remark,
ErpDetailId=s.detail.ErpDetailId
}).ToListAsync();
//找到入库单通过erp明细ID
var erpDetIds = list.GroupBy(x => x.ErpDetailId).Select(x => x.Key).ToList();
var instockDets= await _context.InStockDetails.Where(x =>erpDetIds.Contains(x.ErpDetailId)).ToListAsync();
if (instockDets != null && instockDets.Count != 0)
{
list.ForEach(x =>
{
var current_instock_dets= instockDets.Where(t => t.ErpDetailId == x.ErpDetailId).ToList();
if (current_instock_dets != null && current_instock_dets.Count != 0 && x.ErpDetailId==current_instock_dets.FirstOrDefault().ErpDetailId)
{
//+该明细的入库数量之和;在这里处理
var instock_qty = current_instock_dets.Sum(x => x.Qty);
x.AvailableQty = x.AvailableQty + instock_qty;
}
});
}
return list;
}
/// <summary>
/// 列表-根据来源单模糊查询-非采购上架使用
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<List<SourceBillNoNoPurchaseQueryResponse>> GetListInfoBy(InStockTaskBillNoQueryRequest dto)
{
//1.获取物料集合
var materials_result = await _erpService.BillQueryForMaterial();
var materials = new List<ErpMaterialDto>();
if (materials_result.IsSuccess)
materials = materials_result.Data.ToList();
//这里只查状态为:部分入库和等待收货
var task_query = _context.InStockTask
.Where(w => EF.Functions.Like(w.SourceBillNo, "%" + dto.SourceBillNo + "%") && w.Type!= InstockType.Purchase && (w.Status == InstockStatus.Part || w.Status == InstockStatus.Wait || w.Status==InstockStatus.WaitInStock));
//找到头列表
var taskList = await task_query
.Select(x => new SourceBillNoNoPurchaseQueryResponse()
{
Id = x.Id,
SourceBillNo = x.SourceBillNo
}).ToListAsync();
if (taskList != null && taskList.Count != 0)
{
var ids = taskList.Select(x => x.Id).ToList();
//找明细
var query = _context.InStockTaskDetails.Where(x => ids.Contains(x.Fid));
//仓库
if (!string.IsNullOrEmpty(dto.StockCode))
query = query.Where(x => x.StockCode == dto.StockCode);
var task_details = await query.Select(s => new SourceBillNoNoPurchaseDetailsQueryResponse()
{
TaskId = s.Fid,
DetailsId = s.Id,
SupplierId = s.SupplierId,
OrgId = s.OrgId,
MaterialId = s.MaterialId,
StockCode = s.StockCode,
StockName = _singleDataService.GetSingleData(SingleAction.StocksJoinOrgCode, _loginRepositories.CompanyId, s.StockCode+s.OrgCode),
MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.MaterialId),
MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.MaterialId),
Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.MaterialId),
Qty = s.AccruedQty,
DeliveredQty = s.DeliveredQty,
//非采购:可入库数量=应入库数量-收货数量;
AvailableQty = s.AccruedQty - s.ReceiveQty,
Remark = s.Remark,
ErpDetailId=s.ErpDetailId
}).ToListAsync();
//找箱
var task_box = await _context.InstockTaskBox.Where(x => ids.Contains(x.TaskId))
.Select(s => new SourceBillNoNoPurchaseBoxQueryResponse()
{
Id = s.Id,
TaskId = s.TaskId,
BoxId = s.BoxId,
BoxBillNo = s.BoxBillNo
}).ToListAsync();
//对应头赋值:明细和箱
foreach (var item in taskList)
{
item.Details = task_details.Where(x => x.TaskId == item.Id).ToList();
item.Boxs = task_box.Where(x => x.TaskId == item.Id).ToList();
}
}
//排除:明细没有的任务单,因为前端过来的仓库参数和来源单号,该来源单的明细没有这个仓库的数据
var response = new List<SourceBillNoNoPurchaseQueryResponse>();
foreach (var item in taskList)
{
if (item.Details.Count != 0)
response.Add(item);
}
return response;
}
/// <summary>
/// 批量添加
/// </summary>
/// <param name="entitys"></param>
/// <param name="isTransaction"></param>
/// <returns></returns>
public async Task<bool> AddRange(List<InStockTask> entitys, bool isTransaction = true)
{
IDbContextTransaction _transaction = null;
if (isTransaction)
_transaction = _context.Database.BeginTransaction();
try
{
if (entitys != null && entitys.Count != 0)
{
await _context.InStockTask.AddRangeAsync(entitys);
await _context.SaveChangesAsync();
foreach (var item in entitys)
{
if (string.IsNullOrEmpty(item.BillNo))
//自动生成单据编号
item.MakeBillNo(item.Id);
}
await _context.SaveChangesAsync();
}
if (_transaction != null)
_transaction.Commit();
return true;
}
catch
{
if (_transaction != null)
_transaction.Rollback();
return false;
}
}
/// <summary>
/// 添加
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<InStockTask> Add(InStockTask entity, bool isTransaction = true)
{
IDbContextTransaction _transaction = null;
if (isTransaction)
_transaction = _context.Database.BeginTransaction();
try
{
//创建单据编号
entity.MakeBillNo(entity.Id);
await _context.InStockTask.AddAsync(entity);
var res = await _context.SaveChangesAsync();
if (_transaction != null)
_transaction.Commit();
return entity;
}
catch
{
if (_transaction != null)
_transaction.Rollback();
return null;
}
}
/// <summary>
/// 批量修改
/// </summary>
/// <param name="entitys"></param>
/// <returns></returns>
public async Task<bool> UpdateRange(List<InStockTask> entitys, bool isTransaction = true)
{
IDbContextTransaction _transaction = null;
if (isTransaction)
_transaction = _context.Database.BeginTransaction();
{
try
{
List<int> list = entitys.Select(s => s.Id).ToList();
var res = await _context.InStockTask.AsNoTracking().Include(x => x.Details).Where(f => list.Contains(f.Id)).ToListAsync();
_mapper.ToMapList(entitys, res);
await _context.SaveChangesAsync();
if (_transaction != null)
_transaction.Commit();
}
catch (Exception ex)
{
if (_transaction != null)
_transaction.Rollback();
return false;
}
return true;
}
}
/// <summary>
/// 修改
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<InStockTask> Update(InStockTask entity, bool isTransaction = true)
{
IDbContextTransaction _transaction = null;
if (isTransaction)
_transaction = _context.Database.BeginTransaction();
try
{
var model = await _context.InStockTask
.AsNoTracking()
.Include(s => s.Details)
.FirstOrDefaultAsync(f => f.Id == entity.Id);
if (model == null)
return null;
_mapper.Map(entity, model);
//子集单独映射
_mapper.ToMapList(entity.Details, model.Details);
await _context.SaveChangesAsync();
if (_transaction != null)
_transaction.Commit();
return model;
}
catch (Exception ex)
{
if (_transaction != null)
_transaction.Rollback();
return null;
}
}
/// <summary>
/// 导出
/// </summary>
/// <param name="dto"></param>
/// <param name="companyId"></param>
/// <returns></returns>
public async Task<(object obj, int total)> GetListField(InStockTaskQueryRequest dto, int companyId)
{
return await GetPagedList(dto, companyId);
}
/// <summary>
/// 列表-分页
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<(List<InStockTaskQueryResponse> list, int total)> GetPagedList(InStockTaskQueryRequest dto, int companyId)
{
//1.获取物料集合和组织集合和供应商的集合
var materials = new List<ErpMaterialDto>();
var materials_result = await _erpService.BillQueryForMaterial();
if (materials_result.IsSuccess)
materials = materials_result.Data.ToList();
//组织集合
var orgs = new List<ErpOrgDto>();
var orgs_result = await _erpService.BillQueryForOrg();
if (orgs_result.IsSuccess)
orgs = orgs_result.Data.ToList();
//供应商集合
var suppliers = new List<ErpSupplierDto>();
var suppliers_result = await _erpService.BillQueryForSupplier();
if (suppliers_result.IsSuccess)
suppliers = suppliers_result.Data.ToList();
List<int> ids_Receiver = new List<int>();
List<int> ids_Operator = new List<int>();
if (!string.IsNullOrEmpty(dto.Receiver) || !string.IsNullOrEmpty(dto.Operator))
{
var staffList = await _basicsRepositories.GetStaffListAsync(_loginRepositories.CompanyId);
ids_Receiver = staffList.Where(w => w.Name.Contains(dto.Receiver)).Select(s => s.Id).ToList();
ids_Operator = staffList.Where(w => w.Name.Contains(dto.Operator)).Select(s => s.Id).ToList();
}
//物料集合;模糊查询后的物料集合
if (!string.IsNullOrEmpty(dto.MaterialNumber))
materials = materials.Where(w => w.MaterialNumber.Contains(dto.MaterialNumber)).ToList();
var query = _context.InStockTaskDetails
.GroupJoin(_context.InStockTask, detail => detail.Fid, order => order.Id, (detail, orders) => new { detail, orders })
.SelectMany(x => x.orders.DefaultIfEmpty(), (p, order) => new { p.detail, order })
.Where(adv => 1 == 1);
if (!string.IsNullOrEmpty(dto.SourceBillNo))
query = query.Where(w => EF.Functions.Like(w.order.SourceBillNo, "%" + dto.SourceBillNo + "%"));
//物料ID在模糊后的物料
if (!string.IsNullOrEmpty(dto.MaterialNumber))
{
if (materials != null && materials.Count != 0)
{
var mids = materials.Select(x => x.MaterialId).ToList();
query = query.Where(w => mids.Contains(w.detail.MaterialId));
}
else
query = query.Where(w => w.detail.MaterialId == 0);
}
if (ids_Receiver.Count() > 0)
query = query.Where(w => ids_Receiver.Contains(w.order.ReceiverId ?? 0));
if (ids_Operator.Count() > 0)
query = query.Where(w => ids_Operator.Contains(w.order.ShelferId ?? 0));
if (dto.SupplierId.HasValue)
query = query.Where(w => w.detail.SupplierId == dto.SupplierId.Value);
if (dto.OrgId.HasValue)
query = query.Where(w => w.detail.OrgId == dto.OrgId.Value);
if (!string.IsNullOrEmpty(dto.StockCode))
{
var splitStrs = dto.StockCode.Split("_$");
query = query.Where(w => w.detail.StockCode == splitStrs[0] && w.detail.OrgCode == splitStrs[1]);
}
if (dto.Type.HasValue)
query = query.Where(w => (int)w.order.Type == dto.Type.Value);
if (dto.Status.HasValue)
query = query.Where(w => (int)w.order.Status == dto.Status.Value);
if (dto.CreateBeginDate != null)
query = query.Where(w => w.order.ShelfTime.HasValue && w.order.ShelfTime.Value.Date >= dto.CreateBeginDate.Value);
if (dto.CreateEndDate != null)
query = query.Where(w => w.order.ShelfTime.HasValue && w.order.ShelfTime.Value.Date <= dto.CreateEndDate.Value);
int total = await query.CountAsync();
var list = await query.Select(s => new InStockTaskQueryResponse()
{
Id = s.order.Id,
DetailsId = s.detail.Id,
BillNo = s.order.BillNo,
Type = s.order.Type.GetRemark(),
Status = s.order.Status.GetRemark(),
SourceBillNo = s.order.SourceBillNo,
Supplier = _erpBasicDataExtendService.GetSupplierName(suppliers, s.detail.SupplierId),
Org = _erpBasicDataExtendService.GetOrgName(orgs, s.detail.OrgId),
MaterialName = _erpBasicDataExtendService.GetMaterialName(materials, s.detail.MaterialId),
MaterialNumber = _erpBasicDataExtendService.GetMaterialNumber(materials, s.detail.MaterialId),
Specifications = _erpBasicDataExtendService.GetMaterialSpecifications(materials, s.detail.MaterialId),
FactoryPrice = s.detail.FactoryPrice,
Stock = _singleDataService.GetSingleData(SingleAction.StocksJoinOrgCode, companyId, s.detail.StockCode + s.detail.OrgCode),
AccruedQty = s.detail.AccruedQty,
ReceiveQty = s.detail.ReceiveQty,
RealityQty = s.detail.RealityQty,
Receiver = s.order.ReceiverId.HasValue ? _singleDataService.GetSingleData(SingleAction.Staffs, companyId, s.order.ReceiverId.Value) : "",
ReceiveTime = s.order.ReceiveTime.HasValue ? s.order.ReceiveTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
Shelfer = s.order.ShelferId.HasValue ? _singleDataService.GetSingleData(SingleAction.Staffs, companyId, s.order.ShelferId.Value) : "",
ShelfTime = s.order.ShelfTime.HasValue ? s.order.ShelfTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "",
CreateTime = s.order.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"),
Remark = s.detail.Remark,
}).OrderByDescending(x => x.Id).Skip((dto.PageNo - 1) * dto.PageSize).Take(dto.PageSize).ToListAsync();
return (list, total);
}
}
}