cnf
2025-09-15 a6cad2fe831204993e4615c58d17d1a8fb689725
MES.Service/service/BasicData/DeliveryBarcodeManager.cs
@@ -2,6 +2,7 @@
using MES.Service.Dto.webApi;
using MES.Service.Modes;
using System.Linq;
using MES.Service.util;
namespace MES.Service.service.BasicData;
@@ -33,10 +34,7 @@
                case "1":
                    return DeleteBarcode(barcodeEntity.Id);
                default:
                    throw new ArgumentOutOfRangeException(
                        nameof(barcodeDto.Type),
                        barcodeDto.Type,
                        "条码操作类型错误:仅支持 0(新增)、1(删除)");
                    throw new ArgumentOutOfRangeException( nameof(barcodeDto.Type), barcodeDto.Type, "条码操作类型错误:仅支持 0(新增)、1(删除)");
            }
        }
        catch (Exception ex)
@@ -71,12 +69,7 @@
            }
            // 2. 按操作类型Type分组(使用强类型避免类型推断问题)
            var typeGroupDict = entityTypePairs
                .GroupBy(pair => pair.Type)
                .ToDictionary(
                    group => group.Key,
                    group => group.Select(pair => pair.Entity).ToList()
                );
            var typeGroupDict = entityTypePairs.GroupBy(pair => pair.Type).ToDictionary(group => group.Key,group => group.Select(pair => pair.Entity).ToList());
            // 3. 存储各组操作结果
            var groupResultList = new List<bool>();
@@ -92,10 +85,7 @@
                        groupResultList.Add(DeleteBarcodeBatch(entityGroup.Select(e => e.Id).ToArray()));
                        break;
                    default:
                        throw new ArgumentOutOfRangeException(
                            nameof(type),
                            type,
                            "批量操作中存在非法Type:仅支持 0(新增)、1(删除)");
                        throw new ArgumentOutOfRangeException(nameof(type),type,"批量操作中存在非法Type:仅支持 0(新增)、1(删除)");
                }
            }
@@ -112,7 +102,7 @@
            throw new ApplicationException($"批量条码操作失败(总条数:{barcodeDtoList.Count}):{ex.Message}", ex);
        }
    }
    /// <summary>
    /// 根据送货单号删除条码数据
    /// </summary>
@@ -122,8 +112,9 @@
    {
        // 1. 校验参数:送货单号不能为空
        if (string.IsNullOrWhiteSpace(deliveryNo))
        {
            throw new ArgumentException("送货单号 DeliveryNo 不能为空或空格", nameof(deliveryNo));
        }
        try
        {
            // 2. 执行删除:根据 DeliveryNo 匹配表中数据(对应实体的 DeliveryNo 字段)
@@ -133,8 +124,9 @@
            // 3. 判断结果:至少删除1条则视为成功,否则抛出“未找到数据”异常
            if (deletedCount > 0)
            {
                return true;
            }
            throw new KeyNotFoundException($"未找到送货单号为「{deliveryNo}」的条码数据,删除操作未执行");
        }
        catch (Exception ex)
@@ -143,7 +135,54 @@
            throw new ApplicationException($"根据送货单号删除条码数据失败(DeliveryNo:{deliveryNo}):{ex.Message}", ex);
        }
    }
    /// <summary>
    /// 批量按送货单号删除条码数据(接收数组项列表)
    /// </summary>
    /// <param name="deliveryNoItems">包含DeliveryNo的对象列表</param>
    /// <returns>批量删除结果</returns>
    public BatchDeleteResult DeleteListByDeliveryNo(List<DeleteByDeliveryNoRequest> deliveryNoItems)
    {
        // 1. 参数校验与处理(从控制器移过来的逻辑)
        if (deliveryNoItems == null || !deliveryNoItems.Any())
        {
            throw new ArgumentException("送货单号列表不能为空", nameof(deliveryNoItems));
        }
        // 提取并验证送货单号列表
        var deliveryNoList = deliveryNoItems
            .Select(item => item.DeliveryNo) // 从对象中提取DeliveryNo字段
            .Where(no => !string.IsNullOrWhiteSpace(no)) // 过滤空值/空格
            .Distinct() // 去重,避免重复删除
            .ToList();
        // 判断是否有有效单号
        if (!deliveryNoList.Any())
        {
            throw new ArgumentException("请求中没有有效的送货单号(均为空或空格)");
        }
        try
        {
            // 2. 查询数据库中存在的送货单号
            var existingNos = Db.Queryable<BarcodeInformation>().Where(barcode => deliveryNoList.Contains(barcode.DeliveryNo)).Select(barcode => barcode.DeliveryNo).Distinct().ToList();
            // 3. 执行批量删除
            int totalDeleted = Db.Deleteable<BarcodeInformation>().Where(barcode => deliveryNoList.Contains(barcode.DeliveryNo)).ExecuteCommand();
            // 4. 返回结果
            return new BatchDeleteResult
            {
                TotalRequested = deliveryNoList.Count,
                TotalDeleted = totalDeleted,
                DeletedNos = existingNos,
                NotFoundNos = deliveryNoList.Except(existingNos).ToList()
            };
        }
        catch (Exception ex)
        {
            throw new ApplicationException($"批量删除失败(共{deliveryNoList.Count}个单号):{ex.Message}",ex);
        }
    }
    /// <summary>
    /// 按送货单号+行内码联合删除条码数据
    /// </summary>
@@ -154,36 +193,103 @@
    {
        // 1. 双参数校验:避免空值/空字符串
        if (string.IsNullOrWhiteSpace(deliveryNo))
        {
            throw new ArgumentException("送货单号 DeliveryNo 不能为空或空格", nameof(deliveryNo));
        }
        if (string.IsNullOrWhiteSpace(lineNo))
        {
            throw new ArgumentException("送货单行内码 LineNo 不能为空或空格", nameof(lineNo));
        }
        try
        {
            // 2. 联合条件删除:匹配 DeliveryNo(送货单号)和 DnLines(行内码,实体字段对应表的 dnLines 列)
            int deletedCount = Db.Deleteable<BarcodeInformation>()
                .Where(barcode =>
                        barcode.DeliveryNo == deliveryNo // 匹配送货单号
                        && barcode.DnLines == lineNo     // 匹配行内码(实体 DnLines 对应表 dnLines 字段)
                )
            int deletedCount = Db.Deleteable<BarcodeInformation>().Where(barcode =>barcode.DeliveryNo == deliveryNo && barcode.DnLines == lineNo) // 匹配行内码(实体 DnLines 对应表 dnLines 字段)
                .ExecuteCommand(); // 返回受影响的行数
            // 3. 结果判断:有数据被删除则成功,否则抛“未找到数据”异常
            if (deletedCount > 0)
            {
                return true;
            throw new KeyNotFoundException(
                $"未找到送货单号「{deliveryNo}」且行内码「{lineNo}」对应的条码数据,删除操作未执行");
            }
            throw new KeyNotFoundException($"未找到送货单号「{deliveryNo}」且行内码「{lineNo}」对应的条码数据,删除操作未执行");
        }
        catch (Exception ex)
        {
            // 4. 包装异常:补充联合条件上下文,便于定位问题
            throw new ApplicationException($"按送货单号+行内码删除条码数据失败(DeliveryNo:{deliveryNo},LineNo:{lineNo}):{ex.Message}",ex);
        }
    }
    /// <summary>
    /// 批量按送货单号+行内码删除条码数据
    /// </summary>
    /// <param name="deliveryItems">包含DeliveryNo和LineNo的对象列表</param>
    /// <returns>批量删除结果</returns>
    public BatchDeleteResult DeleteListByDeliveryItem(List<DeleteByDeliveryItemRequest> deliveryItems)
    {
        // 1. 参数校验与处理
        if (deliveryItems == null || !deliveryItems.Any())
        {
            throw new ArgumentException("送货单行列表不能为空", nameof(deliveryItems));
        }
        // 提取并验证送货单号+行内码组合
        var validItems = deliveryItems.Where(item =>!string.IsNullOrWhiteSpace(item.DeliveryNo) &&!string.IsNullOrWhiteSpace(item.LineNo))
            .Select(item => new
            {
                DeliveryNo = item.DeliveryNo,
                LineNo = item.LineNo
            }).Distinct().ToList();
        if (!validItems.Any())
        {
            throw new ArgumentException("请求中没有有效的效的送货单行数据(均为空或空格)");
        }
        try
        {
            // 2. 执行批量删除(按DeliveryNo+LineNo组合条件)
            int totalDeleted = 0;
            var deletedItems = new List<string>();
            var notFoundItems = new List<string>();
            // 遍历每个组合执行删除(或使用批量条件删除)
            foreach (var item in validItems)
            {
                // 检查当前组合是否存在
                var exists = Db.Queryable<BarcodeInformation>().Any(b => b.DeliveryNo == item.DeliveryNo && b.DnLines == item.LineNo);
                if (exists)
                {
                    // 执行删除
                    var deleted = Db.Deleteable<BarcodeInformation>().Where(b => b.DeliveryNo == item.DeliveryNo && b.DnLines == item.LineNo).ExecuteCommand();
                    totalDeleted += deleted;
                    deletedItems.Add($"{item.DeliveryNo}_{item.LineNo}");
                }
                else
                {
                    notFoundItems.Add($"{item.DeliveryNo}_{item.LineNo}");
                }
            }
            // 3. 返回结果
            return new BatchDeleteResult
            {
                TotalRequested = validItems.Count,
                TotalDeleted = totalDeleted,
                DeletedNos = deletedItems, // 存储格式:"DeliveryNo_LineNo"
                NotFoundNos = notFoundItems // 存储格式:"DeliveryNo_LineNo"
            };
        }
        catch (Exception ex)
        {
            throw new ApplicationException(
                $"按送货单号+行内码删除条码数据失败(DeliveryNo:{deliveryNo},LineNo:{lineNo}):{ex.Message}",
                $"批量删除送货单行失败(共{validItems.Count}条):{ex.Message}",
                ex);
        }
    }
    #region 私有辅助方法和内部类
    /// <summary>
    /// 内部辅助类:用于关联实体和操作类型(解决dynamic类型转换问题)
    /// </summary>
@@ -198,9 +304,7 @@
    /// </summary>
    private BarcodeInformation ConvertDtoToEntity(DeliveryBarcodeInfo dto)
    {
        var entityId = dto.Type == "0"
            ? Guid.NewGuid()
            : (string.IsNullOrEmpty(dto.SmallBarcode) ? Guid.Empty : Guid.Parse(dto.SmallBarcode));
        var entityId = dto.Type == "0" ? Guid.NewGuid() : (string.IsNullOrEmpty(dto.SmallBarcode) ? Guid.Empty : Guid.Parse(dto.SmallBarcode));
        return new BarcodeInformation
        {
@@ -214,7 +318,6 @@
            PackLevel = dto.BarcodeType,
            CreateTime = dto.Type == "0" ? DateTime.Now : (DateTime?)null,
            UpdateTime = DateTime.Now,
            // 扩展字段赋默认值
            BigBarcode = null,
            SmallPackageLength = null,
@@ -248,18 +351,16 @@
        var isInsertSuccess = base.Insert(entity);
        return isInsertSuccess ? true : throw new NotImplementedException("条码新增失败:数据库插入操作未执行成功");
    }
    /// <summary>
    /// 单个条码删除(按主键Id)
    /// </summary>
    private bool DeleteBarcode(Guid id)
    {
        if (id == Guid.Empty)
        {
            throw new ArgumentException("删除操作的条码Id不能为空");
        var deleteRowCount = Db.Deleteable<BarcodeInformation>()
            .Where(entity => entity.Id == id)
            .ExecuteCommand();
        }
        var deleteRowCount = Db.Deleteable<BarcodeInformation>().Where(entity => entity.Id == id).ExecuteCommand();
        return deleteRowCount > 0 ? true : throw new NotImplementedException($"条码删除失败:未找到Id为「{id}」的条码记录");
    }
@@ -279,13 +380,13 @@
    private bool DeleteBarcodeBatch(Guid[] ids)
    {
        if (ids == null || ids.Length == 0)
        {
            throw new ArgumentException("批量删除的条码Id数组不能为空");
        var deleteRowCount = Db.Deleteable<BarcodeInformation>()
            .Where(entity => ids.Contains(entity.Id))
            .ExecuteCommand();
        }
        var deleteRowCount = Db.Deleteable<BarcodeInformation>().Where(entity => ids.Contains(entity.Id)).ExecuteCommand();
        return deleteRowCount > 0 ? true : throw new NotImplementedException($"批量条码删除失败:共{ids.Length}个Id");
    }
    #endregion
}
}