You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
6.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Estsh.Core.Base;
using Estsh.Core.Wms.IRepositories;
using Estsh.Core.Wms.IServices;
using Estsh.Core.Model.Result;
using Estsh.Core.Services;
using Estsh.Core.Repositories;
using Estsh.Core.Models;
using Newtonsoft.Json.Linq;
using static Estsh.Core.Model.EnumUtil.WmsEnumUtil;
using Estsh.Core.Model.EnumUtil;
namespace Estsh.Core.Wms.Services
{
public class NcConcessionService : BaseService<BaseEntity>, INcConcessionService
{
private readonly INcConcessionRepository repository;
private readonly IMoveOrderRepository moveOrderRepository;
private readonly IStockRepository stockRepository;
public NcConcessionService(INcConcessionRepository _repository,
IMoveOrderRepository _moveOrderRepository, IStockRepository _stockRepository) : base(_repository)
{
this.repository = _repository;
this.moveOrderRepository = _moveOrderRepository;
this.stockRepository = _stockRepository;
}
/// <summary>
/// 检查库位是否可操作
/// </summary>
/// <param name="locateName"></param>
/// <returns></returns>
public string CheckLocateInfo(string locateName)
{
SysLocate locate = repository.GetLocateInfo(locateName);
if (locate == null)
{
return "库位不存在,请检查!";
}
if (locate.Enabled.Equals(Enabled.N))
{
return "库位已禁用,不能使用!";
}
if (locate.LocateType == (int)LocateType.BASICS_LOCATE
|| locate.LocateType == (int)LocateType.MANEUVER_LOCATE
|| locate.LocateType == (int)LocateType.COMBINATION_LOCATE)
{
return "SCAN_OK";
}
else
{
return "库位类型不符合,请检查!";
}
}
/// <summary>
/// 处理扫描的箱条码
/// </summary>
/// <param name="cartonNo"></param>
/// <param name="orderNo"></param>
/// <param name="loginId"></param>
/// <returns></returns>
public string DoCanton(string cartonNo, string locateName, string orderNo, string loginId)
{
SysStock cartonInfo = stockRepository.GetCartonInfo(cartonNo);
if (cartonInfo == null)
{
return "包装条码不存在,请检查!";
}
if (cartonInfo.Enabled.Equals(Enabled.N))
{
return "包装条码已被冻结,不允许此操作!";
}
if (cartonInfo.Status != (int)StockStatus.NC_INSTOCK)
{
return "包装条码状态不是NC状态不允许此操作";
}
if (cartonInfo.Qty == 0)
{
return "包装条码数量为0禁止操作";
}
SysLocate locateInfo = repository.GetLocateInfo(locateName);
if (locateInfo.LocateType == (int)LocateType.BASICS_LOCATE)
{
SysLocatePart locatePart = repository.GetLocatePartInfo(locateName);
if (locatePart == null)
{
return "库位为基础库位,未维护对应的零件!";
}
else
{
if (cartonInfo.PartId != locatePart.PartId)
{
return "库位为基础库位,扫描的包装信息与库位对应的零件不符!";
}
}
}
if (locateInfo.LocateType == (int)LocateType.MANEUVER_LOCATE)
{
List<SysStock> sysStocks = stockRepository.GetLocateStockInfo(locateName);
if (sysStocks != null && sysStocks.FindIndex(a => a.PartId == cartonInfo.PartId) < 0)
{
return "库位为机动库位,扫描的包装信息与库位现有库存对应的零件不符!";
}
}
List<WmsMoveDetail> moveDetails = moveOrderRepository.GetMoveDetailList(orderNo);
WmsMoveDetail? moveDetail = moveDetails.SingleOrDefault(x => x.PartId == cartonInfo.PartId);
if (moveDetail == null)
{
return "订单中不包含包装条码对应零件,不允许此操作!";
}
if (moveDetail.Qty <= moveDetail.PickQty)
{
return "此零件对应的订单数量已满,无法再扫描!";
}
if (moveDetail.Qty < moveDetail.PickQty + cartonInfo.Qty)
{
return "箱包装数量大于订单中此零件的剩余待处理数量!";
}
List<WmsMoveSn> moveSns = moveOrderRepository.GetMoveSnList(orderNo);
List<WmsMoveSn> moveSnCreates = moveSns.Where(x => x.Status == (int)MoveOrderSnStatus.CREATE).ToList();
WmsMoveSn? moveSn = null;
if (moveSnCreates != null && moveSnCreates.Count > 0)
{
moveSn = moveSnCreates.SingleOrDefault(x => x.CartonNo.Equals(cartonInfo.CartonNo));
if (moveSn == null)
{
return "订单中不包含此包装条码,不允许此操作!";
}
}
string result = string.Empty;
if (repository.DoCarton(cartonInfo, locateInfo, moveDetail, moveSn, loginId))
{
result = this.SubmitOrder(orderNo, loginId);
}
else
{
result = "操作失败,请重新尝试!";
}
return result;
}
/// <summary>
/// 提交单据
/// </summary>
/// <param name="orderNo"></param>
/// <param name="loginId"></param>
/// <returns></returns>
public string SubmitOrder(string orderNo,string loginId)
{
string result = string.Empty;
List<WmsMoveDetail> moveDetails = moveOrderRepository.GetMoveDetailList(orderNo);
var moveDetailsExist = moveDetails.Where(a => a.Qty > a.PickQty).ToList();
if (moveDetailsExist == null || moveDetailsExist.Count == 0)
{
// 完成单据并提交接口
if (moveOrderRepository.OrderComplete(orderNo, loginId))
{
repository.InsertInterfaceByNCConcession(orderNo);//添加到接口表
result = "ORDER_COMPLETED";
}
else
{
result = "操作失败,请重新尝试!";
}
}
else
{
result = "SCAN_OK";
//提交接口
}
return result;
}
}
}