南骏 池
6 天以前 4910c0fa81d93635e19a57c073c3a62c76053320
service/Warehouse/InventoryManager.cs
@@ -1,8 +1,14 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.service.@base;
using NewPdaSqlServer.util;
using SqlSugar;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Dynamic;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace NewPdaSqlServer.service.Warehouse;
@@ -47,8 +53,8 @@
        var p_transction_no = 601;
        // 检查库位代码是否为空
        if (string.IsNullOrEmpty(p_section_code))
            throw new Exception("002[请扫库位条码!");
        // if (string.IsNullOrEmpty(p_section_code))
        //     throw new Exception("002[请扫库位条码!");
        // 查询库区库位信息
        var depotSection = Db.Queryable<MesDepotSections, MesDepots>((a, b) =>
@@ -61,36 +67,52 @@
            .Single();
        // 如果库位代码不存在,则返回错误信息
        if (depotSection == null)
            throw new Exception("库位编码 " + p_section_code + " 不存在,请确认!");
        // if (depotSection == null)
        //     throw new Exception("库位编码 " + p_section_code + " 不存在,请确认!");
        // 检查是否已经收货
        var c_num = Db.Queryable<MesInvItemIns, MesInvItemInCDetails>((a, b) =>
                new JoinQueryInfos(
                    JoinType.Inner, a.Guid == b.ItemInId
                ))
            .Where((a, b) => b.ItemBarcode == p_item_barcode)
            .Count();
        // var c_num = Db.Queryable<MesInvItemIns, MesInvItemInCDetails>((a, b) =>
        //         new JoinQueryInfos(
        //             JoinType.Inner, a.Guid == b.ItemInId
        //         ))
        //     .Where((a, b) => b.ItemBarcode == p_item_barcode)
        //     .Count();
        if (c_num > 0) throw new Exception("002[条码重复扫描,请核对!");
        // if (c_num > 0) throw new Exception("002[条码重复扫描,请核对!");
        // 查询条码信息
        c_num = Db.Queryable<MesInvItemStocks>()
            .Where(t => t.ItemBarcode == p_item_barcode)
            .Count();
        // c_num = Db.Queryable<MesInvItemStocks>()
        //     .Where(t => t.ItemBarcode == p_item_barcode)
        //     .Count();
        if (c_num > 0) throw new Exception("002[条码已在库存中,请核对!");
        // if (c_num > 0) throw new Exception("002[条码已在库存中,请核对!");
        // 查询条码详细信息
        var c_mes_inv_item_barcodes = Db.Queryable<MesInvItemBarcodes>()
            .Where(t => t.ItemBarcode == p_item_barcode)
            .Single();
        if (c_mes_inv_item_barcodes == null)
            throw new Exception("002[条码不存在,请核对!");
        // if (c_mes_inv_item_barcodes == null)
        //     throw new Exception("002[条码不存在,请核对!");
        if (c_mes_inv_item_barcodes.ComeFlg != 0)
        if (c_mes_inv_item_barcodes.Memo != "初期物料")
            throw new Exception("002[条码不是期初条码,无法用期初入库!");
        var wmsManager = new WmsBaseMangeer();
        // 新增入库校验(调用存储过程)
        var checkResult = wmsManager.pdaInvJY(
            db: Db,
            edtUserNo: query.userName,
            barcode: p_item_barcode,
            sectionCode: p_section_code,
            stockId: depotSection.DepotId.ToString(),
            stockOrgId: depotSection.FSubsidiary,
            billNo: "", // 根据实际单据号传值
            transactionNo: "601" // 事务类型与存储过程匹配
        );
        if ( Convert.ToInt32(checkResult.result) < 1)
            throw new Exception($"入库校验失败:{checkResult.strMsg}");
        UseTransaction(db =>
        {
@@ -135,6 +157,7 @@
                    CbillNo = c_mes_inv_item_barcodes.BillNo,
                    Fstatus = 0,
                    ReceiveOrgId = depotSection.FSubsidiary,
                    InType = "期初入库",
                };
                db.Insertable(newMesInvItemIns)
                    .IgnoreColumns(true)
@@ -250,4 +273,142 @@
        // 返回成功信息
        return query;
    }
    public dynamic GetDepoptsInfo(dynamic unity)
    {
        //// 使用参数化查询防止SQL注入
        var sqlParams = new List<SugarParameter> { new("@sectionCode", unity.sectionCode) };
        var sql2 = @"        SELECT TOP 1  B.depot_code + '('+B.depot_name+')' depotsInfo,
                     B.FSubsidiary,
                     C.FNumber + '('+C.NAME+')' orgInfo
        FROM MES_DEPOT_SECTIONS A
                 LEFT JOIN
             MES_DEPOTS B ON A.depot_guid = B.Guid
            LEFT JOIN SYS_ORGANIZATION C ON C.FID = B.FSubsidiary
        WHERE a.depot_section_code = @sectionCode;";
        var XcslItem = Db.Ado.SqlQuery<dynamic>(sql2, sqlParams).FirstOrDefault();
        // 检查结果有效性
        if (XcslItem == null)
        {
            throw new Exception($"库位 [{unity.sectionCode}] 不存在,或所属仓库状态异常(可能被禁用或删除)。");
        }
        return XcslItem; // 返回第一行数据,如果没有则返回 null
    }
    public dynamic GetItemsList(dynamic unity)
    {
        var sqlParams = new List<SugarParameter> { new("@orgId", unity.orgId) };
        var sql2 = new StringBuilder(@"
        SELECT TOP 20 item_id, item_no, item_name, item_model,item_no+'---'+item_name AS wlInfo
        FROM MES_ITEMS
        WHERE FSubsidiary = @orgId");
        if (!string.IsNullOrWhiteSpace(unity.selectKey?.ToString()))
        {
            sqlParams.Add(new("@selectKey", unity.selectKey));
            sql2.Append(@"
            AND (item_no LIKE '%' + @selectKey + '%'
            OR item_name LIKE '%' + @selectKey + '%'
            OR item_model LIKE '%' + @selectKey + '%')");
        }
        var XcslItem = Db.Ado.SqlQuery<dynamic>(sql2.ToString(), sqlParams);
        if (XcslItem == null)
        {
            throw new Exception("该条件下无对应物料信息,请重新输入!");
        }
        return XcslItem;
    }
    public List<dynamic> ExecuteBeginBar(dynamic query)
    {
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为null");
        // 增强参数校验
        if (string.IsNullOrEmpty(query.userName?.ToString()))
            throw new ArgumentException("用户账号不能为空", nameof(query.userName));
        if (string.IsNullOrEmpty(query.itemid?.ToString()))
            throw new ArgumentException("物料ID不能为空", nameof(query.itemid));
        var resultList = new List<dynamic>();
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        using (var cmd = new SqlCommand("rpt_BeginBar", conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddRange(new[]
            {
                new SqlParameter("@inUser", SqlDbType.NVarChar, 50) { Value = query.userName },
                new SqlParameter("@inItemId", SqlDbType.NVarChar, 50) { Value = query.itemid },
                new SqlParameter("@isDesign", SqlDbType.Int) { Value = 0 },
                new SqlParameter("@in4", SqlDbType.NVarChar, 20) { Value = query.in4 ?? DBNull.Value },
                new SqlParameter("@in5", SqlDbType.NVarChar, 20) { Value = query.num ?? DBNull.Value }
            });
            try
            {
                conn.Open();
                using (var reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        var barcode = reader.GetString(0);
                        // 构建符合方法签名的参数对象
                        var scanQuery = new WarehouseQuery
                        {
                            barcode = barcode,
                            DepotCode = query.sectionCode, // 从原始query获取库位编码
                            userName = query.userName // 从原始query获取用户账号
                        };
                        try
                        {
                            // 调用正式签名方法
                            ScanBarcode(scanQuery);
                            var printData = GetPrintBar(barcode);
                            resultList.Add(printData);
                        }
                        catch (Exception ex)
                        {
                            throw new Exception($"期初条码打印入库存在异常{ex.Message},请重新打印!");
                        }
                    }
                }
                return resultList;
            }
            catch (Exception ex)
            {
                throw new Exception($"生成期初条码失败:{ex.Message}");
            }
        }
    }
    public dynamic GetPrintBar(string barcode)
    {
        var sqlParams = new List<SugarParameter> { new("@barcode", barcode) };
        var sql1 = @"    SELECT TOP 1 C.ITEM_NO,C.item_name,C.item_model,B.OLDQTY as QUANTITY,B.CREATE_DATE, '期初条码' AS BarType,A.ITEM_BARCODE,GETDATE() as print_date
            FROM MES_INV_ITEM_STOCKS A
            LEFT JOIN MES_INV_ITEM_BARCODES B ON A.ITEM_BARCODE = B.ITEM_BARCODE
            LEFT JOIN MES_ITEMS C ON C.item_id = B.ITEM_ID
            WHERE B.ITEM_BARCODE = @barcode";
        var XcslItem = Db.Ado.SqlQuery<dynamic>(sql1, sqlParams).First();
        return XcslItem;
    }
}