1
wangxinhui
15 小时以前 cb3907de90eef531df10a078149b29c55ff86401
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs
@@ -3,13 +3,17 @@
using Microsoft.AspNetCore.Mvc.RazorPages;
using Newtonsoft.Json;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using Org.BouncyCastle.Asn1.Ocsp;
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;
@@ -73,6 +77,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>
        /// å…¶ä»–入库单接收(调拔入仓,客供回收,物料销售退货)
@@ -240,11 +277,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);
@@ -828,11 +865,17 @@
                    stockInfoDetails.Add(stockInfoDetail);
                    notGroupDetail.ReceiptQuantity += model.Quantity;
                    if (notGroupDetail.ReceiptQuantity>notGroupDetail.OrderQuantity)
                    decimal decimalReceiptQuantity = Convert.ToDecimal(notGroupDetail.ReceiptQuantity);
                    decimal decimalModelQuantity = Convert.ToDecimal(model.Quantity);
                    decimal decimalOrderQuantity = Convert.ToDecimal(notGroupDetail.OrderQuantity);
                    decimalReceiptQuantity += decimalModelQuantity;
                    // æ£€æŸ¥æ˜¯å¦è¶…出订单数量
                    if (decimalReceiptQuantity > decimalOrderQuantity)
                    {
                        return WebResponseContent.Instance.Error($"组盘数量溢出{notGroupDetail.ReceiptQuantity - notGroupDetail.OrderQuantity}");
                        return WebResponseContent.Instance.Error($"组盘数量溢出{decimalReceiptQuantity - decimalOrderQuantity}");
                    }
                    // è½¬å›žfloat类型存储,但比较和计算都使用decimal完成
                    notGroupDetail.ReceiptQuantity = Convert.ToSingle(decimalReceiptQuantity);
                    if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                    {
                        notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
@@ -864,6 +907,232 @@
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent MaterielPPorGM(string materielBoxCode = "")
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                string SerNum = "";
                if (materielBoxCode.LastIndexOf("SC:")<0)
                {
                    SerNum = materielBoxCode;
                }
                else
                {
                    SerNum = materielBoxCode.Substring(0, materielBoxCode.LastIndexOf("SC:") - 1);
                }
                MatSerNumAnalysisModel model = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, SerNum);
                //验证判断时间格式
                WebResponseContent IsValidContent = IsValidMCDates(new List<MatSerNumAnalysisModel>() { model });
                if (!IsValidContent.Status)
                {
                    return content.Error(IsValidContent.Message);
                }
                string result = "";
                if (materielBoxCode.LastIndexOf("SC:") > 0)
                {
                    result = materielBoxCode.Substring(materielBoxCode.LastIndexOf("SC:") + 3);
                }
                //获取入库单明细
                Dt_InboundOrderDetail inboundOrderDetail = _inboundRepository.InboundOrderDetailRepository.QueryFirst(x=>x.BatchNo== model.LotNo && x.MaterielCode== model.MaterielCode);
                if (inboundOrderDetail == null)
                {
                    return InOtherGMOrPP(model, result);
                }
                Dt_InboundOrder inboundOrder = BaseDal.Db.Queryable<Dt_InboundOrder>().First(x => x.Id == inboundOrderDetail.OrderId);
                if (inboundOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到入库单信息");
                }
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId);
                //除采购入库单以外其他入库单组盘数据处理
                if (inboundOrder.OrderType != InOrderTypeEnum.Purchase.ObjToInt())
                {
                    return OtherInGroup(inboundOrder, model.LotNo, 0, warehouse, new List<MatSerNumAnalysisModel>() { model });
                }
                Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First();
                if (receiveOrder == null)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单");
                }
                if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0)
                {
                    return WebResponseContent.Instance.Error($"未找到对应的收货单明细");
                }
                List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList();
                string materielCode = model?.MaterielCode ?? "";
                Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
                if (materielInfo == null)
                {
                    return WebResponseContent.Instance.Error($"未找到该物料的信息");
                }
                float beforeQuantity = 0;
                Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == model.LotNo).Includes(x => x.Details).First();
                if (stockInfo == null)
                {
                    stockInfo = new Dt_StockInfo()
                    {
                        PalletCode = model.LotNo,
                        StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                        WarehouseId = inboundOrder.WarehouseId,
                        PalletType = GetPalletTypeGMOrPP(warehouse, result.IsNullOrEmpty() ? "" : result.Split("*")[0]),
                        StockLength = result.IsNullOrEmpty() ? 0 : result.Split("*")[0].ObjToInt(),
                        Details = new List<Dt_StockInfoDetail>()
                    };
                }
                else
                {
                    if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                    {
                        return WebResponseContent.Instance.Error($"托盘号重复");
                    }
                }
                if (stockInfo.PalletType==-1)
                {
                    return WebResponseContent.Instance.Error($"托盘类型不存在");
                }
                List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
                if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null)
                {
                    return WebResponseContent.Instance.Error($"未在收货明细中找到该采购单");
                }
                if (inboundOrderDetail.OrderDetailStatus > OrderDetailStatusEnum.Inbounding.ObjToInt() || inboundOrderDetail.OrderQuantity == inboundOrderDetail.ReceiptQuantity)
                {
                    return WebResponseContent.Instance.Error($"该物料在该入库单中已全部组盘完成");
                }
                Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
                {
                    BatchNo = model.LotNo,
                    MaterielCode = materielInfo.MaterielCode,
                    MaterielName = materielInfo.MaterielName,
                    MaterielSpec = materielInfo.MaterielSpec,
                    OrderNo = inboundOrder.InboundOrderNo,
                    SerialNumber = model.SerialNumber,
                    StockQuantity = model.Quantity,
                    OutboundQuantity = 0,
                    Unit = materielInfo.MaterielUnit,
                    Status = StockStatusEmun.组盘暂存.ObjToInt(),
                    ProductionDate = model.ProductionDate,
                    EffectiveDate = model.EffectiveDate,
                    InboundOrderRowNo = inboundOrderDetail.RowNo,
                };
                stockInfo.Details.Add(stockInfoDetail);
                stockInfoDetails.Add(stockInfoDetail);
                inboundOrderDetail.ReceiptQuantity += model.Quantity;
                if (inboundOrderDetail.ReceiptQuantity > inboundOrderDetail.OrderQuantity)
                {
                    return WebResponseContent.Instance.Error($"组盘数量溢出{inboundOrderDetail.ReceiptQuantity - inboundOrderDetail.OrderQuantity}");
                }
                if (inboundOrderDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt())
                {
                    inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt();
                }
                float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
                if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt())
                {
                    inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt();
                }
                _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetail);
                _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder);
                _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
                content.OK(data: stockInfo);
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
        public WebResponseContent InOtherGMOrPP(MatSerNumAnalysisModel model,string request = "")
        {
            string materielCode = model?.MaterielCode ?? "";
            Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode);
            if (materielInfo == null)
            {
                return WebResponseContent.Instance.Error($"未找到该物料的信息");
            }
            float beforeQuantity = 0;
            Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseId == materielInfo.WarehouseId);
            Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == model.LotNo).Includes(x => x.Details).First();
            if (stockInfo == null)
            {
                stockInfo = new Dt_StockInfo()
                {
                    PalletCode = model.LotNo,
                    StockStatus = StockStatusEmun.组盘暂存.ObjToInt(),
                    WarehouseId = warehouse.WarehouseId,
                    PalletType = GetPalletTypeGMOrPP(warehouse, request.IsNullOrEmpty() ?"":request.Split("*")[0]),
                    StockLength = request.IsNullOrEmpty()?0:request.Split("*")[0].ObjToInt(),
                    Details = new List<Dt_StockInfoDetail>()
                };
            }
            else
            {
                if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt())
                {
                    return WebResponseContent.Instance.Error($"托盘号重复");
                }
            }
            if (stockInfo.PalletType == -1)
            {
                return WebResponseContent.Instance.Error($"托盘类型不存在");
            }
            List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>();
            Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail()
            {
                BatchNo = model.LotNo,
                MaterielCode = materielInfo.MaterielCode,
                MaterielName = materielInfo.MaterielName,
                MaterielSpec = materielInfo.MaterielSpec,
                OrderNo = "",
                SerialNumber = model.SerialNumber,
                StockQuantity = model.Quantity,
                OutboundQuantity = 0,
                Unit = materielInfo.MaterielUnit,
                Status = StockStatusEmun.组盘暂存.ObjToInt(),
                ProductionDate = model.ProductionDate,
                EffectiveDate = model.EffectiveDate,
                InboundOrderRowNo = 0,
            };
            stockInfo.Details.Add(stockInfoDetail);
            stockInfoDetails.Add(stockInfoDetail);
            float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity);
            _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup);
            return WebResponseContent.Instance.OK(data: stockInfo);
        }
        public int GetPalletTypeGMOrPP(Dt_Warehouse warehouse, string boxWidth)
        {
            if (warehouse.WarehouseCode == WarehouseEnum.HA152.ToString())
            {
                if (boxWidth.ObjToInt() <= 690 && boxWidth.ObjToInt()>=520)
                {
                    return 15;
                }
                else if (boxWidth.ObjToInt() > 690 && boxWidth.ObjToInt() <= 1400)
                {
                    return 16;
                }
            }
            else if (warehouse.WarehouseCode == WarehouseEnum.HA58.ToString())
            {
                Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.WarehouseId == warehouse.WarehouseId);
                return palletTypeInfo.PalletType;
            }
            return -1;
        }
        public WebResponseContent OtherInGroup(Dt_InboundOrder inboundOrder,string? palletCode,int Initiallife,Dt_Warehouse warehouse,List<MatSerNumAnalysisModel> models)
        {
@@ -1296,6 +1565,8 @@
            try
            {
                List<ERPProItemsItem> proItemsItems = new List<ERPProItemsItem>();
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==mesProInOrder.WarehouseId);
                string batchNoRemark = "";
                foreach (var item in mesProInOrder.Details)
                {
                    ERPProItemsItem proItemsItem = new ERPProItemsItem()
@@ -1303,7 +1574,7 @@
                        PartNum = item.ProductCode,
                        Rev=item.ProductVersion,
                        DateCode=item.DateCode,
                        BatchNumber= item.BagNo,
                        BatchNumber= item.ProductCode,
                        XLocation=item.XSite,
                        Xqty=item.XQty,
                        QtySet=item.SETQty,
@@ -1319,6 +1590,7 @@
                            }
                        }
                    };
                    batchNoRemark += item.BagNo + ",";
                    proItemsItems.Add(proItemsItem);
                }
                ERPProInboundModel proInboundModel = new ERPProInboundModel()
@@ -1328,13 +1600,20 @@
                    CreatorCode = "GSWMS",
                    CompanyCode = "HATC",
                    FactoryCode = "HA02",
                    WarehouseCode = "HA71",
                    LocationCode = "HA71",
                    WarehouseCode = warehouse.WarehouseCode,
                    LocationCode = warehouse.WarehouseCode,
                    StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    StockFormType= "Production",
                    StockFormItems= proItemsItems
                    StockFormItems= proItemsItems,
                    Remark=batchNoRemark
                };
                _invokeERPService.InvokeProInApi(proInboundModel);
                string response = _invokeERPService.InvokeProInApi(proInboundModel);
                ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>();
                if (requestContent.res != 1)
                {
                    return content.Error($"{requestContent.Data}");
                }
                content.OK();
            }
            catch (Exception ex)
            {
@@ -1525,6 +1804,15 @@
                }
                return palletTypeInfo.PalletType;
            }
            else if (warehouse.WarehouseCode == WarehouseEnum.HA58.ObjToString())
            {
                Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 2));
                if (palletTypeInfo == null)
                {
                    throw new Exception($"托盘号错误");
                }
                return palletTypeInfo.PalletType;
            }
            return -1;
        }
        /// <summary>