22
schangxiang@126.com
2024-12-17 2905c63ec884f531152a4e97a4d67034e8149d6d
LA24030_LuLiPackageLine_Wms/Admin.NET.Application/Service/WmsOperationTask/WmsOperationTaskService.cs
@@ -8,6 +8,8 @@
using Microsoft.CodeAnalysis.Operations;
using Admin.NET.Application.Service.WmsTask.WmsRbLineTask.Dto;
using Furion.DatabaseAccessor;
using Admin.NET.Application.Service.WmsCommonnQuery.Dto;
using Admin.NET.Application.CommonHelper;
namespace Admin.NET.Application;
/// <summary>
@@ -25,7 +27,9 @@
    private readonly SqlSugarRepository<WmsRecordUpiProcess> _wmsRecordUpiProcessRep;
    private readonly SqlSugarRepository<WmsRecordPackageProcess> _wmsRecordPackageProcessRep;
    private readonly SqlSugarRepository<Mes_Upi_LineQueue> _mes_Upi_LineQueueRep;
    private readonly SqlSugarRepository<Mes_Package_LineQueue> _mes_Package_LineQueueRep;
    private readonly SqlSugarRepository<WmsRecordUpiNg> _wmsRecordUpiNgRep;
    private readonly WmsCommonnQueryService _wmsCommonnQueryService;
    public WmsOperationTaskService(
        SqlSugarRepository<Mes_Upi_LineQueue> mes_Upi_LineQueueRep,
@@ -37,8 +41,12 @@
        , SqlSugarRepository<WmsRecordUpiProcess> wmsRecordUpiProcessRep
        , SqlSugarRepository<WmsRecordPackageProcess> wmsRecordPackageProcessRep
        , SqlSugarRepository<WmsRecordUpiNg> wmsRecordUpiNgRep
        , WmsCommonnQueryService wmsCommonnQueryService
        , SqlSugarRepository<Mes_Package_LineQueue> mes_Package_LineQueueRep
        )
    {
        _mes_Package_LineQueueRep = mes_Package_LineQueueRep;
        _wmsCommonnQueryService = wmsCommonnQueryService;
        _wmsRecordUpiNgRep = wmsRecordUpiNgRep;
        _sysConfigRep = sysConfigRep;
        _mesPackageGatherRep = mesPackageGatherRep;
@@ -68,25 +76,139 @@
        {
            throw Oops.Oh("参数不能为空");
        }
        //验证传递的包是否都在齐包之内。
        List<WmsPackListOutput> packList = await _wmsCommonnQueryService.PackList(new Service.WmsCommonnQuery.Dto.PackListInput() { IsPack = false });
        List<WmsStockQuan> updateQuanList = new List<WmsStockQuan>();
        foreach (var item in input.PackageCodeList)
        {
            var isExistCount = packList.Where(x => x.PackageCode == item).Count();
            if (isExistCount == 0)
            {
                throw Oops.Oh($"包{item}不是缺包状态,请检查!");
            }
            var quanList = await _wmsStockQuanRep.AsQueryable().Where(x => x.PackageCode == item).ToListAsync();
            var isExist = quanList.Where(x => x.StockStatus == StockStatusEnum.齐包待出库).Count();
            var isExist = quanList.Where(x => x.StockStatus == StockStatusEnum.齐包待出库 || x.StockStatus == StockStatusEnum.人工齐包出库任务已创建).Count();
            if (isExist > 0)
            {
                throw Oops.Oh($"包{item}中其中有板状态是'{StockStatusEnum.齐包待出库.ToString()}',不允许强制出库");
                throw Oops.Oh($"包{item}中其中有板状态是'{StockStatusEnum.齐包待出库.ToString()}' 或'{StockStatusEnum.人工齐包出库任务已创建.ToString()}',不允许强制出库");
            }
            //更新状态 
            foreach (var quan in quanList)
            {
                if (quan.StockStatus != StockStatusEnum.在库 && quan.StockStatus != StockStatusEnum.已冻结)
                {
                    throw Oops.Oh($"部件条码{quan.Upi}的库存状态不是'{StockStatusEnum.在库.ToString()}或{StockStatusEnum.已冻结.ToString()}'状态");
                }
                quan.StockStatus = StockStatusEnum.人工强制待出库;
                quan.StockStatusName = StockStatusEnum.人工强制待出库.ToString();
                quan.UpdateTime = DateTime.Now;
                quan.OperReason = "人工强制待出库";
            }
            updateQuanList.AddRange(quanList);
            var packageObj = await _mesPackageGatherRep.GetFirstAsync(x => x.PackageCode == item);
            packageObj.UpiFlag = UpiFlagEnum.NG;
            packageObj.UpiStatus = UpiStatusEnum.已下线;
            await _mesPackageGatherRep.UpdateAsync(packageObj);
            //下线更新 订单表数据 _mesOrderGatherRep
            await UpdateOrderGather(packageObj, true);
            foreach (var quan in quanList)
            {
                //清理 队列表
                var removeUpiList = await _mes_Upi_LineQueueRep.AsQueryable().Where(x => x.Upi == quan.Upi).ToListAsync();
                if (removeUpiList?.Count > 0)
                {
                    await _mes_Upi_LineQueueRep.DeleteAsync(removeUpiList);
                }
                var removePackageList = await _mes_Package_LineQueueRep.AsQueryable().Where(x => x.PackageCode == quan.PackageCode).ToListAsync();
                if (removePackageList?.Count > 0)
                {
                    await _mes_Package_LineQueueRep.DeleteAsync(removePackageList);
                }
            }
        }
        //模式判断
        var client = await WCFServiceHelper.GetWCFService_SAPCC_Client(_sysConfigRep);
        var res = await client.ValidateModeAsync(1);
        if (res.result == false)
        {
            throw Oops.Oh(res.resMsg);
        }
        await _wmsStockQuanRep.UpdateRangeAsync(updateQuanList);
    }
    /// <summary>
    /// 人工齐包出库
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "PersonOutbound")]
    [Description("WmsOperationTask/PersonOutbound")]
    [UnitOfWork]
    public async Task PersonOutbound(PersonOutboundInput input)
    {
        if (input == null || input.PackageCodeList?.Count == 0)
        {
            throw Oops.Oh("参数不能为空");
        }
        //验证传递的包是否都在齐包之内。
        List<WmsPackListOutput> packList = await _wmsCommonnQueryService.PackList(new Service.WmsCommonnQuery.Dto.PackListInput() { IsPack = true });
        List<WmsStockQuan> updateQuanList = new List<WmsStockQuan>();
        foreach (var item in input.PackageCodeList)
        {
            var isExistCount = packList.Where(x => x.PackageCode == item).Count();
            if (isExistCount == 0)
            {
                throw Oops.Oh($"包{item}不是齐包状态,请检查!");
            }
            var quanList = await _wmsStockQuanRep.AsQueryable().Where(x => x.PackageCode == item).ToListAsync();
            var isExist = quanList.Where(x => x.StockStatus == StockStatusEnum.人工强制待出库 || x.StockStatus == StockStatusEnum.人工强制任务已创建).Count();
            if (isExist > 0)
            {
                throw Oops.Oh($"包{item}中其中有板状态是'{StockStatusEnum.人工强制待出库.ToString()}'或'{StockStatusEnum.人工强制任务已创建.ToString()}',不允许人工齐包出库");
            }
            //更新状态
            foreach (var quan in quanList)
            {
                if (quan.StockStatus != StockStatusEnum.在库 && quan.StockStatus != StockStatusEnum.已冻结)
                {
                    throw Oops.Oh($"部件条码{quan.Upi}的库存状态不是'{StockStatusEnum.在库.ToString()}或{StockStatusEnum.已冻结.ToString()}'状态");
                }
                quan.StockStatus = StockStatusEnum.齐包待出库;
                quan.StockStatusName = StockStatusEnum.齐包待出库.ToString();
                quan.UpdateTime = DateTime.Now;
                quan.OperReason = "人工齐包出库";
            }
            updateQuanList.AddRange(quanList);
            var packageObj = await _mesPackageGatherRep.GetFirstAsync(x => x.PackageCode == item);
            packageObj.UpiStatus = UpiStatusEnum.已齐包;
            packageObj.IsQiBao = true;
            await _mesPackageGatherRep.UpdateAsync(packageObj);
        }
        //模式判断
        var client = await WCFServiceHelper.GetWCFService_SAPCC_Client(_sysConfigRep);
        var res = await client.ValidateModeAsync(2);
        if (res.result == false)
        {
            throw Oops.Oh(res.resMsg);
        }
        await _wmsStockQuanRep.UpdateRangeAsync(updateQuanList);
@@ -133,18 +255,57 @@
        var setValue = "";
        var _QiTaoReuslt = "";
        var other_orderList = await _mesPackageGatherRep.AsQueryable().Where(x => x.Info5 == package.Info5 && x.PackageCode != input.PackageCode).ToListAsync();
        var num = other_orderList.Where(x => x.UpiStatus == UpiStatusEnum.初始 || x.UpiStatus == UpiStatusEnum.不齐包).Count();
        if (num > 0)
        bool isNeedQueryQiTao = true;
        var order = await _mesOrderGatherRep.AsQueryable().Where(x => x.Info5 == package.Info5).FirstAsync();
        if (order == null)
        {
            //不齐套
            setValue = $"{input.PackageCode}|不齐套|" + curUserName;
            _QiTaoReuslt = "不齐套";
        }
        else
        {
            setValue = $"{input.PackageCode}|齐套|" + curUserName;
            _QiTaoReuslt = "齐套";
            if (order.IsKitting != null)
            {
                _QiTaoReuslt = (bool)order.IsKitting ? "齐套" : "不齐套";
                isNeedQueryQiTao = false;
            }
        }
        if (isNeedQueryQiTao)
        {
            var other_orderList = await _mesPackageGatherRep.AsQueryable().Where(x => x.Info5 == package.Info5 && x.PackageCode != input.PackageCode).ToListAsync();
            var num = other_orderList.Where(x => x.UpiStatus == UpiStatusEnum.初始).Count();
            if (num > 0)
            {
                //不齐套
                _QiTaoReuslt = "不齐套";
            }
            else
            {
                _QiTaoReuslt = "齐套";
            }
        }
        setValue = $"{input.PackageCode}|{_QiTaoReuslt}|" + curUserName;
        if (package.UpiStatus == UpiStatusEnum.已下线)
        {
            throw Oops.Oh($"包已下线,齐套结果[{_QiTaoReuslt}]");
        }
        if (order == null)
        {
            Mes_Order_Gather newOrder = new Mes_Order_Gather()
            {
                Info5 = package.Info5,
                IsKitting = _QiTaoReuslt == "齐套" ? true : false,
                PlanNo = package.PlanNo,
                OrderId = package.OrderId
            };
            await _mesOrderGatherRep.InsertAsync(newOrder);
        }
        else
        {
            order.IsKitting = _QiTaoReuslt == "齐套" ? true : false;
            await _mesOrderGatherRep.UpdateAsync(order);
        }
@@ -236,7 +397,7 @@
    /// <summary>
    /// NG包下线-扫描包号
    /// NG包下线或 正常包 下线 -扫描包号
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
@@ -258,6 +419,13 @@
        //{
        //    throw Oops.Oh("原因不能为空");
        //}
        string _OperRemark = "正常人工下线";
        UpiFlagEnum upiFlagEnum = UpiFlagEnum.正常;
        if (input.IsNG)
        {
            upiFlagEnum = UpiFlagEnum.NG;
            _OperRemark = "NG下线";
        }
        var singlePackage = await _mesPackageGatherRep.AsQueryable().Where(x => x.PackageCode == input.PackageCode).FirstAsync();
        if (singlePackage == null)
@@ -265,7 +433,12 @@
            throw Oops.Oh($"没有找到包号{input.PackageCode}的汇总数据");
        }
        singlePackage.UpiFlag = UpiFlagEnum.NG;
        if (singlePackage.UpiStatus == UpiStatusEnum.已下线)
        {
            throw Oops.Oh($"包号{input.PackageCode}已经下线");
        }
        singlePackage.UpiFlag = upiFlagEnum;
        singlePackage.UpdateTime = DateTime.Now;
        singlePackage.UpiStatus = UpiStatusEnum.已下线;
        singlePackage.AreaCode = AreaCodeEnum.下线区域;
@@ -296,7 +469,7 @@
            wmsRecordUpi.CreateTime = DateTime.Now;
            wmsRecordUpi.CreateUserName = _cretaorName;
            wmsRecordUpi.Location = "";
            wmsRecordUpi.OperRemark = "NG下线";
            wmsRecordUpi.OperRemark = _OperRemark;
            await _wmsRecordUpiProcessRep.InsertAsync(wmsRecordUpi);
            WmsRecordUpiNg wmsRecordUpiNg = new WmsRecordUpiNg();
@@ -304,18 +477,36 @@
            wmsRecordUpiNg.Id = Yitter.IdGenerator.YitIdHelper.NextId();
            wmsRecordUpiNg.CreateTime = DateTime.Now;
            wmsRecordUpiNg.CreateUserName = _cretaorName;
            wmsRecordUpiNg.OperRemark = "NG下线";
            wmsRecordUpiNg.OperRemark = _OperRemark;
            await _wmsRecordUpiNgRep.InsertAsync(wmsRecordUpiNg);
            //清理 队列表
            var removeUpiList = await _mes_Upi_LineQueueRep.AsQueryable().Where(x => x.Upi == item.UPI).ToListAsync();
            if (removeUpiList?.Count > 0)
            {
                await _mes_Upi_LineQueueRep.DeleteAsync(removeUpiList);
            }
            var removePackageList = await _mes_Package_LineQueueRep.AsQueryable().Where(x => x.PackageCode == item.PackageCode).ToListAsync();
            if (removePackageList?.Count > 0)
            {
                await _mes_Package_LineQueueRep.DeleteAsync(removePackageList);
            }
        }
        //下线更新 订单表数据 _mesOrderGatherRep
        await UpdateOrderGather(singlePackage, input.IsNG);
        WmsRecordPackageProcess wmsRecordPackage = new WmsRecordPackageProcess();
        wmsRecordPackage = singlePackage.Adapt<WmsRecordPackageProcess>();
        wmsRecordPackage.Id = Yitter.IdGenerator.YitIdHelper.NextId();
        wmsRecordPackage.Location = "";
        wmsRecordPackage.OperRemark = "NG下线";
        wmsRecordPackage.OperRemark = _OperRemark;
        wmsRecordPackage.CreateTime = DateTime.Now;
        wmsRecordPackage.CreateUserName = _cretaorName;
        await _wmsRecordPackageProcessRep.InsertAsync(wmsRecordPackage);
@@ -324,6 +515,56 @@
        await _mesPackageGatherRep.UpdateAsync(singlePackage);
        await _mesBatchOrderUpiRep.UpdateRangeAsync(upiList);
    }
    /// <summary>
    /// 下线更新 订单表数据
    /// </summary>
    /// <param name="singlePackage"></param>
    /// <returns></returns>
    private async Task UpdateOrderGather(Mes_Package_Gather singlePackage, bool isNG)
    {
        //下线更新 订单表数据 _mesOrderGatherRep
        bool isAdd = false;
        var order = await _mesOrderGatherRep.AsQueryable().Where(x => x.Info5 == singlePackage.Info5).FirstAsync();
        if (order == null)
        {
            isAdd = true;
            order = new Mes_Order_Gather()
            {
                Info5 = singlePackage.Info5,
                OrderId = singlePackage.OrderId,
                PlanNo = singlePackage.PlanNo,
            };
        }
        var packageList = await _mesPackageGatherRep.AsQueryable().Where(x => x.Info5 == singlePackage.Info5).ToListAsync();
        order.PackageNum = packageList.Count();
        order.UnLinePackageNum = packageList.Where(x => x.UpiStatus == UpiStatusEnum.已下线).Count() + 1;
        order.NgPackageNum = packageList.Where(x => x.UpiStatus == UpiStatusEnum.已下线 && x.UpiFlag == UpiFlagEnum.NG).Count();
        if (isNG)
        {
            order.NgPackageNum = order.NgPackageNum + 1;
        }
        order.NoUnLinePackageNum = order.PackageNum - order.UnLinePackageNum;
        order.AllPackageArea = packageList.Sum(x => Convert.ToDecimal(x.Info13));
        order.ScanPackageArea = packageList.Where(x => x.UpiStatus == UpiStatusEnum.已下线 && x.UpiFlag == (int)UpiFlagEnum.正常).Sum(x => Convert.ToDecimal(x.Info13));
        if (isNG == false)
        {
            order.ScanPackageArea = order.ScanPackageArea + Convert.ToDecimal(singlePackage.Info13);
        }
        order.NoScanPackageArea = order.AllPackageArea - order.ScanPackageArea;
        if (isAdd)
        {
            await _mesOrderGatherRep.InsertAsync(order);
        }
        else
        {
            await _mesOrderGatherRep.UpdateAsync(order);
        }
    }
    /// <summary>
@@ -501,5 +742,25 @@
    }
    /// <summary>
    /// 扫码记录清除
    /// </summary>
    /// <param name="input"></param>
    /// <returns></returns>
    [HttpPost]
    [ApiDescriptionSettings(Name = "PartClear")]
    [Description("WmsOperationTask/PartClear")]
    public async Task PartClear()
    {
        //模式判断
        var client = await WCFServiceHelper.GetWCFService_SAPCC_Client(_sysConfigRep);
        var res = await client.WriteStation_PartClearAsync();
        if (res.result == false)
        {
            throw Oops.Oh(res.resMsg);
        }
    }
}