wangxinhui
2025-04-08 dcecb039035f4b2e82e31c39b74db9402444c536
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -2,11 +2,16 @@
using HslCommunication.WebSocket;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using SqlSugar;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.Globalization;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
@@ -41,6 +46,7 @@
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
using WIDESEA_StockRepository;
using static Org.BouncyCastle.Pqc.Crypto.Utilities.PqcOtherInfoGenerator;
namespace WIDESEA_InboundService
{
@@ -69,6 +75,39 @@
            _invokeERPService = invokeERPService;
            _warehouseService = warehouseService;
            _palletTypeInfoRepository = palletTypeInfoRepository;
        }
        public override object GetDetailPage(PageDataOptions pageData)
        {
            Type t = typeof(Dt_InboundOrder);
            if (pageData.Value == null) return new PageGridData<object>(total: 0, null);
            string keyName = t.GetKeyName();
            ////生成查询条件
            //Expression<Func<TEntity, bool>> whereExpression = keyName.CreateExpression<TEntity>(pageData.Value, LinqExpressionType.Equal);
            int totalCount = 0;
            PropertyInfo propertyInfo = t.GetProperties().FirstOrDefault(x => x.GetCustomAttribute<Navigate>() != null);
            if (propertyInfo != null)
            {
                Type detailType = propertyInfo.PropertyType.GetGenericArguments()[0];
                Navigate navigate = propertyInfo.GetCustomAttribute<Navigate>();
                List<Dt_InboundOrderDetail> list = BaseDal.Db.Queryable<Dt_InboundOrderDetail>().Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount);
                decimal sum = 0;
                list.ForEach(x =>
                {
                    sum += Convert.ToDecimal(x.OrderQuantity);
                });
                PageGridData<Dt_InboundOrderDetail> pageGridData = new PageGridData<Dt_InboundOrderDetail>()
                {
                    Total= totalCount,
                    Rows=list,
                    Summary=new
                    {
                        OrderQuantity = Math.Round(sum, 3),
                    }
                };
                return pageGridData;
            }
            return new PageGridData<object>(total: 0, null);
        }
        /// <summary>
        /// å…¶ä»–入库单接收(调拔入仓,客供回收,物料销售退货)
@@ -236,11 +275,11 @@
                List<Dt_InboundOrder> dt_ReceiveOrders = new List<Dt_InboundOrder>();
                if (string.IsNullOrEmpty(orderNo))
                {
                    dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5);
                    dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).Includes(x=>x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 10);
                }
                else
                {
                    dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => (x.InboundOrderNo.Contains(orderNo)) && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 5);
                    dt_ReceiveOrders = Db.Queryable<Dt_InboundOrder>().Where(x => (x.InboundOrderNo.Contains(orderNo)) && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt() && x.WarehouseId == warehouseId).Includes(x => x.Details).OrderByDescending(x => x.CreateDate).ToPageList(pageNo, 10);
                }
                content.OK(data: dt_ReceiveOrders);
@@ -556,7 +595,7 @@
                    }
                    else
                    {
                        FeedbackInboundOrder(inboundOrder);
                        FeedbackInboundOrder(inboundOrder.Id);
                    }
                }
                #endregion
@@ -687,6 +726,12 @@
                    return WebResponseContent.Instance.Error($"未找到入库单明细信息");
                }
                List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums);
                //验证判断时间格式
                WebResponseContent IsValidContent = IsValidMCDates(models);
                if (!IsValidContent.Status)
                {
                    return content.Error(IsValidContent.Message);
                }
                //除采购入库单以外其他入库单组盘数据处理
                if (inboundOrder.OrderType != InOrderTypeEnum.Purchase.ObjToInt())
                {
@@ -703,7 +748,6 @@
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                if (models.Select(x => x.MaterielCode).Distinct().Count() > 1)
                {
                    return WebResponseContent.Instance.Error($"物料不可混放");
@@ -820,6 +864,10 @@
                    stockInfoDetails.Add(stockInfoDetail);
                    notGroupDetail.ReceiptQuantity += model.Quantity;
                    if (notGroupDetail.ReceiptQuantity>notGroupDetail.OrderQuantity)
                    {
                        return WebResponseContent.Instance.Error($"组盘数量溢出{notGroupDetail.ReceiptQuantity - notGroupDetail.OrderQuantity}");
                    }
                    if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                    {
                        notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
@@ -861,7 +909,12 @@
                {
                    return content.Error($"物料不可混放");
                }
                //验证判断时间格式
                WebResponseContent IsValidContent = IsValidMCDates(models);
                if (!IsValidContent.Status)
                {
                    return content.Error(IsValidContent.Message);
                }
                string materielCode = models.FirstOrDefault()?.MaterielCode ?? "";
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
                if (materielInfo == null)
@@ -1013,7 +1066,12 @@
                {
                    return WebResponseContent.Instance.Error($"物料不可混放");
                }
                //验证判断时间格式
                WebResponseContent IsValidContent = IsValidMCDates(models);
                if (!IsValidContent.Status)
                {
                    return content.Error(IsValidContent.Message);
                }
                string materielCode = models.FirstOrDefault()?.MaterielCode ?? "";
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
                if (materielInfo == null)
@@ -1131,11 +1189,12 @@
        /// å…¥åº“完成上报ERP
        /// </summary>
        /// <returns></returns>
        public WebResponseContent FeedbackInboundOrder(Dt_InboundOrder inboundOrder)
        public WebResponseContent FeedbackInboundOrder(int inboundOrderId)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.Id == inboundOrderId).Includes(x => x.Details).First();
                if (inboundOrder.Details.Count == 0)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单明细信息");
@@ -1232,11 +1291,11 @@
                        .Select(mg => new ReturnPickItem
                        {
                            Material = mg.Key,
                            Qty = mg.Sum(x => x.Qty),
                            Qty = mg.Sum(x => x.ReturnQty),
                            Dataitem = mg.Select(d => new ReturnDataItem
                            {
                                Lotno = d.BatchNo,
                                Qty = d.Qty,
                                Qty = d.ReturnQty,
                                Location = warehouse.WarehouseCode,
                                Msfpart = d.Code
                            }).ToList()
@@ -1256,6 +1315,61 @@
                };
                _invokeERPService.InvokeReturnApi(returnModel);
                return content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// æˆå“å…¥åº“上传ERP
        /// </summary>
        public WebResponseContent FeedbackProIn(Dt_MesProInOrder mesProInOrder)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                List<ERPProItemsItem> proItemsItems = new List<ERPProItemsItem>();
                foreach (var item in mesProInOrder.Details)
                {
                    ERPProItemsItem proItemsItem = new ERPProItemsItem()
                    {
                        PartNum = item.ProductCode,
                        Rev=item.ProductVersion,
                        DateCode=item.DateCode,
                        BatchNumber= item.BagNo,
                        XLocation=item.XSite,
                        Xqty=item.XQty,
                        QtySet=item.SETQty,
                        QtyPcs=item.OKPCSQTY,
                        WoList=new List<ERPProListItem>()
                        {
                            new ERPProListItem()
                            {
                                moNumber=item.MoNumber,
                                WoNumber=item.ERPOrder,
                                QtyPcs=item.OKPCSQTY,
                                QtySet=item.SETQty
                            }
                        }
                    };
                    proItemsItems.Add(proItemsItem);
                }
                ERPProInboundModel proInboundModel = new ERPProInboundModel()
                {
                    Way = 1,
                    Code = mesProInOrder.ProInOrderNo,
                    CreatorCode = "GSWMS",
                    CompanyCode = "HATC",
                    FactoryCode = "HA02",
                    WarehouseCode = "HA71",
                    LocationCode = "HA71",
                    StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    StockFormType= "Production",
                    StockFormItems= proItemsItems
                };
                _invokeERPService.InvokeProInApi(proInboundModel);
            }
            catch (Exception ex)
            {
@@ -1448,5 +1562,50 @@
            }
            return -1;
        }
        /// <summary>
        /// åˆ¤æ–­æ­£ç¡®æ—¶é—´æ ¼å¼
        /// </summary>
        public WebResponseContent IsValidMCDates(List<MatSerNumAnalysisModel> analysisModels)
        {
            string[] effDates = analysisModels.Select(x => x.EffectiveDate).Distinct().ToArray();
            string[] ProDates = analysisModels.Select(x => x.ProductionDate).Distinct().ToArray();
            foreach (string effDate in effDates)
            {
                string format = "yyyy-MM-dd"; // ç›®æ ‡æ ¼å¼
                DateTime parsedDate;
                // è§£æžå¹¶éªŒè¯æ ¼å¼
                bool isValid = DateTime.TryParseExact(
                    effDate,
                    format,
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.None,
                    out parsedDate
                );
                if (!isValid)
                {
                    return WebResponseContent.Instance.Error("格式无效或日期不合法");
                }
            }
            foreach (string ProDate in ProDates)
            {
                string format = "yyyy-MM-dd"; // ç›®æ ‡æ ¼å¼
                DateTime parsedDate;
                // è§£æžå¹¶éªŒè¯æ ¼å¼
                bool isValid = DateTime.TryParseExact(
                    ProDate,
                    format,
                    CultureInfo.InvariantCulture,
                    DateTimeStyles.None,
                    out parsedDate
                );
                if (!isValid)
                {
                    return WebResponseContent.Instance.Error("格式无效或日期不合法");
                }
            }
            return WebResponseContent.Instance.OK();
        }
    }
}