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 = "WmsArea", Order = 100)] [Route("api")] public class WmsAreaService : IWmsAreaService, IDynamicApiController, ITransient { private readonly IRepository _wmsAreaRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public WmsAreaService( IRepository wmsAreaRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _wmsAreaRep = wmsAreaRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询库区信息 /// /// /// [HttpGet("WmsArea/page")] public async Task> Page([FromQuery] WmsAreaSearch input) { var wmsAreas = await _wmsAreaRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.AreaCode), u => u.AreaCode == input.AreaCode) .Where(!string.IsNullOrEmpty(input.WarehouseCode), u => u.WarehouseCode == input.WarehouseCode) .Where(!string.IsNullOrEmpty(input.WarehouseName), u => u.WarehouseName == input.WarehouseName) .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName) .Where(!string.IsNullOrEmpty(input.AreaDesc), u => u.AreaDesc == input.AreaDesc) .Where(input.AreaStatus != null, u => u.AreaStatus == input.AreaStatus) .Where(!string.IsNullOrEmpty(input.ErpCode), u => u.ErpCode == input.ErpCode) .Where(input.WarehouseId != null, u => u.WarehouseId == input.WarehouseId) .Where(input.IsBarcodeLevelControl != null, u => u.IsBarcodeLevelControl == input.IsBarcodeLevelControl) .Where(input.IsFIFO != null, u => u.IsFIFO == input.IsFIFO) .Where(input.IsPartLevelControl != null, u => u.IsPartLevelControl == input.IsPartLevelControl) .Where(input.IsAllowConfusion != null, u => u.IsAllowConfusion == input.IsAllowConfusion) .Where(input.IsAllowNegativeInventory != null, u => u.IsAllowNegativeInventory == input.IsAllowNegativeInventory) .Where(input.IsVirtually != null, u => u.IsVirtually == input.IsVirtually) .Where(input.IsDisabled != null, u => u.IsDisabled == input.IsDisabled) .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 wmsAreas; } /// /// 不分页查询库区信息列表 /// /// 库区信息查询参数 /// (库区信息)实例列表 [HttpGet("WmsArea/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsAreaSearchNonPage input) { var pAreaCode = input.AreaCode?.Trim() ?? ""; var pWarehouseCode = input.WarehouseCode?.Trim() ?? ""; var pWarehouseName = input.WarehouseName?.Trim() ?? ""; var pAreaName = input.AreaName?.Trim() ?? ""; var pAreaDesc = input.AreaDesc?.Trim() ?? ""; var pAreaStatus = input.AreaStatus; var pErpCode = input.ErpCode?.Trim() ?? ""; var pWarehouseId = input.WarehouseId; var pIsBarcodeLevelControl = input.IsBarcodeLevelControl; var pIsFIFO = input.IsFIFO; var pIsPartLevelControl = input.IsPartLevelControl; var pIsAllowConfusion = input.IsAllowConfusion; var pIsAllowNegativeInventory = input.IsAllowNegativeInventory; var pIsVirtually = input.IsVirtually; var pIsDisabled = input.IsDisabled; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsAreas = await _wmsAreaRep.DetachedEntities .Where(!string.IsNullOrEmpty(pAreaCode), u => u.AreaCode == pAreaCode) .Where(!string.IsNullOrEmpty(pWarehouseCode), u => u.WarehouseCode == pWarehouseCode) .Where(!string.IsNullOrEmpty(pWarehouseName), u => u.WarehouseName == pWarehouseName) .Where(!string.IsNullOrEmpty(pAreaName), u => u.AreaName == pAreaName) .Where(!string.IsNullOrEmpty(pAreaDesc), u => u.AreaDesc == pAreaDesc) .Where(pAreaStatus != null, u => u.AreaStatus == pAreaStatus) .Where(!string.IsNullOrEmpty(pErpCode), u => u.ErpCode == pErpCode) .Where(pWarehouseId != null, u => u.WarehouseId == pWarehouseId) .Where(pIsBarcodeLevelControl != null, u => u.IsBarcodeLevelControl == pIsBarcodeLevelControl) .Where(pIsFIFO != null, u => u.IsFIFO == pIsFIFO) .Where(pIsPartLevelControl != null, u => u.IsPartLevelControl == pIsPartLevelControl) .Where(pIsAllowConfusion != null, u => u.IsAllowConfusion == pIsAllowConfusion) .Where(pIsAllowNegativeInventory != null, u => u.IsAllowNegativeInventory == pIsAllowNegativeInventory) .Where(pIsVirtually != null, u => u.IsVirtually == pIsVirtually) .Where(pIsDisabled != null, u => u.IsDisabled == pIsDisabled) .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 wmsAreas; } /// /// 获取库区信息 /// /// /// [HttpGet("WmsArea/detail")] public async Task Get([FromQuery] QueryeWmsAreaInput input) { return (await _wmsAreaRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取库区信息列表 /// /// /// [HttpGet("WmsArea/list")] public async Task> List([FromQuery] WmsAreaInput input) { return await _wmsAreaRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加库区信息 /// /// /// [HttpPost("WmsArea/add")] public async Task Add(AddWmsAreaInput input) { var wmsArea = input.Adapt(); //验证 await CheckExisit(wmsArea); wmsArea.CreatedUserId = wmsArea.UpdatedUserId = SysHelper.GetUserId(); wmsArea.CreatedUserName = wmsArea.UpdatedUserName = SysHelper.GetUserName(); wmsArea.CreatedTime = wmsArea.UpdatedTime = SysHelper.GetNowTime(); await _wmsAreaRep.InsertAsync(wmsArea); } /// /// 删除库区信息 /// /// /// [HttpPost("WmsArea/delete")] public async Task Delete(DeleteWmsAreaInput input) { var wmsArea = await _wmsAreaRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsAreaRep.DeleteAsync(wmsArea); } /// /// 更新库区信息 /// /// /// [HttpPost("WmsArea/edit")] public async Task Update(UpdateWmsAreaInput input) { var isExist = await _wmsAreaRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsArea = input.Adapt(); //验证 await CheckExisit(wmsArea,true); wmsArea.UpdatedUserId = SysHelper.GetUserId(); wmsArea.UpdatedUserName = SysHelper.GetUserName(); wmsArea.UpdatedTime = SysHelper.GetNowTime(); await _wmsAreaRep.UpdateAsync(wmsArea,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入库区信息功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("WmsArea/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) { _wmsAreaRep.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 WmsArea() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _AreaCode = "";//库区编码 var _WarehouseCode = "";//仓库编号 var _WarehouseName = "";//仓库名称 var _AreaName = "";//库区名称 var _AreaDesc = "";//库区描述 var _AreaStatus = "";//库区状态 var _ErpCode = "";//ERP代码 var _WarehouseId = "";//所属仓库 var _IsBarcodeLevelControl = "";//零件级管控 var _IsFIFO = "";//检验先进先出 var _IsPartLevelControl = "";//零件级管控 var _IsAllowConfusion = "";//允许混淆 var _IsAllowNegativeInventory = "";//允许负库存 var _IsVirtually = "";//是否虚拟 var _IsDisabled = "";//是否禁用 var _Id = "";//Id主键 #endregion #region 取值 _AreaCode = row["库区编码"]?.ToString() ; _WarehouseCode = row["仓库编号"]?.ToString() ; _WarehouseName = row["仓库名称"]?.ToString() ; _AreaName = row["库区名称"]?.ToString() ; _AreaDesc = row["库区描述"]?.ToString() ; _AreaStatus = row["库区状态"]?.ToString() ; _ErpCode = row["ERP代码"]?.ToString() ; _WarehouseId = row["所属仓库"]?.ToString() ; _IsBarcodeLevelControl = row["零件级管控"]?.ToString() ; _IsFIFO = row["检验先进先出"]?.ToString() ; _IsPartLevelControl = row["零件级管控"]?.ToString() ; _IsAllowConfusion = row["允许混淆"]?.ToString() ; _IsAllowNegativeInventory = row["允许负库存"]?.ToString() ; _IsVirtually = row["是否虚拟"]?.ToString() ; _IsDisabled = row["是否禁用"]?.ToString() ; _Id = row["Id主键"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_AreaCode)) { throw Oops.Oh($"第{index}行[库区编码]{_AreaCode}不能为空!"); } if(!string.IsNullOrEmpty(_AreaCode)) { addItem.AreaCode = (string)_AreaCode; } if (string.IsNullOrEmpty(_WarehouseCode)) { throw Oops.Oh($"第{index}行[仓库编号]{_WarehouseCode}不能为空!"); } if(!string.IsNullOrEmpty(_WarehouseCode)) { addItem.WarehouseCode = (string)_WarehouseCode; } if (string.IsNullOrEmpty(_WarehouseName)) { throw Oops.Oh($"第{index}行[仓库名称]{_WarehouseName}不能为空!"); } if(!string.IsNullOrEmpty(_WarehouseName)) { addItem.WarehouseName = (string)_WarehouseName; } if (string.IsNullOrEmpty(_AreaName)) { throw Oops.Oh($"第{index}行[库区名称]{_AreaName}不能为空!"); } if(!string.IsNullOrEmpty(_AreaName)) { addItem.AreaName = (string)_AreaName; } if(!string.IsNullOrEmpty(_AreaDesc)) { addItem.AreaDesc = (string)_AreaDesc; } if (string.IsNullOrEmpty(_AreaStatus)) { throw Oops.Oh($"第{index}行[库区状态]{_AreaStatus}不能为空!"); } if(!string.IsNullOrEmpty(_AreaStatus)) { if (!int.TryParse(_AreaStatus, out int outAreaStatus)&&!string.IsNullOrEmpty(_AreaStatus)) { throw Oops.Oh($"第{index}行[库区状态]{_AreaStatus}值不正确!"); } if (outAreaStatus <= 0&&!string.IsNullOrEmpty(_AreaStatus)) { throw Oops.Oh($"第{index}行[库区状态]{_AreaStatus}值不能小于等于0!"); } else { addItem.AreaStatus = outAreaStatus; } } if (string.IsNullOrEmpty(_ErpCode)) { throw Oops.Oh($"第{index}行[ERP代码]{_ErpCode}不能为空!"); } if(!string.IsNullOrEmpty(_ErpCode)) { addItem.ErpCode = (string)_ErpCode; } if (string.IsNullOrEmpty(_WarehouseId)) { throw Oops.Oh($"第{index}行[所属仓库]{_WarehouseId}不能为空!"); } if(!string.IsNullOrEmpty(_WarehouseId)) { System.Int64 enumWarehouseId = default(System.Int64); if(!Enum.TryParse(_WarehouseId, out enumWarehouseId)&&!string.IsNullOrEmpty(_WarehouseId)) { throw Oops.Oh($"第{index}行[所属仓库]{_WarehouseId}值不正确!"); } else { addItem.WarehouseId = enumWarehouseId; } } if (string.IsNullOrEmpty(_IsBarcodeLevelControl)) { throw Oops.Oh($"第{index}行[零件级管控]{_IsBarcodeLevelControl}不能为空!"); } if(!string.IsNullOrEmpty(_IsBarcodeLevelControl)) { if(!_IsBarcodeLevelControl.Equals("是") && !_IsBarcodeLevelControl.Equals("否")) { throw Oops.Oh($"第{index}行[零件级管控]{_IsBarcodeLevelControl}值不正确!"); } else { bool outIsBarcodeLevelControl = _IsBarcodeLevelControl.Equals("是") ? true : false; addItem.IsBarcodeLevelControl = outIsBarcodeLevelControl; } } if (string.IsNullOrEmpty(_IsFIFO)) { throw Oops.Oh($"第{index}行[检验先进先出]{_IsFIFO}不能为空!"); } if(!string.IsNullOrEmpty(_IsFIFO)) { if(!_IsFIFO.Equals("是") && !_IsFIFO.Equals("否")) { throw Oops.Oh($"第{index}行[检验先进先出]{_IsFIFO}值不正确!"); } else { bool outIsFIFO = _IsFIFO.Equals("是") ? true : false; addItem.IsFIFO = outIsFIFO; } } if (string.IsNullOrEmpty(_IsPartLevelControl)) { throw Oops.Oh($"第{index}行[零件级管控]{_IsPartLevelControl}不能为空!"); } if(!string.IsNullOrEmpty(_IsPartLevelControl)) { if(!_IsPartLevelControl.Equals("是") && !_IsPartLevelControl.Equals("否")) { throw Oops.Oh($"第{index}行[零件级管控]{_IsPartLevelControl}值不正确!"); } else { bool outIsPartLevelControl = _IsPartLevelControl.Equals("是") ? true : false; addItem.IsPartLevelControl = outIsPartLevelControl; } } if (string.IsNullOrEmpty(_IsAllowConfusion)) { throw Oops.Oh($"第{index}行[允许混淆]{_IsAllowConfusion}不能为空!"); } if(!string.IsNullOrEmpty(_IsAllowConfusion)) { if(!_IsAllowConfusion.Equals("是") && !_IsAllowConfusion.Equals("否")) { throw Oops.Oh($"第{index}行[允许混淆]{_IsAllowConfusion}值不正确!"); } else { bool outIsAllowConfusion = _IsAllowConfusion.Equals("是") ? true : false; addItem.IsAllowConfusion = outIsAllowConfusion; } } if (string.IsNullOrEmpty(_IsAllowNegativeInventory)) { throw Oops.Oh($"第{index}行[允许负库存]{_IsAllowNegativeInventory}不能为空!"); } if(!string.IsNullOrEmpty(_IsAllowNegativeInventory)) { if(!_IsAllowNegativeInventory.Equals("是") && !_IsAllowNegativeInventory.Equals("否")) { throw Oops.Oh($"第{index}行[允许负库存]{_IsAllowNegativeInventory}值不正确!"); } else { bool outIsAllowNegativeInventory = _IsAllowNegativeInventory.Equals("是") ? true : false; addItem.IsAllowNegativeInventory = outIsAllowNegativeInventory; } } if(!string.IsNullOrEmpty(_IsVirtually)) { if(!_IsVirtually.Equals("是") && !_IsVirtually.Equals("否")) { throw Oops.Oh($"第{index}行[是否虚拟]{_IsVirtually}值不正确!"); } else { bool outIsVirtually = _IsVirtually.Equals("是") ? true : false; addItem.IsVirtually = outIsVirtually; } } 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(_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("WmsArea/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsArea{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( WmsArea input,bool isEdit=false) { bool isExist = false; if (!isEdit)//新增 { //数据是否存在重复 isExist = await _wmsAreaRep.AnyAsync(u => u.AreaCode.Equals(input.AreaCode) ,false); } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _wmsAreaRep.AnyAsync(u => u.Id != input.Id &&u.AreaCode.Equals(input.AreaCode) ,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.AreaCode }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.AreaCode }).FirstOrDefault(); if (existExcelItem != null) { var wmsArea = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,库区编码[{item.AreaCode}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _wmsAreaRep.DetachedEntities.FirstOrDefaultAsync(w=> inputs.Select(s=>"" +s.AreaCode ) .Contains("" +w.AreaCode )); if (existDBItem != null) { var wmsArea = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"系统中,库区编码[{item.AreaCode}]已存在"); } } #endregion } }