wbc
2025-07-18 90b1732bd159aea424925d2605058c2417a4f412
StandardPda/MES.Service/service/Warehouse/MesInvItemOutsManager.cs
@@ -1,973 +1,369 @@
using System.Data;
using MES.Service.DB;
using MES.Service.DB;
using MES.Service.Dto.service;
using MES.Service.Modes;
using MES.Service.util;
using Newtonsoft.Json;
using SqlSugar;
using DbType = System.Data.DbType;
namespace MES.Service.service.Warehouse;
public class MesInvItemOutsManager : Repository<MesInvItemOuts>
{
    //当前类已经继承了 Repository 增、删、查、改的方法
    //这里面写的代码不会给覆盖,如果要重新生成请删除 MesInvItemOutsManager.cs
    private readonly int BILL_TYPE_ID = 200;
    private readonly int TRANSACTION_NO = 203;
    public List<MesInvItemOuts> GetProductionPickPage(WarehouseQuery query)
    public bool ReturnRequest(ItemOut oItemOut)
    {
        return Db.Queryable<MesInvItemOuts, MesDepots>((a, o) =>
                new JoinQueryInfos(
                    JoinType.Left,
                    o.DepotCode == a.DepotCode && a.Company == o.Company &&
                    a.Factory == o.Factory
                ))
            .Where((a, o) => a.BillTypeId == 200 &&
                             a.TransactionNo == 201 &&
                             a.Factory == "1000" &&
                             a.Company == "1000" &&
                             a.IsVisual == 1)
            .WhereIF(query.status != null, (a, o) => a.Status == query.status)
            .WhereIF(query.id != null, (a, o) => a.Id == query.id)
            .Select((a, o) => new MesInvItemOuts
            {
                Id = a.Id,
                Sapstatus = a.Sapstatus,
                OutDate = a.OutDate,
                CheckDate = a.CheckDate,
                BoardItem = a.BoardItem,
                WorkNo = a.WorkNo,
                OutPart = a.OutPart,
                PbillNo = a.PbillNo,
                OutType = a.OutType,
                CreateBy = a.CreateBy,
                Status = a.Status,
                CheckUser = a.CheckUser,
                ItemOutNo = a.ItemOutNo,
                DepotName = o.DepotName // 需要动态添加的字段
            })
            .ToPageList(query.PageIndex, query.Limit);
    }
        var itemOutFrom = oItemOut.from;
        var itemOutLists = oItemOut.items;
    public MaterialReceipt GetProductionPick(WarehouseQuery query)
    {
        var form = new MaterialReceipt();
        if (query.id != null)
        {
            var mesInvItemOutsList = GetProductionPickPage(query);
            if (mesInvItemOutsList.Count <= 0) return form;
            form.ItemOuts = mesInvItemOutsList[0];
            form.ItemsList = getProductionItemsList(query);
            form.InvItemoutCDetails = GetProductionDetails(query);
        }
        return form;
    }
    private List<MesInvItemOutItems> getProductionItemsList(
        WarehouseQuery query)
    {
        return Db.Queryable<MesInvItemOutItems, MesItems, MesDepTaskInfo>(
                (c, s, f) => new JoinQueryInfos(
                    JoinType.Inner, c.ItemNo == s.ItemNo,
                    JoinType.Left, f.TaskNo == c.TaskNo && f.ItemNo == c.ItemNo
                ))
            .Where((c, s, f) => c.ItemOutId == query.id)
            .OrderBy(c => c.Id)
            .Select((c, s, f) => new MesInvItemOutItems
            {
                Id = c.Id,
                ItemNo = c.ItemNo,
                Quantity = c.Quantity,
                TaskNo = c.TaskNo,
                Remark = c.Remark,
                ItemName = s.ItemName, // 动态字段
                ItemModel = s.ItemModel, // 动态字段
                ItemUnit = SqlFunc.Subqueryable<MesItems>()
                    .Where(si => si.ItemUnit == s.ItemUnit)
                    .Select(si =>
                        SqlFunc.MappingColumn<string>(
                            "F_GETUNITNAME(si.Item_Unit)")) // 动态字段
            })
        // 根据AsnNo和MesNo对明细进行分组
        var groupedItems = itemOutLists
            .GroupBy(item => new {   item.MesNo, item.SqNo })
            .ToList();
    }
    private List<MesInvItemOutCDetails> GetProductionDetails(
        WarehouseQuery query)
    {
        return Db
            .Queryable<MesInvItemOutCDetails, MesItems, MesDepots>(
                (b, c, d) => new JoinQueryInfos(
                    JoinType.Left,
                    b.ItemNo == c.ItemNo && b.Company == c.Company &&
                    b.Factory == c.Factory,
                    JoinType.Left,
                    d.DepotCode == b.DepotCode && b.Company == d.Company &&
                    b.Factory == d.Factory
                ))
            .Where((b, c, d) => b.ItemOutId == query.id)
            .Select((b, c, d) => new MesInvItemOutCDetails
            {
                ForceOutFlag = b.ForceOutFlag,
                DepotSectionCode = b.DepotSectionCode,
                ItemNo = b.ItemNo,
                Quantity = b.Quantity,
                ItemBarcode = b.ItemBarcode,
                ItemName = c.ItemName,
                ItemModel = c.ItemModel,
                DepotName = d.DepotName,
                DepotCode = b.DepotCode
            })
            .ToList();
    }
    public bool ScanCode(WarehouseQuery query)
    {
        decimal billTypeId = 200;
        decimal transactionNo = 203;
        var count = Db.Queryable<MesInvItemOutCDetails>()
            .Where(a =>
                a.ItemBarcode == query.barcode && a.TaskNo == query.billNo)
            .Count();
        if (count > 0) throw new Exception("条码重复扫描,请核对!");
        //验证条码
        var mesInvItemStocks = Db.Queryable<MesInvItemStocks>()
            .Where(a => a.ItemBarcode == query.barcode
                        && a.Quantity > 0).Single();
        if (mesInvItemStocks == null)
            throw new Exception(query.barcode + "库存中无此条码,请核对!");
        //验证出库单mes_inv_item_outs
        var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
            .Where(d => d.ItemOutNo == query.billNo
                        && d.BillTypeId == billTypeId &&
                        d.TransactionNo == transactionNo).Single();
        //出库单的校验
        if (mesInvItemOuts == null)
            throw new Exception("出库单  " + query.billNo + " 不存在,请确认!");
        //未审核的不允许继续
        if (mesInvItemOuts.Status == null || mesInvItemOuts.Status == 0)
            throw new Exception("出库单  " + query.billNo + "未审核");
        //已推送的不允许继续
        if (mesInvItemOuts.Nflag == 1)
            throw new Exception("出库单  " + query.billNo + "已经推送,无法重复推送");
        var depotCodeOut = mesInvItemOuts.DepotCode ?? "0";
        var depotsCodeStock = mesInvItemStocks.DepotsCode ?? "0";
        if (!depotCodeOut.Equals(depotsCodeStock))
        bool result = true;
        foreach (var group in groupedItems)
        {
            // 创建错误消息
            var errorMessage =
                $"002[条码仓库{depotsCodeStock}与申请仓库{depotCodeOut}不一致,请核对!";
            //if (group.Key.AsnNo == null)
            //{
            //    throw new NotImplementedException("AsnNo不能为空");
            //}
            throw new Exception(errorMessage);
        }
        var StocksNum = mesInvItemStocks.Quantity;
        var sql = string.Format(
            @"select nvl(SUM(S.QUANTITY),0) - nvl(SUM(S.TL_QTY),0)
                  from MES_INV_ITEM_OUT_ITEMS S
                  LEFT JOIN mes_inv_item_outs d
                    ON S.ITEM_OUT_ID = D.ID
                 where d.item_out_no = '{0}'
                   and d.bill_type_id = {1}
                   and d.transaction_no = {2}
                   AND S.item_no = '{3}'
                   and nvl(d.status, 0) = 1
                   and nvl(d.nflag, 0) = 0", query.billNo, billTypeId,
            transactionNo,
            mesInvItemStocks.ItemNo);
        var cqty = Db.Ado.SqlQuerySingle<decimal>(sql);
        if (cqty == null)
            throw new Exception("物料" + mesInvItemStocks.ItemNo +
                                "的辅助属性与条码不一致!请检查");
        if (cqty < StocksNum) throw new Exception("请确认发料数量");
        //调用存储过程
        try
        {
            // 定义输出参数
            var outputResult = new SugarParameter("C_RESULT", null,
                DbType.Int32, ParameterDirection.Output,
                4000);
            var outputMessage = new SugarParameter("MSG", null, DbType.String,
                ParameterDirection.Output, 4000);
            // 定义输入参数
            var parameters = new List<SugarParameter>
            if (group.Key.MesNo == null)
            {
                new("p_item_barcode", query.barcode,
                    DbType.String, ParameterDirection.Input),
                new("p_bill_no", query.billNo, DbType.String,
                    ParameterDirection.Input),
                new("pi_factory", "1000", DbType.String,
                    ParameterDirection.Input),
                new("pi_company", "1000", DbType.String,
                    ParameterDirection.Input),
                new("c_user", query.userName, DbType.String,
                    ParameterDirection.Input),
                outputResult,
                outputMessage
                throw new NotImplementedException("入库单单号不能为空");
            }
            if (group.Key.SqNo == null)
            {
                throw new NotImplementedException("退货申请单行号不能为空");
            }
            // 创建一个临时的itemOutFrom对象,使用分组的Key作为主要属性
            var tempItemOutFrom = new ItemOutFrom
            {
                MesNo = group.Key.MesNo,
                SqNo = group.Key.SqNo,
                // 继承原始itemOutFrom的其他属性
                RtnNo = itemOutFrom.RtnNo,
                Type = itemOutFrom.Type,
                CreateBy = itemOutFrom.CreateBy,
                FMRMODE = itemOutFrom.FMRMODE,
                DepotId = itemOutFrom.DepotId,
                SupperId = itemOutFrom.SupperId
            };
            // 使用 SqlSugar 执行存储过程
            Db.Ado.ExecuteCommand(
                "BEGIN MES_CG_UPDATE_BARCODES(:p_item_barcode, :p_bill_no, :pi_factory, :pi_company, :c_user, :C_RESULT, :MSG); END;",
                parameters.ToArray());
            // 获取输出参数的值
            var resultValue = outputResult.Value?.ToString();
            var messageValue = outputMessage.Value?.ToString();
            if ("1".Equals(resultValue)) throw new Exception("条码扣除失败");
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        // 变量用于保存查询结果
        decimal? C_SQ_QTY = 0;
        decimal? C_OK_QTY = 0;
        var c_result = string.Empty;
        var C_COUNT = 0;
        sql = string.Format(@"
                SELECT SUM(C.QUANTITY) AS SQ_QTY, SUM(D.QUANTITY_OK) AS OK_QTY
                FROM MES_INV_ITEM_OUT_ITEMS C
                LEFT JOIN (
                    SELECT ITEM_OUT_ID, ITEM_NO, PBILL_NO, RK_NO, SUM(QUANTITY) AS QUANTITY_OK
                    FROM MES_INV_ITEM_OUT_C_DETAILS
                    GROUP BY ITEM_OUT_ID, ITEM_NO, PBILL_NO, RK_NO
                ) D
                ON D.ITEM_OUT_ID = C.ITEM_OUT_ID
                AND D.ITEM_NO = C.ITEM_NO
                AND D.RK_NO = C.RK_NO
                AND NVL(C.PBILL_NO, '0') = NVL(D.PBILL_NO, '0')
                WHERE C.ITEM_OUT_ID = {0}", mesInvItemOuts.Id);
        var queryResult = Db.Ado.SqlQuerySingle<dynamic>(sql);
        C_SQ_QTY = queryResult?.SQ_QTY;
        C_OK_QTY = queryResult?.OK_QTY;
        // 判断逻辑
        if (C_SQ_QTY < C_OK_QTY) throw new Exception("扫描数量超过申请数量,请重新扫描!");
        if (C_SQ_QTY == C_OK_QTY) return true;
        return false;
    }
    public bool Audit(WarehouseQuery query)
    {
        // 审核前校验
        Validate(query);
        query.status = 1;
        //审核
        return Update(query);
    }
    public bool SetNFlag(WarehouseQuery query)
    {
        return Db.Updateable<MesInvItemOuts>()
            .SetColumns(s => s.Nflag == 1)
            .Where(s => s.ItemOutNo == query.billNo)
            .ExecuteCommand() > 0;
    }
    public bool DeApprove(WarehouseQuery query)
    {
        query.date = null;
        query.status = 0;
        return Update(query);
    }
    private bool Update(WarehouseQuery entity)
    {
        var userName = entity.userName ?? "system";
        return Db.Updateable<MesInvItemOuts>()
            .SetColumns(s => s.Status == entity.status)
            .SetColumns(s => s.CheckUser == userName)
            .SetColumns(s => s.CheckDate == DateTime.Now)
            .Where(s => s.Id == entity.id).ExecuteCommand() > 0;
    }
    public void Validate(WarehouseQuery query)
    {
        // 校验单号是否正确
        var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
            .Where(o => o.ItemOutNo == query.billNo)
            .Single();
        if (mesInvItemOuts == null)
            throw new Exception("没找到" + query.billNo + " 对应的采购退货单,请检查");
        // 校验子表数据
        var itemOutItems = Db.Queryable<MesInvItemOutItems>()
            .Where(o => o.ItemOutId == mesInvItemOuts.Id)
            .ToList();
        var sql = string.Empty;
        var P_Msg = string.Empty;
        foreach (var item in itemOutItems)
        {
            // 判断申请数量是否大于剩余可退数量
            sql = string.Format(
                @"SELECT NVL(s1.RK_QTY, 0) - NVL(KT_QTY, 0) KT_QTY --剩余可退
            FROM MES_INV_ITEM_OUT_ITEMS C
            LEFT JOIN (SELECT SUM(QUANTITY) KT_QTY,
                              ITEM_NO,
                              PBILL_NO,
                              RK_NO,
                              WORK_LINE
                         FROM MES_INV_ITEM_OUT_ITEMS
                        GROUP BY ITEM_NO, PBILL_NO, WORK_LINE,RK_NO) U
              ON U.ITEM_NO = C.ITEM_NO
             AND U.WORK_LINE = C.WORK_LINE
             AND U.PBILL_NO = C.PBILL_NO
             AND U.RK_NO = C.RK_NO
            LEFT JOIN (SELECT SUM(QUANTITY) RK_QTY,
                              ITEM_NO,
                              EBELN,
                              WORK_LINE,BILL_NO
                         FROM MES_INV_ITEM_IN_C_ITEMS
                        GROUP BY ITEM_NO, EBELN, WORK_LINE,BILL_NO) s1
              ON S1.ITEM_NO = C.ITEM_NO
             AND S1.WORK_LINE = C.WORK_LINE
             AND S1.EBELN = C.PBILL_NO
                AND S1.BILL_NO = C.RK_NO
           WHERE C.ID = {0}", item.Id);
            var sy_Qty = Db.Ado.SqlQuery<decimal>(sql);
            if (sy_Qty != null && sy_Qty[0] < 0)
            // 根据Type执行不同的逻辑
            switch (tempItemOutFrom.Type)
            {
                P_Msg =
                    $"采购订单:{item.PbillNo},行:{item.WorkLine},物料:{item.ItemNo} 申请数量大于剩余可收数量";
                throw new Exception(P_Msg);
            }
            // 判断行是否重复
            var cf_Num = Db.Queryable<MesInvItemOutItems>()
                .Where(s1 => s1.ItemNo == item.ItemNo &&
                             s1.WorkLine == item.WorkLine &&
                             s1.PbillNo == item.PbillNo &&
                             s1.ItemOutId == mesInvItemOuts.Id &&
                             s1.RkNo == item.RkNo)
                .Count();
            if (cf_Num > 1)
            {
                P_Msg =
                    $"采购订单:{item.PbillNo},行:{item.WorkLine},物料:{item.ItemNo}重复请删除其中一条数据";
                throw new Exception(P_Msg);
            }
        }
        // 校验主表内容是否被删掉
        // 主表仓库编码
        if (string.IsNullOrEmpty(mesInvItemOuts.DepotCode))
        {
            P_Msg = "仓库编码为空,请检查";
            throw new Exception(P_Msg);
        }
        var supplierExists = Db.Queryable<MesSupplier>()
            .Any(supplier => supplier.SuppNo == mesInvItemOuts.SuppNo);
        if (!supplierExists)
        {
            P_Msg = $"供应商编码 {mesInvItemOuts.SuppNo} 在系统中不存在,请检查";
            throw new Exception(P_Msg);
        }
        // 子表行与主表符合性校验
        foreach (var j in itemOutItems)
        {
            // 校验子表对应采购订单的供应商编码
            var c_SuppNo = Db.Queryable<MesRohIn, MesSupplier>(
                    (roh, supp) => new JoinQueryInfos(
                        JoinType.Left,
                        roh.Supplier == supp.Id.ToString()
                    ))
                .Where(roh => roh.BillNo == j.PbillNo)
                .Select((roh, supp) => supp.SuppNo)
                .Single();
            if (c_SuppNo == null)
            {
                P_Msg = $"子表行供应商编码 {c_SuppNo} 在系统中未找到";
                throw new Exception(P_Msg);
            }
            if (mesInvItemOuts.SuppNo != c_SuppNo)
            {
                P_Msg =
                    $"子表采购订单行的供应商编码 {c_SuppNo} 与主表供应商编码 {mesInvItemOuts.SuppNo} 不一致,请检查";
                throw new Exception(P_Msg);
            }
            // 校验子表委外采购类型和主表类型是否一致
            if (j.FType != mesInvItemOuts.FType)
            {
                P_Msg =
                    $"子表委外类型:{j.FType},与主表委外类型:{mesInvItemOuts.FType},不一致,请检查";
                throw new Exception(P_Msg);
            }
            // 检查子表仓库是否和主表仓库一致
            if (j.DepotCode != mesInvItemOuts.DepotCode)
            {
                P_Msg =
                    $"子表仓库编码:{j.DepotCode} 与主表仓库编码:{mesInvItemOuts.DepotCode},不一致,请检查";
                throw new Exception(P_Msg);
            }
        }
    }
    public OutItemDto SaveCombination(OutItemDto dto)
    {
        var mesInvItemOuts = dto.Form;
        mesInvItemOuts.Status = 0;
        mesInvItemOuts.BoardFlag = 0;
        mesInvItemOuts.Sapstatus = 0;
        mesInvItemOuts.OutStatus = 0;
        mesInvItemOuts.ItemFlag = 0;
        mesInvItemOuts.IsVisual = 1;
        mesInvItemOuts.TransactionNo = 203;
        mesInvItemOuts.Factory = "1000";
        mesInvItemOuts.Company = "1000";
        //返回ID
        var id = Db.Insertable(mesInvItemOuts)
            .ExecuteReturnIdentity();
        if (id <= 0) throw new Exception("插入错误");
        mesInvItemOuts.Id = id;
        dto.SaveItems.ForEach(s =>
        {
            s.ItemOutId = id;
            s.Factory = "1000";
            s.Company = "1000";
            s.Status = 0;
            s.DepotCode = mesInvItemOuts.DepotCode;
            s.FType = mesInvItemOuts.FType;
            s.CreateBy = mesInvItemOuts.CreateBy;
            s.CreateDate = mesInvItemOuts.CreateDate;
        });
        var insertable = Db.Insertable(dto.SaveItems)
            .ExecuteCommand();
        if (insertable < 0) throw new Exception("插入错误");
        var query = new WarehouseQuery();
        query.id = id;
        dto.SelectItems = GetItems(query);
        return dto;
    }
    public List<MesInvItemOuts> GetPage(WarehouseQuery query)
    {
        return
            Db.Queryable<MesInvItemOuts, MesDepots, MesSupplier, SysUser,
                    SysUser>((a, e, i, u1, u3) =>
                    new JoinQueryInfos(
                        JoinType.Left,
                        a.DepotCode == e.DepotCode
                        && e.Factory == a.Factory
                        && e.Company == a.Company,
                        JoinType.Left,
                        a.SuppNo == i.SuppNo,
                        JoinType.Left,
                        a.CreateBy == u1.Fcode,
                        JoinType.Left,
                        a.CheckUser == u3.Fcode))
                .WhereIF(query.id > 0,
                    (a, e, i, u1, u3) => a.Id == query.id)
                .WhereIF(!string.IsNullOrEmpty(query.billNo),
                    (a, e, i, u1, u3) => a.ItemOutNo == query.billNo)
                .Select((a, e, i, u1, u3) => new MesInvItemOuts
                case "1":
                {
                    Id = a.Id,
                    DepotCode = a.DepotCode,
                    Fmrmode = a.Fmrmode,
                    CheckDate = a.CheckDate,
                    CheckUser = a.CheckUser,
                    States = a.States,
                    Reason = a.Reason,
                    Remark = a.Remark,
                    Nflag = a.Nflag,
                    FType = a.FType,
                    SuppNo = a.SuppNo,
                    DepotName = e.DepotName,
                    SuppName = i.SuppName,
                    CreateByFname = u1.Fname,
                    CheckUserFname = u3.Fname,
                    CreateDate = a.CreateDate,
                    CreateBy = a.CreateBy,
                    Status = a.Status,
                    ItemOutNo = a.ItemOutNo
                }).ToPageList(query.PageIndex, query.Limit);
    }
                    var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
                        .Where(s => s.BillTypeId == BILL_TYPE_ID
                                    && s.TransactionNo == TRANSACTION_NO
                                    && s.ItemOutNo == tempItemOutFrom.RtnNo
                        )
                        .Count();
    public List<MesInvItemOutCDetails> GetScanBarcode(WarehouseQuery query)
    {
        return Db.Queryable<MesInvItemOutCDetails, MesInvItemBarcodes, MesItems,
                MesDepots>(
                (b, bar, c, d) => new
                    JoinQueryInfos(
                        JoinType.Left, b.ItemBarcode == bar.ItemBarcode,
                        JoinType.Left, b.ItemNo == c.ItemNo &&
                                       b.Company == c.Company &&
                                       b.Factory == c.Factory,
                        JoinType.Left, b.DepotCode == d.DepotCode &&
                                       b.Company == d.Company &&
                                       b.Factory == d.Factory
                    ))
            .Where((b, bar, c, d) => b.ItemOutId == query.id)
            .Select((b, bar, c, d) => new MesInvItemOutCDetails
            {
                Quantity = b.Quantity,
                DepotSectionCode = b.DepotSectionCode,
                DepotCode = b.DepotCode,
                ItemNo = b.ItemNo,
                ItemBarcode = b.ItemBarcode,
                ItemName = c.ItemName,
                ItemModel = c.ItemModel,
                DepotName = d.DepotName,
                Unit = bar.Unit
            }).ToList();
    }
                    if (mesInvItemOuts > 0)
                    {
                        throw new NotImplementedException(
                            tempItemOutFrom.RtnNo +
                            "的退料申请单已经存在");
                    }
    //MESInvItemOutItems
    public List<MESInvItemOutItems> GetItems(WarehouseQuery query)
    {
        var where = "and 1=1";
        if (query.id != null) where = "and ITEM_OUT_ID = '" + query.id + "'";
                    // 为当前分组保存数据
                    var groupResult = Save(tempItemOutFrom, group.ToList());
                    if (!groupResult)
                    {
                        result = false;
                    }
        var sql = string.Format(@"select * from (
        SELECT C.REMARK, C.PBILL_NO, C.ITEM_OUT_ID, C.RK_QTY,
               C.TL_QTY, C.WORK_LINE, C.QUANTITY, C.ITEM_NO,
               NVL(s1.RK_QTY, 0) - NVL(KT_QTY, 0) KT_QTY,
               R.DEPOT_SECTION_CODE, S.ITEM_MODEL, S.ITEM_NAME,
               K.CGB014, Q.STAFF_NAME, R.DEPOT_CODE
        FROM MES_INV_ITEM_OUT_ITEMS C JOIN MES_ITEMS S ON C.ITEM_NO = S.ITEM_NO
                 LEFT JOIN (SELECT SUM(QUANTITY) KT_QTY, ITEM_NO, PBILL_NO, WORK_LINE, RK_NO
                            FROM MES_INV_ITEM_OUT_ITEMS
                            GROUP BY ITEM_NO, PBILL_NO, WORK_LINE, RK_NO) U
                           ON U.ITEM_NO = C.ITEM_NO AND U.WORK_LINE = C.WORK_LINE
                               AND U.PBILL_NO = C.PBILL_NO AND U.RK_NO = C.RK_NO
                 LEFT JOIN (SELECT SUM(QUANTITY) RK_QTY, ITEM_NO, EBELN, WORK_LINE, BILL_NO
                            FROM mes_inv_item_in_c_details
                            GROUP BY ITEM_NO, EBELN, WORK_LINE, BILL_NO) s1
                           ON S1.ITEM_NO = C.ITEM_NO AND S1.WORK_LINE = C.WORK_LINE
                               AND S1.EBELN = C.PBILL_NO AND S1.BILL_NO = C.RK_NO
                 LEFT JOIN MES_ROH_IN_DATA K
                           ON K.BILL_NO = C.PBILL_NO AND C.WORK_LINE = K.PURCHASE_ORDER_LINE_NUMBER
                 left join MES_ROH_IN H on H.BILL_NO = K.BILL_NO
                 left join MES_STAFF Q on H.PURCHASER = Q.STAFF_NAME
                 LEFT JOIN MES_SUPPLIER T ON H.SUPPLIER = T.ID
                 LEFT JOIN (select *
                            from (SELECT row_number() over (partition by DEPOT_CODE, ITEM_NO, EBELN order by CREATE_DATE) rn, DEPOT_CODE, DEPOT_SECTION_CODE, ITEM_NO,
                                         EBELN FROM mes_inv_item_in_c_details
                                  where EBELN is not null)
                            where rn = 1 and ROWNUM = 1) R ON R.ITEM_NO = C.ITEM_NO) where 1=1 {0}",
            where);
        var results = Db.Ado.SqlQuery<MESInvItemOutItems>(sql);
        return results;
    }
                    break;
                }
                case "4":
                    var removeResult = Remove(tempItemOutFrom);
                    if (!removeResult)
                    {
                        result = false;
                    }
    public OutItemDto GetSumItem(WarehouseQuery query)
    {
        var mesInvItemOuts = base.GetSingle(it => it.ItemOutNo == query.billNo);
        if (mesInvItemOuts == null) throw new Exception("采购退货单不存在");
        var sql = string.Format(@"SELECT DEPOT ,ITEM_NO,ITEM_MODEL,
           ITEM_NAME,QTY FROM (SELECT SUM(QTY) QTY, DEPOT, ITEM_NO, ITEM_MODEL, ITEM_NAME
              FROM (SELECT f_get_section_code2('1000', '1000', b.ITEM_NO,'{0}') DEPOT,
                           B.ITEM_NO, A.ITEM_MODEL,A.ITEM_NAME,to_char(nvl(b.QUANTITY, 0) - nvl(D.QUANTITY_OK, 0),'FM9999999990.00') QTY
                      FROM MES_INV_ITEM_OUT_ITEMS B LEFT JOIN mes_ITEMS A
                        ON B.ITEM_NO = A.ITEM_NO LEFT JOIN (SELECT ITEM_OUT_ID,
                                       ITEM_NO,PBILL_NO,SUM(QUANTITY) QUANTITY_OK,RK_NO
                                  FROM MES_INV_ITEM_OUT_C_DETAILS
                                 WHERE ITEM_OUT_ID = {1}
                                 GROUP BY ITEM_OUT_ID,ITEM_NO,PBILL_NO,RK_NO) D
                        ON D.ITEM_OUT_ID = B.ITEM_OUT_ID
                       AND D.ITEM_NO = B.ITEM_NO
                       AND D.PBILL_NO = B.PBILL_NO
                       AND D.RK_NO = B.RK_NO
                     WHERE B.ITEM_OUT_ID = {1}
                       AND nvl(b.QUANTITY, 0) - nvl(D.QUANTITY_OK, 0) > 0
                     ORDER BY f_get_section_code2('1000','1000',b.ITEM_NO,'{0}'),
                              A.ITEM_MODEL,A.ITEM_NAME)
             GROUP BY DEPOT, ITEM_NO, ITEM_MODEL, ITEM_NAME)",
            mesInvItemOuts.DepotCode,
            mesInvItemOuts.Id);
        var results = Db.Ado.SqlQuery<InventoryItem>(sql);
        var mesInvItemStocks = Db.Queryable<MesInvItemStocks>()
            .Where(a => a.ItemBarcode == query.barcode).Single();
        var dto = new OutItemDto();
        dto.SumItem = results;
        if (mesInvItemStocks != null)
        {
            dto.ItemNo = mesInvItemStocks.ItemNo;
            dto.Quantity = mesInvItemStocks.Quantity;
                    break;
                default:
                    result = false;
                    break;
            }
        }
        return dto;
        return result;
    }
    public List<InventoryItemDetail> SelectMaterials(WarehouseQuery query)
    private bool Save(ItemOutFrom from, List<ItemOutList> items)
    {
        var sql = string.Format(@"select B.WORK_NO, b.work_line,
                               b.item_no, s2.item_name, s2.item_model,
                               sum(b.quantity)                         sum_Quantity,
                               b.unit, b.supp_no,
                               nvl(s1.quantity, 0)                     quantity,
                               sum(b.quantity) - nvl(U.KT_QTY, 0)      Refundable_Quantity,
                               B.cbill_no, B.task_no, A.BILL_NO,
                               to_char(b.CREATE_DATE, 'yyyy-mm-dd') as CREATE_DATE
                        from mes_inv_item_in_c_details b
                                 left join mes_inv_item_ins a on b.item_in_id = a.id
                                 LEFT JOIN (select s.item_no, s.work_line, s.Work_no,
                                                   sum(s.quantity) quantity, S.RK_NO
                                            from mes_inv_item_out_c_details s
                                            group by s.item_no, s.work_line, s.work_no, S.RK_NO) s1
                                           ON NVL(B.work_LINE, '0') = NVL(s1.work_LINE, '0')
                                               and B.work_no = s1.work_no
                                               and B.item_no = s1.item_no
                                               AND B.BILL_NO = S1.RK_NO
                                 LEFT JOIN (SELECT SUM(QUANTITY) KT_QTY, ITEM_NO, PBILL_NO, WORK_LINE, RK_NO
                                            FROM MES_INV_ITEM_OUT_ITEMS
                                            GROUP BY ITEM_NO, PBILL_NO, WORK_LINE, RK_NO) U
                                           ON U.ITEM_NO = B.ITEM_NO
                                               AND U.WORK_LINE = B.WORK_LINE
                                               AND U.PBILL_NO = B.WORK_NO AND U.RK_NO = B.BILL_NO
                                 left join mes_items s2 on b.item_no = s2.item_no
                                 left join purdha da on da.dha001 = b.cbill_no
                        WHERE A.BILL_NO LIKE 'Q%'
                          AND A.CBILL_NO like 'L%'
                        group by b.item_no, b.work_line, b.supp_no, b.remark, s1.quantity, b.unit,
                                 s2.item_name, s2.item_model, da.dha003, B.WORK_NO, B.cbill_no, B.task_no,
                                 to_char(b.CREATE_DATE, 'yyyy-mm-dd'), A.BILL_NO, U.KT_QTY, A.CBILL_NO
                        having b.remark = '采购入库'
                           and sum(b.quantity) - nvl(U.KT_QTY, 0) > 0
                           and b.supp_no = '{0}'
                        order by to_char(b.CREATE_DATE, 'yyyy-mm-dd')",
            query.SuppNo);
        var mesInvItemIns = Db.Queryable<MesInvItemIns>()
            .Where(s => s.BillTypeId == 100
                        && s.TransctionNo == "101"
                        && s.BillNo == from.MesNo
            ).First();
        var results = Db.Ado.SqlQuery<InventoryItemDetail>(sql);
        return results;
    }
    public string GetMaxItemOutNo()
    {
        var date = DateTime.Now.ToString("yyyyMMdd");
        var par = "NTL" + date;
        var sql =
            $"select max(ITEM_OUT_NO) from MES_INV_ITEM_OUTS where ITEM_OUT_NO like '{par}%'";
        var maxBillNo = Db.Ado.SqlQuerySingle<string>(sql);
        var number = "0001";
        if (maxBillNo != null)
        if (mesInvItemIns == null)
        {
            maxBillNo = maxBillNo.Substring(11);
            var no = Convert.ToInt32(maxBillNo);
            no++;
            number = no.ToString().PadLeft(4, '0');
            throw new NotImplementedException("采购入库不存在");
        }
        return "NTL" + date + number;
    }
        var mesDepots = Db.Queryable<MesDepots>()
            .Where(s => s.DepotId == Decimal.Parse(from.DepotId)).First();
    public MessageCenter SaveMessageCenter(WarehouseQuery query)
    {
        var message = MesToErpParam(query);
        var mesLinkU9 = Db.Queryable<MesLinkU9>()
            .Where(s => s.TableType == "MES_SUPPLIER"
                        && s.U9Id == from.SupperId).First();
        var executeReturnIdentity =
            Db.Insertable(message).ExecuteReturnIdentity();
        if (executeReturnIdentity > 0)
        if (mesLinkU9 == null)
        {
            message.Id = executeReturnIdentity;
            message.Pid = executeReturnIdentity;
            return message;
            throw new NotImplementedException("供应商ID不存在或未同步于U9");
        }
        throw new Exception("获取数据失败");
    }
        var mesSupplier = Db.Queryable<MesSupplier>()
            .Where(s => s.Id == Decimal.Parse(mesLinkU9.MesId))
            .First();
    public MessageCenter MesToErpParam(WarehouseQuery query)
    {
        var erpParameters = "";
        var title = "";
        var tableName = "MES_INV_ITEM_OUTS_" + query.Type;
        if ("A".Equals(query.Type))
        if (mesDepots == null)
        {
            erpParameters = GetErpParameters(query.billNo);
            title = "采购退货单" + query.billNo + "审核";
        }
        else if ("B".Equals(query.Type))
        {
            erpParameters = GetDeApprovePam(query.id);
            title = "采购退货单" + query.billNo + "反审核";
            throw new NotImplementedException("[" + from.DepotId +
                                              "]仓库不存在,请同步给MES");
        }
        var ErpUrl = AppsettingsUtility.Settings.ProductionErpUrl;
        var message = new MessageCenter
        if (mesSupplier == null)
        {
            TableName = tableName,
            Url = ErpUrl,
            Status = 1,
            CreateBy = query.userName,
            Route = query.billNo,
            Title = title,
            PageName = "Warehouse/PurchaseReturn/Add?id=" + query.id +
                       "&itemOutNo=" + query.billNo,
            CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
            Method = "POST",
            Seq = 1,
            Data = erpParameters,
            IsMessage = 0,
            ContentType = "application/x-www-form-urlencoded"
            throw new NotImplementedException("[" + from.SupperId +
                                              "]供应商不存在,请同步给MES");
        }
        var nextSequenceValue =
            Db.Ado.SqlQuery<decimal>("SELECT SEQ_OUT_ID.NEXTVAL FROM DUAL")
                .First();
        // var billCode =
        //     Db.Ado.SqlQuery<string>(
        //             "SELECT GETBILLCODE1('1000', '1000', 'TLSQ') FROM DUAL")
        //         .First();
        var billCode = from.RtnNo;
        // 创建采购退料单记录
        var mesInvItemOuts = new MesInvItemOuts
        {
            Id = nextSequenceValue,
            ItemOutNo = billCode,
            Status = 0,
            CreateBy = "PL017",
            CreateDate = DateTime.Now,
            BillTypeId = 200,
            TransactionNo = 203,
            DepotCode = mesDepots.DepotCode,
            FType = 0,
            OutStatus = 0,
            IsVisual = 1,
            Factory = "1000",
            Company = "1000",
            SuppNo = mesSupplier.SuppNo,
            ItemFlag = 0,
            BoardFlag = 0,
            OutType = "采购退料",
            Nflag = 0,
            Fmrmode = from.FMRMODE,
            Sapno = from.SqNo,
            Organizeid = "1002503270000079",
        };
        return message;
    }
    public bool DeApproveBefore(WarehouseQuery query)
    {
        var mesInvItemOuts = base.GetById(query.id);
        if (mesInvItemOuts == null) throw new Exception("出库单不存在");
        // 创建采购退料单记录
        var mesInvItemOutItems = new List<MesInvItemOutItems>();
        var nflag = mesInvItemOuts.Nflag ?? 0;
        if (nflag != 0) return true;
        return false;
    }
    private string GetDeApprovePam(decimal? id)
    {
        var sid = (int)id;
        var encodedUrl = "taskname=CGTL&mesid=" + sid +
                         "&optype=delete&datajson={}";
        return encodedUrl;
    }
    private string GetErpParameters(string? billNo)
    {
        var invItemIns = Db.Queryable<MesInvItemOuts>()
            .Single(x => x.ItemOutNo == billNo);
        //调用function函数
        var sql =
            $"SELECT F_GENERATE_DATA_INSERTED('{billNo}') FROM DUAL;";
        var jsonString = Db.Ado.SqlQuerySingle<string>(sql);
        var encodedUrl = "taskname=CGTL&mesid=" + invItemIns.Id +
                         "&optype=create&datajson=" + jsonString;
        return encodedUrl;
    }
    public List<string> GetItemOutNo()
    {
        var data5 = Db.Queryable<MesInvItemOuts>().Where(it =>
                it.BillTypeId == 200 && it.TransactionNo == 203 &&
                it.Status == 1)
            .OrderBy(it => it.Id, OrderByType.Desc)
            .ToPageList(1, 20);
        var ItemOutNos = data5.FindAll(a => a.Nflag == null || a.Nflag == 0)
            .Select(s => s.ItemOutNo).ToList();
        //
        // var ItemOutNos = data5
        //     .Select(s => s.ItemOutNo).ToList();
        return ItemOutNos;
    }
    //生产领料单审核前校验
    public MessageCenter SaveProductionMessageCenter(WarehouseQuery entity)
    {
        var message = ProductionMesToErpParam(entity);
        var executeReturnIdentity =
            Db.Insertable(message).ExecuteReturnIdentity();
        if (executeReturnIdentity > 0)
        foreach (var itemOutList in items)
        {
            message.Id = executeReturnIdentity;
            message.Pid = executeReturnIdentity;
            return message;
        }
        throw new Exception("获取数据失败");
    }
    public MessageCenter ProductionMesToErpParam(WarehouseQuery query)
    {
        var erpParameters = "";
        var title = "";
        var tableName = "INV_ITEM_OUTS_" + query.Type;
        if ("A".Equals(query.Type))
        {
            erpParameters =
                GetProductionErpParameters(query.billNo, query.userName);
            title = "生产领料单" + query.billNo + "审核";
        }
        var ErpUrl = AppsettingsUtility.Settings.ProductionErpUrl;
        var message = new MessageCenter
        {
            TableName = tableName,
            Url = ErpUrl,
            Status = 1,
            CreateBy = query.userName,
            Route = query.billNo,
            Title = title,
            PageName = "Warehouse/ProductionPick/Add?id=" + query.id +
                       "&itemOutNo=" + query.billNo,
            CreateDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
            Method = "POST",
            Seq = 1,
            Data = erpParameters,
            IsMessage = 0,
            ContentType = "application/x-www-form-urlencoded"
        };
        return message;
    }
    private string GetProductionErpParameters(string? queryBillNo,
        string? userName)
    {
        userName ??= "system";
        var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
            .Where(it => it.ItemOutNo == queryBillNo)
            .First();
        if (mesInvItemOuts == null) throw new Exception("领料单号不存在");
        var womcaa = Db.Queryable<Womcaa>()
            .Where(it => it.Caa020 == mesInvItemOuts.WorkNo)
            .First();
        if (womcaa == null) throw new Exception("任务单号不存在");
        var Departmentcode = Db.Queryable<SysDepartment, MesInvItemOuts>(
                (a, b) =>
                    new JoinQueryInfos(JoinType.Left,
                        a.Departmentname == b.OutPart
                    )).Where((a, b) =>
                b.OutPart == mesInvItemOuts.OutPart &&
                b.ItemOutNo == queryBillNo).Select(a => a.Departmentcode)
            .First();
        if (string.IsNullOrEmpty(Departmentcode))
            throw new Exception("部门信息不存在");
        // 检查领料单状态
        if (mesInvItemOuts.Status == 1) throw new Exception("领料单已审核,不能重复推送");
        var C_OUT_ITEMS = Db
            .Queryable<MesInvItemOutItems, Womdab, Womdaa, Womcaa, Womcab>(
                (c, b, d, e, f) =>
                    new JoinQueryInfos(
                        JoinType.Left, b.Id == c.ItemDabid,
                        JoinType.Left, d.Id == b.Pid,
                        JoinType.Left, e.Caa001 == d.Daa021,
                        JoinType.Left, f.Eid == e.Erpid
                    ))
            .Where((c, b, d, e, f) => c.ItemOutId == mesInvItemOuts.Id)
            .Select((c, b, d, e, f) => new
            // 检查必要字段是否为空
            if (string.IsNullOrEmpty(itemOutList.SrcDocNo))
            {
                c.Id,
                c.ItemNo,
                c.Quantity,
                c.DepotCode,
                c.DepotSectionCode,
                c.ItemId,
                erpId = b.ErpId,
                e.Caa015,
                f.PositionNo
            }).ToList();
                throw new NotImplementedException("采购订单号不能为空");
            }
        var scllentryList = new List<dynamic>();
        foreach (var item in C_OUT_ITEMS)
        {
            var sql =
                "SELECT FNAME FROM MES_UNIT WHERE ID = (SELECT ITEM_UNIT FROM MES_ITEMS WHERE ID = '" +
                item.ItemId + "')";
            var C_ITEM_UNIT = Db.Ado.SqlQuerySingle<string>(sql);
            var xsddh = item.Caa015 ?? "";
            var wzh = item.PositionNo ?? "";
            var qty = ((int)item.Quantity).ToString();
            var erpid = ((int)item.erpId).ToString();
            var id = ((int)item.Id).ToString();
            scllentryList.Add(new
            if (string.IsNullOrEmpty(itemOutList.SrcDocLineNo))
            {
                FMaterialId = item.ItemNo,
                FUnitID = C_ITEM_UNIT,
                FAppQty =  qty,
                FActualQty =  qty,
                FStockId = item.DepotCode,
                FPPBomEntryId = erpid,
                F_UNW_Text_xsddh = xsddh,
                F_UNW_TEXT_WZH = wzh,
                F_MES_ENTRYID = id
                throw new NotImplementedException("采购订单行号不能为空");
            }
            //if (string.IsNullOrEmpty(itemOutList.AsnLineNo))
            //{
            //    throw new NotImplementedException("ASN行号不能为空");
            //}
            if (string.IsNullOrEmpty(itemOutList.itemId))
            {
                throw new NotImplementedException("物料ID不能为空");
            }
            var mesRohInData = Db.Queryable<MesRohInData>()
                .Where(s => s.BillNo == itemOutList.SrcDocNo
                            && s.OrderLineId == itemOutList.SrcDocLineNo)
                .First();
            if (mesRohInData == null)
            {
                throw new NotImplementedException("采购订单不存在");
            }
            //var deliveryDetail = Db.Queryable<DeliveryDetail>()
            //    .Where(a =>  Int32.Parse(a.ZzitemId) ==
            //                Int32.Parse(itemOutList.AsnLineNo))
            //    .Count();
            //if (deliveryDetail <= 0)
            //{
            //    throw new NotImplementedException("[" + from.AsnNo + "]的明细行[" +
            //                                      itemOutList.AsnLineNo +
            //                                      "]不存在");
            //}
            var itemIdLinkU9 = Db.Queryable<MesLinkU9>()
                .Where(s => s.TableType == "MES_ITEMS"
                            && s.U9Id == itemOutList.itemId).First();
            if (mesLinkU9 == null)
            {
                throw new NotImplementedException("供应商ID不存在或未同步于U9");
            }
            var mesItems = Db.Queryable<MesItems>()
                .Where(s => s.Id == Decimal.Parse(itemIdLinkU9.MesId))
                .First();
            if (mesItems == null)
            {
                throw new NotImplementedException("[" + itemOutList.itemId +
                                                  "]物料不存在,请同步给MES");
            }
            var mesInvItemInCItems = Db.Queryable<MesInvItemInCItems>()
                .Where(s => s.ItemInId == mesInvItemIns.Id
                            && s.ItemNo == mesItems.ItemNo
                            && s.Ebeln == itemOutList.SrcDocNo
                            && s.EbelnLineNo ==
                            Decimal.Parse(itemOutList.SrcDocLineNo)
                            && s.SuppNo == mesSupplier.SuppNo
                            ).First();
            if (mesInvItemInCItems == null)
            {
                throw new NotImplementedException("没有对应的入库明细");
            }
            // 确保CbillNo不为空
            if (string.IsNullOrEmpty(mesInvItemIns.CbillNo))
            {
                throw new NotImplementedException("入库单关联的采购单号不能为空");
            }
            mesInvItemOutItems.Add(new MesInvItemOutItems
            {
                ItemOutId = nextSequenceValue,
                ItemNo = mesItems.ItemNo,
                Quantity = Decimal.Parse(itemOutList.qty),
                CreateBy = "PL017",
                CreateDate = DateTime.Now,
                Factory = "1000",
                Company = "1000",
                DepotCode = mesDepots.DepotCode,
                WorkNo = itemOutList.SrcDocNo, // 确保WorkNo有值
                WorkLine =
                    Decimal.Parse(itemOutList.SrcDocLineNo), // 确保WorkLine有值
                EbelnK3id = Decimal.Parse(mesRohInData.ErpId),
                LineK3id = Decimal.Parse(mesRohInData.EbelnK3id),
                FType = 0,
                Status = 0,
                PbillNo = mesInvItemIns.CbillNo, // 确保PbillNo有值
                RkNo = from.MesNo, // 确保RkNo有值
                RkLine = mesInvItemInCItems.Id, // 确保RkLine有值
                RkQty = mesInvItemInCItems.Quantity,
                TlQty = 0,
                ItemId = Decimal.Parse(itemIdLinkU9.MesId), // 确保ItemId有值
                //SqNo = itemOutList.SqNo, // 确保ItemId有值
                //ZzitemId = itemOutList.AsnLineNo, // 确保ItemId有值
                // Unit = item.Unit,
            });
        }
        var dataJson = new
        var outItemCommand = Db.Insertable(mesInvItemOutItems)
            .PageSize(1).IgnoreColumnsNull().ExecuteCommand();
        if (outItemCommand <= 0)
        {
            F_MES_ID = mesInvItemOuts.Id.ToString(),
            FDate = DateTime.Now.ToString("yyyy-MM-dd"),
            FPickerId = userName,
            F_UNW_LargeText_BZ = " ",
            F_UNW_KH = " ",
            F_UNW_DDSL = womcaa.Caa012.ToString(),
            F_UNW_Text_CZG = userName,
            scllentry = scllentryList
        };
            throw new Exception("创建采购退料单子表失败");
        }
        return "taskname=SCLL&mesid=" + mesInvItemOuts.Id +
               "&optype=create&datajson=" +
               JsonConvert.SerializeObject(
                   dataJson);
        // 插入采购退料单记录
        var insertResult = Db.Insertable(mesInvItemOuts).IgnoreColumns(true)
            .ExecuteCommand();
        if (insertResult <= 0)
        {
            throw new Exception("创建采购退料单失败");
        }
        return outItemCommand + insertResult >= 2;
    }
    public bool AuditProduction(WarehouseQuery query)
    private bool Remove(ItemOutFrom from)
    {
        query.status = 1;
        //审核
        return Update(query);
        // 查找要删除的采购退料单
        var mesInvItemOuts = Db.Queryable<MesInvItemOuts>()
            .Where(s => s.BillTypeId == BILL_TYPE_ID
                        && s.TransactionNo == TRANSACTION_NO
                        && s.ItemOutNo == from.RtnNo).ToList();
        if (mesInvItemOuts == null || mesInvItemOuts.Count == 0)
        {
            throw new NotImplementedException("找不到对应的采购退料单: " + from.RtnNo);
        }
        // 检查是否有已审核的单据,如果存在已审核(Status=1)则不允许删除
        if (mesInvItemOuts.Any(item => item.Status == 1))
        {
            throw new NotImplementedException("存在已审核的采购退料单,不允许删除");
        }
        // 删除所有相关单据
        foreach (var itemOut in mesInvItemOuts)
        {
            // 查找要删除的采购退料单明细
            var mesInvItemOutItems = Db.Queryable<MesInvItemOutItems>()
                .Where(s => s.ItemOutId == itemOut.Id)
                .ToList();
            if (mesInvItemOutItems == null || mesInvItemOutItems.Count == 0)
            {
                throw new NotImplementedException(
                    $"找不到采购退料单[{itemOut.ItemOutNo}]对应的明细");
            }
            // 删除采购退料单明细
            var deleteItemsResult = Db.Deleteable<MesInvItemOutItems>()
                .Where(s => s.ItemOutId == itemOut.Id)
                .ExecuteCommand();
            if (deleteItemsResult <= 0)
            {
                throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]明细失败");
            }
            // 删除采购退料单
            var deleteResult = Db.Deleteable<MesInvItemOuts>()
                .Where(s => s.Id == itemOut.Id)
                .ExecuteCommand();
            if (deleteResult <= 0)
            {
                throw new Exception($"删除采购退料单[{itemOut.ItemOutNo}]失败");
            }
        }
        return true;
    }
}