using Dapper;
using Estsh.Core.Base;
using Estsh.Core.Model.EnumUtil;
using Estsh.Core.Models;
using Estsh.Core.Services;
using Estsh.Core.Wms.IRepositories;
using Estsh.Core.Wms.IServices;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Estsh.Core.Wms.Services
{
///
/// 销售配料
///
public class SaleBatchService : BaseService, ISaleBatchService
{
private readonly ISaleBatchRepository repository;
public SaleBatchService(ISaleBatchRepository _repository) : base(_repository)
{
repository = _repository;
}
public SetObjectDetail GetSaleBatchOrderList(string orderNo)
{
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
List wmsMoves = repository.GetSaleBatchOrderList(orderNo);
if (wmsMoves.Count > 0)
{
rfInfo.type = "PASS";
rfInfo.message = "成功";
rfInfo.wmsObjectDetail = wmsMoves.ConvertAll(s => (object)s);
}
else
{
rfInfo.type = "FAIL";
rfInfo.message = "未查询到数据,请检查!";
}
return rfInfo;
}
public SetObjectDetail GetSaleBatchOrderListByOrderNo(string orderNo)
{
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
List wmsMoves = repository.GetSaleBatchOrderListByOrderNo(orderNo);
if (wmsMoves.Count > 0)
{
rfInfo.type = "PASS";
rfInfo.message = "成功";
rfInfo.wmsObjectDetail = wmsMoves.ConvertAll(s => (object)s);
}
else
{
rfInfo.type = "FAIL";
rfInfo.message = "未查询到数据,请检查!";
}
return rfInfo;
}
public SetObjectDetail CheckStockByCartonAlocate(string cartonNo, string orderNo, string isSplit)
{
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
//配料列表
List details = repository.CheckMoveDetail(orderNo, (int)WmsEnumUtil.StockStatus.INSTOCKED);
//扫描到的箱条码
SysStock Stock = repository.GetCartonInfo(cartonNo);
if (Stock == null)
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:箱条码不存在,请检查!";
return rfInfo;
}
if (Stock.Enabled.Equals("N"))
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:箱条码已被冻结,请检查!";
return rfInfo;
}
else if (Stock.Status != (int)WmsEnumUtil.StockStatus.INSTOCKED)
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:是" + Stock.StockStatus + "状态,请检查!";
return rfInfo;
}
if (Stock.Qty < 1)
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:箱条码数量不足,无法拆分!";
return rfInfo;
}
List ifScan = details.Where(a => a.PartId == Stock.PartId).ToList();
if (ifScan.Count == 0)
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:不在销售发运单中,请检查!";
return rfInfo;
}
if (ifScan[0].FactoryId != Stock.FactoryId)
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:与销售发运单不在同工厂,请检查!";
return rfInfo;
}
if (ifScan[0].PickQty >= ifScan[0].Qty)
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + ifScan[0].PartNo + "]:已完成配料!";
return rfInfo;
}
////获取零件号 最早批次列表
//List PartByFIFO = repository.GetPartByFIFO(Stock.PartId.ToString());
//List isSure = PartByFIFO.Where(a => a.CartonNo == Stock.CartonNo).ToList();
//if (isSure.Count == 0)
//{
// rfInfo.type = "FAIL";
// rfInfo.message = "[" + cartonNo + "]:箱条码不是最早批次,请扫描[" + PartByFIFO[0].CartonNo + "]";
// return rfInfo;
//}
if ((ifScan[0].PickQty + Stock.Qty) > ifScan[0].Qty && isSplit == "False")
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + cartonNo + "]:箱条码为尾箱超出配料数,请开启拆分进行扫描!";
return rfInfo;
}
rfInfo.type = "PASS";
rfInfo.message = "扫描成功,请扫描客户条码";
return rfInfo;
}
public SetObjectDetail doSaleBatch(string cartonNo, string orderNo, string groupNo, string isSplit, string loginId, string customBarcode)
{
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
//扫描到的箱条码
SysStock Stock = repository.GetCartonInfo(cartonNo);
if (Stock.CartonNoCustomer == customBarcode && customBarcode !="")
{
rfInfo.type = "FAIL";
rfInfo.message = "零件号[" + Stock.PartNo + "]已扫描,请重新扫描!";
return rfInfo;
}
SysCustomerPart customerPart = repository.GetCustomerPart(Stock.PartNo);
if (customerPart == null)
{
rfInfo.type = "FAIL";
rfInfo.message = "找不到零件号[" + Stock.PartNo + "]对应的客户零件号!";
return rfInfo;
}
if (!customBarcode.Contains(customerPart.CustPartNo))
{
rfInfo.type = "FAIL";
rfInfo.message = "[" + Stock.PartNo + "]对应的客户零件号[" + customerPart.CustPartNo + "]与扫描的不一致!";
return rfInfo;
}
//配料列表
List details = repository.CheckMoveDetail(orderNo, (int)WmsEnumUtil.StockStatus.INSTOCKED);
List ifScan = details.Where(a => a.PartId == Stock.PartId).ToList();
if (isSplit == "True")
{
//尾箱拆分
decimal needNum = ifScan[0].Qty - ifScan[0].PickQty; //需要拆的数量
if (needNum >= Stock.Qty)
{
//不需要拆
}
else
{
//原条码
decimal oldQty = Stock.Qty - needNum;
CheckMaterialSplit(Stock.CartonNo, Convert.ToInt32(oldQty), loginId, 1);
//更新拆分后数据
Stock = repository.GetCartonInfo(cartonNo);
return repository.UpdteStatus(orderNo, ifScan, Stock, groupNo, loginId, customBarcode);
}
}
return repository.UpdteStatus(orderNo, ifScan, Stock, groupNo, loginId, customBarcode);
}
public SetObjectDetail CheckMaterialSplit(string cartonNo, int splitNum, string loginId, int splitCount)
{
SetObjectDetail det = new SetObjectDetail();
//需要拆分的箱条码信息
List MaterialInfo = repository.GetMaterialInfo(cartonNo);
if (MaterialInfo.Count == 0)
{
det.type = "NO";
det.message = "[" + cartonNo + "]:箱条码不存在,请检查!";
return det;
}
if (MaterialInfo[0].Enabled.Equals("N"))
{
det.type = "NO";
det.message = "[" + cartonNo + "]:箱条码已被冻结,请检查!";
return det;
}
if (MaterialInfo[0].Qty < 1)
{
det.type = "NO";
det.message = "[" + cartonNo + "]:箱条码数量不足,无法拆分!";
return det;
}
List NewStock = repository.CheckMaterialSplit(MaterialInfo, splitNum, loginId, splitCount);
if (NewStock == null || NewStock.Count == 0)
{
det.type = "NO";
det.message = "执行失败!请重试!";
}
else
{
det.type = "OK";
det.wmsObjectDetail = NewStock.ConvertAll(s => (object)s);
}
return det;
}
}
}