111
啊鑫
2024-12-27 e3355fba66b7f23bfca7dc213b27ad5f6721763e
111
已添加4个文件
已修改5个文件
1144 ■■■■■ 文件已修改
Controllers/Warehouse/MesItemQtrkController.cs 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Wom/MesWorkProdController.cs 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/service/ScanWorkResult.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesItemQtrk.cs 144 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesItemQtrrDetail.cs 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemBlManager.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemQtrkManager.cs 473 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemTblManager.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Wom/MesWorkProdManager.cs 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesItemQtrkController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
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 MesItemQtrkController : ControllerBase
{
    private readonly MesItemQtrkManager _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);
        }
    }
    /// <summary>
    /// æ ¹æ®ä¸»é”®èŽ·å–
    /// </summary>
    /// <returns>其他入库单信息</returns>
    [HttpPost("GetById")]
    public ResponseResult GetById(int id)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetById(id);
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
    #region å…¶ä»–入库业务
    /// <summary>
    /// èŽ·å–å…¶ä»–å…¥åº“å•å·åˆ—è¡¨
    /// </summary>
    /// <returns>其他入库单号列表</returns>
    /// <remarks>
    /// èŽ·å–çŠ¶æ€ä¸ºå·²å®¡æ ¸(Qt015=1)且未完结(Qt014=0)的其他入库单号列表
    /// </remarks>
    /// <response code="200">成功获取入库单号列表</response>
    /// <response code="400">获取失败</response>
    [HttpPost("GetQtckList")]
    public ResponseResult GetQtckList()
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetQtckList();
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    /// <summary>
    /// èŽ·å–å…¶ä»–å…¥åº“å•æ˜Žç»†åˆ—è¡¨
    /// </summary>
    /// <param name="query">查询参数,必须包含billNo(入库单号)</param>
    /// <returns>入库单明细列表</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     POST /api/MesItemQtrk/GetQtckDetailList
    ///     {
    ///         "billNo": "QT202401010001"
    ///     }
    ///
    /// è¿”回未完成入库的明细记录(Qd007-Qd008>0)
    /// </remarks>
    /// <response code="200">成功获取入库单明细</response>
    /// <response code="400">获取失败,返回具体错误信息</response>
    [HttpPost("GetQtckDetailList")]
    public ResponseResult GetQtckDetailList([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetQtckDetailList(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/MesItemQtrk/ScanInDepotsQT
    ///     {
    ///         "sectionCode": "A01-01-01",
    ///         "billNo": "QT202401010001"
    ///     }
    ///
    /// éªŒè¯åº“位是否属于申请单指定的仓库
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
    [HttpPost("ScanInDepotsQT")]
    public ResponseResult ScanInDepotsQT([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.message = _manager.ScanInDepotsQT(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/MesItemQtrk/ScanInBcodeQtrk
    ///     {
    ///         "userName": "admin",
    ///         "sectionCode": "A01-01-01",
    ///         "barcode": "BC001",
    ///         "billNo": "QT202401010001"
    ///     }
    ///
    /// - éªŒè¯æ¡ç æ˜¯å¦å·²å…¥åº“
    /// - éªŒè¯æ¡ç æ˜¯å¦ä¸ºå…¶ä»–入库条码
    /// - éªŒè¯å…¥åº“数量是否超过申请数量
    /// - æ‰§è¡Œå…¥åº“事务处理
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
    [HttpPost("ScanInBcodeQtrk")]
    public ResponseResult ScanInBcodeQtrk([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (form, items) = _manager.ScanInBcodeQtrk(query);
            resultInfos.form = form;
            resultInfos.items = items;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
}
Controllers/Wom/MesWorkProdController.cs
@@ -8,7 +8,7 @@
namespace NewPdaSqlServer.Controllers.Wom;
/// <summary>
/// ç”Ÿäº§æŠ¥å·¥ç›¸å…³æŽ¥å£
///     ç”Ÿäº§æŠ¥å·¥ç›¸å…³æŽ¥å£
/// </summary>
[Route("api/[controller]")]
[ApiController]
@@ -19,7 +19,7 @@
    #region åŸºç¡€CRUD
    /// <summary>
    /// èŽ·å–æ‰€æœ‰
    ///     èŽ·å–æ‰€æœ‰
    /// </summary>
    /// <returns>报工单列表</returns>
    [HttpPost("GetList")]
@@ -43,7 +43,7 @@
    }
    /// <summary>
    /// æ ¹æ®ä¸»é”®èŽ·å–
    ///     æ ¹æ®ä¸»é”®èŽ·å–
    /// </summary>
    /// <returns>报工单信息</returns>
    [HttpPost("GetById")]
@@ -67,7 +67,7 @@
    }
    /// <summary>
    /// æ ¹æ®ä¸»é”®åˆ é™¤
    ///     æ ¹æ®ä¸»é”®åˆ é™¤
    /// </summary>
    /// <returns>删除结果</returns>
    [HttpPost("DeleteByIds")]
@@ -91,7 +91,7 @@
    }
    /// <summary>
    /// æ·»åŠ 
    ///     æ·»åŠ 
    /// </summary>
    /// <returns>添加结果</returns>
    [HttpPost("Insert")]
@@ -115,7 +115,7 @@
    }
    /// <summary>
    /// ä¿®æ”¹
    ///     ä¿®æ”¹
    /// </summary>
    /// <returns>修改结果</returns>
    [HttpPost("Update")]
@@ -143,18 +143,17 @@
    #region ç”Ÿäº§æŠ¥å·¥
    /// <summary>
    /// PDA扫描生产报工
    ///     PDA扫描生产报工
    /// </summary>
    /// <param name="request">报工请求参数</param>
    /// <returns>报工结果</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesWorkProd/ScanWork
    ///     {
    ///         "staffNo": "ST001",
    ///         "itemBarcode": "BC001",
    ///         "userNo": "admin"
    ///     "staffNo": "ST001",
    ///     "itemBarcode": "BC001",
    ///     "userNo": "admin"
    ///     }
    /// </remarks>
    /// <response code="200">扫描成功</response>
@@ -180,18 +179,17 @@
    }
    /// <summary>
    /// PDA扫描生产报工(带数量)
    ///     PDA扫描生产报工(带数量)
    /// </summary>
    /// <param name="request">报工请求参数</param>
    /// <returns>报工结果</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesWorkProd/ScanWorkProd
    ///     {
    ///         "itemBarcode": "BC001",
    ///         "quantity": 10,
    ///         "userNo": "admin"
    ///     "itemBarcode": "BC001",
    ///     "quantity": 10,
    ///     "userNo": "admin"
    ///     }
    /// </remarks>
    /// <response code="200">扫描成功</response>
Dto/service/ScanWorkResult.cs
@@ -1,8 +1,7 @@
namespace NewPdaSqlServer.Dto.service;
/// <summary>
/// ç”Ÿäº§æŠ¥å·¥æ‰«æç»“æžœ
///     ç”Ÿäº§æŠ¥å·¥æ‰«æç»“æžœ
/// </summary>
public class ScanWorkResult
{
entity/MesItemQtrk.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,144 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
///     å…¶ä»–入库申请
/// </summary>
[SugarTable("MES_ITEM_QTRK")]
public class MesItemQtrk
{
    /// <summary>
    ///     é»˜è®¤å€¼: (newid())
    /// </summary>
    [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
    /// <summary>
    ///     ç”³è¯·å•号
    /// </summary>
    [SugarColumn(ColumnName = "qtck")]
    public string? Qtck { get; set; }
    /// <summary>
    ///     ç”³è¯·æ—¥æœŸ
    /// </summary>
    [SugarColumn(ColumnName = "qt001")]
    public DateTime? Qt001 { get; set; }
    /// <summary>
    ///     å®¡æ ¸æ—¥æœŸ
    /// </summary>
    [SugarColumn(ColumnName = "qt002")]
    public DateTime? Qt002 { get; set; }
    /// <summary>
    ///     å…¥åº“类别
    /// </summary>
    [SugarColumn(ColumnName = "qt003")]
    public string? Qt003 { get; set; }
    /// <summary>
    ///     ä¸šåŠ¡ç±»åž‹
    /// </summary>
    [SugarColumn(ColumnName = "qt004")]
    public string? Qt004 { get; set; }
    /// <summary>
    ///     åˆ¶å•人
    /// </summary>
    [SugarColumn(ColumnName = "qt005")]
    public string? Qt005 { get; set; }
    /// <summary>
    ///     ç”Ÿäº§å·¥å•
    /// </summary>
    [SugarColumn(ColumnName = "qt006")]
    public string? Qt006 { get; set; }
    /// <summary>
    ///     å‘料仓库id
    /// </summary>
    [SugarColumn(ColumnName = "qt008")]
    public string? Qt008 { get; set; }
    /// <summary>
    ///     ç”³è¯·éƒ¨é—¨id
    /// </summary>
    [SugarColumn(ColumnName = "qt009")]
    public string? Qt009 { get; set; }
    /// <summary>
    ///     å…¥åº“原因
    /// </summary>
    [SugarColumn(ColumnName = "qt010")]
    public string? Qt010 { get; set; }
    /// <summary>
    ///     ä»“库编码
    /// </summary>
    [SugarColumn(ColumnName = "qt011")]
    public string? Qt011 { get; set; }
    /// <summary>
    ///     éƒ¨é—¨ç¼–码
    /// </summary>
    [SugarColumn(ColumnName = "qt012")]
    public string? Qt012 { get; set; }
    /// <summary>
    ///     æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "qt013")]
    public int? Qt013 { get; set; }
    /// <summary>
    ///     å®Œç»“标识
    ///     é»˜è®¤å€¼: ((0))
    /// </summary>
    [SugarColumn(ColumnName = "qt014")]
    public int? Qt014 { get; set; }
    /// <summary>
    ///     å®¡æ ¸çŠ¶æ€
    ///     é»˜è®¤å€¼: ((0))
    /// </summary>
    [SugarColumn(ColumnName = "qt015")]
    public int? Qt015 { get; set; }
    /// <summary>
    ///     å®¡æ ¸äºº
    /// </summary>
    [SugarColumn(ColumnName = "qt016")]
    public string? Qt016 { get; set; }
    /// <summary>
    ///     ä»»åŠ¡å•å·
    /// </summary>
    [SugarColumn(ColumnName = "qt017")]
    public string? Qt017 { get; set; }
    /// <summary>
    ///     ä¾›åº”商id
    /// </summary>
    [SugarColumn(ColumnName = "qt018")]
    public string? Qt018 { get; set; }
    /// <summary>
    ///     å…¥åº“方向(退货,普通)
    /// </summary>
    [SugarColumn(ColumnName = "qt019")]
    public string? Qt019 { get; set; }
    /// <summary>
    ///     å…¥åº“类型 1盘盈 2模具 3辅助 4打样 5回料 6采购
    /// </summary>
    [SugarColumn(ColumnName = "qt020")]
    public string? Qt020 { get; set; }
    /// <summary>
    ///     é”€å”®è®¢å•号
    /// </summary>
    [SugarColumn(ColumnName = "qt021")]
    public string? Qt021 { get; set; }
}
entity/MesItemQtrrDetail.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,124 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
/// </summary>
[SugarTable("MES_ITEM_QTRR_DETAIL")]
public class MesItemQtrrDetail
{
    /// <summary>
    ///     é»˜è®¤å€¼: (newid())
    /// </summary>
    [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
    /// <summary>
    ///     ä¸»è¡¨guid
    /// </summary>
    [SugarColumn(ColumnName = "qtrkGuid")]
    public Guid? QtrkGuid { get; set; }
    /// <summary>
    ///     å·¥å•号
    /// </summary>
    [SugarColumn(ColumnName = "qd001")]
    public string? Qd001 { get; set; }
    /// <summary>
    ///     ç‰©æ–™ç¼–号
    /// </summary>
    [SugarColumn(ColumnName = "qd002")]
    public string? Qd002 { get; set; }
    /// <summary>
    ///     ç‰©æ–™åç§°
    /// </summary>
    [SugarColumn(ColumnName = "qd003")]
    public string? Qd003 { get; set; }
    /// <summary>
    ///     è§„格型号
    /// </summary>
    [SugarColumn(ColumnName = "qd004")]
    public string? Qd004 { get; set; }
    /// <summary>
    ///     é¢œè‰²
    /// </summary>
    [SugarColumn(ColumnName = "qd005")]
    public string? Qd005 { get; set; }
    /// <summary>
    ///     è®¡åˆ’数量
    /// </summary>
    [SugarColumn(ColumnName = "qd006")]
    public int? Qd006 { get; set; }
    /// <summary>
    ///     ç”³è¯·æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "qd007")]
    public int? Qd007 { get; set; }
    /// <summary>
    ///     å·²å…¥æ•°é‡
    /// </summary>
    [SugarColumn(ColumnName = "qd008")]
    public int? Qd008 { get; set; }
    /// <summary>
    ///     å•位
    /// </summary>
    [SugarColumn(ColumnName = "qd009")]
    public string? Qd009 { get; set; }
    /// <summary>
    ///     å¤‡æ³¨
    /// </summary>
    [SugarColumn(ColumnName = "qd010")]
    public string? Qd010 { get; set; }
    /// <summary>
    ///     å®Œç»“标识
    /// </summary>
    [SugarColumn(ColumnName = "qd011")]
    public int? Qd011 { get; set; }
    /// <summary>
    ///     ç‰©æ–™ID
    /// </summary>
    [SugarColumn(ColumnName = "itemId")]
    public string? ItemId { get; set; }
    /// <summary>
    ///     YDYNUM
    /// </summary>
    [SugarColumn(ColumnName = "YDYNUM")]
    public string? Ydynum { get; set; }
    /// <summary>
    ///     å¯æ‰“印数量
    /// </summary>
    [SugarColumn(ColumnName = "KDYNUM")]
    public string? Kdynum { get; set; }
    /// <summary>
    ///     ç”³è¯·å•号
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? Qtck { get; set; }
    /// <summary>
    ///     ç‰©æ–™ç¼–码 = ERP物料编号||颜色编号
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? ItemNo { get; set; }
    /// <summary>
    ///     ç‰©æ–™åç§°
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? ItemName { get; set; }
}
service/Warehouse/MesItemBlManager.cs
@@ -186,7 +186,7 @@
        {
            // èŽ·å–æˆ–åˆ›å»ºå‡ºåº“å•
            var outId = Guid.NewGuid();
            var outNo = BillNo.GetBillNo("SCBL");
            var outNo = BillNo.GetBillNo("BL(工单补料)");
            var existingOut = db.Queryable<MesInvItemOuts>()
                .Where(a => a.BbillNo == query.blNo
@@ -239,7 +239,6 @@
                .Count();
            if (itemCount > 0)
            {
                // æ›´æ–°å·²å­˜åœ¨çš„物料明细数量
                db.Updateable<MesInvItemOutItems>()
                    .SetColumns(i =>
@@ -247,9 +246,7 @@
                    .Where(i =>
                        i.ItemOutId == outId && i.ItemId == stockBarcode.ItemId)
                    .ExecuteCommand();
            }
            else
            {
                // æ’入新的物料明细记录
                db.Insertable(new MesInvItemOutItems
                {
@@ -275,8 +272,7 @@
                    // Unit = blDetail.Bld009,
                    // DepotId = (int)stockBarcode.DepotsId
                }).IgnoreColumns(true).ExecuteCommand();
            }
            // æ’入出库单条码明细
            db.Insertable(new MesInvItemOutCDetails
            {
@@ -682,7 +678,7 @@
            {
                // åˆ›å»ºæ–°çš„出库单
                var outId = Guid.NewGuid();
                var outNo = BillNo.GetBillNo("SCBL");
                var outNo = BillNo.GetBillNo("BL(工单补料)");
                // æ’入出库单主表
                executeCommand += db.Insertable(new MesInvItemOuts
@@ -911,8 +907,9 @@
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>生产超领单明细列表</returns>
    public (string bl001,List<MesItemBlDetail> item) GetMesItemBlDetailBySccBillNo(
        WarehouseQuery query)
    public (string bl001, List<MesItemBlDetail> item)
        GetMesItemBlDetailBySccBillNo(
            WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.billNo))
            throw new Exception("请选单据号!");
@@ -959,7 +956,7 @@
            })
            .ToList();
        return (mesItemBl.Bl001,pendingDetails);
        return (mesItemBl.Bl001, pendingDetails);
    }
    /// <summary>
@@ -1113,7 +1110,7 @@
            if (outRecord == null)
            {
                outId = Guid.NewGuid();
                outNo = BillNo.GetBillNo("SCBL"); // éœ€è¦å®žçŽ°ç”Ÿæˆå•å·çš„æ–¹æ³•
                outNo = BillNo.GetBillNo("BL(工单补料)"); // éœ€è¦å®žçŽ°ç”Ÿæˆå•å·çš„æ–¹æ³•
                // æ’入出库单主表
                db.Insertable(new MesInvItemOuts
@@ -1517,7 +1514,7 @@
                itemOut = new MesInvItemOuts
                {
                    Guid = Guid.NewGuid(),
                    ItemOutNo = BillNo.GetBillNo("SCBL"), // éœ€è¦å®žçŽ°ç”Ÿæˆå•å·çš„æ–¹æ³•
                    ItemOutNo = BillNo.GetBillNo("BL(工单补料)"), // éœ€è¦å®žçŽ°ç”Ÿæˆå•å·çš„æ–¹æ³•
                    TaskNo = query.blNo,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
service/Warehouse/MesItemQtrkManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,473 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using SqlSugar;
namespace NewPdaSqlServer.service.Warehouse;
public class MesItemQtrkManager : Repository<MesItemQtrk>
{
    public List<string> GetQtckList()
    {
        return Db.Queryable<MesItemQtrk>()
            .Where(x => (x.Qt015 ?? 0) == 1 && (x.Qt014 ?? 0) == 0)
            .Select(x => x.Qtck)
            .ToList();
    }
    public List<MesItemQtrrDetail> GetQtckDetailList(WarehouseQuery query)
    {
        // 1. éªŒè¯ç”³è¯·å•是否存在
        var qtrk = Db.Queryable<MesItemQtrk>()
            .Where(x => x.Qtck == query.billNo)
            .First();
        if (qtrk == null)
            throw new Exception($"未查询到此其他入库申请单 {query.billNo}");
        // 2. éªŒè¯ç”³è¯·å•状态
        if (qtrk.Qt015 != 1)
            throw new Exception($"其他入库申请单 {query.billNo} æœªå®¡æ ¸ï¼Œè¯·ç¡®è®¤ï¼");
        if (qtrk.Qt014 == 1)
            throw new Exception($"其他入库申请单 {query.billNo} å·²å®Œç»“,请确认!");
        // 3. æŸ¥è¯¢ç”³è¯·å•明细
        var details = Db.Queryable<MesItemQtrk, MesItemQtrrDetail, MesItems>(
                (a, b, c) => new JoinQueryInfos(
                    JoinType.Left, a.Guid == b.QtrkGuid,
                    JoinType.Left, c.Id.ToString() == b.ItemId))
            .Where((a, b, c) =>
                a.Qtck == query.billNo &&
                (b.Qd007 ?? 0) - (b.Qd008 ?? 0) > 0)
            .OrderBy((a, b, c) => b.Qd002)
            .Select((a, b, c) => new MesItemQtrrDetail
            {
                Qtck = a.Qtck,
                ItemNo = c.ItemNo,
                ItemName = c.ItemName,
                Qd007 = b.Qd007 ?? 0,
                Qd008 = b.Qd008 ?? 0
            })
            .ToList();
        return details;
    }
    public String ScanInDepotsQT(WarehouseQuery query)
    {
        var sectionCode = query.sectionCode;
        var billNo = query.billNo;
        // 1. éªŒè¯åº“位条码是否为空
        if (string.IsNullOrEmpty(sectionCode))
        {
            throw new Exception("请扫库位条码!");
        }
        // 2. æŸ¥è¯¢åº“位对应的仓库编码
        var depotCode = Db.Queryable<MesDepotSections, MesDepots>(
                (a, b) => new JoinQueryInfos(
                    JoinType.Inner, a.DepotGuid == b.Guid))
            .Where((a, b) => a.DepotSectionCode == sectionCode)
            .Select((a, b) => b.DepotCode)
            .First();
        if (depotCode == null)
        {
            throw new Exception($"库位编码 {sectionCode} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        // 3. æŸ¥è¯¢ç”³è¯·å•对应的仓库
        var qtrk = Db.Queryable<MesItemQtrk>()
            .Where(x => x.Qtck == billNo)
            .Select(x => x.Qt011)
            .First();
        if (qtrk == null)
        {
            throw new Exception($"库位编码 {sectionCode} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        // 4. éªŒè¯åº“位是否属于申请仓库
        if (depotCode != qtrk)
        {
            throw new Exception($"扫码库位 {sectionCode} ä¸å±žäºŽç”³è¯·æ­¤ä»“库!");
        }
        // 5. è¿”回成功信息
        return $"仓库:{qtrk} åº“位:{sectionCode}";
    }
    public (WarehouseQuery form, List<MesItemQtrrDetail> item)
        ScanInBcodeQtrk(WarehouseQuery query)
    {
        var c_user = query.userName;
        var p_section_code = query.sectionCode;
        var p_item_barcode = query.barcode;
        var p_bill_no = query.billNo;
        var billTypeId = 100;
        var transactionNo = 102;
        // 1. éªŒè¯åº“位条码是否为空
        if (string.IsNullOrEmpty(p_section_code))
        {
            throw new Exception("请扫库位条码!");
        }
        // 2. æŸ¥è¯¢åº“位对应的仓库编码和仓库ID
        var depotInfo = Db.Queryable<MesDepotSections, MesDepots>(
                (a, b) =>
                    new JoinQueryInfos(JoinType.Inner, a.DepotGuid == b.Guid))
            .Where((a, b) => a.DepotSectionCode == p_section_code)
            .Select((a, b) => new { b.DepotCode, b.DepotId })
            .First();
        if (depotInfo == null)
        {
            throw new Exception($"库位编码 {p_section_code} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        var c_depot_code = depotInfo.DepotCode;
        var c_depot_id = depotInfo.DepotId;
        // 3. éªŒè¯æ¡ç æ˜¯å¦å·²å…¥åº“
        var existsInStock = Db.Queryable<MesInvItemInCDetails>()
            .Any(x => x.ItemBarcode == p_item_barcode);
        if (existsInStock)
        {
            throw new Exception("此条码已扫码入库完成,请核对!");
        }
        // 4. æŸ¥è¯¢æ¡ç ä¿¡æ¯
        var barcode = Db.Queryable<MesInvItemBarcodes>()
            .Where(x => x.ItemBarcode == p_item_barcode)
            .First();
        if (barcode == null)
        {
            throw new Exception("条码不存在,请核对!");
        }
        if (barcode.ComeFlg != 3)
        {
            throw new Exception("条码不是其他入库条码,无法用其他入库!");
        }
        // éªŒè¯æ¡ç æ˜¯å¦å·²åœ¨åº“存中
        var stockCount = Db.Queryable<MesInvItemStocks>()
            .Where(x => x.ItemBarcode == p_item_barcode)
            .Count();
        if (stockCount > 0)
        {
            throw new Exception("此条码已扫码入库完成,请核对!");
        }
        // 5. æŸ¥è¯¢å…¶ä»–入库申请单
        var qtrk = Db.Queryable<MesItemQtrk>()
            .Where(x => x.Qtck == p_bill_no)
            .First();
        if (qtrk == null)
        {
            throw new Exception("其他入库申请单不存在!");
        }
        // 6. æŸ¥è¯¢ç”³è¯·å•明细
        var detail = Db.Queryable<MesItemQtrrDetail>()
            .Where(x =>
                x.QtrkGuid == qtrk.Guid &&
                x.ItemId == barcode.ItemId.ToString())
            .First();
        if (detail == null)
        {
            throw new Exception($"其他入库申请单{p_bill_no}无此物料{barcode.ItemNo} è¯·æ ¸å¯¹ï¼");
        }
        // 7. éªŒè¯æ•°é‡
        if (barcode.Quantity > (detail.Qd007 ?? 0) - (detail.Qd008 ?? 0))
        {
            throw new Exception("条码数量超过申请数量,请核对!");
        }
        var details = new List<MesItemQtrrDetail>();
        // 8. æ‰§è¡Œå…¥åº“事务
        UseTransaction(db =>
        {
            var res = 0;
            // æŸ¥è¯¢æ˜¯å¦å­˜åœ¨æœªå…¥åº“的入库单
            var existingInv = db.Queryable<MesInvItemIns>()
                .Where(x => x.Status == 0
                            && x.TransctionNo == transactionNo.ToString()
                            && x.CbillNo == p_bill_no
                            && x.SuppNo == barcode.SuppNo
                            // && x.DepotsCode == c_depot_code)
                            && x.DepotsId == c_depot_id)
                .First();
            var newId = Guid.Empty;
            var billNo = "";
            // å¦‚果不存在则创建新入库单
            if (existingInv == null)
            {
                newId = Guid.NewGuid();
                billNo = BillNo.GetBillNo("INV_IN_OTHER");
                barcode.UrgentFlag ??= false;
                res += db.Insertable(new MesInvItemIns
                {
                    Guid = newId,
                    BillNo = billNo,
                    BillTypeId = billTypeId,
                    InsDate = DateTime.Now,
                    DepotsCode = c_depot_code,
                    TransctionNo = transactionNo.ToString(),
                    SuppNo = barcode.SuppNo,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    UrgentFlag = barcode.UrgentFlag.Value ? (byte)1 : (byte)0,
                    CbillNo = p_bill_no,
                    Fstatus = 0,
                    Status = 0,
                    Reason = qtrk.Qt010
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                newId = existingInv.Guid;
                billNo = existingInv.BillNo;
            }
            // æŸ¥è¯¢æ˜¯å¦å­˜åœ¨ç›¸åŒç‰©æ–™å’Œå·¥å•行的入库明细
            var existingItem = db.Queryable<MesInvItemInCItems>()
                .Where(x => x.ItemInId == newId
                            && x.ItemId == barcode.ItemId
                            && x.WorkNo == barcode.WorkNo
                            && x.WorkLine == barcode.WorkLine)
                .First();
            if (existingItem == null)
            {
                // ä¸å­˜åœ¨åˆ™æ–°å¢žå…¥åº“明细
                res += db.Insertable(new MesInvItemInCItems
                {
                    Guid = Guid.NewGuid(),
                    ItemInId = newId,
                    Quantity = barcode.Quantity,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    ItemNo = barcode.ItemNo,
                    DepotCode = c_depot_code,
                    ItemSname = barcode.ItemSname,
                    Unit = barcode.Unit,
                    Ebeln = barcode.WorkNo,
                    BillNo = billNo,
                    Factory = barcode.Factory,
                    Company = barcode.Company,
                    WorkNo = barcode.WorkNo,
                    EbelnLineNo = barcode.WorkLine,
                    CbillNo = barcode.BillNo,
                    WorkLine = barcode.WorkLine,
                    SuppNo = barcode.SuppNo,
                    Remark = barcode.Memo,
                    EbelnK3id = barcode.EbelnK3id,
                    LineK3id = barcode.LineK3id,
                    ItemId = barcode.ItemId
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                // å­˜åœ¨åˆ™æ›´æ–°æ•°é‡
                res += db.Updateable<MesInvItemInCItems>()
                    .SetColumns(
                        x => x.Quantity == x.Quantity + barcode.Quantity)
                    .Where(x => x.ItemInId == newId
                                && x.ItemId == barcode.ItemId
                                && x.WorkNo == barcode.WorkNo
                                && x.WorkLine == barcode.WorkLine)
                    .ExecuteCommand();
            }
            // æ’入入库明细记录
            res += db.Insertable(new MesInvItemInCDetails
            {
                ItemInId = newId,
                BillNo = billNo,
                ItemBarcode = barcode.ItemBarcode,
                Quantity = barcode.Quantity,
                BarcodeFlag = true,
                EpFlag = true,
                WorkType = 1,
                ItemNo = barcode.ItemNo,
                LotNo = barcode.LotNo,
                SuppId = barcode.SuppId,
                SuppNo = barcode.SuppNo,
                DepotId = c_depot_id,
                DepotCode = c_depot_code,
                DepotSectionCode = p_section_code,
                ItemSname = barcode.ItemSname,
                Unit = barcode.Unit,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                Remark = barcode.Memo,
                Factory = barcode.Factory,
                Company = barcode.Company,
                Ebeln = barcode.Mblnr,
                EbelnLineNo = barcode.Zeile,
                WorkNo = barcode.WorkNo,
                WorkLine = barcode.WorkLine,
                CbillNo = barcode.BillNo,
                UrgentFlag = barcode.UrgentFlag,
                BoardStyle = barcode.BoardStyle,
                TaskNo = barcode.TaskNo,
                EbelnK3id = barcode.EbelnK3id,
                LineK3id = barcode.LineK3id,
                ItemId = barcode.ItemId,
                Ischeck = true
            }).IgnoreColumns(true).ExecuteCommand();
            // æ’入库存业务流水记录
            res += db.Insertable(new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = billTypeId,
                TransactionCode = transactionNo.ToString(),
                BusinessType = 1,
                ItemBarcode = barcode.ItemBarcode,
                ItemNo = barcode.ItemNo,
                LotNo = barcode.LotNo,
                EpFlag = true,
                Quantity = barcode.Quantity,
                InvDepotId = c_depot_id,
                ToInvDepotsCode = c_depot_code,
                ToInvDepotSectionsCode = p_section_code,
                Description = "其他入库",
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                TaskNo = barcode.BillNo,
                BillNo = billNo,
                WorkNo = barcode.WorkNo,
                WorkLine = barcode.WorkLine,
                SuppId = barcode.SuppId,
                SuppNo = barcode.SuppNo,
                EbelnK3id = barcode.EbelnK3id,
                LineK3id = barcode.LineK3id,
                ItemId = barcode.ItemId,
                // SalesOrder = barcode.SalesOrder,
                // IsZy = barcode.IsZy,
                // OuterBarcode = barcode.OuterBarcode
            }).IgnoreColumns(true).ExecuteCommand();
            barcode.EpFlag ??= false;
            // æ’入库存记录
            res += db.Insertable(new MesInvItemStocks
            {
                TaskNo = barcode.TaskNo,
                ItemBarcode = p_item_barcode,
                ItemNo = barcode.ItemNo,
                LotNo = barcode.LotNo,
                Quantity = barcode.Quantity,
                EpFlag = barcode.EpFlag.Value ? (byte)1 : (byte)0,
                DepotId = c_depot_id,
                DepotsCode = c_depot_code,
                DepotSectionsCode = p_section_code,
                CheckDate = DateTime.Now,
                IndepDate = DateTime.Now,
                Factory = barcode.Factory,
                Company = barcode.Company,
                BoardStyle = barcode.BoardStyle,
                WorkNo = barcode.WorkNo,
                WorkLine = barcode.WorkLine,
                SuppId = barcode.SuppId,
                SuppNo = barcode.SuppNo,
                EbelnK3id = barcode.EbelnK3id,
                LineK3id = barcode.LineK3id,
                ItemId = barcode.ItemId,
                BillNo = barcode.BillNo,
                // SalesOrder = barcode.SalesOrder,
                // IsZy = barcode.IsZy,
                // Visable = 0,
                // OuterBarcode = barcode.OuterBarcode
            }).IgnoreColumns(true).ExecuteCommand();
            // æ›´æ–°æ¡ç å…¥åº“标志
            // db.Updateable<MesInvItemBarcodes>()
            //     .SetColumns(x => x.rkf == 1)
            //     .Where(x => x.ItemBarcode == p_item_barcode)
            //     .ExecuteCommand();
            // æ›´æ–°ç”³è¯·å•明细已入库数量
            res += db.Updateable<MesItemQtrrDetail>()
                .SetColumns(x => x.Qd008 == (x.Qd008 ?? 0) + barcode.Quantity)
                .Where(x => x.Guid == barcode.Guid)
                .ExecuteCommand();
            // æ£€æŸ¥æ˜¯å¦å®Œå…¨å…¥åº“并更新状态
            var detail1 = db.Queryable<MesItemQtrrDetail>()
                .Where(x => x.Guid == detail.Guid)
                .First();
            if ((detail1.Qd007 ?? 0) - (detail1.Qd008 ?? 0) == barcode.Quantity)
            {
                res += db.Updateable<MesItemQtrrDetail>()
                    .SetColumns(x => x.Qd011 == 1)
                    .Where(x => x.Guid == detail1.Guid)
                    .ExecuteCommand();
            }
            details = Db.Queryable<MesItemQtrk, MesItemQtrrDetail, MesItems>(
                    (a, b, c) => new JoinQueryInfos(
                        JoinType.Left, a.Guid == b.QtrkGuid,
                        JoinType.Left, c.Id.ToString() == b.ItemId))
                .Where((a, b, c) =>
                    a.Qtck == p_bill_no &&
                    (b.Qd007 ?? 0) - (b.Qd008 ?? 0) > 0)
                .OrderBy((a, b, c) => b.Qd002)
                .Select((a, b, c) => new MesItemQtrrDetail
                {
                    Qtck = a.Qtck,
                    ItemNo = c.ItemNo,
                    ItemName = c.ItemName,
                    Qd007 = b.Qd007 ?? 0,
                    Qd008 = b.Qd008 ?? 0
                })
                .ToList();
            if (CollectionUtil.IsNullOrEmpty(details))
            {
                res += db.Updateable<MesItemQtrk>()
                    .SetColumns(s => s.Qt014 == 1)
                    .Where(x => x.Qtck == p_bill_no)
                    .ExecuteCommand();
            }
            if (res < 5)
            {
                throw new Exception("插入或更新失败");
            }
            return res;
        });
        query.itemNo = barcode.ItemNo;
        query.Num = barcode.Quantity;
        return (query, details);
    }
    // End of Selection
}
service/Warehouse/MesItemTblManager.cs
@@ -406,7 +406,7 @@
            return totalResult;
        });
        query.itemNo = c_mes_inv_item_barcodes.ItemNo;
        query.Num = c_quantity.Value;
        return query;
service/Wom/MesWorkProdManager.cs
@@ -11,49 +11,76 @@
    //当前类已经继承了 Repository å¢žã€åˆ ã€æŸ¥ã€æ”¹çš„æ–¹æ³•
    /// <summary>
    /// PDA扫描生产报工
    ///     PDA扫描生产报工
    /// </summary>
    /// <param name="request">
    ///     æŠ¥å·¥è¯·æ±‚参数,包含:
    ///     - StaffNo: å‘˜å·¥å·¥å·ï¼Œå¿…å¡«
    ///     - ItemBarcode: ç‰©æ–™æ¡ç ï¼Œå¿…å¡«
    ///     - UserNo: æ“ä½œç”¨æˆ·è´¦å·ï¼Œå¿…å¡«
    /// </param>
    /// <returns>
    ///     è¿”回报工结果对象,包含:
    ///     - TaskNo: å·¥å•号
    ///     - ItemNo: ç‰©æ–™ç¼–号
    ///     - PlanQty: è®¡åˆ’数量
    ///     - ReportedQty: å·²æŠ¥å·¥æ•°é‡
    ///     - CurrentQty: æœ¬æ¬¡æŠ¥å·¥æ•°é‡
    ///     - BarcodeQty: æ¡ç æ•°é‡
    ///     - ItemName: ç‰©æ–™åç§°
    ///     - ItemModel: ç‰©æ–™åž‹å·
    ///     - Message: å¤„理结果消息
    /// </returns>
    /// <exception cref="Exception">
    ///     - å½“员工不存在时抛出异常
    ///     - å½“条码不存在时抛出异常
    ///     - å½“物料不存在时抛出异常
    ///     - å½“条码重复扫描时抛出异常
    ///     - å½“工单不存在时抛出异常
    ///     - å½“报工数量小于等于0时抛出异常
    ///     - å½“报工总数量超过计划数量时抛出异常
    /// </exception>
    public ScanWorkResult ScanWorkAsync(ScanWorkRequest request)
    {
        // æŸ¥è¯¢äººå‘˜ä¿¡æ¯
        // 1. éªŒè¯å‘˜å·¥ä¿¡æ¯
        var staff = Db.Queryable<MesStaff>()
            .Where(x => x.StaffNo == request.StaffNo)
            .First();
        if (staff == null)
            throw new Exception("请先选择人员");
        // æŸ¥è¯¢æ¡ç ä¿¡æ¯
        // 2. éªŒè¯æ¡ç ä¿¡æ¯
        var barcode = Db.Queryable<MesInvItemBarcodes>()
            .Where(x => x.ItemBarcode == request.ItemBarcode)
            .First();
        if (barcode == null)
            throw new Exception($"无此条码,请核对!{request.ItemBarcode}");
        // æŸ¥è¯¢ç‰©æ–™ä¿¡æ¯
        // 3. éªŒè¯ç‰©æ–™ä¿¡æ¯
        var item = Db.Queryable<MesItems>()
            .Where(x => x.Id == barcode.ItemId)
            .First();
        if (item == null)
            throw new Exception($"无此物料,请核对!{request.ItemBarcode}");
        // ç¡®å®šå•据类型
        int billTypeId = 900;
        int transactionNo = 902;
        // 4. æ ¹æ®æ¡ç å¤‡æ³¨ç¡®å®šå•据类型和交易号
        var billTypeId = 900; // é»˜è®¤å•据类型
        var transactionNo = 902; // é»˜è®¤äº¤æ˜“号
        switch (barcode.Memo?.Trim() ?? "0")
        {
            case "丝印":
                transactionNo = 901;
                transactionNo = 901; // ä¸å°å·¥åº
                break;
            case "半成品":
                transactionNo = 902;
                transactionNo = 902; // åŠæˆå“å·¥åº
                break;
            case "包装":
            case "成品":
                transactionNo = 903;
                transactionNo = 903; // æˆå“/包装工序
                break;
        }
        // æ£€æŸ¥æ¡ç æ˜¯å¦é‡å¤æ‰«æ
        // 5. æ£€æŸ¥æ¡ç æ˜¯å¦é‡å¤æ‰«æ
        var exists = Db.Queryable<MesWorkProd, MesWorkProdCDetails>(
                (a, b) =>
                    new JoinQueryInfos(JoinType.Inner,
@@ -66,7 +93,7 @@
        if (exists)
            throw new Exception("条码重复扫描,请核对!");
        // èŽ·å–å·²æŠ¥å·¥æ•°é‡
        // 6. èŽ·å–å·²æŠ¥å·¥æ•°é‡
        var reportedQty = Db.Queryable<MesWorkProd, MesWorkProdCDetails>(
                (a, b) =>
                    new JoinQueryInfos(JoinType.Inner,
@@ -76,7 +103,7 @@
                             && a.TaskNo == barcode.BillNo)
            .Sum((a, b) => b.Quantity);
        // èŽ·å–å·¥å•è®¡åˆ’æ•°é‡å’Œåž‹å·
        // 7. èŽ·å–å·¥å•è®¡åˆ’æ•°é‡å’Œåž‹å·
        var workOrder = Db.Queryable<Womdaa>()
            .Where(x => x.Daa001 == barcode.BillNo)
            .First();
@@ -86,9 +113,10 @@
        var planQty = workOrder.Daa008;
        var itemModel = workOrder.Daa004;
        // 8. ä½¿ç”¨äº‹åŠ¡å¤„ç†æŠ¥å·¥æ•°æ®
        UseTransaction(db =>
        {
            // æœ‰æ•°é‡æ¡ç è‡ªåŠ¨æŠ¥å·¥
            // 9. å¤„理有数量条码的自动报工
            if (barcode.Quantity > 0)
            {
                var reportQty = barcode.Quantity;
@@ -101,7 +129,7 @@
                    throw new Exception(
                        $"本次报工数量:{reportQty} å¤§äºŽå‰©ä½™æŠ¥å·¥æ•°é‡ï¼š{workOrder.Daa008 - reportedQty ?? 0},请核对!");
                // æ›´æ–°æ¡ç çŠ¶æ€
                // 10. æ›´æ–°æ¡ç çŠ¶æ€
                db.Updateable<MesInvItemBarcodes>()
                    .SetColumns(x => new MesInvItemBarcodes
                    {
@@ -111,7 +139,7 @@
                    .Where(x => x.Guid == barcode.Guid)
                    .ExecuteCommandAsync();
                // èŽ·å–æˆ–åˆ›å»ºæŠ¥å·¥å•
                // 11. èŽ·å–æˆ–åˆ›å»ºæŠ¥å·¥å•
                var workProd = db.Queryable<MesWorkProd>()
                    .Where(x => x.TaskNo == barcode.BillNo
                                && x.CreateDate.Value.Date.ToString(
@@ -125,7 +153,7 @@
                if (workProd == null)
                {
                    var id = Guid.NewGuid();
                    var billNo = BillNo.GetBillNo("MES_WORK");
                    var billNo = BillNo.GetBillNo("BG(报工编号)");
                    workProd = new MesWorkProd
                    {
@@ -147,7 +175,7 @@
                        .ExecuteCommand();
                }
                // æ’入报工明细
                // 12. æ’入报工明细
                var detailId = Guid.NewGuid();
                db.Insertable(new MesWorkProdCDetails
                {
@@ -169,7 +197,7 @@
                    BgYg = staff.Id
                }).IgnoreColumns(true).ExecuteCommand();
                // æ›´æ–°å·¥å•已报工数量
                // 13. æ›´æ–°å·¥å•已报工数量
                db.Updateable<Womdaa>()
                    .SetColumns(x =>
                        x.Daa011 == (x.Daa011 ?? 0) + (int)barcode.Quantity
@@ -177,7 +205,7 @@
                    .Where(x => x.Daa001 == barcode.BillNo)
                    .ExecuteCommandAsync();
                // é‡æ–°èŽ·å–å·²æŠ¥å·¥æ•°é‡
                // 14. é‡æ–°èŽ·å–æœ€æ–°å·²æŠ¥å·¥æ•°é‡
                reportedQty = db.Queryable<MesWorkProd, MesWorkProdCDetails>(
                        (a, b) =>
                            new JoinQueryInfos(JoinType.Inner,
@@ -191,6 +219,7 @@
            return 1;
        });
        // 15. è¿”回处理结果
        return new ScanWorkResult
        {
            TaskNo = barcode.TaskNo,
@@ -207,45 +236,59 @@
    /// <summary>
    /// PDA扫描生产报工  prc_rf_pda_scan_work_prod
    ///     PDA扫描生产报工 prc_rf_pda_scan_work_prod
    /// </summary>
    /// <param name="request">
    ///     æŠ¥å·¥è¯·æ±‚参数,包含:
    ///     - ItemBarcode: ç‰©æ–™æ¡ç ï¼Œå¿…å¡«
    ///     - Quantity: æŠ¥å·¥æ•°é‡ï¼Œå¿…填且大于0
    ///     - UserNo: æ“ä½œç”¨æˆ·è´¦å·ï¼Œå¿…å¡«
    /// </param>
    /// <returns>返回布尔值,true表示报工成功,false表示报工失败</returns>
    /// <exception cref="Exception">
    ///     - å½“报工数量小于等于0时抛出异常
    ///     - å½“条码不存在时抛出异常
    ///     - å½“工单不存在时抛出异常
    ///     - å½“报工总数量超过计划数量时抛出异常
    /// </exception>
    public bool ScanWorkProdAsync(ScanWorkRequest request)
    {
        // 1. éªŒè¯æŠ¥å·¥æ•°é‡æ˜¯å¦å¤§äºŽ0
        if (request.Quantity <= 0)
            throw new Exception("报工数量不能小于等于 0,请核对!");
        // æŸ¥è¯¢æ¡ç ä¿¡æ¯
        // 2. æŸ¥è¯¢æ¡ç ä¿¡æ¯ï¼ŒéªŒè¯æ¡ç æ˜¯å¦å­˜åœ¨
        var barcode = Db.Queryable<MesInvItemBarcodes>()
            .Where(x => x.ItemBarcode == request.ItemBarcode)
            .First();
        if (barcode == null)
            throw new Exception($"库存中无此条码,请核对!{request.ItemBarcode}");
        // æŸ¥è¯¢å·¥å•信息
        // 3. æŸ¥è¯¢å·¥å•信息,验证工单是否存在
        var womdaa = Db.Queryable<Womdaa>()
            .Where(x => x.Daa001 == barcode.BillNo)
            .First();
        if (womdaa == null)
            throw new Exception($"条码不是报工条码/无对应工单,请核对!{request.ItemBarcode}");
        // ç¡®å®šå•据类型
        int billTypeId = 900;
        int transactionNo = 902;
        // 4. æ ¹æ®æ¡ç å¤‡æ³¨ç¡®å®šå•据类型和交易号
        var billTypeId = 900; // é»˜è®¤å•据类型
        var transactionNo = 902; // é»˜è®¤äº¤æ˜“号(半成品工序)
        switch (barcode.Memo?.Trim() ?? "0")
        {
            case "丝印":
                transactionNo = 901;
                transactionNo = 901; // ä¸å°å·¥åº
                break;
            case "半成品":
                transactionNo = 902;
                transactionNo = 902; // åŠæˆå“å·¥åº
                break;
            case "成品":
            case "包装":
                transactionNo = 903;
                transactionNo = 903; // æˆå“/包装工序
                break;
        }
        // æ±‡æ€»å·²æ‰«æ¡ç æ•°é‡
        // 5. æ±‡æ€»å·²æ‰«æ¡ç æ•°é‡ï¼ŒéªŒè¯æ˜¯å¦è¶…出计划数量
        var sumQty = Db.Queryable<MesWorkProd, MesWorkProdCDetails>((a, b) =>
                new JoinQueryInfos(JoinType.Inner, a.BillNo == b.BillNo))
            .Where((a, b) => a.BillTypeId == billTypeId
@@ -260,16 +303,17 @@
            throw new Exception(
                $"本次报工数量:{request.Quantity} å¤§äºŽå‰©ä½™æŠ¥å·¥æ•°é‡ï¼š{womdaa.Daa008 - (sumQty - request.Quantity)},请核对!");
        // 6. å¼€å¯äº‹åŠ¡å¤„ç†æŠ¥å·¥æ•°æ®
        return UseTransaction(db =>
        {
            // æ›´æ–°æ¡ç ä¿¡æ¯
            // 6.1 æ›´æ–°æ¡ç ä¿¡æ¯ï¼Œè®¾ç½®å·²æŠ¥å·¥æ ‡è®°å’Œæ•°é‡
            db.Updateable<MesInvItemBarcodes>()
                .SetColumns(x => x.WorkFlg == true)
                .SetColumns(x => x.Quantity == request.Quantity)
                .Where(x => x.Guid == barcode.Guid)
                .ExecuteCommand();
            // èŽ·å–æˆ–åˆ›å»ºæŠ¥å·¥å•
            // 6.2 èŽ·å–æˆ–åˆ›å»ºæŠ¥å·¥å•
            var workProd = db.Queryable<MesWorkProd>()
                .Where(x => x.TaskNo == barcode.BillNo
                            && x.CreateDate.Value.Date.ToString("yyyy-MM-dd") ==
@@ -279,12 +323,13 @@
                            && x.Status == 0)
                .First();
            // 6.3 å¦‚果报工单不存在则创建新的报工单
            if (workProd == null)
            {
                var billNo = BillNo.GetBillNo("MES_WORK");
                var billNo = BillNo.GetBillNo("BG(报工编号)");
                workProd = new MesWorkProd
                {
                    Id = Guid.NewGuid(),
                    Id = Guid.NewGuid(),
                    BillNo = billNo,
                    LineNo = barcode.LineNo,
                    Company = barcode.Company,
@@ -293,7 +338,7 @@
                    CreateDate = DateTime.Now,
                    LastupdateBy = request.UserNo,
                    LastupdateDate = DateTime.Now,
                    PbillNo = barcode.BillNo, // Added PbillNo field
                    PbillNo = barcode.BillNo,
                    BillTypeId = billTypeId,
                    TransactionNo = transactionNo,
                    TaskNo = barcode.BillNo
@@ -302,10 +347,10 @@
                db.Insertable(workProd).IgnoreColumns(true).ExecuteCommand();
            }
            // æ’入报工明细
            // 6.4 æ’入报工明细记录
            var detail = new MesWorkProdCDetails
            {
                Id = Guid.NewGuid(),
                Id = Guid.NewGuid(),
                BillNo = workProd.BillNo,
                ItemBarcode = request.ItemBarcode,
                Quantity = (int)request.Quantity,
@@ -316,7 +361,7 @@
                LastupdateBy = request.UserNo,
                LastupdateDate = DateTime.Now,
                ItemNo = barcode.ItemNo,
                PbillNo = barcode.BillNo, // Added PbillNo from barcode
                PbillNo = barcode.BillNo,
                WorkLast = barcode.WorkLast,
                SilkPqty = barcode.SilkPqty,
                SilkId = barcode.SilkId,