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 = "WmsControlRuleDetail", Order = 100)] [Route("api")] public class WmsControlRuleDetailService : IWmsControlRuleDetailService, IDynamicApiController, ITransient { private readonly IRepository _wmsControlRuleDetailRep; private readonly IRepository _sysDictTypeRep; private readonly IRepository _sysDictDataRep; private readonly ISysExcelTemplateService _sysExcelTemplateService; private readonly static object _lock = new(); public WmsControlRuleDetailService( IRepository wmsControlRuleDetailRep ,IRepository sysDictTypeRep ,IRepository sysDictDataRep ,ISysExcelTemplateService sysExcelTemplateService ) { _wmsControlRuleDetailRep = wmsControlRuleDetailRep; _sysDictTypeRep = sysDictTypeRep; _sysDictDataRep = sysDictDataRep; _sysExcelTemplateService = sysExcelTemplateService; } /// /// 分页查询控制属性规则明细 /// /// /// [HttpGet("WmsControlRuleDetail/page")] public async Task> Page([FromQuery] WmsControlRuleDetailSearch input) { var wmsControlRuleDetails = await _wmsControlRuleDetailRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.RuleCode), u => u.RuleCode == input.RuleCode) .Where(input.MaxImumqty != null, u => u.MaxImumqty == input.MaxImumqty) .Where(input.MinImumqty != null, u => u.MinImumqty == input.MinImumqty) .Where(input.SafeImumqty != null, u => u.SafeImumqty == input.SafeImumqty) .Where(input.MinStorageAge != null, u => u.MinStorageAge == input.MinStorageAge) .Where(input.MaxStorageAge != null, u => u.MaxStorageAge == input.MaxStorageAge) .Where(input.IsNotChek != null, u => u.IsNotChek == input.IsNotChek) .Where(input.ShelfLifeDays != null, u => u.ShelfLifeDays == input.ShelfLifeDays) .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 wmsControlRuleDetails; } /// /// 不分页查询控制属性规则明细列表 /// /// 控制属性规则明细查询参数 /// (控制属性规则明细)实例列表 [HttpGet("WmsControlRuleDetail/listNonPage")] public async Task> ListNonPageAsync([FromQuery] WmsControlRuleDetailSearchNonPage input) { var pRuleCode = input.RuleCode?.Trim() ?? ""; var pMaxImumqty = input.MaxImumqty; var pMinImumqty = input.MinImumqty; var pSafeImumqty = input.SafeImumqty; var pMinStorageAge = input.MinStorageAge; var pMaxStorageAge = input.MaxStorageAge; var pIsNotChek = input.IsNotChek; var pShelfLifeDays = input.ShelfLifeDays; var pIsDisabled = input.IsDisabled; var pCreatedTime = input.CreatedTime; var pUpdatedTime = input.UpdatedTime; var pCreatedUserName = input.CreatedUserName?.Trim() ?? ""; var pUpdatedUserName = input.UpdatedUserName?.Trim() ?? ""; var wmsControlRuleDetails = await _wmsControlRuleDetailRep.DetachedEntities .Where(!string.IsNullOrEmpty(pRuleCode), u => u.RuleCode == pRuleCode) .Where(pMaxImumqty != null, u => u.MaxImumqty == pMaxImumqty) .Where(pMinImumqty != null, u => u.MinImumqty == pMinImumqty) .Where(pSafeImumqty != null, u => u.SafeImumqty == pSafeImumqty) .Where(pMinStorageAge != null, u => u.MinStorageAge == pMinStorageAge) .Where(pMaxStorageAge != null, u => u.MaxStorageAge == pMaxStorageAge) .Where(pIsNotChek != null, u => u.IsNotChek == pIsNotChek) .Where(pShelfLifeDays != null, u => u.ShelfLifeDays == pShelfLifeDays) .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 wmsControlRuleDetails; } /// /// 获取控制属性规则明细 /// /// /// [HttpGet("WmsControlRuleDetail/detail")] public async Task Get([FromQuery] QueryeWmsControlRuleDetailInput input) { return (await _wmsControlRuleDetailRep.DetachedEntities.FirstOrDefaultAsync(u => u.Id == input.Id)).Adapt(); } /// /// 获取控制属性规则明细列表 /// /// /// [HttpGet("WmsControlRuleDetail/list")] public async Task> List([FromQuery] WmsControlRuleDetailInput input) { return await _wmsControlRuleDetailRep.DetachedEntities.ProjectToType().ToListAsync(); } #region 增、删、改 /// /// 增加控制属性规则明细 /// /// /// [HttpPost("WmsControlRuleDetail/add")] public async Task Add(AddWmsControlRuleDetailInput input) { var wmsControlRuleDetail = input.Adapt(); //验证 await CheckExisit(wmsControlRuleDetail); wmsControlRuleDetail.CreatedUserId = wmsControlRuleDetail.UpdatedUserId = SysHelper.GetUserId(); wmsControlRuleDetail.CreatedUserName = wmsControlRuleDetail.UpdatedUserName = SysHelper.GetUserName(); wmsControlRuleDetail.CreatedTime = wmsControlRuleDetail.UpdatedTime = SysHelper.GetNowTime(); await _wmsControlRuleDetailRep.InsertAsync(wmsControlRuleDetail); } /// /// 删除控制属性规则明细 /// /// /// [HttpPost("WmsControlRuleDetail/delete")] public async Task Delete(DeleteWmsControlRuleDetailInput input) { var wmsControlRuleDetail = await _wmsControlRuleDetailRep.FirstOrDefaultAsync(u => u.Id == input.Id); await _wmsControlRuleDetailRep.DeleteAsync(wmsControlRuleDetail); } /// /// 更新控制属性规则明细 /// /// /// [HttpPost("WmsControlRuleDetail/edit")] public async Task Update(UpdateWmsControlRuleDetailInput input) { var isExist = await _wmsControlRuleDetailRep.AnyAsync(u => u.Id == input.Id, false); if (!isExist) throw Oops.Oh(ErrorCode.D1002); var wmsControlRuleDetail = input.Adapt(); //验证 await CheckExisit(wmsControlRuleDetail,true); wmsControlRuleDetail.UpdatedUserId = SysHelper.GetUserId(); wmsControlRuleDetail.UpdatedUserName = SysHelper.GetUserName(); wmsControlRuleDetail.UpdatedTime = SysHelper.GetNowTime(); await _wmsControlRuleDetailRep.UpdateAsync(wmsControlRuleDetail,ignoreNullValues:true); } #endregion #region 导入 /// /// Excel模板导入控制属性规则明细功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost("WmsControlRuleDetail/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) { _wmsControlRuleDetailRep.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 WmsControlRuleDetail() { CreatedTime = SysHelper.GetNowTime(), CreatedUserId = SysHelper.GetUserId(), CreatedUserName = SysHelper.GetUserName(), UpdatedTime = SysHelper.GetNowTime(), UpdatedUserId = SysHelper.GetUserId(), UpdatedUserName = SysHelper.GetUserName() }; #region 定义变量 var _RuleCode = "";//控制属性规则编号 var _MaxImumqty = "";//最高库存 var _MinImumqty = "";//最低库存 var _SafeImumqty = "";//安全库存 var _MinStorageAge = "";//最小库龄 var _MaxStorageAge = "";//最大库龄 var _IsNotChek = "";//是否免检 var _ShelfLifeDays = "";//保质期天数 var _IsDisabled = "";//是否禁用 var _Id = "";//Id主键 #endregion #region 取值 _RuleCode = row["控制属性规则编号"]?.ToString() ; _MaxImumqty = row["最高库存"]?.ToString() ; _MinImumqty = row["最低库存"]?.ToString() ; _SafeImumqty = row["安全库存"]?.ToString() ; _MinStorageAge = row["最小库龄"]?.ToString() ; _MaxStorageAge = row["最大库龄"]?.ToString() ; _IsNotChek = row["是否免检"]?.ToString() ; _ShelfLifeDays = row["保质期天数"]?.ToString() ; _IsDisabled = row["是否禁用"]?.ToString() ; _Id = row["Id主键"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_RuleCode)) { throw Oops.Oh($"第{index}行[控制属性规则编号]{_RuleCode}不能为空!"); } if(!string.IsNullOrEmpty(_RuleCode)) { addItem.RuleCode = (string)_RuleCode; } if(!string.IsNullOrEmpty(_MaxImumqty)) { if (!decimal.TryParse(_MaxImumqty, out decimal outMaxImumqty)&&!string.IsNullOrEmpty(_MaxImumqty)) { throw Oops.Oh($"第{index}行[最高库存]{_MaxImumqty}值不正确!"); } if (outMaxImumqty <= 0&&!string.IsNullOrEmpty(_MaxImumqty)) { throw Oops.Oh($"第{index}行[最高库存]{_MaxImumqty}值不能小于等于0!"); } else { addItem.MaxImumqty = outMaxImumqty; } } if(!string.IsNullOrEmpty(_MinImumqty)) { if (!decimal.TryParse(_MinImumqty, out decimal outMinImumqty)&&!string.IsNullOrEmpty(_MinImumqty)) { throw Oops.Oh($"第{index}行[最低库存]{_MinImumqty}值不正确!"); } if (outMinImumqty <= 0&&!string.IsNullOrEmpty(_MinImumqty)) { throw Oops.Oh($"第{index}行[最低库存]{_MinImumqty}值不能小于等于0!"); } else { addItem.MinImumqty = outMinImumqty; } } if(!string.IsNullOrEmpty(_SafeImumqty)) { if (!decimal.TryParse(_SafeImumqty, out decimal outSafeImumqty)&&!string.IsNullOrEmpty(_SafeImumqty)) { throw Oops.Oh($"第{index}行[安全库存]{_SafeImumqty}值不正确!"); } if (outSafeImumqty <= 0&&!string.IsNullOrEmpty(_SafeImumqty)) { throw Oops.Oh($"第{index}行[安全库存]{_SafeImumqty}值不能小于等于0!"); } else { addItem.SafeImumqty = outSafeImumqty; } } if(!string.IsNullOrEmpty(_MinStorageAge)) { if (!decimal.TryParse(_MinStorageAge, out decimal outMinStorageAge)&&!string.IsNullOrEmpty(_MinStorageAge)) { throw Oops.Oh($"第{index}行[最小库龄]{_MinStorageAge}值不正确!"); } if (outMinStorageAge <= 0&&!string.IsNullOrEmpty(_MinStorageAge)) { throw Oops.Oh($"第{index}行[最小库龄]{_MinStorageAge}值不能小于等于0!"); } else { addItem.MinStorageAge = outMinStorageAge; } } if(!string.IsNullOrEmpty(_MaxStorageAge)) { if (!decimal.TryParse(_MaxStorageAge, out decimal outMaxStorageAge)&&!string.IsNullOrEmpty(_MaxStorageAge)) { throw Oops.Oh($"第{index}行[最大库龄]{_MaxStorageAge}值不正确!"); } if (outMaxStorageAge <= 0&&!string.IsNullOrEmpty(_MaxStorageAge)) { throw Oops.Oh($"第{index}行[最大库龄]{_MaxStorageAge}值不能小于等于0!"); } else { addItem.MaxStorageAge = outMaxStorageAge; } } if(!string.IsNullOrEmpty(_IsNotChek)) { if(!_IsNotChek.Equals("是") && !_IsNotChek.Equals("否")) { throw Oops.Oh($"第{index}行[是否免检]{_IsNotChek}值不正确!"); } else { bool outIsNotChek = _IsNotChek.Equals("是") ? true : false; addItem.IsNotChek = outIsNotChek; } } if(!string.IsNullOrEmpty(_ShelfLifeDays)) { if (!decimal.TryParse(_ShelfLifeDays, out decimal outShelfLifeDays)&&!string.IsNullOrEmpty(_ShelfLifeDays)) { throw Oops.Oh($"第{index}行[保质期天数]{_ShelfLifeDays}值不正确!"); } if (outShelfLifeDays <= 0&&!string.IsNullOrEmpty(_ShelfLifeDays)) { throw Oops.Oh($"第{index}行[保质期天数]{_ShelfLifeDays}值不能小于等于0!"); } else { addItem.ShelfLifeDays = outShelfLifeDays; } } 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("WmsControlRuleDetail/downloadExcelTemplate")] public IActionResult DownloadExcelTemplate([FromQuery] string version) { string _path = TemplateConst.EXCEL_TEMPLATEFILE_导入模版路径 + $"\\WmsControlRuleDetail{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( WmsControlRuleDetail input,bool isEdit=false) { bool isExist = false; if (!isEdit)//新增 { //数据是否存在重复 isExist = await _wmsControlRuleDetailRep.AnyAsync(u => u.RuleCode.Equals(input.RuleCode) ,false); } else//编辑 { //当前编辑数据以外是否存在重复 isExist = await _wmsControlRuleDetailRep.AnyAsync(u => u.Id != input.Id &&u.RuleCode.Equals(input.RuleCode) ,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.RuleCode }) .Where(g => g.Count() > 1) .Select(s => new { s.Key.RuleCode }).FirstOrDefault(); if (existExcelItem != null) { var wmsControlRuleDetail = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"导入的表格中,控制属性规则编号[{item.RuleCode}]已存在"); } //根据联合主键验证数据库中是否已存在相同数据 var existDBItem = await _wmsControlRuleDetailRep.DetachedEntities.FirstOrDefaultAsync(w=> inputs.Select(s=>"" +s.RuleCode ) .Contains("" +w.RuleCode )); if (existDBItem != null) { var wmsControlRuleDetail = existExcelItem.Adapt(); var item= existExcelItem.Adapt(); throw Oops.Oh($"系统中,控制属性规则编号[{item.RuleCode}]已存在"); } } #endregion } }