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");
}
}
}