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; namespace Admin.NET.Application; /// /// 看板卡配置服务 /// [ApiDescriptionSettings(ApplicationConst.WmsSystemConfigGroupName, Order = 100)] public class WmsConfigKbcardService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _rep; private readonly SqlSugarRepository _wmsPlaceRep; private readonly WmsOrderMovementService _wmsOrderMovementService; private readonly SqlSugarRepository _wmsStockQuanRep; private readonly WmsOrderSortDetailsService _wmsOrderSortDetailsService; private readonly SqlSugarRepository _wmsMaterialRep; public WmsConfigKbcardService( SqlSugarRepository rep, SqlSugarRepository wmsPlaceRep, WmsOrderMovementService wmsOrderMovementService, SqlSugarRepository wmsStockQuanRep, WmsOrderSortDetailsService wmsOrderSortDetailsService, SqlSugarRepository wmsMaterialRep ) { _rep = rep; _wmsPlaceRep = wmsPlaceRep; _wmsOrderMovementService = wmsOrderMovementService; _wmsStockQuanRep = wmsStockQuanRep; _wmsOrderSortDetailsService = wmsOrderSortDetailsService; _wmsMaterialRep = wmsMaterialRep; } /// /// 分页查询看板卡配置 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Page")] [Description("WmsConfigKbcard/Page")] public async Task> Page([FromQuery] WmsConfigKbcardInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").ToPagedListAsync(input.Page, input.PageSize); } /// /// 不分页查询看板卡配置 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "List")] [Description("WmsConfigKbcard/List")] public async Task> List([FromQuery] WmsConfigKbcardInput input) { var query = CommonPageFilter(input); return await query.OrderBuilder(input, "", "Id").Select().ToListAsync(); } /// /// 增加看板卡配置 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Add")] [Description("WmsConfigKbcard/Add")] public async Task Add(AddWmsConfigKbcardInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity); await _rep.InsertAsync(entity); return entity.Id; } /// /// 删除看板卡配置 /// /// /// [HttpPost] [ApiDescriptionSettings(Name = "Delete")] [Description("WmsConfigKbcard/Delete")] public async Task Delete(DeleteWmsConfigKbcardInput 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("WmsConfigKbcard/Update")] public async Task Update(UpdateWmsConfigKbcardInput input) { var entity = input.Adapt(); //重复性验证 await CheckExist(entity,true); //验证物料是否存在 var entityMaterial = await _wmsMaterialRep.GetFirstAsync(u => u.MaterialCode == input.MaterialCode); if (entityMaterial == null) throw Oops.Oh($"物料[" + input.MaterialCode + "]不存在"); entity.MaterialName = entityMaterial.MaterialName; await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync(); } /// /// 获取看板卡配置 /// /// /// [HttpGet] [ApiDescriptionSettings(Name = "Detail")] [Description("WmsConfigKbcard/Detail")] public async Task Detail([FromQuery] QueryByIdWmsConfigKbcardInput input) { return await _rep.GetFirstAsync(u => u.Id == input.Id); } /// /// 获取目标点通过库区 /// /// [HttpGet] [ApiDescriptionSettings(Name = "GetPlaceByAreaCode")] [Description("WmsConfigKbcard/GetPlaceByAreaCode")] public async Task> GetPlaceByAreaCode([FromQuery] GetPlaceByAreaCodeInput input) { if(string.IsNullOrWhiteSpace(input.AreaCode)) throw Oops.Oh("库位编码不能为空!"); // 获取空闲的库区信息 var wmsPlaceList = await _wmsPlaceRep .AsQueryable() .Where(n => n.AreaCode == input.AreaCode && n.PlaceStatus == PlaceStatusEnum.正常) .Select() .ToListAsync(); return wmsPlaceList; } /// /// 添加看板卡下架单 /// /// [HttpPost] [ApiDescriptionSettings(Name = "AddKbcardOrderMovement")] [Description("WmsConfigKbcard/AddKbcardOrderMovement")] [UnitOfWork] public async Task AddKbcardOrderMovement(AddKbcardOrderMovementInput input) { // 看板卡 var kanbanModal = await _rep.GetFirstAsync(n => n.KanBanCardNo == input.KanBanCardNo); if (kanbanModal == null) throw Oops.Oh($"看板卡{input.KanBanCardNo}的信息不存在!"); // 获取物料库存信息 var wmsStockQuanModal = await _wmsStockQuanRep.GetFirstAsync(n => n.MaterialCode == kanbanModal.MaterialCode); // 添加订单明细 var orderDetails = new List(); var orderDetail = wmsStockQuanModal.Adapt(); orderDetail.ToAreaCode = kanbanModal.ToAreaCode; orderDetail.ToAreaName = kanbanModal.ToAreaName; orderDetail.ToPlaceCode = kanbanModal.ToPlaceCode; orderDetail.ToPlaceName = kanbanModal.ToPlaceName; orderDetail.Quantity = kanbanModal.Quantity; orderDetail.CreateWaveQuantity = kanbanModal.Quantity; orderDetail.RelationNo = ""; orderDetail.RelationNoLineNumber = ""; orderDetail.Unit = wmsStockQuanModal.MaterialUnit; orderDetail.ErpCode = wmsStockQuanModal.ErpCode; orderDetails.Add(orderDetail); var diyAddWmsOrderMovementInput = new DiyAddWmsOrderMovementInput { BusinessType = BusinessTypeEnum.看板卡下架, OrderSocure = SourceByEnum.系统, ToAreaCode = kanbanModal.ToAreaCode, ToAreaName = kanbanModal.ToAreaName, ToPlaceCode = kanbanModal.ToPlaceCode, ToPlaceName = kanbanModal.ToPlaceName, CustCode= kanbanModal.SupplierCode, CustChinaName= kanbanModal.SupplierName, orderDetails = orderDetails, }; var orderMovementList = await _wmsOrderMovementService.AddOff(diyAddWmsOrderMovementInput); var diyAddWmsOrderSortDetails = orderMovementList.Select(n => new DiyAddWmsOrderSortDetailsInput { LineNumber = n.LineNumber, MaterialCode = n.MaterialCode, MaterialName = n.MaterialName, Quantity = n.Quantity, MovementNo = n.MovementNo, CustCode = n.CustCode, CustName = n.CustName, Priority = n.Priority, SortDetailStatus = OrderStatusEnum.新建, RelationNo = n.RelationNo, RelationNoLineNumber = n.RelationNoLineNumber, SNCode = n.SNCode, Unit = n.Unit, PickQuantity = n.PickQuantity, Batch = n.Batch, BatchRule = n.BatchRule, ErpCode = n.ErpCode, ErpOrderNo = n.ErpOrderNo, }).ToList(); // 创建波次单并且下发 await _wmsOrderSortDetailsService.CreateOrderAndIssue(diyAddWmsOrderSortDetails); } #region 私有方法 /// /// 公共查询看板卡配置条件 /// /// /// private ISugarQueryable CommonPageFilter(WmsConfigKbcardInput input) { var query = _rep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u => u.KanBanCardNo.Contains(input.SearchKey.Trim()) || u.MaterialCode.Contains(input.SearchKey.Trim()) || u.MaterialName.Contains(input.SearchKey.Trim()) || u.SupplierCode.Contains(input.SearchKey.Trim()) || u.SupplierName.Contains(input.SearchKey.Trim()) || u.SourceAreaCode.Contains(input.SearchKey.Trim()) || u.SourceAreaName.Contains(input.SearchKey.Trim()) || u.ToAreaCode.Contains(input.SearchKey.Trim()) || u.ToAreaName.Contains(input.SearchKey.Trim()) || u.ToPlaceCode.Contains(input.SearchKey.Trim()) || u.ToPlaceName.Contains(input.SearchKey.Trim()) || u.ActionRemark.Contains(input.SearchKey.Trim()) || u.CreateUserName.Contains(input.SearchKey.Trim()) || u.UpdateUserName.Contains(input.SearchKey.Trim()) ) .WhereIF(!string.IsNullOrWhiteSpace(input.KanBanCardNo), u => u.KanBanCardNo.Contains(input.KanBanCardNo.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.SupplierCode), u => u.SupplierCode.Contains(input.SupplierCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SupplierName), u => u.SupplierName.Contains(input.SupplierName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SourceAreaCode), u => u.SourceAreaCode.Contains(input.SourceAreaCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.SourceAreaName), u => u.SourceAreaName.Contains(input.SourceAreaName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ToAreaCode), u => u.ToAreaCode.Contains(input.ToAreaCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ToAreaName), u => u.ToAreaName.Contains(input.ToAreaName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ToPlaceCode), u => u.ToPlaceCode.Contains(input.ToPlaceCode.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ToPlaceName), u => u.ToPlaceName.Contains(input.ToPlaceName.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.ActionRemark), u => u.ActionRemark.Contains(input.ActionRemark.Trim())) .Select(); if(input.ActionTimeRange != null && input.ActionTimeRange.Count >0) { DateTime? start= input.ActionTimeRange[0].Value.AddDays(-1); query = query.WhereIF(start.HasValue, u => u.ActionTime > start); if (input.ActionTimeRange.Count >1 && input.ActionTimeRange[1].HasValue) { var end = input.ActionTimeRange[1].Value.AddDays(1); query = query.Where(u => u.ActionTime < end); } } 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( WmsConfigKbcard input,bool isEdit=false) { //没有配置组合校验,不需要验重 bool isExistForSingle_KanBanCardNo = false; if (!isEdit)//新增 { //数据是否单独存在重复-看板卡号 isExistForSingle_KanBanCardNo = await _rep.AsQueryable().AnyAsync(u => u.KanBanCardNo.Equals(input.KanBanCardNo)); } else//编辑 { //当前编辑数据以外是否单独存在重复-看板卡号 isExistForSingle_KanBanCardNo = await _rep.AsQueryable().AnyAsync(u => u.Id != input.Id && u.KanBanCardNo.Equals(input.KanBanCardNo)); } if (isExistForSingle_KanBanCardNo) throw Oops.Oh($"验证失败,看板卡号[" + input.KanBanCardNo + "]已存在"); if (string.IsNullOrWhiteSpace(input.ToPlaceCode) && string.IsNullOrWhiteSpace(input.ToAreaCode)) { throw Oops.Oh($"目标库区、目标库位不能同时为空"); } } /// /// 根据组合校验和单独校验验证数据是否已存在-导入时验证 /// /// /// private async Task CheckExisitForImport(List inputs) { if (inputs?.Count <= 0) { throw Oops.Oh($"导入数据不能为空"); } //根据组合校验验证表格中中是否已存在相同数据 //根据单独校验验证表格中中是否已存在相同数据 var existExcelItemForSingle_KanBanCardNo = inputs.GroupBy(g => new { g.KanBanCardNo}).Where(g => g.Count() > 1).ToList(); if(existExcelItemForSingle_KanBanCardNo != null && existExcelItemForSingle_KanBanCardNo.Count > 0){ var item= existExcelItemForSingle_KanBanCardNo.First().ToList().First(); throw Oops.Oh($"验证失败,导入的表格中,看板卡号[" + item.KanBanCardNo + "]已重复存在"); } //根据单独校验验证数据库中是否已存在相同数据 var existDBItemList = await _rep.GetListAsync(w=> inputs.Select(s=>s.KanBanCardNo).ToList().Contains(w.KanBanCardNo) ); var db_ForSingle_KanBanCardNo = existDBItemList.FirstOrDefault(g => inputs.Select(s=>s.KanBanCardNo).ToList().Contains(g.KanBanCardNo)); if(db_ForSingle_KanBanCardNo != null) throw Oops.Oh($"验证失败,系统中,看板卡号[" + db_ForSingle_KanBanCardNo.KanBanCardNo + "]已重复存在"); } #endregion }