using Model.InterFaceModel;
using Model.ModelDto;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Policy;
using System.Text;
using Utility.Tools;
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.IBllTransServer;
using static Model.InterFaceModel.RCSModel;
namespace WMS.BLL.BllTransServer
{
public class RcsServer:IRcsServer
{
private static readonly SqlSugarScope Db = DataContext.Db;
///
/// RCS叫桶
///
///
///
///
///
public void GetPalletNo(Pallnetmsg model, string url, out string taskNo)
{
try
{
string taskMsg = "";
if (string.IsNullOrEmpty(model.Location))
{
throw new Exception("设备所在位置不可为空");
}
//叫桶设备所在储位信息(目标储位)
var endLoction = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == model.Location);
if (endLoction == null)
{
throw new Exception("设备储位信息不存在");
}
var houseNo = endLoction.WareHouseNo;//叫桶位置,后续根据位置关联或定义,来判断叫桶位置所属车间
var urlMes = "";//回传MES的接口地址
var noticeNo = "0";//出入库单据明细ID
var stockDetail = Db.Queryable().Where(w => w.Status == "0");//所有待分配的桶
//开始事务
Db.BeginTran();
DataStockDetail pallet = new DataStockDetail();
switch (model.Type)
{
case "0"://叫净桶
//查找到该车间净桶区
List areaNoList = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "0" && w.WareHouseNo == houseNo).Select(s=>s.AreaNo).ToList();
//查找净桶
pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "0" && w.Status == "0"
&& areaNoList.Contains(w.AreaNo)).OrderByDescending(o => o.CreateTime).First();
if (pallet == null)
{
throw new Exception("暂无净桶可分配");
}
pallet.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
//更新桶库存明细
Db.Updateable(pallet).ExecuteCommand();
taskMsg = "设备叫净桶任务";
break;
case "1"://叫料桶(混料)
//判断是否有批次号
if (string.IsNullOrWhiteSpace(model.LotNo))
{
throw new Exception("批次号为空!");
}
//查找到该车间预混区
List areaNoList2 = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "1" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
//查找库存中是否有可用的此批次的混料桶
pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "1" && w.Status == "0" && w.LotNo == model.LotNo
&& areaNoList2.Contains(w.AreaNo)).OrderByDescending(o => o.CompleteTime).First();
if (pallet == null)
{
throw new Exception("暂无混料桶可分配");
}
pallet.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
pallet.LotNo = model.LotNo;//批次号
//更新桶库存明细
Db.Updateable(pallet).ExecuteCommand();
taskMsg = "设备叫料桶混料任务";
break;
case "2"://叫料桶(下料)
//判断是否有批次号
if (string.IsNullOrWhiteSpace(model.LotNo))
{
throw new Exception("批次号为空!");
}
//查找是否有此批次出库单明细
var soNoticeDetail = Db.Queryable().Where(w => w.IsDel == "0" && w.LotNo == model.LotNo).OrderBy(o => o.CreateTime).First();
if (soNoticeDetail == null)
{
throw new Exception("该批次没有对应的出库单明细");
}
noticeNo = soNoticeDetail.Id.ToString();
//出库总单
var soNotice = Db.Queryable().Where(w => w.IsDel == "0" && w.SONo == soNoticeDetail.SONo).First();
if (soNotice == null)
{
throw new Exception("该批次没有对应的出库单");
}
soNotice.Status = "3";//正在执行
soNotice.UpdateTime = DateTime.Now;
//更新出库单
Db.Updateable(soNotice).ExecuteCommand();
//查找到该车间半成品区
List areaNoList3 = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "2" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
//查找库存中是否有此批次的合格下料桶
pallet = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "2" && w.Status == "0" && w.LotNo == model.LotNo && w.InspectStatus=="1"
&& areaNoList3.Contains(w.AreaNo)).OrderByDescending(o => o.CompleteTime).First();
if (pallet == null)
{
throw new Exception("暂无下料桶可分配");
}
pallet.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
//更新桶库存明细
Db.Updateable(pallet).ExecuteCommand();
taskMsg = "设备叫料桶下料任务";
break;
case "3"://叫脏桶
//查找到该车间脏桶区
List areaNoList4 = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "3" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
List palletList = stockDetail.Where(w => w.WareHouseNo == houseNo && w.PalletStatus == "3" && w.Status == "0"
&& areaNoList4.Contains(w.AreaNo)).OrderByDescending(o => o.CompleteTime).ToList();
if (palletList.Count <= 0)
{
throw new Exception("暂无脏桶可分配");
}
//遍历库存脏桶,返回MES验证
foreach (var item in palletList)
{
#region 去掉MES
//string jsonReq = JsonConvert.SerializeObject(item.PalletNo);
//var response = HttpHelper.DoPost(urlMes, jsonReq, "回传MES脏桶编号", "RCS").ToString();
//var obj = JsonConvert.DeserializeObject(response);//解析返回数据
//if (obj.Success == "0")
//{
// if (obj.Result != "1")//不可清洗,将脏桶冻结
// {
// item.Status = "5";//异常冻结
// //修改该桶库存状态
// Db.Updateable(item).ExecuteCommand();
// continue;
// }
// //下发小车任务
// var task2 = new TaskDetial
// {
// Startport = item.LocatNo,
// Endport = model.Location,
// Pallno = item.PalletNo,
// Type = model.Type,
// Crtype = "1",
// Noticedetailno = int.Parse(noticeno),
// };
// CreateLotTask(task2);
// return;
//}
//else
//{
// throw new Exception("回传MES净桶编号失败!");
//}
#endregion
item.Status = "2";//分配状态 0:待分配,1:部分分配 , 2:已分配
//更新桶库存明细
Db.Updateable(item).ExecuteCommand();
//起始储位地址信息
var startLoction2 = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == item.LocatNo);
if (startLoction2 == null)
{
throw new Exception($"起始目标储位信息不存在,桶号:{item.LocatNo}");
}
taskNo = new Common().GetMaxNo("TK");//任务号
var logTaskEntry2 = new LogTask
{
TaskNo = taskNo,
Sender = "WMS",
Receiver = "RCS",
//IsSuccess = 1, //是否下发成功 0失败 1成功
SendDate = DateTime.Now, //发送时间
//BackDate = DateTime.Now, //返回时间
StartLocat = item.LocatNo,//起始位置
EndLocat = model.Location,//目标位置
PalletNo = item.PalletNo,//托盘码
IsSend = 1,//是否可再次下发
IsCancel = 1,//是否可取消
IsFinish = 1,//是否可完成
Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务
OrderType = "3",//单据类型 0 入库 1 出库 3其他
Status = "0",//任务状态0:等待执行1正在执行2执行完成
NoticeDetailNo = int.Parse(noticeNo),
Msg = taskMsg, //关键信息
};
//组织下发小车任务信息
var task2 = new TaskDetial
{
Taskno = taskNo,//任务号
Startport = item.LocatNo,
Endport = model.Location,
Pallno = item.PalletNo,
Type = model.Type,
Crtype = "1",
Noticedetailno = int.Parse(noticeNo),
};
CreateLotTask(task2, url);
//给下车下发任务
logTaskEntry2.SendDate = DateTime.Now;//发送时间
var agvResult2 = CreateLotTask(task2, url);
if (agvResult2)//成功
{
//请求成功修改任务表相应字段状态
logTaskEntry2.IsSuccess = 1;
logTaskEntry2.BackDate = DateTime.Now;
logTaskEntry2.Status = "1";
Db.Insertable(logTaskEntry2).ExecuteCommand();
startLoction2.Status = "3";//出库中
Db.Updateable(startLoction2).ExecuteCommand();
endLoction.Status = "2";//入库中
Db.Updateable(endLoction).ExecuteCommand();
}
else//失败
{
logTaskEntry2.IsSuccess = 0;
Db.Insertable(logTaskEntry2).ExecuteCommand();
}
//提交事务
Db.CommitTran();
return;
}
taskMsg = "设备叫脏桶任务";
break;
default:
throw new Exception("任务类型无效");
}
//起始储位地址信息
var startLoction = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == pallet.LocatNo);
if (startLoction == null)
{
throw new Exception($"起始目标储位信息不存在,桶号:{pallet.LocatNo}");
}
taskNo = new Common().GetMaxNo("TK");//任务号
//任务信息
var logTaskEntry = new LogTask
{
TaskNo = taskNo,
Sender = "WMS",
Receiver = "RCS",
//IsSuccess = 1, //是否下发成功 0失败 1成功
SendDate = DateTime.Now, //发送时间
//BackDate = DateTime.Now, //返回时间
StartLocat = pallet.LocatNo,//起始位置
EndLocat = model.Location,//目标位置
PalletNo = pallet.PalletNo,//托盘码
IsSend = 1,//是否可再次下发
IsCancel = 1,//是否可取消
IsFinish = 1,//是否可完成
Type = "1",//任务类型 0 入库任务 1 出库任务 2 移库任务
OrderType = "3",//单据类型 0 入库 1 出库 3其他
Status = "0",//任务状态0:等待执行1正在执行2执行完成
NoticeDetailNo = int.Parse(noticeNo),
Msg = taskMsg, //关键信息
};
//组织下发小车任务信息
var task = new TaskDetial
{
Taskno= taskNo,//任务号
Startport = pallet.LocatNo,//起始位置
Endport = model.Location,//目标位置
Pallno = pallet.PalletNo,//桶号
Crtype = "1",//叫桶
Noticedetailno = int.Parse(noticeNo),
LotNo = model.LotNo,
};
//给下车下发任务
logTaskEntry.SendDate = DateTime.Now;//发送时间
var agvResult = CreateLotTask(task, url);
if (agvResult)//成功
{
//请求成功修改任务表相应字段状态
logTaskEntry.IsSuccess = 1;
logTaskEntry.BackDate = DateTime.Now;
logTaskEntry.Status = "1";
Db.Insertable(logTaskEntry).ExecuteCommand();
startLoction.Status = "3";//出库中
Db.Updateable(startLoction).ExecuteCommand();
endLoction.Status = "2";//入库中
Db.Updateable(endLoction).ExecuteCommand();
}
else//失败
{
logTaskEntry.IsSuccess = 0;
Db.Insertable(logTaskEntry).ExecuteCommand();
}
//提交事务
Db.CommitTran();
}
catch (Exception ex)
{
//回滚事务
Db.RollbackTran();
throw new Exception(ex.Message);
}
}
///
/// 申请储位
///
///
///
///
///
public void ApplyLocatNo(Pallnetmsg model, string url, out string taskNo)
{
try
{
string taskMsg = "";
//设备所在储位信息(起始储位)
var deviceLocatInfo = Db.Queryable().First(w => w.IsDel == "0" && w.LocatNo == model.Location);
if (deviceLocatInfo == null)
{
throw new Exception($"未查询到该设备所在储位信息,Location:{model.Location}");
}
var houseNo = deviceLocatInfo.WareHouseNo;//申请储位设备所在车间编号
var noticeno = "0";//出入库单据明细ID
var storageLocat = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0");
//开启事务
Db.BeginTran();
SysStorageLocat loction = new SysStorageLocat();//目标储位信息
switch (model.Type)
{
case "3"://清洗设备申请储位(净桶申请储位)
//查找到该车间净桶区
List areaNoList = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "0" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
loction = storageLocat.Where(w => w.WareHouseNo == houseNo && areaNoList.Contains(w.AreaNo)).OrderByDescending(o => o.CreateTime).First();
if (loction == null)
{
throw new Exception("该车间净桶区暂无空余储位");
}
taskMsg = "清洗设备(净桶)申请储位任务";
break;
case "0"://接料设备申请储位(预混料桶申请储位)
//判断是否有批次号
if (string.IsNullOrWhiteSpace(model.LotNo))
{
throw new Exception("批次号为空!");
}
//查找到该车间预混区
List areaNoList2 = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "1" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
loction = storageLocat.Where(w => w.WareHouseNo == houseNo && areaNoList2.Contains(w.AreaNo)).OrderByDescending(o => o.CreateTime).First();
if (loction == null)
{
throw new Exception("该车间预混区暂无空余储位");
}
taskMsg = "接料设备(预混料桶)申请储位任务";
break;
case "1"://混料设备申请储位(半成品桶申请储位)
//判断是否有批次号
if (string.IsNullOrWhiteSpace(model.LotNo))
{
throw new Exception("批次号为空!");
}
//校验此批次是否有入库单
var noticeDetail = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.LotNo == model.LotNo).OrderByDescending(o => o.CreateTime).First();
if (noticeDetail == null)
{
throw new Exception("该批次没有对应的入库单明细");
}
noticeno = noticeDetail.Id.ToString();
//入库总单
var notice = Db.Queryable().Where(w => w.IsDel == "0" && w.ASNNo == noticeDetail.ASNNo).First();
if (notice == null)
{
throw new Exception("该批次没有对应的入库单");
}
notice.Status = "1";//正在执行
//更新入库单状态
Db.Updateable(notice).ExecuteCommand();
//查找到该车间半成品区
List areaNoList3 = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "2" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
loction = storageLocat.Where(w => w.WareHouseNo == houseNo && areaNoList3.Contains(w.AreaNo)).OrderByDescending(o => o.CreateTime).First();
if (loction == null)
{
throw new Exception("该车间半成品区暂无空余储位");
}
taskMsg = "接料设备(混料桶)申请储位任务";
break;
case "2"://下料设备申请储位(脏桶申请储位)
//查找到该车间脏桶区
List areaNoList4 = Db.Queryable().Where(w => w.IsDel == "0" && w.Status == "0" && w.Type == "3" && w.WareHouseNo == houseNo).Select(s => s.AreaNo).ToList();
loction = storageLocat.Where(w => w.WareHouseNo == houseNo && areaNoList4.Contains(w.AreaNo)).OrderByDescending(o => o.CreateTime).First();
if (loction == null)
{
throw new Exception("该车间脏桶区暂无空余储位");
}
taskMsg = "下料设备(脏桶)申请储位任务";
break;
}
taskNo = new Common().GetMaxNo("TK");//任务号
//任务信息
var logTaskEntry = new LogTask
{
TaskNo = taskNo,
Sender = "WMS",
Receiver = "RCS",
//IsSuccess = 1, //是否下发成功 0失败 1成功
SendDate = DateTime.Now, //发送时间
//BackDate = DateTime.Now, //返回时间
StartLocat = model.Location,//起始位置
EndLocat = model.Location,//目标位置
PalletNo = model.PalletNo,//桶号
IsSend = 1,//是否可再次下发
IsCancel = 1,//是否可取消
IsFinish = 1,//是否可完成
Type = "0",//任务类型 0 入库任务 1 出库任务 2 移库任务
OrderType = "3",//单据类型 0 入库 1 出库 3其他
Status = "0",//任务状态0:等待执行1正在执行2执行完成
NoticeDetailNo = int.Parse(noticeno),
Msg = taskMsg, //关键信息
};
var task = new TaskDetial
{
Startport = model.Location,
Endport = loction.LocatNo,
Pallno = model.PalletNo,
Type = model.Type,
Crtype = "0",//入库
Noticedetailno = int.Parse(noticeno),
LotNo = model.LotNo,
};
//给下车下发任务
logTaskEntry.SendDate = DateTime.Now;//发送时间
var agvResult = CreateLotTask(task, url);
if (agvResult)//成功
{
//请求成功修改任务表相应字段状态
logTaskEntry.IsSuccess = 1;
logTaskEntry.BackDate = DateTime.Now;
logTaskEntry.Status = "1";
Db.Insertable(logTaskEntry).ExecuteCommand();
deviceLocatInfo.Status = "3";//出库中
Db.Updateable(deviceLocatInfo).ExecuteCommand();
loction.Status = "2";//入库中
Db.Updateable(loction).ExecuteCommand();
}
else//失败
{
logTaskEntry.IsSuccess = 0;
Db.Insertable(logTaskEntry).ExecuteCommand();
}
//提交事务
Db.CommitTran();
}
catch (Exception ex)
{
//回滚事务
Db.RollbackTran();
throw new Exception(ex.Message);
}
}
///
/// MES下发将净桶改为脏桶并拉到脏桶区
///
///
///
public void ChangePalletStatus(string PalletNo,string url)
{
try
{
var detail = Db.Queryable().First(w => w.PalletNo == PalletNo && w.PalletStatus == "0");
if (detail == null)
{
throw new Exception($"库存中不存在桶号为:{PalletNo}的库存!");
}
//起始目标储位信息
var statrtLocat = Db.Queryable().First(w => w.WareHouseNo == detail.WareHouseNo && w.AreaNo == detail.AreaNo && w.LocatNo == detail.LocatNo);
if (statrtLocat == null)
{
throw new Exception($"该桶所在的储位信息不存在!");
}
//开启事务
Db.BeginTran();
//查找是否有空余脏桶位
var endLocat = Db.Queryable().First(w => w.WareHouseNo == detail.WareHouseNo && w.AreaNo.Contains("04") && w.Status == "0" && w.Flag=="0");
if (endLocat == null)
{
detail.Status = "5";//异常锁定
detail.PalletStatus = "3";//脏桶
//修改库存状态
Db.Updateable(detail).ExecuteCommand();
}
else
{
//生成调度小车净桶去脏桶区任务
var ztask = new TaskDetial
{
Startport = detail.LocatNo,
Endport = endLocat.LocatNo,
Pallno = PalletNo,
Type = "3",
Crtype = "2",
Noticedetailno = 0,
};
string taskNo = "";
CreateLotTask(ztask, url);
statrtLocat.Status = "3";//出库中
//修改起始储位状态
Db.Updateable(statrtLocat).ExecuteCommand();
detail.Status = "5";//异常锁定
detail.PalletStatus = "3";//脏桶
//修改库存状态
Db.Updateable(detail).ExecuteCommand();
}
Db.CommitTran();
}
catch (Exception ex)
{
Db.RollbackTran();
throw ex;
}
}
///
/// MES下发清洗锁定脏桶
///
///
public void CleanPallet(Pallnetmsg pallnetmsg,string url)
{
try
{
var detail = Db.Queryable().First(w => w.PalletNo == pallnetmsg.PalletNo && w.PalletStatus == "3");
if (detail == null)
{
throw new Exception($"库存中不存在桶号为:{pallnetmsg.PalletNo}的库存!");
}
//下发小车任务
var task = new TaskDetial
{
Startport = detail.LocatNo,
Endport = pallnetmsg.Location,
Pallno = detail.PalletNo,
Type = "3",
Crtype = "1",
Noticedetailno = 0,
LotNo = "",
};
string taskNo = "";
CreateLotTask(task,url);
}
catch (Exception ex)
{
throw ex;
}
}
///
/// 生成任务单到LogTask
///
///
///
public bool CreateLotTask(TaskDetial taskDetial,string url)
{
bool result = false;
#region 呼叫小车代码
List agvTaskList = new List();
List pahtList = new List();
//起始位置
PositionCodePath path1 = new PositionCodePath();
path1.positionCode = taskDetial.Startport;
if (taskDetial.Crtype == "1")//叫桶(桶出库)
{
path1.type = "05";
}
else//申请储位(桶入库)
{
path1.type = "05";
}
pahtList.Add(path1);
//目标位置
PositionCodePath path2 = new PositionCodePath();
path2.positionCode = taskDetial.Endport;
if (taskDetial.Crtype == "1")//叫桶(桶出库)
{
path2.type = "05";
}
else//申请储位(桶入库)
{
path2.type = "05";
}
pahtList.Add(path2);
//下车任务单
AgvSchedulingTask agvTask = new AgvSchedulingTask();
agvTask.reqCode = taskDetial.Taskno;//请求编号
agvTask.taskCode= taskDetial.Taskno;//任务号
agvTask.ctnrCode = taskDetial.Pallno;//桶号
agvTask.ctnrTyp = "1";
agvTask.reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");//请求时间
agvTask.wbCode = "";
agvTask.positionCodePath = pahtList;//小车路径
agvTask.podCode = "";
agvTask.userCallCode = "";//taskDetial.Endport;//目标位置
if (taskDetial.Crtype == "1")//叫桶(桶出库)
{
agvTask.taskTyp = "Z3";//任务类型 线边到托盘收集器 Z1, 托盘垛申请入库 Z2
}
else//申请储位(桶入库)
{
agvTask.taskTyp = "Z4";//任务类型 线边到托盘收集器 Z1, 托盘垛申请入库 Z2
}
agvTaskList.Add(agvTask);
// 正式运行程序放开
var list2 = agvTaskList.Select(m => m.reqCode).ToList();
var jsonData = JsonConvert.SerializeObject(agvTaskList);
jsonData = jsonData.Substring(1);
jsonData = jsonData.Substring(0, jsonData.Length - 1);
string response = HttpHelper.DoPost(url, jsonData, "下发给AGV转运命令", "AGV");
//解析返回数据
var agvModel = JsonConvert.DeserializeObject(response);
if (agvModel.Code == "0")
{
result = true;//给下车下发任务成功
}
else
{
string logMsg = "";
if (taskDetial.Crtype == "1")//叫桶(桶出库)
{
logMsg = "申请叫桶";
}
else if(taskDetial.Crtype == "0")//申请储位(桶入库)
{
logMsg = "申请储位";
}
var logStr = $@".\log\AGV\AGV{logMsg}" + DateTime.Now.ToString("yyyyMMdd") + ".txt";
LogFile.SaveLogToFile($"AGV{logMsg}异常:( {agvModel.Message} ),", logStr);
}
return result;
#endregion
}
///
/// 任务完成
///
///
///
///
public void RCSFinishTask(string TaskNo, string Status)
{
try
{
#region 条件判断
var resultModel = new ErpModel() { Success = -1, Message = "" };
if (string.IsNullOrEmpty(TaskNo))
{
throw new Exception("任务号不可为空");
}
//任务信息
var taskInfo = Db.Queryable().First(w => w.TaskNo == TaskNo);
if (taskInfo == null)
{
throw new Exception($"任务号为:{TaskNo}的任务不存在!");
}
if (taskInfo.Status != "1")
{
throw new Exception($"任务号为:{TaskNo}的任务状态异常");
}
#endregion
//开启事务
Db.BeginTran();
var comTime = DateTime.Now;
if (Status == "0")
{
taskInfo.Status = "3";//异常结束
//修改任务状态
Db.Updateable(taskInfo).ExecuteCommand();
resultModel.Success = 0;
resultModel.Message = "成功";
//提交事务
Db.CommitTran();
return;
}
//库存明细
var stockDetail = Db.Queryable().First(w => w.PalletNo == taskInfo.PalletNo);
if (stockDetail == null)
{
throw new Exception($"桶库存信息不存在");
}
//起始储位信息
var startLocatInfo = Db.Queryable().First(w => w.LocatNo == taskInfo.StartLocat && w.IsDel == "0");
if (startLocatInfo == null)
{
throw new Exception($"起始储位信息不存在");
}
startLocatInfo.Status = "0";//空储位
//修改起始储位状态
Db.Updateable(startLocatInfo).ExecuteCommand();
//目标储位信息
var endLocatInfo = Db.Queryable().First(w => w.LocatNo == taskInfo.EndLocat && w.IsDel == "0");
if (endLocatInfo == null)
{
throw new Exception($"目标储位信息不存在");
}
endLocatInfo.Status = "1";//有物品
//修改目标储位状态
Db.Updateable(endLocatInfo).ExecuteCommand();
//目标储位所属区域
var endAreaInfo = Db.Queryable().First(w => w.IsDel == "0" && w.WareHouseNo == endLocatInfo.WareHouseNo && w.AreaNo == endLocatInfo.AreaNo);
if (endAreaInfo == null)
{
throw new Exception($"目标储位所属区域信息不存在");
}
stockDetail.WareHouseNo = endLocatInfo.WareHouseNo;//所属仓库
stockDetail.RoadwayNo = endLocatInfo.RoadwayNo;//所属巷道
stockDetail.AreaNo = endLocatInfo.AreaNo;//所属区域
stockDetail.LocatNo = endLocatInfo.LocatNo;//储位地址
if (endAreaInfo.Type=="0")//洁净区
{
stockDetail.PalletStatus = "0";
stockDetail.Status = "0";//待分配
}
else if (endAreaInfo.Type == "1")//预混区
{
stockDetail.PalletStatus = "1";
stockDetail.Status = "0";//待分配
}
else if (endAreaInfo.Type == "2")//半成品区
{
stockDetail.PalletStatus = "2";
stockDetail.Status = "0";//待分配
}
else if (endAreaInfo.Type == "3")//脏桶区
{
stockDetail.PalletStatus = "3";
stockDetail.LotNo = "";//批次
stockDetail.SkuNo = "";
stockDetail.SkuName = "";
stockDetail.Status = "0";//待分配
stockDetail.InspectStatus = "0";//待检验
}
//修改库存明细
Db.Updateable(stockDetail).ExecuteCommand();
//入库任务,处理入库单
if (taskInfo.Type == "0" && taskInfo.NoticeDetailNo!=0)
{
var notice = Db.Queryable().First(w => w.IsDel == "0" && w.Status == "1");
if (notice != null)
{
notice.Status = "2";//执行完成
notice.UpdateTime = DateTime.Now;
notice.CompleteTime = DateTime.Now;
//修改入库单状态
Db.Updateable(notice).ExecuteCommand();
}
}
//出库任务,处理出库单
if (taskInfo.Type == "1" && taskInfo.NoticeDetailNo != 0)//入库
{
var notice = Db.Queryable().First(w => w.IsDel == "0" && w.Status == "3");
if (notice != null)
{
notice.Status = "4";//执行完成
notice.UpdateTime = DateTime.Now;
notice.CompleteTime = DateTime.Now;
//修改入库单状态
Db.Updateable(notice).ExecuteCommand();
}
}
#region 去掉MES
//回传桶状态给MES
//BackPalletStatus(taskInfo.PalletNo, sd3.PalletStatus);
#endregion
taskInfo.Status = "2";//执行完成
//修改任务状态
Db.Updateable(taskInfo).ExecuteCommand();
//提交事务
Db.CommitTran();
}
catch (Exception ex)
{
//回滚事务
Db.RollbackTran();
throw new Exception(ex.Message);
}
}
}
}