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() { }
///
/// 申请储位 (立体库)
///
///
///
///
///
///
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().First(a => a.WareHouseNo == houseNo);//获取仓库类型
//验证是否为立体库入库
if (houseType.Type != "1")
{
throw new Exception("仓库类型错误,请选择立体库仓库");
}
OutCommandDto comDto;//返回wcs的入库命令
var stock = Db.Queryable().First(a => a.PalletNo == palletNo);//托盘信息
//判断托盘条码是否有效
if (stock == null)
throw new Exception("托盘条码不受WMS管理,不可入库!");
#region
var skuList = Db.Queryable().Where(m => m.IsDel == "0").ToList();
//物料类别信息
var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList();
var skuNo = ""; //入库物料
var starLocate = ""; // 起始储位
var stockDetail = Db.Queryable().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().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().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().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList();
var pingLocateInfo = Db.Queryable().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().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().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO");
#region 托盘回库规则
if (function != null)
{
//拣货完成后允许托盘回库
if (function.SetValue == "CompletePick")
{
var allot = Db.Queryable().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();
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().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);
}
}
///
/// 申请巷道(密集库)
///
///
///
///
///
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().First(a => a.WareHouseNo == houseNo);
//验证是否为密集库
if (houseType.Type != "3")
{
throw new Exception("仓库不是密集库");
}
var stock = Db.Queryable().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().Where(m => m.IsDel == "0").ToList();
//物料类别信息
var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList();
//托盘库存信息
var stockDetail = Db.Queryable().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().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
if (upShelfOld != null) //正常入库
{
var beingTask = Db.Queryable().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().First(a => a.IsDel == "0"&& a.FunSetNo == "Fun041" && a.IsEnable == "NO");
if (function != null)
{
//拣货完成后允许托盘回库
var allot = Db.Queryable().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().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().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();
foreach (var item in areaStr)
{
areaList.Add(item);
}
//巷道组信息
var roadList = Db.Queryable().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().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);
}
}
///
/// 1 申请储位 (申请巷道后 再申请储位储位 )
///
///
///
///
///
///
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().First(a => a.WareHouseNo == houseNo);
//验证是否为密集库
if (houseType.Type != "3")
{
throw new Exception("仓库不是密集库");
}
var stock = Db.Queryable().First(a => a.PalletNo == palletNo);//托盘信息
//判断托盘条码是否有效
if (stock == null)
{
throw new Exception("托盘条码不受WMS管理,不可入库!");
}
#endregion
OutCommandDto comDto;//返回wcs的入库命令
#region
//查询托盘绑定信息(状态为等待入库的)
var skuList = Db.Queryable().Where(m => m.IsDel == "0").ToList();
//物料类别信息
var skuCategoryList = Db.Queryable().Where(m => m.IsDel == "0").ToList();
var skuNo = "";//入库物料
var isAddTask = true; //是否添加新任务
var oldTaskNo = ""; //旧任务号
var stockDetail = Db.Queryable().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().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
if (upShelfOld != null) //有上架入库信息
{
var beingTask = Db.Queryable().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().First(a => a.IsDel == "0" && a.FunSetName == "托盘回库验证" && a.IsEnable == "NO");
#region 托盘回库规则
if (function != null)
{
//拣货完成后允许托盘回库
if (function.SetValue == "CompletePick")
{
var allot = Db.Queryable().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();
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().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().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().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().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);
}
}
///
/// agv走出储位修改储位信息,仅限平库储位
///
///
///
public void UpLocateByAgvOut(string taskNo, int userId)
{
try
{
var task = Db.Queryable().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().First(m => m.LocatNo == task.StartLocat);
if (locate == null)
{
throw new Exception($"未查询到任务中的储位信息");
}
var pingAreaStr = Db.Queryable().Where(m => m.IsDel == "0" && m.WareHouseNo == "W04" && m.AreaNo != "B06" && m.AreaNo != "B07").Select(m => m.AreaNo).ToList();
var pingLocateInfo = Db.Queryable().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);
}
}
///
/// 入库任务完成JC34
///
///
///
///
public void ArrivalSuccess2(string taskNo, int userId)
{
try
{
//正常入库
var task = Db.Queryable().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().Where(m => m.PalletNo == task.PalletNo).ToList();
var upShelf = Db.Queryable().First(m => m.TaskNo == taskNo);
if (upShelf == null)
{
throw new Exception("没有找到托盘上架信息");
}
//当前任务中的储位信息
var locate = Db.Queryable().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);
}
}
}
}