1
heshaofeng
2026-03-25 37454e625df68d40897112b2e8c2e3cf4d7163e3
ÏîÄ¿´úÂë/WMSÎÞ²Ö´¢°æ/WIDESEA_WMSServer/WIDESEA_CheckService/ReCheckOrderService.cs
@@ -1,18 +1,27 @@
using HslCommunication.WebSocket;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using SqlSugar;
using StackExchange.Profiling.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using WIDESEA_Common.OrderEnum;
using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.CodeConfigEnum;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
using WIDESEA_IBasicService;
using WIDESEA_ICheckService;
using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
using WIDESEA_Model.Models.Basic;
using WIDESEA_Model.Models.Check;
namespace WIDESEA_CheckService
@@ -23,22 +32,26 @@
        private readonly IUnitOfWorkManage _unitOfWorkManage;
        private readonly WebSocketServer _webSocketServer;
        private readonly ILogger<ReCheckOrderService> _logger;
        private readonly IMaterielInfoService _materielInfoService;
        public readonly IOutboundService _outboundService;
        public IRepository<Dt_ReCheckOrder> Repository => BaseDal;
        public ReCheckOrderService(IRepository<Dt_ReCheckOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage, WebSocketServer webSocketServer, ILogger<ReCheckOrderService> logger) : base(BaseDal)
        public ReCheckOrderService(IRepository<Dt_ReCheckOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage, WebSocketServer webSocketServer, ILogger<ReCheckOrderService> logger, IOutboundService outboundService, IMaterielInfoService materielInfoService) : base(BaseDal)
        {
            _unitOfWorkManage = unitOfWorkManage;
            _webSocketServer = webSocketServer;
            _logger = logger;
            _outboundService = outboundService;
            _materielInfoService = materielInfoService;
        }
        public WebResponseContent ReceiveReCheckOrder(Dt_ReCheckOrder models, int operateType)
        public async Task<WebResponseContent> ReceiveReCheckOrder(Dt_ReCheckOrder models, int operateType)
        {
            try
            {
                return operateType switch
                {
                    1 => AddReCheckOrder(models),
                    2 => UpdateReCheckOrder(models),
                    1 =>await AddReCheckOrder(models),
                    2 =>await UpdateReCheckOrder(models),
                    3 => DeleteReCheckOrder(models),
                    _ => WebResponseContent.Instance.OK(),
@@ -51,20 +64,41 @@
            }
        }
        public WebResponseContent AddReCheckOrder(Dt_ReCheckOrder model)
        public async Task<WebResponseContent> AddReCheckOrder(Dt_ReCheckOrder model)
        {
            try
            {
                List<Dt_ReCheckOrder> reCheckOrders = BaseDal.Db.Queryable<Dt_ReCheckOrder>().Where(x => x.MaterielCode == model.MaterielCode && x.BatchNo == model.BatchNo).ToList();
                if (reCheckOrders.Count() == 3)
                {
                    return WebResponseContent.Instance.Error($"该物料和批次已经重检了三次,不允许再进行重检");
                }
                if (BaseDal.QueryFirst(x => x.OrderNo == model.OrderNo) != null)
                {
                    return WebResponseContent.Instance.Error($"单号重复");
                    return WebResponseContent.Instance.Error($"{model.OrderNo}单号重复");
                }
                var materielInfo = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().First(x => model.MaterielCode.Equals(x.MaterielCode));
                model.Creater = "MES";
                model.CreateDate = DateTime.Now;
                BaseDal.AddData(model);
                model.MaterielName = materielInfo?.MaterielName ?? "";
                var stockDetailIds = BaseDal.Db.Queryable<Dt_StockInfoDetail>()
                .Where(x => x.MaterielCode == model.MaterielCode && x.BatchNo == model.BatchNo && x.ValidDate !=null)
                .Select(x => x.Id)
                .ToList();
                if (stockDetailIds.Count > 0)
                {
                    BaseDal.Db.Updateable<Dt_StockInfoDetail>()
                        .SetColumns(x => x.Status == StockStatusEmun.手动冻结.ObjToInt())
                        .Where(x => stockDetailIds.Contains(x.Id))
                        .ExecuteCommand();
                }
                BaseDal.AddData(model);
                var outboundOrders = ConvertToOutboundOrders(model);
                await _outboundService.OutboundOrderService.ReceiveOutboundOrder(outboundOrders, 1);
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -73,15 +107,70 @@
                return WebResponseContent.Instance.Error(ex.Message);
            }
        }
        public WebResponseContent UpdateReCheckOrder(Dt_ReCheckOrder model)
        public async Task<WebResponseContent> UpdateReCheckOrder(Dt_ReCheckOrder model)
        {
            try
            {
                List<Dt_ReCheckOrder> reCheckOrders = BaseDal.Db.Queryable<Dt_ReCheckOrder>().Where(x=>x.MaterielCode == model.MaterielCode && x.BatchNo == model.BatchNo).ToList();
                var recheckOrder = Db.Queryable<Dt_ReCheckOrder>().Where(x => x.OrderNo == model.OrderNo).First();
                if (recheckOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到单信息");
                }
                var isupdate = false;
                if (recheckOrder.SignSeq == model.SignSeq)
                {
                    isupdate = true;
                }
                if (model.Result == 1 && recheckOrder.SignSeq != model.SignSeq)
                {
                    var stockDetailIds = BaseDal.Db.Queryable<Dt_StockInfoDetail>()
                    .Where(x => x.MaterielCode == model.MaterielCode && x.BatchNo == model.BatchNo && x.ValidDate != null && (x.Status == (int)StockStatusEmun.手动冻结 ||x.Status == (int)StockStatusEmun.重检中))
                    .Select(x => x.Id)
                    .ToList();
                    if (stockDetailIds.Count > 0)
                    {
                        var datevaliDate = BaseDal.Db.Queryable<Dt_MaterialExpirationDate>().Where(x => x.MaterialCode.Contains(model.MaterielCode.Substring(0, 6))).First();
                        if(datevaliDate == null)
                        {
                            return WebResponseContent.Instance.Error($"该物料未找到MES推送的有效期数据,请先推送该物料的有效期数据");
                        }
                        BaseDal.Db.Updateable<Dt_StockInfoDetail>()
                            .SetColumns(x => x.Status == StockStatusEmun.入库完成.ObjToInt())
                            .Where(x => stockDetailIds.Contains(x.Id) && x.Status == (int)StockStatusEmun.手动冻结)
                            .ExecuteCommand();
                        //计算当前复检单据结果时间
                        DateTime newDate;
                        if (1 == reCheckOrders.Count())
                        {
                            //单据结果推送时间+物料复检延长时间与有效期做对比,谁大取谁
                            newDate = Convert.ToDateTime(DateTime.Now).AddDays(Convert.ToDouble(datevaliDate.OneExtensionDays));
                            BaseDal.Db.Updateable<Dt_StockInfoDetail>()
                            .SetColumns(x => x.ValidDate == SqlFunc.IIF(x.ValidDate > newDate, x.ValidDate, newDate))
                            .Where(x => stockDetailIds.Contains(x.Id))
                            .ExecuteCommand();
                        }
                        else if (2 == reCheckOrders.Count())
                        {
                            newDate = Convert.ToDateTime(DateTime.Now).AddDays(Convert.ToDouble(datevaliDate.TwoExtensionDays));
                            BaseDal.Db.Updateable<Dt_StockInfoDetail>()
                            .SetColumns(x => x.ValidDate == SqlFunc.IIF(x.ValidDate > newDate, x.ValidDate, newDate))
                            .Where(x => stockDetailIds.Contains(x.Id))
                            .ExecuteCommand();
                        }
                        else if (3 == reCheckOrders.Count())
                        {
                            newDate = Convert.ToDateTime(DateTime.Now).AddDays(Convert.ToDouble(datevaliDate.ThreeExtensionDays));
                            BaseDal.Db.Updateable<Dt_StockInfoDetail>()
                            .SetColumns(x => x.ValidDate == SqlFunc.IIF(x.ValidDate > newDate, x.ValidDate, newDate))
                            .Where(x => stockDetailIds.Contains(x.Id))
                            .ExecuteCommand();
                        }
                    }
                }
                recheckOrder.OrderNo = model.OrderNo;
                recheckOrder.MaterielCode = model.MaterielCode;
@@ -91,15 +180,24 @@
                recheckOrder.InspectionNumber = model.InspectionNumber;
                recheckOrder.SignSeq = model.SignSeq;
                recheckOrder.Qty = model.Qty;
                recheckOrder.WarehouseCode= model.WarehouseCode;
                recheckOrder.WarehouseCode = model.WarehouseCode;
                recheckOrder.FactoryArea = model.FactoryArea;
                recheckOrder.Modifier = "MES";
                recheckOrder.ModifyDate = DateTime.Now;
                var materielInfo = _materielInfoService.Db.Queryable<Dt_MaterielInfo>().First(x => model.MaterielCode.Equals(x.MaterielCode));
                recheckOrder.MaterielName= materielInfo?.MaterielName??"";
                BaseDal.UpdateData(recheckOrder);
                if (isupdate)
                {
                    _outboundService.OutboundOrderService.Db.Deleteable<Dt_OutboundOrder>().Where(x => x.OrderNo == model.OrderNo).ExecuteCommand();
                    _outboundService.OutboundOrderDetailService.Db.Deleteable<Dt_OutboundOrderDetail>()
                     .Where(p => SqlFunc.Subqueryable<Dt_OutboundOrder>().Where(s => s.Id == p.OrderId && s.OrderNo == model.OrderNo).Any()).ExecuteCommand();
                    var outboundOrders = ConvertToOutboundOrders(model);
                    await _outboundService.OutboundOrderService.ReceiveOutboundOrder(outboundOrders, 1);
                }
                return WebResponseContent.Instance.OK();
            }
            catch (Exception ex)
@@ -119,9 +217,13 @@
                {
                    return WebResponseContent.Instance.Error($"未找到单信息");
                }
                BaseDal.DeleteData(recheckOrder);
                BaseDal.DeleteData(recheckOrder);
                _outboundService.OutboundOrderService.Db.Deleteable<Dt_OutboundOrder>().Where(x => x.OrderNo == model.OrderNo).ExecuteCommand();
                _outboundService.OutboundOrderDetailService.Db.Deleteable<Dt_OutboundOrderDetail>()
                 .Where(p => SqlFunc.Subqueryable<Dt_OutboundOrder>().Where(s => s.Id == p.OrderId && s.OrderNo == model.OrderNo).Any()).ExecuteCommand();
                return WebResponseContent.Instance.OK();
            }
@@ -132,5 +234,50 @@
            }
        }
        public Dt_OutboundOrder ConvertToOutboundOrders(Dt_ReCheckOrder reCheckOrder)
        {
            var outboundOrder = new Dt_OutboundOrder()
            {
                WarehouseId = 0,
                OrderNo = reCheckOrder.OrderNo,
                UpperOrderNo = reCheckOrder.OrderNo,
                OrderType = InOrderTypeEnum.ReCheck.ObjToInt(),
                OrderStatus = 0,
                CreateType = 0,
                BusinessType = "30",
                IsBatch = 0,
                FactoryArea = reCheckOrder.FactoryArea,
                Remark = "",
                DepartmentCode = "",
                DepartmentName = "",
                ReturnToMESStatus = 5,
                Details = new List<Dt_OutboundOrderDetail>()
            };
            outboundOrder.Details.Add(
                     new Dt_OutboundOrderDetail
                     {
                         OrderId = 0,
                         MaterielCode = reCheckOrder.MaterielCode,
                         MaterielName = "",
                         BatchNo = reCheckOrder.BatchNo,
                         OrderQuantity = reCheckOrder.Qty,
                         BarcodeQty = (decimal)reCheckOrder.Qty,
                         BarcodeUnit = reCheckOrder.Unit,
                         LockQuantity = 0,
                         lineNo = "",
                         OverOutQuantity = 0,
                         OrderDetailStatus = 0,
                         Unit = reCheckOrder.Unit,
                         RowNo = 0,
                         SupplyCode = "",
                         WarehouseCode = reCheckOrder.WarehouseCode,
                     }
                );
            return outboundOrder;
        }
    }
}