using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
using WIDESEA_Core.BaseServices;
|
using WIDESEA_Core;
|
using WIDESEA_IInboundService;
|
using WIDESEA_Model.Models;
|
using WIDESEA_Common.OrderEnum;
|
using WIDESEA_Core.Helper;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
using WIDESEA_Core.Enums;
|
using SqlSugar;
|
using WIDESEA_Core.BaseRepository;
|
using WIDESEA_Common.StockEnum;
|
using Microsoft.AspNetCore.Mvc;
|
using WIDESEA_DTO.Inbound;
|
using WIDESEA_DTO.ReturnMES;
|
using MailKit.Search;
|
using static System.Collections.Specialized.BitVector32;
|
using WIDESEA_Common.CommonEnum;
|
using WIDESEA_Common.TaskEnum;
|
using WIDESEA_IBasicService;
|
|
namespace WIDESEA_InboundService
|
{
|
public class TakeStockOrderService : ServiceBase<Dt_TakeStockOrder, IRepository<Dt_TakeStockOrder>>, ITakeStockOrderService
|
{
|
public IRepository<Dt_TakeStockOrder> Repository => BaseDal;
|
private readonly IUnitOfWorkManage _unitOfWorkManage;
|
private readonly IRepository<Dt_TakeStockOrder> _takeStockOrder;
|
private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
|
private readonly IRepository<Dt_TakeStockOrderDetail> _takeStockOrderDetail;
|
private readonly IRepository<Dt_Task> _taskRepository;
|
private readonly ILocationInfoService _locationInfoService;
|
public TakeStockOrderService(IRepository<Dt_TakeStockOrder> BaseDal, IUnitOfWorkManage unitOfWorkManage,IRepository<Dt_TakeStockOrder> takeStockOrder,IRepository<Dt_StockInfo> stockInfoRepository,IRepository<Dt_TakeStockOrderDetail> takeStockOrderDetail,IRepository<Dt_Task> taskRepository,ILocationInfoService locationInfoService) : base(BaseDal)
|
{
|
_unitOfWorkManage = unitOfWorkManage;
|
_takeStockOrder = takeStockOrder;
|
_stockInfoRepository = stockInfoRepository;
|
_takeStockOrderDetail = takeStockOrderDetail;
|
_taskRepository = taskRepository;
|
_locationInfoService = locationInfoService;
|
}
|
|
public WebResponseContent ValidateBoxNo(string orderNo, string boxNo)
|
{
|
try
|
{
|
Dt_StockInfo stockInfo = _stockInfoRepository.QueryFirst(x => x.PalletCode == boxNo);
|
if (stockInfo == null) {
|
return WebResponseContent.Instance.Error("未找到该托盘库存");
|
}
|
if(stockInfo.StockStatus != StockStatusEmun.盘点出库完成.ObjToInt())
|
{
|
return WebResponseContent.Instance.Error("该托盘处于非盘点状态,请检查盘点任务");
|
}
|
Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == orderNo);
|
if (takeStockOrder == null)
|
{
|
return WebResponseContent.Instance.Error("未找到该盘点单据");
|
}
|
if (takeStockOrder.AllPalletCode.Contains(","))
|
{
|
var remarkValues = takeStockOrder.AllPalletCode
|
.Split(',')
|
.Select(s => s.Trim())
|
.Where(s => !string.IsNullOrWhiteSpace(s))
|
.ToList();
|
if (remarkValues.Count == 0)
|
{
|
return WebResponseContent.Instance.Error("盘点单箱号仅包含逗号,无有效箱号数据");
|
}
|
|
bool isMatch = remarkValues.Any(val => val.Equals(boxNo, StringComparison.OrdinalIgnoreCase));
|
if (!isMatch)
|
{
|
return WebResponseContent.Instance.Error($"箱号【{boxNo}】未在盘点单箱号【{takeStockOrder.Remark}】中找到匹配项");
|
}
|
}
|
else
|
{
|
bool isMatch = takeStockOrder.Remark.Trim().Equals(boxNo, StringComparison.OrdinalIgnoreCase);
|
if (!isMatch)
|
{
|
return WebResponseContent.Instance.Error($"箱号【{boxNo}】与盘点单箱号【{takeStockOrder.Remark}】不匹配");
|
}
|
}
|
|
return WebResponseContent.Instance.OK();
|
}
|
catch(Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent ValidateBarcode(string boxNo, string barcode)
|
{
|
try
|
{
|
Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == boxNo).Includes(x => x.Details).First();
|
if(stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error("未找到该料箱库存信息");
|
}
|
if(stockInfo.Details == null)
|
{
|
return WebResponseContent.Instance.Error("未找到该料箱库存");
|
}
|
List<string> barcodes = stockInfo.Details.Select(x => x.Barcode).ToList();
|
|
bool isMatch = barcodes.Any(val => val.Equals(barcode, StringComparison.OrdinalIgnoreCase));
|
if (!isMatch)
|
{
|
return WebResponseContent.Instance.Error($"条码【{barcode}】未在【{boxNo}】料箱条码中找到匹配项");
|
}
|
var stockDetail = stockInfo.Details.FirstOrDefault(x=>x.Barcode == barcode);
|
|
var resultData = new { stockQuantity = stockDetail.StockQuantity };
|
|
return WebResponseContent.Instance.OK(data:resultData);
|
}
|
catch(Exception ex)
|
{
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent CompleteStockTake([FromBody] CompleteStockTakeDTO completeStockTakeDTO)
|
{
|
try
|
{
|
Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == completeStockTakeDTO.orderNo);
|
if (takeStockOrder == null)
|
{
|
return WebResponseContent.Instance.Error("未找到该盘点单据");
|
}
|
Dt_StockInfo stockInfo = _stockInfoRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == completeStockTakeDTO.boxNo).Includes(x=>x.Details).First();
|
if(stockInfo == null)
|
{
|
return WebResponseContent.Instance.Error("未找到该托盘库存");
|
}
|
Dt_StockInfoDetail stockInfoDetail = stockInfo.Details.FirstOrDefault(x => x.Barcode == completeStockTakeDTO.barcode);
|
if(stockInfoDetail == null)
|
{
|
return WebResponseContent.Instance.Error("条码库存数据未找到匹配数据");
|
}
|
Dt_TakeStockOrderDetail takeStockOrderDetail = new Dt_TakeStockOrderDetail()
|
{
|
TakeStockId = takeStockOrder.Id,
|
MaterielCode = stockInfoDetail.MaterielCode,
|
MaterielName = stockInfoDetail.MaterielName??"",
|
BatchNo = stockInfoDetail.BatchNo,
|
TakePalletCode = completeStockTakeDTO.boxNo,
|
TakeDetalStatus = TakeStockDetailStatusEnum.盘点完成.ObjToInt(),
|
Unit = stockInfoDetail.Unit,
|
SysQty = completeStockTakeDTO.stockQuantity,
|
Qty =completeStockTakeDTO.actualQuantity,
|
Remark = completeStockTakeDTO.stockQuantity-completeStockTakeDTO.actualQuantity>=0 ?"盘亏":"盘盈",
|
barcode = completeStockTakeDTO.barcode,
|
WarehouseCode = stockInfoDetail.WarehouseCode??"",
|
FactoryArea = stockInfoDetail.FactoryArea,
|
SupplyCode = stockInfoDetail.SupplyCode??"",
|
TakeStockNo = takeStockOrder.OrderNo,
|
|
};
|
_unitOfWorkManage.BeginTran();
|
_takeStockOrderDetail.AddData(takeStockOrderDetail);
|
_unitOfWorkManage.CommitTran();
|
return WebResponseContent.Instance.OK();
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return WebResponseContent.Instance.Error(ex.Message);
|
}
|
}
|
|
public WebResponseContent ReturnBox(string orderNo, string boxNo)
|
{
|
WebResponseContent content = new WebResponseContent();
|
try
|
{
|
Dt_TakeStockOrder takeStockOrder = _takeStockOrder.QueryFirst(x=>x.OrderNo == orderNo);
|
if(takeStockOrder == null)
|
{
|
return content.Error("未找到该盘点单据");
|
}
|
var stock = _stockInfoRepository.QueryFirst(x => x.PalletCode == boxNo);
|
|
if (stock == null)
|
{
|
return content.Error($"未找到托盘{boxNo}库存信息不允许回库");
|
}
|
|
var task = _taskRepository.QueryFirst(x => x.PalletCode == boxNo);
|
|
|
if (task != null)
|
{
|
return content.Error($"托盘{boxNo}存在任务回库失败!");
|
}
|
if(stock.StockStatus != StockStatusEmun.盘点出库完成.ObjToInt())
|
{
|
return content.Error("该托盘状态不对,不允许盘点入库");
|
}
|
stock.StockStatus = StockStatusEmun.入库确认.ObjToInt();
|
|
takeStockOrder.TakeStockStatus = TakeStockStatusEnum.盘点完成.ObjToInt();
|
// 分配新货位
|
var newLocation = _locationInfoService.AssignLocation(stock.LocationType);
|
|
var newTask = new Dt_Task()
|
{
|
CurrentAddress = takeStockOrder.Remark,
|
Grade = 0,
|
PalletCode = boxNo,
|
NextAddress = "",
|
OrderNo = takeStockOrder.OrderNo,
|
Roadway = newLocation.RoadwayNo,
|
SourceAddress = takeStockOrder.Remark,
|
TargetAddress = newLocation.LocationCode,
|
TaskStatus = (int)TaskStatusEnum.New,
|
TaskType = TaskTypeEnum.InInventory.ObjToInt(),
|
PalletType = stock.PalletType,
|
WarehouseId = stock.WarehouseId
|
};
|
_unitOfWorkManage.BeginTran();
|
_stockInfoRepository.UpdateData(stock);
|
_takeStockOrder.UpdateData(takeStockOrder);
|
_taskRepository.AddData(newTask);
|
_unitOfWorkManage.CommitTran();
|
|
//var moveResult = await _eSSApiService.MoveContainerAsync(new MoveContainerRequest
|
//{
|
// slotCode = movestations[station],
|
// containerCode = palletCode
|
//});
|
return content.OK();
|
|
}
|
catch (Exception ex)
|
{
|
_unitOfWorkManage.RollbackTran();
|
return content.Error(ex.Message);
|
}
|
}
|
}
|
|
}
|