南骏 池
16 小时以前 9441a216b632f9fb8f549a8278fc337367a08a4e
1.调拨出库优化
2.其他出库优化调整
已修改4个文件
240 ■■■■ 文件已修改
Controllers/Warehouse/TransferOutController.cs 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/service/ProductionPickDto.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemQtManager.cs 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/TransferOutManager.cs 174 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/TransferOutController.cs
@@ -1,6 +1,7 @@
using System.Dynamic;
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.service.@base;
using NewPdaSqlServer.service.Warehouse;
using NewPdaSqlServer.util;
@@ -14,6 +15,8 @@
public class TransferOutController : ControllerBase
{
    private readonly TransferOutManager _manager = new();
    private readonly MesPrintMangeer _mCf = new();
    #region 基础CRUD
@@ -197,9 +200,16 @@
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (form, items) = _manager.ScanMoveBarcode(query);
            resultInfos.form = form;
            resultInfos.items = items;
            resultInfos.tbBillList = _manager.ScanMoveBarcode(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,
@@ -236,14 +246,16 @@
    /// </remarks>
    /// <response code="200">分割成功</response>
    /// <response code="400">分割失败,返回具体错误信息</response>
    [HttpPost("SplitBarcode")]
    public ResponseResult SplitBarcode([FromBody] WarehouseQuery query)
    [HttpPost("ScanCodeCF")]
    public ResponseResult ScanCodeCF(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var message = _manager.SplitBarcode(query);
            resultInfos.tbBillList = message;
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.printInfo = _mCf.getPrintInfo(query);
            var scanResult = _manager.ScanCodeCF(query);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult);
            return new ResponseResult
            {
                status = 0,
Dto/service/ProductionPickDto.cs
@@ -6,6 +6,8 @@
public class ProductionPickDto
{
    public string? ItemModel { get; set; }
    public string? itemNo { get; set; }
    public string? PlanNo { get; set; }
    public string? daa001 { get; set; }
service/Warehouse/MesItemQtManager.cs
@@ -16,13 +16,14 @@
    /// <returns>退料单号列表</returns>
    public List<string> GetPendingQtList()
    {
        const string sql = @"SELECT qtck
                        FROM MES_ITEM_QT
                        WHERE qt015 = 1
                          AND qt026 = 1
                          AND QT029 = 1
                          AND qt032 = 1
                          AND QT014 = 0  ";
        const string sql = @"SELECT qtck
FROM MES_ITEM_QT
WHERE qt015 = 1
  AND qt026 = 1
  AND QT029 = 1
  AND qt032 = 1
  AND QT014 = 0
ORDER BY qt002";
        return Db.Ado.SqlQuery<string>(sql);
    }
@@ -51,8 +52,8 @@
        //    throw new Exception($"其他出库申请单 {p_bill_no} 未审核,请确认!");
        // 检查退料单的完结状态(Qt014),已完结则抛出异常
        if (mesItemQt.Qt014 == true)
            throw new Exception($"其他出库申请单 {p_bill_no} 已完结,请确认!");
        //if (mesItemQt.Qt014 == true)
        //    throw new Exception($"其他出库申请单 {p_bill_no} 已完结,请确认!");
        var sql = @"SELECT c.item_no ItemNo,c.item_name ItemName,c.item_model ItemModel,
                    ISNULL(A.qd007,0)  FQty,ISNULL(A.qd008,0) SQty,ISNULL(A.qd007,0) - ISNULL(A.qd008,0) DSQty,
@@ -116,6 +117,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)
@@ -146,6 +150,9 @@
            .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} 不存在,请确认!");
        // 获取出库单明细
        var qtDetail = Db.Queryable<MesItemQtDatall>()
            .Where(it =>
@@ -153,17 +160,20 @@
                it.ItemId == stock.ItemId.ToString())
            .First();
        if (mesItemQt == null)
            throw new Exception($"其他出库申请单 {p_bill_no} 不存在,请确认!");
        if (qtDetail == null) throw new Exception("扫码物料非本次出库申请物料,请核对!");
        if (mesItemQt.Qt014 == true)
            throw new Exception($"其他出库申请单 {p_bill_no} 已完结,请确认!");
        // 检查仓库是否一致
        if (Convert.ToInt32(qtDetail.DepotId)  != stock.DepotId)
        if (qtDetail.DepotId  != stock.DepotId)
            throw new Exception(
                $"扫码出货仓库id{qtDetail.DepotId}与其他出库申请仓库{stock.DepotId}不一致,请核对!");
        if (qtDetail == null) throw new Exception("扫码物料非本次出库申请物料,请核对!");
        // 检查剩余数量
        var remainingQty = (qtDetail.Qd007 ?? 0) - (qtDetail.Qd008 ?? 0);
@@ -194,6 +204,8 @@
            var message =
                $"请确认发料数量!!已带出满足其他出库单的发料数量 {remainingQty} 确认后请点击条码拆分";
            throw new Exception($"条码数量超出发料数量,请拆分后再扫描!");
            query.itemNo = stock.ItemNo;
            query.Num = stock.Quantity;
            query.Fum = remainingQty;
service/Warehouse/TransferOutManager.cs
@@ -42,6 +42,7 @@
        // 根据pid查询对应的出库单号
        var billNos = Db.Queryable<MesDbck>()
            .Where(x => result.Contains(x.Id) && x.FApproveStatus == 1)
            .OrderBy(x => x.FCreateDate)
            .Select(x => x.FBillNo)
            .ToList();
@@ -53,41 +54,71 @@
    /// </summary>
    /// <param name="query">查询参数,包含单据号</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    public List<ItemDetailModel> GetTransferOutDetailListByBillNo(
    public ProductionPickDto GetTransferOutDetailListByBillNo(
        WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        if (string.IsNullOrEmpty(query.billNo)) throw new Exception("调拨单号为空");
        // 根据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();
        var sql1 = string.Format(@"SELECT * FROM MES_DBCK WHERE FDocumentStatus = 'C' AND FBillNo = '{0}'", query.billNo);
        if(result.Count < 1) throw new Exception("该调拨单不存在或已扫完,请重新扫描");
        var dbck = Db.Ado.SqlQuery<ItemDetailModel>(sql1);
        return result;
        if (dbck.Count < 1) throw new Exception("调拨单号不存在或未审核!");
        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);
        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
        {
            items = DS_list,
            Ysitems = YS_list
            // yisao = mesInvItemOutCDetailsList
        };
        return dto;
    }
    public List<ItemDetailModel> GetDBCKDetal(
@@ -130,7 +161,7 @@
    /// </summary>
    /// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
    /// <returns>处理后的表单和待处理明细列表</returns>
    public (WarehouseQuery form, List<ItemDetailModel> items)
    public ProductionPickDto
        ScanMoveBarcode(WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
@@ -148,8 +179,7 @@
        // 查询条码库存信息并验证
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode
                        && x.Quantity > 0
                        && !string.IsNullOrEmpty(x.DepotsCode))
                        && x.Quantity > 0)
            .First();
        if (stock == null) throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
@@ -200,7 +230,18 @@
                    query.Fum = Convert.ToDecimal(splitNum);
                    // 返回更新后的表单和待处理明细
                    return (query, GetDBCKDetal(query));
                    //return (query, GetDBCKDetal(query));
                    var dto = new ProductionPickDto
                    {
                        itemNo = item.ItemNo,
                        barcodeNum = barcodeNum,
                        splitNum = splitNum,
                        barcode = query.barcode,
                        strMsg = _strMsg,
                        result = _intSum
                    };
                    return dto;
                }
                catch (Exception ex)
                {
@@ -309,14 +350,45 @@
        }
    }
    //调拨出库拆分 prc_pda_DBCK_CF
    public string SplitBarcode(WarehouseQuery query)
    public ProductionPickDto ScanCodeCF(WarehouseQuery query)
    {
        var p_bill_no = query.daa001;
        var p_item_barcode = query.barcode;
        var barinfo = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode)
            .First();
        // 验证单据号
        if (string.IsNullOrEmpty(p_bill_no)) 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<MesDbckDetail>()
            .Where(x => x.FMaterialId == barinfo.ItemId.ToString()
                        && x.FQty > 0
                        && !string.IsNullOrEmpty(x.FStockInId)
                        && !string.IsNullOrEmpty(x.FOwnerInId))
            .First();
        if (stock == null) throw new Exception($"调拨明细中 【物料】或 【调入仓库】或【调入货主】信息不存在,请核对!{p_item_barcode}");
        // 查询物料信息
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id.ToString() == stock.FMaterialId)
            .First();
        if (item == null) throw new Exception("未找到物料");
        var _strMsg = "";
        var _intSum = "";
        var _cfBar = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("[prc_pda_DBRK]", conn))
            using (var cmd = new SqlCommand("[prc_pda_DBCK_CF]", conn))
            {
                try
                {
@@ -324,27 +396,36 @@
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 300),
                        new("@outMsg", SqlDbType.NVarChar, 2000),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@c_user", query.userName),
                        new("@p_bill_no", query.billNo),
                        new("@outCfBar", SqlDbType.NVarChar, 300),
                        new("@c_User", query.userName),
                        new("@p_biLL_no", query.daa001),
                        new("@p_item_barcode", query.barcode),
                        new("@NUM", query.Fum),
                        new("@num", query.Num)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Direction = ParameterDirection.Output;
                    parameters[2].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[0].Value.ToString();
                    _intSum = parameters[1].Value.ToString();
                    _cfBar = parameters[2].Value.ToString();
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
                    return _strMsg;
                    var dto = new ProductionPickDto
                    {
                        daa001 = query.daa001,
                        barcode = query.barcode,//原条码
                        cfBarcode = _cfBar//拆分后条码
                    };
                    return dto;
                }
                catch (Exception ex)
                {
@@ -357,4 +438,5 @@
            }
        }
    }
}