快乐的昕的电脑
2 天以前 f7c36a9444bf8d93bff7b8e481eacd70f1053540
销售出库:条码拆分更改为存储过程实现
已修改2个文件
557 ■■■■ 文件已修改
Controllers/Warehouse/MesXsckController.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Warehouse/MesXsckManager.cs 539 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Warehouse/MesXsckController.cs
@@ -2,6 +2,7 @@
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.service;
using NewPdaSqlServer.entity;
using NewPdaSqlServer.service.@base;
using NewPdaSqlServer.service.Warehouse;
using NewPdaSqlServer.util;
@@ -15,6 +16,8 @@
public class MesXsckController : BaseController
{
    private readonly MesXsckManager _manager = new();
    private readonly MesPrintMangeer _mCf = new();
    /***进入模版管理可以修改模版***/
@@ -196,14 +199,21 @@
    /// <response code="200">拆分成功</response>
    /// <response code="400">拆分失败,返回具体错误信息</response>
    [HttpPost("SplitBarcode")]
    public ResponseResult SplitBarcode([FromBody] WarehouseQuery query)
    public ResponseResult SplitBarcode(WarehouseQuery query)
    {
        try
        {
            dynamic resultInfos = new ExpandoObject();
            var (success, pendingList) = _manager.SplitBarcode(query);
            resultInfos.success = success;
            resultInfos.pendingList = pendingList;
            resultInfos.tbBillList = new ExpandoObject();
            resultInfos.tbBillList.printInfo = _mCf.getPrintInfo(query);
            var scanResult = _manager.SplitBarcode(query);
            resultInfos.tbBillList.cfBarInfo = _mCf.getCfInfo(scanResult);
            //dynamic resultInfos = new ExpandoObject();
            //var (success, pendingList) = _manager.SplitBarcode(query);
            //resultInfos.success = success;
            //resultInfos.pendingList = pendingList;
            return new ResponseResult
            {
                status = 0,
service/Warehouse/MesXsckManager.cs
@@ -119,7 +119,7 @@
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            if (query.userName.IsNullOrEmpty()) throw new Exception("用户名不允许为空");
            if (query.daa001.IsNullOrEmpty()) throw new Exception("发货通知单号不允许为空");
            if (query.billNo.IsNullOrEmpty()) throw new Exception("发货通知单号不允许为空");
            if (query.barcode.IsNullOrEmpty()) throw new Exception("条码不允许为空");
            using (var cmd = new SqlCommand("[prc_pda_XSCK]", conn))
@@ -135,7 +135,7 @@
                        new("@barcode_num", SqlDbType.NVarChar, 300),
                        new("@split_num", SqlDbType.NVarChar, 300),
                        new("@c_User", query.userName),
                        new("@p_biLL_no", query.daa001),
                        new("@p_biLL_no", query.billNo),
                        new("@p_item_barcode", query.barcode)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
@@ -191,499 +191,68 @@
    ///     - Num: 发料数量(必填,必须大于0)
    ///     - blNo: 发货通知单号(必填)
    /// </remarks>
    public (bool success, List<MesItemBlDetail> pendingList) SplitBarcode(
        WarehouseQuery query)
    public ProductionPickDto SplitBarcode(WarehouseQuery query)
    {
        if (string.IsNullOrEmpty(query.userName))
            throw new Exception("用户名不能为空!");
        if (query.userName.IsNullOrEmpty()) throw new Exception("用户名不允许为空");
        if (query.billNo.IsNullOrEmpty()) throw new Exception("申请单号不允许为空");
        if (query.barcode.IsNullOrEmpty()) throw new Exception("条码不允许为空");
        if (string.IsNullOrEmpty(query.billNo))
            throw new Exception("请选取单据号!");
        if (query.Num is null or 0) throw new Exception("条码拆分数不允许为空或者为0");
        if (string.IsNullOrEmpty(query.barcode))
            throw new Exception("请扫描条码!");
        if ((query.Num ?? 0) <= 0)
            throw new Exception("请输入正确的发料数量!");
        if (string.IsNullOrEmpty(query.blNo))
            throw new Exception("发货通知单号不能为空!");
        // 检验是否重复扫描
        var exists = Db.Queryable<MesInvItemOutCDetails>()
            .Where(b => b.ItemBarcode == query.barcode)
            .Any();
        if (exists)
            throw new Exception("此条码已扫描,勿重复扫码!");
        // 查询条码库存信息
        var stockBarcode = Db.Queryable<MesInvItemStocks>()
            .Where(t => t.ItemBarcode == query.barcode && t.Quantity > 0)
            .First();
        if (stockBarcode == null)
            throw new Exception($"库存中无此条码,请核对!{query.barcode}");
        var totalQty = stockBarcode.Quantity;
        string newBarcode = null;
        var outNoType = "";
        if (query.Type == "生产补料")
        var _strMsg = "";
        var _intSum = "";
        var _cfBar = "";//拆分后条码
        using (var conn = new SqlConnection(DbHelperSQL.strConn))
        {
            outNoType = "SCBL(生产补料)";
        }
        else
        {
            outNoType = "SCCL(生产超领)";
        }
        // 开启事务处理
        var success = UseTransaction(db =>
        {
            var executeCommand = 0;
            // 拆分条码
            if (totalQty > query.Num)
            using (var cmd = new SqlCommand("[prc_pda_XSCK_CF_new]", conn))
            {
                var mesItems = db.Queryable<MesItems>()
                    .Where(s => s.Id == stockBarcode.ItemId).First();
                // 生成新条码号
                newBarcode = BillNo.GetBillNo("TM(条码)", mesItems.ItemNo);
                // 写入新条码
                executeCommand += db.Insertable(new MesInvItemBarcodes
                try
                {
                    Guid = Guid.NewGuid(),
                    ItemBarcode = newBarcode,
                    CustNo = stockBarcode.CustomerNo,
                    // ProductCode = stockBarcode.ProductCode,
                    // ItemBarcode2 = stockBarcode.ItemBarcode2,
                    // ItemCode = stockBarcode.ItemCode,
                    ItemNo = stockBarcode.ItemNo,
                    LotNo = stockBarcode.LotNo,
                    Quantity = query.Num,
                    EpFlag = true,
                    TaskNo = stockBarcode.TaskNo,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    OldItemBarcode = query.barcode,
                    // Mblnr = stockBarcode.Mblnr,
                    // Zeile = stockBarcode.Zeile,
                    // RohInId = stockBarcode.RohInId,
                    Barcodestatus = false,
                    Oldqty = query.Num as long?,
                    // Unit = stockBarcode.Unit,
                    // WeightUnit = stockBarcode.WeightUnit,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    BillNo = stockBarcode.BillNo,
                    BoardStyle = stockBarcode.BoardStyle,
                    // ColorName = stockBarcode.ColorName,
                    WorkNo = stockBarcode.WorkNo,
                    WorkLine = stockBarcode.WorkLine,
                    // MemoBad = stockBarcode.MemoBad,
                    ComeFlg = 5,
                    // Memo = stockBarcode.Memo,
                    SuppId = stockBarcode.SuppId,
                    SuppNo = stockBarcode.SuppNo,
                    InsDate = stockBarcode.IndepDate, // Added InsDate
                    ItemId = stockBarcode.ItemId
                    // ItemUnit = stockBarcode.ItemUnit // Added ItemUnit
                }).IgnoreColumns(true).ExecuteCommand();
                // 更新原条码数量
                executeCommand += db.Updateable<MesInvItemBarcodes>()
                    .SetColumns(it => it.Quantity == it.Quantity - query.Num)
                    .Where(it => it.ItemBarcode == query.barcode)
                    .ExecuteCommand();
                // 更新原条码数量
                executeCommand += db.Updateable<MesInvItemStocks>()
                    .SetColumns(it => it.Quantity == it.Quantity - query.Num)
                    .Where(it => it.ItemBarcode == query.barcode)
                    .ExecuteCommand();
                //// 删除原条码库存记录
                //executeCommand += db.Deleteable<MesInvItemStocks>()
                //    .Where(it => it.ItemBarcode == query.barcode)
                //    .ExecuteCommand();
                // 插入剩余条码数量的新库存记录
                executeCommand += db.Insertable(new MesInvItemStocks
                {
                    Guid = Guid.NewGuid(),
                    TaskNo = stockBarcode.TaskNo,
                    ItemBarcode = newBarcode,
                    ItemNo = stockBarcode.ItemNo,
                    LotNo = stockBarcode.LotNo,
                    Quantity = query.Num,
                    EpFlag = stockBarcode.EpFlag,
                    CustomerNo = stockBarcode.CustomerNo,
                    ItemWt = stockBarcode.ItemWt,
                    DepotsCode = stockBarcode.DepotsCode,
                    DepotsId = stockBarcode.DepotsId,
                    DepotSectionsCode = stockBarcode.DepotSectionsCode,
                    CheckDate = stockBarcode.CheckDate,
                    ItemType = stockBarcode.ItemType,
                    IndepDate = stockBarcode.IndepDate,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    IqcStatus = stockBarcode.IqcStatus,
                    BoardStyle = stockBarcode.BoardStyle,
                    WorkNo = stockBarcode.WorkNo,
                    WorkLine = stockBarcode.WorkLine,
                    SuppNo = stockBarcode.SuppNo,
                    ItemId = stockBarcode.ItemId
                    // UnitId = stockBarcode.ItemUnit
                }).IgnoreColumns(true).ExecuteCommand();
                // 写入新条码的交易记录
                executeCommand += db.Insertable(new MesInvBusiness2
                {
                    Guid = Guid.NewGuid(),
                    Status = 1,
                    BillTypeId = 200, // p_bill_type_id
                    TransactionCode = "209", // p_transaction_no
                    BusinessType = 0,
                    ItemBarcode = newBarcode,
                    ItemNo = stockBarcode.ItemNo,
                    LotNo = stockBarcode.LotNo,
                    EpFlag = true,
                    Quantity = query.Num,
                    FromInvDepotsCode = null,
                    FromInvDepotSectionsCode = null,
                    ToInvDepotsCode = stockBarcode.DepotsCode,
                    ToInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
                    Description = query.Type + "拆分生成",
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    TaskNo = stockBarcode.TaskNo,
                    BillNo = stockBarcode.BillNo,
                    WorkNo = stockBarcode.WorkNo,
                    WorkLine = stockBarcode.WorkLine,
                    SuppNo = stockBarcode.SuppNo,
                    SuppId = stockBarcode.SuppId,
                    ItemId = stockBarcode.ItemId
                    // CkDepot = stockBarcode.DepotsId
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else if (totalQty < query.Num)
            {
                throw new Exception("发料数量大于条码数,请核对!");
            }
            //if (string.IsNullOrEmpty(newBarcode)) newBarcode = query.barcode;
            // 检查发货通知单状态
            var mesItemBl = Db.Queryable<MesItemBl>()
                .Where(a => a.BlNo == query.blNo && (a.Bl018 ?? false) == true)
                .First();
            if (mesItemBl == null)
                throw new Exception($"申请单 {query.blNo} 已撤回!");
            if (mesItemBl.Bl018 != true)
                throw new Exception($"申请单 {query.blNo} 未审核!");
            if (mesItemBl.Bl019 == true)
                throw new Exception($"申请单 {query.blNo} 已完结!");
            // 获取发货通知单明细并校验
            var blDetail = Db.Queryable<MesItemBlDetail>()
                .Where(b =>
                    b.Mid == mesItemBl.Id && b.Bld012 == stockBarcode.ItemId)
                .First();
            if (blDetail == null)
                throw new Exception($"申请单不存在此物料 {stockBarcode.ItemNo} 请确认!");
            var remainingQty = (blDetail.Bld007 ?? 0) - (blDetail.Bld008 ?? 0);
            if (remainingQty == 0)
                throw new Exception("物料已扫码完成,请核对!");
            if (query.Num > remainingQty)
                throw new Exception(
                    $"拆分数量:{query.Num} 大于待发料数量:{remainingQty},请核对!");
            // 检查工单信息
            var womdaa = Db.Queryable<Womdaa>()
                .Where(a => a.Daa001 == query.billNo)
                .First();
            if (womdaa == null)
                throw new Exception($"工单 {query.billNo} 不存在,请确认!");
            var womdab = Db.Queryable<Womdab>()
                .Where(b =>
                    b.Dab001 == query.billNo && b.Erpid == blDetail.Bld014)
                .First();
            if (womdab == null)
                throw new Exception($"备料明细不存在此物料 {stockBarcode.ItemNo} 请确认!");
            // 检查已发料数量是否超过待发料数量
            var sumQty = db.Queryable<MesInvItemOutCDetails>()
                .Where(it =>
                    it.TaskNo == query.blNo && it.ItemId == stockBarcode.ItemId)
                .Sum(it => it.Quantity);
            //if (sumQty > remainingQty)
            //    throw new Exception(
            //        $"拆分数量:{sumQty} 大于待发料数量:{remainingQty},请核对!");
            var depots = Db.Queryable<MesDepots>()
                .Where(t => t.DepotId == stockBarcode.DepotId)
                .First();
            // 获取或创建出库单
            var itemOut = db.Queryable<MesInvItemOuts>()
                .Where(a => a.TaskNo == query.blNo
                            && a.DepotId == stockBarcode.DepotId
                            && a.OutDate.Value.Date.ToString("yyyy-MM-dd") ==
                            DateTime.Now.Date.ToString("yyyy-MM-dd")
                            && a.BillTypeId == 200
                            && a.TransactionNo == 209
                            && a.Status == 0)
                .First();
            var outId = new Guid();
            var outNo = "";
            if (itemOut == null)
            {
                // 创建新的出库单
                outId = Guid.NewGuid();
                outNo = BillNo.GetBillNo(outNoType);
                // 插入出库单主表
                executeCommand += db.Insertable(new MesInvItemOuts
                {
                    Guid = outId,
                    ItemOutNo = outNo,
                    TaskNo = query.blNo,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    BillTypeId = 200,
                    TransactionNo = 209,
                    Remark = mesItemBl.Bl007,
                    DepotCode = depots.DepotCode,
                    OutPart = womdaa.Daa013,
                    FType = 0,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    WorkNo = womdaa.Daa021,
                    BoardItem = womdaa.Daa002,
                    PbillNo = womdaa.Daa001,
                    OutDate = DateTime.Now,
                    Status = 0,
                    DepotId = stockBarcode.DepotId,
                    THORGID = stockBarcode.StockOrgId,
                    OutType = query.Type,
                    //BbillNo = query.blNo
                }).IgnoreColumns(true).ExecuteCommand();
            }
            else
            {
                outId = itemOut.Guid;
                outNo = itemOut.ItemOutNo;
            }
            // 检查是否已存在出库单明细
            var itemOutItemCount = db.Queryable<MesInvItemOutItems>()
                .Where(it =>
                    it.ItemOutId == outId &&
                    it.ItemId == stockBarcode.ItemId &&
                    it.DepotId == stockBarcode.DepotId.ToString())
                .Count();
            if (itemOutItemCount == 0)
                // 插入新的出库单明细
                executeCommand += db.Insertable(new MesInvItemOutItems
                {
                    Guid = Guid.NewGuid(),
                    ItemOutId = outId,
                    ItemNo = blDetail.Bld002,
                    Quantity = query.Num,
                    TlQty = query.Num,
                    CreateBy = query.userName,
                    CreateDate = DateTime.Now,
                    LastupdateBy = query.userName,
                    LastupdateDate = DateTime.Now,
                    Factory = stockBarcode.Factory,
                    Company = stockBarcode.Company,
                    DepotCode = depots.DepotCode,
                    TaskNo = query.blNo,
                    WorkNo = womdaa.Daa021,
                    WorkLine = blDetail.Bld013,
                    ErpItemNo = womdab.Dab003,
                    ErpId = womdab.Eid,
                    ErpAutoid = womdab.Erpid,
                    PbillNo = query.billNo,
                    ItemId = blDetail.Bld012,
                    DepotId = stockBarcode.DepotId.ToString(),
                    ItemDabid = womdab.Guid,
                    // Unit = blDetail.Bld009,
                    // DepotId = (int)stockBarcode.DepotsId
                }).IgnoreColumns(true).ExecuteCommand();
            else
                // 更新已有出库单明细数量
                executeCommand += db.Updateable<MesInvItemOutItems>()
                    .SetColumns(it => it.TlQty == (it.TlQty ?? 0) + query.Num)
                    .Where(it =>
                    it.ItemOutId == outId &&
                    it.ItemId == stockBarcode.ItemId &&
                    it.DepotId == stockBarcode.DepotId.ToString())
                    .ExecuteCommand();
            // 插入出库条码明细
            executeCommand += db.Insertable(new MesInvItemOutCDetails
            {
                Guid = Guid.NewGuid(),
                ItemOutId = outId,
                ItemBarcode = newBarcode ?? query.barcode,
                ItemNo = stockBarcode.ItemNo,
                LotNo = stockBarcode.LotNo,
                Quantity = query.Num,
                ForceOutFlag = 0,
                CreateBy = query.userName,
                CreateDate = DateTime.Now,
                LastupdateBy = query.userName,
                LastupdateDate = DateTime.Now,
                DepotCode = depots.DepotCode,
                DepotSectionCode = stockBarcode.DepotSectionsCode,
                Remark = blDetail.Bld010,
                Factory = stockBarcode.Factory,
                Company = stockBarcode.Company,
                TaskNoy = mesItemBl.Bl013,
                BoardStyle = mesItemBl.Bl002,
                TaskNo = query.blNo,
                WorkNo = blDetail.Bld001,
                WorkLine = blDetail.Bld013,
                SuppNo = stockBarcode.SuppNo,
                PbillNo = query.billNo,
                ItemId = blDetail.Bld012,
                Unit = blDetail.Bld009,
                DepotId = (int)stockBarcode.DepotsId,
                Dabid = womdab.Guid,
            }).IgnoreColumns(true).ExecuteCommand();
            // 插入业务流水
            executeCommand += db.Insertable(new MesInvBusiness2
            {
                Guid = Guid.NewGuid(),
                Status = 1,
                BillTypeId = 200, // p_bill_type_id
                TransactionCode = "209", // p_transaction_no
                BusinessType = 1,
                ItemBarcode = newBarcode ?? query.barcode,
                ItemNo = stockBarcode.ItemNo,
                LotNo = stockBarcode.LotNo,
                EpFlag = true,
                Quantity = query.Num,
                FromInvDepotsCode = stockBarcode.DepotsCode,
                FromInvDepotSectionsCode = stockBarcode.DepotSectionsCode,
                Description = query.Type,
                CreateBy = query.userName,
                CreateDate = DateTime.Now,
                LastupdateBy = query.userName,
                LastupdateDate = DateTime.Now,
                Factory = stockBarcode.Factory,
                Company = stockBarcode.Company,
                TaskNo = mesItemBl.Bl012,
                BillNo = query.blNo,
                WorkNo = blDetail.Bld001,
                WorkLine = blDetail.Bld013,
                SuppNo = stockBarcode.SuppNo,
                ItemId = stockBarcode.ItemId
                // CkDepot = stockBarcode.DepotsId
            }).IgnoreColumns(true).ExecuteCommand();
            // 更新工单表数量
            executeCommand += db.Updateable<Womdab>()
                .SetColumns(it => new Womdab
                {
                    Dab007 = (it.Dab007 ?? 0) + query.Num, // 工单数量
                    Dab020 = (it.Dab020 ?? 0) + query.Num, // 已发料数量
                    Dab021 = (it.Dab021 ?? 0) + query.Num // 已发料数量
                })
                .Where(it => it.Guid == womdab.Guid && it.Dab003 == womdab.Dab003)
                .ExecuteCommand();
            // 更新发货通知单明细已补数量
            executeCommand += db.Updateable<MesItemBlDetail>()
                .SetColumns(it => new MesItemBlDetail
                {
                    Bld008 = (it.Bld008 ?? 0) + (int)query.Num
                })
                .Where(it => it.Id == blDetail.Id)
                .ExecuteCommand();
            // 获取更新后的发货通知单明细数量
            var updatedDetail = db.Queryable<MesItemBlDetail>()
                .Where(it => it.Id == blDetail.Id)
                .Select(it => new { it.Bld007, it.Bld008 })
                .First();
            if ((updatedDetail.Bld007 ?? 0) <= (updatedDetail.Bld008 ?? 0))
                // 更新明细完成状态
                executeCommand += db.Updateable<MesItemBlDetail>()
                    .SetColumns(it => new MesItemBlDetail { Bld011 = 1 })
                    .Where(it => it.Id == blDetail.Id)
                    .ExecuteCommand();
            // 检查是否还有未完成的明细
            var unfinishedDetail = db.Queryable<MesItemBlDetail>()
                .Where(it => it.Mid == mesItemBl.Id && (it.Bld011 ?? 0) == 0)
                .First();
            if (unfinishedDetail == null)
                // 如果没有找到未完成明细,则更新发货通知单状态为已完成
                executeCommand += db.Updateable<MesItemBl>()
                    .SetColumns(it => new MesItemBl
                    conn.Open();
                    cmd.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters =
                    {
                        Bl019 = true,
                        WcUser = query.userName,
                        WcTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
                    })
                    .Where(it => it.Id == mesItemBl.Id)
                    .ExecuteCommand();
                        new("@outMsg", SqlDbType.NVarChar, 2000),
                        new("@outSum", SqlDbType.NVarChar, 300),
                        new("@outCfBar", SqlDbType.NVarChar, 300),
                        new("@c_user", query.userName),
                        new("@p_biLL_no", query.billNo),
                        new("@p_item_barcode", query.barcode),
                        new("@NUM", query.Num)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Direction = ParameterDirection.Output;
                    parameters[2].Direction = ParameterDirection.Output;
                    foreach (var parameter in parameters)
                        cmd.Parameters.Add(parameter);
                    cmd.ExecuteNonQuery();
                    _strMsg = parameters[0].Value.ToString();
                    _intSum = parameters[1].Value.ToString();
                    _cfBar = parameters[2].Value.ToString();
            if (executeCommand <= 1) throw new Exception("更新失败");
            return executeCommand;
        }) > 0;
                    var result = Convert.ToInt32(_intSum);
                    if (result <= 0) throw new Exception(_strMsg);
        // 获取最终的待发料明细列表
        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
            })
            .ToList();
                    var dto = new ProductionPickDto
                    {
                        daa001 = query.billNo,
                        barcode = query.barcode,//原条码
                        cfBarcode = _cfBar//拆分后条码
                    };
        return (success, pendingList);
                    return dto;
                }
                catch (Exception ex)
                {
                    throw new Exception(ex.Message);
                }
                finally
                {
                    conn.Close();
                }
            }
        }
    }
    #endregion
        #endregion
}