南骏 池
2025-11-04 e4f3c5ff76f7e410e61a52215b97799c07dd4a9b
1.调拨出库优化
2.WOMDAA里新增”库位查询“方法
3.一键调拨存储过程调用
已修改5个文件
368 ■■■■ 文件已修改
Controllers/Warehouse/TransferOutController.cs 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Wom/WomdaaController.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/TransferOutManager.cs 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Wom/WomdaaManager.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/TransferOutController.cs
@@ -4,6 +4,7 @@
using NewPdaSqlServer.service.@base;
using NewPdaSqlServer.service.Warehouse;
using NewPdaSqlServer.util;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
namespace NewPdaSqlServer.Controllers.Warehouse;
@@ -12,7 +13,7 @@
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class TransferOutController : ControllerBase
public class TransferOutController : BaseController
{
    private readonly TransferOutManager _manager = new();
@@ -114,7 +115,7 @@
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetTransferOutNoList();
            resultInfos.tbBillList = _manager.GetTransferOutNoList(RequestInfo);
            return new ResponseResult
            {
                status = 0,
@@ -155,7 +156,7 @@
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList =
                _manager.GetTransferOutDetailListByBillNo(query);
                _manager.GetTransferOutDetailListByBillNo(query, RequestInfo);
            return new ResponseResult
            {
                status = 0,
@@ -294,4 +295,52 @@
    }
    #endregion
    #region 一键调拨业务
    /// <summary>
    ///     一键调拨处理
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>处理结果</returns>
    /// <remarks>
    ///     请求示例:
    ///     POST /api/TransferOut/ScanYjdb
    ///     {
    ///     "billNo": "DB202401010001",  // 调拨单号(必填)
    ///     "userName": "admin",          // 用户名(必填)
    ///     "barcode": "BC001",          // 条码号(必填)
    ///     "sectionCode": "A1-01-01"     // 调入库位(必填)
    ///     }
    /// </remarks>
    [HttpPost("ScanYjdb")]
    public ResponseResult ScanYjdb([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.ScanYjdb(query);
            if (resultInfos.tbBillList.result == "2")
            {
                return new ResponseResult
                {
                    status = Convert.ToInt32(resultInfos.tbBillList.result),
                    message = resultInfos.tbBillList.strMsg,
                    data = resultInfos
                };
            }
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
}
Controllers/Wom/WomdaaController.cs
@@ -295,6 +295,33 @@
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     生产领料点击物料明细获取相关条码信息
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetBarKwByItemCK")]
    public ResponseResult GetBarKwByItemCK(dynamic unity)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetBarKwByItemCK(unity);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
    #region 现场管理
appsettings.json
@@ -10,7 +10,7 @@
    "TestErpUrl": "http://192.168.1.149:8066/WebService1.asmx/MesToErpinfoTest",
    "ProductionErpUrl": "http://192.168.1.149:8066/WebService1.asmx/MesToErpinfoTest",
    //"DataBaseConn": "Data Source=192.168.1.146,12468;Initial Catalog=TEST_MES;User ID=testUser;Password =qixi1qaz@WSXtest;Encrypt=True;TrustServerCertificate=True;"
    "DataBaseConn": "Data Source=192.168.8.8;Initial Catalog=GS_MES;User ID=sa;Password =JianHui@2025;Encrypt=True;TrustServerCertificate=True;"
    "DataBaseConn": "Data Source=192.168.8.8;Initial Catalog=YS_MES;User ID=sa;Password =JianHui@2025;Encrypt=True;TrustServerCertificate=True;"
  },
  "Version": "1.0.0",
  "X-KDApi-AcctID": "6244701c616bff",
service/Warehouse/TransferOutManager.cs
@@ -19,106 +19,87 @@
    ///     获取未完成的调拨出库单号列表
    /// </summary>
    /// <returns>未完成的调拨出库单号列表</returns>
    public List<string> GetTransferOutNoList()
    public List<string> GetTransferOutNoList( dynamic RequestInfo)
    {
        // 先从数据库获取Transfer_Out_ETAIL表的数据
        var transferOutDetails = Db.Queryable<MesDbckDetail>().ToList();
        var orgId = RequestInfo.OrgId;
        // 使用LINQ对获取的数据进行分组和筛选
        // 筛选条件:申请数量(sq)不等于已扫数量(ys)的记录
        var result = transferOutDetails
            .GroupBy(x => x.Pid)
            .Select(g => new
            {
                pid = g.Key,
                sq = g.Sum(x => x.FQty), // 申请数量合计
                ys = g.Sum(x => x.SQty), // 调出已扫数量合计
                rs = g.Sum(x => x.RQty), // 调入已扫数量合计
            })
            .Where(x => !((x.sq ?? 0) == (x.ys ?? 0) && (x.sq ?? 0) == (x.rs ?? 0)))
            .Select(x => x.pid)
            .ToList();
        if (orgId == null)
            throw new Exception("组织不存在!");
        // 根据pid查询对应的出库单号
        var billNos = Db.Queryable<MesDbck>()
            .Where(x => result.Contains(x.Id) && x.FApproveStatus == 1)
            .OrderBy(x => x.FCreateDate)
            .Select(x => x.FBillNo)
            .ToList();
        return billNos;
        // 获取未完成的退料单号列表
        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
        {
            // 返回单号字符串列表Get_Qt_ck_List
            var list = Db.Ado.SqlQuery<string>(
                "EXEC prc_pda_dbck_list @pi_orgId,@inP1,@inP2,@inP3,@inP4", parameters);
            return list;
        }
        catch (Exception ex)
        {
            throw new Exception($"{ex.Message}");
        }
    }
    /// <summary>
    ///     根据单据号获取待处理的调拨出库明细列表
    /// </summary>
    /// <param name="query">查询参数,包含单据号</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    public ProductionPickDto GetTransferOutDetailListByBillNo(
        WarehouseQuery query)
    public dynamic GetTransferOutDetailListByBillNo(WarehouseQuery query, dynamic RequestInfo)
    {
        if (string.IsNullOrEmpty(query.billNo)) throw new Exception("调拨单号为空");
        if (string.IsNullOrEmpty(query.billNo))
            throw new Exception("请选单据号!");
        var sql1 = string.Format(@"SELECT * FROM MES_DBCK WHERE FDocumentStatus = 'C' AND FBillNo = '{0}'", query.billNo);
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为null");
        var dbck = Db.Ado.SqlQuery<ItemDetailModel>(sql1);
        if (string.IsNullOrEmpty(query.billNo?.ToString()))
            throw new ArgumentException("单据号不能为空", nameof(query.billNo));
        if (dbck.Count < 1) throw new Exception("调拨单号不存在或未审核!");
        var orgId = RequestInfo.OrgId;
        var sql2 = string.Format(@"SELECT c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel,b.FQty FQty,b.SQty SQty,b.FQty - b.SQty DSQty ,
       dbo.F_QX_GETRECODEPOTSE(B.FMATERIALID,'','','') as RecoKw
    FROM MES_DBCK_DETAIL B
    LEFT JOIN MES_DBCK A ON A.ID = B.pid
    LEFT JOIN MES_ITEMS C ON  B.FMATERIALID = C.item_id
    LEFT JOIN WOMCAB D ON B.erpid = D.ERPID
    WHERE A.FBillNo = '{0}'  ORDER BY FSEQ", query.billNo);
        if (orgId == null)
            throw new Exception("组织不存在!");
        var womdabs = Db.Ado.SqlQuery<ItemDetailModel>(sql2);
        var DS_list = womdabs.Where(s => s.DSQty > 0).ToList();
        var YS_list = womdabs.Where(s => s.SQty > 0).ToList();
        //var p_bill_no = query.billNo;
        //// 根据SQL查询条件获取待处理的出库明细
        //// 关联查询TransferOutDetail、TransferOut和MesItems三张表
        //// 筛选条件:未完成数量大于0且单据已审核
        //var result = Db.Queryable<MesDbckDetail, MesDbck, MesItems>(
        //        (b, a, s) => new JoinQueryInfos(
        //            JoinType.Left, b.Pid == a.Id,
        //            JoinType.Left, b.FMaterialId == s.Id.ToString()))
        //    .Where((b, a, s) =>
        //        !((b.FQty ?? 0) == (b.SQty ?? 0) && (b.FQty ?? 0) == (b.RQty ?? 0))
        //        && a.FBillNo == p_bill_no // 匹配单据号
        //        && a.FApproveStatus == 1) // 单据已审核
        //    .OrderBy((b, a, s) => s.ItemNo)
        //    .Select((b, a, s) => new ItemDetailModel
        //    {
        //        ItemNo = s.ItemNo,
        //        ItemName = s.ItemName,
        //        ItemModel = s.ItemModel,
        //        FQty = b.FQty, // 申请数量
        //        SQty = b.SQty, // 已扫数量
        //        RQty = b.RQty, // 已扫数量
        //        // 保留其他必要字段...
        //        Pid = b.Pid.ToString(),
        //        FMaterialId = b.FMaterialId,
        //        Id = b.Id.ToString()
        //    })
        //    .ToList();
        //if(result.Count < 1) throw new Exception("该调拨单不存在或已扫完,请重新扫描");
        var dto = new ProductionPickDto
        // 获取未完成的发货通知单明细
        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
        {
            items = DS_list,
            Ysitems = YS_list
            // yisao = mesInvItemOutCDetailsList
        };
            List<dynamic>? blDetails = Db.Ado.SqlQuery<dynamic>(
                "EXEC prc_pda_dbck_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 dto;
            return new
            {
                allList = blDetails,
                blDetails = blDetails.Where(x => x.DSQty > 0).ToList(),
                ysDetails = blDetails.Where(x => x.SQty > 0).ToList(),
                Count = items.Count + ysitems.Count
            };
        }
        catch (Exception ex)
        {
            // 保留原有异常处理逻辑
            throw new Exception($"{ex.Message}");
        }
    }
@@ -328,6 +309,112 @@
        }
    }
    /// <summary>
    ///     一键调拨处理
    /// </summary>
    /// <param name="query">包含单据号、用户名、条码和库位信息的查询参数</param>
    /// <returns>处理结果</returns>
    public ProductionPickDto ScanYjdb(WarehouseQuery query)
    {
        // 安全获取dynamic属性值,避免空引用异常
        var p_bill_no = query.billNo?.ToString() ?? string.Empty;
        var p_item_barcode = query.barcode?.ToString() ?? string.Empty;
        var p_kw = query.sectionCode?.ToString() ?? string.Empty;
        var c_user = query.userName?.ToString() ?? string.Empty;
        // 验证单据号
        if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
        // 验证条码
        if (string.IsNullOrEmpty(p_item_barcode)) throw new Exception("请扫描条码!");
        // 验证库位
        if (string.IsNullOrEmpty(p_kw)) throw new Exception("请选择库位!");
        // 验证用户名
        if (string.IsNullOrEmpty(c_user)) throw new Exception("用户名不能为空!");
        // 查询出库单并验证状态
        var transferOut = Db.Queryable<MesDbck>()
            .Where(x => x.FBillNo == p_bill_no && x.FApproveStatus == 1)
            .First();
        if (transferOut == null) throw new Exception("未找到调拨申请单或者调拨申请单没审核");
        // 查询条码库存信息并验证
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode
                        && x.Quantity > 0)
            .First();
        if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
        // 查询物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id == stock.ItemId)
            .First();
        if (item == null) throw new Exception("未找到物料");
        var _strMsg = "";
        var _intSum = "";
        var barcode_num = 0m;
        var split_num = 0m;
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("[prc_pda_YJDB]", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 2000),
                        new("@outSum", SqlDbType.Int),
                        new("@barcode_num", SqlDbType.Decimal, 18) { Precision = 18, Scale = 10 },
                        new("@split_num", SqlDbType.Decimal, 18) { Precision = 18, Scale = 10 },
                        new("@c_user", c_user),
                        new("@p_bill_no", p_bill_no),
                        new("@p_item_barcode", p_item_barcode),
                        new("@p_kw", p_kw)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Direction = ParameterDirection.Output;
                    parameters[2].Direction = ParameterDirection.Output;
                    parameters[3].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[0].Value?.ToString() ?? "";
                    _intSum = parameters[1].Value?.ToString() ?? "";
                    barcode_num = parameters[2].Value != DBNull.Value ? Convert.ToDecimal(parameters[2].Value) : 0;
                    split_num = parameters[3].Value != DBNull.Value ? Convert.ToDecimal(parameters[3].Value) : 0;
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0 && result != 2) throw new Exception(_strMsg);
                    // 返回处理结果
                    var dto = new ProductionPickDto
                    {
                        itemNo = item.ItemNo,
                        barcodeNum = barcode_num.ToString(),
                        splitNum = split_num.ToString(),
                        barcode = p_item_barcode,
                        strMsg = _strMsg,
                        result = _intSum
                    };
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    /// <summary>
    ///     扫描条码进行调拨入库处理
    /// </summary>
service/Wom/WomdaaManager.cs
@@ -398,6 +398,39 @@
    }
    /// <summary>
    /// 获取物料相关条码信息
    /// </summary>
    /// <param name="unity"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public dynamic GetBarKwByItemCK(dynamic unity)
    {
        if (unity == null)
            throw new ArgumentNullException(nameof(unity), "参数对象不能为null");
        if (string.IsNullOrEmpty(unity.itemId?.ToString()))
            throw new ArgumentException("物料ID不能为空", nameof(unity.itemId));
        try
        {
            var parameters = new List<SugarParameter>
            {
                new SugarParameter("@itemId", unity.itemId),
                new SugarParameter("@inP1", unity.type),
                new SugarParameter("@inP2", unity.billNo)
            };
            return Db.Ado.SqlQuery<dynamic>("EXEC prc_pda_scll_selBarMx @itemId,@inP1,@inP2", parameters);
        }
        catch (Exception ex)
        {
            throw new Exception($"获取条码信息失败:{ex.Message}");
        }
    }
    public dynamic ProductBinding(dynamic query)
    {
        if (query == null) throw new ArgumentNullException(nameof(query), "参数对象不能为 null");