using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using System.Data; using System.Web; using System.Text; namespace Admin.NET.Application; /// /// 配置设备报警服务 /// [ApiDescriptionSettings(ApplicationConst.WmsSystemConfigGroupName, Order = 100)] public class WmsConfigDeviceWarningService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; public WmsConfigDeviceWarningService(SqlSugarRepository rep) { _rep = rep; } /// /// 分页查询配置设备报警 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] [Description("WmsConfigDeviceWarning/Page")] public async Task> Page(WmsConfigDeviceWarningInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").ToPagedListAsync(input.Page, input.PageSize); } /// /// 不分页查询配置设备报警 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [Description("WmsConfigDeviceWarning/List")] public async Task> List([FromQuery] WmsConfigDeviceWarningInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").Select().ToListAsync(); } /// /// 增加配置设备报警 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [Description("WmsConfigDeviceWarning/Add")] public async Task Add(AddWmsConfigDeviceWarningInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity); await _rep.InsertAsync(entity); return entity.Id; } /// /// 删除配置设备报警 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [Description("WmsConfigDeviceWarning/Delete")] public async Task Delete(DeleteWmsConfigDeviceWarningInput input) { var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); //await _rep.FakeDeleteAsync(entity); //假删除 await _rep.DeleteAsync(entity); //真删除 } /// /// 更新配置设备报警 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Update")] [Description("WmsConfigDeviceWarning/Update")] public async Task Update(UpdateWmsConfigDeviceWarningInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity, true); await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取配置设备报警 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [Description("WmsConfigDeviceWarning/Detail")] public async Task Detail([FromQuery] QueryByIdWmsConfigDeviceWarningInput input) { return await _rep.GetFirstAsync(u => u.Id == input.Id); } #region 导入 /// /// Excel模板导入配置设备报警功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost] [ApiDescriptionSettings(Name = "ImportExcel")] [Description("WmsConfigDeviceWarning/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); await _rep.InsertRangeAsync(addList); return addList.Count; } /// /// DataTable转换实体对象列表 /// /// /// 模版列名开始行 /// private async Task> CommonImport(DataTable dataTable, int dataStartLine) { var details = new List(); int index = dataStartLine;//模版列名开始行 decimal offset = 0.0M; decimal intValue = 0.0M; string my_DeviceAreaCode = ""; foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new WmsConfigDeviceWarning(); #region 定义变量 var _DeviceAreaCode = "";//设备区域 var _DeviceWarningType = "";//报警类型 var _WarningCode = "";//报警代码 var _WarningContent = "";//报警内容 #endregion #region 取值 _DeviceAreaCode = row["设备区域"]?.ToString(); _DeviceWarningType = row["报警类型"]?.ToString(); _WarningCode = row["报警代码"]?.ToString(); _WarningContent = row["报警内容"]?.ToString(); #endregion if (!string.IsNullOrEmpty(my_DeviceAreaCode) && _DeviceAreaCode != my_DeviceAreaCode) { throw Oops.Oh($"第{index}行一次只能导入一个设备区域!"); } my_DeviceAreaCode = _DeviceAreaCode; #region 验证 if (string.IsNullOrEmpty(_DeviceAreaCode)) { throw Oops.Oh($"第{index}行[设备区域]{_DeviceAreaCode}不能为空!"); } if (!string.IsNullOrEmpty(_DeviceAreaCode)) { Admin.NET.Application.DeviceAreaCodeEnum enumDeviceAreaCode = default(Admin.NET.Application.DeviceAreaCodeEnum); if (!Enum.TryParse(_DeviceAreaCode, out enumDeviceAreaCode) && !string.IsNullOrEmpty(_DeviceAreaCode)) { throw Oops.Oh($"第{index}行[设备区域]{_DeviceAreaCode}值不正确!"); } else { addItem.DeviceAreaCode = enumDeviceAreaCode; } } if (string.IsNullOrEmpty(_DeviceWarningType)) { throw Oops.Oh($"第{index}行[报警类型]{_DeviceWarningType}不能为空!"); } if (!string.IsNullOrEmpty(_DeviceWarningType)) { Admin.NET.Application.DeviceWarningTypeEnum enumDeviceWarningType = default(Admin.NET.Application.DeviceWarningTypeEnum); if (!Enum.TryParse(_DeviceWarningType, out enumDeviceWarningType) && !string.IsNullOrEmpty(_DeviceWarningType)) { throw Oops.Oh($"第{index}行[报警类型]{_DeviceWarningType}值不正确!"); } else { addItem.DeviceWarningType = enumDeviceWarningType; } } if (!string.IsNullOrEmpty(_WarningContent)) { addItem.WarningContent = (string)(_WarningContent.Trim()); } #endregion addItem.WarningCode = SysHelper.GetDBForDeviceWarning(_DeviceAreaCode) + "|" + intValue.ToString("0.0"); if (offset == 0.7M) { offset = 0.0M; intValue += 0.3M; } else { offset += 0.1M; intValue += 0.1M; } details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载配置设备报警的Excel导入模板 /// /// 下载的模板文件 [HttpGet] [ApiDescriptionSettings(Name = "DownloadExcelTemplate")] [Description("WmsConfigDeviceWarning/DownloadExcelTemplate")] public IActionResult DownloadExcelTemplate() { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\配置设备报警{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 ISugarQueryable CommonPageFilter(WmsConfigDeviceWarningInput input) { var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.WarningCode.Contains(input.SearchKey.Trim()) || u.WarningContent.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) ) .WhereIF(input.DeviceAreaCode.HasValue, u => u.DeviceAreaCode == input.DeviceAreaCode) .WhereIF(input.DeviceWarningType.HasValue, u => u.DeviceWarningType == input.DeviceWarningType) .WhereIF(!string.IsNullOrWhiteSpace(input.WarningCode), u => u.WarningCode.Contains(input.WarningCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.WarningContent), u => u.WarningContent.Contains(input.WarningContent.Trim())) .Select(); if (input.CreateTimeRange != null && input.CreateTimeRange.Count > 0) { DateTime? start = input.CreateTimeRange[0].Value; query = query.WhereIF(start.HasValue, u => u.CreateTime >= start); if (input.CreateTimeRange.Count > 1 && input.CreateTimeRange[1].HasValue) { var end = input.CreateTimeRange[1].Value; query = query.Where(u => u.CreateTime <= end); } } return query; } /// /// 重复性验证 /// /// 验证对象 /// 是否是编辑 /// private async Task CheckExist(WmsConfigDeviceWarning input, bool isEdit = false) { //没有配置组合校验,不需要验重 bool isExistForSingle_WarningCode = false; if (!isEdit)//新增 { //数据是否单独存在重复-报警代码 isExistForSingle_WarningCode = await _rep.AsQueryable().AnyAsync(u => u.WarningCode.Equals(input.WarningCode)); } else//编辑 { //当前编辑数据以外是否单独存在重复-报警代码 isExistForSingle_WarningCode = await _rep.AsQueryable().AnyAsync(u => u.Id != input.Id && u.WarningCode.Equals(input.WarningCode)); } if (isExistForSingle_WarningCode) throw Oops.Oh($"验证失败,报警代码[" + input.WarningCode + "]已存在"); } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 var existExcelItemForSingle_WarningCode = inputs.GroupBy(g => new { g.WarningCode }).Where(g => g.Count() > 1).ToList(); if (existExcelItemForSingle_WarningCode != null && existExcelItemForSingle_WarningCode.Count > 0) { var item = existExcelItemForSingle_WarningCode.First().ToList().First(); throw Oops.Oh($"验证失败,导入的表格中,报警代码[" + item.WarningCode + "]已重复存在"); } //根据单独校验验证数据库中是否已存在相同数据 var existDBItemList = await _rep.GetListAsync(w => inputs.Select(s => s.WarningCode).ToList().Contains(w.WarningCode) ); var db_ForSingle_WarningCode = existDBItemList.FirstOrDefault(g => inputs.Select(s => s.WarningCode).ToList().Contains(g.WarningCode)); if (db_ForSingle_WarningCode != null) throw Oops.Oh($"验证失败,系统中,报警代码[" + db_ForSingle_WarningCode.WarningCode + "]已重复存在"); } #endregion }