南骏 池
7 天以前 1d976f52878c9f776146502037377310921e5a21
service/Warehouse/MesItemQtManager.cs
@@ -1,8 +1,10 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.entity.Base;
using NewPdaSqlServer.util;
using SqlSugar;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace NewPdaSqlServer.service.Warehouse;
@@ -13,14 +15,33 @@
    ///     获取未完成的退料单号列表
    /// </summary>
    /// <returns>退料单号列表</returns>
    public List<string> GetPendingQtList()
    {
        return Db.Queryable<MesItemQt>()
            .Where(it =>
                (it.Qt015 ?? false) == true && (it.Qt014 ?? false) == false)
            .OrderByDescending(it => it.Qtck)
            .Select(it => it.Qtck)
            .ToList();
    public dynamic GetPendingQtList(dynamic RequestInfo)
     {
        var orgId = RequestInfo.OrgId;
        if (orgId == null)
            throw new Exception("组织不存在!");
        // 获取未完成的退料单号列表
        var parameters = new[]
        {
        new SugarParameter("@pi_orgId", orgId),
        new SugarParameter("@inP1", null),
        new SugarParameter("@inP2", null),
        new SugarParameter("@inP3", null),
        new SugarParameter("@inP4", null)
        };
        try
        {
            // 返回单号字符串列表
            var blDetails = Db.Ado.SqlQuery<string>(
                "EXEC prc_pda_qtck_list @pi_orgId,@inP1,@inP2,@inP3,@inP4", parameters);
            return blDetails;
        }
        catch (Exception ex)
        {
            throw new Exception($"{ex.Message}");
        }
    }
    /// <summary>
@@ -28,57 +49,47 @@
    /// </summary>
    /// <param name="query">仓库查询参数,包含用户名和单据号</param>
    /// <returns>待处理的退料单明细列表</returns>
    public List<MesItemQtDatall> GetPendingQtList(WarehouseQuery query)
    public dynamic GetPendingQtDetailList(dynamic query, dynamic RequestInfo)
    {
        // 从查询参数中获取用户名和单据号
        var c_User = query.userName;
        var p_bill_no = query.billNo;
        var orgId = RequestInfo.OrgId;
        // 根据单据号查询退料单主表信息
        var mesItemQt = Db.Queryable<MesItemQt>()
            .Where(it => it.Qtck == p_bill_no)
            .First();
        if (orgId == null)
            throw new Exception("组织不存在!");
        // 如果未找到退料单,抛出异常
        if (mesItemQt == null) throw new Exception($"未查询到此其他入库申请单 {p_bill_no}");
        // 检查退料单的审核状态(Qt015),未审核则抛出异常
        if (mesItemQt.Qt015 == false)
            throw new Exception($"其他出库申请单 {p_bill_no} 未审核,请确认!");
        // 检查退料单的完结状态(Qt014),已完结则抛出异常
        if (mesItemQt.Qt014 == true)
            throw new Exception($"其他出库申请单 {p_bill_no} 已完结,请确认!");
        // 联表查询获取未完成的明细列表
        // 关联表:
        // - MesItemQt: 退料单主表(a)
        // - MesItemQtDatall: 退料单明细表(b)
        // - MesItems: 物料基础信息表(c)
        var pendingList = Db.Queryable<MesItemQt, MesItemQtDatall, MesItems>(
                (a, b, c) =>
                    new JoinQueryInfos(
                        JoinType.Left, a.Guid == b.QtGuid, // 主表和明细表通过Guid关联
                        JoinType.Left,
                        b.ItemId == c.Id.ToString())) // 明细表和物料表通过ItemId关联
            .Where((a, b, c) =>
                a.Qtck == p_bill_no && // 匹配单据号
                (b.Qd007 ?? 0) - (b.Qd008 ?? 0) >
                0) // 计划数量减去已完成数量大于0的记录(即未完成的记录)
            .OrderBy((a, b, c) => c.ItemNo) // 按物料编号排序
            .Select((a, b, c) => new MesItemQtDatall
        var parameters = new[]
{
        new SugarParameter("@billNo",query.billNo),
        new SugarParameter("@pi_orgId", orgId),
        new SugarParameter("@inP1", null),
        new SugarParameter("@inP2", null),
        new SugarParameter("@inP3", null),
        new SugarParameter("@inP4", null)
        };
        try
        {
            List<dynamic>? blDetails = Db.Ado.SqlQuery<dynamic>(
                "EXEC prc_pda_qtck_detailList @billNo,@pi_orgId,@inP1,@inP2,@inP3,@inP4", parameters);
            var items = blDetails.Where(x => x.DSQty > 0).ToList();    // 待扫物料
            var ysitems = blDetails.Where(x => x.SQty > 0).ToList();   // 已扫物料
            return new
            {
                Qd002 = b.Qd002, // 明细行号
                Qt011 = a.Qt011, // 退料原因
                ItemNo = c.ItemNo, // 物料编号
                Qd007 = b.Qd007 ?? 0, // 计划数量
                Qd008 = b.Qd008 ?? 0 // 已完成数量
            })
            .ToList();
        return pendingList;
                items = items,
                ysitems = ysitems
            };
        }
        catch (Exception ex)
        {
            // 保留原有异常处理逻辑
            throw new Exception($"{ex.Message}");
        }
    }
    /// <summary>
    /// 扫码出库
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public (WarehouseQuery form, List<MesItemQtDatall> item, string message)
        OutScanBarcode(
            WarehouseQuery query)
@@ -108,6 +119,9 @@
        if (barcode == null)
            throw new Exception($"mes中不存在此条码,请核对!{p_item_barcode}");
        // 获取库存信息
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(it => it.ItemBarcode == p_item_barcode && it.Quantity > 0)
@@ -135,16 +149,11 @@
        // 获取其他出库单信息
        var mesItemQt = Db.Queryable<MesItemQt>()
            .Where(it => it.Qtck == p_bill_no)
            .Where(it => it.Qtck == p_bill_no && it.Qt015 == true && it.Qt026 == true && it.Qt029 == true && it.Qt032 == true)
            .First();
        if (mesItemQt == null)
            throw new Exception($"其他出库申请单 {p_bill_no} 不存在,请确认!");
        // 检查仓库是否一致
        if (Convert.ToInt32(mesItemQt.Qt008)  != stock.DepotId)
            throw new Exception(
                $"扫码出货仓库id{mesItemQt.Qt008}与其他出库申请仓库{stock.DepotId}不一致,请核对!");
        // 获取出库单明细
        var qtDetail = Db.Queryable<MesItemQtDatall>()
@@ -154,6 +163,19 @@
            .First();
        if (qtDetail == null) throw new Exception("扫码物料非本次出库申请物料,请核对!");
        if (mesItemQt.Qt014 == true)
            throw new Exception($"其他出库申请单 {p_bill_no} 已完结,请确认!");
        // 检查仓库是否一致
        if (qtDetail.DepotId  != stock.DepotId)
            throw new Exception(
                $"扫码出货仓库id{qtDetail.DepotId}与其他出库申请仓库{stock.DepotId}不一致,请核对!");
        // 检查剩余数量
        var remainingQty = (qtDetail.Qd007 ?? 0) - (qtDetail.Qd008 ?? 0);
@@ -183,6 +205,8 @@
            var message =
                $"请确认发料数量!!已带出满足其他出库单的发料数量 {remainingQty} 确认后请点击条码拆分";
            throw new Exception($"条码数量超出发料数量,请拆分后再扫描!");
            query.itemNo = stock.ItemNo;
            query.Num = stock.Quantity;
@@ -235,8 +259,8 @@
                    BillTypeId = p_bill_type_id,
                    TransactionNo = p_transaction_no,
                    DepotCode = stock.DepotsCode,
                    DepotId = stock.DepotsId.HasValue
                        ? (int)stock.DepotsId
                    DepotId = stock.DepotId.HasValue
                        ? (int)stock.DepotId
                        : null,
                    OutPart = mesItemQt.Qt012,
                    FType = 0,
@@ -270,7 +294,7 @@
            // 检查是否已存在出库物料记录
            var existingOutItem = Db.Queryable<MesInvItemOutItems>()
                .Where(it =>
                    it.ItemOutId == outId && it.ItemId == barcode.ItemId)
                    it.ItemOutId == outId && it.ItemId == barcode.ItemId && it.ItemDabid == qtDetail.Guid)
                .First();
            if (existingOutItem == null)
@@ -297,7 +321,9 @@
                    ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                        ? long.Parse(qtDetail.ItemId)
                        : null,
                    FType = 0
                    FType = 0,
                    AboutGuid = qtDetail.Guid,
                    ItemDabid = qtDetail.Guid
                    // Unit = qtDetail.Qd009
                };
@@ -310,9 +336,7 @@
                commit += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(it =>
                        it.TlQty == (it.TlQty ?? 0) + stock.Quantity)
                    .Where(it => it.ItemOutId == outId &&
                                 it.ItemId == barcode.ItemId &&
                                 it.QtOutId == qtDetail.Guid)
                    .Where(it => it.ItemOutId == outId && it.ItemId == barcode.ItemId && it.ItemDabid == qtDetail.Guid)
                    .ExecuteCommand();
            }
@@ -330,8 +354,8 @@
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                DepotCode = stock.DepotsCode,
                DepotId = stock.DepotsId.HasValue
                    ? (int)stock.DepotsId
                DepotId = stock.DepotId.HasValue
                    ? (int)stock.DepotId
                    : null,
                // DepotsCode = stock.DepotsCode,
                // DepotSectionsCode = stock.DepotSectionsCode,
@@ -435,6 +459,11 @@
            query.Num = stock.Quantity;
            query.Fum = null;
            // 创建 插入日志
            var logService = new LogService();
            var LogMsg = "【PDA】其他出库。条码【" + query.barcode + "】数量【"+ stock.Quantity.ToString() + "】 出库单号【" + outNo + "】";
            logService.CreateLog(db, query.userName, mesItemQt.Guid.ToString(), "MES_ITEM_QT", LogMsg, mesItemQt.Qtck);
            if (commit < 5) throw new Exception("更新失败");
            return commit;
@@ -443,6 +472,12 @@
        return (query, mesItemQtDatalls, mess);
    }
    /// <summary>
    /// 拆分条码并出库
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public (WarehouseQuery form, List<MesItemQtDatall> item, string message)
        PrintQtckBarcode(
            WarehouseQuery query)