HIAWms/server/src/CMS.Plugin.HIAWms.Application.Contracts/Services/IWmsMaterialStockAppService.cs
@@ -1,4 +1,7 @@ using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; using System.Linq.Expressions; using Volo.Abp; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; @@ -58,4 +61,38 @@ /// <param name="input">The input.</param> /// <returns></returns> Task<(Dictionary<string, object> Sheets, string FileName)> ExportAsync(GetWmsMaterialStockInput input); /// <summary> /// 根据条件获取出入库单据详情列表 /// </summary> /// <param name="whereConditions"></param> /// <param name="cancellationToken"></param> /// <returns></returns> Task<List<WmsMaterialStock>> GetListByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, CancellationToken cancellationToken = default); /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="whereConditions"></param> /// <param name="isMultipleThrowException">是否查询出多条就报错</param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="UserFriendlyException"></exception> Task<WmsMaterialStock> GetSingleByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, bool isMultipleThrowException = false, CancellationToken cancellationToken = default); /// <summary> /// 根据条件获取出入库单据详情列表 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<List<WmsMaterialStockDto>> FindListByFilterAsync(GetWmsMaterialStockInput input, CancellationToken cancellationToken = default); /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="input"></param> /// <returns></returns> Task<WmsMaterialStockDto> FindSingleByFilterAsync(GetWmsMaterialStockInput input, CancellationToken cancellationToken = default); } HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsMaterialStockAppService.cs
@@ -710,4 +710,80 @@ Check.Length(input.Remark, "备注", WmsMaterialStockConsts.MaxRemarkLength); return Task.CompletedTask; } /// <summary> /// 根据条件获取出入库单据详情列表 /// </summary> /// <param name="whereConditions"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<List<WmsMaterialStock>> GetListByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, CancellationToken cancellationToken = default) { return await _wmsmaterialstockRepository.GetListByFilterAsync(whereConditions); } /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="whereConditions"></param> /// <param name="isMultipleThrowException">是否查询出多条就报错</param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="UserFriendlyException"></exception> public async Task<WmsMaterialStock> GetSingleByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, bool isMultipleThrowException = false, CancellationToken cancellationToken = default) { return await _wmsmaterialstockRepository.GetSingleByFilterAsync(whereConditions, isMultipleThrowException); } /// <summary> /// 根据条件获取出入库单据详情列表 /// </summary> /// <param name="input"></param> /// <returns></returns> public virtual async Task<List<WmsMaterialStockDto>> FindListByFilterAsync(GetWmsMaterialStockInput input, CancellationToken cancellationToken = default) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsMaterialStock.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var list = await _wmsmaterialstockRepository.GetListByFilterAsync(whereConditions?.data); return new List<WmsMaterialStockDto>(ObjectMapper.Map<List<WmsMaterialStock>, List<WmsMaterialStockDto>>(list)); } /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="input"></param> /// <returns></returns> public virtual async Task<WmsMaterialStockDto> FindSingleByFilterAsync(GetWmsMaterialStockInput input, CancellationToken cancellationToken = default) { Check.NotNull(input, nameof(input)); if (input.Sorting.IsNullOrWhiteSpace()) { input.Sorting = nameof(WmsMaterialStock.Sort); } #region 动态构造查询条件 //动态构造查询条件 var whereConditions = DynamicGetQueryParams(input); #endregion var dataObj = await _wmsmaterialstockRepository.GetSingleByFilterAsync(whereConditions?.data); return (ObjectMapper.Map<WmsMaterialStock, WmsMaterialStockDto>(dataObj)); } } HIAWms/server/src/CMS.Plugin.HIAWms.Domain/WmsMaterialStocks/IWmsMaterialStockRepository.cs
@@ -1,5 +1,6 @@ using CmsQueryExtensions.Extension; using System.Linq.Expressions; using Volo.Abp; using Volo.Abp.Domain.Repositories; using Volo.Abp.Specifications; @@ -88,4 +89,39 @@ /// <param name="cancellationToken">The cancellation token.</param> /// <returns></returns> Task<long> GetCountAsync(FunReturnResultModel<Expression<Func<WmsMaterialStock, bool>>> whereConditions, CancellationToken cancellationToken = default); /// <summary> /// 物理删除出入库单据详情 /// </summary> /// <param name="id">主键ID</param> /// <param name="cancellationToken"></param> /// <returns></returns> Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default); /// <summary> /// 批量物理删除出入库单据详情(直接删除,不软删除) /// </summary> /// <param name="ids">要删除的主键ID列表</param> /// <param name="cancellationToken"></param> /// <returns></returns> Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default); /// <summary> /// 根据条件获取出入库单据详情列表 /// </summary> /// <param name="whereConditions"></param> /// <param name="cancellationToken"></param> /// <returns></returns> Task<List<WmsMaterialStock>> GetListByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, CancellationToken cancellationToken = default); /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="whereConditions"></param> /// <param name="isMultipleThrowException">是否查询出多条就报错</param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="UserFriendlyException"></exception> Task<WmsMaterialStock> GetSingleByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, bool isMultipleThrowException = false, CancellationToken cancellationToken = default); } HIAWms/server/src/CMS.Plugin.HIAWms.EntityFrameworkCore/Repositories/EfCoreWmsMaterialStockRepository.cs
@@ -1,4 +1,4 @@ using System.Linq.Dynamic.Core; using System.Linq.Dynamic.Core; using System.Linq.Expressions; using CMS.Plugin.HIAWms.Domain.WmsMaterialStocks; using CMS.Plugin.HIAWms.Domain.WmsTask; @@ -7,6 +7,7 @@ using DatabaseSchemaReader.Filters; using Microsoft.EntityFrameworkCore; using SqlKata; using Volo.Abp; using Volo.Abp.Domain.Repositories.EntityFrameworkCore; using Volo.Abp.EntityFrameworkCore; using Volo.Abp.Specifications; @@ -36,7 +37,7 @@ } /// <summary> /// 查找型号 /// 查找型号 /// </summary> /// <param name="materiaModel"></param> /// <param name="cancellationToken"></param> @@ -123,7 +124,7 @@ InStockTime = g.First().InStockTime, StockNumber = g.Sum(x=>x.StockNumber) }) .AsQueryable(); // 转换回IQueryable以支持后续操作 .AsQueryable(); // 转换回IQueryable以支持后续操作 var result = groupedData .OrderBy(x=>x.StockNumber) @@ -183,13 +184,13 @@ InStockTime = g.First().InStockTime, StockNumber = g.Count() }) .AsQueryable(); // 转换回IQueryable以支持后续操作 .AsQueryable(); // 转换回IQueryable以支持后续操作 return groupedData.Count(); } /// <summary> /// 查询库存列表 /// 查询库存列表 /// </summary> /// <param name="stock"></param> /// <returns></returns> @@ -217,7 +218,7 @@ } /// <summary> /// 查询库存明细 /// 查询库存明细 /// </summary> /// <param name="whereConditions"></param> /// <param name="sorting"></param> @@ -239,7 +240,7 @@ } /// <summary> /// 获取总数库存管理 /// 获取总数库存管理 /// </summary> /// <param name="whereConditions"></param> /// <param name="cancellationToken"></param> @@ -259,4 +260,108 @@ return (await GetQueryableAsync()).IncludeDetails() .Where(u => !u.IsDeleted); } /// <summary> /// 物理删除出入库单据详情 /// </summary> /// <param name="id">主键ID</param> /// <param name="cancellationToken"></param> /// <returns></returns> public virtual async Task DeletePermanentlyAsync(Guid id, CancellationToken cancellationToken = default) { var entity = await (await GetDbSetAsync()) .FirstOrDefaultAsync(x => x.Id == id && !x.IsDeleted, GetCancellationToken(cancellationToken)); if (entity == null) { throw new Volo.Abp.Domain.Entities.EntityNotFoundException(typeof(WmsMaterialStock), id); } // 2. 获取 DbContext 并执行删除 var dbContext = await GetDbContextAsync(); // 直接执行 SQL 删除 var sql = $"DELETE FROM scms_wmsmaterialstocks WHERE Id ='{entity.Id.ToString()}'"; await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken); } /// <summary> /// 批量物理删除出入库单据详情(直接删除,不软删除) /// </summary> /// <param name="ids">要删除的主键ID列表</param> /// <param name="cancellationToken"></param> /// <returns></returns> public virtual async Task BatchDeletePermanentlyAsync(IEnumerable<Guid> ids, CancellationToken cancellationToken = default) { // 1. 查询符合条件的实体(未软删除的记录) var entities = await (await GetDbSetAsync()) .Where(x => ids.Contains(x.Id) && !x.IsDeleted) .ToListAsync(GetCancellationToken(cancellationToken)); if (!entities.Any()) { // 如果没有需要删除的记录,直接返回(避免不必要的数据库操作) return; } // 2. 获取 DbContext 并执行批量删除 var dbContext = await GetDbContextAsync(); var idsToDelete = entities.Select(e => e.Id).ToList(); // 直接执行 SQL 删除 var sql = $"DELETE FROM scms_wmsmaterialstocks WHERE Id IN ({string.Join(",", idsToDelete.Select(id => $"'{id}'"))})"; await dbContext.Database.ExecuteSqlRawAsync(sql, cancellationToken); } /// <summary> /// 根据条件获取出入库单据详情列表 /// </summary> /// <param name="whereConditions"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<List<WmsMaterialStock>> GetListByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, CancellationToken cancellationToken = default) { return await (await GetDbSetAsync()) .IncludeDetails() .WhereIf(whereConditions != null, whereConditions) .Where(x => !x.IsDeleted) .OrderByDescending(x => x.CreationTime) .ToListAsync(GetCancellationToken(cancellationToken)); } /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="whereConditions"></param> /// <param name="isMultipleThrowException">是否查询出多条就报错</param> /// <param name="cancellationToken"></param> /// <returns></returns> /// <exception cref="UserFriendlyException"></exception> public async Task<WmsMaterialStock> GetSingleByFilterAsync(Expression<Func<WmsMaterialStock, bool>> whereConditions, bool isMultipleThrowException = false, CancellationToken cancellationToken = default) { if (isMultipleThrowException) { var entitys = await (await GetDbSetAsync()) .IncludeDetails() .WhereIf(whereConditions != null, whereConditions) .Where(x => !x.IsDeleted) .OrderByDescending(x => x.CreationTime) .ToListAsync(GetCancellationToken(cancellationToken)); if (entitys?.Count > 1) { throw new UserFriendlyException("查询到多条记录"); } return entitys?.FirstOrDefault(); } else { return await (await GetDbSetAsync()) .IncludeDetails() .WhereIf(whereConditions != null, whereConditions) .Where(x => !x.IsDeleted) .OrderByDescending(x => x.CreationTime) .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } } } HIAWms/server/src/CMS.Plugin.HIAWms/Controller/WmsMaterialStockController.cs
@@ -2,6 +2,7 @@ using CMS.Extensions.Abp.AspNetCore.Mvc.Filters; using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; using CMS.Plugin.HIAWms.Application.Contracts.Services; using CMS.Plugin.HIAWms.Application.Implements; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; @@ -70,6 +71,30 @@ } /// <summary> /// 根据条件获取出入库单据详情 /// </summary> /// <param name="input">查询参数</param> /// <returns></returns> [HttpPost] [Route("FindListByFilter")] public virtual async Task<List<WmsMaterialStockDto>> FindListByFilterAsync([FromBody] GetWmsMaterialStockInput input) { return await _wmsmaterialstockAppService.FindListByFilterAsync(input); } /// <summary> /// 根据条件获取单个出入库单据详情 /// </summary> /// <param name="input">查询参数</param> /// <returns></returns> [HttpPost] [Route("FindSingleByFilter")] public virtual async Task<WmsMaterialStockDto> FindSingleByFilterAsync([FromBody] GetWmsMaterialStockInput input) { return await _wmsmaterialstockAppService.FindSingleByFilterAsync(input); } /// <summary> /// 创建wmsmaterialstock. /// </summary> /// <param name="input">输入.</param>