647556386
12 小时以前 b5d01891fbbd69d8d50d2b4fb562fac3130fc2d6
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs
@@ -36,6 +36,8 @@
using WIDESEA_DTO.Allocate;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using WIDESEA_IRecordService;
using Microsoft.AspNetCore.Http;
using MailKit.Net.Smtp;
namespace WIDESEA_OutboundService
{
@@ -2322,6 +2324,14 @@
            {
                return WebResponseContent.Instance.Error("未找到满足出库条件的出库单");
            }
            if (outboundOrder.DepartmentCode == "虚拟出入库锁定")
            {
                return WebResponseContent.Instance.Error("该单据另一台电脑正在进行虚拟出入库操作,请稍后再试");
            }
            else
            {
                outboundOrder.DepartmentCode = "虚拟出入库锁定";
            }
            if(outboundOrder.IsBatch == 0)
            {
                return WebResponseContent.Instance.Error("该单据不属于分批回传单据,不允许虚拟出入库");
@@ -2332,12 +2342,25 @@
                item.NoStockOutQty = 0;
                item.documentsNO = "";
            }
            _outboundOrderService.UpdateData(outboundOrder);
            _outboundOrderDetailService.UpdateData(outboundOrder.Details);
            return WebResponseContent.Instance.OK("成功");
        }
    public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut)
        public WebResponseContent MovePickingOrders(string outOrder)
        {
            Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == outOrder).First();
            if (outboundOrder.DepartmentCode == "虚拟出入库锁定")
            {
                outboundOrder.DepartmentCode = "";
            }
            _outboundOrderService.UpdateData(outboundOrder);
            return WebResponseContent.Instance.OK("成功");
        }
        public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut)
    {
        try
        {
@@ -2362,17 +2385,17 @@
            var detailLists = new List<Dt_InboundOrderDetail>();
            var matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
                detail.Barcode == noStockOut.barCode &&
                detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
                detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.ReceiptQuantity == 0);
            if (matchedDetail == null)
            {
                matchedDetail = inboundOrder.Details.FirstOrDefault(detail =>
                    detail.OutBoxbarcodes == noStockOut.barCode &&
                    detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt());
                    detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && detail.ReceiptQuantity == 0);
                if (matchedDetail == null)
                {
                    return WebResponseContent.Instance.Error($"在采购单 {noStockOut.inOder} ä¸­æœªæ‰¾åˆ°æ¡ç ä¸º {noStockOut.barCode} çš„æ˜Žç»†ã€‚");
                    return WebResponseContent.Instance.Error($"在采购单 {noStockOut.inOder} ä¸­æœªæ‰¾åˆ°æ¡ç ä¸º {noStockOut.barCode} çš„可出库明细。");
                }
                else
                {
@@ -2381,7 +2404,7 @@
                    {
                        if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() &&
                            !string.IsNullOrEmpty(detail.Barcode) &&
                            detail.OutBoxbarcodes == noStockOut.barCode)
                            detail.OutBoxbarcodes == noStockOut.barCode && detail.OrderQuantity > detail.NoStockOutQty)
                        {
                            detailLists.Add(detail);
                        }
@@ -2395,6 +2418,10 @@
                    detailLists.Add(matchedDetail);
                }
            }
                if (!detailLists.Any())
                {
                    return WebResponseContent.Instance.Error("该条码已经没有可出库数量");
                }
                var outDetails = new List<Dt_OutboundOrderDetail>();
                // éåŽ†æ¯ä¸ªå…¥åº“æ˜Žç»†
                foreach (var item in detailLists)
@@ -2419,7 +2446,13 @@
                    {
                        return WebResponseContent.Instance.Error($"在出库单中未找到物料{item.MaterielCode}的可出库明细");
                    }
                    // x
                    foreach (var outboundOrderDetail in eligibleOutDetails)
                    {
                        outboundOrderDetail.NoStockOutQty = 0;
                        outboundOrderDetail.documentsNO = "";
                    }
                    _outboundOrderDetailService.UpdateData(eligibleOutDetails);
                    // éåŽ†ç¬¦åˆæ¡ä»¶çš„å‡ºåº“æ˜Žç»†ï¼Œé€è¡Œåˆ†é…æ•°é‡
                    foreach (var outDetail in eligibleOutDetails)
                    {
@@ -2703,12 +2736,58 @@
        {
            try
            {
                Dt_OutboundOrder outboundOrder = _inboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.OutOderSubmit && x.OrderStatus != OutOrderStatusEnum.出库完成.ObjToInt()).Includes(x => x.Details).First();
                if (outboundOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到出库单:{noStockOutSubmit.OutOderSubmit}");
                }
                // 1. ç­›é€‰å‡ºæœ¬æ¬¡æäº¤æ¡ç å…³è”的出库明细
                List<Dt_OutboundOrderDetail> outboundOrderDetail2 = outboundOrder.Details
                    .Where(x => !string.IsNullOrWhiteSpace(x.documentsNO)
                        && noStockOutSubmit.BarCodeSubmit.Any(barcode =>
                            x.documentsNO.IndexOf(barcode, StringComparison.OrdinalIgnoreCase) >= 0))
                    .ToList();
                HashSet<string> existBarcodes = new HashSet<string>();
                foreach (var detail in outboundOrderDetail2)
                {
                    try
                    {
                        // ååºåˆ—化明细里的条码列表
                        var barcodesInDoc = JsonConvert.DeserializeObject<List<Barcodes>>(detail.documentsNO);
                        if (barcodesInDoc == null) continue;
                        // æŠŠæ¡ç åŠ å…¥åŽ»é‡é›†åˆ
                        foreach (var b in barcodesInDoc)
                        {
                            if (!string.IsNullOrEmpty(b.Barcode))
                                existBarcodes.Add(b.Barcode.Trim());
                        }
                    }
                    catch { }
                }
                // 3. å‰ç«¯æäº¤çš„æ¡ç  â†’ åŽ»é‡
                HashSet<string> submitBarcodes = new HashSet<string>(
                    noStockOutSubmit.BarCodeSubmit
                        .Where(b => !string.IsNullOrEmpty(b))
                        .Select(b => b.Trim())
                );
                // 4. æ‰¾å‡ºã€æäº¤äº†ï¼Œä½†ç³»ç»Ÿé‡Œä¸å­˜åœ¨ã€‘的条码
                var missingBarcodes = submitBarcodes.Except(existBarcodes).ToList();
                // 5. å¦‚果有缺失 â†’ æ‹¦æˆªæŠ¥é”™
                if (missingBarcodes.Any())
                {
                    return WebResponseContent.Instance.Error(
                        $"数据异常,以下条码在出库单中未找到或已被清空:{string.Join(",", missingBarcodes)}"
                    );
                }
                List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
                Dictionary<int, List<string>> orderIdBarCodeDict = new Dictionary<int, List<string>>();
@@ -2962,19 +3041,45 @@
                    var response = NoStockOutresponseModel(inboundOrder, 3, null, allocatefeedmodel);
                    if (response != null && response.IsSuccess)
                    if (response != null && response.IsSuccess && response.Data.Code == "200")
                    {
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
                            .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.入库中.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                    }
                    else
                    {
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
                            .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus =2})
                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.入库中.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        return content.Error("回传MES失败");
                    }
                }
@@ -2999,18 +3104,44 @@
                    }
                    var response = NoStockOutresponseModel(inboundOrder, 3, feedmodel);
                    if (response != null && response.IsSuccess)
                    if (response != null && response.IsSuccess && response.Data.Code == "200")
                    {
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
                            .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.入库中.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                    }
                    else
                    {
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 }).Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand();
                        _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 })
                            .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        if (inboundOrder.OrderStatus == InOrderStatusEnum.入库完成.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else if (inboundOrder.OrderStatus == InOrderStatusEnum.入库中.ObjToInt())
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        else
                        {
                            _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 })
                                .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
                        }
                        return content.Error("回传MES失败");
                    }
                }