using Admin.NET.Core.Service; using Admin.NET.Application.Entity; using Microsoft.AspNetCore.Http; using System.Data; using System.Web; using System.Text; using Furion.DatabaseAccessor; using MathNet.Numerics; using DocumentFormat.OpenXml.VariantTypes; namespace Admin.NET.Application; /// /// 波次单明细服务 /// [ApiDescriptionSettings(ApplicationConst.WmsOrderGroupName, Order = 100)] public class WmsOrderSortDetailsService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _WmsOrderSortRep; private readonly SqlSugarRepository _WmsOrderMovementDetailsRep; private readonly SqlSugarRepository _WmsOrderMovementRep; private readonly SqlSugarRepository _WmsNoCreateRuleRep; private readonly SqlSugarRepository _repSNRep; private readonly SqlSugarRepository _WmsBaseBusinessTypeRep; private readonly SqlSugarRepository _WmsOrderDeliverDetailsRep; private readonly SqlSugarRepository _WmsOrderDeliverRep; private readonly WmsIssueService _wmsIssueService; public WmsOrderSortDetailsService(SqlSugarRepository rep, SqlSugarRepository wmsOrderSortRep, SqlSugarRepository WmsOrderMovementDetailsRep, SqlSugarRepository wmsOrderMovementRep, SqlSugarRepository wmsNoCreateRuleRep, SqlSugarRepository repSNRep, SqlSugarRepository WmsBaseBusinessTypeRep, SqlSugarRepository WmsOrderDeliverDetailsRep, SqlSugarRepository WmsOrderDeliverRep, WmsIssueService wmsIssueService ) { _rep = rep; _WmsOrderSortRep = wmsOrderSortRep; _WmsOrderMovementDetailsRep = WmsOrderMovementDetailsRep; _WmsOrderMovementRep = wmsOrderMovementRep; _WmsNoCreateRuleRep = wmsNoCreateRuleRep; _repSNRep = repSNRep; _WmsBaseBusinessTypeRep = WmsBaseBusinessTypeRep; _WmsOrderDeliverDetailsRep = WmsOrderDeliverDetailsRep; _WmsOrderDeliverRep = WmsOrderDeliverRep; _wmsIssueService = wmsIssueService; } /// /// 分页查询波次单明细 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Page")] [Description("WmsOrderSortDetails/Page")] public async Task> Page(WmsOrderSortDetailsInput input) { var query = CommonPageFilter(input); return await query .OrderBy(x => x.LineNumber) //.OrderBuilder(input, "", "Id") .ToPagedListAsync(input.Page, input.PageSize); } /// /// 不分页查询波次单明细 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [Description("WmsOrderSortDetails/List")] public async Task> List([FromQuery] WmsOrderSortDetailsInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").Select().ToListAsync(); } /// /// 创建波次-确认 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [Description("WmsOrderSortDetails/Add")] [UnitOfWork] public async Task Add(List input) { /* 1 插入波次主表1条 2 插入波次明细表n条 3 更新下架单明细表的物料 - 状态 波次数 4 更新下架单主表 - 状态 5 如果存在DO单的物料 更新状态 波次数 --ly * **/ if (input is null || input.Count == 0) { throw Oops.Oh("明细不能为空"); } var hearId = await AddOrderEFsql(input); return 200; //var entity = input.Adapt(); ////重复性验证 //await CheckExist(entity); //await _rep.InsertAsync(entity); //return entity.Id; } /// /// 创建波次单并且下发 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "CreateOrderAndIssue")] [Description("WmsOrderSortDetails/CreateOrderAndIssue")] [UnitOfWork] public async Task CreateOrderAndIssue(List input) { if (input is null || input.Count == 0) { throw Oops.Oh("明细不能为空"); } var wmsOrderSortDetails = await AddOrderEFsql(input); var issueList = wmsOrderSortDetails.Select(n => new IssueInput { SendQuantity = n.Quantity, Batch = n.Batch, SortNo = n.SortNo, SortDetailsId = n.Id, }).ToList(); await _wmsIssueService.Issue(issueList); return 200; } private async Task> AddOrderEFsql(List input) { //-----------新增表头 var warehousOrder = new WmsOrderSort(); var hearId = Yitter.IdGenerator.YitIdHelper.NextId(); warehousOrder.Id = hearId; warehousOrder.BusinessType = BusinessTypeEnum.波次下发; warehousOrder.BusinessTypeName = GetEnumDescriptionUtil.GetEnumDescription(BusinessTypeEnum.波次下发); var entity = await _WmsBaseBusinessTypeRep.GetFirstAsync(u => u.BusinessTypeValue == (int)warehousOrder.BusinessType); if (entity == null) { throw Oops.Oh("业务类型名称获取失败"); } // 获取当前时间 DateTime currentTime = DateTime.Now; // 格式化为年月日字符串 string formattedDate = currentTime.ToString("yyyyMMdd"); //按照单号规则生成单号 - 查找最新的创建的一条单据记录 var newestOrder = await _WmsOrderSortRep.AsQueryable().Where(p => p.OrderType == OrderTypeEnum.波次单).Where(p => p.SortNo.Contains(formattedDate)).OrderBy(it => it.CreateTime, OrderByType.Desc) .FirstAsync(); //ly-按照单号规则生成单号 warehousOrder.SortNo = await SerialUtilOrder.GetSerialOrder(OrderTypeEnum.波次单, _WmsNoCreateRuleRep, _repSNRep, (int)warehousOrder.BusinessType, newestOrder == null ? null : newestOrder.SortNo); if (warehousOrder.SortNo == null || warehousOrder.SortNo == "") { warehousOrder.SortNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); } warehousOrder.OrderType = OrderTypeEnum.波次单; warehousOrder.OrderTypeName = OrderTypeEnum.波次单.GetDescription(); warehousOrder.OrderSocure = SourceByEnum.系统; warehousOrder.SortStatus = OrderStatusEnum.新建; warehousOrder.SortStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.新建); //-------新增明细 var warehousOrderDetails1 = input.Adapt>(); for (int i = 0; i < warehousOrderDetails1.Count; i++) { warehousOrderDetails1[i].RelationNo = input[i].MovementNo; } //定义行号 int lineNumber = 1; foreach (var w in warehousOrderDetails1) { if (w.Quantity == 0) { throw Oops.Oh("创建失败:数量需要大于0"); } if (String.IsNullOrEmpty(w.LineNumber)) { throw Oops.Oh("创建失败:行号不能为空"); } w.RelationNoLineNumber = w.LineNumber; //系统自己生成行号 // string myLineNumeber = (input.Where(x => x.SortNo == w.SortNo).Count()).ToString(); string myLineNumeber = lineNumber.ToString(); w.LineNumber = OrderHelper.AutoCompleEBELP(myLineNumeber,4); w.Id = Yitter.IdGenerator.YitIdHelper.NextId(); w.SortNo = warehousOrder.SortNo; w.SortId = warehousOrder.Id; w.SortDetailStatus = OrderStatusEnum.新建; w.SortDetailStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.新建); w.OffShelvesQuantity = 0M; w.PickQuantity = 0M; w.IssueQuantity = 0M; lineNumber++; } //------------更新下架单的物料-状态 波次数 var WmsOrderMovementDetailsArr = new List(); List queryCodeList = input.Select(v => v.Id).Distinct().ToList(); var handleList = await _WmsOrderMovementDetailsRep.GetListAsync(u => queryCodeList.Contains(u.Id) && u.IsDelete == false); foreach (var w in handleList) { //ly 数量可自定义 波次对象 var paramWarehousOrderDetails1 = warehousOrderDetails1 .FirstOrDefault(x => x.MaterialCode == w.MaterialCode && x.RelationNoLineNumber == w.LineNumber && x.RelationNo == w.MovementNo); if (paramWarehousOrderDetails1 == null) { throw Oops.Oh("创建失败:下架单明细中没有找到相应的物料!"); } decimal usedQty = w.Quantity - w.CreateWaveQuantity; if (paramWarehousOrderDetails1.Quantity > usedQty) { throw Oops.Oh($"创建失败:{paramWarehousOrderDetails1.RelationNo}需求数量必须小于订单数{w.Quantity}与波次数量{w.CreateWaveQuantity}之差"); } w.CreateWaveQuantity += paramWarehousOrderDetails1.Quantity; w.OrderStatus = OrderStatusEnum.处理中; w.OrderStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); WmsOrderMovementDetailsArr.Add(w); } //------------更新主表下架单-状态 var WmsOrderMovementArr = new List(); List queryCodeListMovement = input.Select(v => v.MovementNo).Distinct().ToList(); var handleListZ = await _WmsOrderMovementRep .GetListAsync(u => queryCodeListMovement.Contains(u.OrderNo) && u.IsDelete == false); if (handleListZ==null || handleListZ.Count<=0) { throw Oops.Oh($"创建失败:没有找到下架单"); } foreach (var w in handleListZ) { w.OrderStatus = OrderStatusEnum.处理中; w.OrderStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); WmsOrderMovementArr.Add(w); } //------------ly-如果存在DO单的物料 更新DO单的物料 - 更新状态 波次数 var WmsOrderDeliverDetailsArr = new List(); var WmsOrderDeliverArr = new List(); List queryCodeListForDo = input.Where(v => !string.IsNullOrWhiteSpace(v.RelationNo)).Select(v => v.RelationNo).Distinct().ToList(); if (queryCodeListForDo.Count > 0) { //DO单明细 var handleListForDo = await _WmsOrderDeliverDetailsRep.GetListAsync(u => queryCodeListForDo.Contains(u.DoNo) && u.IsDelete == false); foreach (var w in handleListForDo) { var item = input.FirstOrDefault(x => x.MaterialCode == w.MaterialCode && x.RelationNoLineNumber == w.DoLineNumber && x.RelationNo == w.DoNo); if (item != null) { var hasUseBoQty = w.CreateMovementQuantity; w.CreateMovementQuantity += item.Quantity; if (w.CreateMovementQuantity > w.Quantity) { throw Oops.Oh($"创建失败:DO单号{w.DoNo},物料编号{w.MaterialCode},DO行号{w.DoLineNumber},订单数{w.Quantity},已创建的波次数{hasUseBoQty},无可用数量!"); } w.DoDetailStatus = OrderStatusEnum.处理中; w.DoDetailStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); WmsOrderDeliverDetailsArr.Add(w); } } //------------end ly更新DO单的物料 - 更新状态 波次数 //------------ly--更新DO主表下架单-状态 if (queryCodeListForDo.Count > 0 && WmsOrderDeliverDetailsArr.Count > 0) { var handleListForDoMain = await _WmsOrderDeliverRep.GetListAsync(u => queryCodeListForDo.Contains(u.DeliverNo) && u.IsDelete == false); if (handleListForDoMain == null || handleListForDoMain.Count <= 0) { throw Oops.Oh("创建失败:没有找到主DO订单单号"); } foreach (var w in handleListForDoMain) { if (w.DoStatus == OrderStatusEnum.处理中 || w.DoStatus == OrderStatusEnum.新建) { w.DoStatus = OrderStatusEnum.处理中; w.DoStatusName = GetEnumDescriptionUtil.GetEnumDescription(OrderStatusEnum.处理中); WmsOrderDeliverArr.Add(w); } else { throw Oops.Oh($"创建失败:DO订单{w.DeliverNo}状态{w.DoStatusName} 不可操作!"); } } } //------------ly--end更新DO主表下架单-状态 } try { // await _rep.AsTenant().BeginTranAsync(); if (warehousOrder != null) { await _WmsOrderSortRep.InsertAsync(warehousOrder);//插入波次主表 } if (warehousOrderDetails1.Count > 0) { await _rep.InsertRangeAsync(warehousOrderDetails1); //插入波次明细表 } if (WmsOrderMovementDetailsArr.Count > 0) { await _WmsOrderMovementDetailsRep.UpdateRangeAsync(WmsOrderMovementDetailsArr); //更新下架单明细表 } if (WmsOrderMovementArr.Count > 0) { await _WmsOrderMovementRep.UpdateRangeAsync(WmsOrderMovementArr); //更新下架单主表 } ////--ly0701 存在DO单 更新Do单波次数 if (WmsOrderDeliverDetailsArr.Count > 0) { await _WmsOrderDeliverDetailsRep.UpdateRangeAsync(WmsOrderDeliverDetailsArr); //更新DO单明细表 } if (WmsOrderDeliverArr.Count > 0) { await _WmsOrderDeliverRep.UpdateRangeAsync(WmsOrderDeliverArr); //更新DO单主表 } //调用公共方法 //await _WmsOrderMovementDetailsRep.UpdateRangeAsync(WmsOrderMovementDetailsArr); //更新下架单主表 // await _rep.AsTenant().CommitTranAsync(); } catch { // await _rep.AsTenant().RollbackTranAsync(); throw; } return warehousOrderDetails1; } /// /// 删除波次单明细 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [Description("WmsOrderSortDetails/Delete")] public async Task Delete(DeleteWmsOrderSortDetailsInput 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("WmsOrderSortDetails/Update")] public async Task Update(UpdateWmsOrderSortDetailsInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity,true); await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取波次单明细 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [Description("WmsOrderSortDetails/Detail")] public async Task Detail([FromQuery] QueryByIdWmsOrderSortDetailsInput input) { return await _rep.GetFirstAsync(u => u.Id == input.Id); } #region 导入 /// /// Excel模板导入波次单明细功能 /// /// Excel模板文件 /// 导入的记录数 [HttpPost] [ApiDescriptionSettings(Name = "ImportExcel")] [Description("WmsOrderSortDetails/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;//模版列名开始行 foreach (System.Data.DataRow row in dataTable.Rows) { index++; //导入模版定制化代码(替换模版使用) var addItem = new WmsOrderSortDetails(); #region 定义变量 var _SortId = "";//波次单ID var _SortNo = "";//波次单号 var _SortDetailStatus = "";//状态 var _SortDetailStatusName = "";//状态名称 var _LineNumber = "";//行号 var _MaterialCode = "";//物料编号 var _MaterialName = "";//物料名称 var _RelationNo = "";//关联单号 var _RelationNoLineNumber = "";//关联单行号 var _SNCode = "";//跟踪码 var _Unit = "";//单位 var _Quantity = "";//数量 var _DispenseQuantity = "";//分配数 var _OffShelvesQuantity = "";//下架数 var _DeliverQuantity = "";//发货数 var _PickQuantity = "";//分拣数 var _IssueQuantity = "";//下发数 var _BatchRule = "";//批次规则 var _Batch = "";//批次 var _ErpOrderNo = "";//ERP单号 var _ErpCode = "";//ERP库存地 #endregion #region 取值 _SortId = row["波次单ID"]?.ToString() ; _SortNo = row["波次单号"]?.ToString() ; _SortDetailStatus = row["状态"]?.ToString() ; _SortDetailStatusName = row["状态名称"]?.ToString() ; _LineNumber = row["行号"]?.ToString() ; _MaterialCode = row["物料编号"]?.ToString() ; _MaterialName = row["物料名称"]?.ToString() ; _RelationNo = row["关联单号"]?.ToString() ; _RelationNoLineNumber = row["关联单行号"]?.ToString() ; _SNCode = row["跟踪码"]?.ToString() ; _Unit = row["单位"]?.ToString() ; _Quantity = row["数量"]?.ToString() ; // _DispenseQuantity = row["分配数"]?.ToString() ; //_OffShelvesQuantity = row["下架数"]?.ToString() ; //_DeliverQuantity = row["发货数"]?.ToString() ; // _PickQuantity = row["分拣数"]?.ToString() ; _IssueQuantity = row["下发数"]?.ToString() ; _BatchRule = row["批次规则"]?.ToString() ; _Batch = row["批次"]?.ToString() ; _ErpOrderNo = row["ERP单号"]?.ToString() ; _ErpCode = row["ERP库存地"]?.ToString() ; #endregion #region 验证 if (string.IsNullOrEmpty(_SortId)) { throw Oops.Oh($"第{index}行[波次单ID]{_SortId}不能为空!"); } if(!string.IsNullOrEmpty(_SortId)) { if (!long.TryParse(_SortId, out long outSortId)&&!string.IsNullOrEmpty(_SortId)) { throw Oops.Oh($"第{index}行[波次单ID]{_SortId}值不正确!"); } if (outSortId <= 0&&!string.IsNullOrEmpty(_SortId)) { throw Oops.Oh($"第{index}行[波次单ID]{_SortId}值不能小于等于0!"); } else { addItem.SortId = outSortId; } } if (string.IsNullOrEmpty(_SortNo)) { throw Oops.Oh($"第{index}行[波次单号]{_SortNo}不能为空!"); } if(!string.IsNullOrEmpty(_SortNo)) { addItem.SortNo = (string)(_SortNo.Trim()); } if (string.IsNullOrEmpty(_SortDetailStatus)) { throw Oops.Oh($"第{index}行[状态]{_SortDetailStatus}不能为空!"); } if(!string.IsNullOrEmpty(_SortDetailStatus)) { Admin.NET.Application.OrderStatusEnum enumSortDetailStatus = default(Admin.NET.Application.OrderStatusEnum); if(!Enum.TryParse(_SortDetailStatus, out enumSortDetailStatus)&&!string.IsNullOrEmpty(_SortDetailStatus)) { throw Oops.Oh($"第{index}行[状态]{_SortDetailStatus}值不正确!"); } else { addItem.SortDetailStatus = enumSortDetailStatus; } } if (string.IsNullOrEmpty(_SortDetailStatusName)) { throw Oops.Oh($"第{index}行[状态名称]{_SortDetailStatusName}不能为空!"); } if(!string.IsNullOrEmpty(_SortDetailStatusName)) { addItem.SortDetailStatusName = (string)(_SortDetailStatusName.Trim()); } if (string.IsNullOrEmpty(_LineNumber)) { throw Oops.Oh($"第{index}行[行号]{_LineNumber}不能为空!"); } if(!string.IsNullOrEmpty(_LineNumber)) { addItem.LineNumber = (string)(_LineNumber.Trim()); } if (string.IsNullOrEmpty(_MaterialCode)) { throw Oops.Oh($"第{index}行[物料编号]{_MaterialCode}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialCode)) { addItem.MaterialCode = (string)(_MaterialCode.Trim()); } if (string.IsNullOrEmpty(_MaterialName)) { throw Oops.Oh($"第{index}行[物料名称]{_MaterialName}不能为空!"); } if(!string.IsNullOrEmpty(_MaterialName)) { addItem.MaterialName = (string)(_MaterialName.Trim()); } if(!string.IsNullOrEmpty(_RelationNo)) { addItem.RelationNo = (string)(_RelationNo.Trim()); } if(!string.IsNullOrEmpty(_RelationNoLineNumber)) { addItem.RelationNoLineNumber = (string)(_RelationNoLineNumber.Trim()); } if (string.IsNullOrEmpty(_SNCode)) { throw Oops.Oh($"第{index}行[跟踪码]{_SNCode}不能为空!"); } if(!string.IsNullOrEmpty(_SNCode)) { addItem.SNCode = (string)(_SNCode.Trim()); } if(!string.IsNullOrEmpty(_Unit)) { addItem.Unit = (string)(_Unit.Trim()); } if (string.IsNullOrEmpty(_Quantity)) { throw Oops.Oh($"第{index}行[数量]{_Quantity}不能为空!"); } if(!string.IsNullOrEmpty(_Quantity)) { if (!decimal.TryParse(_Quantity, out decimal outQuantity)&&!string.IsNullOrEmpty(_Quantity)) { throw Oops.Oh($"第{index}行[数量]{_Quantity}值不正确!"); } if (outQuantity <= 0&&!string.IsNullOrEmpty(_Quantity)) { throw Oops.Oh($"第{index}行[数量]{_Quantity}值不能小于等于0!"); } else { addItem.Quantity = outQuantity; } } if(!string.IsNullOrEmpty(_OffShelvesQuantity)) { if (!decimal.TryParse(_OffShelvesQuantity, out decimal outOffShelvesQuantity)&&!string.IsNullOrEmpty(_OffShelvesQuantity)) { throw Oops.Oh($"第{index}行[下架数]{_OffShelvesQuantity}值不正确!"); } if (outOffShelvesQuantity <= 0&&!string.IsNullOrEmpty(_OffShelvesQuantity)) { throw Oops.Oh($"第{index}行[下架数]{_OffShelvesQuantity}值不能小于等于0!"); } else { addItem.OffShelvesQuantity = outOffShelvesQuantity; } } if(!string.IsNullOrEmpty(_DeliverQuantity)) { if (!decimal.TryParse(_DeliverQuantity, out decimal outDeliverQuantity)&&!string.IsNullOrEmpty(_DeliverQuantity)) { throw Oops.Oh($"第{index}行[发货数]{_DeliverQuantity}值不正确!"); } if (outDeliverQuantity <= 0&&!string.IsNullOrEmpty(_DeliverQuantity)) { throw Oops.Oh($"第{index}行[发货数]{_DeliverQuantity}值不能小于等于0!"); } else { addItem.DeliverQuantity = outDeliverQuantity; } } if(!string.IsNullOrEmpty(_PickQuantity)) { if (!decimal.TryParse(_PickQuantity, out decimal outPickQuantity)&&!string.IsNullOrEmpty(_PickQuantity)) { throw Oops.Oh($"第{index}行[分拣数]{_PickQuantity}值不正确!"); } if (outPickQuantity <= 0&&!string.IsNullOrEmpty(_PickQuantity)) { throw Oops.Oh($"第{index}行[分拣数]{_PickQuantity}值不能小于等于0!"); } else { addItem.PickQuantity = outPickQuantity; } } //if(!string.IsNullOrEmpty(_IssueQuantity)) //{ // addItem.IssueQuantity = _IssueQuantity; // } if(!string.IsNullOrEmpty(_BatchRule)) { addItem.BatchRule = (string)(_BatchRule.Trim()); } if(!string.IsNullOrEmpty(_Batch)) { addItem.Batch = (string)(_Batch.Trim()); } if(!string.IsNullOrEmpty(_ErpOrderNo)) { addItem.ErpOrderNo = (string)(_ErpOrderNo.Trim()); } if(!string.IsNullOrEmpty(_ErpCode)) { addItem.ErpCode = (string)(_ErpCode.Trim()); } #endregion details.Add(addItem); } //验重 await CheckExisitForImport(details); return details; } /// /// 根据版本下载波次单明细的Excel导入模板 /// /// 下载的模板文件 [HttpGet] [ApiDescriptionSettings(Name = "DownloadExcelTemplate")] [Description("WmsOrderSortDetails/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(WmsOrderSortDetailsInput input) { //ly-0606 波次-下发-需要传递的参数 if (!string.IsNullOrWhiteSpace(input.OrdersId)) { input.OrdersIdList = new List(); if (input.OrdersId.IndexOf(',') >= 0 || input.OrdersId.IndexOf(',') >= 0) { var list = input.OrdersId.Replace(',', ',').Split(',').ToList(); foreach (var item in list) { input.OrdersIdList.Add(Convert.ToInt64(item)); } input.OrdersId = string.Empty; } else { input.OrdersIdList.Add(Convert.ToInt64(input.OrdersId)); } } var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.SortNo.Contains(input.SearchKey.Trim()) || u.SortDetailStatusName.Contains(input.SearchKey.Trim()) || u.LineNumber.Contains(input.SearchKey.Trim()) || u.MaterialCode.Contains(input.SearchKey.Trim()) || u.MaterialName.Contains(input.SearchKey.Trim()) || u.RelationNo.Contains(input.SearchKey.Trim()) || u.RelationNoLineNumber.Contains(input.SearchKey.Trim()) || u.SNCode.Contains(input.SearchKey.Trim()) || u.Unit.Contains(input.SearchKey.Trim()) // || u.IssueQuantity.Contains(input.SearchKey.Trim()) || u.BatchRule.Contains(input.SearchKey.Trim()) || u.Batch.Contains(input.SearchKey.Trim()) || u.ErpOrderNo.Contains(input.SearchKey.Trim()) || u.ErpCode.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) ) .WhereIF(input.SortId>0, u => u.SortId == input.SortId) .WhereIF(input.OrdersIdList != null && input.OrdersIdList.Count > 0, u => input.OrdersIdList.Contains(u.SortId)) // 下发波次单-需要传递的参数- 支持多个Id集合查询 .WhereIF(input.AbleSendForMateriral==true, u => u.Quantity > u.IssueQuantity) //ly-波次单-下发页面用 .WhereIF(!string.IsNullOrWhiteSpace(input.SortNo), u => u.SortNo.Contains(input.SortNo.Trim())) .WhereIF(input.SortDetailStatus.HasValue, u => u.SortDetailStatus == input.SortDetailStatus) .WhereIF(!string.IsNullOrWhiteSpace(input.SortDetailStatusName), u => u.SortDetailStatusName.Contains(input.SortDetailStatusName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.LineNumber), u => u.LineNumber.Contains(input.LineNumber.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode.Contains(input.MaterialCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.RelationNo), u => u.RelationNo.Contains(input.RelationNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.RelationNoLineNumber), u => u.RelationNoLineNumber.Contains(input.RelationNoLineNumber.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SNCode), u => u.SNCode.Contains(input.SNCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Unit), u => u.Unit.Contains(input.Unit.Trim())) // .WhereIF(!string.IsNullOrWhiteSpace(input.IssueQuantity), u => u.IssueQuantity.Contains(input.IssueQuantity.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.BatchRule), u => u.BatchRule.Contains(input.BatchRule.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpOrderNo), u => u.ErpOrderNo.Contains(input.ErpOrderNo.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim())) .Select(); return query; } /// /// 重复性验证 /// /// 验证对象 /// 是否是编辑 /// private async Task CheckExist( WmsOrderSortDetails input,bool isEdit=false) { //没有配置组合校验,不需要验重 //没有配置单独校验,不需要验重 } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 } #endregion }