using Admin.NET.Core.Helper.ExcelHelper; 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.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.EntityFrameworkCore; using Minio.DataModel; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using System.Linq.Dynamic.Core; namespace iWare.Wms.Application { /// /// 托盘信息 /// [ApiDescriptionSettings("基础信息", Name = "WmsContainer", Order = 100)] [Route("api/[Controller]")] public class WmsContainerService : ControllerBase, IWmsContainerService, IDynamicApiController, ITransient { private readonly IRepository _wmsContainerRep; private readonly IRepository _wmsContainerType; private readonly IRepository _wmsMaterial; private readonly IRepository _wareContainerVsMaterial; private readonly IRepository _wareLocationVsContainer; private readonly IRepository _wmsPart; public WmsContainerService( IRepository wmsContainerRep, IRepository wmsContainerType, IRepository wmsMaterial, IRepository wareContainerVsMaterial, IRepository wareLocationVsContainer, IRepository wmsPart ) { _wmsContainerRep = wmsContainerRep; _wmsContainerType = wmsContainerType; _wmsMaterial = wmsMaterial; _wareContainerVsMaterial = wareContainerVsMaterial; _wareLocationVsContainer = wareLocationVsContainer; _wmsPart = wmsPart; } /// /// 分页查询托盘信息 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] WmsContainerSearch input) { var wmsContainers = await _wmsContainerRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.Containercode), u => EF.Functions.Like(u.ContainerCode, $"%{input.Containercode.Trim()}%")) .Where(input.ContainerTypeCode != null, u => u.ContainerTypeCode == input.ContainerTypeCode) .Where(input.Containerstatus != null, u => u.ContainerStatus == input.Containerstatus) //.OrderBy(PageInputOrder.OrderBuilder(input)) .OrderBy(u => u.ContainerCode) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsContainers; } /// /// 增加托盘信息 /// /// /// [HttpPost("add")] public async Task Add([FromBody] AddWmsContainerInput input) { List wmsMaterials = new List(); if (input.RealLocationCode == "0") { input.RealLocationCode = ""; } var isExit = await _wmsContainerRep.AnyAsync(n => n.ContainerCode == input.Containercode); if (isExit) throw Oops.Oh("存在的相同的小车编号!"); //查找托盘类型 var containerType = await _wmsContainerType.DetachedEntities.Where(u => u.WareContainerTypeCode == input.ContainerTypeCode).FirstOrDefaultAsync(); if (containerType == null) { throw Oops.Oh("托盘类型不存在"); } input.Speclength = containerType.Length; input.Specheight = containerType.Height; input.Specwidth = containerType.Width; WareContainerVsMaterial cvm = null; if (!string.IsNullOrEmpty(input.MaterialCode) && input.MaterialCode != "0") { var material = await _wmsMaterial.DetachedEntities.Where(u => u.MaterialNo == input.MaterialCode).FirstOrDefaultAsync(); if (material == null) { throw Oops.Oh("端拾器基础信息不存在"); //material = new WmsMaterial() //{ // MaterialNo = input.Containercode, // MaterialName = input.Containercode, // Length = input.Speclength, // Width = input.Specwidth, // Height = input.Specheight, // Remark = "根据小车自动创建" //}; //wmsMaterials.Add(material); } else { var cvmExist = await _wareContainerVsMaterial.DetachedEntities.AnyAsync(u => u.WareMaterialCode == material.MaterialNo); if (cvmExist) { throw Oops.Oh("该端拾器已经绑定小车"); } } cvm = new WareContainerVsMaterial() { OrdersNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), WareContainerCode = input.Containercode, WareMaterialName = material.MaterialName, WareMaterialCode = material.MaterialNo, Quantity = 1, Status = 0, Remarks = "新增小车组盘", StockStatus = StockStatusEnum.新建, }; } else { var material = await _wmsMaterial.DetachedEntities.Where(u => u.MaterialNo == input.Containercode).FirstOrDefaultAsync(); if (material == null) { //throw Oops.Oh("端拾器基础信息不存在"); material = new WmsMaterial() { MaterialNo = input.Containercode, MaterialName = input.Containercode, Length = input.Speclength, Width = input.Specwidth, Height = input.Specheight, Remark = "根据小车自动创建" }; wmsMaterials.Add(material); } var cvmExist = await _wareContainerVsMaterial.DetachedEntities.AnyAsync(u => u.WareContainerCode == input.Containercode); if (!cvmExist) { cvm = new WareContainerVsMaterial() { OrdersNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), WareContainerCode = input.Containercode, WareMaterialName = material.MaterialName, WareMaterialCode = material.MaterialNo, Quantity = 1, Status = 0, Remarks = "新增小车组盘", StockStatus = StockStatusEnum.新建, }; } } var wmsContainer = input.Adapt(); wmsContainer.ContainerStatus = Core.Enum.ContainerStatus.KOUXIAN; using (var tran = await _wmsContainerRep.Database.BeginTransactionAsync()) { try { await _wmsContainerRep.InsertAsync(wmsContainer); if (cvm != null) { await _wareContainerVsMaterial.InsertAsync(cvm); } if (wmsMaterials != null && wmsMaterials.Count > 0) { await _wmsMaterial.InsertAsync(wmsMaterials); } await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } } /// /// 删除托盘信息 /// /// /// [HttpPost("delete")] public async Task Delete([FromBody] DeleteWmsContainerInput input) { var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(u => u.Id == input.Id); if(wmsContainer.ContainerStatus!=Core.Enum.ContainerStatus.KOUXIAN) throw Oops.Oh("托盘被使用不可删除"); var isexist = await _wareLocationVsContainer.DetachedEntities.AnyAsync(u => u.WareContainerCode == wmsContainer.ContainerCode); if (isexist) { throw Oops.Oh("托盘被使用不可删除"); } isexist = await _wmsPart.DetachedEntities.AnyAsync(u => u.MaterialCode == wmsContainer.ContainerCode); if (isexist) { throw Oops.Oh("托盘被使用不可删除"); } var cvm = await _wareContainerVsMaterial.Where(u => u.WareMaterialCode == wmsContainer.ContainerCode).FirstOrDefaultAsync(); if (cvm != null) { await _wareContainerVsMaterial.DeleteAsync(cvm); } var material = await _wmsMaterial.Where(u => u.MaterialNo == wmsContainer.ContainerCode).FirstOrDefaultAsync(); if (material != null) { await _wmsMaterial.DeleteAsync(material); } await _wmsContainerRep.DeleteAsync(wmsContainer); } /// /// 更新托盘信息 /// /// /// [HttpPost("edit")] public async Task Update([FromBody] UpdateWmsContainerInput input) { var isExist = await _wmsContainerRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D3000); //查找托盘类型 var containerType = await _wmsContainerType.Where(u => u.WareContainerTypeCode == input.ContainerTypeCode).FirstOrDefaultAsync(); if (containerType == null) { throw Oops.Oh("托盘类型不存在"); } input.Speclength = containerType.Length; input.Specheight = containerType.Height; input.Specwidth = containerType.Width; var material = await _wmsMaterial.Where(u => u.MaterialNo == input.Containercode).FirstOrDefaultAsync(); if(material != null) { material.Length = input.Speclength; material.Width = input.Specwidth; material.Height = input.Specheight; } var wmsContainer = input.Adapt(); await _wmsContainerRep.UpdateAsync(wmsContainer,ignoreNullValues:true); if (material != null) { await _wmsMaterial.UpdateAsync(material); } } /// /// 获取托盘信息 /// /// /// [HttpGet("detail")] public async Task Get([FromQuery] QueryeWmsContainerInput input) { return (await _wmsContainerRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取托盘信息列表 /// /// /// [HttpGet("list")] public async Task List([FromQuery] WmsContainerInput input) { var cvms = await _wareContainerVsMaterial.DetachedEntities.AsQueryable().Select(u => u.WareContainerCode).Distinct().ToListAsync(); return await _wmsContainerRep.DetachedEntities.Where(u => !cvms.Contains(u.ContainerCode)).Select(u => new { code = u.ContainerCode}).ToListAsync(); } /// /// 获取端拾器列表 /// /// [HttpGet("fkWmsContainer")] public async Task FkWmsContainerList() { var list = await _wmsContainerRep.DetachedEntities.ToListAsync(); return list.Select(e => new { Code = e.ContainerCode}); } /// /// 获取端拾器列表 /// /// [HttpPost("jblocation")] public async Task JBLocation([FromBody] UpdateWmsContainerInput input) { var isExist = await _wmsContainerRep.Where(u => u.Id == input.Id).FirstOrDefaultAsync(); if (isExist == null) throw Oops.Oh(ErrorCode.D3000); isExist.RealLocationCode = ""; await _wmsContainerRep.UpdateAsync(isExist); return 1; } /// /// 导出Excel /// /// 筛选条件 /// [HttpPost("download")] [AllowAnonymous] public async Task Download([FromBody] WmsContainerSearch input) { var dataRecords = await _wmsContainerRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.Containercode), u => EF.Functions.Like(u.ContainerCode, $"%{input.Containercode.Trim()}%")) .Where(input.ContainerTypeCode != null, u => u.ContainerTypeCode == input.ContainerTypeCode) .Where(input.Containerstatus != null, u => u.ContainerStatus == input.Containerstatus) //.OrderBy(PageInputOrder.OrderBuilder(input)) .OrderBy(u => u.ContainerCode) .ProjectToType().ToListAsync(); var excelBaseResult = new Excel2003Result(dataRecords, "小车信息" + DateTime.Now.ToString("yyyyMMdd"), false, "生产记录"); return File(excelBaseResult.GetExcelStream(), "application/vnd.ms-excel"); } } }