using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Admin.NET.Core; using Yitter.IdGenerator; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Mvc.RazorPages; using StackExchange.Redis; namespace Admin.NET.Application { /// /// Pda收货 /// [ApiDescriptionSettings("Pda收货", Name = "PdaReceiptOrder", Order = 100)] [Route("api/[Controller]")] public class WmsPdaReceiptOrderService : IDynamicApiController, ITransient { private readonly IRepository _wmsOrderRep; private readonly IRepository _wmsOrderDetailsRep; private readonly IRepository _wmsTaskRep; private readonly IRepository _wmsPlaceRep; private readonly IRepository _wmsAreaRep; private readonly IRepository _wmsWarehouseEntranceRep; private readonly IRepository _wmsMaterialContainerRep; private readonly IRepository _wmsContainerRep; private readonly IRepository _wmsContainerPlaceRep; private readonly IRepository _wmsMaterialStockRep; private readonly IRepository _wmsOrderTypeRep; private readonly IRepository _wmsReceiptOrderDetailsRep; private readonly IRepository _wmsReceiptOrderRep; /// /// 构造函数 /// public WmsPdaReceiptOrderService( IRepository wmsOrderRep, IRepository wmsOrderDetailsRep, IRepository wmsTaskRep, IRepository wmsPlaceRep, IRepository wmsAreaRep, IRepository wmsWarehouseEntranceRep, IRepository wmsMaterialContainerRep, IRepository wmsContainerRep, IRepository wmsContainerPlaceRep, IRepository wmsMaterialStockRep, IRepository wmsOrderTypeRep, IRepository wmsReceiptOrderDetailsRep, IRepository wmsReceiptOrderRep ) { _wmsOrderRep = wmsOrderRep; _wmsOrderDetailsRep = wmsOrderDetailsRep; _wmsTaskRep = wmsTaskRep; _wmsPlaceRep = wmsPlaceRep; _wmsAreaRep = wmsAreaRep; _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsContainerRep = wmsContainerRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsOrderTypeRep = wmsOrderTypeRep; _wmsReceiptOrderDetailsRep = wmsReceiptOrderDetailsRep; _wmsReceiptOrderRep = wmsReceiptOrderRep; } /// /// 根据单据号获取明细 /// /// [HttpGet("GetOrderDetail")] [UnitOfWork] [UnifyResult(typeof(List))] public async Task GetOrderDetail([FromQuery] GetOrderDetailInput input) { //获取主单据 var wmsOrders = await _wmsReceiptOrderRep.DetachedEntities .FirstOrDefaultAsync(u => u.NO == input.NO); if (wmsOrders == null) return XnRestfulResultProvider.RESTfulMesaage("单据不存在!"); //已收货的明细不显示 var wmsOrderDetails = await _wmsReceiptOrderDetailsRep.DetachedEntities .Where(u => u.OrderId == wmsOrders.Id) .Where(u=>u.ReceivingStatus != ReceivingStatus.YISHOUHUO) .ProjectToType() .ToListAsync(); return wmsOrderDetails; } /// /// pda确认收货 /// /// [HttpPost("ConfirmReceipt")] [UnitOfWork] public async Task ConfirmReceipt([FromBody] ConfirmReceiptInput input) { if (input.GetOrderDetailOutputList.Count == 0) throw Oops.Oh("收货信息不能为空!"); //获取主单据 var wmsOrderModal = await _wmsReceiptOrderRep.DetachedEntities .ProjectToType() .FirstOrDefaultAsync(u => u.NO == input.NO); if (wmsOrderModal == null) throw Oops.Oh("单据不存在!"); if (wmsOrderModal.ReceivingStatus == ReceivingStatus.YISHOUHUO) throw Oops.Oh("该单据已收货!"); if (input.GetOrderDetailOutputList.Count == 0) throw Oops.Oh("收货信息不能为空!"); //更新收货明细 foreach (var item in input.GetOrderDetailOutputList) { var WmsReceiptOrderDetailsModal = item.Adapt(); if (WmsReceiptOrderDetailsModal.ReceivedQty < WmsReceiptOrderDetailsModal.DeliveryQty) { WmsReceiptOrderDetailsModal.ReceivingStatus = ReceivingStatus.SHOUHUOZHONG; } else { WmsReceiptOrderDetailsModal.ReceivingStatus = ReceivingStatus.YISHOUHUO; } await _wmsReceiptOrderDetailsRep.UpdateNowAsync(WmsReceiptOrderDetailsModal); } //获取该收货单所有单据明细数量 int allCount = wmsOrderModal.WmsReceiptOrderDetails.Count; //获取该收货单所有完成的单据明细 var wcCount = await _wmsReceiptOrderDetailsRep.Where(x => x.OrderId == wmsOrderModal.Id && x.ReceivingStatus == ReceivingStatus.YISHOUHUO).ToListAsync(); if (allCount == wcCount.Count) { wmsOrderModal.ReceivingStatus = ReceivingStatus.YISHOUHUO; } else if (allCount > wcCount.Count && wcCount.Count > 0) { wmsOrderModal.ReceivingStatus = ReceivingStatus.SHOUHUOZHONG; } else { wmsOrderModal.ReceivingStatus = ReceivingStatus.WEISHOUHUO; } await _wmsReceiptOrderRep.UpdateAsync(wmsOrderModal); } } }