| | |
| | | using Dm.filter; |
| | | using MailKit.Search; |
| | | using Microsoft.AspNetCore.Http; |
| | | using Microsoft.AspNetCore.Mvc; |
| | | using MailKit.Search; |
| | | using Microsoft.Extensions.Logging; |
| | | using Microsoft.IdentityModel.Tokens; |
| | | using Newtonsoft.Json.Serialization; |
| | | using Newtonsoft.Json; |
| | | using SqlSugar; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Reflection.Metadata; |
| | | using System.Text; |
| | | using System.Text.Json; |
| | | using System.Threading.Tasks; |
| | | using WIDESEA_BasicService; |
| | | using WIDESEA_Common.CommonEnum; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Common.OrderEnum; |
| | | using WIDESEA_Common.StockEnum; |
| | | using WIDESEA_Common.TaskEnum; |
| | |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_Core.Utilities; |
| | | using WIDESEA_DTO.Allocate; |
| | | using WIDESEA_DTO.Basic; |
| | | using WIDESEA_DTO.Inbound; |
| | | using WIDESEA_DTO.Outbound; |
| | | using WIDESEA_DTO.ReturnMES; |
| | | using WIDESEA_IAllocateService; |
| | | using WIDESEA_IBasicService; |
| | | using WIDESEA_ICheckService; |
| | |
| | | using WIDESEA_Model.Models.Basic; |
| | | using WIDESEA_Model.Models.Check; |
| | | using WIDESEA_Model.Models.Outbound; |
| | | using Org.BouncyCastle.Asn1.Ocsp; |
| | | using WIDESEA_BasicService.MESOperation; |
| | | using WIDESEA_Core.Util; |
| | | using WIDESEA_DTO.Allocate; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; |
| | | using WIDESEA_IRecordService; |
| | | using Microsoft.AspNetCore.Http; |
| | | using MailKit.Net.Smtp; |
| | | |
| | | namespace WIDESEA_OutboundService |
| | | { |
| | |
| | | /// </summary> |
| | | public class OutboundPickingService : ServiceBase<Dt_PickingRecord, IRepository<Dt_PickingRecord>>, IOutboundPickingService |
| | | { |
| | | #region æé 彿° |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | public IRepository<Dt_PickingRecord> Repository => BaseDal; |
| | | |
| | |
| | | private readonly ITask_HtyService _task_HtyService; |
| | | private readonly ILogger<OutboundPickingService> _logger; |
| | | private readonly IRepository<Dt_InterfaceLog> _interfaceLog; |
| | | private readonly IInboundService _inboundService; |
| | | private readonly IFeedbackMesService _feedbackMesService; |
| | | private readonly HttpClientHelper _httpClientHelper; |
| | | private readonly IRepository<Dt_MesReturnRecord> _mesReturnRecord; |
| | | private readonly IStockQuantityChangeRecordService _stockQuantityChangeRecordService; |
| | | private readonly IInboundOrderService _inboundOrderService; |
| | | |
| | | private Dictionary<string, string> stations = new Dictionary<string, string> |
| | | { |
| | |
| | | public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, |
| | | IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, |
| | | IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService, |
| | | IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog) : base(BaseDal) |
| | | IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog, IInboundService inboundService, IFeedbackMesService feedbackMesService, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord,IStockQuantityChangeRecordService stockQuantityChangeRecordService,IInboundOrderService inboundOrderService) : base(BaseDal) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _reCheckOrderService = reCheckOrderService; |
| | | _task_HtyService = task_HtyService; |
| | | _interfaceLog = interfaceLog; |
| | | _inboundService = inboundService; |
| | | _feedbackMesService = feedbackMesService; |
| | | _httpClientHelper = httpClientHelper; |
| | | _mesReturnRecord = mesReturnRecord; |
| | | _stockQuantityChangeRecordService = stockQuantityChangeRecordService; |
| | | _inboundOrderService = inboundOrderService; |
| | | |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region æ¥è¯¢æ¹æ³ |
| | | // è·åæªæ£éå表 |
| | |
| | | return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºçä»»å¡ä¿¡æ¯"); |
| | | |
| | | //åæéè¦ååºçè´§ç© |
| | | //var returnAnalysis = await AnalyzeReturnItems(orderNo, palletCode, stockInfo.Id); |
| | | //if (!returnAnalysis.HasItemsToReturn) |
| | | // return await HandleNoReturnItems(orderNo, palletCode, task); |
| | | |
| | | var statusAnalysis = await AnalyzePalletStatus(orderNo, palletCode, stockInfo.Id); |
| | | if (!statusAnalysis.HasItemsToReturn) |
| | | { |
| | |
| | | |
| | | } |
| | | |
| | | // 4. æ£æ¥æ¯å¦æè¿è¡ä¸çä»»å¡ |
| | | // æ£æ¥æ¯å¦æè¿è¡ä¸çä»»å¡ |
| | | if (statusAnalysis.HasActiveTasks) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æç {palletCode} æè¿è¡ä¸çä»»å¡ï¼ä¸è½æ§è¡ååºæä½"); |
| | |
| | | |
| | | private async Task<ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>> ValidatePickingRequest(string orderNo, string palletCode, string barcode) |
| | | { |
| | | // 1. åºç¡åæ°éªè¯ |
| | | // åºç¡åæ°éªè¯ |
| | | if (string.IsNullOrEmpty(orderNo) || string.IsNullOrEmpty(palletCode) || string.IsNullOrEmpty(barcode)) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error("订åå·ãæçç åæ¡ç ä¸è½ä¸ºç©º"); |
| | | |
| | | // 2. æ¥æ¾ææçéå®ä¿¡æ¯ |
| | | // æ¥æ¾ææçéå®ä¿¡æ¯ |
| | | var lockInfo = await FindValidLockInfo(orderNo, palletCode, barcode); |
| | | if (lockInfo == null) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"æªæ¾å°ææçéå®ä¿¡æ¯"); |
| | | |
| | | // 3. æ£æ¥è®¢åç¶æ |
| | | // æ£æ¥è®¢åç¶æ |
| | | var order = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>() |
| | | .Where(x => x.OrderNo == orderNo) |
| | | .FirstAsync(); |
| | |
| | | if (order?.OrderStatus == (int)OutOrderStatusEnum.åºåºå®æ) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"订å{orderNo}已宿ï¼ä¸è½ç»§ç»åæ£"); |
| | | |
| | | // 4. è·å订åæç» |
| | | // è·å订åæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .FirstAsync(x => x.Id == lockInfo.OrderDetailId); |
| | | |
| | | if (orderDetail == null) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"æªæ¾å°è®¢åæç»"); |
| | | |
| | | // 5. æ£æ¥è®¢åæç»æ°é |
| | | // æ£æ¥è®¢åæç»æ°é |
| | | if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"订åæç»éæ±æ°é已满足"); |
| | | |
| | | // 6. è·ååºåæç» |
| | | // è·ååºåæç» |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(x => x.Barcode == barcode && x.StockId == lockInfo.StockId && |
| | | x.Status != StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt()) |
| | |
| | | if (stockDetail == null) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"æ æçæ¡ç æç©æç¼ç "); |
| | | |
| | | // 7. æ£æ¥åºåç¶æåæ°é |
| | | // æ£æ¥åºåç¶æåæ°é |
| | | if (stockDetail.StockQuantity <= 0) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"æ¡ç {barcode}åºåä¸è¶³"); |
| | | |
| | | if (stockDetail.Status != StockStatusEmun.åºåºéå®.ObjToInt()) |
| | | return ValidationResult<(Dt_OutStockLockInfo, Dt_OutboundOrderDetail, Dt_StockInfoDetail)>.Error($"æ¡ç {barcode}ç¶æä¸æ£ç¡®ï¼æ æ³åæ£"); |
| | | |
| | | // 8. æ£æ¥æ¯å¦éå¤åæ£ |
| | | //æ£æ¥æ¯å¦éå¤åæ£ |
| | | var existingPicking = await Db.Queryable<Dt_PickingRecord>() |
| | | .Where(x => x.Barcode == barcode && x.OrderNo == orderNo && x.PalletCode == palletCode && x.OutStockLockId == lockInfo.Id) |
| | | .FirstAsync(); |
| | |
| | | private async Task HandleFullPicking(Dt_OutStockLockInfo lockInfo, Dt_StockInfoDetail stockDetail, |
| | | decimal actualQty, PickingResult result) |
| | | { |
| | | // 1. æ´æ°åºå |
| | | // æ´æ°åºå |
| | | stockDetail.StockQuantity = 0; |
| | | stockDetail.OutboundQuantity = 0; |
| | | stockDetail.Status = StockStatusEmun.åºåºå®æ.ObjToInt(); |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | // 2. æ´æ°éå®ä¿¡æ¯ |
| | | // æ´æ°éå®ä¿¡æ¯ |
| | | lockInfo.PickedQty += actualQty; |
| | | lockInfo.Status = (int)OutLockStockStatusEnum.æ£é宿; |
| | | lockInfo.Operator = App.User.UserName; |
| | |
| | | decimal stockOutQty = stockQuantity; |
| | | decimal remainingAssignQty = actualQty - stockQuantity; |
| | | |
| | | // 1. æ´æ°åºå |
| | | // æ´æ°åºå |
| | | stockDetail.StockQuantity = 0; |
| | | stockDetail.OutboundQuantity = 0; |
| | | stockDetail.Status = StockStatusEmun.åºåºå®æ.ObjToInt(); |
| | | await _stockInfoDetailService.Db.Updateable(stockDetail).ExecuteCommandAsync(); |
| | | |
| | | // 2. æ´æ°éå®ä¿¡æ¯ |
| | | // æ´æ°éå®ä¿¡æ¯ |
| | | lockInfo.PickedQty += stockOutQty; |
| | | lockInfo.AssignQuantity = remainingAssignQty; |
| | | lockInfo.Operator = App.User.UserName; |
| | | await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync(); |
| | | |
| | | // 3. æ´æ°æå
è®°å½ç¶æ |
| | | // æ´æ°æå
è®°å½ç¶æ |
| | | await UpdateSplitRecordsStatus(stockDetail.Barcode); |
| | | |
| | | result.ActualPickedQty = stockOutQty; |
| | |
| | | |
| | | return ValidationResult<(Dt_PickingRecord, Dt_OutStockLockInfo, Dt_OutboundOrderDetail)>.Success((pickingRecord, lockInfo, orderDetail)); |
| | | } |
| | | /// <summary> |
| | | /// æ£æ¥æ¡ç æ¯å¦å·²ç»ååº |
| | | /// </summary> |
| | | private async Task<bool> IsBarcodeReturned(string barcode, int stockId) |
| | | { |
| | | var stockDetail = await _stockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>() |
| | | .Where(it => it.Barcode == barcode && it.StockId == stockId) |
| | | .FirstAsync(); |
| | | |
| | | if (stockDetail == null) |
| | | return false; |
| | | |
| | | // å¦æç¶ææ¯å
¥åºç¡®è®¤æå
¥åºå®æï¼è¯´æå·²ç»ååº |
| | | return stockDetail.Status == StockStatusEmun.å
¥åºç¡®è®¤.ObjToInt() || |
| | | stockDetail.Status == StockStatusEmun.å
¥åºå®æ.ObjToInt(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ£æ¥éå®ä¿¡æ¯å¯¹åºçæ¡ç æ¯å¦å·²ç»ååº |
| | |
| | | |
| | | #region ååºæä½ç§ææ¹æ³ |
| | | |
| | | private async Task<Dt_StockInfo> GetStockInfo(string palletCode) |
| | | { |
| | | return await _stockInfoService.Db.Queryable<Dt_StockInfo>() |
| | | .FirstAsync(x => x.PalletCode == palletCode); |
| | | } |
| | | /// <summary> |
| | | /// æ£æ¥æ´ä¸ªæçæ¯å¦å·²ç»ååº |
| | | /// </summary> |
| | |
| | | |
| | | private async Task<WebResponseContent> HandleNoReturnItems(string orderNo, string palletCode, Dt_Task originalTask, int stockInfoId) |
| | | { |
| | | // æ£æ¥æ¯å¦ææè´§ç©é½å·²æ£é宿 |
| | | //var allPicked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | // .Where(it => it.OrderNo == orderNo && it.PalletCode == palletCode) |
| | | // .AnyAsync(it => it.Status == (int)OutLockStockStatusEnum.æ£é宿); |
| | | |
| | | //if (allPicked) |
| | | //{ |
| | | // // å é¤åå§åºåºä»»å¡ ç»ç©ºç 空çååº |
| | | // //await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync(); |
| | | // return WebResponseContent.Instance.OK("ææè´§ç©å·²æ£éå®æï¼æç为空"); |
| | | //} |
| | | //else |
| | | //{ |
| | | // // å é¤åå§åºåºä»»å¡ |
| | | // //await _taskRepository.Db.Deleteable(originalTask).ExecuteCommandAsync(); |
| | | // return WebResponseContent.Instance.Error("没æéè¦ååºçå©ä½è´§ç©"); |
| | | //} |
| | | try |
| | | { |
| | | var locationtype = 0; |
| | |
| | | { |
| | | _logger.LogInformation($"å¼å§éæ¾éå®ä»¥ä¾¿éæ°åé
- 订å: {orderNo}, æç: {palletCode}"); |
| | | |
| | | // 1. å¤çæªåæ£çåºåºéå®è®°å½ - å®å
¨éæ¾ |
| | | // å¤çæªåæ£çåºåºéå®è®°å½ - å®å
¨éæ¾ |
| | | if (analysis.HasRemainingLocks) |
| | | { |
| | | await ReleaseRemainingLocks(analysis.RemainingLocks); |
| | | } |
| | | |
| | | // 2. å¤çå·²ååºçéå®è®°å½ - å 餿æ è®°ä¸ºæ æ |
| | | // å¤çå·²ååºçéå®è®°å½ - å 餿æ è®°ä¸ºæ æ |
| | | await CleanupReturnedLocks(orderNo, palletCode); |
| | | |
| | | // 3. é置订åæç»çé宿°é |
| | | // é置订åæç»çé宿°é |
| | | await ResetOrderDetailLockQuantities(analysis); |
| | | |
| | | _logger.LogInformation($"éå®éæ¾å®æ - 订å: {orderNo}, æç: {palletCode}"); |
| | |
| | | |
| | | } |
| | | |
| | | private async Task UpdateOrderDetailsOnReturn(List<Dt_OutStockLockInfo> remainingLocks) |
| | | { |
| | | // æè®¢åæç»åç» |
| | | var orderDetailGroups = remainingLocks.GroupBy(x => x.OrderDetailId); |
| | | |
| | | foreach (var group in orderDetailGroups) |
| | | { |
| | | var orderDetailId = group.Key; |
| | | var totalReturnQty = group.Sum(x => x.AssignQuantity - x.PickedQty); |
| | | |
| | | // è·åå½å订åæç» |
| | | var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>() |
| | | .FirstAsync(x => x.Id == orderDetailId); |
| | | |
| | | if (orderDetail != null) |
| | | { |
| | | // è°æ´å·²æ£éæ°éåå·²åºåºæ°é |
| | | decimal newPickedQty = Math.Max(0, orderDetail.PickedQty - totalReturnQty); |
| | | decimal newOverOutQuantity = Math.Max(0, orderDetail.OverOutQuantity - totalReturnQty); |
| | | |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(it => new Dt_OutboundOrderDetail |
| | | { |
| | | PickedQty = newPickedQty, |
| | | OverOutQuantity = newOverOutQuantity, |
| | | }) |
| | | .Where(it => it.Id == orderDetailId) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | private async Task HandlePalletStockGoodsReturn(List<Dt_StockInfoDetail> palletStockGoods) |
| | | { |
| | |
| | | { |
| | | try |
| | | { |
| | | // 1. åéæµå¨ä¿¡å· |
| | | // åéæµå¨ä¿¡å· |
| | | var moveResult = await _eSSApiService.MoveContainerAsync(new WIDESEA_DTO.Basic.MoveContainerRequest |
| | | { |
| | | slotCode = movestations[targetAddress], |
| | |
| | | |
| | | //if (moveResult) |
| | | //{ |
| | | // 2. å建ååºä»»å¡ |
| | | var essTask = new TaskModel() |
| | | { |
| | | taskType = "putaway", |
| | | taskGroupCode = "", |
| | | groupPriority = 0, |
| | | tasks = new List<TasksType>{ new() { |
| | | taskCode = returnTask.TaskNum.ToString(), |
| | | taskPriority = 0, |
| | | taskDescribe = new TaskDescribeType |
| | | { |
| | | containerCode = palletCode, |
| | | containerType = "CT_KUBOT_STANDARD", |
| | | fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | toStationCode = "", |
| | | toLocationCode = returnTask.TargetAddress, |
| | | deadline = 0, |
| | | storageTag = "" |
| | | } |
| | | } } |
| | | }; |
| | | // å建ååºä»»å¡ |
| | | //var essTask = new TaskModel() |
| | | //{ |
| | | // taskType = "putaway", |
| | | // taskGroupCode = "", |
| | | // groupPriority = 0, |
| | | // tasks = new List<TasksType>{ new() { |
| | | // taskCode = returnTask.TaskNum.ToString(), |
| | | // taskPriority = 0, |
| | | // taskDescribe = new TaskDescribeType |
| | | // { |
| | | // containerCode = palletCode, |
| | | // containerType = "CT_KUBOT_STANDARD", |
| | | // fromLocationCode = stations.GetValueOrDefault(targetAddress) ?? "", |
| | | // toStationCode = "", |
| | | // toLocationCode = returnTask.TargetAddress, |
| | | // deadline = 0, |
| | | // storageTag = "" |
| | | // } |
| | | // } } |
| | | //}; |
| | | |
| | | var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | _logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | //var resultTask = await _eSSApiService.CreateTaskAsync(essTask); |
| | | //_logger.LogInformation($"ReturnRemaining åå»ºä»»å¡æå: {resultTask}"); |
| | | //} |
| | | } |
| | | catch (Exception ex) |
| | |
| | | } |
| | | } |
| | | |
| | | private async Task HandleOrderCompletion(Dt_OutboundOrder outboundOrder, string orderNo) |
| | | { |
| | | // è°æ¨åºåºå鿣åºåºä¸éè¦åé¦MES |
| | | if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt()) |
| | | { |
| | | var allocate = _allocateService.Repository.QueryData(x => x.UpperOrderNo == outboundOrder.UpperOrderNo).First(); |
| | | var allocatefeedmodel = new AllocateDto |
| | | { |
| | | ReqCode = Guid.NewGuid().ToString(), |
| | | ReqTime = DateTime.Now.ToString(), |
| | | BusinessType = "2", |
| | | |
| | | FactoryArea = outboundOrder.FactoryArea, |
| | | OperationType = 1, |
| | | Operator = App.User.UserName, |
| | | OrderNo = outboundOrder.UpperOrderNo, |
| | | // documentsNO = outboundOrder.OrderNo, |
| | | // status = outboundOrder.OrderStatus, |
| | | fromWarehouse = allocate?.FromWarehouse ?? "", |
| | | toWarehouse = allocate?.ToWarehouse ?? "", |
| | | Details = new List<AllocateDtoDetail>() |
| | | |
| | | }; |
| | | // åªè·åå·²æ£é宿çéå®è®°å½ |
| | | var lists = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && x.Status == (int)OutLockStockStatusEnum.æ£é宿) |
| | | .ToListAsync(); |
| | | |
| | | var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) |
| | | .Select(group => new AllocateDtoDetail |
| | | { |
| | | MaterialCode = group.Key.MaterielCode, |
| | | LineNo = group.Key.lineNo, |
| | | WarehouseCode = group.Key.WarehouseCode, |
| | | Qty = group.Sum(x => x.PickedQty), |
| | | |
| | | Unit = group.Key.BarcodeUnit, |
| | | Barcodes = group.Select(row => new BarcodeInfo |
| | | { |
| | | Barcode = row.CurrentBarcode, |
| | | SupplyCode = row.SupplyCode, |
| | | BatchNo = row.BatchNo, |
| | | Unit = row.BarcodeUnit, |
| | | Qty = row.PickedQty |
| | | }).ToList() |
| | | |
| | | |
| | | }).ToList(); |
| | | allocatefeedmodel.Details = groupedData; |
| | | |
| | | var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel); |
| | | if (result != null && result.code == 200) |
| | | { |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(x => x.ReturnToMESStatus == 1) |
| | | .Where(x => x.OrderId == outboundOrder.Id).ExecuteCommandAsync(); |
| | | |
| | | await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>() |
| | | .SetColumns(x => new Dt_OutboundOrder |
| | | { |
| | | ReturnToMESStatus = 1, |
| | | Operator = App.User.UserName, |
| | | }).Where(x => x.OrderNo == orderNo).ExecuteCommandAsync(); |
| | | } |
| | | } |
| | | else if (outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt()) |
| | | { |
| | | |
| | | } |
| | | else |
| | | { |
| | | try |
| | | { |
| | | var feedmodel = new FeedbackOutboundRequestModel |
| | | { |
| | | reqCode = Guid.NewGuid().ToString(), |
| | | reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), |
| | | business_type = outboundOrder.BusinessType, |
| | | factoryArea = outboundOrder.FactoryArea, |
| | | operationType = 1, |
| | | Operator = App.User.UserName, |
| | | orderNo = outboundOrder.UpperOrderNo, |
| | | documentsNO = outboundOrder.OrderNo, |
| | | status = outboundOrder.OrderStatus, |
| | | details = new List<FeedbackOutboundDetailsModel>() |
| | | }; |
| | | |
| | | // åªè·åå·²æ£é宿çéå®è®°å½ |
| | | var lists = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == orderNo && (x.Status == (int)OutLockStockStatusEnum.æ£é宿 || x.Status == (int)OutLockStockStatusEnum.å·²ååº)) |
| | | .ToListAsync(); |
| | | |
| | | var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) |
| | | .Select(group => new FeedbackOutboundDetailsModel |
| | | { |
| | | materialCode = group.Key.MaterielCode, |
| | | lineNo = group.Key.lineNo, |
| | | warehouseCode = group.Key.WarehouseCode, |
| | | qty = group.Sum(x => x.PickedQty), |
| | | currentDeliveryQty = group.Sum(x => x.PickedQty), |
| | | unit = group.Key.BarcodeUnit, |
| | | barcodes = group.Select(row => new WIDESEA_DTO.Outbound.BarcodesModel |
| | | { |
| | | barcode = row.CurrentBarcode, |
| | | supplyCode = row.SupplyCode, |
| | | batchNo = row.BatchNo, |
| | | unit = row.BarcodeUnit, |
| | | qty = row.PickedQty |
| | | }).ToList() |
| | | }).ToList(); |
| | | |
| | | feedmodel.details = groupedData; |
| | | |
| | | var result = await _invokeMESService.FeedbackOutbound(feedmodel); |
| | | if (result != null && result.code == 200) |
| | | { |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(x => x.ReturnToMESStatus == 1) |
| | | .Where(x => x.OrderId == outboundOrder.Id) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>() |
| | | .SetColumns(x => new Dt_OutboundOrder |
| | | { |
| | | ReturnToMESStatus = 1, |
| | | Operator = App.User.UserName, |
| | | }) |
| | | |
| | | .Where(x => x.OrderNo == orderNo) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | |
| | | _logger.LogError($"FeedbackOutboundæå - OrderNo: {orderNo}, {JsonSerializer.Serialize(result)}"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"FeedbackOutbound失败 - OrderNo: {orderNo}, Error: {ex.Message}"); |
| | | } |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region 空æç |
| | |
| | | { |
| | | try |
| | | { |
| | | // 1. æ¥æ¾ææä¸è¯¥è®¢ååæçç¸å
³çä»»å¡ |
| | | // æ¥æ¾ææä¸è¯¥è®¢ååæçç¸å
³çä»»å¡ |
| | | var tasks = await _taskRepository.Db.Queryable<Dt_Task>().Where(x => x.OrderNo == orderNo && x.PalletCode == palletCode).ToListAsync(); |
| | | |
| | | if (tasks.Any()) |
| | |
| | | _logger.LogInformation($"订å {orderNo} è¿æå
¶ä»æçå¨å¤çï¼ä¸æ´æ°è®¢åç¶æ"); |
| | | } |
| | | |
| | | // 3. æ´æ°æ£éè®°å½ç¶æï¼å¯éï¼ |
| | | // æ´æ°æ£éè®°å½ç¶æï¼å¯éï¼ |
| | | await UpdatePickingRecordsStatus(orderNo, palletCode); |
| | | |
| | | } |
| | |
| | | |
| | | _logger.LogInformation($"订å {orderNo} å·²æ 记为åºåºå®æ"); |
| | | |
| | | // åMESåé¦è®¢å宿ï¼å¦æéè¦ï¼ |
| | | //await HandleOrderCompletion(outboundOrder, orderNo); |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | // è¿éå¯ä»¥æ ¹æ®éè¦æ´æ°æ£éè®°å½çç¶æåæ®µ |
| | | // ä¾å¦ï¼pickingRecord.Status = (int)PickingStatusEnum.已宿; |
| | | |
| | | _logger.LogInformation($"æ¾å°{pickingRecords.Count}æ¡æ£éè®°å½ - 订å: {orderNo}, æç: {palletCode}"); |
| | | |
| | | } |
| | |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | |
| | | |
| | | #region è¾
婿¹æ³ |
| | | /// <summary> |
| | |
| | | $"æè¿è¡ä¸ä»»å¡: {result.HasActiveTasks}"); |
| | | |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ£æ¥æçæ¯å¦ä¸ºç©º |
| | | /// </summary> |
| | | private async Task<bool> IsPalletEmpty(string orderNo, string palletCode) |
| | | { |
| | | try |
| | | { |
| | | // è·ååºåä¿¡æ¯ |
| | | var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>() |
| | | .Where(x => x.PalletCode == palletCode) |
| | | .FirstAsync(); |
| | | |
| | | if (stockInfo == null) |
| | | return false; |
| | | |
| | | // 使ç¨ç»ä¸çç¶æåæ |
| | | var statusAnalysis = await AnalyzePalletStatus(orderNo, palletCode, stockInfo.Id); |
| | | return statusAnalysis.IsEmptyPallet; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogWarning($"æ£æ¥æçæ¯å¦ä¸ºç©ºå¤±è´¥ - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}"); |
| | | return false; |
| | | } |
| | | } |
| | | /// <summary> |
| | | /// æ£æ¥å¹¶å¤ç空æç |
| | | /// </summary> |
| | | private async Task<bool> CheckAndHandleEmptyPallet(string orderNo, string palletCode) |
| | | { |
| | | try |
| | | { |
| | | // 1. è·ååºåä¿¡æ¯ |
| | | var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>() |
| | | .Where(x => x.PalletCode == palletCode) |
| | | .FirstAsync(); |
| | | |
| | | if (stockInfo == null) |
| | | { |
| | | _logger.LogWarning($"æªæ¾å°æç {palletCode} çåºåä¿¡æ¯"); |
| | | return false; |
| | | } |
| | | |
| | | // 2. 使ç¨ç»ä¸çç¶æåæ |
| | | var statusAnalysis = await AnalyzePalletStatus(orderNo, palletCode, stockInfo.Id); |
| | | |
| | | // 3. æ£æ¥æ¯å¦ä¸ºç©ºæç䏿²¡æè¿è¡ä¸çä»»å¡ |
| | | if (!statusAnalysis.IsEmptyPallet || statusAnalysis.HasActiveTasks) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | _logger.LogInformation($"æ£æµå°ç©ºæçï¼å¼å§èªå¨å¤ç - 订å: {orderNo}, æç: {palletCode}"); |
| | | |
| | | //// æ¸
çé¶åºåæ°æ® |
| | | //await CleanupZeroStockData(stockInfo.Id); |
| | | |
| | | //// æ´æ°åºåä¸»è¡¨ç¶æä¸ºç©ºæç |
| | | //await UpdateStockInfoAsEmpty(stockInfo); |
| | | |
| | | //// å¤çåºåºéå®è®°å½ |
| | | //await HandleOutStockLockRecords(orderNo, palletCode); |
| | | |
| | | //// å¤çä»»å¡ç¶æ |
| | | //await HandleTaskStatusForEmptyPallet(orderNo, palletCode); |
| | | |
| | | //// æ´æ°è®¢åæ°æ® |
| | | //await UpdateOrderDataForEmptyPallet(orderNo, palletCode); |
| | | |
| | | ////è®°å½æä½åå² |
| | | //await RecordAutoEmptyPalletOperation(orderNo, palletCode); |
| | | |
| | | _logger.LogInformation($"空æçèªå¨å¤ç宿 - 订å: {orderNo}, æç: {palletCode}"); |
| | | |
| | | return true; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _logger.LogError($"èªå¨å¤ç空æç失败 - OrderNo: {orderNo}, PalletCode: {palletCode}, Error: {ex.Message}"); |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | private async Task<string> GenerateNewBarcode() |
| | |
| | | } |
| | | } |
| | | |
| | | private async Task<int> GenerateTaskNumber() |
| | | { |
| | | return await _dailySequenceService.GetNextSequenceAsync(); |
| | | } |
| | | |
| | | private WebResponseContent CreatePickingResponse(PickingResult result, string adjustedReason) |
| | | { |
| | | //if (result.SplitResults.Any()) |
| | |
| | | } |
| | | return WebResponseContent.Instance.OK("æ£é确认æå", new { SplitResults = new List<SplitResult>() }); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | |
| | | #region èæåºå
¥åº |
| | |
| | | return WebResponseContent.Instance.OK("æå", data: InOderCodes); |
| | | } |
| | | |
| | | public WebResponseContent GetAvailablePickingOrders() |
| | | public WebResponseContent GetAvailablePickingOrders(string outOrder) |
| | | { |
| | | List<Dt_OutboundOrder> outOders = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).ToList(); |
| | | |
| | | List<string> outOderCodes = outOders.Select(x => x.UpperOrderNo).ToList(); |
| | | return WebResponseContent.Instance.OK("æå", data: outOderCodes); |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == outOrder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x=>x.Details).First(); |
| | | if(outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("æªæ¾å°æ»¡è¶³åºåºæ¡ä»¶çåºåºå"); |
| | | } |
| | | if(outboundOrder.IsBatch == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error("è¯¥åæ®ä¸å±äºåæ¹åä¼ åæ®ï¼ä¸å
许èæåºå
¥åº"); |
| | | } |
| | | //å
æ¸
ç©ºåæ®èæåºå
¥åºæ°éè¿è¡è®¡ç® |
| | | foreach (var item in outboundOrder.Details) |
| | | { |
| | | item.NoStockOutQty = 0; |
| | | item.documentsNO = ""; |
| | | } |
| | | _outboundOrderDetailService.UpdateData(outboundOrder.Details); |
| | | return WebResponseContent.Instance.OK("æå"); |
| | | |
| | | } |
| | | public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut) |
| | | |
| | | public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut) |
| | | { |
| | | try |
| | | { |
| | | try |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.outOder}"); |
| | | } |
| | | |
| | | var detailLists = new List<Dt_InboundOrderDetail>(); |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.Barcode == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.ReceiptQuantity == 0); |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.OutBoxbarcodes == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && detail.ReceiptQuantity == 0); |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çå¯åºåºæç»ã"); |
| | | } |
| | | matchedDetail.NoStockOutQty = 0; |
| | | else |
| | | { |
| | | // æ·»å ææå¹é
å¤ç®±ç ä¸éå®æç¶æçæç» |
| | | foreach (var detail in inboundOrder.Details) |
| | | { |
| | | if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | !string.IsNullOrEmpty(detail.Barcode) && |
| | | detail.OutBoxbarcodes == noStockOut.barCode && detail.OrderQuantity > detail.NoStockOutQty) |
| | | { |
| | | detailLists.Add(detail); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | if (!string.IsNullOrEmpty(noStockOut.barCode)) |
| | | { |
| | | detailLists.Add(matchedDetail); |
| | | } |
| | | } |
| | | if (!detailLists.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error("该æ¡ç å·²ç»æ²¡æå¯åºåºæ°é"); |
| | | } |
| | | var outDetails = new List<Dt_OutboundOrderDetail>(); |
| | | // éåæ¯ä¸ªå
¥åºæç» |
| | | foreach (var item in detailLists) |
| | | { |
| | | // éç½®å½åå
¥åºæç»çæ åºååºåºæ°é |
| | | item.NoStockOutQty = 0; |
| | | |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.inOder}"); |
| | | } |
| | | var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == matchedDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | // å½åæ¡ç éè¦åºåºçæ»æ°éï¼å
¥åºåå©ä½å¯åºæ°éï¼ |
| | | decimal remainingBarcodeQty = item.OrderQuantity - item.ReceiptQuantity; |
| | | if (remainingBarcodeQty <= 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç {item.Barcode}对åºçå¯åºæ°é为0"); |
| | | } |
| | | |
| | | if (matchedCode == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{matchedDetail.MaterielCode} 对åºçç©æã"); |
| | | } |
| | | matchedCode.NoStockOutQty = 0; |
| | | // çéåºåºåä¸ç¬¦åæ¡ä»¶çæç»ï¼åç©æãé宿ãæå©ä½å¯åºæ°éï¼ |
| | | var eligibleOutDetails = outboundOrder.Details.Where(detail => |
| | | detail.MaterielCode == item.MaterielCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | (detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty) > 0).ToList(); |
| | | |
| | | //å©ä½å
¥åºæ°éå³èæåºå
¥åºå©ä½å¯åºæ°é |
| | | decimal outQuantity = matchedDetail.OrderQuantity - matchedDetail.ReceiptQuantity; |
| | | if (outQuantity == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç 对åºçå¯åºæ°é为0"); |
| | | } |
| | | if (matchedCode.OrderQuantity < outQuantity) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç 对åºçå¯åºæ°éè¶
åºåºåºååºåºæ°é{matchedDetail.OrderQuantity - matchedCode.OrderQuantity},䏿»¡è¶³æ´å
åºåº"); |
| | | } |
| | | //åæ®åºåºé宿°é |
| | | matchedDetail.NoStockOutQty += outQuantity; |
| | | matchedCode.NoStockOutQty += outQuantity; |
| | | if (!eligibleOutDetails.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºå䏿ªæ¾å°ç©æ{item.MaterielCode}çå¯åºåºæç»"); |
| | | } |
| | | |
| | | if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty) > matchedCode.OrderQuantity) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»æ°é溢åº{matchedCode.LockQuantity - matchedCode.OrderQuantity}"); |
| | | // éåç¬¦åæ¡ä»¶çåºåºæç»ï¼éè¡åé
æ°é |
| | | foreach (var outDetail in eligibleOutDetails) |
| | | { |
| | | // 计ç®å½ååºåºè¡çå©ä½å¯åºæ°é |
| | | decimal rowRemainingQty = outDetail.OrderQuantity - outDetail.LockQuantity - outDetail.MoveQty - outDetail.NoStockOutQty; |
| | | if (rowRemainingQty <= 0) continue; |
| | | |
| | | if (!outDetail.BatchNo.IsNullOrEmpty()) |
| | | { |
| | | if (outDetail.BatchNo != item.BatchNo) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåè¡æ¹æ¬¡{outDetail.BatchNo}ä¸éè´åæ¹æ¬¡{item.BatchNo}ä¸å¹é
"); |
| | | } |
| | | } |
| | | if (!outDetail.SupplyCode.IsNullOrEmpty()) |
| | | { |
| | | if (outDetail.SupplyCode != item.SupplyCode) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåè¡ä¾åºå{outDetail.SupplyCode}ä¸éè´åä¾åºå{item.SupplyCode}ä¸å¹é
"); |
| | | } |
| | | } |
| | | if (!string.IsNullOrEmpty(outboundOrder.FactoryArea) && !string.IsNullOrEmpty(inboundOrder.FactoryArea)) |
| | | { |
| | | if (inboundOrder.FactoryArea != outboundOrder.FactoryArea) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该æ¡ç {item.Barcode}对åºçåæ®ååºä¸åºåºåæ®ä¸ä¸è´ï¼ä¸å
许åºåºã"); |
| | | } |
| | | } |
| | | if (inboundOrder.BusinessType != "11" && !outDetail.WarehouseCode.IsNullOrEmpty()) |
| | | { |
| | | if (outDetail.WarehouseCode != item.WarehouseCode) |
| | | { |
| | | return WebResponseContent.Instance.Error($"ä»åºä¸ä¸è´ï¼åºåºåè¡ä»åº{outDetail.WarehouseCode}ä¸éè´åä»åº{item.WarehouseCode}ä¸å¹é
"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | item.WarehouseCode = outDetail.WarehouseCode; |
| | | } |
| | | |
| | | // è®¡ç®æ¬æ¬¡åé
çæ°éï¼åå©ä½æ¡ç æ°éåå½åè¡å©ä½æ°éçè¾å°å¼ï¼ |
| | | decimal assignQty = Math.Min(remainingBarcodeQty, rowRemainingQty); |
| | | |
| | | // æ´æ°å
¥åºæç»ååºåºæç»çæ åºååºåºæ°é |
| | | item.NoStockOutQty += assignQty; |
| | | outDetail.NoStockOutQty += assignQty; |
| | | |
| | | // æ´æ°å©ä½éè¦åé
çæ¡ç æ°é |
| | | remainingBarcodeQty -= assignQty; |
| | | |
| | | // è®°å½å·²æ´æ°çåºåºæç»ï¼å»éï¼ |
| | | if (!outDetails.Contains(outDetail)) |
| | | { |
| | | outDetails.Add(outDetail); |
| | | } |
| | | |
| | | // éªè¯å½åè¡æ¯å¦æº¢åº |
| | | if ((outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) > outDetail.OrderQuantity) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»{outDetail.Id}æ°é溢åºï¼è¶
åºæ°éï¼{(outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) - outDetail.OrderQuantity}"); |
| | | } |
| | | |
| | | // å¤çMESåæ°åä¼ ï¼è®°å½å½åæ¡ç åé
å°è¯¥è¡çå®é
æ°é |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | Barcodes barcodes = new Barcodes |
| | | { |
| | | Barcode = item.Barcode, |
| | | Qty = assignQty, |
| | | SupplyCode = item?.SupplyCode ?? "", |
| | | BatchNo = item?.BatchNo ?? "", |
| | | Unit = item?.Unit ?? "" |
| | | }; |
| | | // ååºåå该è¡å·²æçæ¡ç è®°å½ |
| | | if (!string.IsNullOrEmpty(outDetail.documentsNO)) |
| | | { |
| | | try |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(outDetail.documentsNO) ?? new List<Barcodes>(); |
| | | } |
| | | catch (JsonException ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»{outDetail.Id}çdocumentsNOåæ®µæ ¼å¼é误ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | // æ·»å æ¬æ¬¡åé
çè®°å½ |
| | | barcodesList.Add(barcodes); |
| | | // åºåååå |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | outDetail.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); |
| | | |
| | | // æ¡ç æ°éåé
宿¯ï¼éåºå½åè¡å¾ªç¯ |
| | | if (remainingBarcodeQty <= 0) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // ææç¬¦åæ¡ä»¶çåºåºè¡éåå®åï¼æ¡ç æ°é仿å©ä½ |
| | | if (remainingBarcodeQty > 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æ¡ç {item.Barcode}éåºåºæ°é{item.OrderQuantity - item.ReceiptQuantity}ï¼ä½åºåºåä¸ç©æ{item.MaterielCode}å©ä½å¯åºæ»éä¸è¶³ï¼ä»å©ä½{remainingBarcodeQty}æ°éæªåé
"); |
| | | } |
| | | } |
| | | matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt(); |
| | | matchedCode.OrderDetailStatus = OrderDetailStatusEnum.AssignOver.ObjToInt(); |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(matchedDetail); |
| | | _outboundOrderDetailService.UpdateData(matchedCode); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | _inboundOrderDetailService.UpdateData(detailLists); |
| | | _outboundOrderDetailService.UpdateData(outDetails); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("æå", data: detailLists); |
| | | } |
| | | |
| | | |
| | | public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut) |
| | | catch (Exception ex) |
| | | { |
| | | try |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut) |
| | | { |
| | | try |
| | | { |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); |
| | | } |
| | | matchedDetail.NoStockOutQty = 0; |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.Barcode == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | |
| | | if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0) |
| | | if (matchedDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); |
| | | } |
| | | |
| | | // éç½®å
¥åºæç»çæ åºååºåºæ°é |
| | | decimal revokedTotalQty = matchedDetail.NoStockOutQty; // è®°å½éè¦æ¤éçæ»æ°éï¼å
¥åºåä¸å·²åé
çæ°éï¼ |
| | | matchedDetail.NoStockOutQty = 0; |
| | | if(inboundOrder.BusinessType == "11") |
| | | { |
| | | matchedDetail.WarehouseCode =""; |
| | | } |
| | | |
| | | // éç½®å
¥åºæç»ç¶æ |
| | | if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0) |
| | | { |
| | | matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); |
| | | } |
| | | |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.outOder}"); |
| | | } |
| | | |
| | | // æ¾å°ææå
³è该æ¡ç çåºåºæç»è¡ |
| | | // åç©æãéå®æç¶æãdocumentsNOå
å«è¯¥æ¡ç |
| | | var matchedCodeList = outboundOrder.Details.Where(detail => |
| | | detail.MaterielCode == matchedDetail.MaterielCode && // ç¡®ä¿ç©æå¹é
|
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | !string.IsNullOrEmpty(detail.documentsNO) && |
| | | detail.documentsNO.Contains(noStockOut.barCode) // å
å«å½åæ¡ç |
| | | ).ToList(); |
| | | |
| | | if (!matchedCodeList.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºå䏿ªæ¾å°å
³èæ¡ç {noStockOut.barCode}çç©æ{matchedDetail.MaterielCode}æç»ã"); |
| | | } |
| | | |
| | | //éè¡å¤çåºåºæç»çæ¤éé»è¾ |
| | | decimal remainingRevokeQty = revokedTotalQty; // å©ä½éè¦æ¤éçæ°é |
| | | foreach (var matchedCode in matchedCodeList) |
| | | { |
| | | if (remainingRevokeQty <= 0) break; // æææ°éå·²æ¤éï¼éåºå¾ªç¯ |
| | | |
| | | // å¤çMESåæ°æ¤é |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | if (!string.IsNullOrEmpty(matchedCode.documentsNO)) |
| | | { |
| | | matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); |
| | | try |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); |
| | | } |
| | | catch (JsonException ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»{matchedCode.Id}çdocumentsNOåæ®µæ ¼å¼é误ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.inOder}"); |
| | | } |
| | | var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == matchedDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | // çéåºå½åæ¡ç çææè®°å½ |
| | | var barcodeRecords = barcodesList.Where(b => |
| | | string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)).ToList(); |
| | | if (!barcodeRecords.Any()) continue; |
| | | |
| | | if (matchedCode == null) |
| | | // 计ç®è¯¥è¡éè¦æ¤éçæ°éï¼ç´¯å 该æ¡ç å¨è¯¥è¡çææåé
æ°éï¼ |
| | | decimal rowRevokeQty = barcodeRecords.Sum(b => b.Qty); |
| | | // å®é
æ¤éæ°éï¼å该è¡å¯æ¤éæ°éåå©ä½éè¦æ¤éæ°éçè¾å°å¼ |
| | | decimal actualRevokeQty = Math.Min(rowRevokeQty, remainingRevokeQty); |
| | | |
| | | // ç§»é¤è¯¥è¡ä¸è¯¥æ¡ç çè®°å½ï¼æé¨åè®°å½ï¼è¥å©ä½æ¤éæ°éä¸è¶³ï¼ |
| | | if (actualRevokeQty < rowRevokeQty) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{matchedDetail.MaterielCode} 对åºçç©æã"); |
| | | // å©ä½æ¤éæ°éä¸è¶³ï¼åªç§»é¤é¨åè®°å½ï¼ææ°éæ£åï¼ |
| | | decimal tempQty = actualRevokeQty; |
| | | var removeList = new List<Barcodes>(); |
| | | foreach (var record in barcodeRecords) |
| | | { |
| | | if (tempQty <= 0) break; |
| | | if (record.Qty <= tempQty) |
| | | { |
| | | removeList.Add(record); |
| | | tempQty -= record.Qty; |
| | | } |
| | | else |
| | | { |
| | | // è®°å½æ°éæåï¼æ£åé¨åæ°é |
| | | record.Qty -= tempQty; |
| | | tempQty = 0; |
| | | } |
| | | } |
| | | barcodesList.RemoveAll(b => removeList.Contains(b)); |
| | | } |
| | | matchedCode.NoStockOutQty = 0; |
| | | else |
| | | { |
| | | // ç§»é¤è¯¥è¡ä¸è¯¥æ¡ç çææè®°å½ |
| | | barcodesList.RemoveAll(b => |
| | | string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)); |
| | | } |
| | | |
| | | //éæ°åºååMESåæ° |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); |
| | | |
| | | //æ£ååºåºæç»çæ åºååºåºæ°é |
| | | matchedCode.NoStockOutQty = Math.Max(0, matchedCode.NoStockOutQty - actualRevokeQty); |
| | | remainingRevokeQty -= actualRevokeQty; |
| | | |
| | | //éç½®åºåºæç»ç¶æ |
| | | if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0) |
| | | { |
| | | matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); |
| | | } |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(matchedDetail); |
| | | _outboundOrderDetailService.UpdateData(matchedCode); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | |
| | | //è¥ä»ææªæ¤éçæ°éï¼è¯´ææ°æ®ä¸ä¸è´ |
| | | if (remainingRevokeQty > 0) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | return WebResponseContent.Instance.Error($"æ¤éæ¡ç {noStockOut.barCode}æ¶ï¼åºåºåä¸å¯æ¤éæ°éä¸è¶³ï¼ä»æ{remainingRevokeQty}æ°éæªæ¤é"); |
| | | } |
| | | } |
| | | |
| | | public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit) |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(matchedDetail); |
| | | _outboundOrderDetailService.UpdateData(matchedCodeList); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("æ¡ç æ¤éæå", data: new { RevokedQty = revokedTotalQty }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit) |
| | | { |
| | | try |
| | | { |
| | | Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.InOderSubmit && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOutSubmit.InOderSubmit}"); |
| | | } |
| | | Dt_OutboundOrder outboundOrder = _inboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOutSubmit.OutOderSubmit && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOutSubmit.OutOderSubmit}"); |
| | | } |
| | | List<Dt_InboundOrderDetail> inboundOrderDetails = new List<Dt_InboundOrderDetail>(); |
| | | |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>(); |
| | | foreach (var BarCode in noStockOutSubmit.BarCodeSubmit) |
| | | |
| | | Dictionary<int, List<string>> orderIdBarCodeDict = new Dictionary<int, List<string>>(); |
| | | |
| | | List<Dt_InboundOrderDetail> updateInboundDetails = new List<Dt_InboundOrderDetail>(); |
| | | |
| | | Dictionary<int, Dt_InboundOrder> updateInboundOrders = new Dictionary<int, Dt_InboundOrder>(); |
| | | |
| | | List<Dt_StockQuantityChangeRecord> changeRecords = new List<Dt_StockQuantityChangeRecord>(); |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | List<Dt_InboundOrderDetail> allInboundDetails = _inboundOrderDetailService.Db |
| | | .Queryable<Dt_InboundOrderDetail>() |
| | | .Where(detail => noStockOutSubmit.BarCodeSubmit.Contains(detail.Barcode) |
| | | && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) |
| | | .ToList(); |
| | | |
| | | var detailGroupByOrderId = allInboundDetails.GroupBy(d => d.OrderId).ToList(); |
| | | foreach (var group in detailGroupByOrderId) |
| | | { |
| | | var inboundOrderDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == BarCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | int orderId = group.Key; |
| | | List<Dt_InboundOrderDetail> groupDetails = group.ToList(); |
| | | List<string> groupBarCodes = groupDetails.Select(d => d.Barcode).ToList(); |
| | | |
| | | if (inboundOrderDetail == null) |
| | | orderIdBarCodeDict[orderId] = groupBarCodes; |
| | | |
| | | Dt_InboundOrder currentInboundOrder = null; |
| | | if (!updateInboundOrders.TryGetValue(orderId, out currentInboundOrder)) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOutSubmit.InOderSubmit} 䏿ªæ¾å°æ¡ç 为 {BarCode} çæç»ã"); |
| | | currentInboundOrder = _inboundOrderRepository.Db |
| | | .Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.Id == orderId) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | |
| | | if (currentInboundOrder == null) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°å
¥åºåID为 {orderId} çåæ®"); |
| | | } |
| | | updateInboundOrders[orderId] = currentInboundOrder; |
| | | } |
| | | var outboundOrderDetail = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == inboundOrderDetail.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | |
| | | if (outboundOrderDetail == null) |
| | | foreach (var detail in groupDetails) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{inboundOrderDetail.MaterielCode} 对åºçç©æã"); |
| | | detail.ReceiptQuantity = detail.NoStockOutQty; |
| | | detail.OverInQuantity = detail.NoStockOutQty; |
| | | |
| | | if (detail.OrderQuantity == detail.OverInQuantity) |
| | | { |
| | | detail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); |
| | | } |
| | | updateInboundDetails.Add(detail); |
| | | |
| | | //æ·»å åºååå¨è®°å½ |
| | | Dt_StockQuantityChangeRecord changeRecord = new Dt_StockQuantityChangeRecord |
| | | { |
| | | StockDetailId = detail.Id, |
| | | PalleCode = DateTime.Now.ToString(), |
| | | MaterielCode = detail.MaterielCode, |
| | | MaterielName = detail.MaterielName ?? "", |
| | | BatchNo = detail.BatchNo ?? "", |
| | | OriginalSerilNumber = detail.Barcode, |
| | | NewSerilNumber = "", |
| | | OrderNo = currentInboundOrder.InboundOrderNo, |
| | | TaskNum = 0, |
| | | ChangeType = (int)StockChangeTypeEnum.Inbound, |
| | | ChangeQuantity = detail.NoStockOutQty, |
| | | BeforeQuantity = detail.OverInQuantity - detail.NoStockOutQty, |
| | | AfterQuantity = detail.OverInQuantity, |
| | | SupplyCode = detail.SupplyCode ?? "", |
| | | WarehouseCode = detail.WarehouseCode ?? "", |
| | | Remark = $"èæå
¥åº" |
| | | }; |
| | | changeRecords.Add(changeRecord); |
| | | } |
| | | inboundOrderDetail.ReceiptQuantity += inboundOrderDetail.NoStockOutQty; |
| | | inboundOrderDetail.OverInQuantity = inboundOrderDetail.ReceiptQuantity; |
| | | inboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); |
| | | inboundOrderDetails.Add(inboundOrderDetail); |
| | | |
| | | outboundOrderDetail.LockQuantity += outboundOrderDetail.NoStockOutQty; |
| | | outboundOrderDetail.OverOutQuantity = outboundOrderDetail.LockQuantity; |
| | | if (outboundOrderDetail.OrderQuantity == outboundOrderDetail.OverOutQuantity) |
| | | var inboundOrder = updateInboundOrders[orderId]; |
| | | int totalDetailCount = inboundOrder.Details.Count; |
| | | |
| | | int finishedDetailCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) |
| | | + groupDetails.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); |
| | | |
| | | inboundOrder.OrderStatus = totalDetailCount == finishedDetailCount |
| | | ? InOrderStatusEnum.å
¥åºå®æ.ObjToInt() |
| | | : InOrderStatusEnum.å
¥åºä¸.ObjToInt(); |
| | | } |
| | | |
| | | if (updateInboundDetails.Any()) |
| | | { |
| | | _inboundOrderDetailService.Db.Updateable(updateInboundDetails).ExecuteCommand(); |
| | | } |
| | | if (updateInboundOrders.Any()) |
| | | { |
| | | // æ¹éæ´æ°å
¥åºä¸»å |
| | | _inboundOrderService.Db.Updateable(updateInboundOrders.Values.ToList()).ExecuteCommand(); |
| | | } |
| | | |
| | | // 7. 循ç¯åç»ç»æï¼è°ç¨MESåä¼ æ¹æ³ï¼æå
¥åºååç»åä¼ ï¼ |
| | | foreach (var kvp in orderIdBarCodeDict) |
| | | { |
| | | int orderId = kvp.Key; |
| | | List<string> barCodeList = kvp.Value; |
| | | //å
¥åºåä¼ MES |
| | | NoStockOutBatchInOrderFeedbackToMes(orderId, barCodeList); |
| | | } |
| | | |
| | | //åªå¯¹åºåºæ¡ç çåºåºåæç»è¿è¡è®¡ç®åä¼ |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetail = outboundOrder.Details |
| | | .Where(x => !string.IsNullOrWhiteSpace(x.documentsNO) |
| | | && noStockOutSubmit.BarCodeSubmit.Any(barcode => |
| | | x.documentsNO.IndexOf(barcode, StringComparison.OrdinalIgnoreCase) >= 0)) |
| | | .ToList(); |
| | | |
| | | foreach (var item in outboundOrderDetail) |
| | | { |
| | | item.LockQuantity += item.NoStockOutQty; |
| | | item.OverOutQuantity += item.NoStockOutQty; |
| | | item.CurrentDeliveryQty += item.NoStockOutQty; |
| | | //æ·»å åä¼ MESåæ° |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | List<Barcodes> documentsNOList = new List<Barcodes>(); |
| | | if (!string.IsNullOrEmpty(item.ReturnJsonData)) |
| | | { |
| | | outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.ReturnJsonData) ?? new List<Barcodes>(); |
| | | } |
| | | outboundOrderDetails.Add(outboundOrderDetail); |
| | | |
| | | var newLockInfo = new Dt_OutStockLockInfo |
| | | if (!string.IsNullOrEmpty(item.documentsNO) && item.documentsNO!="") |
| | | { |
| | | OrderNo = outboundOrder.UpperOrderNo, |
| | | OrderDetailId = outboundOrderDetail.Id, |
| | | OutboundBatchNo = outboundOrderDetail.BatchNo, |
| | | MaterielCode = outboundOrderDetail.MaterielCode, |
| | | MaterielName = outboundOrderDetail.MaterielName, |
| | | StockId = 0, |
| | | OrderQuantity = outboundOrderDetail.OrderQuantity, |
| | | AssignQuantity = outboundOrderDetail.OverOutQuantity, |
| | | PickedQty = outboundOrderDetail.NoStockOutQty, |
| | | LocationCode = "空", |
| | | PalletCode = "空", |
| | | TaskNum = 0, |
| | | Status = (int)OutLockStockStatusEnum.æ£é宿, |
| | | Unit = outboundOrderDetail.Unit, |
| | | SupplyCode = outboundOrderDetail.SupplyCode ?? "æ ", |
| | | OrderType = outboundOrder.OrderType, |
| | | CurrentBarcode = inboundOrderDetail.Barcode, |
| | | IsSplitted = 1, |
| | | Operator = App.User.UserName, |
| | | lineNo = outboundOrderDetail.lineNo, |
| | | WarehouseCode = outboundOrderDetail.WarehouseCode ?? "æ ", |
| | | BarcodeQty = outboundOrderDetail.NoStockOutQty, |
| | | BarcodeUnit = outboundOrderDetail.BarcodeUnit, |
| | | BatchNo = outboundOrderDetail.BatchNo |
| | | documentsNOList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>(); |
| | | } |
| | | foreach (var documentsNO in documentsNOList) |
| | | { |
| | | barcodesList.Add(documentsNO); |
| | | } |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | _outStockLockInfoService.AddData(newLockInfo); |
| | | item.ReturnJsonData = JsonConvert.SerializeObject(barcodesList, settings); |
| | | //æ·»å åºååå¨è®°å½ |
| | | Dt_StockQuantityChangeRecord changeRecord = new Dt_StockQuantityChangeRecord |
| | | { |
| | | StockDetailId = item.Id, |
| | | PalleCode = DateTime.Now.ToString(), |
| | | MaterielCode = item.MaterielCode, |
| | | MaterielName = item.MaterielName ?? "", |
| | | BatchNo = item.BatchNo ?? "", |
| | | OriginalSerilNumber = item.ReturnJsonData, |
| | | NewSerilNumber = "", |
| | | OrderNo = outboundOrder.OrderNo, |
| | | TaskNum = 0, |
| | | ChangeType = (int)StockChangeTypeEnum.Inbound, |
| | | ChangeQuantity = -item.NoStockOutQty, |
| | | BeforeQuantity = item.OrderQuantity, |
| | | AfterQuantity = item.OrderQuantity - item.OverOutQuantity, |
| | | SupplyCode = item.SupplyCode ?? "", |
| | | WarehouseCode = item.WarehouseCode ?? "", |
| | | Remark = $"èæåºåº" |
| | | }; |
| | | changeRecords.Add(changeRecord); |
| | | outboundOrderDetails.Add(item); |
| | | } |
| | | //夿å
¥åºåæ®æç»æ¯å¦å
¨é¨æ¯å®æç¶æ |
| | | int e = inboundOrder.Details.Count(); |
| | | int w = inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); |
| | | bool inoderOver = inboundOrder.Details.Count() == inboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); |
| | | if (inoderOver) |
| | | |
| | | _outboundOrderDetailService.UpdateData(outboundOrderDetails); |
| | | //æ¹éæ·»å åºååå¨è®°å½ |
| | | if (changeRecords.Any()) |
| | | { |
| | | inboundOrder.OrderStatus = InOrderStatusEnum.å
¥åºå®æ.ObjToInt(); |
| | | _stockQuantityChangeRecordService.Db.Insertable(changeRecords).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | inboundOrder.OrderStatus = InOrderStatusEnum.å
¥åºä¸.ObjToInt(); |
| | | } |
| | | //夿åºåºåæ®æç»æ¯å¦å
¨é¨æ¯å®æç¶æ |
| | | bool outOderOver = outboundOrder.Details.Count() == outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).Count(); |
| | | if (outOderOver) |
| | | // æ£æ¥åºåºåæ¯å¦å®æ |
| | | if (CheckOutboundOrderCompleted(outboundOrder.OrderNo)) |
| | | { |
| | | outboundOrder.OrderStatus = OutOrderStatusEnum.åºåºå®æ.ObjToInt(); |
| | | |
| | | } |
| | | else |
| | | { |
| | | outboundOrder.OrderStatus = OutOrderStatusEnum.åºåºä¸.ObjToInt(); |
| | | } |
| | | //æ°æ®å¤ç |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(inboundOrderDetails); |
| | | _outboundOrderDetailService.UpdateData(outboundOrderDetails); |
| | | _inboundOrderRepository.UpdateData(inboundOrder); |
| | | _outboundOrderService.UpdateData(outboundOrder); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | //å
¥åºåä¼ MES |
| | | var infeedmodel = new FeedbackInboundRequestModel |
| | | { |
| | | reqCode = Guid.NewGuid().ToString(), |
| | | reqTime = DateTime.Now.ToString(), |
| | | business_type = inboundOrder.BusinessType, |
| | | factoryArea = inboundOrder.FactoryArea, |
| | | operationType = 1, |
| | | Operator = App.User.UserName, |
| | | orderNo = inboundOrder.UpperOrderNo, |
| | | status = inboundOrder.OrderStatus, |
| | | details = new List<FeedbackInboundDetailsModel>() |
| | | |
| | | }; |
| | | |
| | | var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) |
| | | .Select(group => new FeedbackInboundDetailsModel |
| | | { |
| | | materialCode = group.Key.MaterielCode, |
| | | supplyCode = group.Key.SupplyCode, |
| | | batchNo = group.Key.BatchNo, |
| | | lineNo = group.Key.lineNo, |
| | | warehouseCode = group.Key.WarehouseCode, |
| | | qty = group.Sum(x => x.BarcodeQty), |
| | | // warehouseCode= "1072", |
| | | unit = group.Key.BarcodeUnit, |
| | | barcodes = group.Select(row => new FeedbackBarcodesModel |
| | | { |
| | | barcode = row.Barcode, |
| | | qty = row.BarcodeQty |
| | | }).ToList() |
| | | }).ToList(); |
| | | infeedmodel.details = groupedData; |
| | | |
| | | var result1 = await _invokeMESService.FeedbackInbound(infeedmodel); |
| | | if (result1 != null && result1.code == 200) |
| | | { |
| | | var orderIds = inboundOrderDetails.Select(x => x.Id).Distinct().ToList(); |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 }) |
| | | .Where(it => orderIds.Contains(it.Id)).ExecuteCommand(); |
| | | } |
| | | //åºåºåä¼ MES |
| | | _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo); |
| | | |
| | | var documentNo = UniqueValueGenerator.Generate(); |
| | | |
| | | var outfeedmodel = new FeedbackOutboundRequestModel |
| | | { |
| | | reqCode = Guid.NewGuid().ToString(), |
| | | reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), |
| | | business_type = outboundOrder.BusinessType, |
| | | factoryArea = outboundOrder.FactoryArea, |
| | | operationType = 1, |
| | | Operator = App.User.UserName, |
| | | orderNo = outboundOrder.UpperOrderNo, |
| | | documentsNO = documentNo, |
| | | status = outboundOrder.OrderStatus, |
| | | details = new List<FeedbackOutboundDetailsModel>() |
| | | }; |
| | | foreach (var detail in outboundOrderDetails) |
| | | { |
| | | // è·å该æç»å¯¹åºçæ¡ç ä¿¡æ¯ï¼ä»éå®è®°å½ï¼ |
| | | var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>() |
| | | .Where(x => x.OrderNo == outboundOrder.UpperOrderNo && |
| | | x.OrderDetailId == detail.Id && |
| | | (x.Status == (int)OutLockStockStatusEnum.æ£é宿 || x.Status == (int)OutLockStockStatusEnum.å·²ååº)) |
| | | .ToListAsync(); |
| | | |
| | | var groupdata = detailLocks.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) |
| | | .Select(group => new FeedbackOutboundDetailsModel |
| | | { |
| | | |
| | | materialCode = group.Key.MaterielCode, |
| | | lineNo = group.Key.lineNo, |
| | | warehouseCode = group.Key.WarehouseCode, |
| | | qty = group.Sum(x => x.PickedQty), |
| | | currentDeliveryQty = group.Sum(x => x.PickedQty), |
| | | unit = group.Key.BarcodeUnit, |
| | | barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel |
| | | { |
| | | barcode = lockInfo.CurrentBarcode, |
| | | supplyCode = lockInfo.SupplyCode, |
| | | batchNo = lockInfo.BatchNo, |
| | | unit = lockInfo.BarcodeUnit, |
| | | qty = lockInfo.PickedQty |
| | | }).ToList() |
| | | }).ToList(); |
| | | outfeedmodel.details.AddRange(groupdata); |
| | | } |
| | | //åå¨åä¼ åæ°ï¼ä¿è¯å¼å¸¸æå¨åä¼ |
| | | Dt_InterfaceLog interfaceLog = new Dt_InterfaceLog |
| | | { |
| | | OrderNo = outboundOrder.UpperOrderNo, |
| | | DocumentNo = documentNo, |
| | | OrderType = "èæåºå
¥åº", |
| | | Content = outfeedmodel.ToJson(), |
| | | ReturnToMESStatus = 0, |
| | | IsDeleted = false |
| | | }; |
| | | _interfaceLog.AddData(interfaceLog); |
| | | |
| | | var result = await _invokeMESService.FeedbackOutbound(outfeedmodel); |
| | | if (result != null && result.code == 200) |
| | | { |
| | | var orderIds = outboundOrderDetails.Select(x => x.Id).Distinct().ToList(); |
| | | await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>() |
| | | .SetColumns(x => x.ReturnToMESStatus == 1) |
| | | .Where(x => orderIds.Contains(x.Id)) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | |
| | | await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>() |
| | | .SetColumns(x => x.ReturnToMESStatus == 1) |
| | | .Where(x => x.Id == outboundOrder.Id) |
| | | .ExecuteCommandAsync(); |
| | | |
| | | await _interfaceLog.Db.Updateable<Dt_InterfaceLog>() |
| | | .SetColumns(x => x.ReturnToMESStatus == 1) |
| | | .Where(x => x.DocumentNo == documentNo) |
| | | .ExecuteCommandAsync(); |
| | | } |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | public WebResponseContent NoStockOutBatchInOrderFeedbackToMes(int id,List<string> barCodeList) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | var inboundOrder = _inboundOrderRepository.Db.Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.Id == id) |
| | | .First(); |
| | | |
| | | List<Dt_MesReturnRecord> returnRecords = _mesReturnRecord.QueryData(x => x.OrderNo == inboundOrder.InboundOrderNo && x.OrderId == inboundOrder.Id && x.ReturnStatus == 2); |
| | | foreach (var item in returnRecords) |
| | | { |
| | | HttpResponseResult<MesResponseDTO> httpResponse = _httpClientHelper.Post<MesResponseDTO>(item.ApiUrl, item.RequestData); |
| | | item.ReturnCount += 1; |
| | | bool success = httpResponse.IsSuccess && httpResponse.Data.Code == "200"; |
| | | item.ReturnStatus = success ? 1 : 2; |
| | | item.HttpStatusCode = httpResponse.StatusCode.ObjToInt(); |
| | | item.LastReturnTime = DateTime.Now; |
| | | item.ResponseData = httpResponse.Content; |
| | | item.SuccessTime = httpResponse.IsSuccess ? DateTime.Now : null; |
| | | |
| | | //List<Dt_InboundOrderDetail> details=new List<Dt_InboundOrderDetail>(); |
| | | //foreach (var y in item.DetailsId.Split(',')) |
| | | //{ |
| | | // details.Add( _inboundOrderDetailRepository.QueryFirst(x => x.Id == Convert.ToInt32(y))); |
| | | //} |
| | | } |
| | | _mesReturnRecord.UpdateData(returnRecords); |
| | | |
| | | var inboundOrderDetail = _inboundOrderRepository.Db.Queryable<Dt_InboundOrderDetail>() |
| | | .Where(x => x.OrderId == inboundOrder.Id && x.OrderDetailStatus == (int)OrderDetailStatusEnum.Over && x.ReturnToMESStatus == 0) |
| | | .ToList(); |
| | | |
| | | var detail = inboundOrderDetail.Where(x => barCodeList.Contains(x.Barcode)).ToList(); |
| | | |
| | | if (inboundOrder.OrderType == (int)InOrderTypeEnum.AllocatInbound)//è°æ¨å
¥åº |
| | | { |
| | | var allocate = _inboundOrderRepository.Db.Queryable<Dt_AllocateOrder>().Where(x => x.OrderNo == inboundOrder.InboundOrderNo).First(); |
| | | var allocatefeedmodel = new AllocateDto |
| | | { |
| | | ReqCode = Guid.NewGuid().ToString(), |
| | | ReqTime = DateTime.Now.ToString(), |
| | | BusinessType = "3", |
| | | FactoryArea = inboundOrder.FactoryArea, |
| | | OperationType = 1, |
| | | Operator = App.User.UserName, |
| | | OrderNo = inboundOrder.UpperOrderNo, |
| | | fromWarehouse = allocate?.FromWarehouse ?? "", |
| | | toWarehouse = allocate?.ToWarehouse ?? "", |
| | | Details = NoStockOutGetAllocateDtoDetails(detail) |
| | | }; |
| | | |
| | | if (allocatefeedmodel.Details.Count <= 0) |
| | | { |
| | | throw new Exception("æªæ¾å°éè¦åä¼ çæ°æ®"); |
| | | } |
| | | |
| | | var response = NoStockOutresponseModel(inboundOrder, 3, null, allocatefeedmodel); |
| | | |
| | | if (response != null && response.IsSuccess && response.Data.Code == "200") |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 }) |
| | | .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand(); |
| | | if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºä¸.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 }) |
| | | .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand(); |
| | | if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºä¸.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | return content.Error("åä¼ MES失败"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | var feedmodel = new FeedbackInboundRequestModel |
| | | { |
| | | reqCode = Guid.NewGuid().ToString(), |
| | | reqTime = DateTime.Now.ToString(), |
| | | business_type = inboundOrder.BusinessType, |
| | | factoryArea = inboundOrder.FactoryArea, |
| | | operationType = 1, |
| | | Operator = App.User.UserName, |
| | | orderNo = inboundOrder.UpperOrderNo, |
| | | status = inboundOrder.OrderStatus, |
| | | details = NoStockOutFeedbackInboundDetailsModelDto(detail) |
| | | }; |
| | | |
| | | if (feedmodel.details.Count <= 0) |
| | | { |
| | | throw new Exception("æªæ¾å°éè¦åä¼ çæ°æ®"); |
| | | } |
| | | var response = NoStockOutresponseModel(inboundOrder, 3, feedmodel); |
| | | |
| | | if (response != null && response.IsSuccess && response.Data.Code == "200") |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 }) |
| | | .Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand(); |
| | | if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºä¸.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 }).Where(it => it.OrderId == inboundOrder.Id && barCodeList.Contains(it.Barcode)).ExecuteCommand(); |
| | | if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else if (inboundOrder.OrderStatus == InOrderStatusEnum.å
¥åºä¸.ObjToInt()) |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | else |
| | | { |
| | | _inboundOrderRepository.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 0 }) |
| | | .Where(it => it.Id == inboundOrder.Id).ExecuteCommand(); |
| | | } |
| | | return content.Error("åä¼ MES失败"); |
| | | } |
| | | } |
| | | |
| | | return content.OK("åä¼ MESæå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return content.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | public List<AllocateDtoDetail> NoStockOutGetAllocateDtoDetails(List<Dt_InboundOrderDetail> inboundOrderDetails) |
| | | { |
| | | var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) |
| | | .Select(group => new AllocateDtoDetail |
| | | { |
| | | MaterialCode = group.Key.MaterielCode, |
| | | LineNo = group.Key.lineNo, |
| | | WarehouseCode = group.Key.WarehouseCode, |
| | | Qty = group.Sum(x => x.BarcodeQty), |
| | | Unit = group.Key.BarcodeUnit, |
| | | Barcodes = group.Select(row => new BarcodeInfo |
| | | { |
| | | Barcode = row.Barcode, |
| | | Qty = row.BarcodeQty, |
| | | BatchNo = row.BatchNo, |
| | | SupplyCode = row.SupplyCode, |
| | | Unit = row.BarcodeUnit |
| | | }).ToList() |
| | | }).ToList(); |
| | | return groupedData; |
| | | } |
| | | public List<FeedbackInboundDetailsModel> NoStockOutFeedbackInboundDetailsModelDto(List<Dt_InboundOrderDetail> inboundOrderDetails ) |
| | | { |
| | | var groupedData = inboundOrderDetails.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode }) |
| | | .Select(group => new FeedbackInboundDetailsModel |
| | | { |
| | | materialCode = group.Key.MaterielCode, |
| | | lineNo = group.Key.lineNo, |
| | | warehouseCode = group.Key.WarehouseCode, |
| | | qty = group.Sum(x => x.BarcodeQty), |
| | | unit = group.Key.BarcodeUnit, |
| | | barcodes = group.Select(row => new FeedbackBarcodesModel |
| | | { |
| | | barcode = row.Barcode, |
| | | qty = row.BarcodeQty |
| | | }).ToList() |
| | | }).ToList(); |
| | | return groupedData; |
| | | } |
| | | |
| | | public HttpResponseResult<MesResponseDTO> NoStockOutresponseModel(Dt_InboundOrder order, int InterfaceType, FeedbackInboundRequestModel model = null, AllocateDto allocateDto = null) |
| | | { |
| | | HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>(); |
| | | string reqCode = Guid.NewGuid().ToString(); |
| | | string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); |
| | | string requestData = string.Empty; |
| | | string apiUrl = string.Empty; |
| | | if (model != null) |
| | | { |
| | | apiUrl = AppSettings.GetValue("AldMaterialWarehousing"); |
| | | httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, model.Serialize()); |
| | | requestData = model.Serialize(); |
| | | } |
| | | else |
| | | { |
| | | apiUrl = AppSettings.GetValue("AldAllocationOperation"); |
| | | httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, allocateDto.Serialize()); |
| | | requestData = allocateDto.Serialize(); |
| | | } |
| | | httpResponseResult.ApiUrl = apiUrl; |
| | | bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200"; |
| | | string message = "æå"; |
| | | if (!isSuccess) |
| | | { |
| | | if (!httpResponseResult.IsSuccess) |
| | | { |
| | | message = $"MESæ¥å£è¿åé误ï¼HTTP代ç ï¼{httpResponseResult.StatusCode}ï¼ä¿¡æ¯ï¼{httpResponseResult.ErrorMessage}"; |
| | | } |
| | | else if (httpResponseResult?.Data?.Code != "200") |
| | | { |
| | | message = $"è°ç¨MESæ¥å£å¤±è´¥ï¼ä»£ç ï¼{httpResponseResult?.Data?.Code}ï¼ä¿¡æ¯ï¼{httpResponseResult?.Data?.Message}"; |
| | | } |
| | | } |
| | | Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord() |
| | | { |
| | | ApiUrl = httpResponseResult.ApiUrl, |
| | | InterfaceType = InterfaceType, |
| | | OrderId = order.Id, |
| | | OrderNo = order.InboundOrderNo, |
| | | RequestCode = reqCode, |
| | | RequestData = requestData, |
| | | FailureReason = message, |
| | | LastReturnTime = DateTime.Now, |
| | | HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(), |
| | | ResponseData = httpResponseResult.Content, |
| | | ReturnType = 0, |
| | | ReturnCount = 1, |
| | | ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2, |
| | | SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null |
| | | }; |
| | | _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand(); |
| | | |
| | | return httpResponseResult; |
| | | } |
| | | public bool CheckOutboundOrderCompleted(string orderNo) |
| | | { |
| | | Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).First(); |
| | | if (outboundOrder == null) return false; |
| | | |
| | | List<Dt_OutboundOrderDetail> details = _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.OrderId == outboundOrder.Id).ToList(); |
| | | |
| | | // æ£æ¥æææç»çå·²åºæ°éæ¯å¦é½çäºåæ®æ°é |
| | | return details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty); |
| | | } |
| | | |
| | | public WebResponseContent GetPurchaseOrderByBarcode(string barcode) |
| | | { |
| | | try |
| | | { |
| | | Dt_InboundOrderDetail inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.Barcode == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First(); |
| | | if (inboundOrderDetail == null) |
| | | { |
| | | inboundOrderDetail = _stockInfoDetailService.Db.Queryable<Dt_InboundOrderDetail>().Where(x => x.OutBoxbarcodes == barcode && x.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()).First(); |
| | | |
| | | if(inboundOrderDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°è¯¥æ¡ç {barcode}çå
¥åºæç»æè
æç»ç¶æå·²å
¥æºä»å®æ"); |
| | | } |
| | | } |
| | | Dt_InboundOrder inboundOrder = _inboundOrderRepository.QueryFirst(x => x.Id == inboundOrderDetail.OrderId && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()); |
| | | if (inboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该å
¥åºå{inboundOrder}ç¶æå·²å
¥æºä»å®æ"); |
| | | } |
| | | var resultData = new { purchaseOrderNo = inboundOrder.UpperOrderNo }; |
| | | |
| | | return WebResponseContent.Instance.OK("æ¥è¯¢éè´åæå", data: resultData); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | |
| | | FactoryArea = item.FactoryArea, |
| | | Status = 0, |
| | | OrderNo = item.OrderNo, |
| | | BusinessType = materielGroupDTO.orderTypes.ToString() |
| | | BusinessType = materielGroupDTO.orderTypes.ToString(), |
| | | |
| | | |
| | | }); |
| | | item.WarehouseCode = item.WarehouseCode; |
| | |
| | | } |
| | | |
| | | |
| | | #endregion |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | #region æ¯æç±»å®ä¹ |
| | | |
| | |
| | | public List<SplitResult> SplitResults { get; set; } = new List<SplitResult>(); |
| | | } |
| | | |
| | | public class ReturnAnalysisResult |
| | | { |
| | | public bool HasItemsToReturn { get; set; } |
| | | public bool HasRemainingLocks { get; set; } |
| | | public bool HasPalletStockGoods { get; set; } |
| | | public bool HasSplitRecords { get; set; } |
| | | public decimal RemainingLocksReturnQty { get; set; } |
| | | public decimal PalletStockReturnQty { get; set; } |
| | | public decimal SplitReturnQty { get; set; } |
| | | public decimal TotalReturnQty { get; set; } |
| | | public List<Dt_OutStockLockInfo> RemainingLocks { get; set; } = new List<Dt_OutStockLockInfo>(); |
| | | public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>(); |
| | | public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>(); |
| | | } |
| | | public class PalletStatusAnalysis |
| | | { |
| | | public string OrderNo { get; set; } |
| | |
| | | public List<Dt_StockInfoDetail> PalletStockGoods { get; set; } = new List<Dt_StockInfoDetail>(); |
| | | public List<Dt_SplitPackageRecord> SplitRecords { get; set; } = new List<Dt_SplitPackageRecord>(); |
| | | |
| | | // å·²å¤ççæ¡ç éåï¼ç¨äºé¿å
éå¤ï¼ |
| | | public HashSet<string> ProcessedBarcodes { get; set; } = new HashSet<string>(); |
| | | public List<string> AllBarcodes { get; set; } = new List<string>(); |
| | | // 空æçç¸å
³å±æ§ |
| | | public bool IsEmptyPallet { get; set; } |
| | |
| | | public bool CanReturn => HasItemsToReturn && !HasActiveTasks; |
| | | public bool CanRemove => IsEmptyPallet && !HasActiveTasks; |
| | | } |
| | | public class PickingContext |
| | | { |
| | | public string OrderNo { get; set; } |
| | | public string PalletCode { get; set; } |
| | | public string Barcode { get; set; } |
| | | public string Operator { get; set; } |
| | | public Dt_OutStockLockInfo LockInfo { get; set; } |
| | | public Dt_OutboundOrderDetail OrderDetail { get; set; } |
| | | public Dt_StockInfoDetail StockDetail { get; set; } |
| | | public decimal ActualQuantity { get; set; } |
| | | public string AdjustedReason { get; set; } |
| | | } |
| | | |
| | | public class CancelPickingContext |
| | | { |
| | | public string OrderNo { get; set; } |