using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Admin.NET.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Microsoft.AspNetCore.Http; using System.Text; using System.Web; using System.ComponentModel; using System.Data; using NetTopologySuite.Algorithm; using Pipelines.Sockets.Unofficial.Arenas; namespace Admin.NET.Application { /// /// 容器关系服务 /// [ApiDescriptionSettings("WmsBase", Name = "WmsContainerPackaging", Order = 100)] [Route("api")] public class WmsContainerPackagingService : IWmsContainerPackagingService, IDynamicApiController, ITransient { private readonly IRepository _wmsContainerPackagingRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); private readonly IRepository _wmsMaterialTypeRep; private readonly IRepository _wmsContainerTypeRep; public WmsContainerPackagingService( IRepository wmsContainerPackagingRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService , IRepository wmsMaterialTypeRep , IRepository wmsContainerTypeRep ) { _wmsContainerPackagingRep = wmsContainerPackagingRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; _wmsMaterialTypeRep = wmsMaterialTypeRep; _wmsContainerTypeRep = wmsContainerTypeRep; } /// /// 分页查询容器关系 /// /// /// [HttpGet("WmsContainerPackaging/page")] public async Task> Page([FromQuery] WmsContainerPackagingSearch input) { var wmsContainerPackagings = await _wmsContainerPackagingRep.DetachedEntities .Where(input.ContainerTypeId != null, u => u.ContainerTypeId == input.ContainerTypeId) .Where(!string.IsNullOrEmpty(input.ContainerTypeName), u => u.ContainerTypeName == input.ContainerTypeName) .Where(input.MaterialTypeId != null, u => u.MaterialTypeId == input.MaterialTypeId) .Where(!string.IsNullOrEmpty(input.MaterialTypeCode), u => u.MaterialTypeCode == input.MaterialTypeCode) .Where(!string.IsNullOrEmpty(input.MaterialTypeName), u => u.MaterialTypeName == input.MaterialTypeName) .Where(input.BoxQty != null, u => u.BoxQty == input.BoxQty) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(input.CreatedUserName), u => u.CreatedUserName == input.CreatedUserName) .Where(!string.IsNullOrEmpty(input.UpdatedUserName), u => u.UpdatedUserName == input.UpdatedUserName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsContainerPackagings; } /// /// 不分页查询容器关系列表 /// /// 容器关系查询参数 /// (容器关系)实例列表 [HttpGet("WmsContainerPackaging/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsContainerPackagingSearchNonPage input) { var pContainerTypeId = input.ContainerTypeId; var pContainerTypeName = input.ContainerTypeName?.Trim() ?? ""; var pMaterialTypeId = input.MaterialTypeId; var pMaterialTypeCode = input.MaterialTypeCode?.Trim() ?? ""; var pMaterialTypeName = input.MaterialTypeName?.Trim() ?? ""; var pBoxQty = input.BoxQty; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsContainerPackagings = await _wmsContainerPackagingRep.DetachedEntities .Where(pContainerTypeId != null, u => u.ContainerTypeId == pContainerTypeId) .Where(!string.IsNullOrEmpty(pContainerTypeName), u => u.ContainerTypeName == pContainerTypeName) .Where(pMaterialTypeId != null, u => u.MaterialTypeId == pMaterialTypeId) .Where(!string.IsNullOrEmpty(pMaterialTypeCode), u => u.MaterialTypeCode == pMaterialTypeCode) .Where(!string.IsNullOrEmpty(pMaterialTypeName), u => u.MaterialTypeName == pMaterialTypeName) .Where(pBoxQty != null, u => u.BoxQty == pBoxQty) .Where(input.CreatedTime!=null, u => u.CreatedTime>= Convert.ToDateTime(input.CreatedTime[0]) && u.CreatedTime<= Convert.ToDateTime(input.CreatedTime[1])) .Where(input.UpdatedTime!=null, u => u.UpdatedTime>= Convert.ToDateTime(input.UpdatedTime[0]) && u.UpdatedTime<= Convert.ToDateTime(input.UpdatedTime[1])) .Where(!string.IsNullOrEmpty(pCreatedUserName), u => u.CreatedUserName == pCreatedUserName) .Where(!string.IsNullOrEmpty(pUpdatedUserName), u => u.UpdatedUserName == pUpdatedUserName) .OrderBy(PageInputOrder.OrderNonPageBuilder(input)) .ProjectToType() .ToListAsync(); return wmsContainerPackagings; } /// /// 获取容器关系 /// /// /// [HttpGet("WmsContainerPackaging/detail")] public async Task Get([FromQuery] QueryeWmsContainerPackagingInput input) { return (await _wmsContainerPackagingRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取容器关系列表 /// /// /// [HttpGet("WmsContainerPackaging/list")] public async Task> List([FromQuery] WmsContainerPackagingInput input) { return await _wmsContainerPackagingRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加容器关系 /// /// /// [HttpPost("WmsContainerPackaging/add")] public async Task Add(AddWmsContainerPackagingInput input) { var wmsContainerPackaging = input.Adapt(); var wmsMaterialType=(await _wmsMaterialTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.MaterialTypeId&&u.IsDeleted==false)).Adapt(); if (wmsMaterialType == null) { throw Oops.Oh($"物料类型不存在"); } if (wmsMaterialType.IsDisabled == true) { throw Oops.Oh($"物料类型已禁用"); } var wmsContainerType=(await _wmsContainerTypeRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.ContainerTypeId&& u.IsDeleted == false)).Adapt(); if (wmsContainerType == null) { throw Oops.Oh($"容器类型不存在"); } if (wmsContainerType.IsDisabled == true) { throw Oops.Oh($"容器类型已禁用"); } wmsContainerPackaging.ContainerTypeName = wmsContainerType.TypeName; wmsContainerPackaging.MaterialTypeName= wmsMaterialType.MaterialTypeName; wmsContainerPackaging.MaterialTypeCode = wmsMaterialType.MaterialTypeCode; //验证 await CheckExisit(wmsContainerPackaging); wmsContainerPackaging.CreatedUserId = wmsContainerPackaging.UpdatedUserId = SysHelper.GetUserId(); wmsContainerPackaging.CreatedUserName = wmsContainerPackaging.UpdatedUserName = SysHelper.GetUserName(); wmsContainerPackaging.CreatedTime = wmsContainerPackaging.UpdatedTime = SysHelper.GetNowTime(); await _wmsContainerPackagingRep.InsertAsync(wmsContainerPackaging); } /// /// 删除容器关系 /// /// /// [HttpPost("WmsContainerPackaging/delete")] public async Task Delete(DeleteWmsContainerPackagingInput input) { var wmsContainerPackaging = await _wmsContainerPackagingRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsContainerPackagingRep.DeleteAsync(wmsContainerPackaging); } /// /// 更新容器关系 /// /// /// [HttpPost("WmsContainerPackaging/edit")] public async Task Update(UpdateWmsContainerPackagingInput input) { var isExist = await _wmsContainerPackagingRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsContainerPackaging = input.Adapt(); //验证 await CheckExisit(wmsContainerPackaging,true); wmsContainerPackaging.UpdatedUserId = SysHelper.GetUserId(); wmsContainerPackaging.UpdatedUserName = SysHelper.GetUserName(); wmsContainerPackaging.UpdatedTime = SysHelper.GetNowTime(); await _wmsContainerPackagingRep.UpdateAsync(wmsContainerPackaging,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入容器关系功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("WmsContainerPackaging/importExcel")] public async Task ImportExcelAsync(IFormFile file) { int _HeadStartLine = 2;//第1行是说明,第2行是列名 int _DataStartLine = 3;//第3行开始是数据 DataTable importDataTable = ExcelUtil.ImportExcelToDataTable(file, _HeadStartLine, _DataStartLine); var addList =await CommonImport(importDataTable, _DataStartLine); lock (_lock) { _wmsContainerPackagingRep.InsertAsync(addList); } await Task.CompletedTask; return addList.Count; } /// /// DataTable转换实体对象列表 /// /// /// 模版列名开始行 /// private async Task> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List(); int index = dataStartLine;//模版列名开始行 foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new WmsContainerPackaging() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _ContainerTypeId = "";//容器类型ID var _ContainerTypeName = "";//容器类型名称 var _MaterialTypeId = "";//物料类型ID var _MaterialTypeCode = "";//物料类型编号 var _MaterialTypeName = "";//物料类型名称 var _BoxQty = "";//物料容器容量 #endregion #region 取值 _ContainerTypeId = row["容器类型ID"]?.ToString() ; _ContainerTypeName = row["容器类型名称"]?.ToString() ; _MaterialTypeId = row["物料类型ID"]?.ToString() ; _MaterialTypeCode = row["物料类型编号"]?.ToString() ; _MaterialTypeName = row["物料类型名称"]?.ToString() ; _BoxQty = row["物料容器容量"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_ContainerTypeId)) { throw Oops.Oh($"第{index}行[容器类型ID]{_ContainerTypeId}不能为空!"); } if(!string.IsNullOrEmpty(_ContainerTypeId)) { if (!long.TryParse(_ContainerTypeId, out long outContainerTypeId)&&!string.IsNullOrEmpty(_ContainerTypeId)) { throw Oops.Oh($"第{index}行[容器类型ID]{_ContainerTypeId}值不正确!"); } if (outContainerTypeId <= 0&&!string.IsNullOrEmpty(_ContainerTypeId)) { throw Oops.Oh($"第{index}行[容器类型ID]{_ContainerTypeId}值不能小于等于0!"); } else { addItem.ContainerTypeId = outContainerTypeId; } } if (string.IsNullOrEmpty(_ContainerTypeName)) { throw Oops.Oh($"第{index}行[容器类型名称]{_ContainerTypeName}不能为空!"); } if(!string.IsNullOrEmpty(_ContainerTypeName)) { addItem.ContainerTypeName = (string)_ContainerTypeName; } if (string.IsNullOrEmpty(_MaterialTypeId)) { throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialTypeId}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialTypeId)) { if (!long.TryParse(_MaterialTypeId, out long outMaterialTypeId)&&!string.IsNullOrEmpty(_MaterialTypeId)) { throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialTypeId}值不正确!"); } if (outMaterialTypeId <= 0&&!string.IsNullOrEmpty(_MaterialTypeId)) { throw Oops.Oh($"第{index}行[物料类型ID]{_MaterialTypeId}值不能小于等于0!"); } else { addItem.MaterialTypeId = outMaterialTypeId; } } if (string.IsNullOrEmpty(_MaterialTypeCode)) { throw Oops.Oh($"第{index}行[物料类型编号]{_MaterialTypeCode}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialTypeCode)) { addItem.MaterialTypeCode = (string)_MaterialTypeCode; } if (string.IsNullOrEmpty(_MaterialTypeName)) { throw Oops.Oh($"第{index}行[物料类型名称]{_MaterialTypeName}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialTypeName)) { addItem.MaterialTypeName = (string)_MaterialTypeName; } if (string.IsNullOrEmpty(_BoxQty)) { throw Oops.Oh($"第{index}行[物料容器容量]{_BoxQty}不能为空!"); } if(!string.IsNullOrEmpty(_BoxQty)) { if (!decimal.TryParse(_BoxQty, out decimal outBoxQty)&&!string.IsNullOrEmpty(_BoxQty)) { throw Oops.Oh($"第{index}行[物料容器容量]{_BoxQty}值不正确!"); } if (outBoxQty <= 0&&!string.IsNullOrEmpty(_BoxQty)) { throw Oops.Oh($"第{index}行[物料容器容量]{_BoxQty}值不能小于等于0!"); } else { addItem.BoxQty = outBoxQty; } } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载容器关系的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("WmsContainerPackaging/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsContainerPackaging{TemplateConst.EXCEL_TEMPLATEFILE_导入模版名称后缀}.xlsx"; var fileName = HttpUtility.UrlEncode($"导入模板(容器关系).xlsx", Encoding.GetEncoding("UTF-8")); return new FileStreamResult(new FileStream(_path, FileMode.Open), "application/octet-stream") { FileDownloadName = fileName }; } #endregion #region 私有方法 /// /// 根据联合主键验证数据是否已存在-数据库 /// /// /// /// private async Task CheckExisit( WmsContainerPackaging input,bool isEdit=false) { string erorMsg = string.Empty; bool isExist = false; if (!isEdit)//新增 { //数据是否存在重复 isExist = await _wmsContainerPackagingRep.AnyAsync(u => u.ContainerTypeId.Equals(input.ContainerTypeId) &&u.MaterialTypeId.Equals(input.MaterialTypeId) ,false); if (isExist) { erorMsg = $"系统中,容器类型[{input.ContainerTypeName}]-物料类型[{input.MaterialTypeName}]关系已存在"; throw Oops.Oh(erorMsg); } } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _wmsContainerPackagingRep.AnyAsync(u => u.Id != input.Id &&u.ContainerTypeId.Equals(input.ContainerTypeId) && u.MaterialTypeId.Equals(input.MaterialTypeId) , false); if (isExist) { erorMsg = $"系统中,容器类型[{input.ContainerTypeName}]-物料类型[{input.MaterialTypeName}]关系已存在"; throw Oops.Oh(erorMsg); } } } /// /// 根据联合主键验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { //根据联合主键验证表格中中是否已存在相同数据 if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //数据是否重复 var existExcelItem = inputs.GroupBy(g => new { g.ContainerTypeId }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.ContainerTypeId }).FirstOrDefault(); if (existExcelItem != null) { var wmsContainerPackaging = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,容器类型ID[{item.ContainerTypeId}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _wmsContainerPackagingRep.DetachedEntities.FirstOrDefaultAsync(w=> inputs.Select(s=>"" +s.ContainerTypeId ) .Contains("" +w.ContainerTypeId )); if (existDBItem != null) { var wmsContainerPackaging = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"系统中,容器类型ID[{item.ContainerTypeId}]已存在"); } } #endregion } }