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.
313 lines
12 KiB
C#
313 lines
12 KiB
C#
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
|
|
{
|
|
/// <summary>
|
|
/// 委外配料
|
|
/// </summary>
|
|
public class OutSourceBatchService : BaseService<BaseEntity>, IOutSourceBatchService
|
|
{
|
|
private readonly IOutSourceBatchRepository repository;
|
|
public OutSourceBatchService(IOutSourceBatchRepository _repository) : base(_repository)
|
|
{
|
|
repository = _repository;
|
|
}
|
|
public SetObjectDetail GetOutSourceBatchOrderList(string orderNo)
|
|
{
|
|
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
|
|
|
|
List<WmsOutstock> wmsMoves = repository.GetOutSourceBatchOrderList(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 GetOutSourceBatchOrderListByOrderNo(string orderNo)
|
|
{
|
|
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
|
|
List<WmsOutstockDetail> wmsMoves = repository.GetOutSourceBatchOrderListByOrderNo(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 GetStockByCartonNo(string cartonNo)
|
|
{
|
|
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
|
|
List<SysStock> sysStocks = repository.GetStockByCartonNo(cartonNo);
|
|
|
|
if (sysStocks.Count > 0)
|
|
{
|
|
rfInfo.type = "PASS";
|
|
rfInfo.message = "成功";
|
|
rfInfo.wmsObjectDetail = sysStocks.ConvertAll(s => (object)s);
|
|
}
|
|
else
|
|
{
|
|
rfInfo.type = "FAIL";
|
|
rfInfo.message = "箱条码不存在,请检查!";
|
|
}
|
|
return rfInfo;
|
|
}
|
|
|
|
public SetObjectDetail CheckStockByCartonAlocate(string cartonNo, string orderNo, string groupNo, string isSplit, string loginId)
|
|
{
|
|
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
|
|
//配料列表
|
|
List<WmsOutstockDetail> details = repository.CheckMoveDetail(orderNo);
|
|
//扫描到的箱条码
|
|
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<WmsOutstockDetail> 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<SysStock> PartByFIFO = repository.GetPartByFIFO(Stock.PartId.ToString());
|
|
//List<SysStock> 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;
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
return repository.UpdteStatus(orderNo, ifScan, Stock, groupNo, loginId);
|
|
}
|
|
|
|
public SetObjectDetail CheckStockByCartonAlocateGroup(string carton_No, string orderNo, string groupNo, string isSplit, string loginId)
|
|
{
|
|
SetObjectDetail rfInfo = new SetObjectDetail();//返回消息
|
|
//配料列表
|
|
List<WmsOutstockDetail> details = repository.CheckMoveDetail(orderNo);
|
|
List<SysStock> sysStocks = new List<SysStock>();
|
|
|
|
sysStocks = repository.GetCartonInfoByGroupNo(groupNo);
|
|
for (int i = 0; i < sysStocks.Count; i++)
|
|
{
|
|
SysStock Stock = sysStocks[i];
|
|
string cartonNo = Stock.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;
|
|
}
|
|
|
|
}
|
|
|
|
var stockGroupQtys = sysStocks.GroupBy(m => new { m.PartNo,m.FactoryCode})
|
|
.Select(a=> new {PartNo = a.Key.PartNo,FactoryCode = a.Key.FactoryCode ,qty = a.Sum(c=>c.Qty) }).ToList();
|
|
foreach (var stockGroupQty in stockGroupQtys)
|
|
{
|
|
var ifScan = details.FirstOrDefault(a => a.PartNo == stockGroupQty.PartNo);
|
|
if (ifScan == null)
|
|
{
|
|
rfInfo.type = "FAIL";
|
|
rfInfo.message = "[" + stockGroupQty.PartNo + "]:不在委外发运单中,请检查!";
|
|
return rfInfo;
|
|
}
|
|
|
|
if (!stockGroupQty.FactoryCode.Equals(ifScan.FactoryCode))
|
|
{
|
|
rfInfo.type = "FAIL";
|
|
rfInfo.message = "[" + stockGroupQty.PartNo + "]:与委外发运单不在同工厂,请检查!";
|
|
return rfInfo;
|
|
}
|
|
|
|
if (ifScan.PickQty >= ifScan.Qty)
|
|
{
|
|
rfInfo.type = "FAIL";
|
|
rfInfo.message = "[" + stockGroupQty.PartNo + "]:已完成配料!";
|
|
return rfInfo;
|
|
}
|
|
|
|
if (ifScan.PickQty + stockGroupQty.qty > ifScan.Qty)
|
|
{
|
|
rfInfo.type = "FAIL";
|
|
rfInfo.message = "本组托内零件:[" + stockGroupQty.PartNo + "]:本次配料数量[" + stockGroupQty.qty + "],大于待配料数量,不允许配料!";
|
|
return rfInfo;
|
|
}
|
|
|
|
}
|
|
|
|
repository.UpdteStatusGroup(orderNo, groupNo, loginId);
|
|
|
|
|
|
List<WmsOutstockDetail> wmsMoves1 = repository.getWmsOutstockDetailInfo(orderNo);
|
|
for (int i = 0; i < wmsMoves1.Count; i++)
|
|
{
|
|
if (wmsMoves1[i].Qty != wmsMoves1[i].PickQty)
|
|
{
|
|
rfInfo.type = "PASS";
|
|
rfInfo.message = "校验成功!请继续扫描箱条码";
|
|
rfInfo.wmsObjectDetail = wmsMoves1.ConvertAll(s => (object)s);
|
|
return rfInfo;
|
|
}
|
|
}
|
|
rfInfo.type = "PASS";
|
|
rfInfo.message = "订单操作完成!请切换订单或移至委外发运";
|
|
rfInfo.wmsObjectDetail = wmsMoves1.ConvertAll(s => (object)s);
|
|
return rfInfo;
|
|
}
|
|
|
|
public SetObjectDetail CheckMaterialSplit(string cartonNo, int splitNum, string loginId, int splitCount)
|
|
{
|
|
|
|
SetObjectDetail det = new SetObjectDetail();
|
|
//需要拆分的箱条码信息
|
|
List<SysStock> 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<SysStock> 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;
|
|
}
|
|
|
|
}
|
|
}
|