222
schangxiang@126.com
2025-05-16 1ad40156ec25db1b9d90c3f94819434e20d52b00
PipeLineLems/server/src/CMS.Plugin.PipeLineLems.EntityFrameworkCore/Repositories/EfCoreCallMaterialOrderRecordRepository.cs
@@ -4,6 +4,7 @@
using Microsoft.EntityFrameworkCore; 
using System.Linq.Dynamic.Core; 
using System.Linq.Expressions; 
using Volo.Abp;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore; 
using Volo.Abp.EntityFrameworkCore; 
 
@@ -110,4 +111,108 @@
        return (await GetQueryableAsync()) 
            .Where(x => !x.IsDeleted).IncludeDetails(); 
    } 
    /// <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(CallMaterialOrderRecord), id);
        }
        // 2. 获取 DbContext 并执行删除
        var dbContext = await GetDbContextAsync();
        // 直接执行 SQL 删除
        var sql = $"DELETE FROM scms_callmaterialorderrecords 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_callmaterialorderrecords 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<CallMaterialOrderRecord>> GetListByFilterAsync(Expression<Func<CallMaterialOrderRecord, 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<CallMaterialOrderRecord> GetSingleByFilterAsync(Expression<Func<CallMaterialOrderRecord, bool>> whereConditions, bool is​MultipleThrowException = false, CancellationToken cancellationToken = default)
    {
        if (is​MultipleThrowException)
        {
            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));
        }
    }