11
啊鑫
2024-12-30 250ae3deeabd8e0818f4adf57f747b71fefd5ef3
11
已添加6个文件
已修改2个文件
1411 ■■■■■ 文件已修改
Controllers/Warehouse/MesItemQtController.cs 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/TransferOutController.cs 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesInvItemMoves.cs 172 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesInvItemMovesCDetails.cs 250 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/TransferOut.cs 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/TransferOutEtail.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemQtManager.cs 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/TransferOutManager.cs 381 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesItemQtController.cs
@@ -7,7 +7,7 @@
namespace NewPdaSqlServer.Controllers.Warehouse;
/// <summary>
/// å…¶ä»–出库相关接口
///     å…¶ä»–出库相关接口
/// </summary>
[Route("api/[controller]")]
[ApiController]
@@ -18,7 +18,7 @@
    #region åŸºç¡€CRUD
    /// <summary>
    /// èŽ·å–æ‰€æœ‰
    ///     èŽ·å–æ‰€æœ‰
    /// </summary>
    /// <returns>其他出库单列表</returns>
    [HttpPost("GetList")]
@@ -46,11 +46,11 @@
    #region å…¶ä»–出库业务
    /// <summary>
    /// èŽ·å–æœªå®Œæˆçš„é€€æ–™å•å·åˆ—è¡¨
    ///     èŽ·å–æœªå®Œæˆçš„é€€æ–™å•å·åˆ—è¡¨
    /// </summary>
    /// <returns>退料单号列表</returns>
    /// <remarks>
    /// èŽ·å–çŠ¶æ€ä¸ºå·²å®¡æ ¸(Qt015=true)且未完结(Qt014=false)的退料单号列表
    ///     èŽ·å–çŠ¶æ€ä¸ºå·²å®¡æ ¸(Qt015=true)且未完结(Qt014=false)的退料单号列表
    /// </remarks>
    /// <response code="200">成功获取退料单号列表</response>
    /// <response code="400">获取失败</response>
@@ -75,25 +75,24 @@
    }
    /// <summary>
    /// èŽ·å–å¾…å¤„ç†çš„é€€æ–™å•æ˜Žç»†åˆ—è¡¨
    ///     èŽ·å–å¾…å¤„ç†çš„é€€æ–™å•æ˜Žç»†åˆ—è¡¨
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>待处理的退料单明细列表</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesItemQt/GetPendingQtList
    ///     {
    ///         "userName": "admin",      // ç”¨æˆ·å(必填)
    ///         "billNo": "QT20240101001" // é€€æ–™å•号(必填)
    ///     "userName": "admin",      // ç”¨æˆ·å(必填)
    ///     "billNo": "QT20240101001" // é€€æ–™å•号(必填)
    ///     }
    ///
    /// è¿”回未完成的明细记录(Qd007-Qd008>0)
    ///     è¿”回未完成的明细记录(Qd007-Qd008>0)
    /// </remarks>
    /// <response code="200">成功获取退料单明细</response>
    /// <response code="400">获取失败,返回具体错误信息</response>
    [HttpPost("GetPendingQtDetailList")]
    public ResponseResult GetPendingQtDetailList([FromBody] WarehouseQuery query)
    public ResponseResult GetPendingQtDetailList(
        [FromBody] WarehouseQuery query)
    {
        try
        {
@@ -113,24 +112,22 @@
    }
    /// <summary>
    /// æ‰«ææ¡ç å‡ºåº“
    ///     æ‰«ææ¡ç å‡ºåº“
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>出库结果、待处理明细和提示消息</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesItemQt/OutScanBarcode
    ///     {
    ///         "billNo": "QT20240101001",  // é€€æ–™å•号(必填)
    ///         "barcode": "BC001",         // æ¡ç å·(必填)
    ///         "userName": "admin"         // ç”¨æˆ·å(必填)
    ///     "billNo": "QT20240101001",  // é€€æ–™å•号(必填)
    ///     "barcode": "BC001",         // æ¡ç å·(必填)
    ///     "userName": "admin"         // ç”¨æˆ·å(必填)
    ///     }
    ///
    /// è¿”回数据包含:
    /// - form: å¤„理结果表单
    /// - item: å¾…处理明细列表
    /// - message: å¤„理结果消息
    ///     è¿”回数据包含:
    ///     - form: å¤„理结果表单
    ///     - item: å¾…处理明细列表
    ///     - message: å¤„理结果消息
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
@@ -158,25 +155,23 @@
    }
    /// <summary>
    /// æ‰“印条码出库
    ///     æ‰“印条码出库
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>出库结果、待处理明细和提示消息</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesItemQt/PrintQtckBarcode
    ///     {
    ///         "userName": "admin",         // ç”¨æˆ·å(必填)
    ///         "billNo": "QT20240101001",   // é€€æ–™å•号(必填)
    ///         "barcode": "BC001",          // æ¡ç å·(必填)
    ///         "Fum": 10                    // å‘料数量(必填,必须大于0)
    ///     "userName": "admin",         // ç”¨æˆ·å(必填)
    ///     "billNo": "QT20240101001",   // é€€æ–™å•号(必填)
    ///     "barcode": "BC001",          // æ¡ç å·(必填)
    ///     "Fum": 10                    // å‘料数量(必填,必须大于0)
    ///     }
    ///
    /// è¿”回数据包含:
    /// - form: å¤„理结果表单
    /// - item: å¾…处理明细列表
    /// - message: å¤„理结果消息
    ///     è¿”回数据包含:
    ///     - form: å¤„理结果表单
    ///     - item: å¾…处理明细列表
    ///     - message: å¤„理结果消息
    /// </remarks>
    /// <response code="200">打印成功</response>
    /// <response code="400">打印失败,返回具体错误信息</response>
Controllers/Warehouse/TransferOutController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
using System.Dynamic;
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.service.Warehouse;
using NewPdaSqlServer.util;
namespace NewPdaSqlServer.Controllers.Warehouse;
/// <summary>
/// è°ƒæ‹¨å‡ºåº“相关接口
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class TransferOutController : ControllerBase
{
    private readonly TransferOutManager _manager = new();
    #region åŸºç¡€CRUD
    /// <summary>
    /// èŽ·å–æ‰€æœ‰è°ƒæ‹¨å‡ºåº“å•
    /// </summary>
    /// <returns>调拨出库单列表</returns>
    [HttpPost("GetList")]
    public ResponseResult GetList()
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetList();
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
    #region è°ƒæ‹¨å‡ºåº“业务
    /// <summary>
    /// èŽ·å–æœªå®Œæˆçš„è°ƒæ‹¨å‡ºåº“å•å·åˆ—è¡¨
    /// </summary>
    /// <returns>未完成的调拨出库单号列表</returns>
    /// <remarks>
    /// èŽ·å–ç”³è¯·æ•°é‡(sq)不等于已扫数量(ys)的调拨出库单号列表
    /// </remarks>
    /// <response code="200">成功获取调拨出库单号列表</response>
    /// <response code="400">获取失败</response>
    [HttpPost("GetTransferOutNoList")]
    public ResponseResult GetTransferOutNoList()
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetTransferOutNoList();
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// æ ¹æ®å•据号获取待处理的调拨出库明细列表
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     POST /api/TransferOut/GetTransferOutDetailListByBillNo
    ///     {
    ///         "billNo": "DB202401010001"  // è°ƒæ‹¨å•号(必填)
    ///     }
    ///
    /// è¿”回未完成的明细记录(ShNum-YsNum>0),包含:
    /// - ItemNo: ç‰©æ–™ç¼–号
    /// - ItemModel: ç‰©æ–™è§„æ ¼
    /// - ShNum: ç”³è¯·æ•°é‡
    /// - YsNum: å·²æ‰«æ•°é‡
    /// </remarks>
    /// <response code="200">成功获取调拨出库明细</response>
    /// <response code="400">获取失败,返回具体错误信息</response>
    [HttpPost("GetTransferOutDetailListByBillNo")]
    public ResponseResult GetTransferOutDetailListByBillNo([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetTransferOutDetailListByBillNo(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>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     POST /api/TransferOut/ScanMoveBarcode
    ///     {
    ///         "billNo": "DB202401010001",  // è°ƒæ‹¨å•号(必填)
    ///         "userName": "admin",          // ç”¨æˆ·å(必填)
    ///         "barcode": "BC001"           // æ¡ç å·(必填)
    ///     }
    ///
    /// ä¸šåŠ¡å¤„ç†ï¼š
    /// - éªŒè¯è°ƒæ‹¨å•状态
    /// - éªŒè¯æ¡ç åº“存信息
    /// - éªŒè¯ä»“库一致性
    /// - éªŒè¯æ•°é‡æ˜¯å¦è¶…出未扫数量
    /// - æ‰§è¡Œè°ƒæ‹¨å‡ºåº“事务处理
    ///
    /// è¿”回数据包含:
    /// - form: å¤„理结果表单
    /// - items: å¾…处理明细列表
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
    [HttpPost("ScanMoveBarcode")]
    public ResponseResult ScanMoveBarcode([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (form, items) = _manager.ScanMoveBarcode(query);
            resultInfos.form = form;
            resultInfos.items = items;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
}
entity/MesInvItemMoves.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,172 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
/// </summary>
[SugarTable("MES_INV_ITEM_MOVES")]
public class MesInvItemMoves
{
    /// <summary>
    ///     é»˜è®¤å€¼: (newid())
    /// </summary>
    [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
    /// <summary>
    ///     ç§»åº“单号
    /// </summary>
    [SugarColumn(ColumnName = "bill_no")]
    public string? BillNo { get; set; }
    /// <summary>
    ///     ç§»å…¥å­åº“id
    /// </summary>
    [SugarColumn(ColumnName = "inv_depots_id")]
    public int? InvDepotsId { get; set; }
    /// <summary>
    ///     ç§»å…¥è´§ä½id
    /// </summary>
    [SugarColumn(ColumnName = "inv_depot_sections_id")]
    public int? InvDepotSectionsId { get; set; }
    /// <summary>
    ///     åˆ›å»ºäºº
    /// </summary>
    [SugarColumn(ColumnName = "create_by")]
    public string? CreateBy { get; set; }
    /// <summary>
    ///     åˆ›å»ºæ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "create_date")]
    public DateTime? CreateDate { get; set; }
    /// <summary>
    ///     æœ€åŽæ›´æ–°äºº
    /// </summary>
    [SugarColumn(ColumnName = "lastupdate_by")]
    public string? LastupdateBy { get; set; }
    /// <summary>
    ///     æœ€åŽæ›´æ–°æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "lastupdate_date")]
    public DateTime? LastupdateDate { get; set; }
    /// <summary>
    ///     çŠ¶æ€|0-制单1-过账
    /// </summary>
    [SugarColumn(ColumnName = "status")]
    public int? Status { get; set; }
    /// <summary>
    ///     å¤‡æ³¨
    /// </summary>
    [SugarColumn(ColumnName = "remark")]
    public string? Remark { get; set; }
    /// <summary>
    ///     å•据类型ID
    /// </summary>
    [SugarColumn(ColumnName = "bill_type_id")]
    public int? BillTypeId { get; set; }
    /// <summary>
    ///     äº‹åŠ¡ç±»åž‹ID
    /// </summary>
    [SugarColumn(ColumnName = "transaction_id")]
    public int? TransactionId { get; set; }
    /// <summary>
    ///     å®¡æ ¸äºº
    /// </summary>
    [SugarColumn(ColumnName = "checkuser")]
    public string? Checkuser { get; set; }
    /// <summary>
    ///     å®¡æ ¸æ—¥æœŸ
    /// </summary>
    [SugarColumn(ColumnName = "checkdate")]
    public DateTime? Checkdate { get; set; }
    /// <summary>
    ///     äº‹åŠ¡ç±»åž‹ç¼–ç 
    /// </summary>
    [SugarColumn(ColumnName = "transaction_no")]
    public int? TransactionNo { get; set; }
    /// <summary>
    ///     ç§»å‡ºå­åº“id
    /// </summary>
    [SugarColumn(ColumnName = "from_depots_id")]
    public string? FromDepotsId { get; set; }
    /// <summary>
    ///     å·¥åŽ‚ç¼–ç 
    /// </summary>
    [SugarColumn(ColumnName = "factory_code")]
    public string? FactoryCode { get; set; }
    /// <summary>
    ///     SAP返回单据
    /// </summary>
    [SugarColumn(ColumnName = "sapno")]
    public string? Sapno { get; set; }
    /// <summary>
    ///     å·²å›žå†™SAP
    ///     é»˜è®¤å€¼: ((0))
    /// </summary>
    [SugarColumn(ColumnName = "sapstatus")]
    public int? Sapstatus { get; set; }
    /// <summary>
    ///     SAP返回年份
    /// </summary>
    [SugarColumn(ColumnName = "sapyear")]
    public int? Sapyear { get; set; }
    /// <summary>
    ///     SAP返回信息
    /// </summary>
    [SugarColumn(ColumnName = "saptext")]
    public string? Saptext { get; set; }
    /// <summary>
    ///     åˆ†åŽ‚ç¼–ç 
    /// </summary>
    [SugarColumn(ColumnName = "factory")]
    public string? Factory { get; set; }
    /// <summary>
    ///     å…¬å¸ä»£ç 
    /// </summary>
    [SugarColumn(ColumnName = "company")]
    public string? Company { get; set; }
    /// <summary>
    ///     åå®¡æ ¸äº‹åŠ¡ç±»åž‹ç¼–ç 
    /// </summary>
    [SugarColumn(ColumnName = "mtransaction_no")]
    public int? MtransactionNo { get; set; }
    /// <summary>
    ///     è‡ªåŠ¨ä¿å­˜å­—æ®µ
    /// </summary>
    [SugarColumn(ColumnName = "zd_num")]
    public int? ZdNum { get; set; }
    /// <summary>
    ///     æ˜¯å¦æŽ¨é€ERP1-是,2-否
    /// </summary>
    [SugarColumn(ColumnName = "ts")]
    public int? Ts { get; set; }
    /// <summary>
    ///     è°ƒæ‹¨å‡ºåº“申请单
    /// </summary>
    [SugarColumn(ColumnName = "TASK_NO")]
    public string? TaskNo { get; set; }
}
entity/MesInvItemMovesCDetails.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,250 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
/// </summary>
[SugarTable("MES_INV_ITEM_MOVES_C_DETAILS")]
public class MesInvItemMovesCDetails
{
    /// <summary>
    /// </summary>
    [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
    /// <summary>
    /// </summary>
    [SugarColumn(ColumnName = "item_move_guid")]
    public Guid? ItemMoveGuid { get; set; }
    /// <summary>
    ///     ç‰©æ–™æ¡ç 
    /// </summary>
    [SugarColumn(ColumnName = "item_barcode")]
    public string? ItemBarcode { get; set; }
    /// <summary>
    ///     å®¢æˆ·ç‰©æ–™ç¼–码(无条码手工录入,有条码为冗余字段)
    /// </summary>
    [SugarColumn(ColumnName = "c_item_code")]
    public string? CItemCode { get; set; }
    /// <summary>
    ///     ä¿¡åŽç‰©æ–™ç¼–码(无条码手工录入,有条码为冗余字段)
    /// </summary>
    [SugarColumn(ColumnName = "item_no")]
    public string? ItemNo { get; set; }
    /// <summary>
    ///     åŽ‚å®¶æ‰¹æ¬¡
    /// </summary>
    [SugarColumn(ColumnName = "lot_no")]
    public string? LotNo { get; set; }
    /// <summary>
    ///     æ•°é‡ï¼ˆæ— æ¡ç æ‰‹å·¥å½•入,有条码为冗余字段)
    /// </summary>
    [SugarColumn(ColumnName = "quantity")]
    public decimal? Quantity { get; set; }
    /// <summary>
    ///     å‡ºåº“方式(1:有条码,0:无条码)
    ///     é»˜è®¤å€¼: ((1))
    /// </summary>
    [SugarColumn(ColumnName = "barcode_flag")]
    public int? BarcodeFlag { get; set; }
    /// <summary>
    ///     çŽ¯ä¿æ ‡å¿—ï¼ˆæ— æ¡ç æ‰‹å·¥å½•å…¥ï¼Œæœ‰æ¡ç ä¸ºå†—ä½™å­—æ®µï¼‰
    ///     é»˜è®¤å€¼: ((1))
    /// </summary>
    [SugarColumn(ColumnName = "ep_flag")]
    public int? EpFlag { get; set; }
    /// <summary>
    ///     åˆ›å»ºäºº
    /// </summary>
    [SugarColumn(ColumnName = "create_by")]
    public string? CreateBy { get; set; }
    /// <summary>
    ///     åˆ›å»ºæ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "create_date")]
    public DateTime? CreateDate { get; set; }
    /// <summary>
    ///     æœ€åŽæ›´æ–°äºº
    /// </summary>
    [SugarColumn(ColumnName = "lastupdate_by")]
    public string? LastupdateBy { get; set; }
    /// <summary>
    ///     æœ€åŽæ›´æ–°æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "lastupdate_date")]
    public DateTime? LastupdateDate { get; set; }
    /// <summary>
    ///     å­åº“id
    /// </summary>
    [SugarColumn(ColumnName = "inv_depots_id")]
    public int? InvDepotsId { get; set; }
    /// <summary>
    ///     è´§ä½id
    /// </summary>
    [SugarColumn(ColumnName = "inv_depot_sections_id")]
    public int? InvDepotSectionsId { get; set; }
    /// <summary>
    ///     å®¢æˆ·ç¼–码
    /// </summary>
    [SugarColumn(ColumnName = "cust_no")]
    public string? CustNo { get; set; }
    /// <summary>
    ///     ä»»åŠ¡ä»¤å·
    /// </summary>
    [SugarColumn(ColumnName = "task_no")]
    public string? TaskNo { get; set; }
    /// <summary>
    ///     ç§»å‡ºä»“库编号
    /// </summary>
    [SugarColumn(ColumnName = "from_depots_code")]
    public string? FromDepotsCode { get; set; }
    /// <summary>
    ///     ç§»å‡ºåº“位编号
    /// </summary>
    [SugarColumn(ColumnName = "from_depot_sections_code")]
    public string? FromDepotSectionsCode { get; set; }
    /// <summary>
    ///     æ¡ç å¤‡æ³¨
    /// </summary>
    [SugarColumn(ColumnName = "remark")]
    public string? Remark { get; set; }
    /// <summary>
    ///     åˆ†åŽ‚ç¼–ç 
    /// </summary>
    [SugarColumn(ColumnName = "factory")]
    public string? Factory { get; set; }
    /// <summary>
    ///     å…¬å¸ä»£ç 
    /// </summary>
    [SugarColumn(ColumnName = "company")]
    public string? Company { get; set; }
    /// <summary>
    ///     ç®±å·
    /// </summary>
    [SugarColumn(ColumnName = "box_no")]
    public string? BoxNo { get; set; }
    /// <summary>
    ///     å¡æ¿å·
    /// </summary>
    [SugarColumn(ColumnName = "ko_no")]
    public string? KoNo { get; set; }
    /// <summary>
    ///     ç§»å…¥ä»“库编号
    /// </summary>
    [SugarColumn(ColumnName = "inv_depots_code")]
    public string? InvDepotsCode { get; set; }
    /// <summary>
    ///     ç§»å…¥åº“位编号
    /// </summary>
    [SugarColumn(ColumnName = "inv_depot_sections_code")]
    public string? InvDepotSectionsCode { get; set; }
    /// <summary>
    ///     è´¨æ£€ç»“æžœ
    /// </summary>
    [SugarColumn(ColumnName = "iqc_status")]
    public string? IqcStatus { get; set; }
    /// <summary>
    ///     å°è½¦ç¼–号
    /// </summary>
    [SugarColumn(ColumnName = "fcar")]
    public string? Fcar { get; set; }
    /// <summary>
    ///     å…¥åº“日期
    /// </summary>
    [SugarColumn(ColumnName = "indep_date")]
    public DateTime? IndepDate { get; set; }
    /// <summary>
    ///     å†»ç»“提交重检,0:冻结未提交重检,1:冻结并提交重检
    ///     é»˜è®¤å€¼: ((0))
    /// </summary>
    [SugarColumn(ColumnName = "visable_submit")]
    public int? VisableSubmit { get; set; }
    /// <summary>
    ///     æäº¤é‡æ£€äºº
    /// </summary>
    [SugarColumn(ColumnName = "visable_submit_by")]
    public string? VisableSubmitBy { get; set; }
    /// <summary>
    ///     æäº¤é‡æ£€æ—¶é—´
    /// </summary>
    [SugarColumn(ColumnName = "visable_submit_date")]
    public DateTime? VisableSubmitDate { get; set; }
    /// <summary>
    ///     äº§å“åž‹å·
    /// </summary>
    [SugarColumn(ColumnName = "board_style")]
    public string? BoardStyle { get; set; }
    /// <summary>
    ///     ä»»åŠ¡å•å·
    /// </summary>
    [SugarColumn(ColumnName = "work_no")]
    public string? WorkNo { get; set; }
    /// <summary>
    ///     ä»»åŠ¡å•è¡Œå·
    /// </summary>
    [SugarColumn(ColumnName = "work_line")]
    public int? WorkLine { get; set; }
    /// <summary>
    ///     ä¾›åº”商编号
    /// </summary>
    [SugarColumn(ColumnName = "supp_no")]
    public string? SuppNo { get; set; }
    /// <summary>
    ///     è°ƒå…¥
    /// </summary>
    [SugarColumn(ColumnName = "move_ok")]
    public int? MoveOk { get; set; }
    /// <summary>
    ///     ç‰©æ–™ID
    /// </summary>
    [SugarColumn(ColumnName = "item_id")]
    public int? ItemId { get; set; }
    /// <summary>
    ///     K3ID
    /// </summary>
    [SugarColumn(ColumnName = "EBELN_K3ID")]
    public long? EbelnK3id { get; set; }
    /// <summary>
    ///     è¡ŒK3ID
    /// </summary>
    [SugarColumn(ColumnName = "LINE_K3ID")]
    public long? LineK3id { get; set; }
}
entity/TransferOut.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,199 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
///     è°ƒæ‹¨å‡ºåº“主表
/// </summary>
[SugarTable("Transfer_Out")]
public class TransferOut
{
   /// <summary>
 ///     ä¸»é”®
 ///     é»˜è®¤å€¼: (newid())
 /// </summary>
 [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
   /// <summary>
 ///     å•据类型
 /// </summary>
 [SugarColumn(ColumnName = "bill_type_id")]
    public string BillTypeId { get; set; }
   /// <summary>
 ///     è°ƒæ‹¨æ–¹å‘
 /// </summary>
 [SugarColumn(ColumnName = "transfer_direct")]
    public string TransferDirect { get; set; }
   /// <summary>
 ///     è°ƒæ‹¨ç±»åž‹
 /// </summary>
 [SugarColumn(ColumnName = "transfer_biz_type")]
    public string TransferBizType { get; set; }
   /// <summary>
 ///     è°ƒå‡ºåº“存组织
 /// </summary>
 [SugarColumn(ColumnName = "stockoutorg_id")]
    public string StockoutorgId { get; set; }
   /// <summary>
 ///     è°ƒå…¥åº“存组织
 /// </summary>
 [SugarColumn(ColumnName = "stockorg_id")]
    public string StockorgId { get; set; }
   /// <summary>
 ///     è°ƒå‡ºè´§ä¸»ç±»åž‹
 /// </summary>
 [SugarColumn(ColumnName = "owner_type_out_id_head")]
    public string OwnerTypeOutIdHead { get; set; }
   /// <summary>
 ///     è°ƒå‡ºè´§ä¸»
 /// </summary>
 [SugarColumn(ColumnName = "owner_out_id_head")]
    public string OwnerOutIdHead { get; set; }
   /// <summary>
 ///     è°ƒå…¥è´§ä¸»ç±»åž‹
 /// </summary>
 [SugarColumn(ColumnName = "owner_type_id_head")]
    public string OwnerTypeIdHead { get; set; }
   /// <summary>
 ///     è°ƒå…¥è´§ä¸»
 /// </summary>
 [SugarColumn(ColumnName = "owner_id_head")]
    public string OwnerIdHead { get; set; }
   /// <summary>
 ///     é”€å”®ç»„织
 /// </summary>
 [SugarColumn(ColumnName = "saleorg_id")]
    public string SaleorgId { get; set; }
   /// <summary>
 ///     åˆ›å»ºäºº
 /// </summary>
 [SugarColumn(ColumnName = "create_by")]
    public string CreateBy { get; set; }
   /// <summary>
 ///     åˆ›å»ºæ—¶é—´
 /// </summary>
 [SugarColumn(ColumnName = "cteate_data")]
    public DateTime? CteateData { get; set; }
   /// <summary>
 ///     æœ€åŽæ›´æ–°äºº
 /// </summary>
 [SugarColumn(ColumnName = "lastupdate_by")]
    public string LastupdateBy { get; set; }
   /// <summary>
 ///     æœ€åŽæ›´æ–°æ—¶é—´
 /// </summary>
 [SugarColumn(ColumnName = "lastupdate_date")]
    public DateTime? LastupdateDate { get; set; }
   /// <summary>
 ///     å®¡æ ¸äºº
 /// </summary>
 [SugarColumn(ColumnName = "CHECK_USER")]
    public string CheckUser { get; set; }
   /// <summary>
 ///     å®¡æ ¸æ—¶é—´
 /// </summary>
 [SugarColumn(ColumnName = "CHECK_DATE")]
    public DateTime? CheckDate { get; set; }
   /// <summary>
 ///     å®¡æ ¸çŠ¶æ€
 ///     é»˜è®¤å€¼: ((0))
 /// </summary>
 [SugarColumn(ColumnName = "STATUS")]
    public int? Status { get; set; }
   /// <summary>
 ///     è°ƒæ‹¨ç±»åž‹ç¼–码
 /// </summary>
 [SugarColumn(ColumnName = "transferbiztype_no")]
    public string TransferbiztypeNo { get; set; }
   /// <summary>
 ///     è°ƒæ‹¨æ–¹å‘编码
 /// </summary>
 [SugarColumn(ColumnName = "transferdirect_no")]
    public string TransferdirectNo { get; set; }
   /// <summary>
 ///     è°ƒå‡ºä»“库
 /// </summary>
 [SugarColumn(ColumnName = "inv_code")]
    public string InvCode { get; set; }
   /// <summary>
 ///     è°ƒå‡ºä»“库名称
 /// </summary>
 [SugarColumn(ColumnName = "inv_name")]
    public string InvName { get; set; }
   /// <summary>
 ///     è°ƒå…¥ä»“库
 /// </summary>
 [SugarColumn(ColumnName = "from_code")]
    public string FromCode { get; set; }
   /// <summary>
 ///     è°ƒå…¥ä»“库名称
 /// </summary>
 [SugarColumn(ColumnName = "from_name")]
    public string FromName { get; set; }
   /// <summary>
 ///     è°ƒå‡ºåº“存组织ID
 /// </summary>
 [SugarColumn(ColumnName = "stockoutorgid_no")]
    public int? StockoutorgidNo { get; set; }
   /// <summary>
 ///     è°ƒå…¥åº“存组织ID
 /// </summary>
 [SugarColumn(ColumnName = "stockorgid_no")]
    public int? StockorgidNo { get; set; }
   /// <summary>
 ///     è°ƒæ‹¨ç”³è¯·å•
 /// </summary>
 [SugarColumn(ColumnName = "bill_no")]
    public string BillNo { get; set; }
   /// <summary>
 ///     å•据类型编码
 /// </summary>
 [SugarColumn(ColumnName = "billtypeid_no")]
    public string BilltypeidNo { get; set; }
   /// <summary>
 ///     å‡ºåº“仓库
 /// </summary>
 [SugarColumn(ColumnName = "ck_depot")]
    public int? CkDepot { get; set; }
   /// <summary>
 ///     å…¥åº“仓库
 /// </summary>
 [SugarColumn(ColumnName = "rk_depot")]
    public int? RkDepot { get; set; }
   /// <summary>
 ///     å®Œç»“标识
 ///     é»˜è®¤å€¼: ((0))
 /// </summary>
 [SugarColumn(ColumnName = "is_wc")]
    public int? IsWc { get; set; }
}
entity/TransferOutEtail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
///     è°ƒæ‹¨å‡ºåº“申请明细
/// </summary>
[SugarTable("Transfer_Out_DETAIL")]
public class TransferOutDetail
{
    /// <summary>
    ///     é»˜è®¤å€¼: (newid())
    /// </summary>
    [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
    /// <summary>
    /// </summary>
    [SugarColumn(ColumnName = "pid")]
    public Guid? Pid { get; set; }
    /// <summary>
    /// </summary>
    [SugarColumn(ColumnName = "item_id")]
    public int? ItemId { get; set; }
    /// <summary>
    ///     ç”³è¯·æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "sh_num")]
    public int? ShNum { get; set; }
    /// <summary>
    ///     å·²æ‰«æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "ys_num")]
    public int? YsNum { get; set; }
    /// <summary>
    /// </summary>
    [SugarColumn(ColumnName = "item_unit")]
    public string? ItemUnit { get; set; }
    /// <summary>
    ///     ç‰©æ–™åç§°
    /// </summary>
    [SugarColumn(ColumnName = "item_name")]
    public string? ItemName { get; set; }
    /// <summary>
    ///     ç‰©æ–™ç¼–码
    /// </summary>
    [SugarColumn(ColumnName = "item_no")]
    public string? ItemNo { get; set; }
    /// <summary>
    ///     è§„格型号
    /// </summary>
    [SugarColumn(ColumnName = "item_model")]
    public string? ItemModel { get; set; }
    /// <summary>
    ///     å½“前库存数
    /// </summary>
    [SugarColumn(ColumnName = "kc")]
    public int? Kc { get; set; }
}
service/Warehouse/MesItemQtManager.cs
@@ -24,7 +24,7 @@
    }
    /// <summary>
    /// èŽ·å–å¾…å¤„ç†çš„é€€æ–™å•æ˜Žç»†åˆ—è¡¨
    ///     èŽ·å–å¾…å¤„ç†çš„é€€æ–™å•æ˜Žç»†åˆ—è¡¨
    /// </summary>
    /// <param name="query">仓库查询参数,包含用户名和单据号</param>
    /// <returns>待处理的退料单明细列表</returns>
@@ -40,22 +40,15 @@
            .First();
        // å¦‚果未找到退料单,抛出异常
        if (mesItemQt == null)
        {
            throw new Exception($"未查询到此其他入库申请单 {p_bill_no}");
        }
        if (mesItemQt == null) throw new Exception($"未查询到此其他入库申请单 {p_bill_no}");
        // æ£€æŸ¥é€€æ–™å•的审核状态(Qt015),未审核则抛出异常
        if (mesItemQt.Qt015 == false)
        {
            throw new Exception($"其他出库申请单 {p_bill_no} æœªå®¡æ ¸ï¼Œè¯·ç¡®è®¤ï¼");
        }
        // æ£€æŸ¥é€€æ–™å•的完结状态(Qt014),已完结则抛出异常
        if (mesItemQt.Qt014 == true)
        {
            throw new Exception($"其他出库申请单 {p_bill_no} å·²å®Œç»“,请确认!");
        }
        // è”表查询获取未完成的明细列表
        // å…³è”表:
@@ -97,10 +90,7 @@
        var p_transaction_no = 202;
        // æ£€æŸ¥å•据号是否为空
        if (string.IsNullOrEmpty(p_bill_no))
        {
            throw new Exception("请选取单据号!");
        }
        if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
        // æ£€æŸ¥æ˜¯å¦é‡å¤æ‰«æ
        var existingBarcode = Db.Queryable<MesInvItemOutCDetails>()
@@ -108,10 +98,7 @@
                it.ItemBarcode == p_item_barcode && it.PbillNo == p_bill_no)
            .Any();
        if (existingBarcode)
        {
            throw new Exception("此条码已经扫码出库,勿重复扫描!");
        }
        if (existingBarcode) throw new Exception("此条码已经扫码出库,勿重复扫描!");
        // èŽ·å–æ¡ç ä¿¡æ¯
        var barcode = Db.Queryable<MesInvItemBarcodes>()
@@ -119,9 +106,7 @@
            .First();
        if (barcode == null)
        {
            throw new Exception($"mes中不存在此条码,请核对!{p_item_barcode}");
        }
        // èŽ·å–åº“å­˜ä¿¡æ¯
        var stock = Db.Queryable<MesInvItemStocks>()
@@ -129,20 +114,14 @@
            .First();
        if (stock == null)
        {
            throw new Exception($"库存中无此条码,请检查条码是否未入库或已出库!{p_item_barcode}");
        }
        if (string.IsNullOrEmpty(stock.DepotsCode))
        {
            throw new Exception($"调拨中的条码不可发料,请先完成调拨单据{p_item_barcode}");
        }
        if (stock.DepotsCode is "S006" or "S005")
        {
            throw new Exception($"条码在不良品仓下 ä¸å¯å‘æ–™{p_item_barcode}");
        }
        // æ£€æŸ¥æ˜¯å¦åœ¨å¯„存仓位
        // var isDepotSection = Db.Queryable<MesJcDepot>()
@@ -160,16 +139,12 @@
            .First();
        if (mesItemQt == null)
        {
            throw new Exception($"其他出库申请单 {p_bill_no} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        // æ£€æŸ¥ä»“库是否一致
        if (mesItemQt.Qt011 != stock.DepotsCode)
        {
            throw new Exception(
                $"扫码出货仓库{stock.DepotsCode}与其他出库申请仓库{mesItemQt.Qt011}不一致,请核对!");
        }
        // èŽ·å–å‡ºåº“å•æ˜Žç»†
        var qtDetail = Db.Queryable<MesItemQtDatall>()
@@ -178,17 +153,12 @@
                it.ItemId == stock.ItemId.ToString())
            .First();
        if (qtDetail == null)
        {
            throw new Exception("扫码物料非本次出库申请物料,请核对!");
        }
        if (qtDetail == null) throw new Exception("扫码物料非本次出库申请物料,请核对!");
        // æ£€æŸ¥å‰©ä½™æ•°é‡
        var remainingQty = (qtDetail.Qd007 ?? 0) - (qtDetail.Qd008 ?? 0);
        if (remainingQty <= 0)
        {
            throw new Exception($"申请物料 {barcode.ItemNo} å·²å‡ºåº“完成!");
        }
        // æ£€æŸ¥æ•°é‡æ˜¯å¦è¶…出
        if (stock.Quantity > remainingQty)
@@ -295,10 +265,7 @@
                    it.ItemId == stock.ItemId.ToString())
                .First();
            if (qtDetail == null)
            {
                throw new Exception($"未找到对应的退料单明细信息");
            }
            if (qtDetail == null) throw new Exception("未找到对应的退料单明细信息");
            // æ£€æŸ¥æ˜¯å¦å·²å­˜åœ¨å‡ºåº“物料记录
            var existingOutItem = Db.Queryable<MesInvItemOutItems>()
@@ -329,7 +296,7 @@
                    ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                        ? long.Parse(qtDetail.ItemId)
                        : null,
                    FType = 0,
                    FType = 0
                    // Unit = qtDetail.Qd009
                };
@@ -429,12 +396,10 @@
            // æ£€æŸ¥æ˜Žç»†æ˜¯å¦å®Œæˆ,如果完成则更新状态
            if ((qtDetail.Qd007 ?? 0) - (qtDetail.Qd008 ?? 0) == stock.Quantity)
            {
                commit += db.Updateable<MesItemQtDatall>()
                    .SetColumns(it => it.Qd011 == 1)
                    .Where(it => it.Guid == qtDetail.Guid)
                    .ExecuteCommand();
            }
            mesItemQtDatalls = Db
                .Queryable<MesItemQt, MesItemQtDatall, MesItems>(
@@ -456,12 +421,10 @@
            // å¦‚果没有待处理明细,更新退料单状态为已完成
            if (CollectionUtil.IsNullOrEmpty(mesItemQtDatalls))
            {
                db.Updateable<MesItemQt>()
                    .SetColumns(it => it.Qt014 == true)
                    .Where(it => it.Qtck == p_bill_no)
                    .ExecuteCommand();
            }
            // æž„建返回消息
            mess = $"扫码成功!条码 {p_item_barcode} æ•°é‡ {stock.Quantity} å·²å‡ºåº“";
@@ -471,10 +434,7 @@
            query.Num = stock.Quantity;
            query.Fum = null;
            if (commit < 5)
            {
                throw new Exception("更新失败");
            }
            if (commit < 5) throw new Exception("更新失败");
            return commit;
        });
@@ -494,16 +454,10 @@
        var p_transaction_no = 202;
        // æ£€æŸ¥å•据号是否为空
        if (string.IsNullOrEmpty(p_bill_no))
        {
            throw new Exception("请选取单据号!");
        }
        if (string.IsNullOrEmpty(p_bill_no)) throw new Exception("请选取单据号!");
        // æ£€æŸ¥æ•°é‡æ˜¯å¦æœ‰æ•ˆ
        if (p_qty <= 0)
        {
            throw new Exception("请输入正确的发料数量!");
        }
        if (p_qty <= 0) throw new Exception("请输入正确的发料数量!");
        // èŽ·å–åº“å­˜æ¡ç ä¿¡æ¯
        var stock = Db.Queryable<MesInvItemStocks>()
@@ -511,19 +465,13 @@
            .First();
        if (stock == null)
        {
            throw new Exception($"库存中无此条码,请检查条码是否未入库或已出库!{p_old_barcode}");
        }
        if (string.IsNullOrEmpty(stock.DepotsCode))
        {
            throw new Exception($"调拨中的条码不可发料,请先完成调拨单据{p_old_barcode}");
        }
        if (stock.DepotsCode is "S006" or "S005")
        {
            throw new Exception($"条码在不良品仓下 ä¸å¯å‘æ–™{p_old_barcode}");
        }
        // èŽ·å–æ¡ç ä¿¡æ¯
        var barcode = Db.Queryable<MesInvItemBarcodes>()
@@ -531,9 +479,7 @@
            .First();
        if (barcode == null)
        {
            throw new Exception($"mes中不存在此条码,请核对!{p_old_barcode}");
        }
        // èŽ·å–é€€æ–™å•ä¿¡æ¯
        var mesItemQt = Db.Queryable<MesItemQt>()
@@ -541,15 +487,11 @@
            .First();
        if (mesItemQt == null)
        {
            throw new Exception($"其他出库申请单 {p_bill_no} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        if (mesItemQt.Qt011 != stock.DepotsCode)
        {
            throw new Exception(
                $"扫码出货仓库{stock.DepotsCode}与其他出库申请仓库{mesItemQt.Qt011}不一致,请核对!");
        }
        // èŽ·å–é€€æ–™å•æ˜Žç»†
        var qtDetail = Db.Queryable<MesItemQtDatall>()
@@ -558,32 +500,23 @@
                it.ItemId == stock.ItemId.ToString())
            .First();
        if (qtDetail == null)
        {
            throw new Exception("扫码物料非本次出库申请物料,请核对!");
        }
        if (qtDetail == null) throw new Exception("扫码物料非本次出库申请物料,请核对!");
        var remainingQty = (qtDetail.Qd007 ?? 0) - (qtDetail.Qd008 ?? 0);
        if (remainingQty <= 0)
        {
            throw new Exception($"申请物料 {barcode.ItemNo} å·²å‡ºåº“完成!");
        }
        if (p_qty > remainingQty)
        {
            throw new Exception(
                $"输入的拆分数量 {p_qty} ä¸å¯å¤§äºŽå‰©ä½™éœ€å‘数量 {remainingQty} è¯·ä¿®æ”¹");
        }
        var totalQty = Db.Queryable<MesInvItemStocks>()
            .Where(it => it.ItemBarcode == p_old_barcode && it.Quantity > 0)
            .Sum(it => it.Quantity);
        if (totalQty < p_qty)
        {
            throw new Exception($"输入的发料数量 {p_qty} ä¸å¯å¤§äºŽæ¡ç æ•°é‡ {totalQty} è¯·ä¿®æ”¹");
        }
        var message = string.Empty;
        var mesItemQtDatalls = new List<MesItemQtDatall>();
@@ -633,7 +566,7 @@
                    ComeFlg = 5,
                    EbelnK3id = barcode.EbelnK3id,
                    LineK3id = barcode.LineK3id,
                    ItemId = barcode.ItemId,
                    ItemId = barcode.ItemId
                }).IgnoreColumns(true).ExecuteCommand();
                // æ›´æ–°åŽŸæ¡ç æ•°é‡
@@ -667,7 +600,7 @@
                    BillNo = stock.BillNo,
                    EbelnK3id = stock.EbelnK3id,
                    LineK3id = stock.LineK3id,
                    ItemId = stock.ItemId,
                    ItemId = stock.ItemId
                }).IgnoreColumns(true).ExecuteCommand();
@@ -702,7 +635,7 @@
                    LineK3id = stock.LineK3id,
                    SuppId = stock.SuppId,
                    SuppNo = stock.SuppNo,
                    ItemId = stock.ItemId,
                    ItemId = stock.ItemId
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
@@ -733,7 +666,7 @@
                commit += db.Insertable(new MesInvItemOuts
                {
                    Guid = outId,
                    ItemOutNo = $"OUT-{DateTime.Now:yyyyMMddHHmmss}",
                    ItemOutNo = outNo,
                    TaskNo = p_bill_no,
                    Status = 0,
                    CreateBy = c_user,
@@ -751,9 +684,8 @@
                    PbillNo = p_bill_no,
                    OutDate = DateTime.Now,
                    Nflag = 0,
                    Reason = mesItemQt.Qt010,
                    Reason = mesItemQt.Qt010
                }).ExecuteReturnIdentity();
                outNo = $"OUT-{DateTime.Now:yyyyMMddHHmmss}";
            }
            else
            {
@@ -768,7 +700,6 @@
                .First();
            if (outItem == null)
            {
                // æ’入新明细
                db.Insertable(new MesInvItemOutItems
                {
@@ -789,12 +720,10 @@
                    ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                        ? long.Parse(qtDetail.ItemId)
                        : null,
                    FType = 0,
                    FType = 0
                    // Unit = qtDetail.Qd009
                }).ExecuteCommand();
            }
            else
            {
                // æ›´æ–°æ˜Žç»†æ•°é‡
                db.Updateable<MesInvItemOutItems>()
                    .SetColumns(it =>
@@ -804,7 +733,6 @@
                        it.ItemId == stock.ItemId &&
                        it.QtOutId == qtDetail.Guid)
                    .ExecuteCommand();
            }
            // æ’入出库明细
            db.Insertable(new MesInvItemOutCDetails
@@ -887,12 +815,10 @@
            // å¦‚果所有明细完成,更新退料单状态
            if (!hasUnfinished)
            {
                db.Updateable<MesItemQt>()
                    .SetColumns(it => it.Qt014 == true)
                    .Where(it => it.Qtck == p_bill_no)
                    .ExecuteCommand();
            }
            // èŽ·å–å‰©ä½™å¾…å¤„ç†æ˜Žç»†
            mesItemQtDatalls = db
service/Warehouse/TransferOutManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,381 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using SqlSugar;
namespace NewPdaSqlServer.service.Warehouse;
/// <summary>
/// è°ƒæ‹¨å‡ºåº“管理类
/// è´Ÿè´£å¤„理调拨出库相关的业务逻辑
/// </summary>
public class TransferOutManager : Repository<TransferOut>
{
    /// <summary>
    /// èŽ·å–æœªå®Œæˆçš„è°ƒæ‹¨å‡ºåº“å•å·åˆ—è¡¨
    /// </summary>
    /// <returns>未完成的调拨出库单号列表</returns>
    public List<string> GetTransferOutNoList()
    {
        // å…ˆä»Žæ•°æ®åº“获取Transfer_Out_ETAIL表的数据
        var transferOutDetails = Db.Queryable<TransferOutDetail>().ToList();
        // ä½¿ç”¨LINQ对获取的数据进行分组和筛选
        // ç­›é€‰æ¡ä»¶:申请数量(sq)不等于已扫数量(ys)的记录
        var result = transferOutDetails
            .GroupBy(x => x.Pid)
            .Select(g => new
            {
                pid = g.Key,
                sq = g.Sum(x => x.ShNum),  // ç”³è¯·æ•°é‡åˆè®¡
                ys = g.Sum(x => x.YsNum)   // å·²æ‰«æ•°é‡åˆè®¡
            })
            .Where(x => (x.sq ?? 0) != (x.ys ?? 0))
            .Select(x => x.pid)
            .ToList();
        // æ ¹æ®pid查询对应的出库单号
        var billNos = Db.Queryable<TransferOut>()
            .Where(x => result.Contains(x.Guid))
            .Select(x => x.BillNo)
            .ToList();
        return billNos;
    }
    /// <summary>
    /// æ ¹æ®å•据号获取待处理的调拨出库明细列表
    /// </summary>
    /// <param name="query">查询参数,包含单据号</param>
    /// <returns>待处理的调拨出库明细列表</returns>
    public List<TransferOutDetail> GetTransferOutDetailListByBillNo(
        WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        // æ ¹æ®SQL查询条件获取待处理的出库明细
        // å…³è”查询TransferOutDetail、TransferOut和MesItems三张表
        // ç­›é€‰æ¡ä»¶:未完成数量大于0且单据已审核
        var result = Db.Queryable<TransferOutDetail, TransferOut, MesItems>(
                (b, a, s) => new JoinQueryInfos(
                    JoinType.Left, b.Pid == a.Guid,
                    JoinType.Left, b.ItemId == s.Id))
            .Where((b, a, s) =>
                (b.ShNum ?? 0) - (b.YsNum ?? 0) > 0  // æœªå®Œæˆæ•°é‡å¤§äºŽ0
                && a.BillNo == p_bill_no             // åŒ¹é…å•据号
                && a.Status == 1)                    // å•据已审核
            .OrderBy((b, a, s) => s.ItemNo)
            .Select((b, a, s) => new TransferOutDetail
            {
                ItemNo = s.ItemNo,
                ItemModel = s.ItemModel,
                ShNum = b.ShNum,      // ç”³è¯·æ•°é‡
                YsNum = b.YsNum,      // å·²æ‰«æ•°é‡
                // ä¿ç•™å…¶ä»–必要字段...
                Pid = b.Pid,
                ItemId = b.ItemId,
                Guid = b.Guid
            })
            .ToList();
        return result;
    }
    /// <summary>
    /// æ‰«ææ¡ç è¿›è¡Œè°ƒæ‹¨å‡ºåº“处理
    /// </summary>
    /// <param name="query">包含单据号、用户名和条码信息的查询参数</param>
    /// <returns>处理后的表单和待处理明细列表</returns>
    public (WarehouseQuery form, List<TransferOutDetail> items)
        ScanMoveBarcode(WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        var c_user = query.userName;
        var p_item_barcode = query.barcode;
        var p_bill_type_id = 300;     // å•据类型ID
        var p_transaction_no = 301;    // äº¤æ˜“编号
        // éªŒè¯å•据号
        if (string.IsNullOrEmpty(p_bill_no))
        {
            throw new Exception("请选取单据号!");
        }
        // æŸ¥è¯¢å‡ºåº“单并验证状态
        var transferOut = Db.Queryable<TransferOut>()
            .Where(x => x.BillNo == p_bill_no && x.Status == 1)
            .First();
        if (transferOut == null)
        {
            throw new Exception("未找到调拨申请单或者调拨申请单没审核");
        }
        // æŸ¥è¯¢æ¡ç åº“存信息并验证
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode
                        && x.Quantity > 0
                        && !string.IsNullOrEmpty(x.DepotsCode))
            .First();
        if (stock == null)
        {
            throw new Exception($"库存中无此条码,请核对!{p_item_barcode}");
        }
        // éªŒè¯ä»“库一致性
        if (stock.DepotsCode != transferOut.InvCode)
        {
            throw new Exception(
                $"条码库存仓库{stock.DepotsCode}和申请仓库不一致{transferOut.InvCode}");
        }
        // æŸ¥è¯¢ç‰©æ–™ä¿¡æ¯
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id == stock.ItemId)
            .First();
        if (item == null)
        {
            throw new Exception("未找到物料");
        }
        // æŸ¥è¯¢è°ƒæ‹¨æ˜Žç»†å¹¶éªŒè¯
        var detail = Db.Queryable<TransferOutDetail>()
            .Where(x => x.ItemId == stock.ItemId && x.Pid == transferOut.Guid)
            .First();
        if (detail == null)
        {
            throw new Exception("未找到条码物料相应的调拨申请");
        }
        // éªŒè¯æ•°é‡æ˜¯å¦è¶…出未扫数量
        if ((detail.ShNum ?? 0) - (detail.YsNum ?? 0) < stock.Quantity)
        {
            throw new Exception("条码数量大于申请未扫数量,请拆分了再扫码");
        }
        // ä½¿ç”¨äº‹åŠ¡å¤„ç†æ•°æ®æ›´æ–°
        UseTransaction(db =>
        {
            // æŸ¥è¯¢çŽ°æœ‰ç§»åº“è®°å½•
            var existingMove = db.Queryable<MesInvItemMoves>()
                .Where(x => x.TaskNo == p_bill_no
                            && x.TransactionNo == p_transaction_no
                            && (x.Status ?? 0) == 0)
                .First();
            var commit = 0;  // è®°å½•更新操作次数
            var c_id = Guid.Empty;
            // å¤„理移库主表记录
            if (existingMove != null)
            {
                // æ›´æ–°çŽ°æœ‰è®°å½•çš„æœ€åŽä¿®æ”¹ä¿¡æ¯
                commit += db.Updateable<MesInvItemMoves>()
                    .SetColumns(s => s.LastupdateDate == DateTime.Now)
                    .SetColumns(s => s.LastupdateBy == c_user)
                    .Where(s => s.Guid == existingMove.Guid)
                    .ExecuteCommand();
                c_id = existingMove.Guid;
            }
            else
            {
                // æŸ¥è¯¢ç›¸å…³ä»“库信息
                var mesDepots = db.Queryable<MesDepots>()
                    .Where(s => s.DepotCode == transferOut.FromCode)
                    .First();
                var invMesDepots = db.Queryable<MesDepots>()
                    .Where(s => s.DepotCode == transferOut.InvCode)
                    .First();
                c_id = Guid.NewGuid();
                // åˆ›å»ºæ–°çš„移库记录
                var newMove = new MesInvItemMoves
                {
                    Guid = c_id,
                    BillNo = BillNo.GetBillNo("DBCKD"),
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    BillTypeId = p_bill_type_id,
                    TransactionNo = p_transaction_no,
                    InvDepotSectionsId = mesDepots.DepotId,
                    // InvDepotSectionsCode = transferOut.FromCode,
                    // FromDepotsCode = transferOut.InvCode,
                    FromDepotsId = invMesDepots.DepotId.ToString(),
                    TaskNo = p_bill_no
                };
                commit += db.Insertable(newMove).IgnoreColumns(true)
                    .ExecuteCommand();
            }
            // å†™å…¥è€æ¡ç äº¤æ˜“明细
            var business = new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = p_bill_type_id,
                TransactionCode = p_transaction_no.ToString(),
                BusinessType = -1,
                ItemBarcode = p_item_barcode,
                ItemNo = item.ItemNo,
                LotNo = stock.LotNo,
                EpFlag = true,
                Quantity = stock.Quantity,
                FromInvDepotsCode = stock.DepotsCode,
                FromInvDepotSectionsCode = stock.DepotSectionsCode,
                ToInvDepotsCode = transferOut.FromCode,
                ToInvDepotSectionsCode = stock.DepotSectionsCode,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                Factory = stock.Factory,
                Company = stock.Company,
                TaskNo = stock.TaskNo,
                BillNo = p_bill_no,
                WorkNo = stock.WorkNo,
                WorkLine = stock.WorkLine,
                SuppNo = stock.SuppNo,
                ItemId = stock.ItemId,
                EbelnK3id = stock.EbelnK3id,
                LineK3id = stock.LineK3id,
                // RkDepot = transferOut.RkDepot,
                // CkDepot = transferOut.CkDepot
            };
            commit += db.Insertable(business).IgnoreColumns(true)
                .ExecuteCommand();
            // å†™å…¥æ–°æ¡ç äº¤æ˜“明细
            var moveDetail = new MesInvItemMovesCDetails
            {
                Guid = Guid.NewGuid(),
                ItemMoveGuid = c_id,
                ItemBarcode = p_item_barcode,
                CItemCode = stock.CItemCode,
                ItemNo = item.ItemNo,
                LotNo = stock.LotNo,
                Quantity = stock.Quantity,
                EpFlag = stock.EpFlag,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                // CustomerNo = stock.CustomerNo,
                TaskNo = stock.TaskNo,
                FromDepotsCode = stock.DepotsCode,
                FromDepotSectionsCode = stock.DepotSectionsCode,
                Factory = stock.Factory,
                Company = stock.Company,
                InvDepotsCode = transferOut.FromCode,
                // InvDepotSectionsCode = p_sectioncode,
                IqcStatus = stock.IqcStatus,
                Fcar = stock.Fcar,
                IndepDate = stock.IndepDate,
                VisableSubmit = stock.VisableSubmit,
                VisableSubmitBy = stock.VisableSubmitBy,
                VisableSubmitDate = stock.VisableSubmitDate,
                BoardStyle = stock.BoardStyle,
                WorkNo = stock.WorkNo,
                WorkLine = stock.WorkLine,
                SuppNo = stock.SuppNo,
                ItemId = (int)stock.ItemId,
                EbelnK3id = stock.EbelnK3id,
                LineK3id = stock.LineK3id,
                // RkDepot = transferOut.RkDepot,
                // CkDepot = transferOut.CkDepot
            };
            commit += db.Insertable(moveDetail).IgnoreColumns(true)
                .ExecuteCommand();
            // æ›´æ–°æˆ–插入出库明细记录
            var outItem = db.Queryable<MesInvItemOutItems>()
                .Where(x => x.ItemOutId == c_id && x.ItemId == stock.ItemId)
                .First();
            if (outItem != null)
            {
                // æ›´æ–°çŽ°æœ‰è®°å½•çš„æ•°é‡
                outItem.Quantity += stock.Quantity;
                commit += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(x => x.Quantity == outItem.Quantity)
                    .Where(x => x.Guid == outItem.Guid)
                    .ExecuteCommand();
            }
            else
            {
                // æ’入新记录
                var newOutItem = new MesInvItemOutItems
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = c_id,
                    ItemId = stock.ItemId,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    TaskNo = stock.TaskNo,
                    WorkNo = stock.WorkNo,
                    WorkLine = stock.WorkLine,
                    EbelnK3id = (int)stock.EbelnK3id,
                    LineK3id = (int)stock.LineK3id,
                    Quantity = stock.Quantity,
                    // Unit = stock.ItemUnit
                };
                commit += db.Insertable(newOutItem).IgnoreColumns(true)
                    .ExecuteCommand();
            }
            // æ›´æ–°è°ƒæ‹¨ç”³è¯·å·²æ‰«æ•°é‡
            detail = db.Queryable<TransferOutDetail>()
                .Where(x => x.Guid == detail.Guid)
                .First();
            if (detail != null)
            {
                detail.YsNum = (detail.YsNum ?? 0) + stock.Quantity as int?;
                commit += db.Updateable<TransferOutDetail>()
                    .SetColumns(x => x.YsNum == detail.YsNum)
                    .Where(x => x.Guid == detail.Guid)
                    .ExecuteCommand();
            }
            // æ£€æŸ¥æ˜¯å¦æ‰€æœ‰æ˜Žç»†éƒ½å·²å®Œæˆ
            var totals = db.Queryable<TransferOutDetail, TransferOut>((b, a) =>
                new JoinQueryInfos(JoinType.Left, b.Pid == a.Guid))
                .Where((b, a) => a.BillNo == p_bill_no)
                .Select((b, a) => new {
                    ShNum = SqlFunc.AggregateSum(b.ShNum),  // ç”³è¯·æ€»æ•°é‡
                    YsNum = SqlFunc.AggregateSum(b.YsNum)   // å·²æ‰«æ€»æ•°é‡
                })
                .First();
            // å¦‚果申请数量等于已扫数量,更新单据完成状态
            if (totals.ShNum == totals.YsNum)
            {
                commit += db.Updateable<TransferOut>()
                    .SetColumns(x => x.IsWc == 1)
                    .Where(x => x.BillNo == p_bill_no)
                    .ExecuteCommand();
            }
            // æ›´æ–°è¿”回参数
            query.itemNo = item.ItemNo;
            query.Num = stock.Quantity;
            // éªŒè¯æ›´æ–°æ“ä½œæ˜¯å¦å…¨éƒ¨æˆåŠŸ
            if (commit < 4)
            {
                throw new Exception("更新失败");
            }
            return commit;
        });
        // è¿”回更新后的表单和待处理明细
        return (query, GetTransferOutDetailListByBillNo(query));
    }
}