啊鑫
2024-12-28 614d32ed2d62ab55f3a3b78bb6769df931a85bcd
其他出库和其他入库的后台
已添加4个文件
已修改5个文件
1573 ■■■■■ 文件已修改
Controllers/Warehouse/MesItemQtController.cs 207 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesItemQtrkController.cs 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesInvItemOutCDetails.cs 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesInvItemOutItems.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesItemQt.cs 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesItemQtDatall.cs 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemBlManager.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemQtManager.cs 922 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesItemQtrkManager.cs 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesItemQtController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,207 @@
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 MesItemQtController : ControllerBase
{
    private readonly MesItemQtManager _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>
    /// èŽ·å–çŠ¶æ€ä¸ºå·²å®¡æ ¸(Qt015=true)且未完结(Qt014=false)的退料单号列表
    /// </remarks>
    /// <response code="200">成功获取退料单号列表</response>
    /// <response code="400">获取失败</response>
    [HttpPost("GetPendingQtList")]
    public ResponseResult GetPendingQtList()
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetPendingQtList();
            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/MesItemQt/GetPendingQtList
    ///     {
    ///         "userName": "admin",      // ç”¨æˆ·å(必填)
    ///         "billNo": "QT20240101001" // é€€æ–™å•号(必填)
    ///     }
    ///
    /// è¿”回未完成的明细记录(Qd007-Qd008>0)
    /// </remarks>
    /// <response code="200">成功获取退料单明细</response>
    /// <response code="400">获取失败,返回具体错误信息</response>
    [HttpPost("GetPendingQtDetailList")]
    public ResponseResult GetPendingQtDetailList([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            resultInfos.tbBillList = _manager.GetPendingQtList(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/MesItemQt/OutScanBarcode
    ///     {
    ///         "billNo": "QT20240101001",  // é€€æ–™å•号(必填)
    ///         "barcode": "BC001",         // æ¡ç å·(必填)
    ///         "userName": "admin"         // ç”¨æˆ·å(必填)
    ///     }
    ///
    /// è¿”回数据包含:
    /// - form: å¤„理结果表单
    /// - item: å¾…处理明细列表
    /// - message: å¤„理结果消息
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
    [HttpPost("OutScanBarcode")]
    public ResponseResult OutScanBarcode([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (form, items, message) = _manager.OutScanBarcode(query);
            resultInfos.form = form;
            resultInfos.items = items;
            resultInfos.message = message;
            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/MesItemQt/PrintQtckBarcode
    ///     {
    ///         "userName": "admin",         // ç”¨æˆ·å(必填)
    ///         "billNo": "QT20240101001",   // é€€æ–™å•号(必填)
    ///         "barcode": "BC001",          // æ¡ç å·(必填)
    ///         "Fum": 10                    // å‘料数量(必填,必须大于0)
    ///     }
    ///
    /// è¿”回数据包含:
    /// - form: å¤„理结果表单
    /// - item: å¾…处理明细列表
    /// - message: å¤„理结果消息
    /// </remarks>
    /// <response code="200">打印成功</response>
    /// <response code="400">打印失败,返回具体错误信息</response>
    [HttpPost("PrintQtckBarcode")]
    public ResponseResult PrintQtckBarcode([FromBody] WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (form, items, message) = _manager.PrintQtckBarcode(query);
            resultInfos.form = form;
            resultInfos.items = items;
            resultInfos.message = message;
            return new ResponseResult
            {
                status = 0,
                message = "OK",
                data = resultInfos
            };
        }
        catch (Exception ex)
        {
            return ResponseResult.ResponseError(ex);
        }
    }
    #endregion
}
Controllers/Warehouse/MesItemQtrkController.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")]
@@ -42,7 +42,7 @@
    }
    /// <summary>
    /// æ ¹æ®ä¸»é”®èŽ·å–
    ///     æ ¹æ®ä¸»é”®èŽ·å–
    /// </summary>
    /// <returns>其他入库单信息</returns>
    [HttpPost("GetById")]
@@ -70,11 +70,11 @@
    #region å…¶ä»–入库业务
    /// <summary>
    /// èŽ·å–å…¶ä»–å…¥åº“å•å·åˆ—è¡¨
    ///     èŽ·å–å…¶ä»–å…¥åº“å•å·åˆ—è¡¨
    /// </summary>
    /// <returns>其他入库单号列表</returns>
    /// <remarks>
    /// èŽ·å–çŠ¶æ€ä¸ºå·²å®¡æ ¸(Qt015=1)且未完结(Qt014=0)的其他入库单号列表
    ///     èŽ·å–çŠ¶æ€ä¸ºå·²å®¡æ ¸(Qt015=1)且未完结(Qt014=0)的其他入库单号列表
    /// </remarks>
    /// <response code="200">成功获取入库单号列表</response>
    /// <response code="400">获取失败</response>
@@ -99,19 +99,17 @@
    }
    /// <summary>
    /// èŽ·å–å…¶ä»–å…¥åº“å•æ˜Žç»†åˆ—è¡¨
    ///     èŽ·å–å…¶ä»–å…¥åº“å•æ˜Žç»†åˆ—è¡¨
    /// </summary>
    /// <param name="query">查询参数,必须包含billNo(入库单号)</param>
    /// <returns>入库单明细列表</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesItemQtrk/GetQtckDetailList
    ///     {
    ///         "billNo": "QT202401010001"
    ///     "billNo": "QT202401010001"
    ///     }
    ///
    /// è¿”回未完成入库的明细记录(Qd007-Qd008>0)
    ///     è¿”回未完成入库的明细记录(Qd007-Qd008>0)
    /// </remarks>
    /// <response code="200">成功获取入库单明细</response>
    /// <response code="400">获取失败,返回具体错误信息</response>
@@ -136,20 +134,18 @@
    }
    /// <summary>
    /// æ‰«æåº“位
    ///     æ‰«æåº“位
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>库位信息</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesItemQtrk/ScanInDepotsQT
    ///     {
    ///         "sectionCode": "A01-01-01",
    ///         "billNo": "QT202401010001"
    ///     "sectionCode": "A01-01-01",
    ///     "billNo": "QT202401010001"
    ///     }
    ///
    /// éªŒè¯åº“位是否属于申请单指定的仓库
    ///     éªŒè¯åº“位是否属于申请单指定的仓库
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
@@ -174,25 +170,23 @@
    }
    /// <summary>
    /// æ‰«ææ¡ç å…¥åº“
    ///     æ‰«ææ¡ç å…¥åº“
    /// </summary>
    /// <param name="query">查询参数</param>
    /// <returns>入库结果和待处理明细</returns>
    /// <remarks>
    /// è¯·æ±‚示例:
    ///
    ///     è¯·æ±‚示例:
    ///     POST /api/MesItemQtrk/ScanInBcodeQtrk
    ///     {
    ///         "userName": "admin",
    ///         "sectionCode": "A01-01-01",
    ///         "barcode": "BC001",
    ///         "billNo": "QT202401010001"
    ///     "userName": "admin",
    ///     "sectionCode": "A01-01-01",
    ///     "barcode": "BC001",
    ///     "billNo": "QT202401010001"
    ///     }
    ///
    /// - éªŒè¯æ¡ç æ˜¯å¦å·²å…¥åº“
    /// - éªŒè¯æ¡ç æ˜¯å¦ä¸ºå…¶ä»–入库条码
    /// - éªŒè¯å…¥åº“数量是否超过申请数量
    /// - æ‰§è¡Œå…¥åº“事务处理
    ///     - éªŒè¯æ¡ç æ˜¯å¦å·²å…¥åº“
    ///     - éªŒè¯æ¡ç æ˜¯å¦ä¸ºå…¶ä»–入库条码
    ///     - éªŒè¯å…¥åº“数量是否超过申请数量
    ///     - æ‰§è¡Œå…¥åº“事务处理
    /// </remarks>
    /// <response code="200">扫描成功</response>
    /// <response code="400">扫描失败,返回具体错误信息</response>
entity/MesInvItemOutCDetails.cs
@@ -24,25 +24,25 @@
    ///     ç‰©æ–™æ¡ç 
    /// </summary>
    [SugarColumn(ColumnName = "ITEM_BARCODE")]
    public string ItemBarcode { get; set; }
    public string? ItemBarcode { get; set; }
    /// <summary>
    ///     å®¢æˆ·ç‰©æ–™ç¼–码(无条码手工录入,有条码为冗余字段)
    /// </summary>
    [SugarColumn(ColumnName = "C_ITEM_CODE")]
    public string CItemCode { get; set; }
    public string? CItemCode { get; set; }
    /// <summary>
    ///     æœ¬å¸ç‰©æ–™ç¼–码(无条码手工录入,有条码为冗余字段)
    /// </summary>
    [SugarColumn(ColumnName = "ITEM_NO")]
    public string ItemNo { get; set; }
    public string? ItemNo { get; set; }
    /// <summary>
    ///     åŽ‚å®¶æ‰¹æ¬¡
    /// </summary>
    [SugarColumn(ColumnName = "LOT_NO")]
    public string LotNo { get; set; }
    public string? LotNo { get; set; }
    /// <summary>
    ///     æ•°é‡ï¼ˆæ— æ¡ç æ‰‹å·¥å½•入,有条码为冗余字段)
@@ -61,7 +61,7 @@
    ///     åˆ›å»ºäºº
    /// </summary>
    [SugarColumn(ColumnName = "CREATE_BY")]
    public string CreateBy { get; set; }
    public string? CreateBy { get; set; }
    /// <summary>
    ///     åˆ›å»ºæ—¶é—´
@@ -73,7 +73,7 @@
    ///     æœ€åŽæ›´æ–°äºº
    /// </summary>
    [SugarColumn(ColumnName = "LASTUPDATE_BY")]
    public string LastupdateBy { get; set; }
    public string? LastupdateBy { get; set; }
    /// <summary>
    ///     æœ€åŽæ›´æ–°æ—¶é—´
@@ -85,25 +85,25 @@
    ///     å®¢æˆ·ç¼–码
    /// </summary>
    [SugarColumn(ColumnName = "CUST_NO")]
    public string CustNo { get; set; }
    public string? CustNo { get; set; }
    /// <summary>
    ///     ä»“库编码
    /// </summary>
    [SugarColumn(ColumnName = "DEPOT_CODE")]
    public string DepotCode { get; set; }
    public string? DepotCode { get; set; }
    /// <summary>
    ///     è´§ä½ç¼–码
    /// </summary>
    [SugarColumn(ColumnName = "DEPOT_SECTION_CODE")]
    public string DepotSectionCode { get; set; }
    public string? DepotSectionCode { get; set; }
    /// <summary>
    ///     å¤‡æ³¨
    /// </summary>
    [SugarColumn(ColumnName = "REMARK")]
    public string Remark { get; set; }
    public string? Remark { get; set; }
    /// <summary>
    ///     å…æ£€æ ‡è¯†(0-否,1-是)
@@ -115,7 +115,7 @@
    ///     æŠ•料批次
    /// </summary>
    [SugarColumn(ColumnName = "PRD_LOT_NO")]
    public string PrdLotNo { get; set; }
    public string? PrdLotNo { get; set; }
    /// <summary>
    ///     æ˜¯å¦åšæŽ¥æ”¶æ£€æŸ¥
@@ -128,55 +128,55 @@
    ///     å·¥åŽ‚ç¼–å·
    /// </summary>
    [SugarColumn(ColumnName = "FACTORY")]
    public string Factory { get; set; }
    public string? Factory { get; set; }
    /// <summary>
    ///     å…¬å¸ç¼–号
    /// </summary>
    [SugarColumn(ColumnName = "COMPANY")]
    public string Company { get; set; }
    public string? Company { get; set; }
    /// <summary>
    ///     åŽŸç”Ÿäº§å·¥å•
    /// </summary>
    [SugarColumn(ColumnName = "TASK_NOY")]
    public string TaskNoy { get; set; }
    public string? TaskNoy { get; set; }
    /// <summary>
    ///     ç®±å·
    /// </summary>
    [SugarColumn(ColumnName = "BOX_NO")]
    public string BoxNo { get; set; }
    public string? BoxNo { get; set; }
    /// <summary>
    ///     åŒ…装批次
    /// </summary>
    [SugarColumn(ColumnName = "TASK_PACK")]
    public string TaskPack { get; set; }
    public string? TaskPack { get; set; }
    /// <summary>
    ///     å¡æ¿
    /// </summary>
    [SugarColumn(ColumnName = "KB_NO")]
    public string KbNo { get; set; }
    public string? KbNo { get; set; }
    /// <summary>
    ///     æ¿åž‹
    /// </summary>
    [SugarColumn(ColumnName = "BOARD_STYLE")]
    public string BoardStyle { get; set; }
    public string? BoardStyle { get; set; }
    /// <summary>
    ///     ç”Ÿäº§å·¥å•
    /// </summary>
    [SugarColumn(ColumnName = "TASK_NO")]
    public string TaskNo { get; set; }
    public string? TaskNo { get; set; }
    /// <summary>
    ///     å·¥å•号
    /// </summary>
    [SugarColumn(ColumnName = "WORK_NO")]
    public string WorkNo { get; set; }
    public string? WorkNo { get; set; }
    /// <summary>
    ///     å·¥ä½œçº¿
@@ -188,13 +188,13 @@
    ///     ä¾›åº”商编号
    /// </summary>
    [SugarColumn(ColumnName = "SUPP_NO")]
    public string SuppNo { get; set; }
    public string? SuppNo { get; set; }
    /// <summary>
    ///     é‡‡è´­å•号
    /// </summary>
    [SugarColumn(ColumnName = "PBILL_NO")]
    public string PbillNo { get; set; }
    public string? PbillNo { get; set; }
    /// <summary>
    ///     æ”¶åˆ°æ•°é‡
@@ -213,19 +213,19 @@
    ///     æ”¶è´§äºº
    /// </summary>
    [SugarColumn(ColumnName = "RCV_BY")]
    public string RcvBy { get; set; }
    public string? RcvBy { get; set; }
    /// <summary>
    ///     æ”¶è´§éƒ¨åˆ†
    /// </summary>
    [SugarColumn(ColumnName = "RCV_PART")]
    public string RcvPart { get; set; }
    public string? RcvPart { get; set; }
    /// <summary>
    ///     å…¥åº“编号
    /// </summary>
    [SugarColumn(ColumnName = "RK_NO")]
    public string RkNo { get; set; }
    public string? RkNo { get; set; }
    /// <summary>
    ///     é‡‡è´­è®¢å•ID
entity/MesInvItemOutItems.cs
@@ -229,6 +229,12 @@
    [SugarColumn(ColumnName = "about_Guid")]
    public Guid? AboutGuid { get; set; }
    /// <summary>
    ///     å‡ºåº“明细ID
    /// </summary>
    [SugarColumn(ColumnName = "qt_out_id")]
    public Guid? QtOutId { get; set; }
    [SugarColumn(IsIgnore = true)] public string? ItemName { get; set; }
    [SugarColumn(IsIgnore = true)] public string? ItemModel { get; set; }
entity/MesItemQt.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,149 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
/// </summary>
[SugarTable("MES_ITEM_QT")]
public class MesItemQt
{
    /// <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 bool? Qt014 { get; set; }
    /// <summary>
    ///     å®¡æ ¸çŠ¶æ€
    ///     é»˜è®¤å€¼: ((0))
    /// </summary>
    [SugarColumn(ColumnName = "qt015")]
    public bool? Qt015 { get; set; }
    /// <summary>
    ///     å®¡æ ¸äºº
    /// </summary>
    [SugarColumn(ColumnName = "qt016")]
    public string? Qt016 { get; set; }
    /// <summary>
    ///     ä»»åŠ¡å•å·
    /// </summary>
    [SugarColumn(ColumnName = "qt017")]
    public string? Qt017 { get; set; }
    /// <summary>
    ///     å®¢æˆ·
    /// </summary>
    [SugarColumn(ColumnName = "qt018")]
    public string? Qt018 { get; set; }
    /// <summary>
    ///     å‡ºåº“类型 1盘亏 2包材领用 3研发领用 4办公用品领用 5模具材料领用 6低值易耗品领用 7生产配件 8采购退料 9注塑件不良退料
    /// </summary>
    [SugarColumn(ColumnName = "qt019")]
    public string? Qt019 { get; set; }
    /// <summary>
    ///     å‡ºåº“方向(普通,退货)
    /// </summary>
    [SugarColumn(ColumnName = "qt020")]
    public string? Qt020 { get; set; }
    /// <summary>
    ///     é”€å”®è®¢å•号
    /// </summary>
    [SugarColumn(ColumnName = "qt021")]
    public string? Qt021 { get; set; }
    /// <summary>
    ///     é¢†æ–™äºº
    /// </summary>
    [SugarColumn(ColumnName = "qt022")]
    public string? Qt022 { get; set; }
}
entity/MesItemQtDatall.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,104 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
/// </summary>
[SugarTable("MES_ITEM_QT_DATALL")]
public class MesItemQtDatall
{
    /// <summary>
    ///     é»˜è®¤å€¼: (newid())
    /// </summary>
    [SugarColumn(ColumnName = "guid", IsPrimaryKey = true)]
    public Guid Guid { get; set; }
    /// <summary>
    ///     ä¸»è¡¨guid
    /// </summary>
    [SugarColumn(ColumnName = "qtGuid")]
    public Guid? QtGuid { 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>
    /// </summary>
    [SugarColumn(ColumnName = "itemId")]
    public string? ItemId { get; set; }
    /// <summary>
    ///     ç‰©æ–™ç¼–码 = ERP物料编号||颜色编号
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? ItemNo { get; set; }
    /// <summary>
    ///     ä»“库编码
    /// </summary>
    [SugarColumn(IsIgnore = true)]
    public string? Qt011 { get; set; }
}
service/Warehouse/MesItemBlManager.cs
@@ -1692,18 +1692,21 @@
        // èŽ·å–æœ€ç»ˆçš„å¾…å¤„ç†åˆ—è¡¨
        // èŽ·å–è¡¥æ–™å•æ˜Žç»†ä¸­æœªå®Œæˆçš„è®°å½•
        // é€šè¿‡å·¦è¿žæŽ¥æŸ¥è¯¢è¡¥æ–™å•(MesItemBl)和补料单明细(MesItemBlDetail)表
        // æ¡ä»¶: 1.补料单号匹配 2.计划数量(Bld007)减去已补数量(Bld008)大于0(即未完成的)
        var pendingList = Db.Queryable<MesItemBl, MesItemBlDetail>((a, b) =>
                new JoinQueryInfos(JoinType.Left, a.Id == b.Mid))
            .Where((a, b) => a.BlNo == query.blNo
                             && (b.Bld007 ?? 0) - (b.Bld008 ?? 0) > 0)
            .Select((a, b) => new MesItemBlDetail
            {
                Bld012 = b.Bld012,
                Bld002 = b.Bld002,
                Bld003 = b.Bld003,
                Bld004 = b.Bld004,
                Bld007 = b.Bld007,
                Bld008 = b.Bld008
                Bld012 = b.Bld012, // ç‰©æ–™ID
                Bld002 = b.Bld002, // ç‰©æ–™ç¼–号
                Bld003 = b.Bld003, // ç‰©æ–™åç§°
                Bld004 = b.Bld004, // ç‰©æ–™è§„æ ¼
                Bld007 = b.Bld007, // è®¡åˆ’数量
                Bld008 = b.Bld008 // å·²è¡¥æ•°é‡
            })
            .ToList();
service/Warehouse/MesItemQtManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,922 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.util;
using SqlSugar;
namespace NewPdaSqlServer.service.Warehouse;
public class MesItemQtManager : Repository<MesItemQt>
{
    //当前类已经继承了 Repository å¢žã€åˆ ã€æŸ¥ã€æ”¹çš„æ–¹æ³•
    /// <summary>
    ///     èŽ·å–æœªå®Œæˆçš„é€€æ–™å•å·åˆ—è¡¨
    /// </summary>
    /// <returns>退料单号列表</returns>
    public List<string> GetPendingQtList()
    {
        return Db.Queryable<MesItemQt>()
            .Where(it =>
                (it.Qt015 ?? false) == true && (it.Qt014 ?? false) == false)
            .OrderByDescending(it => it.Qtck)
            .Select(it => it.Qtck)
            .ToList();
    }
    /// <summary>
    /// èŽ·å–å¾…å¤„ç†çš„é€€æ–™å•æ˜Žç»†åˆ—è¡¨
    /// </summary>
    /// <param name="query">仓库查询参数,包含用户名和单据号</param>
    /// <returns>待处理的退料单明细列表</returns>
    public List<MesItemQtDatall> GetPendingQtList(WarehouseQuery query)
    {
        // ä»ŽæŸ¥è¯¢å‚数中获取用户名和单据号
        var c_User = query.userName;
        var p_bill_no = query.billNo;
        // æ ¹æ®å•据号查询退料单主表信息
        var mesItemQt = Db.Queryable<MesItemQt>()
            .Where(it => it.Qtck == p_bill_no)
            .First();
        // å¦‚果未找到退料单,抛出异常
        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} å·²å®Œç»“,请确认!");
        }
        // è”表查询获取未完成的明细列表
        // å…³è”表:
        // - MesItemQt: é€€æ–™å•主表(a)
        // - MesItemQtDatall: é€€æ–™å•明细表(b)
        // - MesItems: ç‰©æ–™åŸºç¡€ä¿¡æ¯è¡¨(c)
        var pendingList = Db.Queryable<MesItemQt, MesItemQtDatall, MesItems>(
                (a, b, c) =>
                    new JoinQueryInfos(
                        JoinType.Left, a.Guid == b.QtGuid, // ä¸»è¡¨å’Œæ˜Žç»†è¡¨é€šè¿‡Guid关联
                        JoinType.Left,
                        b.ItemId == c.Id.ToString())) // æ˜Žç»†è¡¨å’Œç‰©æ–™è¡¨é€šè¿‡ItemId关联
            .Where((a, b, c) =>
                a.Qtck == p_bill_no && // åŒ¹é…å•据号
                (b.Qd007 ?? 0) - (b.Qd008 ?? 0) >
                0) // è®¡åˆ’数量减去已完成数量大于0的记录(即未完成的记录)
            .OrderBy((a, b, c) => c.ItemNo) // æŒ‰ç‰©æ–™ç¼–号排序
            .Select((a, b, c) => new MesItemQtDatall
            {
                Qd002 = b.Qd002, // æ˜Žç»†è¡Œå·
                Qt011 = a.Qt011, // é€€æ–™åŽŸå› 
                ItemNo = c.ItemNo, // ç‰©æ–™ç¼–号
                Qd007 = b.Qd007 ?? 0, // è®¡åˆ’数量
                Qd008 = b.Qd008 ?? 0 // å·²å®Œæˆæ•°é‡
            })
            .ToList();
        return pendingList;
    }
    public (WarehouseQuery form, List<MesItemQtDatall> item, string message)
        OutScanBarcode(
            WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        var p_item_barcode = query.barcode;
        var c_user = query.userName;
        var p_bill_type_id = 200;
        var p_transaction_no = 202;
        // æ£€æŸ¥å•据号是否为空
        if (string.IsNullOrEmpty(p_bill_no))
        {
            throw new Exception("请选取单据号!");
        }
        // æ£€æŸ¥æ˜¯å¦é‡å¤æ‰«æ
        var existingBarcode = Db.Queryable<MesInvItemOutCDetails>()
            .Where(it =>
                it.ItemBarcode == p_item_barcode && it.PbillNo == p_bill_no)
            .Any();
        if (existingBarcode)
        {
            throw new Exception("此条码已经扫码出库,勿重复扫描!");
        }
        // èŽ·å–æ¡ç ä¿¡æ¯
        var barcode = Db.Queryable<MesInvItemBarcodes>()
            .Where(it => it.ItemBarcode == p_item_barcode)
            .First();
        if (barcode == null)
        {
            throw new Exception($"mes中不存在此条码,请核对!{p_item_barcode}");
        }
        // èŽ·å–åº“å­˜ä¿¡æ¯
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(it => it.ItemBarcode == p_item_barcode && it.Quantity > 0)
            .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>()
        //     .Where(it => it.DepotSectionsCode == stock.DepotSectionsCode)
        //     .Any();
        //
        // if (isDepotSection)
        // {
        //     throw new Exception($"在寄存仓位下的条码不可直接扫码发料{p_item_barcode}");
        // }
        // èŽ·å–å…¶ä»–å‡ºåº“å•ä¿¡æ¯
        var mesItemQt = Db.Queryable<MesItemQt>()
            .Where(it => it.Qtck == p_bill_no)
            .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>()
            .Where(it =>
                it.QtGuid == mesItemQt.Guid &&
                it.ItemId == stock.ItemId.ToString())
            .First();
        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)
        {
            var pendingList = Db
                .Queryable<MesItemQt, MesItemQtDatall, MesItems>(
                    (a, b, c) => new JoinQueryInfos(
                        JoinType.Left, a.Guid == b.QtGuid,
                        JoinType.Left, b.ItemId == c.Id.ToString()))
                .Where((a, b, c) => a.Qtck == p_bill_no &&
                                    (b.Qd007 ?? 0) - (b.Qd008 ?? 0) > 0)
                .OrderBy((a, b, c) => c.ItemNo)
                .Select((a, b, c) => new MesItemQtDatall
                {
                    Qd002 = b.Qd002, // æ˜Žç»†è¡Œå·
                    Qt011 = a.Qt011, // é€€æ–™åŽŸå› 
                    ItemNo = c.ItemNo, // ç‰©æ–™ç¼–号
                    Qd007 = b.Qd007 ?? 0, // è®¡åˆ’数量
                    Qd008 = b.Qd008 ?? 0 // å·²å®Œæˆæ•°é‡
                })
                .ToList();
            var message =
                $"请确认发料数量!!已带出满足其他出库单的发料数量 {remainingQty} ç¡®è®¤åŽè¯·ç‚¹å‡»æ¡ç æ‹†åˆ†";
            query.itemNo = stock.ItemNo;
            query.Num = stock.Quantity;
            query.Fum = remainingQty;
            return (query, pendingList, message);
        }
        var mesItemQtDatalls = new List<MesItemQtDatall>();
        var mess = "";
        UseTransaction(db =>
        {
            var commit = 0;
            // æŸ¥æ‰¾å½“天是否已存在出库单
            var existingOut = Db.Queryable<MesInvItemOuts>()
                .Where(it => it.PbillNo == p_bill_no
                             // && it.DepotCode == stock.DepotsCode
                             && it.DepotId == stock.DepotId
                             && it.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
                             DateTime.Now.Date.ToString("yyyy-MM-dd")
                             && it.BillTypeId == p_bill_type_id
                             && it.TransactionNo == p_transaction_no
                             && it.Status == 0)
                .First();
            Guid outId;
            string outNo;
            if (existingOut == null)
            {
                // åˆ›å»ºæ–°çš„出库单
                outId = Guid.NewGuid();
                outNo = BillNo.GetBillNo("INV_OUT_OTHER");
                var mesItemQt = Db.Queryable<MesItemQt>()
                    .Where(it => it.Qtck == p_bill_no)
                    .First();
                var newOut = new MesInvItemOuts
                {
                    Guid = outId,
                    ItemOutNo = outNo,
                    TaskNo = p_bill_no,
                    Status = 0,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    BillTypeId = p_bill_type_id,
                    TransactionNo = p_transaction_no,
                    DepotCode = stock.DepotsCode,
                    DepotId = stock.DepotsId.HasValue
                        ? (int)stock.DepotsId
                        : null,
                    OutPart = mesItemQt.Qt012,
                    FType = 0,
                    WorkNo = p_bill_no,
                    OutType = "其他出库",
                    PbillNo = p_bill_no,
                    OutDate = DateTime.Now,
                    Nflag = 0,
                    Reason = mesItemQt.Qt010,
                    Remark = mesItemQt.Qt010
                };
                commit += db.Insertable(newOut).IgnoreColumns(true)
                    .ExecuteCommand();
            }
            else
            {
                outId = existingOut.Guid;
                outNo = existingOut.ItemOutNo;
            }
            // èŽ·å–é€€æ–™å•æ˜Žç»†ä¿¡æ¯
            qtDetail = Db.Queryable<MesItemQtDatall>()
                .Where(it =>
                    it.QtGuid == mesItemQt.Guid &&
                    it.ItemId == stock.ItemId.ToString())
                .First();
            if (qtDetail == null)
            {
                throw new Exception($"未找到对应的退料单明细信息");
            }
            // æ£€æŸ¥æ˜¯å¦å·²å­˜åœ¨å‡ºåº“物料记录
            var existingOutItem = Db.Queryable<MesInvItemOutItems>()
                .Where(it =>
                    it.ItemOutId == outId && it.ItemId == barcode.ItemId)
                .First();
            if (existingOutItem == null)
            {
                // åˆ›å»ºæ–°çš„出库物料记录
                var newOutItem = new MesInvItemOutItems
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = outId,
                    ItemNo = qtDetail.Qd002,
                    Quantity = stock.Quantity,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    DepotCode = stock.DepotsCode,
                    TaskNo = p_bill_no,
                    WorkNo = p_bill_no,
                    QtOutId = qtDetail.Guid,
                    // WorkLine = qtDetail.Id,
                    // ErpItemNo = qtDetail.Qd012,
                    PbillNo = p_bill_no,
                    ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                        ? long.Parse(qtDetail.ItemId)
                        : null,
                    FType = 0,
                    // Unit = qtDetail.Qd009
                };
                commit += db.Insertable(newOutItem).IgnoreColumns(true)
                    .ExecuteCommand();
            }
            else
            {
                // æ›´æ–°å·²å­˜åœ¨çš„出库物料记录数量
                commit += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(it =>
                        it.Quantity == (it.Quantity ?? 0) + stock.Quantity)
                    .Where(it => it.ItemOutId == outId &&
                                 it.ItemId == barcode.ItemId &&
                                 it.QtOutId == qtDetail.Guid)
                    .ExecuteCommand();
            }
            // åˆ›å»ºå‡ºåº“条码明细记录
            var outCDetail = new MesInvItemOutCDetails
            {
                ItemOutId = outId,
                ItemBarcode = stock.ItemBarcode,
                ItemNo = stock.ItemNo,
                LotNo = stock.LotNo,
                Quantity = stock.Quantity,
                ForceOutFlag = 0,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                DepotCode = stock.DepotsCode,
                DepotId = stock.DepotsId.HasValue
                    ? (int)stock.DepotsId
                    : null,
                // DepotsCode = stock.DepotsCode,
                // DepotSectionsCode = stock.DepotSectionsCode,
                DepotSectionCode = stock.DepotSectionsCode,
                BoardStyle = stock.BoardStyle,
                TaskNo = p_bill_no,
                WorkNo = p_bill_no,
                // WorkLine = qtDetail.Id,
                SuppNo = stock.SuppNo,
                PbillNo = p_bill_no,
                ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                    ? long.Parse(qtDetail.ItemId)
                    : null
            };
            commit += db.Insertable(outCDetail).IgnoreColumns(true)
                .ExecuteCommand();
            // æ’入业务流水记录
            var business = new MesInvBusiness2
            {
                Status = 1,
                BillTypeId = p_bill_type_id,
                TransactionCode = p_transaction_no.ToString(),
                BusinessType = 1,
                ItemBarcode = stock.ItemBarcode,
                ItemNo = stock.ItemNo,
                LotNo = stock.LotNo,
                EpFlag = true,
                Quantity = stock.Quantity,
                FromInvDepotsCode = stock.DepotsCode,
                FromInvDepotSectionsCode = stock.DepotSectionsCode,
                Description = "其他出库",
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                TaskNo = p_bill_no,
                BillNo = outNo,
                WorkNo = p_bill_no,
                // WorkLine = qtDetail.Id,
                SuppId = stock.SuppId,
                SuppNo = stock.SuppNo,
                ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                    ? long.Parse(qtDetail.ItemId)
                    : null
            };
            commit += db.Insertable(business).IgnoreColumns(true)
                .ExecuteCommand();
            // åˆ é™¤åº“存记录
            commit += db.Deleteable<MesInvItemStocks>()
                .Where(it => it.ItemBarcode == stock.ItemBarcode)
                .ExecuteCommand();
            // æ›´æ–°é€€æ–™å•明细已完成数量
            commit += db.Updateable<MesItemQtDatall>()
                .SetColumns(it => it.Qd008 == (it.Qd008 ?? 0) + stock.Quantity)
                .Where(it => it.Guid == qtDetail.Guid)
                .ExecuteCommand();
            // æ£€æŸ¥æ˜Žç»†æ˜¯å¦å®Œæˆ,如果完成则更新状态
            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>(
                    (a, b, c) => new JoinQueryInfos(
                        JoinType.Left, a.Guid == b.QtGuid,
                        JoinType.Left, b.ItemId == c.Id.ToString()))
                .Where((a, b, c) => a.Qtck == p_bill_no &&
                                    (b.Qd007 ?? 0) - (b.Qd008 ?? 0) > 0)
                .OrderBy((a, b, c) => c.ItemNo)
                .Select((a, b, c) => new MesItemQtDatall
                {
                    Qd002 = b.Qd002, // æ˜Žç»†è¡Œå·
                    Qt011 = a.Qt011, // é€€æ–™åŽŸå› 
                    ItemNo = c.ItemNo, // ç‰©æ–™ç¼–号
                    Qd007 = b.Qd007 ?? 0, // è®¡åˆ’数量
                    Qd008 = b.Qd008 ?? 0 // å·²å®Œæˆæ•°é‡
                })
                .ToList();
            // å¦‚果没有待处理明细,更新退料单状态为已完成
            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} å·²å‡ºåº“";
            query.barcode = null;
            query.itemNo = stock.ItemNo;
            query.Num = stock.Quantity;
            query.Fum = null;
            if (commit < 5)
            {
                throw new Exception("更新失败");
            }
            return commit;
        });
        return (query, mesItemQtDatalls, mess);
    }
    public (WarehouseQuery form, List<MesItemQtDatall> item, string message)
        PrintQtckBarcode(
            WarehouseQuery query)
    {
        var p_bill_no = query.billNo;
        var p_old_barcode = query.barcode;
        var c_user = query.userName;
        var p_qty = query.Fum;
        var p_bill_type_id = 200;
        var p_transaction_no = 202;
        // æ£€æŸ¥å•据号是否为空
        if (string.IsNullOrEmpty(p_bill_no))
        {
            throw new Exception("请选取单据号!");
        }
        // æ£€æŸ¥æ•°é‡æ˜¯å¦æœ‰æ•ˆ
        if (p_qty <= 0)
        {
            throw new Exception("请输入正确的发料数量!");
        }
        // èŽ·å–åº“å­˜æ¡ç ä¿¡æ¯
        var stock = Db.Queryable<MesInvItemStocks>()
            .Where(it => it.ItemBarcode == p_old_barcode && it.Quantity > 0)
            .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>()
            .Where(it => it.ItemBarcode == p_old_barcode)
            .First();
        if (barcode == null)
        {
            throw new Exception($"mes中不存在此条码,请核对!{p_old_barcode}");
        }
        // èŽ·å–é€€æ–™å•ä¿¡æ¯
        var mesItemQt = Db.Queryable<MesItemQt>()
            .Where(it => it.Qtck == p_bill_no)
            .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>()
            .Where(it =>
                it.QtGuid == mesItemQt.Guid &&
                it.ItemId == stock.ItemId.ToString())
            .First();
        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>();
        var newBarcode = string.Empty;
        UseTransaction(db =>
        {
            var commit = 0;
            // å¦‚果需要拆分条码
            if (totalQty > p_qty)
            {
                var mesItems = db.Queryable<MesItems>()
                    .Where(s => s.Id == stock.ItemId).First();
                // ç”Ÿæˆæ–°æ¡ç å·
                newBarcode = BillNo.GetBillNo("TMBH(条码编号)", mesItems.ItemNo);
                // æ’入新条码记录
                commit += db.Insertable(new MesInvItemBarcodes
                {
                    Guid = Guid.NewGuid(),
                    ItemBarcode = newBarcode,
                    ItemNo = barcode.ItemNo,
                    LotNo = barcode.LotNo,
                    Quantity = p_qty,
                    TaskNo = barcode.TaskNo,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    OldItemBarcode = p_old_barcode,
                    Mblnr = barcode.Mblnr,
                    Zeile = barcode.Zeile,
                    Barcodestatus = false,
                    Oldqty = Convert.ToInt64(p_qty.Value),
                    Unit = barcode.Unit,
                    LotDate = barcode.LotDate,
                    Memo = "其他出库拆分",
                    SuppNo = barcode.SuppNo,
                    ItemSname = barcode.ItemSname,
                    TrLotno = barcode.TrLotno,
                    BillNo = barcode.BillNo,
                    UrgentFlag = barcode.UrgentFlag,
                    InsDate = barcode.InsDate,
                    WorkNo = barcode.WorkNo,
                    WorkLine = barcode.WorkLine,
                    ComeFlg = 5,
                    EbelnK3id = barcode.EbelnK3id,
                    LineK3id = barcode.LineK3id,
                    ItemId = barcode.ItemId,
                }).IgnoreColumns(true).ExecuteCommand();
                // æ›´æ–°åŽŸæ¡ç æ•°é‡
                commit += db.Updateable<MesInvItemBarcodes>()
                    .SetColumns(it => it.Quantity == it.Quantity - p_qty)
                    .Where(it => it.ItemBarcode == p_old_barcode)
                    .ExecuteCommand();
                // æ›´æ–°åŽŸåº“å­˜æ•°é‡
                commit += db.Updateable<MesInvItemStocks>()
                    .SetColumns(it => it.Quantity == it.Quantity - p_qty)
                    .Where(it => it.ItemBarcode == p_old_barcode)
                    .ExecuteCommand();
                // æ’入新库存记录
                commit += db.Insertable(new MesInvItemStocks
                {
                    Guid = Guid.NewGuid(),
                    ItemBarcode = newBarcode,
                    ItemNo = stock.ItemNo,
                    LotNo = stock.LotNo,
                    Quantity = p_qty,
                    DepotsCode = stock.DepotsCode,
                    DepotSectionsCode = stock.DepotSectionsCode,
                    CheckDate = stock.CheckDate,
                    IndepDate = stock.IndepDate,
                    IqcStatus = stock.IqcStatus,
                    WorkNo = stock.WorkNo,
                    WorkLine = stock.WorkLine,
                    SuppNo = stock.SuppNo,
                    BillNo = stock.BillNo,
                    EbelnK3id = stock.EbelnK3id,
                    LineK3id = stock.LineK3id,
                    ItemId = stock.ItemId,
                }).IgnoreColumns(true).ExecuteCommand();
                // æ’入业务流水记录
                commit += db.Insertable(new MesInvBusiness2
                {
                    Status = 1,
                    BillTypeId = p_bill_type_id,
                    TransactionCode = p_transaction_no.ToString(),
                    BusinessType = 1,
                    TaskNo = barcode.TaskNo,
                    BillNo = barcode.BillNo,
                    ItemBarcode = newBarcode,
                    ItemNo = barcode.ItemNo,
                    LotNo = barcode.LotNo,
                    EpFlag = true,
                    Quantity = p_qty,
                    FromInvDepotsCode = null,
                    FromInvDepotSectionsCode = null,
                    ToInvDepotsCode = stock.DepotsCode,
                    ToInvDepotSectionsCode = stock.DepotSectionsCode,
                    Description = "其他出库条码拆分",
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    Factory = "1000",
                    Company = "1000",
                    WorkNo = stock.WorkNo,
                    WorkLine = stock.WorkLine,
                    EbelnK3id = stock.EbelnK3id,
                    LineK3id = stock.LineK3id,
                    SuppId = stock.SuppId,
                    SuppNo = stock.SuppNo,
                    ItemId = stock.ItemId,
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                newBarcode = p_old_barcode;
            }
            // èŽ·å–æˆ–åˆ›å»ºå‡ºåº“å•
            var outRecord = db.Queryable<MesInvItemOuts>()
                .Where(it => it.PbillNo == p_bill_no
                             && it.DepotCode == stock.DepotsCode
                             && it.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
                             DateTime.Now.Date.ToString("yyyy-MM-dd")
                             && it.BillTypeId == p_bill_type_id
                             && it.TransactionNo == p_transaction_no
                             && it.Status == 0)
                .First();
            var outId = Guid.Empty;
            var outNo = string.Empty;
            if (outRecord == null)
            {
                outId = Guid.NewGuid();
                outNo = BillNo.GetBillNo("INV_OUT_OTHER");
                // åˆ›å»ºæ–°å‡ºåº“单
                commit += db.Insertable(new MesInvItemOuts
                {
                    Guid = outId,
                    ItemOutNo = $"OUT-{DateTime.Now:yyyyMMddHHmmss}",
                    TaskNo = p_bill_no,
                    Status = 0,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    BillTypeId = p_bill_type_id,
                    TransactionNo = p_transaction_no,
                    DepotCode = stock.DepotsCode,
                    OutPart = mesItemQt.Qt012,
                    FType = 0,
                    WorkNo = p_bill_no,
                    OutType = "其他出库",
                    BusinessType = "",
                    PbillNo = p_bill_no,
                    OutDate = DateTime.Now,
                    Nflag = 0,
                    Reason = mesItemQt.Qt010,
                }).ExecuteReturnIdentity();
                outNo = $"OUT-{DateTime.Now:yyyyMMddHHmmss}";
            }
            else
            {
                outId = outRecord.Guid;
                outNo = outRecord.ItemOutNo;
            }
            // æ£€æŸ¥å¹¶æ›´æ–°å‡ºåº“单明细
            var outItem = db.Queryable<MesInvItemOutItems>()
                .Where(it =>
                    it.ItemOutId == outId && it.ItemId == barcode.ItemId)
                .First();
            if (outItem == null)
            {
                // æ’入新明细
                db.Insertable(new MesInvItemOutItems
                {
                    ItemOutId = outId,
                    ItemNo = qtDetail.Qd002,
                    Quantity = p_qty,
                    CreateBy = c_user,
                    CreateDate = DateTime.Now,
                    LastupdateBy = c_user,
                    LastupdateDate = DateTime.Now,
                    DepotCode = stock.DepotsCode,
                    TaskNo = p_bill_no,
                    WorkNo = p_bill_no,
                    QtOutId = qtDetail.Guid,
                    // WorkLine = qtDetail.Id.ToString(),
                    ErpItemNo = qtDetail.ItemNo,
                    PbillNo = p_bill_no,
                    ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                        ? long.Parse(qtDetail.ItemId)
                        : null,
                    FType = 0,
                    // Unit = qtDetail.Qd009
                }).ExecuteCommand();
            }
            else
            {
                // æ›´æ–°æ˜Žç»†æ•°é‡
                db.Updateable<MesInvItemOutItems>()
                    .SetColumns(it =>
                        it.Quantity == (it.Quantity ?? 0) + p_qty)
                    .Where(it =>
                        it.ItemOutId == outId &&
                        it.ItemId == stock.ItemId &&
                        it.QtOutId == qtDetail.Guid)
                    .ExecuteCommand();
            }
            // æ’入出库明细
            db.Insertable(new MesInvItemOutCDetails
            {
                ItemOutId = outId,
                ItemBarcode = newBarcode,
                ItemNo = stock.ItemNo,
                LotNo = stock.LotNo,
                Quantity = p_qty,
                ForceOutFlag = 0,
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                DepotCode = stock.DepotsCode,
                DepotSectionCode = stock.DepotSectionsCode,
                Factory = "1000",
                Company = "1000",
                BoardStyle = stock.BoardStyle,
                TaskNo = p_bill_no,
                WorkNo = p_bill_no,
                // WorkLine = qtDetail.Id.ToString(),
                SuppNo = stock.SuppNo,
                PbillNo = p_bill_no,
                ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                    ? long.Parse(qtDetail.ItemId)
                    : null
            }).IgnoreColumns(true).ExecuteCommand();
            // æ’入业务记录
            db.Insertable(new MesInvBusiness2
            {
                Status = 1,
                BillTypeId = p_bill_type_id,
                TransactionCode = p_transaction_no.ToString(),
                BusinessType = 1,
                ItemBarcode = newBarcode,
                ItemNo = stock.ItemNo,
                LotNo = stock.LotNo,
                EpFlag = true,
                Quantity = p_qty,
                FromInvDepotsCode = stock.DepotsCode,
                FromInvDepotSectionsCode = stock.DepotSectionsCode,
                Description = "其他出库",
                CreateBy = c_user,
                CreateDate = DateTime.Now,
                LastupdateBy = c_user,
                LastupdateDate = DateTime.Now,
                Factory = "1000",
                Company = "1000",
                TaskNo = p_bill_no,
                BillNo = outNo,
                WorkNo = p_bill_no,
                // WorkLine = qtDetail.Id.ToString(),
                SuppId = stock.SuppId,
                SuppNo = stock.SuppNo,
                ItemId = !string.IsNullOrEmpty(qtDetail.ItemId)
                    ? long.Parse(qtDetail.ItemId)
                    : null
            }).IgnoreColumns(true).ExecuteCommand();
            // åˆ é™¤åº“存记录
            db.Deleteable<MesInvItemStocks>()
                .Where(it => it.ItemBarcode == newBarcode)
                .ExecuteCommand();
            // æ›´æ–°é€€æ–™å•明细
            db.Updateable<MesItemQtDatall>()
                .SetColumns(it => it.Qd008 == (it.Qd008 ?? 0) + (int)p_qty)
                .SetColumnsIF(
                    (qtDetail.Qd007 ?? 0) - (qtDetail.Qd008 ?? 0) == p_qty,
                    it => it.Qd011 == 1)
                .Where(it => it.Guid == qtDetail.Guid)
                .ExecuteCommand();
            // æ£€æŸ¥æ˜¯å¦æ‰€æœ‰æ˜Žç»†éƒ½å·²å®Œæˆ
            var hasUnfinished = db.Queryable<MesItemQtDatall>()
                .Where(it => it.Qd011 == 0)
                .Any();
            // å¦‚果所有明细完成,更新退料单状态
            if (!hasUnfinished)
            {
                db.Updateable<MesItemQt>()
                    .SetColumns(it => it.Qt014 == true)
                    .Where(it => it.Qtck == p_bill_no)
                    .ExecuteCommand();
            }
            // èŽ·å–å‰©ä½™å¾…å¤„ç†æ˜Žç»†
            mesItemQtDatalls = db
                .Queryable<MesItemQt, MesItemQtDatall, MesItems>(
                    (a, b, c) => new JoinQueryInfos(
                        JoinType.Left, a.Guid == b.QtGuid,
                        JoinType.Left, b.ItemId == c.Id.ToString()))
                .Where((a, b, c) => a.Qtck == p_bill_no &&
                                    (b.Qd007 ?? 0) - (b.Qd008 ?? 0) > 0)
                .OrderBy((a, b, c) => c.ItemNo)
                .Select((a, b, c) => new MesItemQtDatall
                {
                    Qd002 = b.Qd002,
                    Qt011 = a.Qt011,
                    ItemNo = c.ItemNo,
                    Qd007 = b.Qd007 ?? 0,
                    Qd008 = b.Qd008 ?? 0
                })
                .ToList();
            message = $"操作成功!拆分条码:{newBarcode} æ•°é‡:{p_qty}已出库";
            return commit;
        });
        return (query, mesItemQtDatalls, message);
    }
}
service/Warehouse/MesItemQtrkManager.cs
@@ -54,16 +54,13 @@
        return details;
    }
    public String ScanInDepotsQT(WarehouseQuery query)
    public string ScanInDepotsQT(WarehouseQuery query)
    {
        var sectionCode = query.sectionCode;
        var billNo = query.billNo;
        // 1. éªŒè¯åº“位条码是否为空
        if (string.IsNullOrEmpty(sectionCode))
        {
            throw new Exception("请扫库位条码!");
        }
        if (string.IsNullOrEmpty(sectionCode)) throw new Exception("请扫库位条码!");
        // 2. æŸ¥è¯¢åº“位对应的仓库编码
        var depotCode = Db.Queryable<MesDepotSections, MesDepots>(
@@ -74,9 +71,7 @@
            .First();
        if (depotCode == null)
        {
            throw new Exception($"库位编码 {sectionCode} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        // 3. æŸ¥è¯¢ç”³è¯·å•对应的仓库
        var qtrk = Db.Queryable<MesItemQtrk>()
@@ -84,16 +79,11 @@
            .Select(x => x.Qt011)
            .First();
        if (qtrk == null)
        {
            throw new Exception($"库位编码 {sectionCode} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        if (qtrk == null) throw new Exception($"库位编码 {sectionCode} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        // 4. éªŒè¯åº“位是否属于申请仓库
        if (depotCode != qtrk)
        {
            throw new Exception($"扫码库位 {sectionCode} ä¸å±žäºŽç”³è¯·æ­¤ä»“库!");
        }
        // 5. è¿”回成功信息
        return $"仓库:{qtrk} åº“位:{sectionCode}";
@@ -112,9 +102,7 @@
        // 1. éªŒè¯åº“位条码是否为空
        if (string.IsNullOrEmpty(p_section_code))
        {
            throw new Exception("请扫库位条码!");
        }
        // 2. æŸ¥è¯¢åº“位对应的仓库编码和仓库ID
        var depotInfo = Db.Queryable<MesDepotSections, MesDepots>(
@@ -125,9 +113,7 @@
            .First();
        if (depotInfo == null)
        {
            throw new Exception($"库位编码 {p_section_code} ä¸å­˜åœ¨ï¼Œè¯·ç¡®è®¤ï¼");
        }
        var c_depot_code = depotInfo.DepotCode;
        var c_depot_id = depotInfo.DepotId;
@@ -136,45 +122,30 @@
        var existsInStock = Db.Queryable<MesInvItemInCDetails>()
            .Any(x => x.ItemBarcode == p_item_barcode);
        if (existsInStock)
        {
            throw new Exception("此条码已扫码入库完成,请核对!");
        }
        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 == null) throw new Exception("条码不存在,请核对!");
        if (barcode.ComeFlg != 3)
        {
            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("此条码已扫码入库完成,请核对!");
        }
        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("其他入库申请单不存在!");
        }
        if (qtrk == null) throw new Exception("其他入库申请单不存在!");
        // 6. æŸ¥è¯¢ç”³è¯·å•明细
        var detail = Db.Queryable<MesItemQtrrDetail>()
@@ -184,15 +155,11 @@
            .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>();
@@ -255,7 +222,6 @@
                .First();
            if (existingItem == null)
            {
                // ä¸å­˜åœ¨åˆ™æ–°å¢žå…¥åº“明细
                res += db.Insertable(new MesInvItemInCItems
                {
@@ -282,9 +248,7 @@
                    LineK3id = barcode.LineK3id,
                    ItemId = barcode.ItemId
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                // å­˜åœ¨åˆ™æ›´æ–°æ•°é‡
                res += db.Updateable<MesInvItemInCItems>()
                    .SetColumns(
@@ -294,7 +258,6 @@
                                && x.WorkNo == barcode.WorkNo
                                && x.WorkLine == barcode.WorkLine)
                    .ExecuteCommand();
            }
            // æ’入入库明细记录
@@ -366,7 +329,7 @@
                SuppNo = barcode.SuppNo,
                EbelnK3id = barcode.EbelnK3id,
                LineK3id = barcode.LineK3id,
                ItemId = barcode.ItemId,
                ItemId = barcode.ItemId
                // SalesOrder = barcode.SalesOrder,
                // IsZy = barcode.IsZy,
                // OuterBarcode = barcode.OuterBarcode
@@ -398,7 +361,7 @@
                EbelnK3id = barcode.EbelnK3id,
                LineK3id = barcode.LineK3id,
                ItemId = barcode.ItemId,
                BillNo = barcode.BillNo,
                BillNo = barcode.BillNo
                // SalesOrder = barcode.SalesOrder,
                // IsZy = barcode.IsZy,
                // Visable = 0,
@@ -423,12 +386,10 @@
                .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(
@@ -449,17 +410,12 @@
                .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("插入或更新失败");
            }
            if (res < 5) throw new Exception("插入或更新失败");
            return res;
        });