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
}