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 upShelfOld = Db.Queryable().First(m => m.IsDel == "0" && m.PalletNo == palletNo && (m.Status == "0" || m.Status == "1"));
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("成品物料请入成品库");
}
}
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()
{
PalletNo = palletNo,//托盘号
StartRoadway = beingTask.StartRoadway, // 起始巷道
StartLocate = beingTask.StartLocat, // 起始位置
EndLocate = beingTask.EndLocat, // 目标位置
EndRoadway = beingTask.EndRoadway, // 目标巷道
TaskNo = beingTask.TaskNo, // 任务号
TaskType = "0",// 任务类型 (出库)
OutMode = "", //目标地址
Order = 1
};
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("当前托盘没有在平库储位上,请核实");
}
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 exTask = 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(exTask).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 = exTask.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()
{
PalletNo = palletNo,//托盘号
StartRoadway = "",
StartLocate = starLocate, // 起始位置
EndLocate = locate.LocatNo, // 目标位置
EndRoadway = locate.RoadwayNo, // 目标巷道
TaskNo = taskNo, // 任务号
TaskType = "0",// 任务类型 (出库)
OutMode = "", //目标地址
Order = 1,
Type = PLCTypeEnum.AGV
};
}
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)
{
throw new Exception(e.Message);
}
}
}
}