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; namespace Admin.NET.Application { /// /// 仓库信息服务 /// [ApiDescriptionSettings("WmsBase", Name = "WmsWarehouse", Order = 100)] [Route("api")] public class WmsWarehouseService : IWmsWarehouseService, IDynamicApiController, ITransient { private readonly IRepository _wmsWarehouseRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public WmsWarehouseService( IRepository wmsWarehouseRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _wmsWarehouseRep = wmsWarehouseRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询仓库信息 /// /// /// [HttpGet("WmsWarehouse/page")] public async Task> Page([FromQuery] WmsWarehouseSearch input) { var wmsWarehouses = await _wmsWarehouseRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.Code), u => u.Code == input.Code) .Where(!string.IsNullOrEmpty(input.Name), u => u.Name == input.Name) .Where(!string.IsNullOrEmpty(input.Address), u => u.Address == input.Address) .Where(!string.IsNullOrEmpty(input.FactoryCode), u => u.FactoryCode == input.FactoryCode) .Where(input.Length != null, u => u.Length == input.Length) .Where(input.Width != null, u => u.Width == input.Width) .Where(input.Height != null, u => u.Height == input.Height) .Where(!string.IsNullOrEmpty(input.BaseUnit), u => u.BaseUnit == input.BaseUnit) .Where(!string.IsNullOrEmpty(input.Position), u => u.Position == input.Position) .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .Where(!string.IsNullOrEmpty(input.Remarks), u => u.Remarks == input.Remarks) .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 wmsWarehouses; } /// /// 不分页查询仓库信息列表 /// /// 仓库信息查询参数 /// (仓库信息)实例列表 [HttpGet("WmsWarehouse/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsWarehouseSearchNonPage input) { var pCode = input.Code?.Trim() ?? ""; var pName = input.Name?.Trim() ?? ""; var pAddress = input.Address?.Trim() ?? ""; var pFactoryCode = input.FactoryCode?.Trim() ?? ""; var pLength = input.Length; var pWidth = input.Width; var pHeight = input.Height; var pBaseUnit = input.BaseUnit?.Trim() ?? ""; var pPosition = input.Position?.Trim() ?? ""; var pIsDisabled = input.IsDisabled; var pRemarks = input.Remarks?.Trim() ?? ""; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsWarehouses = await _wmsWarehouseRep.DetachedEntities .Where(!string.IsNullOrEmpty(pCode), u => u.Code == pCode) .Where(!string.IsNullOrEmpty(pName), u => u.Name == pName) .Where(!string.IsNullOrEmpty(pAddress), u => u.Address == pAddress) .Where(!string.IsNullOrEmpty(pFactoryCode), u => u.FactoryCode == pFactoryCode) .Where(pLength != null, u => u.Length == pLength) .Where(pWidth != null, u => u.Width == pWidth) .Where(pHeight != null, u => u.Height == pHeight) .Where(!string.IsNullOrEmpty(pBaseUnit), u => u.BaseUnit == pBaseUnit) .Where(!string.IsNullOrEmpty(pPosition), u => u.Position == pPosition) .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled) .Where(!string.IsNullOrEmpty(pRemarks), u => u.Remarks == pRemarks) .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 wmsWarehouses; } /// /// 获取仓库信息 /// /// /// [HttpGet("WmsWarehouse/detail")] public async Task Get([FromQuery] QueryeWmsWarehouseInput input) { return (await _wmsWarehouseRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取仓库信息列表 /// /// /// [HttpGet("WmsWarehouse/list")] public async Task> List([FromQuery] WmsWarehouseInput input) { return await _wmsWarehouseRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加仓库信息 /// /// /// [HttpPost("WmsWarehouse/add")] public async Task Add(AddWmsWarehouseInput input) { var wmsWarehouse = input.Adapt(); //验证 await CheckExisit(wmsWarehouse); wmsWarehouse.CreatedUserId = wmsWarehouse.UpdatedUserId = SysHelper.GetUserId(); wmsWarehouse.CreatedUserName = wmsWarehouse.UpdatedUserName = SysHelper.GetUserName(); wmsWarehouse.CreatedTime = wmsWarehouse.UpdatedTime = SysHelper.GetNowTime(); await _wmsWarehouseRep.InsertAsync(wmsWarehouse); } /// /// 删除仓库信息 /// /// /// [HttpPost("WmsWarehouse/delete")] public async Task Delete(DeleteWmsWarehouseInput input) { var wmsWarehouse = await _wmsWarehouseRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsWarehouseRep.DeleteAsync(wmsWarehouse); } /// /// 更新仓库信息 /// /// /// [HttpPost("WmsWarehouse/edit")] public async Task Update(UpdateWmsWarehouseInput input) { var isExist = await _wmsWarehouseRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsWarehouse = input.Adapt(); //验证 await CheckExisit(wmsWarehouse,true); wmsWarehouse.UpdatedUserId = SysHelper.GetUserId(); wmsWarehouse.UpdatedUserName = SysHelper.GetUserName(); wmsWarehouse.UpdatedTime = SysHelper.GetNowTime(); await _wmsWarehouseRep.UpdateAsync(wmsWarehouse,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入仓库信息功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("WmsWarehouse/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) { _wmsWarehouseRep.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 WmsWarehouse() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _Code = "";//仓库编号 var _Name = "";//仓库名称 var _Address = "";//仓库地址 var _FactoryCode = "";//工厂编号 var _Length = "";//长 var _Width = "";//宽 var _Height = "";//高 var _BaseUnit = "";//基本单元 var _Position = "";//定位 var _IsDisabled = "";//是否禁用 var _Remarks = "";//备注 var _Id = "";//Id主键 #endregion #region 取值 _Code = row["仓库编号"]?.ToString() ; _Name = row["仓库名称"]?.ToString() ; _Address = row["仓库地址"]?.ToString() ; _FactoryCode = row["工厂编号"]?.ToString() ; _Length = row["长"]?.ToString() ; _Width = row["宽"]?.ToString() ; _Height = row["高"]?.ToString() ; _BaseUnit = row["基本单元"]?.ToString() ; _Position = row["定位"]?.ToString() ; _IsDisabled = row["是否禁用"]?.ToString() ; _Remarks = row["备注"]?.ToString() ; _Id = row["Id主键"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_Code)) { throw Oops.Oh($"第{index}行[仓库编号]{_Code}不能为空!"); } if(!string.IsNullOrEmpty(_Code)) { addItem.Code = (string)_Code; } if (string.IsNullOrEmpty(_Name)) { throw Oops.Oh($"第{index}行[仓库名称]{_Name}不能为空!"); } if(!string.IsNullOrEmpty(_Name)) { addItem.Name = (string)_Name; } if(!string.IsNullOrEmpty(_Address)) { addItem.Address = (string)_Address; } if (string.IsNullOrEmpty(_FactoryCode)) { throw Oops.Oh($"第{index}行[工厂编号]{_FactoryCode}不能为空!"); } if(!string.IsNullOrEmpty(_FactoryCode)) { addItem.FactoryCode = (string)_FactoryCode; } if(!string.IsNullOrEmpty(_Length)) { if (!decimal.TryParse(_Length, out decimal outLength)&&!string.IsNullOrEmpty(_Length)) { throw Oops.Oh($"第{index}行[长]{_Length}值不正确!"); } if (outLength <= 0&&!string.IsNullOrEmpty(_Length)) { throw Oops.Oh($"第{index}行[长]{_Length}值不能小于等于0!"); } else { addItem.Length = outLength; } } if(!string.IsNullOrEmpty(_Width)) { if (!decimal.TryParse(_Width, out decimal outWidth)&&!string.IsNullOrEmpty(_Width)) { throw Oops.Oh($"第{index}行[宽]{_Width}值不正确!"); } if (outWidth <= 0&&!string.IsNullOrEmpty(_Width)) { throw Oops.Oh($"第{index}行[宽]{_Width}值不能小于等于0!"); } else { addItem.Width = outWidth; } } if(!string.IsNullOrEmpty(_Height)) { if (!decimal.TryParse(_Height, out decimal outHeight)&&!string.IsNullOrEmpty(_Height)) { throw Oops.Oh($"第{index}行[高]{_Height}值不正确!"); } if (outHeight <= 0&&!string.IsNullOrEmpty(_Height)) { throw Oops.Oh($"第{index}行[高]{_Height}值不能小于等于0!"); } else { addItem.Height = outHeight; } } if(!string.IsNullOrEmpty(_BaseUnit)) { addItem.BaseUnit = (string)_BaseUnit; } if(!string.IsNullOrEmpty(_Position)) { addItem.Position = (string)_Position; } if(!string.IsNullOrEmpty(_IsDisabled)) { if(!_IsDisabled.Equals("是") && !_IsDisabled.Equals("否")) { throw Oops.Oh($"第{index}行[是否禁用]{_IsDisabled}值不正确!"); } else { bool outIsDisabled = _IsDisabled.Equals("是") ? true : false; addItem.IsDisabled = outIsDisabled; } } if(!string.IsNullOrEmpty(_Remarks)) { addItem.Remarks = (string)_Remarks; } if(!string.IsNullOrEmpty(_Id)) { if (!long.TryParse(_Id, out long outId)&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不正确!"); } if (outId <= 0&&!string.IsNullOrEmpty(_Id)) { throw Oops.Oh($"第{index}行[Id主键]{_Id}值不能小于等于0!"); } else { addItem.Id = outId; } } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载仓库信息的Excel导入模板 /// /// 模板版本 /// 下载的模板文件 [HttpGet("WmsWarehouse/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsWarehouse{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( WmsWarehouse input,bool isEdit=false) { bool isExist = false; if (!isEdit)//新增 { //数据是否存在重复 isExist = await _wmsWarehouseRep.AnyAsync(u => u.Code.Equals(input.Code) ,false); } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _wmsWarehouseRep.AnyAsync(u => u.Id != input.Id &&u.Code.Equals(input.Code) ,false); } if (isExist) throw Oops.Oh(ErrorCode.E0001); } /// /// 根据联合主键验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { //根据联合主键验证表格中中是否已存在相同数据 if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //数据是否重复 var existExcelItem = inputs.GroupBy(g => new { g.Code }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.Code }).FirstOrDefault(); if (existExcelItem != null) { var wmsWarehouse = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,仓库编号[{item.Code}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _wmsWarehouseRep.DetachedEntities.FirstOrDefaultAsync(w=> inputs.Select(s=>"" +s.Code ) .Contains("" +w.Code )); if (existDBItem != null) { var wmsWarehouse = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"系统中,仓库编号[{item.Code}]已存在"); } } #endregion } }