cnf
5 天以前 4701f1058d926173e0867bb014f5eb940186bcc4
挪蓝宝委外(2025-12-11)
已修改2个文件
已添加2个文件
2270 ■■■■■ 文件已修改
Controllers/Wom/WwGdController.cs 164 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Wom/WwGdhbController.cs 587 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Wom/WwGdManager.cs 424 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Wom/WwgdhbManager.cs 1095 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Wom/WwGdController.cs
@@ -1,17 +1,173 @@
using System.Dynamic;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.entity.Base;
using NewPdaSqlServer.service.@base;
using NewPdaSqlServer.service.Wom;
using NewPdaSqlServer.util;
using System.Dynamic;
namespace NewPdaSqlServer.Controllers.Wom;
[ApiController]
[Route("api/[controller]")]
public class WwGdController : ControllerBase
public class WwGdController : BaseController
{
    private readonly WwGdManager m = new();
    private readonly MesPrintMangeer _mCf = new();
    /// <summary>
    /// é€‰å–列表
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    /// <summary>
    /// çŽ°åœºæ”¶æ–™èŽ·å–å¯é€‰å·¥å•ä¿¡æ¯
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    [HttpPost("GetXcslDaa")]
    public ResponseResult GetXcslDaa([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetXcslDaa(query, RequestInfo);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// é€‰å–列表
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    /// <summary>
    ///
    /// èŽ·å–å§”å¤–å‡ºåº“ç”³è¯·å•å·
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    [HttpPost("GetWWCKsq")]
    public ResponseResult GetWWCKsq([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetWWCKsq(query, RequestInfo);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ ¹æ®å§”外领料申请单获取明细
    /// </summary>
    /// <param name="query">工单号请求参数</param>
    /// <returns>ResponseResult对象,包含状态、消息和数据</returns>
    [HttpPost("GetItemsByWwckNo")]
    public ResponseResult GetItemsByWwckNo(WarehouseQuery query)
    {
        try
        {
            // è°ƒç”¨WwGdManager的GetItemsByDaa001方法获取代领物料明细
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetItemsByWwckNo(query, RequestInfo);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            // å¦‚果发生异常,返回错误信息
            return ResponseResult.ResponseError(ex);
        }
    }
    [HttpPost("WwckScanCode")]
    public ResponseResult WwckScanCode(WarehouseQuery query)
    {
        try
        {
            // è°ƒç”¨WwGdManager的ScanCode方法进行扫码操作
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.WwckScanCode(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);
        }
    }
    /// <summary>
    /// å§”外申请出库拆分
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    [HttpPost("WwckScanCodeCF")]
    public ResponseResult WwckScanCodeCF(WarehouseQuery query)
    {
        try
        {
            // è°ƒç”¨WwGdManager的ScanCodeCF方法进行扫码确认操作
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.printInfo = _mCf.getPrintInfo(query);
            var scanResult = m.WwckScanCodeCF(query);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            // å¦‚果发生异常,返回错误信息
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ‰«ç 
@@ -114,7 +270,7 @@
        {
            // è°ƒç”¨WwGdManager的GetItemsByDaa001方法获取代领物料明细
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetItemsByDaa001(query);
            resultInfos.tbBillList = m.GetItemsByDaa001(query, RequestInfo);
            return new ResponseResult
            {
                status = 0,
Controllers/Wom/WwGdhbController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,587 @@
using System.Dynamic;
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.service.@base;
using NewPdaSqlServer.service.Wom;
using NewPdaSqlServer.util;
namespace NewPdaSqlServer.Controllers.Wom;
[ApiController]
[Route("api/[controller]")]
public class WwGdhbController : ControllerBase
{
    private readonly WwgdhbManager m = new();
    private readonly MesPrintMangeer _mCf = new();
    #region ç”Ÿäº§é¢†æ–™åˆå¹¶
    //GetProductionPickDaa001
    /// <summary>
    ///     æ¨¡ç³ŠæŸ¥è¯¢å·¥å•号并返回
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetProductionPickDaa001")]
    public ResponseResult GetProductionPickDaa001(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetProductionPickDaa001(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //GetItemsByDaa001
    /// <summary>
    ///     æ ¹æ®å·¥å•号获取代领物料明细
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetItemsByDaa001")]
    public ResponseResult GetItemsByDaa001(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetItemsByDaa001(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //ScanCode
    [HttpPost("ScanCode")]
    public ResponseResult ScanCode(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.ScanCode(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);
        }
    }
    //ScanCodeCF
    [HttpPost("ScanCodeCF")]
    public ResponseResult ScanCodeCF(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = new ExpandoObject();
            //resultInfos.tbBillList.printInfo = _mCf.getPrintInfo(query);
            var scanResult = m.ScanCodeCF(query);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     èŽ·å–æ‰€æœ‰
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetList")]
    public ResponseResult GetList()
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetList();
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ ¹æ®ä¸»é”®èŽ·å–
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetById")]
    public ResponseResult GetById(int id)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetById(id);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ ¹æ®ä¸»é”®åˆ é™¤
    /// </summary>
    /// <returns></returns>
    [HttpPost("DeleteByIds")]
    public ResponseResult DeleteByIds([FromBody] object[] ids)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.DeleteByIds(ids);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ·»åŠ 
    /// </summary>
    /// <returns></returns>
    [HttpPost("Insert")]
    public ResponseResult Add([FromBody] Womdaa data)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.Insert(data);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ·»åŠ è¿”å›žè‡ªå¢ž
    /// </summary>
    /// <returns></returns>
    [HttpPost("InsertReturnIdentity")]
    public ResponseResult InsertReturnIdentity([FromBody] Womdaa data)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.InsertReturnIdentity(data);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     ä¿®æ”¹
    /// </summary>
    /// <returns></returns>
    [HttpPost("Update")]
    public ResponseResult Update([FromBody] Womdaa data)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.Update(data);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
    #region çŽ°åœºç®¡ç†
    /// <summary>
    ///     æ‰«ææ³¨å¡‘码,获取工单和条码信息
    /// </summary>
    /// <returns></returns>
    [HttpPost("getZsBarInfo")]
    public ResponseResult getZsBarInfo([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            // å…ˆåˆå§‹åŒ–tbBillList属性
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.ZsBarInfo = m.getZsBarInfo(query);
            resultInfos.tbBillList.Traceability = m.getTraceability(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     äº§å“ç»‘定,追溯码和流水码绑定
    /// </summary>
    /// <returns></returns>
    [HttpPost("ProductBinding")]
    public ResponseResult ProductBinding([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            // å…ˆåˆå§‹åŒ–tbBillList属性
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList = m.ProductBinding(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     èŽ·å–å¡æ¿ä¿¡æ¯
    /// </summary>
    /// <returns></returns>
    [HttpPost("getKbBarInfo")]
    public ResponseResult getKbBarInfo([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            // å…ˆåˆå§‹åŒ–tbBillList属性
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.KbBarInfo = m.getKbBarInfo(query);
            resultInfos.tbBillList.KbBarMxInfo = m.getKbBarMxInfo(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     èŽ·å–ç®±ç ä¿¡æ¯
    /// </summary>
    /// <returns></returns>
    [HttpPost("getXBarInfo")]
    public ResponseResult getXBarInfo([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            // å…ˆåˆå§‹åŒ–tbBillList属性
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.XBarInfo = m.getXBarInfo(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     ç»‘定箱码与托板码
    /// </summary>
    /// <returns></returns>
    [HttpPost("submitAllChecked")]
    public ResponseResult submitAllChecked([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            // å…ˆåˆå§‹åŒ–tbBillList属性
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList = m.submitAllChecked(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    ///     æ ¸å¯¹é€æ£€
    /// </summary>
    /// <returns></returns>
    [HttpPost("submitInspection")]
    public ResponseResult submitInspection([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            // å…ˆåˆå§‹åŒ–tbBillList属性
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList = m.SubmitKbInspection(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //GetItemsXcsl
    /// <summary>
    ///     æ ¹æ®å·¥å•号获取待收料物料明细
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetItemsXcsl")]
    public ResponseResult GetItemsXcsl(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetItemsXcsl(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //GetItemsXcsl
    /// <summary>
    ///     ç‰©æ–™æ¡ç æ”¶æ–™
    /// </summary>
    /// <returns></returns>
    [HttpPost("ScanXcsl")]
    public ResponseResult ScanXcsl(dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.ScanXcsl(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //GetItemsXcsl
    /// <summary>
    ///     æ ¹æ®çº¿ä½“获取仪器重量
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetWeightByXt")]
    public ResponseResult GetWeightByXt(dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetWeightByXt(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// çŽ°åœºæ”¶æ–™èŽ·å–å¯é€‰å·¥å•ä¿¡æ¯
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    [HttpPost("GetXcslDaa")]
    public ResponseResult GetXcslDaa([FromBody] dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetXcslDaa(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //GetItemsXctl
    /// <summary>
    ///     æ ¹æ®å·¥å•号获取待投料物料明细
    /// </summary>
    /// <returns></returns>
    [HttpPost("GetItemsXctl")]
    public ResponseResult GetItemsXctl(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.GetItemsXctl(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    //GetItemsXcsl
    /// <summary>
    ///     ç‰©æ–™æ¡ç æŠ•æ–™
    /// </summary>
    /// <returns></returns>
    [HttpPost("ScanXctl")]
    public ResponseResult ScanXctl(dynamic query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = m.ScanXctl(query);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
}
service/Wom/WwGdManager.cs
@@ -1,12 +1,14 @@
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks.Dataflow;
using Masuit.Tools;
using Masuit.Tools;
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.entity.Base;
using NewPdaSqlServer.util;
using SqlSugar;
using System.Data;
using System.Data.SqlClient;
using System.Threading.Tasks.Dataflow;
using DbHelperSQL = NewPdaSqlServer.DB.DbHelperSQL;
namespace NewPdaSqlServer.service.Wom;
@@ -138,86 +140,134 @@
        }
    }
    public ProductionPickDto GetItemsByDaa001(WarehouseQuery query)
    /// <summary>
    /// èŽ·å–åº“ä½ä¿¡æ¯
    /// </summary>
    /// <param name="unity"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public dynamic GetBarKwByItem(dynamic unity)
    {
        return getDaa001(query);
        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)
            };
            return Db.Ado.SqlQuery<dynamic>("EXEC prc_pda_scll_selBarMx @itemId", parameters);
        }
        catch (Exception ex)
        {
            throw new Exception($"获取条码信息失败:{ex.Message}");
        }
    }
    private ProductionPickDto getDaa001(WarehouseQuery query)
    /// <summary>
    /// é€‰å–列表
    /// </summary>
    /// <param name="unity"></param>
    /// <param name="RequestInfo"></param>
    /// <returns></returns>
    public dynamic GetXcslDaa(dynamic unity, dynamic RequestInfo)
    {
        if (string.IsNullOrEmpty(query.daa001)) throw new Exception("工单号为空");
        var wwgd = Db.Queryable<WwGd, MesItems>((a, i) =>
                new JoinQueryInfos(JoinType.Left,
                    a.Daa003 == i.ItemId))
            .Where((a, i) => a.Daa001 == query.daa001 && (a.PcSh ?? 0) == 1)
            .Select((a, i) => new
            {
                a.Daa001, a.RwdGuid
            }).First();
        if (wwgd?.Daa001 == null) throw new Exception("工单号不存在");
        var womdabs = Db
            .Queryable<WwGd, WwGdDetail, MesItems, ProductionOrderSub>(
                (a, b, c, d) =>
                    new JoinQueryInfos(
                        JoinType.Left,
                        a.Id == b.Pid,
                        JoinType.Inner,
                        c.Id == b.Dab003,
                        JoinType.Inner, b.Erpid.ToString() == d.ErpId
                    ))
            .Where((a, b, c, d) =>
                a.Daa001 == query.daa001 )
            .Select((a, b, c, d) => new WwGdDetail
            {
                Pid = b.Pid,
                Dab003 = b.Dab003,
                Dab006 = b.Dab006,
                Dab007 = b.Dab007,
                wNum = b.Dab006 - b.Dab007, // è®¡ç®—字段 W_NUM
                ItemName = c.ItemName, // åŠ¨æ€å­—æ®µ ITEM_NAME
                ItemNo = c.ItemNo // åŠ¨æ€å­—æ®µ ITEM_NO
            })
            .ToList();
        var list = womdabs.Where(s => s.wNum > 0).ToList();
        var mesInvItemOutCDetailsList = Db
            .Queryable<MesInvItemOutCDetails, MesItems, MesDepots>
            ((a, b, c) =>
                new JoinQueryInfos(
                    JoinType.Inner, a.ItemId == b.Id,
                    JoinType.Inner, c.DepotId == a.DepotId
                ))
            .Where((a, b, c) => a.WorkNo == query.daa001)
            .Select((a, b, c) => new MesInvItemOutCDetails
            {
                ItemName = b.ItemName,
                ItemNo = b.ItemNo,
                ItemId = a.ItemId,
                DepotId = a.DepotId,
                WorkNo = a.WorkNo,
                DepotName = c.DepotName,
                Quantity = a.Quantity
            })
            .ToList();
        var womcaa = Db.Queryable<ProductionOrder>()
            .Where(s => s.Guid == wwgd.RwdGuid)
            .First();
        var dto = new ProductionPickDto
        var orgId = RequestInfo.OrgId;
        var parameters = new List<SugarParameter>
        {
            daa001 = wwgd.Daa001,
            PlanNo = womcaa.ErpProductionOrderNo,
            totals1 = womdabs,
            daisao1 = list,
            yisao = mesInvItemOutCDetailsList
            new SugarParameter("@selectKey", unity.selectKey),
            new SugarParameter("@inP1", orgId), // å¯é€‰å‚æ•°
            new SugarParameter("@inP2", unity.selDaaType), // å¯é€‰å‚æ•°
            new SugarParameter("@inP3", null), // å¯é€‰å‚æ•°
            new SugarParameter("@inP4", null), // å¯é€‰å‚æ•°
            // ...其他可选参数
        };
        var result = Db.Ado.SqlQuery<dynamic>("EXEC prc_pda_wwll_list @selectKey, @inP1, @inP2, @inP3, @inP4", parameters);
        return result;
    }
        return dto;
    /// <summary>
    /// é€‰å–列表
    /// </summary>
    /// <param name="unity"></param>
    /// <param name="RequestInfo"></param>
    /// <returns></returns>
    public dynamic GetWWCKsq(dynamic unity, dynamic RequestInfo)
    {
        var orgId = RequestInfo.OrgId;
        var parameters = new List<SugarParameter>
        {
            new SugarParameter("@pi_selectKey", unity.selectKey),
            new SugarParameter("@pi_type", unity.type), // å¯é€‰å‚æ•°
            new SugarParameter("@pi_orgId", orgId), // å¯é€‰å‚æ•°
            new SugarParameter("@inP1", null), // å¯é€‰å‚æ•°
            new SugarParameter("@inP2", null), // å¯é€‰å‚æ•°
            new SugarParameter("@inP3", null), // å¯é€‰å‚æ•°
            new SugarParameter("@inP4", null), // å¯é€‰å‚æ•°
            // ...其他可选参数
        };
        var result = Db.Ado.SqlQuery<dynamic>("EXEC prc_pda_wwcksq_list @pi_selectKey, @pi_type, @pi_orgId , @inP1, @inP2, @inP3, @inP4", parameters);
        return result;
    }
    /// <summary>
    /// åˆ—表明细
    /// </summary>
    /// <param name="query"></param>
    /// <param name="RequestInfo"></param>
    /// <returns></returns>
    public dynamic GetItemsByDaa001(WarehouseQuery query, dynamic RequestInfo)
    {
        return getDaa001(query, RequestInfo);
    }
    private dynamic getDaa001(WarehouseQuery query, dynamic RequestInfo)
    {
        if (string.IsNullOrEmpty(query.daa001)) throw new Exception("请选工单号!");
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为null");
        if (string.IsNullOrEmpty(query.daa001?.ToString()))
            throw new ArgumentException("工单号不存在", nameof(query.daa001));
        var orgId = RequestInfo.OrgId;
        if (orgId == null)
            throw new Exception("组织不存在!");
        var parameters = new[]
        {
            new SugarParameter("@daa001", query.daa001),
            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_wwll_detailList @daa001,@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();   // å·²æ‰«ç‰©æ–™
            var planNo = blDetails.FirstOrDefault()?.ErpProductionOrderNo?.ToString();// èŽ·å–å·¥å•è®¡åˆ’å·
            return new
            {
                daa001 = query.daa001,
                PlanNo = planNo,
                items = items,
                ysitems = ysitems
            };
        }
        catch (Exception ex)
        {
            throw new Exception($"{ex.Message}");
        }
    }
    #region å§”外退料
@@ -709,6 +759,212 @@
    }
    #endregion
    /// <summary>
    /// å§”外出库申请单号获取明细
    /// </summary>
    /// <param name="query"></param>
    /// <param name="RequestInfo"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    /// <exception cref="ArgumentNullException"></exception>
    /// <exception cref="ArgumentException"></exception>
    public dynamic GetItemsByWwckNo(WarehouseQuery query, dynamic RequestInfo)
    {
        if (string.IsNullOrEmpty(query.daa001)) throw new Exception("请选工单号!");
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为null");
        if (string.IsNullOrEmpty(query.daa001?.ToString()))
            throw new ArgumentException("工单号不存在", nameof(query.daa001));
        var orgId = RequestInfo.OrgId;
        if (orgId == null)
            throw new Exception("组织不存在!");
        var parameters = new[]
        {
            new SugarParameter("@daa001", query.daa001),
            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_wwcksq_detailList @daa001,@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();   // å·²æ‰«ç‰©æ–™
            var planNo = blDetails.FirstOrDefault()?.ErpProductionOrderNo?.ToString();// èŽ·å–å·¥å•è®¡åˆ’å·
            return new
            {
                daa001 = query.daa001,
                PlanNo = planNo,
                items = items,
                ysitems = ysitems,
                allList = blDetails
            };
        }
        catch (Exception ex)
        {
            throw new Exception($"{ex.Message}");
        }
    }
    /// <summary>
    /// w委外出库
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public ProductionPickDto WwckScanCode(WarehouseQuery query)
    {
        var _strMsg = "";
        var _intSum = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            if (query.userName.IsNullOrEmpty()) throw new Exception("用户名不允许为空");
            if (query.daa001.IsNullOrEmpty()) throw new Exception("领料单号不允许为空");
            if (query.barcode.IsNullOrEmpty()) throw new Exception("条码不允许为空");
            using (var cmd = new SqlCommand("[PRC_PDA_WWCK_SCAN]", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    //SqlParameter[] parameters =
                    //{
                    //    new("@outMsg", SqlDbType.NVarChar, 300),
                    //    new("@outSum", SqlDbType.NVarChar, 300),
                    //    new("@barcode_num", SqlDbType.NVarChar, 300),
                    //    new("@split_num", SqlDbType.NVarChar, 300),
                    //    new("@c_User", query.userName),
                    //    new("@p_biLL_no", query.daa001),
                    //    new("@p_item_barcode", query.barcode)
                    //};
                    var parameters = new SqlParameter[]
                    {
                        new SqlParameter("@C_USER", SqlDbType.NVarChar, 100) { Value = query.userName ?? string.Empty },
                        new SqlParameter("@P_BILL_NO", SqlDbType.NVarChar, 50) { Value = query.billNo ?? string.Empty },
                        new SqlParameter("@P_ITEM_BARCODE", SqlDbType.NVarChar, 100) { Value = query.barcode ?? string.Empty },
                        new SqlParameter("@P_BL_NO", SqlDbType.NVarChar, 100) { Value = query.blNo ?? string.Empty },
                        new SqlParameter("@P_TYPE", SqlDbType.NVarChar, 20) { Value = query.Type ?? string.Empty },
                        new SqlParameter("@OUT_MSG", SqlDbType.NVarChar, 2000) { Direction = ParameterDirection.Output },
                        new SqlParameter("@OUT_SUM", SqlDbType.Int) { Direction = ParameterDirection.Output },
                        new SqlParameter("@BARCODE_NUM", SqlDbType.Decimal) {
                            Direction = ParameterDirection.Output,
                            Precision = 18,
                            Scale = 10
                        },
                        new SqlParameter("@SPLIT_NUM", SqlDbType.Decimal) {
                            Direction = ParameterDirection.Output,
                            Precision = 18,
                            Scale = 10
                        }
                    };
                    parameters[5].Direction = ParameterDirection.Output;
                    parameters[6].Direction = ParameterDirection.Output;
                    parameters[7].Direction = ParameterDirection.Output;
                    parameters[8].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[5].Value.ToString();
                    _intSum = parameters[6].Value.ToString();
                    var barcodeNum = parameters[7].Value.ToString();
                    var splitNum = parameters[8].Value.ToString();
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
                    var dto = new ProductionPickDto
                    {
                        daa001 = query.daa001,
                        barcodeNum = barcodeNum,
                        splitNum = splitNum,
                        barcode = query.barcode,
                        strMsg = _strMsg,
                        result = _intSum
                    };
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    /// <summary>
    /// å§”外拆分出库拆分
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    /// <exception cref="Exception"></exception>
    public ProductionPickDto WwckScanCodeCF(WarehouseQuery query)
    {
        // Validate input parameters
        if (string.IsNullOrEmpty(query.userName))
            throw new Exception("用户名不能为空!");
        if (string.IsNullOrEmpty(query.barcode))
            throw new Exception("请扫描条码!");
        if ((query.Num ?? 0) <= 0)
            throw new Exception("请输入正确的发料数量!");
        if (string.IsNullOrEmpty(query.blNo))
            throw new Exception("补料单号不能为空!");
        // Prepare parameters for the stored procedure
        var parameters = new List<SugarParameter>
        {
            new SugarParameter("@C_USER", query.userName),
            new SugarParameter("@P_BILL_NO", query.billNo),
            new SugarParameter("@P_ITEM_BARCODE", query.barcode),
            new SugarParameter("@P_BL_NO", query.blNo),
            new SugarParameter("@P_TYPE", query.Type),
            new SugarParameter("@NUM", query.Num),
            new SugarParameter("@OUT_MSG", "", System.Data.DbType.String, ParameterDirection.Output),
            new SugarParameter("@OUT_SUM", 0, System.Data.DbType.Int32, ParameterDirection.Output),
            new SugarParameter("@OUT_CF_BAR", "", System.Data.DbType.String, ParameterDirection.Output)
        };
        // Execute the stored procedure
        Db.Ado.UseStoredProcedure().ExecuteCommand("PRC_PDA_WWCK_SCAN_CF", parameters);
        // Get output parameters
        var outMsg = parameters.FirstOrDefault(p => p.ParameterName == "@OUT_MSG")?.Value?.ToString();
        var outSum = Convert.ToInt32(parameters.FirstOrDefault(p => p.ParameterName == "@OUT_SUM")?.Value ?? -1);
        var outCfBar = parameters.FirstOrDefault(p => p.ParameterName == "@OUT_CF_BAR")?.Value?.ToString();
        // Handle the result
        if (outSum == -1)
        {
            throw new Exception(outMsg ?? "操作失败");
        }
        var dto = new ProductionPickDto
        {
            daa001 = query.billNo,
            barcode = query.barcode,//原条码
            cfBarcode = outCfBar//拆分后条码
        };
        return dto;
    }
    #region å§”外补料
@@ -1288,7 +1544,7 @@
            // æ£€æŸ¥è¡¥æ–™å•状态
            var mesItemBl = Db.Queryable<MesItemBl>()
                .Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == false)
                .Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == true)
                .First();
            if (mesItemBl == null)
@@ -1356,9 +1612,19 @@
            if (itemOut == null)
            {
                  var outNoType = "WWBL(委外补料)";
            if (query.Type == "委外补料")
            {
                outNoType = "WWBL(委外补料)";
            }
            else
            {
                outNoType = "WWCL(委外超领)";
            }
                // åˆ›å»ºæ–°çš„出库单
                var outId = Guid.NewGuid();
                var outNo = BillNo.GetBillNo("BL(工单补料)");
                var outNo = BillNo.GetBillNo(outNoType);
                // æ’入出库单主表
                executeCommand += db.Insertable(new MesInvItemOuts
service/Wom/WwgdhbManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,1095 @@
using Masuit.Tools;
using Masuit.Tools.Models;
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.entity.Base;
using NewPdaSqlServer.util;
using SqlSugar;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Text;
using DbHelperSQL = NewPdaSqlServer.DB.DbHelperSQL;
namespace NewPdaSqlServer.service.Wom;
public class WwgdhbManager : Repository<Womdaa>
{
    //当前类已经继承了 Repository å¢žã€åˆ ã€æŸ¥ã€æ”¹çš„æ–¹æ³•
    //这里面写的代码不会给覆盖,如果要重新生成请删除 WomdaaManager.cs
    //获取工单号
    public List<string> GetProductionPickDaa001(WarehouseQuery query)
    {
        var sql =
            "SELECT DAAhb001 FROM WOMDAAhb A  WHERE DAAHB001 = " +
            query.hbNo +
            " and FSTATUS=1 order by a.CREATE_DATE desc";
        return Db.Ado.SqlQuery<string>(sql);
    }
    //根据工单号返回产品型号和待领物料
    public dynamic GetItemsByDaa001(WarehouseQuery query)
    {
        return getDaa001(query);
    }
    public ProductionPickDto ScanCode(WarehouseQuery query)
    {
        var _strMsg = "";
        var _intSum = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            if (query.userName.IsNullOrEmpty()) throw new Exception("用户名不允许为空");
            if (query.hbNo.IsNullOrEmpty()) throw new Exception("合并领料单号不允许为空");
            if (query.barcode.IsNullOrEmpty()) throw new Exception("条码不允许为空");
            using (var cmd = new SqlCommand("[prc_pda_WWLLHB]", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 300),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@barcode_num", SqlDbType.NVarChar, 300),
                        new("@split_num", SqlDbType.NVarChar, 300),
                        new("@c_User", query.userName),
                        new("@p_biLL_no", query.hbNo),
                        new("@p_item_barcode", query.barcode)
                    };
                    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();
                    var barcodeNum = parameters[2].Value.ToString();
                    var splitNum = parameters[3].Value.ToString();
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
                    var dto = new ProductionPickDto
                    {
                        daa001 = query.hbNo,
                        barcodeNum = barcodeNum,
                        splitNum = splitNum,
                        barcode = query.barcode,
                        strMsg = _strMsg,
                        result = _intSum
                    };
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    //prC_pda_SCLL_CF
    public ProductionPickDto ScanCodeCF(WarehouseQuery query)
    {
        if (query.userName.IsNullOrEmpty()) throw new Exception("用户名不允许为空");
        if (query.hbNo.IsNullOrEmpty()) throw new Exception("合并领料单号不允许为空");
        if (query.barcode.IsNullOrEmpty()) throw new Exception("条码不允许为空");
        if (query.Num is null or 0) throw new Exception("条码拆分数不允许为空或者为0");
        var _strMsg = "";
        var _intSum = "";
        var _cfBar = ""; //拆分后条码
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("[prc_pda_WWLLHB_CF]", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@outMsg", SqlDbType.NVarChar, 2000),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@outCfBar", SqlDbType.NVarChar, 300),
                        new("@c_User", query.userName),
                        new("@p_biLL_no", query.hbNo),
                        new("@p_item_barcode", query.barcode),
                        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);
                    var dto = new ProductionPickDto
                    {
                        daa001 = query.hbNo,
                        barcode = query.barcode, //原条码
                        cfBarcode = _cfBar //拆分后条码
                    };
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    private dynamic getDaa001(WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.hbNo)) throw new Exception("合并单号为空");
        var queryResult = Db.Queryable<Womdaahb>()
        .Where(b => b.Daahb001 == query.hbNo && b.Fstatus == 1 && b.orderType=="委外工单")
        .Select(b => new
        {
            b.Daahb001,
            b.Daah009,
            b.OrgId
         // å…¶ä»–需要的Womdaahb字段
         })
        .First();
        if (queryResult?.Daahb001 == null) throw new Exception("合并单号不存在");
        // ä½¿ç”¨ADO.NET直接调用存储过程
        var ds = new DataSet();
        // å‡è®¾æ‚¨ä½¿ç”¨çš„æ˜¯SQL Server,创建SqlConnection
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            conn.Open();
            using (var cmd = new SqlCommand("prc_pda_wwgdhb_wllist", conn))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                // æ·»åŠ å‚æ•°
                cmd.Parameters.Add(new SqlParameter("@daahbNo", query.hbNo));
                cmd.Parameters.Add(new SqlParameter("@pi_orgId", DBNull.Value));
                cmd.Parameters.Add(new SqlParameter("@inP1", DBNull.Value));
                cmd.Parameters.Add(new SqlParameter("@inP2", DBNull.Value));
                cmd.Parameters.Add(new SqlParameter("@inP3", DBNull.Value));
                cmd.Parameters.Add(new SqlParameter("@inP4", DBNull.Value));
                using (var adapter = new System.Data.SqlClient.SqlDataAdapter(cmd))
                {
                    adapter.Fill(ds);
                }
            }
        }
        // è½¬æ¢ç»“æžœ
        var XcslItem = Db.Utilities.DataTableToDynamic(ds.Tables[0]);
        var DS_list = Db.Utilities.DataTableToDynamic(ds.Tables[1]);
        var YS_list = Db.Utilities.DataTableToDynamic(ds.Tables[2]);
        //var daaInfo = Db.Utilities.DataTableToDynamic(ds.Tables[3]);
        var dto = new
        {
            XcslItemList = XcslItem,
            XcslWjsBarList = DS_list,
            XcslYjsBarList = YS_list
            //DaaInfoList = daaInfo
        };
        return dto;
    }
    /// <summary>
    ///     èŽ·å–å·¥å•æ¡ç ä¿¡æ¯
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    public dynamic getZsBarInfo(dynamic query)
    {
        var sql = string.Format(@"SELECT TOP 1 A.barCode AS zsBarcode,
             D.name AS lineName,
             D.line_no,
             B.daa001,
             C.item_no,
             C.item_name,
             C.item_model,
             A.quantity as barQty,
             B.daa008 as sumQty,
             isnull((SELECT count(1) FROM WORK_COLLECT WHERE processNo = '{0}' AND ABOUT_GUID = A.ABOUT_GUID),0) AS finQty,
             isnull((SELECT TOP 1 processNo FROM WORK_COLLECT WHERE  WORK_COLLECT.barCode = '{1}' AND checkResult = '√' ORDER BY WORK_COLLECT.createDate DESC ),'') AS lastGx
FROM WORK_TRAC_CODE A
         LEFT JOIN WOMDAA B ON A.ABOUT_GUID = B.guid
         LEFT JOIN MES_ITEMS C ON B.daa002 = C.item_id
         LEFT JOIN MES_WORKSHOP_LINE D ON A.lineId = D.id
WHERE A.barCode = '{1}'", query.GX, query.Zsbarcode);
        var ZsBarInfo = Db.Ado.SqlQuery<dynamic>(sql);
        if (ZsBarInfo.Count < 1)
            throw new Exception($"该追溯码{query.Zsbarcode}不存在不存在");
        return ZsBarInfo;
    }
    //获取生产
    public dynamic getTraceability(dynamic query)
    {
        var sql = string.Format(
            @"SELECT processNo, A.barCode, B.lineId, line_no, name AS lineName, checkResult, C.USER_NAME
FROM WORK_COLLECT A
         LEFT JOIN WORK_TRAC_CODE B ON A.barCode = B.barCode
         LEFT JOIN SYS_USER C ON C.ACCOUNT = A.createBy
         LEFT JOIN MES_WORKSHOP_LINE D ON B.lineId = D.id
WHERE A.barCode = '{0}'", query.Zsbarcode);
        var Traceability = Db.Ado.SqlQuery<dynamic>(sql);
        return Traceability;
    }
    public dynamic ProductBinding(dynamic query)
    {
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为 null");
        // 2. ä½¿ç”¨ string.IsNullOrEmpty ç›´æŽ¥åˆ¤æ–­å­—符串属性(避免 NullReferenceException)
        if (string.IsNullOrEmpty(query.userName?.ToString()))
            throw new ArgumentException("用户名不允许为空", nameof(query.userName));
        if (string.IsNullOrEmpty(query.ZsBar?.ToString()))
            throw new ArgumentException("追溯码不允许为空", nameof(query.ZsBar));
        if (string.IsNullOrEmpty(query.LsBar?.ToString()))
            throw new ArgumentException("后盖码不允许为空", nameof(query.LsBar));
        var _strMsg = "";
        var _intSum = "";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("prc_pda_product_binding", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@pi_user", SqlDbType.NVarChar, 100)
                            { Value = query.userName },
                        new("@pi_trac_barcode", SqlDbType.NVarChar, 100)
                            { Value = query.ZsBar },
                        new("@pi_ls_barcode", SqlDbType.NVarChar, 100)
                            { Value = query.LsBar },
                        new("@po_outMsg", SqlDbType.NVarChar, 2000)
                            { Direction = ParameterDirection.Output },
                        new("@po_outStatus", SqlDbType.Int)
                            { Direction = ParameterDirection.Output }
                    };
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[3].Value?.ToString() ?? "";
                    _intSum = parameters[4].Value?.ToString() ?? "-1";
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
                    var dto = new
                    {
                        message = _strMsg,
                        status = result,
                        tracBarcode = query.ZsBar
                    };
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    /// <summary>
    ///     èŽ·å–å¡æ¿ä¿¡æ¯
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    public dynamic getKbBarInfo(dynamic query)
    {
        if (string.IsNullOrEmpty(query.Kbbarcode?.ToString()))
            throw new ArgumentException("卡板条码不允许为空", nameof(query.userName));
        var sql = string.Format(@"SELECT OLDQTY,
       ISNULL((SELECT COUNT(1) FROM MES_INV_ITEM_BARCODES_TBMX WHERE ABOUT_TB_BARCODE = '{0}'), 0) AS YSum,
       DAA001
FROM MES_INV_ITEM_BARCODES A LEFT JOIN WOMDAA B ON A.ABOUT_GUID = B.guid
WHERE ITEM_BARCODE = '{0}' ", query.Kbbarcode);
        var ZsBarInfo = Db.Ado.SqlQuery<dynamic>(sql);
        if (ZsBarInfo.Count < 1)
            throw new Exception($"该卡板码{query.Zsbarcode}不存在!");
        return ZsBarInfo;
    }
    /// <summary>
    ///     èŽ·å–å¡æ¿æ˜Žç»†ä¿¡æ¯
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    public dynamic getKbBarMxInfo(dynamic query)
    {
        var sql = string.Format(
            @"SELECT ITEM_BARCODE, QUANTITY,item_no,item_name,item_model,weight
FROM MES_INV_ITEM_BARCODES_TBMX A
         LEFT JOIN WOMDAA B ON B.daa001 = A.DAA_001
        LEFT JOIN MES_ITEMS C ON C.item_id = B.daa002
WHERE ABOUT_TB_BARCODE = '{0}' ", query.Kbbarcode);
        var ZsBarInfo = Db.Ado.SqlQuery<dynamic>(sql);
        return ZsBarInfo;
    }
    /// <summary>
    ///     èŽ·å–ç®±æ˜Žç»†ä¿¡æ¯
    /// </summary>
    /// <param name="query"></param>
    /// <returns></returns>
    public dynamic getXBarInfo(dynamic query)
    {
        //var sql1 = string.Format(@"SELECT 1 FROM MES_INV_ITEM_BARCODES_TBMX WHERE  ITEM_BARCODE = '{0}' ", query.Xbarcode);
        //var IS_CZ = Db.Ado.SqlQuery<dynamic>(sql1);
        //if (IS_CZ.Count < 1)
        //{
        //    throw new Exception($"该箱条码[{query.Xbarcode}]不存在!");
        //}
        // æ ¡éªŒå­˜å‚¨è¿‡ç¨‹
        if (string.IsNullOrEmpty(query.KbBar?.ToString()))
            throw new ArgumentException("卡板条码不允许为空", nameof(query.KbBar));
        // æ ¡éªŒå­˜å‚¨è¿‡ç¨‹
        if (string.IsNullOrEmpty(query.Xbarcode?.ToString()))
            throw new ArgumentException("箱条码不允许为空", nameof(query.Xbarcode));
        var successRecords = new List<dynamic>();
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            conn.Open();
            using (var transaction = conn.BeginTransaction()) // å¼€å¯äº‹åŠ¡
            {
                try
                {
                    using (var cmd = new SqlCommand("prc_pda_Xbar_binding_JY",
                               conn, transaction))
                    {
                        cmd.CommandType = CommandType.StoredProcedure;
                        SqlParameter[] parameters =
                        {
                            new("@pi_user", SqlDbType.NVarChar, 100)
                                { Value = query.userName },
                            new("@pi_kb_barcode", SqlDbType.NVarChar, 100)
                                { Value = query.KbBar },
                            new("@pi_ls_barcode", SqlDbType.NVarChar, 100)
                                { Value = query.Xbarcode },
                            new("@po_outMsg", SqlDbType.NVarChar, 2000)
                                { Direction = ParameterDirection.Output },
                            new("@po_outStatus", SqlDbType.Int)
                                { Direction = ParameterDirection.Output }
                        };
                        foreach (var parameter in parameters)
                            cmd.Parameters.Add(parameter);
                        cmd.ExecuteNonQuery();
                        var _strMsg = parameters[3].Value?.ToString() ?? "";
                        var _intSum = parameters[4].Value?.ToString() ?? "-1";
                        var result = Convert.ToInt32(_intSum);
                        if (result <= 0)
                            //transaction.Rollback();
                            throw new Exception(_strMsg);
                        //return new {
                        //    status = result,
                        //    message = $"操作回滚:{_strMsg}",
                        //    failedBarcode = xBar.iteM_BARCODE,
                        //    successCount = successRecords.Count
                        //};
                    }
                    transaction.Commit(); // å…¨éƒ¨æˆåŠŸæäº¤äº‹åŠ¡
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw new Exception($"异常信息  ï¼š{ex.Message}");
                }
                finally
                {
                    conn.Close();
                }
            }
        }
        var sql2 = string.Format(
            @"SELECT ITEM_BARCODE, QUANTITY,item_no,item_name,item_model,'0' as is_hedui
FROM MES_INV_ITEM_BARCODES_TBMX A
         LEFT JOIN WOMDAA B ON B.daa001 = A.DAA_001
         LEFT JOIN MES_ITEMS C ON C.item_id = B.daa002
WHERE DAA_001 = '{0}'
  AND ITEM_BARCODE = '{1}'
  AND ISNULL(ABOUT_TB_BARCODE, '') = '' ", query.DAA001, query.Xbarcode);
        var ZsBarInfo = Db.Ado.SqlQuery<dynamic>(sql2);
        if (ZsBarInfo.Count < 1)
            throw new Exception(
                $"该箱条码[{query.Xbarcode}]对应工单与托码工单[{query.DAA001}]不匹配或已绑定托码!");
        return ZsBarInfo;
    }
    public dynamic submitAllChecked(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.KbBar?.ToString()))
            throw new ArgumentException("卡板条码不允许为空", nameof(query.KbBar));
        if (query.XbarInfo == null || !((IEnumerable<dynamic>)query.XbarInfo)
                .GetEnumerator().MoveNext())
            throw new ArgumentException("箱码列表不能为空", nameof(query.XbarInfo));
        var successRecords = new List<dynamic>();
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            conn.Open();
            using (var transaction = conn.BeginTransaction()) // å¼€å¯äº‹åŠ¡
            {
                try
                {
                    foreach (var xBar in query.XbarInfo) // éåŽ†ç®±ç é›†åˆ
                        using (var cmd = new SqlCommand("prc_pda_Xbar_binding",
                                   conn, transaction))
                        {
                            cmd.CommandType = CommandType.StoredProcedure;
                            SqlParameter[] parameters =
                            {
                                new("@pi_user", SqlDbType.NVarChar, 100)
                                    { Value = query.userName },
                                new("@pi_kb_barcode", SqlDbType.NVarChar, 100)
                                    { Value = query.KbBar },
                                new("@pi_ls_barcode", SqlDbType.NVarChar, 100)
                                    { Value = xBar.iteM_BARCODE },
                                new("@po_outMsg", SqlDbType.NVarChar, 2000)
                                    { Direction = ParameterDirection.Output },
                                new("@po_outStatus", SqlDbType.Int)
                                    { Direction = ParameterDirection.Output }
                            };
                            foreach (var parameter in parameters)
                                cmd.Parameters.Add(parameter);
                            cmd.ExecuteNonQuery();
                            var _strMsg = parameters[3].Value?.ToString() ?? "";
                            var _intSum = parameters[4].Value?.ToString() ??
                                          "-1";
                            var result = Convert.ToInt32(_intSum);
                            if (result <= 0)
                                //transaction.Rollback();
                                throw new Exception(_strMsg);
                            //return new {
                            //    status = result,
                            //    message = $"操作回滚:{_strMsg}",
                            //    failedBarcode = xBar.iteM_BARCODE,
                            //    successCount = successRecords.Count
                            //};
                            successRecords.Add(new
                            {
                                kbBarcode = query.KbBar,
                                xBarcode = xBar.iteM_BARCODE,
                                processTime =
                                    DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                            });
                        }
                    transaction.Commit(); // å…¨éƒ¨æˆåŠŸæäº¤äº‹åŠ¡
                    return new
                    {
                        status = 1,
                        message = "批量绑定成功",
                        successCount = successRecords.Count,
                        details = successRecords
                    };
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw new Exception($"异常信息  ï¼š{ex.Message}");
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    public dynamic SubmitKbInspection(dynamic query)
    {
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为 null");
        // å‚数校验
        if (string.IsNullOrEmpty(query.userAccount?.ToString()))
            throw new ArgumentException("用户名不允许为空", nameof(query.userAccount));
        if (string.IsNullOrEmpty(query.KbBar?.ToString()))
            throw new ArgumentException("卡板条码不允许为空", nameof(query.KbBar));
        var _strMsg = "";
        var _status = -1;
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd =
                   new SqlCommand("prc_pda_KBbar_submitInspection", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@pi_user", SqlDbType.NVarChar, 100)
                            { Value = query.userAccount },
                        new("@pi_kb_barcode", SqlDbType.NVarChar, 100)
                            { Value = query.KbBar },
                        new("@po_outMsg", SqlDbType.NVarChar, 2000)
                            { Direction = ParameterDirection.Output },
                        new("@po_outStatus", SqlDbType.Int)
                            { Direction = ParameterDirection.Output }
                    };
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[2].Value?.ToString() ?? "";
                    _status = Convert.ToInt32(parameters[3].Value ?? -1);
                    if (_status <= 0) throw new Exception(_strMsg);
                    return new
                    {
                        message = _strMsg,
                        status = _status,
                        kbBarcode = query.KbBar
                    };
                }
                catch (Exception ex)
                {
                    throw new Exception($"卡板送检失败:{ex.Message}");
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    //根据工单号返回产品型号和待领物料
    public XcslResultDto GetItemsXcsl(WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.daa001)) throw new Exception("工单号为空");
        var womdaa = Db.Queryable<Womdaa, MesItems>((a, i) =>
                new JoinQueryInfos(JoinType.Left,
                    a.Daa002 == i.ItemId.ToString()))
            .Where((a, i) => a.Daa001 == query.daa001
                             && a.Fstatus == 1)
            .Select((a, i) => new
            {
                a.Daa001,
                a.CaaGuid,
                a.Daa008,
                a.Daa021
            }).First();
        if (womdaa?.Daa001 == null) throw new Exception("工单号不存在");
        // ä½¿ç”¨å‚数化查询防止SQL注入
        var sqlParams = new List<SugarParameter>
            { new("@daa001", query.daa001) };
        var sql1 = @"SELECT A.item_out_no,
       SUM(B.QUANTITY)         AS BL_Num,
       ISNULL(Sub.JS_Sum, 0) AS JS_Num, -- ä½¿ç”¨LEFT JOIN子查询的结果
       C.item_no,
       C.item_name,
       C.item_model,
       D.USER_NAME
FROM MES_INV_ITEM_OUTS A
         LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B ON A.GUID = B.ITEM_OUT_ID
         LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
         LEFT JOIN SYS_USER D ON A.create_by = D.ACCOUNT
-- æ–°å¢žLEFT JOIN聚合子查询
         LEFT JOIN (SELECT B1.ITEM_ID,
                           SUM(B1.QUANTITY) AS JS_Sum
                    FROM MES_INV_ITEM_OUTS A1
                             LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B1 ON A1.GUID = B1.ITEM_OUT_ID
                    WHERE A1.out_type = '生产领料'
                      AND A1.task_no = @daa001
                      AND ISNULL(B1.IS_XCSL, '0') = 1
                    GROUP BY B1.ITEM_ID -- æŒ‰ITEM_ID提前聚合
) AS Sub ON Sub.ITEM_ID = C.item_id
WHERE A.out_type = '生产领料'
  AND A.task_no = @daa001
GROUP BY A.item_out_no,
         C.item_no,
         C.item_name,
         C.item_model,
         D.USER_NAME,
         C.item_id,
         ISNULL(Sub.JS_Sum, 0);";
        var XcslItem = Db.Ado.SqlQuery<dynamic>(sql1, sqlParams);
        var sql2 =
            @"SELECT B.ITEM_BARCODE ,B.QUANTITY,C.item_no,C.item_name,D.USER_NAME,A.create_date
FROM MES_INV_ITEM_OUTS A
LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B ON A.GUID = B.ITEM_OUT_ID
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
LEFT JOIN SYS_USER D ON A.create_by = D.ACCOUNT
WHERE out_type = '生产领料'
AND A.task_no = @daa001
AND ISNULL(IS_XCSL,'0') = 0";
        var XcslWjsBar = Db.Ado.SqlQuery<dynamic>(sql2, sqlParams);
        var sql3 =
            @"SELECT B.ITEM_BARCODE ,B.QUANTITY,C.item_no,C.item_name,D.USER_NAME,B.XCSL_CREATE_DATE
FROM MES_INV_ITEM_OUTS A
LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B ON A.GUID = B.ITEM_OUT_ID
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
LEFT JOIN SYS_USER D ON B.XCSL_CREATE_BY = D.ACCOUNT
WHERE out_type = '生产领料'
AND A.task_no = @daa001
AND ISNULL(IS_XCSL,'0') = 1";
        var XcslYjsBar = Db.Ado.SqlQuery<dynamic>(sql3, sqlParams);
        var dto = new XcslResultDto
        {
            GD_Num = womdaa.Daa008,
            workNo = womdaa.Daa021,
            XcslItemList = XcslItem,
            XcslWjsBarList = XcslWjsBar,
            XcslYjsBarList = XcslYjsBar
        };
        return dto;
    }
    public dynamic ScanXcsl(dynamic query)
    {
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为 null");
        // å‚数校验(根据存储过程新增参数)
        if (string.IsNullOrEmpty(query.userAccount?.ToString()))
            throw new ArgumentException("用户名不允许为空", nameof(query.userAccount));
        if (string.IsNullOrEmpty(query.Bar?.ToString()))
            throw new ArgumentException("物料条码不允许为空", nameof(query.Bar));
        if (string.IsNullOrEmpty(query.DAA001?.ToString()))
            throw new ArgumentException("工单单号不允许为空", nameof(query.DAA001));
        var _strMsg = "";
        var _status = -1;
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("prc_pda_ScanXcsl", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    // æ ¹æ®å­˜å‚¨è¿‡ç¨‹è°ƒæ•´å‚数顺序和命名
                    SqlParameter[] parameters =
                    {
                        new("@pi_user", SqlDbType.NVarChar, 100)
                            { Value = query.userAccount },
                        new("@pi_barcode", SqlDbType.NVarChar, 100)
                            { Value = query.Bar },
                        new("@pi_daa001", SqlDbType.NVarChar, 100)
                            { Value = query.DAA001 },
                        new("@po_outMsg", SqlDbType.NVarChar, 2000)
                            { Direction = ParameterDirection.Output },
                        new("@po_outStatus", SqlDbType.Int)
                            { Direction = ParameterDirection.Output }
                    };
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[3].Value?.ToString() ?? "";
                    _status = Convert.ToInt32(parameters[4].Value ?? -1);
                    if (_status <= 0) throw new Exception(_strMsg);
                    return new
                    {
                        message = _strMsg,
                        status = _status,
                        daa001 = query.DAA001,
                        barCode = query.Bar
                    };
                }
                catch (Exception ex)
                {
                    throw new Exception($"产线收料失败:{ex.Message}");
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    public dynamic GetWeightByXt(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.LsBar?.ToString()))
            throw new ArgumentException("卡板条码不允许为空", nameof(query.LsBar));
        var _strMsg = "";
        var _status = -1;
        var _weight = "0";
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("prc_pda_Xbar_chenzhong", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        new("@pi_user", SqlDbType.NVarChar, 100)
                            { Value = query.userName },
                        new("@pi_ls_barcode", SqlDbType.NVarChar, 100)
                            { Value = query.LsBar },
                        new("@po_outMsg", SqlDbType.NVarChar, 2000)
                            { Direction = ParameterDirection.Output },
                        new("@po_outStatus", SqlDbType.Int)
                            { Direction = ParameterDirection.Output },
                        new("@po_outWeight", SqlDbType.NVarChar, 100)
                            { Direction = ParameterDirection.Output }
                    };
                    cmd.Parameters.AddRange(parameters);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[2].Value?.ToString() ?? "";
                    _status = Convert.ToInt32(parameters[3].Value ?? -1);
                    _weight = parameters[4].Value?.ToString() ?? "0";
                    if (_status <= 0) throw new Exception(_strMsg);
                    return new
                    {
                        message = _strMsg,
                        status = _status,
                        weight = _weight,
                        barCode = query.Bar
                    };
                }
                catch (Exception ex)
                {
                    throw new Exception($"产品称重失败:{ex.Message}");
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    public dynamic GetXcslDaa(dynamic unity)
    {
        var sqlParams = new List<SugarParameter>();
        var sql2 = new StringBuilder(@"
        SELECT daahb001 as daaInfo,daahb001 as daa001
        FROM WOMDAAHB
        WHERE FSTATUS = 1 and COMPLETE_STATUS=0 and order_type = '委外工单'");
        if (!string.IsNullOrWhiteSpace(unity.selectKey?.ToString()))
        {
            sqlParams.Add(new("@selectKey", unity.selectKey));
            sql2.Append(@"
            AND (DAAHB001 LIKE '%' + @selectKey + '%' ");
        }
        var XcslItem = Db.Ado.SqlQuery<dynamic>(sql2.ToString(), sqlParams);
        if (XcslItem == null) throw new Exception("该条件下无对应工单信息,请重新输入!");
        return XcslItem;
    }
    public XcslResultDto GetItemsXctl(WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.daa001)) throw new Exception("工单号为空");
        var womdaa = Db.Queryable<Womdaa, MesItems>((a, i) =>
                new JoinQueryInfos(JoinType.Left,
                    a.Daa002 == i.ItemId.ToString()))
            .Where((a, i) => a.Daa001 == query.daa001
                             && a.Fstatus == 1)
            .Select((a, i) => new
            {
                a.Daa001,
                a.CaaGuid,
                a.Daa008,
                a.Daa021
            }).First();
        if (womdaa?.Daa001 == null) throw new Exception("工单号不存在");
        // ä½¿ç”¨å‚数化查询防止SQL注入
        var sqlParams = new List<SugarParameter>
            { new("@daa001", query.daa001) };
        var sql1 = @"SELECT A.item_out_no,
       SUM(B.QUANTITY)          AS BL_Num,
       ISNULL(SL_SUM.JS_Sum, 0) AS JS_Num,
       ISNULL(TL_SUM.JS_Sum, 0) AS TR_Num,
       C.item_no,
       C.item_name,
       C.item_model
FROM MES_INV_ITEM_OUTS A
         LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B ON A.GUID = B.ITEM_OUT_ID
         LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
         LEFT JOIN SYS_USER D ON A.create_by = D.ACCOUNT
         LEFT JOIN (SELECT B1.ITEM_ID,
                           SUM(B1.QUANTITY) AS JS_Sum
                    FROM MES_INV_ITEM_OUTS A1
                             LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B1 ON A1.GUID = B1.ITEM_OUT_ID
                    WHERE A1.out_type = '生产领料'
                      AND A1.task_no = @daa001
                      AND ISNULL(B1.IS_XCSL, '0') = 1
                    GROUP BY B1.ITEM_ID
) AS SL_SUM ON SL_SUM.ITEM_ID = C.item_id
         LEFT JOIN (SELECT B1.ITEM_ID,
                           SUM(B1.QUANTITY) AS JS_Sum
                    FROM MES_INV_ITEM_OUTS A1
                             LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B1 ON A1.GUID = B1.ITEM_OUT_ID
                    WHERE A1.out_type = '生产领料'
                      AND A1.task_no = @daa001
                      AND ISNULL(B1.IS_CXTR, '0') = 1
                    GROUP BY B1.ITEM_ID
) AS TL_SUM ON TL_SUM.ITEM_ID = C.item_id
WHERE A.out_type = '生产领料'
  AND A.task_no = @daa001
GROUP BY A.item_out_no,
         C.item_no,
         C.item_name,
         C.item_model,
         D.USER_NAME,
         C.item_id,
         ISNULL(SL_SUM.JS_Sum, 0),
         ISNULL(TL_SUM.JS_Sum, 0);";
        var XcslItem = Db.Ado.SqlQuery<dynamic>(sql1, sqlParams);
        var sql2 =
            @"SELECT B.ITEM_BARCODE ,B.QUANTITY,C.item_no,C.item_name,D.USER_NAME,A.create_date
FROM MES_INV_ITEM_OUTS A
LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B ON A.GUID = B.ITEM_OUT_ID
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
LEFT JOIN SYS_USER D ON A.create_by = D.ACCOUNT
WHERE out_type = '生产领料'
AND A.task_no = @daa001
AND ISNULL(IS_CXTR,'0') = 0";
        var XcslWjsBar = Db.Ado.SqlQuery<dynamic>(sql2, sqlParams);
        var sql3 =
            @"SELECT B.ITEM_BARCODE ,B.QUANTITY,C.item_no,C.item_name,D.USER_NAME,B.CXTR_CREATE_DATE
FROM MES_INV_ITEM_OUTS A
LEFT JOIN MES_INV_ITEM_OUT_C_DETAILS B ON A.GUID = B.ITEM_OUT_ID
LEFT JOIN MES_ITEMS C ON B.ITEM_ID = C.item_id
LEFT JOIN SYS_USER D ON B.CXTR_CREATE_BY = D.ACCOUNT
WHERE out_type = '生产领料'
AND A.task_no = @daa001
AND ISNULL(IS_CXTR,'0') = 1";
        var XcslYjsBar = Db.Ado.SqlQuery<dynamic>(sql3, sqlParams);
        var dto = new XcslResultDto
        {
            GD_Num = womdaa.Daa008,
            workNo = womdaa.Daa021,
            XcslItemList = XcslItem,
            XcslWjsBarList = XcslWjsBar,
            XcslYjsBarList = XcslYjsBar
        };
        return dto;
    }
    public dynamic ScanXctl(dynamic query)
    {
        if (query == null)
            throw new ArgumentNullException(nameof(query), "参数对象不能为 null");
        // å‚数校验(根据存储过程新增参数)
        if (string.IsNullOrEmpty(query.userAccount?.ToString()))
            throw new ArgumentException("用户名不允许为空", nameof(query.userAccount));
        if (string.IsNullOrEmpty(query.Bar?.ToString()))
            throw new ArgumentException("物料条码不允许为空", nameof(query.Bar));
        if (string.IsNullOrEmpty(query.DAA001?.ToString()))
            throw new ArgumentException("工单单号不允许为空", nameof(query.DAA001));
        var _strMsg = "";
        var _status = -1;
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            using (var cmd = new SqlCommand("prc_pda_ScanXctl", conn))
            {
                try
                {
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    // æ ¹æ®å­˜å‚¨è¿‡ç¨‹è°ƒæ•´å‚数顺序和命名
                    SqlParameter[] parameters =
                    {
                        new("@pi_user", SqlDbType.NVarChar, 100)
                            { Value = query.userAccount },
                        new("@pi_barcode", SqlDbType.NVarChar, 100)
                            { Value = query.Bar },
                        new("@pi_daa001", SqlDbType.NVarChar, 100)
                            { Value = query.DAA001 },
                        new("@po_outMsg", SqlDbType.NVarChar, 2000)
                            { Direction = ParameterDirection.Output },
                        new("@po_outStatus", SqlDbType.Int)
                            { Direction = ParameterDirection.Output }
                    };
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[3].Value?.ToString() ?? "";
                    _status = Convert.ToInt32(parameters[4].Value ?? -1);
                    if (_status <= 0) throw new Exception(_strMsg);
                    return new
                    {
                        message = _strMsg,
                        status = _status,
                        daa001 = query.DAA001,
                        barCode = query.Bar
                    };
                }
                catch (Exception ex)
                {
                    throw new Exception($"产线收料失败:{ex.Message}");
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    // çŽ°åœºæ”¶æ–™å±•ç¤ºåˆ—è¡¨
    public class XcslResultDto
    {
        public int? GD_Num { get; set; }
        public string? workNo { get; set; }
        public List<dynamic> XcslItemList { get; set; }
        public List<dynamic> XcslWjsBarList { get; set; }
        public List<dynamic> XcslYjsBarList { get; set; }
    }
}