From 225d11e2ddaa55d1d482201cb4d89c9486cdba69 Mon Sep 17 00:00:00 2001 From: wangxinhui <wangxinhui@hnkhzn.com> Date: 星期五, 20 六月 2025 12:27:52 +0800 Subject: [PATCH] 更新代码 --- 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs | 1068 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 1,019 insertions(+), 49 deletions(-) diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs" index b4686f5..3613253 100644 --- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs" +++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_InboundService/InboundOrderService.cs" @@ -2,11 +2,18 @@ using HslCommunication.WebSocket; 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; @@ -18,8 +25,10 @@ using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.CodeConfigEnum; +using WIDESEA_Core.DB; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; +using WIDESEA_Core.Seed; using WIDESEA_Core.Utilities; using WIDESEA_DTO; using WIDESEA_DTO.Basic; @@ -39,6 +48,7 @@ using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; using WIDESEA_StockRepository; +using static Org.BouncyCastle.Pqc.Crypto.Utilities.PqcOtherInfoGenerator; namespace WIDESEA_InboundService { @@ -68,44 +78,192 @@ _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> - /// 鍏朵粬鍏ュ簱鍗曞垱寤� + /// 鍏朵粬鍏ュ簱鍗曟帴鏀�(璋冩嫈鍏ヤ粨,瀹緵鍥炴敹,鐗╂枡閿�鍞��璐�) /// </summary> /// <returns></returns> - public WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO erpInOrder) + public WebResponseContent ReceiveWarehousingOrder(ErpInOrderDTO model) + { + try + { + return model.Way switch + { + 1 => AddSingOrder(model), + 2 => UpdateSingOrder(model), + 3 => DeleteSingOrder(model), + _ => WebResponseContent.Instance.Error($"鎿嶄綔绫诲瀷涓嶅瓨鍦�,Way:{model.Way}"), + }; + } + catch (Exception ex) + { + return WebResponseContent.Instance.Error(ex.Message); + } + } + /// <summary> + /// 鏂板鍗曟嵁 + /// </summary> + public WebResponseContent AddSingOrder(ErpInOrderDTO model) { WebResponseContent content = new WebResponseContent(); try { - //鑾峰彇浠撳簱淇℃伅 - Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseCode == erpInOrder.WaId); + //鑾峰彇鐗╂枡淇℃伅 + Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode==model.MCode); + if (materielInfo==null) + { + return content.Error($"鐗╂枡{model.MCode}涓嶅瓨鍦�!"); + } + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == model.WaId); if (warehouse == null) { - return content.Error("鏈壘鍒颁粨搴撲俊鎭�"); + return content.Error($"鏈壘鍒颁粨搴撲俊鎭�"); } - //鑾峰彇鏄惁瀛樺湪璁㈠崟 - Dt_InboundOrder inboundOrder = BaseDal.QueryFirst(x => x.InboundOrderNo == erpInOrder.OrderNo); - if (erpInOrder.Way == 1) + Dt_InboundOrder inboundOrderOld = BaseDal.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).Includes(x=>x.Details).First(); + if (inboundOrderOld!=null) { - if (inboundOrder != null) + if (inboundOrderOld.OrderStatus!= OrderDetailStatusEnum.New.ObjToInt()) { - + return content.Error($"{model.OrderNo}鍗曟嵁宸插紑濮�!"); } - } - else if (erpInOrder.Way == 2) - { - + Dt_InboundOrderDetail? inboundOrderDetailOld = inboundOrderOld.Details?.FirstOrDefault(x => x.RowNo == model.RowNo.ObjToInt() && x.MaterielCode == model.MCode); + if (inboundOrderDetailOld!=null) + { + inboundOrderDetailOld.OrderQuantity += model.Qty; + _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetailOld); + } + else + { + Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail() + { + OrderId= inboundOrderOld.Id, + MaterielCode = model.MCode, + BatchNo = "", + OrderQuantity = model.Qty, + ReceiptQuantity = 0, + OverInQuantity = 0, + OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), + Unit = materielInfo.MaterielUnit, + RowNo = model.RowNo.ObjToInt(), + MaterielName = materielInfo.MaterielName, + MaterielSpec = materielInfo.MaterielSpec + }; + _inboundRepository.InboundOrderDetailRepository.AddData(orderDetail); + } } else { + Dt_InboundOrderDetail orderDetail = new Dt_InboundOrderDetail() + { + MaterielCode = model.MCode, + BatchNo = "", + OrderQuantity = model.Qty, + ReceiptQuantity = 0, + OverInQuantity = 0, + OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(), + Unit = materielInfo.MaterielUnit, + RowNo = model.RowNo.ObjToInt(), + MaterielName = materielInfo.MaterielName, + MaterielSpec = materielInfo.MaterielSpec + }; + Dt_InboundOrder inboundOrder = new Dt_InboundOrder() + { + UpperOrderNo = model.OrderNo, + WarehouseId = warehouse.WarehouseId, + SupplierId = "", + OrderStatus = InOrderStatusEnum.鏈紑濮�.ObjToInt(), + CreateType = OrderCreateTypeEnum.UpperSystemPush.ObjToInt(), + Remark = model.Note, + Details = new List<Dt_InboundOrderDetail> { orderDetail } + }; + switch (model.OType) + { + case 1: + inboundOrder.OrderType = InOrderTypeEnum.Allocat.ObjToInt(); + break; + case 3: + inboundOrder.OrderType = InOrderTypeEnum.CustomerRecovery.ObjToInt(); + break; + case 6: + inboundOrder.OrderType = InOrderTypeEnum.SaleReturn.ObjToInt(); + break; + default: + break; + }; + Db.InsertNav(inboundOrder).Include(x => x.Details).ExecuteCommand(); } - return content.OK(); + return content.OK("鎴愬姛"); } catch (Exception ex) { content.Error(ex.Message); } + return content; + } + /// <summary> + /// 淇敼鍗曟嵁 + /// </summary> + public WebResponseContent UpdateSingOrder(ErpInOrderDTO model) + { + WebResponseContent content = new WebResponseContent(); + try + { + //鑾峰彇鍗曟嵁淇℃伅 + Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == model.OrderNo).First(); + if (inboundOrder == null) + { + return content.Error($"鍗曟嵁{model.OrderNo}涓嶅瓨鍦�!"); + } + if (inboundOrder.OrderStatus>=InOrderStatusEnum.鍏ュ簱涓�.ObjToInt()) + { + return content.Error($"鍗曟嵁{model.OrderNo}鍏ュ簱涓垨宸插畬鎴�"); + } + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } + /// <summary> + /// 鍒犻櫎鍗曟嵁 + /// </summary> + public WebResponseContent DeleteSingOrder(ErpInOrderDTO model) + { + WebResponseContent content = new WebResponseContent(); return content; } public WebResponseContent GetInboundOrders(SaveModel saveModel) @@ -119,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); @@ -287,16 +445,16 @@ int oldCount = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count; Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); - if (receiveOrder == null) + if (receiveOrder == null && inboundOrder.OrderType==InOrderTypeEnum.Purchase.ObjToInt()) { return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑鏀惰揣鍗�"); } - if (receiveOrder.Details == null || receiveOrder.Details.Count <= 0) + if ((receiveOrder?.Details == null || receiveOrder?.Details.Count <= 0) && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt()) { return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑鏀惰揣鍗曟槑缁�"); } - List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); + List<string> purchaseOrderNos = receiveOrder?.Details.Select(x => x.PurchaseOrderNo).ToList(); List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums); @@ -323,7 +481,7 @@ if (!inboundOrderDetails.Any(x => x.BatchNo == model.LotNo)) return WebResponseContent.Instance.Error($"鏈湪鍏ュ簱鍗曟槑缁嗕腑鎵惧埌璇ョ墿鏂欐壒娆°�恵model.LotNo}銆�"); } - if (receiveOrder.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null) + if (receiveOrder?.Details.FirstOrDefault(x => x.MaterielCode == materielCode) == null && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt()) { return WebResponseContent.Instance.Error($"鏈湪鏀惰揣鍗曟槑缁嗕腑鎵惧埌璇ョ墿鏂欎俊鎭�"); } @@ -340,9 +498,10 @@ List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>(); List<int> detailKeys = new List<int>(); + Dt_ReturnOrder? returnOrder = null; foreach (var model in models) { - if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) + if (purchaseOrderNos?.FirstOrDefault(x => x == model.PurchaseOrderNo) == null && inboundOrder.OrderType == InOrderTypeEnum.Purchase.ObjToInt()) { return WebResponseContent.Instance.Error($"鏈湪鏀惰揣鍗曟槑缁嗕腑鎵惧埌璇ラ噰璐崟"); } @@ -360,6 +519,7 @@ BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, + MaterielSpec=materielInfo.MaterielSpec, OrderNo = inboundOrder.InboundOrderNo, SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, @@ -370,6 +530,7 @@ EffectiveDate = model.EffectiveDate, InboundOrderRowNo = notGroupDetail.RowNo, }; + oldCount++; if (stockInfo.Id > 0) { @@ -385,10 +546,24 @@ } //鍏ュ簱鏄庣粏鏂板瀹屾垚鏁伴噺 - int newCount = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count; - if (inboundOrder.Details.Count == (newCount + oldCount)) + if (inboundOrder.Details.Count == oldCount) { inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt(); + //鍒ゆ柇鏄惁涓洪��鏂欏叆搴撳崟 + if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt()) + { + returnOrder = _inboundRepository.ReturnOrderRepository.Db.Queryable<Dt_ReturnOrder>().Where(x => x.OrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); + returnOrder.ReturnOrderStatus = ReturnOrderStatusEnum.Returned.ObjToInt(); + foreach (var item in inboundOrder.Details) + { + Dt_ReturnOrderDetail returnOrderDetail = returnOrder.Details?.FirstOrDefault(x => x.MCode == item.MaterielCode); + if (returnOrderDetail != null) + { + returnOrderDetail.OverReturnQty = item.OverInQuantity; + returnOrderDetail.OrderDetailStatus = ReturnOrderStatusEnum.Returned.ObjToInt(); + } + } + } } else inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱涓�.ObjToInt(); @@ -405,6 +580,112 @@ } _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder); + if (returnOrder != null) + { + _inboundRepository.ReturnOrderRepository.UpdateData(returnOrder); + _inboundRepository.ReturnOrderDetailRepository.UpdateData(returnOrder.Details); + } + _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.Inbound); + _unitOfWorkManage.CommitTran(); + + #region 鍏ュ簱瀹屾垚涓婃姤ERP + if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt() && inboundOrder.OrderType != InOrderTypeEnum.Allocat.ObjToInt()) + { + if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt()) + { + FeedbackReturnOrder(inboundOrder, returnOrder); + } + else + { + FeedbackInboundOrder(inboundOrder.Id); + } + } + #endregion + content.OK(); + } + catch (Exception ex) + { + _unitOfWorkManage.RollbackTran(); + content.Error(ex.Message); + } + return content; + } + /// <summary> + /// WMS鍏ュ钩搴撲笉鎺ㄥ崟鎹� + /// </summary> + /// <param name="warehouseId"></param> + /// <param name="serNums"></param> + /// <returns></returns> + public WebResponseContent WMSInPinKu(int warehouseId, List<string> serNums) + { + WebResponseContent content = new WebResponseContent(); + try + { + Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == warehouseId); + if (warehouse == null) + { + return WebResponseContent.Instance.Error($"鏈壘鍒拌浠撳簱淇℃伅"); + } + List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums); + if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) + { + return WebResponseContent.Instance.Error($"鐗╂枡涓嶅彲娣锋斁"); + } + + string materielCode = models.FirstOrDefault()?.MaterielCode ?? ""; + Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x => x.MaterielCode == materielCode); + if (materielInfo == null) + { + return WebResponseContent.Instance.Error($"鏈壘鍒拌鐗╂枡鐨勪俊鎭�"); + } + float beforeQuantity = 0; + Dt_StockInfo stockInfo = new Dt_StockInfo() + { + PalletCode = DateTime.Now.ToString("yyyyMMddHHmmss"), + StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt(), + WarehouseId = warehouse.WarehouseId, + PalletType = PalletTypeEnum.SmallPallet.ObjToInt(), + LocationCode = "骞冲簱浣�", + Details = new List<Dt_StockInfoDetail>() + }; + List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>(); + foreach (var model in models) + { + Dt_StockInfoDetail stockInfoDetail = new Dt_StockInfoDetail() + { + BatchNo = model.LotNo, + MaterielCode = materielInfo.MaterielCode, + MaterielName = materielInfo.MaterielName, + MaterielSpec = materielInfo.MaterielSpec, + SerialNumber = model.SerialNumber, + StockQuantity = model.Quantity, + OutboundQuantity = 0, + OrderNo = "", + Unit = materielInfo.MaterielUnit, + Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt(), + ProductionDate = model.ProductionDate, + EffectiveDate = model.EffectiveDate, + }; + + if (stockInfo.Id > 0) + { + stockInfoDetail.StockId = stockInfo.Id; + } + stockInfo.Details.Add(stockInfoDetail); + + stockInfoDetails.Add(stockInfoDetail); + + } + float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); + _unitOfWorkManage.BeginTran(); + if (stockInfo.Id == 0) + { + _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); + } + else + { + _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); + } _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.Inbound); _unitOfWorkManage.CommitTran(); content.OK(); @@ -416,7 +697,6 @@ } return content; } - /// <summary> /// 缁勭洏 /// </summary> @@ -447,7 +727,18 @@ { 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()) + { + return OtherInGroup(inboundOrder, palletCode, Initiallife, warehouse, models); + } Dt_ReceiveOrder receiveOrder = _inboundRepository.ReceiveOrderRepository.Db.Queryable<Dt_ReceiveOrder>().Where(x => x.ReceiveOrderNo == inboundOrder.UpperOrderNo).Includes(x => x.Details).First(); if (receiveOrder == null) { @@ -459,9 +750,6 @@ } List<string> purchaseOrderNos = receiveOrder.Details.Select(x => x.PurchaseOrderNo).ToList(); - - List<MatSerNumAnalysisModel> models = CodeAnalysisHelper.CodeAnalysis<MatSerNumAnalysisModel>(AnalysisCodeEnum.MatSerNumAnalysis, serNums); - if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) { return WebResponseContent.Instance.Error($"鐗╂枡涓嶅彲娣锋斁"); @@ -474,7 +762,7 @@ return WebResponseContent.Instance.Error($"鏈壘鍒拌鐗╂枡鐨勪俊鎭�"); } - List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList(); + List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode && x.BatchNo == (models.FirstOrDefault()?.LotNo ?? "")).ToList(); if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) { @@ -495,7 +783,7 @@ PalletCode = palletCode, StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt(), WarehouseId = inboundOrder.WarehouseId, - PalletType = GetPalletType(warehouse, palletCode, materielInfo), + PalletType = GetPalletType(warehouse, palletCode), Details = new List<Dt_StockInfoDetail>() }; } @@ -530,28 +818,34 @@ stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt(); } } + else if(warehouse.WarehouseCode == WarehouseEnum.HA57.ToString()) + { + if (models.Count >= 2) + { + return WebResponseContent.Instance.Error($"缁勭洏鏄庣粏涓嶅敮涓�"); + } + } List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>(); - List<int> detailKeys = new List<int>(); foreach (var model in models) { if (purchaseOrderNos.FirstOrDefault(x => x == model.PurchaseOrderNo) == null) { - return WebResponseContent.Instance.Error($"鏈湪鏀惰揣鍗曟槑缁嗕腑鎵惧埌璇ラ噰璐崟"); + return WebResponseContent.Instance.Error($"鏈湪閲囪喘鍗曟槑缁嗕腑鎵惧埌璇ラ噰璐崟"); } - Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt() && x.OrderQuantity == model.Quantity && !detailKeys.Contains(x.Id) && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); + Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode==model.MaterielCode && x.BatchNo==model.LotNo && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); if (notGroupDetail == null) { return WebResponseContent.Instance.Error($"璇ョ墿鏂欏湪璇ュ叆搴撳崟涓凡鍏ㄩ儴缁勭洏瀹屾垚"); } - detailKeys.Add(notGroupDetail.Id); 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, @@ -571,8 +865,21 @@ stockInfoDetails.Add(stockInfoDetail); - notGroupDetail.ReceiptQuantity = model.Quantity; - notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); + 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($"缁勭洏鏁伴噺婧㈠嚭{decimalReceiptQuantity - decimalOrderQuantity}"); + } + // 杞洖float绫诲瀷瀛樺偍锛屼絾姣旇緝鍜岃绠楅兘浣跨敤decimal瀹屾垚 + notGroupDetail.ReceiptQuantity = Convert.ToSingle(decimalReceiptQuantity); + if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) + { + notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); + } } float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); @@ -601,7 +908,380 @@ } 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) + { + WebResponseContent content = new WebResponseContent(); + try + { + if (models.Select(x => x.MaterielCode).Distinct().Count() > 1) + { + 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) + { + return content.Error($"鏈壘鍒拌鐗╂枡鐨勪俊鎭�"); + } + + List<Dt_InboundOrderDetail> inboundOrderDetails = inboundOrder.Details.Where(x => x.MaterielCode == materielCode).ToList(); + + if (inboundOrderDetails == null || inboundOrderDetails.Count <= 0) + { + return content.Error($"鏈湪鍏ュ簱鍗曟槑缁嗕腑鎵惧埌璇ョ墿鏂欎俊鎭�"); + } + + float beforeQuantity = 0; + + Dt_StockInfo stockInfo = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); + if (stockInfo == null) + { + stockInfo = new Dt_StockInfo() + { + PalletCode = palletCode, + StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt(), + WarehouseId = inboundOrder.WarehouseId, + PalletType = GetPalletType(warehouse, palletCode), + Details = new List<Dt_StockInfoDetail>() + }; + } + else + { + if (stockInfo.StockStatus != StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.鎵嬪姩缁勭洏鏆傚瓨.ObjToInt()) + { + return content.Error($"鎵樼洏鍙烽噸澶�"); + } + beforeQuantity = stockInfo.Details.Sum(x => x.StockQuantity); + } + + if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) + { + stockInfo.Remark = Initiallife.ToString(); + string batchNo = models.FirstOrDefault()?.LotNo ?? ""; + Dt_StockInfoDetail existDetail = _stockRepository.StockInfoDetailRepository.QueryFirst(x => x.BatchNo == batchNo); + if (existDetail != null) + { + return content.Error($"{batchNo}娴嬭瘯鏋跺凡瀛樺湪"); + } + if (models.Count >= 2) + { + return content.Error($"缁勭洏鏄庣粏涓嶅敮涓�"); + } + if (palletCode.Substring(0, 1) == "6") + { + stockInfo.PalletType = PalletTypeEnum.MediumPallet.ObjToInt(); + } + else + { + stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt(); + } + } + else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ToString()) + { + if (models.Count >= 2) + { + return content.Error($"缁勭洏鏄庣粏涓嶅敮涓�"); + } + } + + List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>(); + foreach (var model in models) + { + Dt_InboundOrderDetail? notGroupDetail = inboundOrderDetails.Where(x => x.OrderDetailStatus <= OrderDetailStatusEnum.Inbounding.ObjToInt() && x.MaterielCode == model.MaterielCode && x.OrderQuantity > x.ReceiptQuantity).FirstOrDefault(); + + if (notGroupDetail == null) + { + 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 = notGroupDetail.RowNo, + }; + + if (stockInfo.Id > 0) + { + stockInfoDetail.StockId = stockInfo.Id; + } + stockInfo.Details.Add(stockInfoDetail); + + stockInfoDetails.Add(stockInfoDetail); + + notGroupDetail.ReceiptQuantity += model.Quantity; + if (notGroupDetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) + { + notGroupDetail.OrderDetailStatus = OrderDetailStatusEnum.GroupAndInbound.ObjToInt(); + } + } + + float totalQuantity = stockInfo.Details.Sum(x => x.StockQuantity); + + inboundOrder.OrderStatus = InOrderStatusEnum.鍏ュ簱涓�.ObjToInt(); + + _unitOfWorkManage.BeginTran(); + if (stockInfo.Id == 0) + { + _stockRepository.StockInfoRepository.Db.InsertNav(stockInfo).Include(x => x.Details).ExecuteCommand(); + } + else + { + _stockRepository.StockInfoRepository.Db.UpdateNav(stockInfo).Include(x => x.Details, new UpdateNavOptions() { OneToManyInsertOrUpdate = true }).ExecuteCommand(); + } + _inboundRepository.InboundOrderDetailRepository.UpdateData(inboundOrderDetails); + _inboundRepository.InboundOrderRepository.UpdateData(inboundOrder); + _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfoDetails, beforeQuantity, totalQuantity, StockChangeTypeEnum.MaterielGroup); + _unitOfWorkManage.CommitTran(); + content.OK(); + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } public WebResponseContent MaterielGroup(string palletCode, int Initiallife, int warehouseId, List<string> serNums) { @@ -620,7 +1300,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) @@ -639,7 +1324,7 @@ PalletCode = palletCode, StockStatus = StockStatusEmun.鎵嬪姩缁勭洏鏆傚瓨.ObjToInt(), WarehouseId = warehouse.WarehouseId, - PalletType = GetPalletType(warehouse, palletCode, materielInfo), + PalletType = GetPalletType(warehouse, palletCode), Details = new List<Dt_StockInfoDetail>() }; } @@ -674,6 +1359,13 @@ stockInfo.PalletType = PalletTypeEnum.LargestPallet.ObjToInt(); } } + else if (warehouse.WarehouseCode == WarehouseEnum.HA57.ToString()) + { + if (models.Count >= 2) + { + return WebResponseContent.Instance.Error($"缁勭洏鏄庣粏涓嶅敮涓�"); + } + } List<Dt_StockInfoDetail> stockInfoDetails = new List<Dt_StockInfoDetail>(); List<int> detailKeys = new List<int>(); @@ -684,6 +1376,7 @@ BatchNo = model.LotNo, MaterielCode = materielInfo.MaterielCode, MaterielName = materielInfo.MaterielName, + MaterielSpec = materielInfo.MaterielSpec, OrderNo = "", SerialNumber = model.SerialNumber, StockQuantity = model.Quantity, @@ -730,29 +1423,55 @@ /// 鍏ュ簱瀹屾垚涓婃姤ERP /// </summary> /// <returns></returns> - public WebResponseContent FeedbackInboundOrder(Dt_StockInfo stockInfo, Dt_InboundOrder inboundOrder, List<ERPInboundDetailModel> detailModels) + 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($"鏈壘鍒板叆搴撳崟鏄庣粏淇℃伅"); } - if (inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt()) + + List<Dt_StockInfoDetail> stockInfoDetails = _stockRepository.StockInfoDetailRepository.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo); + if (stockInfoDetails.Count == 0) { - return WebResponseContent.Instance.Error($"鍏ュ簱鍗曟嵁宸插畬鎴�"); + return WebResponseContent.Instance.Error($"鏈壘鍒板簱瀛樻槑缁嗕俊鎭�"); } - Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == stockInfo.WarehouseId); + //鑾峰彇璇ュ叆搴撳崟鎵�鏈夊簱瀛� + List<Dt_StockInfo> stockInfos = _stockRepository.StockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => stockInfoDetails.GroupBy(x => x.StockId).Select(x => x.Key).Contains(x.Id)).Includes(x => x.Details).ToList(); + Dt_Warehouse warehouse = _warehouseService.Repository.QueryFirst(x => x.WarehouseId == inboundOrder.WarehouseId); if (warehouse == null) { return WebResponseContent.Instance.Error($"鏈壘鍒颁粨搴撲俊鎭�"); } - + List<ERPInboundDetailModel>? detailModels = new List<ERPInboundDetailModel>(); + foreach (var stockInfo in stockInfos) + { + foreach (var item in stockInfo.Details.GroupBy(x => x.InboundOrderRowNo).Select(x => x.Key)) + { + //鍖哄垎涓嶅悓鎵规 + Dt_StockInfoDetail? dt_StockInfoDetail = stockInfo.Details.Where(x => x.InboundOrderRowNo == item).FirstOrDefault(); + ERPInboundDetailModel detailModel = new ERPInboundDetailModel() + { + ExpiryDate = dt_StockInfoDetail?.EffectiveDate ?? "", + LocationCode = warehouse.WarehouseCode, + MaterialsCode = dt_StockInfoDetail.MaterielCode, + MfgDate = dt_StockInfoDetail.ProductionDate ?? "", + QtyCustoms = "0", + Quantity = stockInfo.Details.Where(x => x.InboundOrderRowNo == item).Sum(x => x.StockQuantity).ToString(), + Rack = stockInfo.LocationCode, + ReceiptCode = inboundOrder.UpperOrderNo, + ReceiptSerNo = item.ToString() + }; + detailModels.Add(detailModel); + } + } ERPInboundModel model = new ERPInboundModel() { - Code = inboundOrder.InboundOrderNo, - CreatorCode = inboundOrder.Creater,//娴嬭瘯 + Code = CreateCodeByRule(nameof(RuleCodeEnum.RLCodeRule)), + CreatorCode = inboundOrder.Creater, EntDate = inboundOrder.CreateDate.ToString("yyyy-MM-dd HH:mm:ss"), StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), SuppliersId = inboundOrder.SupplierId, @@ -762,7 +1481,7 @@ Way = 1, Details = detailModels }; - //鎺ㄩ�丒RP 娴嬭瘯娉ㄩ噴 + //鎺ㄩ�丒RP _invokeERPService.InvokeInboundOrderApi(model); return WebResponseContent.Instance.OK(); } @@ -773,7 +1492,195 @@ } return content; } + /// <summary> + /// 閫�鏂欏畬鎴愪笂鎶ヨ嚦ERP + /// </summary> + public WebResponseContent FeedbackReturnOrder(Dt_InboundOrder inboundOrder,Dt_ReturnOrder returnOrder) + { + WebResponseContent content= new WebResponseContent(); + try + { + if (returnOrder==null) + { + return content.OK(); + } + //鑾峰彇浠撳簱缂栫爜 + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==inboundOrder.WarehouseId); + var groupedDetails = returnOrder.Details.GroupBy(d => new { d.PickCode, d.RowId }) + .Select(g => new + { + PickCode = returnOrder.OrderNo, + RowIndex = g.Key.RowId, + Details = g.ToList() + }) + .ToList(); + // 鏋勫缓宓屽缁撴瀯 + var issitems = groupedDetails.Select(g => new ReturnItem + { + Pickcode = g.PickCode, + Rowindex = g.RowIndex, + PickList = g.Details + .GroupBy(d => d.MCode) + .Select(mg => new ReturnPickItem + { + Material = mg.Key, + Qty = mg.Sum(x => x.ReturnQty), + Dataitem = mg.Select(d => new ReturnDataItem + { + Lotno = d.BatchNo, + Qty = d.ReturnQty, + Location = warehouse.WarehouseCode, + Msfpart = d.Code + }).ToList() + }).ToList() + }).ToList(); + //鑾峰彇瀵瑰簲閫�鏂欏崟 + ERPReturnModel returnModel = new ERPReturnModel() + { + Way = 1, + UniqueTag = returnOrder.Id.ToString(), + Code = CreateCodeByRule(nameof(RuleCodeEnum.TLCodeRule)), + WarehouseCode = warehouse.WarehouseCode, + Createtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + Createuser=inboundOrder.Creater, + IsDev=returnOrder.IsDev, + Issitem= issitems + }; + _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>(); + Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x=>x.WarehouseId==mesProInOrder.WarehouseId); + string batchNoRemark = ""; + foreach (var item in mesProInOrder.Details) + { + ERPProItemsItem proItemsItem = new ERPProItemsItem() + { + PartNum = item.ProductCode, + Rev=item.ProductVersion, + DateCode=item.DateCode, + BatchNumber= item.ProductCode, + 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 + } + } + }; + batchNoRemark += item.BagNo + ","; + proItemsItems.Add(proItemsItem); + } + ERPProInboundModel proInboundModel = new ERPProInboundModel() + { + Way = 1, + Code = mesProInOrder.ProInOrderNo, + CreatorCode = "GSWMS", + CompanyCode = "HATC", + FactoryCode = "HA02", + WarehouseCode = warehouse.WarehouseCode, + LocationCode = warehouse.WarehouseCode, + StockDate = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), + StockFormType= "Production", + StockFormItems= proItemsItems, + Remark=batchNoRemark + }; + string response = _invokeERPService.InvokeProInApi(proInboundModel); + ErpRequestContent requestContent = response.DeserializeObject<ErpRequestContent>(); + if (requestContent.res != 1) + { + return content.Error($"{requestContent.Data}"); + } + content.OK(); + } + catch (Exception ex) + { + content.Error(ex.Message); + } + return content; + } + static object lock_code = new object(); + public string CreateCodeByRule(string ruleCode) + { + lock (lock_code) + { + + string code = string.Empty; + DateTime dateTime = DateTime.Now; + DateTime now = DateTime.Now; + try + { + if (string.IsNullOrEmpty(ruleCode)) + throw new ArgumentNullException(nameof(ruleCode)); + SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig + { + IsAutoCloseConnection = true, + DbType = DbType.SqlServer, + ConnectionString = DBContext.ConnectionString + }); + Dt_CodeRuleConfig codeRuleConfig = sugarClient.Queryable<Dt_CodeRuleConfig>().Where(x => x.RuleCode == ruleCode).First(); + if (codeRuleConfig == null) + throw new ArgumentNullException(nameof(codeRuleConfig)); + if (codeRuleConfig.ModifyDate != null) + { + dateTime = Convert.ToDateTime(codeRuleConfig.ModifyDate); + } + else + { + dateTime = Convert.ToDateTime(codeRuleConfig.CreateDate); + } + + if (now.Year == dateTime.Year && now.Month == dateTime.Month && now.Day == dateTime.Day) + { + now = dateTime; + codeRuleConfig.CurrentVal = Convert.ToInt32(codeRuleConfig.CurrentVal) + 1; + } + else + { + codeRuleConfig.CurrentVal = 1; + } + codeRuleConfig.ModifyDate = DateTime.Now; + code = codeRuleConfig.Format; + code = code.Replace($"[{CodeFormatTypeEnum.YYYY}]", now.Year.ToString().PadLeft(4, '0')); + code = code.Replace($"[{CodeFormatTypeEnum.MM}]", now.Month.ToString().PadLeft(2, '0')); + code = code.Replace($"[{CodeFormatTypeEnum.DD}]", now.Day.ToString().PadLeft(2, '0')); + code = code.Replace($"[{CodeFormatTypeEnum.ST}]", codeRuleConfig.StartStr?.ToString() ?? ""); + code = code.Replace($"[{CodeFormatTypeEnum.NUM}]", codeRuleConfig.CurrentVal.ToString().PadLeft(codeRuleConfig.Length, '0')); + Dictionary<string, object> keyValuePairs = new Dictionary<string, object>() { { nameof(codeRuleConfig.CurrentVal), codeRuleConfig.CurrentVal }, { nameof(codeRuleConfig.Id), codeRuleConfig.Id }, { nameof(codeRuleConfig.ModifyDate), DateTime.Now } }; + sugarClient.Updateable(keyValuePairs).AS(MainDb.CodeRuleConfig).WhereColumns(nameof(codeRuleConfig.Id)).ExecuteCommand(); + sugarClient.Updateable(codeRuleConfig); + + } + catch (Exception ex) + { + + } + return code; + } + } + #region 寮冪敤 /// <summary> /// 鍏ュ簱瀹屾垚鍥炰紶鍒癊RP /// </summary> @@ -856,8 +1763,8 @@ // return WebResponseContent.Instance.Error(ex.Message); // } //} - - public int GetPalletType(Dt_Warehouse warehouse, string palletCode, Dt_MaterielInfo materielInfo) + #endregion + public int GetPalletType(Dt_Warehouse warehouse, string palletCode) { if (warehouse.WarehouseCode == WarehouseEnum.HA64.ToString()) { @@ -869,6 +1776,15 @@ { return PalletTypeEnum.LargestPallet.ObjToInt(); } + } + else if (warehouse.WarehouseCode == WarehouseEnum.HA153.ObjToString()) + { + Dt_PalletTypeInfo palletTypeInfo = _palletTypeInfoRepository.QueryFirst(x => x.CodeStartStr == palletCode.Substring(0, 1)); + if (palletTypeInfo == null) + { + throw new Exception($"鎵樼洏鍙烽敊璇�"); + } + return palletTypeInfo.PalletType; } else if (warehouse.WarehouseCode == WarehouseEnum.HA152.ObjToString()) { @@ -888,7 +1804,61 @@ } 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> + /// 鍒ゆ柇姝g‘鏃堕棿鏍煎紡 + /// </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; + // 瑙f瀽骞堕獙璇佹牸寮� + 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; + // 瑙f瀽骞堕獙璇佹牸寮� + bool isValid = DateTime.TryParseExact( + ProDate, + format, + CultureInfo.InvariantCulture, + DateTimeStyles.None, + out parsedDate + ); + + if (!isValid) + { + return WebResponseContent.Instance.Error("鏍煎紡鏃犳晥鎴栨棩鏈熶笉鍚堟硶"); + } + } + return WebResponseContent.Instance.OK(); + } } } -- Gitblit v1.9.3