using Model.InterFaceModel;
|
using SqlSugar;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using WMS.BLL.Logic;
|
using WMS.BLL.LogServer;
|
using WMS.DAL;
|
using WMS.Entity.BllAsnEntity;
|
using WMS.Entity.BllSoEntity;
|
using WMS.Entity.Context;
|
using WMS.Entity.DataEntity;
|
using WMS.Entity.LogEntity;
|
using WMS.Entity.SysEntity;
|
using WMS.IBLL;
|
|
namespace WMS.BLL
|
{
|
public class HttpServer:IHttpServer
|
{
|
private static readonly SqlSugarScope Db = DataContext.Db;
|
public HttpServer() { }
|
|
/// <summary>
|
/// 申请储位 (立体库)
|
/// </summary>
|
/// <param name="palletNo"></param>
|
/// <param name="houseNo"></param>
|
/// <param name="roadwayNo"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public OutCommandDto RequestLocation(string palletNo, string houseNo)
|
{
|
try
|
{
|
//验证托盘条码是否为空
|
if (string.IsNullOrEmpty(palletNo))
|
{
|
throw new Exception("请输入要申请的托盘条码");
|
}
|
//验证所属仓库是否为空
|
if (string.IsNullOrEmpty(houseNo))
|
{
|
throw new Exception("请选择所属仓库");
|
}
|
//验证是否为平库入库
|
var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);//获取仓库类型
|
//验证是否为立体库入库
|
if (houseType.Type != "1")
|
{
|
throw new Exception("仓库类型错误,请选择立体库仓库");
|
}
|
|
OutCommandDto comDto;//返回wcs的入库命令
|
|
var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息
|
|
//判断托盘条码是否有效
|
if (stock == null)
|
throw new Exception("托盘条码不受WMS管理,不可入库!");
|
|
#region
|
|
|
var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList();
|
//物料类别信息
|
var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList();
|
|
var skuNo = ""; //入库物料
|
var starLocate = ""; // 起始储位
|
var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList();
|
//验证物料是否有成品
|
foreach (var item in stockDetail)
|
{
|
var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
|
if (skuItem.Type == "2")
|
{
|
throw new Exception("成品物料请入成品库");
|
}
|
}
|
var upShelfOldList = Db.Queryable<BllPalletUpShelf>().Where(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1")).ToList();
|
if (upShelfOldList != null) //查询到入库信息
|
{
|
var upShelfOld = upShelfOldList.First();
|
var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == upShelfOld.TaskNo);
|
if (beingTask == null)
|
{
|
throw new Exception("该托盘正在入库,但未查询到任务信息");
|
}
|
if (!string.IsNullOrWhiteSpace(beingTask.EndLocat))
|
{
|
comDto = new OutCommandDto()
|
{
|
TaskNo = beingTask.TaskNo, // 任务号
|
TaskType = "0",// 任务类型
|
PalletNo = palletNo,//托盘号
|
|
StartRoadway = beingTask.StartRoadway, // 起始巷道
|
StartLocate = beingTask.StartLocat, // 起始位置
|
EndLocate = beingTask.EndLocat, // 目标位置
|
EndRoadway = beingTask.EndRoadway, // 目标巷道
|
|
Order = 999,
|
Type = PLCTypeEnum.AGV
|
};
|
if (beingTask.IsSuccess == 0)
|
{
|
beingTask.IsSuccess = 1;
|
}
|
beingTask.Status = "1";
|
Db.Updateable(beingTask).ExecuteCommand();
|
|
foreach (var item in upShelfOldList)
|
{
|
if (item.Status == "0")
|
{
|
upShelfOld.Status = "1";
|
Db.Updateable(upShelfOld).ExecuteCommand();
|
}
|
}
|
|
return comDto;
|
}
|
else
|
{
|
throw new Exception("查询到任务但目的储位为空");
|
}
|
}
|
else //申请入库
|
{
|
if (stockDetail.Count == 0)
|
{
|
throw new Exception($"{palletNo}托盘条码不具有箱码信息,不可入库!");
|
}
|
if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) == 0)
|
{
|
throw new Exception("当前托盘没有在平库储位上,请核实");
|
}
|
starLocate = stockDetail.First().LocatNo;
|
|
var pingAreaStr = Db.Queryable<SysStorageArea>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList();
|
var pingLocateInfo = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == starLocate && pingAreaStr.Contains(m.AreaNo) && m.IsDel == "0");
|
if (pingLocateInfo == null)
|
{
|
throw new Exception("当前托盘所在的储位没有在系统中找到信息");
|
}
|
if (pingLocateInfo.Status != "1")
|
{
|
throw new Exception("当前托盘所在的储位状态错误,不是空储位");
|
}
|
skuNo = stockDetail.First().SkuNo;
|
|
var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0"
|
&& (m.Status == "0" || m.Status == "1") && m.PalletNo == palletNo && m.Type == "0");
|
if (beingTask != null)
|
{
|
if (!string.IsNullOrWhiteSpace(beingTask.EndLocat))
|
{
|
comDto = new OutCommandDto()
|
{
|
PalletNo = palletNo,//托盘号
|
StartRoadway = beingTask.StartRoadway, // 起始巷道
|
StartLocate = beingTask.StartLocat, // 起始位置
|
EndLocate = beingTask.EndLocat, // 目标位置
|
EndRoadway = beingTask.EndRoadway, // 目标巷道
|
TaskNo = beingTask.TaskNo, // 任务号
|
TaskType = "0",// 任务类型 (出库)
|
OutMode = "", //目标地址
|
Order = 1,
|
Type = PLCTypeEnum.AGV
|
};
|
if (beingTask.IsSuccess == 0)
|
{
|
beingTask.IsSuccess = 1;
|
|
}
|
beingTask.Status = "1";
|
Db.Updateable(beingTask).ExecuteCommand();
|
return comDto;
|
}
|
else
|
{
|
throw new Exception("查询到任务但目的储位为空");
|
}
|
}
|
|
//获取对应回库规则
|
var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO");
|
#region 托盘回库规则
|
|
if (function != null)
|
{
|
//拣货完成后允许托盘回库
|
if (function.SetValue == "CompletePick")
|
{
|
var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo);
|
|
//验证拣货明细是否存在
|
if (allot != null)
|
{
|
//验证当前托盘拣货信息是否已完成
|
if (allot.Status != "5")
|
{
|
throw new Exception("当前托盘拣货信息未完成,请完成后回库!");
|
}
|
}
|
}
|
}
|
#endregion
|
}
|
|
var allotLocate = new AllotLocation();
|
|
#region 申请储位
|
|
SysStorageLocat locate;
|
var sku = skuList.FirstOrDefault(m => m.SkuNo == skuNo);
|
if (sku == null)
|
{
|
throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库");
|
}
|
//判断物料是否含有类别信息
|
if (string.IsNullOrWhiteSpace(sku.CategoryNo))
|
{
|
throw new Exception($"物料:{sku.SkuNo}未查询到类别信息");
|
}
|
|
var skuCategory = skuCategoryList.FirstOrDefault(m => m.CategoryNo == sku.CategoryNo);
|
if (skuCategory == null)
|
{
|
throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别");
|
}
|
|
var areaStr = skuCategory.AreaNo.Split(",");
|
var areaList = new List<string>();
|
foreach (var item in areaStr)
|
{
|
areaList.Add(item);
|
}
|
|
locate = allotLocate.GetSuiTableLocate(houseNo, areaList, "");
|
|
|
#endregion
|
|
Db.BeginTran();
|
try
|
{
|
|
|
//添加巷道使用记录
|
var log = new SysRoadwayUseLog
|
{
|
RoadwayNo = locate.RoadwayNo,
|
WareHouseNo = houseNo,
|
Row = 0,
|
Column = 0,
|
Layer = 0,
|
};
|
Db.Insertable(log).ExecuteCommand();
|
var taskNo = new Common().GetMaxNo("TK");
|
var inTask = new LogTask //入库任务
|
{
|
TaskNo = taskNo,
|
Sender = "WMS",
|
Receiver = "WCS",
|
IsSuccess = 1, //是否下发成功 0失败 1成功
|
SendDate = DateTime.Now, //发送时间
|
BackDate = DateTime.Now, //返回时间
|
StartRoadway = "", // 起始巷道
|
StartLocat = starLocate,//起始位置
|
EndLocat = locate.LocatNo,//目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
PalletNo = palletNo,//托盘码
|
IsSend = 1,//是否可再次下发
|
IsCancel = 1,//是否可取消
|
IsFinish = 1,//是否可完成
|
Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务
|
Status = "1",//任务状态0:等待执行1正在执行2执行完成
|
OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单
|
Msg = "入库口到=>>" + locate.LocatNo + "的入库任务", //关键信息
|
|
};
|
Db.Insertable(inTask).ExecuteCommand();
|
var asnNo = "";
|
// 添加托盘绑定表托盘入库任务号 liudl
|
foreach (DataStockDetail stockModel in stockDetail)
|
{
|
var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2"
|
&& m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo);
|
if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo))
|
{
|
bindModel.TaskNo = taskNo;
|
bindModel.WareHouseNo = locate.WareHouseNo;
|
bindModel.RoadwayNo = locate.RoadwayNo;
|
bindModel.LocatNo = locate.LocatNo;
|
Db.Updateable(bindModel).ExecuteCommand();
|
asnNo = stockModel.ASNNo;
|
}
|
}
|
foreach (DataStockDetail stockModel in stockDetail)
|
{
|
//添加托盘上架记录
|
var upShelf = new BllPalletUpShelf()
|
{
|
TaskNo = inTask.TaskNo,
|
TraceNo = asnNo,
|
PalletNo = palletNo,
|
SkuNo = stockModel.SkuNo,
|
SkuName = stockModel.SkuName,
|
LotNo = stockModel.LotNo,
|
Status = "1",
|
|
WareHouseNo = houseNo,
|
RoadwayNo = locate.RoadwayNo,
|
AreaNo = locate.AreaNo,
|
LocatNo = locate.LocatNo,
|
|
CreateUser = 0,
|
};
|
Db.Insertable(upShelf).ExecuteCommand();
|
}
|
|
|
locate.Status = "2";
|
Db.Updateable(locate).ExecuteCommand();
|
|
Db.CommitTran();
|
comDto = new OutCommandDto()
|
{
|
TaskNo = taskNo, // 任务号
|
TaskType = "0",// 任务类型
|
PalletNo = palletNo,//托盘号
|
|
StartRoadway = inTask.StartRoadway,
|
StartLocate = inTask.StartLocat, // 起始位置
|
EndLocate = inTask.EndLocat, // 目标位置
|
EndRoadway = inTask.EndRoadway, // 目标巷道
|
|
Order = 999,
|
Type = PLCTypeEnum.AGV
|
};
|
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
#endregion
|
|
|
return comDto;
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
/// <summary>
|
/// 申请巷道(密集库)
|
/// </summary>
|
/// <param name="palletNo"></param>
|
/// <param name="houseNo"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public OutCommandDto RequestMiJiRoadWay(string palletNo, string houseNo)
|
{
|
try
|
{
|
#region 验证托盘合法性
|
//验证托盘条码是否为空
|
if (string.IsNullOrEmpty(palletNo))
|
{
|
throw new Exception("请输入要申请的托盘条码");
|
}
|
//验证所属仓库是否为空
|
if (string.IsNullOrEmpty(houseNo))
|
{
|
throw new Exception("请选择所属仓库");
|
}
|
//获取仓库类型
|
var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);
|
//验证是否为密集库
|
if (houseType.Type != "3")
|
{
|
throw new Exception("仓库不是密集库");
|
}
|
|
var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息
|
//判断托盘条码是否有效
|
if (stock == null)
|
{
|
throw new Exception("托盘条码不受WMS管理,不可入库!");
|
}
|
#endregion
|
|
OutCommandDto comDto;//返回wcs的入库命令
|
|
#region 代码块
|
|
//查询托盘绑定信息(状态为等待入库/正在执行的)
|
|
var skuNo = ""; //入库物料
|
var lotNo = ""; //入库批次
|
|
//物料信息
|
var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList();
|
//物料类别信息
|
var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList();
|
//托盘库存信息
|
var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList();
|
//验证物料是否有成品
|
foreach (var item in stockDetail)
|
{
|
var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
|
if (skuItem.Type != "2")
|
{
|
throw new Exception("托盘上有不是成品的物料");
|
}
|
}
|
var upShelfOld = Db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
|
|
if (upShelfOld != null) //正常入库
|
{
|
var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == upShelfOld.TaskNo);
|
if (beingTask == null)
|
{
|
throw new Exception("该托盘正在入库,但未查询到任务信息");
|
}
|
if (!string.IsNullOrWhiteSpace(beingTask.EndRoadway))
|
{
|
comDto = new OutCommandDto()
|
{
|
TaskNo = beingTask.TaskNo, // 任务号
|
TaskType = "0",// 任务类型
|
PalletNo = palletNo,//托盘号
|
|
StartRoadway = beingTask.StartRoadway, // 起始巷道
|
StartLocate = beingTask.StartLocat, // 起始位置
|
EndLocate = beingTask.EndLocat, // 目标位置
|
EndRoadway = beingTask.EndRoadway, // 目标巷道
|
|
Order = 999,
|
Type = PLCTypeEnum.ConveyorLine
|
};
|
if (beingTask.IsSuccess == 0)
|
{
|
beingTask.IsSuccess = 1;
|
}
|
beingTask.Status = "1";
|
Db.Updateable(beingTask).ExecuteCommand();
|
if (upShelfOld.Status == "0")
|
{
|
upShelfOld.Status = "1";
|
Db.Updateable(upShelfOld).ExecuteCommand();
|
}
|
return comDto;
|
}
|
else
|
{
|
throw new Exception("查询到任务但目的巷道为空");
|
}
|
}
|
else //申请入库
|
{
|
if (stockDetail.Count == 0)
|
{
|
throw new Exception($"{palletNo}托盘不存在库存信息,不可入库!");
|
}
|
if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0)
|
{
|
throw new Exception("当前托盘已在库内,请核实");
|
}
|
skuNo = stockDetail.First().SkuNo;
|
lotNo = stockDetail.First().LotNo;
|
|
#region 判断该托盘,是否符合回库功能设定的回库规则
|
//获取对应回库规则
|
var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0"&& a.FunSetNo == "Fun041" && a.IsEnable == "NO");
|
if (function != null)
|
{
|
//拣货完成后允许托盘回库
|
var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0"&& a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo);
|
|
//验证拣货明细是否存在
|
if (allot != null)
|
{
|
//验证当前托盘拣货信息是否已完成
|
if (allot.Status != "5")
|
{
|
throw new Exception("当前托盘拣货信息未完成,请完成后回库!");
|
}
|
}
|
}
|
#endregion
|
}
|
|
var allotLocate = new AllotLocation();
|
|
#region 根据sku确认区域划分
|
|
//物料信息
|
var sku = Db.Queryable<SysMaterials>().First(m => m.IsDel == "0" && m.SkuNo == skuNo);
|
if (sku == null)
|
{
|
throw new Exception("物料编码不存在,不可入库");
|
}
|
//判断物料是否含有类别信息
|
if (string.IsNullOrWhiteSpace(sku.CategoryNo))
|
{
|
throw new Exception($"物料:{sku.SkuNo}未设置类别,不可入库");
|
}
|
//物料类别信息
|
var skuCategory = Db.Queryable<SysMaterialCategory>().First(m => m.IsDel == "0" && m.CategoryNo == sku.CategoryNo);
|
if (skuCategory == null)
|
{
|
throw new Exception($"{sku.SkuNo}物料类别不存在,不可入库");
|
}
|
//整理区域信息
|
var areaStr = skuCategory.AreaNo.Split(",");
|
var areaList = new List<string>();
|
foreach (var item in areaStr)
|
{
|
areaList.Add(item);
|
}
|
|
//巷道组信息
|
var roadList = Db.Queryable<SysStorageLocat>().Where(m => m.WareHouseNo == houseNo && areaList.Contains(m.AreaNo))
|
.GroupBy(m => m.RoadwayNo).OrderBy(m => m.RoadwayNo).Select(m => m.RoadwayNo).ToList();
|
|
#endregion
|
|
//获取申请的密集库巷道
|
var roadNo = allotLocate.GetMiJiSuiTableRoad(houseNo, roadList, areaList, skuNo, lotNo);
|
|
if (string.IsNullOrWhiteSpace(roadNo))
|
{
|
throw new Exception("未查询到存在空储位巷道");
|
}
|
|
Db.BeginTran();
|
try
|
{
|
//添加巷道使用记录
|
var log = new SysRoadwayUseLog
|
{
|
RoadwayNo = roadNo,
|
WareHouseNo = houseNo,
|
Row = 0,
|
Column = 0,
|
Layer = 0,
|
};
|
Db.Insertable(log).ExecuteCommand();
|
|
// 添加入库日志记录
|
var taskNo = new Common().GetMaxNo("TK");
|
var inTask = new LogTask //入库任务
|
{
|
TaskNo = taskNo,
|
Sender = "WMS",
|
Receiver = "WCS",
|
IsSuccess = 0, //是否下发成功 0失败 1成功
|
SendDate = DateTime.Now, //发送时间
|
BackDate = DateTime.Now, //返回时间
|
StartRoadway = "", // 起始巷道
|
StartLocat = "",//起始位置
|
EndLocat = "",//目标位置
|
EndRoadway = roadNo, // 目标巷道
|
PalletNo = palletNo,//托盘码
|
IsSend = 1,//是否可再次下发
|
IsCancel = 1,//是否可取消
|
IsFinish = 1,//是否可完成
|
Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务
|
Status = "1",//任务状态0:等待执行1正在执行2执行完成
|
OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单
|
Msg = "入库口到=>>" + roadNo + "巷道的入库任务", //关键信息
|
|
};
|
Db.Insertable(inTask).ExecuteCommand();
|
|
var asnNo = "";
|
// 添加托盘绑定表托盘入库任务号 liudl
|
|
foreach (DataStockDetail stockModel in stockDetail)
|
{
|
var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2"
|
&& m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo);
|
if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo))
|
{
|
bindModel.TaskNo = taskNo;
|
bindModel.WareHouseNo = houseNo;
|
bindModel.RoadwayNo = roadNo;
|
Db.Updateable(bindModel).ExecuteCommand();
|
asnNo = stockModel.ASNNo;
|
}
|
|
}
|
|
foreach (DataStockDetail stockModel in stockDetail)
|
{
|
//添加托盘上架记录
|
var upShelf = new BllPalletUpShelf()
|
{
|
TaskNo = inTask.TaskNo,
|
TraceNo = asnNo,
|
PalletNo = palletNo,
|
SkuNo = stockModel.SkuNo,
|
SkuName = stockModel.SkuName,
|
LotNo = stockModel.LotNo,
|
Status = "1",
|
|
WareHouseNo = houseNo,
|
RoadwayNo = roadNo,
|
AreaNo = "",
|
LocatNo = "",
|
|
CreateUser = 0,
|
};
|
Db.Insertable(upShelf).ExecuteCommand();
|
}
|
|
Db.CommitTran();
|
|
comDto = new OutCommandDto()
|
{
|
TaskNo = taskNo, // 任务号
|
TaskType = "0",// 任务类型:入库任务
|
PalletNo = palletNo,//托盘号
|
|
StartRoadway = inTask.StartRoadway,// 起始巷道
|
StartLocate = inTask.StartLocat, // 起始位置
|
EndLocate = inTask.EndLocat, // 目标位置
|
EndRoadway = inTask.EndRoadway, // 目标巷道
|
|
Order = 999,
|
Type = PLCTypeEnum.ConveyorLine
|
};
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
#endregion
|
|
return comDto;
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
/// <summary>
|
/// 1 申请储位 (申请巷道后 再申请储位储位 )
|
/// </summary>
|
/// <param name="palletNo"></param>
|
/// <param name="houseNo"></param>
|
/// <param name="roadwayNo"></param>
|
/// <returns></returns>
|
/// <exception cref="Exception"></exception>
|
public OutCommandDto RequestMiJiLocation(string palletNo, string houseNo, string roadwayNo)
|
{
|
try
|
{
|
#region 验证
|
|
//验证托盘条码是否为空
|
if (string.IsNullOrEmpty(palletNo))
|
{
|
throw new Exception("请输入要申请的托盘条码");
|
}
|
//验证所属仓库是否为空
|
if (string.IsNullOrEmpty(houseNo))
|
{
|
throw new Exception("请选择所属仓库");
|
}
|
//验证所属仓库是否为空
|
if (string.IsNullOrEmpty(roadwayNo))
|
{
|
throw new Exception("巷道不能为空");
|
}
|
//获取仓库类型
|
var houseType = Db.Queryable<SysWareHouse>().First(a => a.WareHouseNo == houseNo);
|
//验证是否为密集库
|
if (houseType.Type != "3")
|
{
|
throw new Exception("仓库不是密集库");
|
}
|
var stock = Db.Queryable<SysPallets>().First(a => a.PalletNo == palletNo);//托盘信息
|
|
//判断托盘条码是否有效
|
if (stock == null)
|
{
|
throw new Exception("托盘条码不受WMS管理,不可入库!");
|
}
|
|
#endregion
|
|
OutCommandDto comDto;//返回wcs的入库命令
|
|
#region
|
|
//查询托盘绑定信息(状态为等待入库的)
|
|
|
var skuList = Db.Queryable<SysMaterials>().Where(m => m.IsDel == "0").ToList();
|
//物料类别信息
|
var skuCategoryList = Db.Queryable<SysMaterialCategory>().Where(m => m.IsDel == "0").ToList();
|
|
var skuNo = "";//入库物料
|
var isAddTask = true; //是否添加新任务
|
var oldTaskNo = ""; //旧任务号
|
var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == palletNo).ToList();
|
//验证物料是否有成品
|
foreach (var item in stockDetail)
|
{
|
var skuItem = skuList.First(m => m.SkuNo == item.SkuNo);
|
if (skuItem.Type != "2")
|
{
|
throw new Exception("托盘上有不是成品的物料");
|
}
|
}
|
|
var upShelfOld = Db.Queryable<BllPalletUpShelf>().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
|
|
if (upShelfOld != null) //有上架入库信息
|
{
|
|
var beingTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == upShelfOld.TaskNo);
|
if (beingTask == null)
|
{
|
throw new Exception("该托盘正在入库,但未查询到任务信息");
|
}
|
if (!string.IsNullOrWhiteSpace(beingTask.EndLocat))
|
{
|
comDto = new OutCommandDto()
|
{
|
TaskNo = beingTask.TaskNo, // 任务号
|
TaskType = "0",// 任务类型
|
PalletNo = palletNo,//托盘号
|
|
StartRoadway = beingTask.StartRoadway, // 起始巷道
|
StartLocate = beingTask.StartRoadway, // 起始位置
|
EndLocate = beingTask.EndLocat, // 目标位置
|
EndRoadway = beingTask.EndRoadway, // 目标巷道
|
|
Order = 999,
|
Type = PLCTypeEnum.ShuttleCar,
|
};
|
if (beingTask.IsSuccess == 0)
|
{
|
beingTask.IsSuccess = 1;
|
Db.Updateable(beingTask).ExecuteCommand();
|
}
|
if (upShelfOld.Status == "0")
|
{
|
upShelfOld.Status = "1";
|
Db.Updateable(upShelfOld).ExecuteCommand();
|
}
|
return comDto;
|
}
|
else
|
{
|
isAddTask = false;
|
oldTaskNo = beingTask.TaskNo;
|
skuNo = upShelfOld.SkuNo;//入库物料
|
}
|
|
}
|
else //申请入库
|
{
|
if (stockDetail.Count == 0)
|
{
|
throw new Exception($"{palletNo}托盘条码没有库存信息,不可入库!");
|
}
|
if (stockDetail.Count(m => !string.IsNullOrWhiteSpace(m.LocatNo)) > 0)
|
{
|
throw new Exception("当前托盘已在库内,请核实");
|
}
|
skuNo = stockDetail.First().SkuNo;//入库物料
|
|
//获取对应回库规则
|
var function = Db.Queryable<SysFunSetting>().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO");
|
#region 托盘回库规则
|
|
if (function != null)
|
{
|
//拣货完成后允许托盘回库
|
if (function.SetValue == "CompletePick")
|
{
|
var allot = Db.Queryable<BllExportAllot>().First(a => a.IsDel == "0" && a.LotNo == stockDetail[0].LotNo && a.PalletNo == palletNo && a.SkuNo == stockDetail[0].SkuNo);
|
|
//验证拣货明细是否存在
|
if (allot != null)
|
{
|
//验证当前托盘拣货信息是否已完成
|
if (allot.Status != "5")
|
{
|
throw new Exception("当前托盘拣货信息未完成,请完成后回库!");
|
}
|
}
|
}
|
}
|
#endregion
|
}
|
|
var allotLocate = new AllotLocation();
|
|
#region 申请储位
|
|
SysStorageLocat locate;
|
|
var sku = skuList.FirstOrDefault(m => m.SkuNo == skuNo);
|
if (sku == null)
|
{
|
throw new Exception("物料信息中未查询到入库单明细包含的物料信息,不可入库");
|
}
|
//判断物料是否含有类别信息
|
if (string.IsNullOrWhiteSpace(sku.CategoryNo))
|
{
|
throw new Exception($"物料:{sku.SkuNo}未查询到类别信息");
|
}
|
|
var skuCategory = skuCategoryList.FirstOrDefault(m => m.CategoryNo == sku.CategoryNo);
|
if (skuCategory == null)
|
{
|
throw new Exception($"未在类别信息中查询到物料:{sku.SkuNo}包含的类别");
|
}
|
|
var areaStr = skuCategory.AreaNo.Split(",");
|
var areaList = new List<string>();
|
foreach (var item in areaStr)
|
{
|
areaList.Add(item);
|
}
|
|
locate = allotLocate.GetMiJiSuiTableLocate(roadwayNo, areaList);
|
|
|
#endregion
|
|
Db.BeginTran();
|
try
|
{
|
|
if (isAddTask)
|
{
|
var taskNo = new Common().GetMaxNo("TK");
|
var inTask = new LogTask //入库任务
|
{
|
TaskNo = taskNo,
|
Sender = "WMS",
|
Receiver = "WCS",
|
IsSuccess = 1, //是否下发成功 0失败 1成功
|
SendDate = DateTime.Now, //发送时间
|
BackDate = DateTime.Now, //返回时间
|
StartRoadway = "", // 起始巷道
|
StartLocat = "",//起始位置
|
EndLocat = locate.LocatNo,//目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
PalletNo = palletNo,//托盘码
|
IsSend = 1,//是否可再次下发
|
IsCancel = 1,//是否可取消
|
IsFinish = 1,//是否可完成
|
Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务
|
Status = "1",//任务状态0:等待执行1正在执行2执行完成
|
OrderType = "0",//0 入库单 1 出库单 2 盘点单 3 移库单
|
Msg = "入库口到=>>" + locate.LocatNo + "的入库任务", //关键信息
|
|
};
|
Db.Insertable(inTask).ExecuteCommand();
|
var asnNo = "";
|
// 添加托盘绑定表托盘入库任务号 liudl
|
foreach (DataStockDetail stockModel in stockDetail)
|
{
|
var bindModel = Db.Queryable<BllPalletBind>().First(m => m.IsDel == "0" && m.Status == "2"
|
&& m.PalletNo == stockModel.PalletNo && m.ASNNo == stockModel.ASNNo && m.ASNDetailNo == stockModel.ASNDetailNo);
|
if (bindModel != null && string.IsNullOrWhiteSpace(bindModel.TaskNo))
|
{
|
bindModel.TaskNo = taskNo;
|
bindModel.WareHouseNo = locate.WareHouseNo;
|
bindModel.RoadwayNo = locate.RoadwayNo;
|
bindModel.LocatNo = locate.LocatNo;
|
Db.Updateable(bindModel).ExecuteCommand();
|
asnNo = stockModel.ASNNo;
|
}
|
}
|
foreach (DataStockDetail stockModel in stockDetail)
|
{
|
//添加托盘上架记录
|
var upShelf = new BllPalletUpShelf()
|
{
|
TaskNo = inTask.TaskNo,
|
TraceNo = asnNo,
|
PalletNo = palletNo,
|
SkuNo = stockModel.SkuNo,
|
SkuName = stockModel.SkuName,
|
LotNo = stockModel.LotNo,
|
Status = "1",
|
|
WareHouseNo = houseNo,
|
RoadwayNo = locate.RoadwayNo,
|
AreaNo = locate.AreaNo,
|
LocatNo = locate.LocatNo,
|
|
CreateUser = 0,
|
};
|
Db.Insertable(upShelf).ExecuteCommand();
|
}
|
|
oldTaskNo = taskNo;
|
}
|
else
|
{
|
var oldTask = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == oldTaskNo);
|
oldTask.EndLocat = locate.LocatNo;
|
oldTask.EndRoadway = locate.RoadwayNo;
|
if (oldTask.IsSuccess == 0)
|
{
|
oldTask.IsSuccess = 1;
|
oldTask.Status = "1";
|
}
|
Db.Updateable(oldTask).ExecuteCommand();
|
|
|
var bindModelList = Db.Queryable<BllPalletBind>().Where(m => m.IsDel == "0" && m.Status == "2"
|
&& m.PalletNo == oldTask.PalletNo && m.TaskNo == oldTaskNo).ToList();
|
foreach (var bindModel in bindModelList)
|
{
|
if (string.IsNullOrWhiteSpace(bindModel.LocatNo))
|
{
|
bindModel.TaskNo = oldTask.TaskNo;
|
bindModel.WareHouseNo = locate.WareHouseNo;
|
bindModel.RoadwayNo = locate.RoadwayNo;
|
bindModel.LocatNo = locate.LocatNo;
|
Db.Updateable(bindModel).ExecuteCommand();
|
|
}
|
}
|
//更改上架信息
|
var upShelfList = Db.Queryable<BllPalletUpShelf>().Where(m => m.IsDel == "0" && m.TaskNo == oldTask.TaskNo && m.PalletNo == palletNo).ToList();
|
foreach (var upShelf in upShelfList)
|
{
|
upShelf.WareHouseNo = locate.WareHouseNo;
|
upShelf.RoadwayNo = locate.RoadwayNo;
|
upShelf.LocatNo = locate.LocatNo;
|
upShelf.Status = "1";
|
Db.Updateable(upShelf).ExecuteCommand();
|
|
}
|
|
}
|
|
locate.Status = "2";
|
Db.Updateable(locate).ExecuteCommand();
|
|
Db.CommitTran();
|
comDto = new OutCommandDto()
|
{
|
TaskNo = oldTaskNo, // 任务号
|
TaskType = "0",// 任务类型
|
PalletNo = palletNo,//托盘号
|
|
StartRoadway = "",
|
StartLocate = "", // 起始位置
|
EndLocate = locate.LocatNo, // 目标位置
|
EndRoadway = locate.RoadwayNo, // 目标巷道
|
|
Order = 999, //目标地址
|
Type = PLCTypeEnum.ShuttleCar
|
};
|
|
}
|
catch (Exception ex)
|
{
|
Db.RollbackTran();
|
throw new Exception(ex.Message);
|
}
|
#endregion
|
|
|
return comDto;
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
/// <summary>
|
/// agv走出储位修改储位信息,仅限平库储位
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <param name="userId"></param>
|
public void UpLocateByAgvOut(string taskNo, int userId)
|
{
|
try
|
{
|
|
var task = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == taskNo);
|
if (task == null)
|
{
|
throw new Exception("未查询到任务信息");
|
}
|
if (task.Status != "1")
|
{
|
throw new Exception("当前任务已完成");
|
}
|
if (userId != 0)
|
{
|
//添加操作日志记录
|
var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
|
}
|
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.StartLocat);
|
if (locate == null)
|
{
|
throw new Exception($"未查询到任务中的储位信息");
|
}
|
var pingAreaStr = Db.Queryable<SysStorageArea>().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList();
|
var pingLocateInfo = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == locate.LocatNo && pingAreaStr.Contains(m.AreaNo) && m.IsDel == "0");
|
if (pingLocateInfo == null)
|
{
|
throw new Exception("当前任务起始储位不在平库储位");
|
}
|
locate.Status = "0";
|
Db.Updateable(locate).ExecuteCommand();
|
}
|
catch (Exception e)
|
{
|
throw new Exception(e.Message);
|
}
|
}
|
|
/// <summary>
|
/// 入库任务完成JC34
|
/// </summary>
|
/// <param name="taskNo"></param>
|
/// <param name="userId"></param>
|
/// <exception cref="Exception"></exception>
|
public void ArrivalSuccess2(string taskNo, int userId)
|
{
|
try
|
{
|
//正常入库
|
var task = Db.Queryable<LogTask>().First(m => m.IsDel == "0" && m.TaskNo == taskNo);
|
if (task == null)
|
{
|
throw new Exception("未查询到任务信息");
|
}
|
if (task.Status == "2")
|
{
|
throw new Exception("当前任务已完成");
|
}
|
|
var stockDetail = Db.Queryable<DataStockDetail>().Where(m => m.PalletNo == task.PalletNo).ToList();
|
var upShelf = Db.Queryable<BllPalletUpShelf>().First(m => m.TaskNo == taskNo);
|
if (upShelf == null)
|
{
|
throw new Exception("没有找到托盘上架信息");
|
}
|
//当前任务中的储位信息
|
var locate = Db.Queryable<SysStorageLocat>().First(m => m.LocatNo == task.EndLocat);
|
if (locate == null)
|
{
|
throw new Exception($"未查询到任务中的储位信息");
|
}
|
Db.BeginTran();
|
|
task.Status = "2";//任务状态
|
task.IsSend = 0;
|
task.IsCancel = 0;
|
task.IsFinish = 0;
|
task.FinishDate = DateTime.Now;//完成时间
|
Db.Updateable(task).ExecuteCommand();
|
if (userId != 0)
|
{
|
//添加操作日志记录
|
var k = new OperationASNServer().AddLogOperationAsn("入库作业", "入库日志", taskNo, "完成", $"点击完成按钮、完成任务号为:{taskNo}的任务", userId);
|
}
|
|
//判断是否是回流入库完成
|
if (!stockDetail.Any())
|
{
|
throw new Exception("没有查询到库存信息");
|
}
|
|
foreach (var item in stockDetail)
|
{
|
item.WareHouseNo = locate.WareHouseNo;
|
item.RoadwayNo = locate.RoadwayNo;
|
item.AreaNo = locate.AreaNo;
|
item.LocatNo = locate.LocatNo;
|
item.UpdateTime = DateTime.Now;
|
if (userId != 0)
|
{
|
item.UpdateUser = userId;
|
}
|
}
|
upShelf.Status = "2";
|
Db.Updateable(upShelf).ExecuteCommand();
|
|
locate.Status = "1";
|
Db.Updateable(locate).ExecuteCommand();
|
Db.Updateable(stockDetail).ExecuteCommand();
|
Db.CommitTran();
|
|
}
|
catch (Exception e)
|
{
|
Db.RollbackTran();
|
throw new Exception(e.Message);
|
}
|
}
|
|
|
|
|
}
|
}
|