| | |
| | | public readonly IRepository<Dt_InboundOrder> _inboundOrderRepository; |
| | | public readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository; |
| | | public readonly IRepository<Dt_LocationType> _locationTypeRepository; |
| | | public readonly IRepository<Dt_OutboundOrderDetail> _outboundOrderDetailRepository; |
| | | |
| | | private Dictionary<string, string> stations = new Dictionary<string, string> |
| | | { |
| | |
| | | {"3-1","3-5" }, |
| | | }; |
| | | |
| | | public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository) |
| | | public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository, ILocationInfoService locationInfoService, IESSApiService eSSApiService, IRepository<Dt_AllocateOrder> allocateOrderRepository, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfoRepository, IRepository<Dt_InboundOrderDetail> inboundOrderDetailRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_OutboundOrderDetail> outboundOrderDetailRepository) |
| | | { |
| | | _mapper = mapper; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | |
| | | _inboundOrderRepository = inboundOrderRepository; |
| | | _locationTypeRepository = locationTypeRepository; |
| | | _warehouseAreaRepository = warehouseAreaRepository; |
| | | _outboundOrderDetailRepository = outboundOrderDetailRepository; |
| | | } |
| | | |
| | | public WebResponseContent PrintFromData (string barcode) |
| | |
| | | _detailRepository.UpdateData(outboundOrderDetails); |
| | | if (pickedDetails.Any()) |
| | | { |
| | | UpdateStockStatus(pickedDetails.Select(x => x.PalletCode).ToList(), StockStatusEmun.åºåºéå®.ObjToInt()); |
| | | UpdateStockStatus(pickedDetails.Select(x => x.PalletCode).ToList(), StockStatusEmun.åºåºéå®.ObjToInt(),outboundOrder); |
| | | UpdateLocationStatus(pickedDetails.Select(x => x.LocationCode).ToList(), LocationStatusEnum.Lock.ObjToInt()); |
| | | } |
| | | //鿣å䏿£éï¼å»æéå®è®°å½ååºï¼å次ç»çæ¶æ£é¤åæ¡ç |
| | |
| | | } |
| | | } |
| | | |
| | | public bool UpdateStockStatus(List<string> palletCodes, int status) |
| | | public bool UpdateStockStatus(List<string> palletCodes, int status,Dt_OutboundOrder outOrder) |
| | | { |
| | | try |
| | | { |
| | | List<Dt_StockInfo> stockInfos = _stockInfoRepository.QueryData(x => palletCodes.Contains(x.PalletCode)); |
| | | ///æºä»è°æºä»åæ®è®°å½ |
| | | if(outOrder.OrderType == 117) |
| | | { |
| | | stockInfos.ForEach(stockInfo => stockInfo.Remark = outOrder.OrderNo); |
| | | } |
| | | stockInfos.ForEach(stockInfo => stockInfo.StockStatus = status); |
| | | _stockInfoRepository.UpdateData(stockInfos); |
| | | return true; |
| | |
| | | |
| | | Func<Dt_OutStockLockInfo, bool> wareWhere = x => string.IsNullOrEmpty(outboundOrderDetails.First().WarehouseCode) ? true : x.WarehouseCode == outboundOrderDetails.First().WarehouseCode; |
| | | |
| | | List<Dt_OutStockLockInfo> stockLockInfos = _outboundLockInfoRepository.QueryData(x => |
| | | x.OrderNo == request.OrderNo && |
| | | x.MaterielCode == stockInfoDetail.MaterielCode).Where(supWhere).Where(wareWhere).ToList(); |
| | | var stockLockInfos = _outboundLockInfoRepository.QueryData(x => |
| | | x.OrderDetailIds == lockInfo.OrderDetailIds && |
| | | x.OrderNo == request.OrderNo && |
| | | x.MaterielCode == stockInfoDetail.MaterielCode) |
| | | .Where(supWhere) |
| | | .Where(wareWhere) |
| | | .ToList(); |
| | | if (stockLockInfos != null && stockLockInfos.Any()) |
| | | { |
| | | _outboundLockInfoRepository.DeleteAndMoveIntoHty(stockLockInfos, WIDESEA_Core.Enums.OperateTypeEnum.èªå¨å é¤); |
| | |
| | | |
| | | Func<Dt_OutStockLockInfo, bool> wareWhere = x => string.IsNullOrEmpty(outboundOrderDetails.First().WarehouseCode) ? true : x.WarehouseCode == outboundOrderDetails.First().WarehouseCode; |
| | | |
| | | List<Dt_OutStockLockInfo> stockLockInfos = _outboundLockInfoRepository.QueryData(x => |
| | | x.OrderNo == request.OrderNo && |
| | | x.MaterielCode == stockDetail.MaterielCode).Where(supWhere).Where(wareWhere).ToList(); |
| | | var stockLockInfos = _outboundLockInfoRepository.QueryData(x => |
| | | x.OrderDetailIds == lockInfo.OrderDetailIds && |
| | | x.OrderNo == request.OrderNo && |
| | | x.MaterielCode == stockDetail.MaterielCode) |
| | | .Where(supWhere) |
| | | .Where(wareWhere) |
| | | .ToList(); |
| | | if (stockLockInfos != null && stockLockInfos.Any()) |
| | | { |
| | | _outboundLockInfoRepository.DeleteAndMoveIntoHty(stockLockInfos, WIDESEA_Core.Enums.OperateTypeEnum.èªå¨å é¤); |
| | |
| | | return content.Error($"æªæ¾å°æç{palletCode}åºåä¿¡æ¯ä¸å
许ååº"); |
| | | } |
| | | |
| | | var task = await _taskRepository.Db.Queryable<Dt_Task>() |
| | | .Where(x => x.PalletCode == palletCode) |
| | | .FirstAsync(); |
| | | |
| | | if (task != null) |
| | | { |
| | | return content.Error($"æç{palletCode}åå¨ä»»å¡ååºå¤±è´¥!"); |
| | | } |
| | | |
| | | // åé
æ°è´§ä½ |
| | | var newLocation = _locationInfoService.AssignLocation(stock.LocationType); |
| | | |
| | | if (newLocation == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("没æç©ºé²åºä½å¯ååº"); |
| | | } |
| | | |
| | | if(stock.Remark !=null && stock.Remark != "") |
| | | { |
| | | Dt_OutboundOrder outboundOrder = _outboundRepository.QueryFirst(x => x.OrderNo == stock.Remark && x.OrderType == 117 && x.OrderStatus == OutOrderStatusEnum.åºåºä¸.ObjToInt()); |
| | | if (outboundOrder != null) |
| | | { |
| | | // 1. æ ¹æ®è®¢åå·æ¥è¯¢è°æ¨ç©æä¿¡æ¯ |
| | | List<Dt_AllocateMaterialInfo> allocateMaterialInfos = _allocateMaterialInfoRepository.QueryData(x => x.OrderNo == outboundOrder.OrderNo); |
| | | |
| | | // 2. 夿æ¯å¦åå¨è°æ¨ç©æï¼æ²¡æåç´æ¥è·³è¿æ ¡éª |
| | | if (allocateMaterialInfos != null && allocateMaterialInfos.Any()) |
| | | { |
| | | // 3. æåææ Barcode éå |
| | | List<string> barcodes = allocateMaterialInfos.Select(x => x.Barcode).ToList(); |
| | | |
| | | // 4. æ ¹æ® Barcode æ¹éæ¥è¯¢åºåæç» |
| | | List<Dt_StockInfoDetail> stockInfoDetails = _stockDetailRepository.QueryData(x => barcodes.Contains(x.Barcode) && x.OrderNo == outboundOrder.OrderNo); |
| | | |
| | | // 5. æ°é对æ¯ï¼ä¸ç¸ç â æªå
¨é¨ç»ç宿 |
| | | if (barcodes.Count != stockInfoDetails.Count) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æºä»è°æºä»åæ®{outboundOrder.OrderNo}å°æªå
¨é¨ç»ç宿ï¼è¯·å
è¿è¡ç»çåååºåæ®ç¸å
³æç®±"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | if (stock.Details.Count <= 0) |
| | | { |
| | | stock.PalletType = (int)PalletTypeEnum.Empty; |
| | |
| | | |
| | | stock.StockStatus = (int)StockStatusEmun.å
¥åºç¡®è®¤; |
| | | stock.LocationCode = ""; |
| | | } |
| | | |
| | | var task = await _taskRepository.Db.Queryable<Dt_Task>() |
| | | .Where(x => x.PalletCode == palletCode) |
| | | .FirstAsync(); |
| | | |
| | | if (task != null) |
| | | { |
| | | return content.Error($"æç{palletCode}åå¨ä»»å¡ååºå¤±è´¥!"); |
| | | } |
| | | |
| | | // åé
æ°è´§ä½ |
| | | var newLocation = _locationInfoService.AssignLocation(stock.LocationType); |
| | | |
| | | if(newLocation == null) |
| | | { |
| | | return WebResponseContent.Instance.Error("没æç©ºé²åºä½å¯ååº"); |
| | | } |
| | | |
| | | var newTask = new Dt_Task() |
| | |
| | | |
| | | Dt_StockInfoDetail_Hty historyDetail = _stockDetailHistoryRepository.QueryFirst(x => |
| | | x.Barcode == request.Barcode && |
| | | |
| | | (x.OperateType == "åºåºå®æ" || x.OperateType == "æå
-åå§è®°å½")); |
| | | |
| | | if(historyDetail != null) |
| | | if (historyDetail != null) |
| | | { |
| | | double minutesDiff = (DateTime.Now - historyDetail.InsertTime).TotalMinutes; |
| | | if (minutesDiff >= 30) |
| | |
| | | { |
| | | return WebResponseContent.Instance.Error("该æçå·²å
¨é¨æ£éå®,ä¸å
许æ¤é"); |
| | | } |
| | | |
| | | var details = _outboundOrderDetailRepository.QueryData(x => x.OrderId == outboundOrder.Id); |
| | | |
| | | var outboundDetails = details |
| | | .Where(x => |
| | | x.MaterielCode == historyDetail.MaterielCode |
| | | && |
| | | !string.IsNullOrEmpty(lockInfo.OrderDetailIds) |
| | | && |
| | | lockInfo.OrderDetailIds.Split(",") |
| | | .Any(idStr => idStr.Trim() == x.Id.ToString()) |
| | | ).ToList(); |
| | | |
| | | var detail = outboundDetails.FirstOrDefault(); |
| | | if (detail != null && !string.IsNullOrEmpty(detail.ReturnJsonData)) |
| | | { |
| | | try |
| | | { |
| | | string deleteBarcode = request.Barcode; |
| | | |
| | | var list = JsonConvert.DeserializeObject<List<BarcodeItem>>(detail.ReturnJsonData); |
| | | if (list != null) |
| | | { |
| | | var filteredList = list.Where(x => x.barcode != deleteBarcode).ToList(); |
| | | |
| | | detail.ReturnJsonData = JsonConvert.SerializeObject(filteredList); |
| | | _outboundOrderDetailRepository.UpdateData(detail); |
| | | } |
| | | } |
| | | catch |
| | | { |
| | | |
| | | } |
| | | } |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | try |
| | | { |
| | |
| | | { |
| | | ReverseFullOutboundOperation(historyDetail, stockInfo, request); |
| | | } |
| | | |
| | | RollbackOutboundOrderDetails(historyDetail.MaterielCode, request.OrderNo, historyDetail.StockQuantity, stockInfo.Id); |
| | | |
| | | if (lockInfo != null) |
| | | { |
| | | lockInfo.SortedQuantity = Math.Max(0, (decimal)(lockInfo.SortedQuantity - historyDetail.StockQuantity)); |
| | | |
| | | if (lockInfo.SortedQuantity == 0) |
| | | { |
| | | _outboundLockInfoRepository.UpdateData(lockInfo); |
| | | } |
| | | else |
| | | { |
| | | _outboundLockInfoRepository.UpdateData(lockInfo); |
| | | } |
| | | } |
| | | lockInfo.SortedQuantity = Math.Max(0, (decimal)(lockInfo.SortedQuantity - historyDetail.StockQuantity)); |
| | | _outboundLockInfoRepository.UpdateData(lockInfo); |
| | | |
| | | _stockDetailHistoryRepository.DeleteData(historyDetail); |
| | | |
| | |
| | | |
| | | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¡ç æç»å®ä½ |
| | | /// </summary> |
| | | public class BarcodeItem |
| | | { |
| | | /// <summary> |
| | | /// æ¡ç |
| | | /// </summary> |
| | | public string barcode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// æ°é |
| | | /// </summary> |
| | | public decimal qty { get; set; } |
| | | |
| | | /// <summary> |
| | | /// ä¾åºåç¼ç |
| | | /// </summary> |
| | | public string supplyCode { get; set; } |
| | | |
| | | /// <summary> |
| | | /// æ¹æ¬¡å· |
| | | /// </summary> |
| | | public string batchNo { get; set; } |
| | | |
| | | /// <summary> |
| | | /// åä½ |
| | | /// </summary> |
| | | public string unit { get; set; } |
| | | } |
| | | } |