using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using System.Data; using System.Web; using System.Text; using DocumentFormat.OpenXml.Drawing; using DocumentFormat.OpenXml.Vml.Spreadsheet; using AngleSharp.Css; using AngleSharp.Dom; using NPOI.POIFS.Storage; using DocumentFormat.OpenXml.Spreadsheet; using NPOI.Util; namespace Admin.NET.Application; /// /// 下架策略服务 /// [ApiDescriptionSettings(ApplicationConst.WmsSystemConfigGroupName, Order = 100)] public class WmsConfigUnshelveStrategyService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _repWmsConfigUnshelveStrategyChoose; private readonly SqlSugarRepository _repWmsConfigUnshelveStrategyRange; public WmsConfigUnshelveStrategyService(SqlSugarRepository rep, SqlSugarRepository repWmsConfigUnshelveStrategyChoose, SqlSugarRepository repWmsConfigUnshelveStrategyRange) { _rep = rep; _repWmsConfigUnshelveStrategyChoose = repWmsConfigUnshelveStrategyChoose; _repWmsConfigUnshelveStrategyRange = repWmsConfigUnshelveStrategyRange; } /// /// 分页查询下架策略 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] [Description("WmsConfigUnshelveStrategy/Page")] public async Task> Page(WmsConfigUnshelveStrategyInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").ToPagedListAsync(input.Page, input.PageSize); } /// /// 不分页查询下架策略 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [Description("WmsConfigUnshelveStrategy/List")] public async Task> List([FromQuery] WmsConfigUnshelveStrategyInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").Select().ToListAsync(); } /// /// 增加下架策略 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [Description("WmsConfigUnshelveStrategy/Add")] public async Task Add(AddWmsConfigUnshelveStrategyInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity); await _rep.InsertAsync(entity); return entity.Id; } /// /// 增加下架策略,下架范围,下架方式 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "AddConfigUnshelveStrategy")] [Description("WmsConfigUnshelveStrategy/AddConfigUnshelveStrategy")] public async Task AddConfigUnshelveStrategy([FromBody] AllConfigUnshelveStrategyInput input) { var wmsConfigUnshelveStrategyChooseList = new List(); var wmsConfigUnshelveStrategyRangeList = new List(); var WmsConfigUnshelveStrategyModel = await _rep.AsQueryable().FirstAsync(p => p.StrategyCode == input.StrategyCode|| p.StrategyName == input.StrategyName); if (WmsConfigUnshelveStrategyModel != null) throw Oops.Oh("该下架策略已存在!"); //下架策略列表数据判断 CheckInput(input); var materialCodeList = input.WmsConfigUnshelveStrategyRange.Select(p => p.MaterialCode).ToList(); var materialList = await _repWmsConfigUnshelveStrategyRange.AsQueryable().Where(p => materialCodeList.Contains(p.MaterialCode)).ToListAsync(); if (materialList.Count != 0) { //获取生效的策略 update by liuwq 20240804 //生效、失效时间 均可以为空 var wmsConfigUnshelveStrategyList = await _rep.AsQueryable().Where(p =>p.IsDisabled==false&&p.IsDelete==false&& (p.StartTime ==null|| p.StartTime <= DateTime.Now) &&(p.EndTime==null|| DateTime.Now<=p.EndTime)&&materialList.Select(s=>s.StrategyCode).ToList().Contains(p.StrategyCode)).ToListAsync(); var materialCode = ""; int index = 1; foreach (var item in materialList) { var wmsConfigUnshelveStrategy = wmsConfigUnshelveStrategyList.Where(p => p.StrategyCode == item.StrategyCode).FirstOrDefault(); if (wmsConfigUnshelveStrategy == null) { continue;//所选物料存在的下架策略未生效 } if (index < materialList.Count()) { materialCode += item.MaterialCode + ","; } else { materialCode += item.MaterialCode; } index++; } //update by liuwq 20240804 if (string.IsNullOrWhiteSpace(materialCode)) { throw Oops.Oh("所选物料"+ materialCode+"下架策略未生效"); } // // throw Oops.Oh("所选择的物料"+ materialCode+"已有下架策略"); } var wmsConfigUnshelveStrategyMain = new WmsConfigUnshelveStrategy() { StrategyCode = input.StrategyCode, StrategyName = input.StrategyName, StartTime = input.StartTime, EndTime = input.EndTime, IsDisabled = input.IsDisabled }; foreach (var item in input.WmsConfigUnshelveStrategyChoose) { var ConfigUnshelveStrategyChoose = new WmsConfigUnshelveStrategyChoose() { StrategyCode = input.StrategyCode, StrategyOption = (StrategyOptionEnum)item.StrategyOption, Priority = item.Priority, }; wmsConfigUnshelveStrategyChooseList.Add(ConfigUnshelveStrategyChoose); } foreach (var item in input.WmsConfigUnshelveStrategyRange) { var ConfigUnshelveStrategyRange = new WmsConfigUnshelveStrategyRange() { StrategyCode = input.StrategyCode, MaterialCode = item.MaterialCode, MaterialName = item.MaterialName, MaterialUnit = item.MaterialUnit }; wmsConfigUnshelveStrategyRangeList.Add(ConfigUnshelveStrategyRange); } var _tenant = _rep.AsTenant(); try { await _tenant.BeginTranAsync(); await _rep.InsertAsync(wmsConfigUnshelveStrategyMain); await _repWmsConfigUnshelveStrategyChoose.InsertRangeAsync(wmsConfigUnshelveStrategyChooseList); await _repWmsConfigUnshelveStrategyRange.InsertRangeAsync(wmsConfigUnshelveStrategyRangeList); await _tenant.CommitTranAsync(); } catch { await _tenant.RollbackTranAsync(); throw; } } /// /// 搜索下架策略,下架范围,下架方式 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "QueryConfigUnshelveStrategyInfo")] [Description("WmsConfigUnshelveStrategy/QueryConfigUnshelveStrategyInfo")] public async Task QueryConfigUnshelveStrategyInfo([FromQuery] QueryConfigUnshelveStrategyInfoInput input) { var returnModel = new AllConfigUnshelveStrategyOutput(); //主表内容 var main = await _rep.AsQueryable().FirstAsync(p => p.Id == input.StrategyId); if (main == null) throw Oops.Oh("当前下架策略暂无数据"); var ChooseList = await _repWmsConfigUnshelveStrategyChoose.AsQueryable().Where(p => p.StrategyCode == main.StrategyCode).ToListAsync(); var RangeList = await _repWmsConfigUnshelveStrategyRange.AsQueryable().Where(p => p.StrategyCode == main.StrategyCode).ToListAsync(); returnModel.WmsConfigUnshelveStrategyChooseList = ChooseList; returnModel.WmsConfigUnshelveStrategyModel = main; returnModel.WmsConfigUnshelveStrategyRangeList = RangeList; return returnModel; } /// /// 更新下架策略,下架范围,下架方式 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "UpdateConfigUnshelveStrategy")] [Description("WmsConfigUnshelveStrategy/UpdateConfigUnshelveStrategy")] public async Task UpdateConfigUnshelveStrategy([FromBody] AllConfigUnshelveStrategyInput input) { var deleteConfigUnshelveStrategyChooseList = new List(); var deleteConfigUnshelveStrategyRangeList = new List(); //先删除对应主表的范围和策略 var ChooseList = await _repWmsConfigUnshelveStrategyChoose.AsQueryable().Where(p => p.StrategyCode == input.StrategyCode).ToListAsync(); var RangeList = await _repWmsConfigUnshelveStrategyRange.AsQueryable().Where(p => p.StrategyCode == input.StrategyCode).ToListAsync(); if (ChooseList.Count != 0 || RangeList.Count != 0) { //await _repWmsConfigUnshelveStrategyChoose.DeleteAsync(ChooseList); //await _repWmsConfigUnshelveStrategyRange.DeleteAsync(RangeList); //这里直接执行了删除 如果抛异常 编辑的没执行,数据也已经删除了 deleteConfigUnshelveStrategyChooseList.AddRange(ChooseList); deleteConfigUnshelveStrategyRangeList.AddRange(RangeList); } var entity = input.Adapt(); //重复性验证 await CheckExist(entity, true); var wmsConfigUnshelveStrategyChooseList = new List(); var wmsConfigUnshelveStrategyRangeList = new List(); CheckInput(input); //var ortherWmsConfigUnshelveStrategyList = await _rep.GetListAsync(s => s.StartTime >= DateTime.Now && (s.EndTime <= DateTime.Now || s.EndTime == null) && s.StrategyCode != entity.StrategyCode); //var ortherStrategyCodeList = ortherWmsConfigUnshelveStrategyList.Select(s => s.StrategyCode).ToList();//生效的下架策略 var materialCodeList = input.WmsConfigUnshelveStrategyRange.Select(p => p.MaterialCode).ToList(); // var materialList = await _repWmsConfigUnshelveStrategyRange.AsQueryable().Where(p => ortherStrategyCodeList.Contains(p.StrategyCode) && materialCodeList.Contains(p.MaterialCode)).ToListAsync(); var materialList = await _repWmsConfigUnshelveStrategyRange.AsQueryable().Where(p => p.StrategyCode != entity.StrategyCode && materialCodeList.Contains(p.MaterialCode)).ToListAsync(); if (materialList.Count != 0) { var materialCode = ""; int index = 1; foreach (var item in materialList) { if (index < materialList.Count()) { materialCode += item.MaterialCode + ","; } else { materialCode += item.MaterialCode; } index++; } throw Oops.Oh("所选择的物料" + materialCode + "已有下架策略"); } foreach (var item in input.WmsConfigUnshelveStrategyChoose) { var ConfigUnshelveStrategyChoose = new WmsConfigUnshelveStrategyChoose() { StrategyCode = input.StrategyCode, StrategyOption = (StrategyOptionEnum)item.StrategyOption, Priority = item.Priority, }; wmsConfigUnshelveStrategyChooseList.Add(ConfigUnshelveStrategyChoose); } foreach (var item in input.WmsConfigUnshelveStrategyRange) { var ConfigUnshelveStrategyRange = new WmsConfigUnshelveStrategyRange() { StrategyCode = input.StrategyCode, MaterialCode = item.MaterialCode, MaterialName = item.MaterialName, MaterialUnit = item.MaterialUnit }; wmsConfigUnshelveStrategyRangeList.Add(ConfigUnshelveStrategyRange); } var _tenant = _rep.AsTenant(); try { await _tenant.BeginTranAsync(); if (deleteConfigUnshelveStrategyChooseList?.Count > 0) { await _repWmsConfigUnshelveStrategyChoose.DeleteAsync(deleteConfigUnshelveStrategyChooseList); } if (deleteConfigUnshelveStrategyRangeList?.Count > 0) { await _repWmsConfigUnshelveStrategyRange.DeleteAsync(deleteConfigUnshelveStrategyRangeList); } await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: false).ExecuteCommandAsync();//策略失效时间允许为空 await _repWmsConfigUnshelveStrategyChoose.InsertRangeAsync(wmsConfigUnshelveStrategyChooseList); await _repWmsConfigUnshelveStrategyRange.InsertRangeAsync(wmsConfigUnshelveStrategyRangeList); await _tenant.CommitTranAsync(); } catch { await _tenant.RollbackTranAsync(); throw; } } /// /// 校验策略入参 /// /// /// private static void CheckInput(AllConfigUnshelveStrategyInput input) { //下架策略列表数据判断 if (input.StartTime.HasValue && input.EndTime.HasValue && input.StartTime.Value > input.EndTime.Value) { throw Oops.Oh("下架策略生效时间不能晚于策略失效时间"); } if (input.WmsConfigUnshelveStrategyChoose?.Count <= 0) { throw Oops.Oh("下架策略选项类型不能为空"); } ////TODO 暂时 只能支持 一个下架策略 //if (input.WmsConfigUnshelveStrategyChoose.Count > 1) //{ // throw Oops.Oh("下架策略选项类型只能选一个"); //} if (input.WmsConfigUnshelveStrategyChoose.Any(a => a.StrategyOption == null)) { throw Oops.Oh("下架策略必须选择策略选项"); } if (input.WmsConfigUnshelveStrategyChoose.Any(a => a.Priority == 0)) { throw Oops.Oh("下架策略必须选择优先级"); } if (input.WmsConfigUnshelveStrategyChoose.GroupBy(x => x.Priority).Any(g => g.Count() > 1)) { throw Oops.Oh("下架策略优先级选择重复"); } if (input.WmsConfigUnshelveStrategyChoose.GroupBy(x => x.StrategyOption).Any(g => g.Count() > 1)) { throw Oops.Oh("下架策略选项类型重复"); } // 统计枚举值的出现次数 int countValue1 = input.WmsConfigUnshelveStrategyChoose.Count(item => item.StrategyOption == StrategyOptionEnum.先进先出_天); //int countValue2 = input.WmsConfigUnshelveStrategyChoose.Count(item => item.StrategyOption == StrategyOptionEnum.先进先出_小时); int countValue3 = input.WmsConfigUnshelveStrategyChoose.Count(item => item.StrategyOption == StrategyOptionEnum.整拖优先); int countValue4 = input.WmsConfigUnshelveStrategyChoose.Count(item => item.StrategyOption == StrategyOptionEnum.零散优先); //if (countValue1 > 0 && countValue2 > 0) //{ // throw new Exception("“先进先出_天”不能和“先进先出_小时”同时选择"); //} if (countValue3 > 0 && countValue4 > 0) { throw new Exception("“满托推荐”不能和“半满推荐”同时选择"); } if (input.WmsConfigUnshelveStrategyRange?.Count() <= 0) { throw Oops.Oh("下架范围物料不能为空"); } //下架范围列表数据判断 if (input.WmsConfigUnshelveStrategyRange.GroupBy(x => x.MaterialCode).Any(g => g.Count() > 1)) { throw Oops.Oh("下架范围物料选择重复"); } } /// /// 删除下架策略 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [Description("WmsConfigUnshelveStrategy/Delete")] public async Task Delete(DeleteWmsConfigUnshelveStrategyInput input) { var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002); var ChooseList = await _repWmsConfigUnshelveStrategyChoose.AsQueryable().Where(p => p.StrategyCode == entity.StrategyCode).ToListAsync(); var RangeList = await _repWmsConfigUnshelveStrategyRange.AsQueryable().Where(p => p.StrategyCode == entity.StrategyCode).ToListAsync(); await _repWmsConfigUnshelveStrategyChoose.DeleteAsync(ChooseList); await _repWmsConfigUnshelveStrategyRange.DeleteAsync(RangeList); //await _rep.FakeDeleteAsync(entity); //假删除 await _rep.DeleteAsync(entity); //真删除 } /// /// 更新下架策略 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Update")] [Description("WmsConfigUnshelveStrategy/Update")] public async Task Update(UpdateWmsConfigUnshelveStrategyInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity, true); await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取下架策略 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [Description("WmsConfigUnshelveStrategy/Detail")] public async Task Detail([FromQuery] QueryByIdWmsConfigUnshelveStrategyInput input) { return await _rep.GetFirstAsync(u => u.Id == input.Id); } #region 私有方法 /// /// 公共查询下架策略条件 /// /// /// private ISugarQueryable CommonPageFilter(WmsConfigUnshelveStrategyInput input) { var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.StrategyCode.Contains(input.SearchKey.Trim()) || u.StrategyName.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) ) .WhereIF(!string.IsNullOrWhiteSpace(input.StrategyCode), u => u.StrategyCode.Contains(input.StrategyCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.StrategyName), u => u.StrategyName.Contains(input.StrategyName.Trim())) .WhereIF(input.IsDisabled.HasValue, u => u.IsDisabled == input.IsDisabled) .Select(); if (input.StartTimeRange != null && input.StartTimeRange.Count > 0) { DateTime? start = input.StartTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.StartTime > start); if (input.StartTimeRange.Count > 1 && input.StartTimeRange[1].HasValue) { var end = input.StartTimeRange[1].Value.AddDays(1); query = query.Where(u => u.StartTime < end); } } if (input.EndTimeRange != null && input.EndTimeRange.Count > 0) { DateTime? start = input.EndTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.EndTime > start); if (input.EndTimeRange.Count > 1 && input.EndTimeRange[1].HasValue) { var end = input.EndTimeRange[1].Value.AddDays(1); query = query.Where(u => u.EndTime < end); } } return query; } /// /// 重复性验证 /// /// 验证对象 /// 是否是编辑 /// private async Task CheckExist(WmsConfigUnshelveStrategy input, bool isEdit = false) { //没有配置组合校验,不需要验重 bool isExistForSingle_StrategyCode = false; if (!isEdit)//新增 { //数据是否单独存在重复-策略代码 isExistForSingle_StrategyCode = await _rep.AsQueryable().AnyAsync(u => u.StrategyCode.Equals(input.StrategyCode)); } else//编辑 { //当前编辑数据以外是否单独存在重复-策略代码 isExistForSingle_StrategyCode = await _rep.AsQueryable().AnyAsync(u => u.Id != input.Id && u.StrategyCode.Equals(input.StrategyCode)); } if (isExistForSingle_StrategyCode) throw Oops.Oh($"验证失败,策略代码[" + input.StrategyCode + "]已存在"); bool isExistForSingle_StrategyName = false; if (!isEdit)//新增 { //数据是否单独存在重复-策略名称 isExistForSingle_StrategyName = await _rep.AsQueryable().AnyAsync(u => u.StrategyName.Equals(input.StrategyName)); } else//编辑 { //当前编辑数据以外是否单独存在重复-策略名称 isExistForSingle_StrategyName = await _rep.AsQueryable().AnyAsync(u => u.Id != input.Id && u.StrategyName.Equals(input.StrategyName)); } //if (isExistForSingle_StrategyName) throw Oops.Oh($"验证失败,策略名称[" + input.StrategyName + "]已存在"); } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 var existExcelItemForSingle_StrategyCode = inputs.GroupBy(g => new { g.StrategyCode }).Where(g => g.Count() > 1).ToList(); if (existExcelItemForSingle_StrategyCode != null && existExcelItemForSingle_StrategyCode.Count > 0) { var item = existExcelItemForSingle_StrategyCode.First().ToList().First(); throw Oops.Oh($"验证失败,导入的表格中,策略代码[" + item.StrategyCode + "]已重复存在"); } var existExcelItemForSingle_StrategyName = inputs.GroupBy(g => new { g.StrategyName }).Where(g => g.Count() > 1).ToList(); if (existExcelItemForSingle_StrategyName != null && existExcelItemForSingle_StrategyName.Count > 0) { var item = existExcelItemForSingle_StrategyName.First().ToList().First(); throw Oops.Oh($"验证失败,导入的表格中,策略名称[" + item.StrategyName + "]已重复存在"); } //根据单独校验验证数据库中是否已存在相同数据 var existDBItemList = await _rep.GetListAsync(w => inputs.Select(s => s.StrategyCode).ToList().Contains(w.StrategyCode) || inputs.Select(s => s.StrategyName).ToList().Contains(w.StrategyName) ); var db_ForSingle_StrategyCode = existDBItemList.FirstOrDefault(g => inputs.Select(s => s.StrategyCode).ToList().Contains(g.StrategyCode)); if (db_ForSingle_StrategyCode != null) throw Oops.Oh($"验证失败,系统中,策略代码[" + db_ForSingle_StrategyCode.StrategyCode + "]已重复存在"); var db_ForSingle_StrategyName = existDBItemList.FirstOrDefault(g => inputs.Select(s => s.StrategyName).ToList().Contains(g.StrategyName)); if (db_ForSingle_StrategyName != null) throw Oops.Oh($"验证失败,系统中,策略名称[" + db_ForSingle_StrategyName.StrategyName + "]已重复存在"); } #endregion }