using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using iWare.Wms.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; namespace iWare.Wms.Application { /// /// 组盘管理服务 /// [Route("api")] [ApiDescriptionSettings("基础信息", Name = "WareContainerVsMaterial", Order = 100)] [Route("api/[Controller]")] public class WareContainerVsMaterialService : IWareContainerVsMaterialService, IDynamicApiController, ITransient { private readonly IRepository _wareContainerVsMaterialRep; private readonly IRepository _wmsContainerRep; private readonly IRepository _wareTaskRep; private readonly IRepository _wmsMaterialRep; private readonly IRepository _wareLocationVsContainerRep; public WareContainerVsMaterialService( IRepository wareContainerVsMaterialRep, IRepository wmsContainerRep, IRepository wareTaskRep, IRepository wmsMaterialRep, IRepository wareLocationVsContainerRep ) { _wareContainerVsMaterialRep = wareContainerVsMaterialRep; _wmsContainerRep = wmsContainerRep; _wareTaskRep = wareTaskRep; _wmsMaterialRep = wmsMaterialRep; _wareLocationVsContainerRep = wareLocationVsContainerRep; } /// /// 分页查询组盘管理 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] WareContainerVsMaterialSearch input) { var wareContainerVsMaterials = await _wareContainerVsMaterialRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.WareContainerCode), u => EF.Functions.Like(u.WareContainerCode, $"%{input.WareContainerCode.Trim()}%")) .Where(!string.IsNullOrEmpty(input.WareMaterialCode), u => EF.Functions.Like(u.WareMaterialCode, $"%{input.WareMaterialCode.Trim()}%")) .Where(input.Quantity != null, u => u.Quantity == input.Quantity) .Where(!string.IsNullOrEmpty(input.PurchaseNo), u => u.PurchaseNo == input.PurchaseNo) .Where(!string.IsNullOrEmpty(input.DeliveryNo), u => u.DeliveryNo == input.DeliveryNo) .Where(!string.IsNullOrEmpty(input.CollectNo), u => u.CollectNo == input.CollectNo) .Where(!string.IsNullOrEmpty(input.OrdersNo), u => u.OrdersNo == input.OrdersNo) .Where(input.Status != null, u => u.Status == input.Status) .Where(!string.IsNullOrEmpty(input.Remarks), u => u.Remarks == input.Remarks) .Where(input.StockStatus != null, u => u.StockStatus == input.StockStatus) .Where(input.IsLocked != null, u => u.IsLocked == input.IsLocked) .Where(!string.IsNullOrEmpty(input.BarNo), u => u.BarNo == input.BarNo) .Where(!string.IsNullOrEmpty(input.OrderType), u => u.OrderType == input.OrderType) .Where(!string.IsNullOrEmpty(input.Unit), u => u.Unit == input.Unit) .Where(!string.IsNullOrEmpty(input.WareMaterialName), u => u.WareMaterialName == input.WareMaterialName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); foreach (var item in wareContainerVsMaterials.Rows) { var str = await _wmsContainerRep.DetachedEntities.Where(u => u.ContainerCode == item.WareContainerCode).Select(u => u.RealLocationCode).FirstOrDefaultAsync(); item.RealLocationCode = str; } return wareContainerVsMaterials; } /// /// 增加组盘管理 /// /// /// [HttpPost("add")] public async Task Add(AddWareContainerVsMaterialInput input) { //托盘信息 var containerModel = await _wmsContainerRep.DetachedEntities.FirstOrDefaultAsync(n => n.ContainerCode == input.WareContainerCode); if (containerModel == null) throw Oops.Oh("小车信息不存在!"); var isExit = await _wareTaskRep.DetachedEntities.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode); if (isExit) throw Oops.Oh("小车存在未完成的任务!"); isExit = await _wareContainerVsMaterialRep.DetachedEntities.AnyAsync(p => p.WareContainerCode == containerModel.ContainerCode); if (isExit) throw Oops.Oh("该小车已经组盘!"); var material = await _wmsMaterialRep.DetachedEntities.Where(u => u.MaterialNo == input.WareMaterialCode).FirstOrDefaultAsync(); if (material == null) { throw Oops.Oh("物料没有基础信息!"); } var cvmExist = await _wareContainerVsMaterialRep.DetachedEntities.AnyAsync(u => u.WareMaterialCode == material.MaterialNo); if (cvmExist) { throw Oops.Oh("该端拾器已经绑定小车"); } var cvm = new WareContainerVsMaterial() { OrdersNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), WareContainerCode = input.WareContainerCode, WareMaterialName = material.MaterialName, WareMaterialCode = material.MaterialNo, Quantity = 1, Status = 0, Remarks = "入库组盘", StockStatus = StockStatusEnum.新建, }; using (var tran = await _wareContainerVsMaterialRep.Database.BeginTransactionAsync()) { try { if (cvm != null) { await _wareContainerVsMaterialRep.InsertAsync(cvm); } await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } return 1; } /// /// 删除组盘管理 /// /// /// [HttpPost("delete")] public async Task Delete(DeleteWareContainerVsMaterialInput input) { var wareContainerVsMaterial = await _wareContainerVsMaterialRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (wareContainerVsMaterial == null) { throw Oops.Oh("解绑失败,查询异常"); } var isExist = await _wareLocationVsContainerRep.DetachedEntities.AnyAsync(u => u.WareContainerCode == wareContainerVsMaterial.WareContainerCode); if (isExist) { throw Oops.Oh("解绑失败,托盘存在库位绑定关系"); } using (var tran = await _wareContainerVsMaterialRep.Database.BeginTransactionAsync()) { try { await _wareContainerVsMaterialRep.DeleteAsync(wareContainerVsMaterial); await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } return 1; } /// /// 更新组盘管理 /// /// /// [HttpPost("edit")] public async Task Update(UpdateWareContainerVsMaterialInput input) { var isExist = await _wareContainerVsMaterialRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D3000); var wareContainerVsMaterial = input.Adapt(); await _wareContainerVsMaterialRep.UpdateAsync(wareContainerVsMaterial, ignoreNullValues: true); } /// /// 获取组盘管理 /// /// /// [HttpGet("detail")] public async Task Get([FromQuery] QueryeWareContainerVsMaterialInput input) { return (await _wareContainerVsMaterialRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取组盘管理列表 /// /// /// [HttpGet("list")] public async Task> List([FromQuery] WareContainerVsMaterialInput input) { return await _wareContainerVsMaterialRep.DetachedEntities.ProjectToType().ToListAsync(); } } }