using HanHe.Message;
|
using HH.WCS.Mobox3.ZhongCeJinTan.dispatch;
|
using HH.WCS.ZhongCeJinTan.api;
|
using HH.WCS.ZhongCeJinTan.process;
|
using HH.WCS.ZhongCeJinTan.util;
|
using HH.WCS.ZhongCeJinTan.wms;
|
using Newtonsoft.Json;
|
using S7.Net.Types;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Reflection;
|
using System.Text;
|
using System.Threading.Tasks;
|
using System.Web.Services.Description;
|
using static HH.WCS.ZhongCeJinTan.api.ApiModel;
|
using static HH.WCS.ZhongCeJinTan.wms.WcsModel;
|
|
namespace HH.WCS.ZhongCeJinTan.dispatch
|
{
|
/// <summary>
|
/// wcs任务相关
|
/// </summary>
|
internal class WcsTask
|
{
|
private static readonly HttpHelper apiHelper = new HttpHelper();
|
private static readonly string baseUrl = Settings.WcsApiAddres;
|
|
|
/// <summary>
|
/// 生成任务
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <returns></returns>
|
public static bool WcsTaskEntity(WMSTask mst, CntrItemRel Item = null)
|
{
|
string Type = "";
|
string TrayType = "";
|
string Traycode = mst.S_CNTR_CODE;
|
var isFu = "0";
|
|
var cntr = ContainerHelper.GetCntr(Traycode);
|
|
if (cntr!=null)
|
{
|
if (cntr.N_DETAIL_COUNT>0)
|
{
|
isFu = "1";
|
}
|
}
|
var workFlow = TaskHelper.selectWorkFlowByType(mst.N_TYPE.ToString(), mst.TOOLSTYPE);
|
|
|
|
if (workFlow != null)
|
{
|
if (workFlow.INOROUT.Contains("入库"))
|
{
|
Type = "1";
|
}
|
|
if (workFlow.INOROUT.Contains("出库"))
|
{
|
Type = "2";
|
}
|
}
|
|
if (mst.S_CNTR_CODE.Contains("KJZ"))
|
{
|
TrayType = "KJZ";
|
}
|
|
var interact = new
|
{
|
requestPk = mst.S_CODE,//任务号
|
contNo = Traycode,//托盘号
|
contType = TrayType,//托盘类型
|
trkType = Type,//任务类型
|
trkPrty = mst.N_PRIORITY,//任务优先级
|
frmPos = mst.S_START_LOC,//起始位置
|
toPos = mst.S_END_LOC,//目的地
|
isFull = isFu,//空托 满托
|
groupNo = Item?.S_ITEM_NAME,//搬送组号
|
clientCode = "WMS",//操作人
|
operationTime = DateTime.Now.ToString()//操作时间
|
};
|
LogHelper.Info("Wcs立库下发任务 地址信息:" + baseUrl + "receive", "立库下发任务");
|
LogHelper.Info("Wcs立库下发任务 参数信息:" + JsonConvert.SerializeObject(interact), "立库下发任务");
|
var result = apiHelper.Post(baseUrl + "receive", JsonConvert.SerializeObject(interact));
|
LogHelper.Info("Wcs立库下发任务 返回信息:" + JsonConvert.SerializeObject(result), "立库下发任务");
|
if (!string.IsNullOrEmpty(result))
|
{
|
var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
|
if (res.code == "0")
|
{
|
TaskHelper.UpdateStatus(mst, "已推送");
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
else
|
{
|
LogHelper.Info("Wcs立库下发任务 返回信息为空", "立库下发任务");
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// 取消任务
|
/// </summary>
|
/// <returns></returns>
|
public static bool WcsCancellTask(WMSTask mst)
|
{
|
var interact = new
|
{
|
requestPk = mst.S_CODE,//请求pk
|
contNo = mst.S_CNTR_CODE,//托盘号
|
clientCode = "",
|
reqTime = DateTime.Now.ToString()//操作时间
|
};
|
LogHelper.Info("Wcs立库取消任务 地址信息:" + baseUrl + "cancel", "立库取消任务");
|
LogHelper.Info("Wcs立库取消任务 参数信息:" + JsonConvert.SerializeObject(interact), "立库取消任务");
|
var result = apiHelper.Post(baseUrl + "cancel", JsonConvert.SerializeObject(interact));
|
LogHelper.Info("Wcs立库取消任务 返回信息:" + JsonConvert.SerializeObject(result), "立库取消任务");
|
if (!string.IsNullOrEmpty(result))
|
{
|
var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
|
if (res.code == "0")
|
{
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
else {
|
LogHelper.Info("Wcs立库取消任务 返回信息为空", "立库取消任务");
|
return false;
|
}
|
}
|
|
|
|
|
/// <summary>
|
/// 输送线是否有货查询
|
/// </summary>
|
/// <returns></returns>
|
public static bool WcsCvstate(WMSTask aloneWcsTask)
|
{
|
|
if (!aloneWcsTask.S_TYPE.Contains("出库"))
|
{
|
return false;
|
}
|
var safety = Settings.safetyLocations.Where(a => a.Area.Contains(aloneWcsTask.S_START_AREA)).FirstOrDefault();
|
|
if (safety==null)
|
{
|
return false;
|
}
|
|
if (safety.type!=1)
|
{
|
return false;
|
}
|
|
var interact = new
|
{
|
requestPk = aloneWcsTask.S_CODE,//请求编号
|
clientCode = "WMS",// 操作人 如WMS/MES等
|
stnNo = aloneWcsTask.S_START_LOC,//接驳位
|
reqTime = DateTime.Now.ToString()//操作时间
|
};
|
LogHelper.Info("Wcs立库输送线是否有货 地址信息:" + baseUrl + "CV-state", "立库");
|
LogHelper.Info("Wcs立库输送线是否有货 参数信息:" + JsonConvert.SerializeObject(interact), "立库");
|
var result = apiHelper.Post(baseUrl + "CV-state", JsonConvert.SerializeObject(interact));
|
LogHelper.Info("Wcs立库输送线是否有货 返回信息:" + JsonConvert.SerializeObject(result), "立库");
|
if (!string.IsNullOrEmpty(result))
|
{
|
var res = JsonConvert.DeserializeObject<WcsTaskReturn>(result);
|
if (res.status == "1")
|
{
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
else
|
{
|
LogHelper.Info("Wcs立库输送线是否有货 返回信息为空", "立库");
|
return false;
|
}
|
}
|
|
/// <summary>
|
/// Wcs任务下发
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
internal static WcsWarningReurn ZcWcsInWorkArea(WcsOperateTaskParme1 model)
|
{
|
var result = new WcsWarningReurn();
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
|
var taskNo = "";
|
|
if (string.IsNullOrEmpty(model.requestPk))
|
{
|
LogHelper.Info("任务号为空", "Wcs下发任务");
|
throw new Exception("任务号为空");
|
}
|
else
|
{
|
taskNo = model.requestPk;
|
}
|
|
|
if (model.noticeType == "0" || model.noticeType == "6")
|
{
|
if (string.IsNullOrEmpty(model.contNo) )
|
{
|
LogHelper.Info("contNo和curPos不能为空", "Wcs下发任务");
|
throw new Exception("contNo和curPos不能为空");
|
}
|
}
|
|
if (string.IsNullOrEmpty(model.curPos))
|
{
|
LogHelper.Info("curPos不能为空", "Wcs下发任务");
|
throw new Exception("curPos不能为空");
|
}
|
|
|
|
if (addWcsTask(model))
|
{
|
result.msg = "Wcs下发任务成功";
|
result.code = "0";
|
}
|
else {
|
result.msg = "Wcs下发任务失败";
|
result.code = "1";
|
}
|
return result;
|
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
result.msg = ex.Message;
|
result.code = "1";
|
LogHelper.Info("Wcs下发任务异常" + ex.Message, "Wcs下发任务");
|
return result;
|
}
|
|
}
|
/// <summary>
|
/// Wcs满托入和空托出
|
/// </summary>
|
internal static bool addWcsTask(WcsOperateTaskParme1 model)
|
{
|
//作业流程
|
WorkFlow workFlow =null;
|
|
|
|
var item = new MesReturnItem();
|
|
switch (model.noticeType)
|
{
|
//满托入
|
case "0":
|
var url = Settings.MesGetItemApi;
|
var interact = new
|
{
|
tagno = model.contNo//托盘RFID芯片编号
|
};
|
LogHelper.Info("Mes获取物料 地址信息:" + url, "Wcs下发任务");
|
LogHelper.Info("Mes获取物料 参数信息:" + JsonConvert.SerializeObject(interact), "Wcs下发任务");
|
var res = apiHelper.Post(url, JsonConvert.SerializeObject(interact));
|
LogHelper.Info("Mes获取物料 返回信息:" + JsonConvert.SerializeObject(res), "Wcs下发任务");
|
if (!string.IsNullOrEmpty(res))
|
{
|
var res1 = JsonConvert.DeserializeObject<MesReturn>(res);
|
if (res1.flag)
|
{
|
if (res1.obj.Count > 0)
|
{
|
item = res1.obj[0];
|
}
|
else {
|
LogHelper.Info("Mes获取物料 返回List错误", "Wcs下发任务");
|
throw new Exception("Mes获取物料 返回List错误");
|
}
|
}
|
else
|
{
|
LogHelper.Info("Mes获取物料 返回失败" + res1.message, "Wcs下发任务");
|
throw new Exception("Mes获取物料 返回失败" + res1.message);
|
}
|
|
}
|
else
|
{
|
LogHelper.Info("Mes获取物料 返回信息为空", "Wcs下发任务");
|
throw new Exception("Mes获取物料 返回信息为空");
|
}
|
|
//查找起点
|
var start1 = LocationHelper.GetLoc(model.curPos);
|
LogHelper.Info($"ZcWcsInWorkArea入库任务下发起点信息" + JsonConvert.SerializeObject(start1), "Wcs下发任务");
|
|
|
if (start1 == null || start1.S_LOCK_STATE != "无")
|
{
|
LogHelper.Info($"ZcWcsInWorkArea入库任务下发失败,起点:{model.curPos},没找到或有锁", "Wcs下发任务");
|
throw new Exception($"起点:{model.curPos},没找到或有锁");
|
}
|
|
|
workFlow = TaskHelper.selectWorkFlowByStratArea(model.noticeType, start1.S_AREA_CODE);
|
|
if (workFlow == null)
|
{
|
LogHelper.Info($"ZCSendTask入库任务下发失败,noticeType:{model.noticeType},没找到对应作业流程", "Wcs下发任务");
|
throw new Exception($"noticeType:{model.noticeType},没找到对应作业流程");
|
}
|
else
|
{
|
LogHelper.Info($"入库作业流程信息" + JsonConvert.SerializeObject(workFlow), "Wcs下发任务");
|
}
|
|
|
|
//查找终点
|
var endList1 = LocationHelper.GetAllLocList1(workFlow.ENDAREA);
|
|
|
if (string.IsNullOrEmpty(model.code))
|
{
|
LogHelper.Info($"ZcWcsInWorkArea入库任务下发失败,code为空", "Wcs下发任务");
|
throw new Exception($"code为空");
|
}
|
|
Location end1 = null;
|
|
//rfid异常,去异常库区
|
if (model.code == "1" || model.contNo == "99")
|
{
|
var endList2 = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
|
end1 = LocationHelper.FindEndcolByLoc(endList2, workFlow.ERRORAREA);
|
LogHelper.Info($"ZcWcsInWorkArea一段任务入异常库区终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务");
|
if (end1 == null)
|
{
|
LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs下发任务");
|
throw new Exception($"终点库区{workFlow.ERRORAREA},没找到终点");
|
}
|
}
|
else {
|
end1 = LocationHelper.FindEndcolByLoc(endList1, workFlow.ENDAREA);
|
LogHelper.Info($"ZcWcsInWorkArea一段任务入三层货架终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务");
|
if (end1 == null)
|
{
|
LogHelper.Info($"ZcWcsInWorkArea任务下发失败,终点库区{workFlow.ENDAREA},没找到终点", "Wcs下发任务");
|
throw new Exception($"终点库区{workFlow.ENDAREA},没找到终点");
|
}
|
}
|
|
|
LogHelper.Info($"ZcWcsInWorkArea任务下发终点信息" + JsonConvert.SerializeObject(end1), "Wcs下发任务");
|
|
|
|
|
|
//添加托盘 异常托盘不添加
|
if (!(model.code == "1" || model.contNo == "99")) {
|
|
//添加托盘物料关联表
|
|
CntrItemRel rel = new CntrItemRel();
|
|
rel.S_CNTR_CODE = model.contNo;
|
rel.PRODUCTIONDATE = DateTime.Parse(item.wrkdatetime);
|
rel.S_ITEM_CODE = item.recipe;
|
rel.F_SUM_QTY = item.zl;
|
rel.TurnCardNum = item.tmh;
|
rel.facnm = item.facnm;
|
rel.cdrub = item.cdrub;
|
rel.mchid = item.mchid;
|
rel.wdate = item.wdate;
|
rel.wsht = item.wsht;
|
rel.strbat = item.strbat;
|
rel.endbat = item.endbat;
|
rel.planno = item.planno;
|
rel.stage = item.stage;
|
rel.grd = item.grd;
|
|
ContainerHelper.CreateCntrItem(rel);
|
|
|
Container cntr1 = new Container();
|
cntr1.S_CODE = model.contNo;
|
cntr1.C_ENABLE = "Y";
|
cntr1.N_DETAIL_COUNT = 1;
|
cntr1.S_TYPE = "";
|
ContainerHelper.CreateCntr(cntr1);
|
}
|
|
|
//起点终点查找成功,创建作业
|
|
var taskType1 = int.Parse(workFlow.FLOWCODE);
|
|
var operation1 = new WmsWork
|
{
|
// 作业号
|
S_CODE = model.requestPk,
|
// 作业类型
|
N_TYPE = taskType1,
|
// 作业类型
|
S_TYPE = workFlow.FLOWNAME,
|
// 起点货位
|
S_START_LOC = start1.S_CODE,
|
// 起点库区编码
|
S_START_AREA = start1.S_AREA_CODE,
|
//接驳位
|
CONNECTION = "",
|
// 终点货位
|
S_END_LOC = end1.S_CODE,
|
// 终点库区编码
|
S_END_AREA = end1.S_AREA_CODE,
|
// 容器编码
|
S_CNTR_CODE = model.contNo,
|
// 作业定义名称
|
S_OP_DEF_NAME = workFlow.FLOWNAME,
|
//优先级
|
N_PRIORITY = 1,
|
//工装类型
|
TOOLSTYPE = "",
|
//起点库区名称
|
S_START_AREA_NAME = start1.S_AREA_Name,
|
//终点库区名称
|
S_END_AREA_NAME= end1.S_AREA_Name,
|
//接驳位库区名称
|
CONNECTION_AREA = ""
|
};
|
|
//创建作业
|
if (WMSHelper.CreateWmsWork(operation1))
|
{
|
LogHelper.Info($"ZcWcsInWorkArea入库作业创建成功{operation1.S_CODE}", "Wcs下发任务");
|
return true;
|
}
|
|
break;
|
//空托出
|
case "5":
|
//查找给定终点
|
var end = LocationHelper.GetLoc(model.curPos);
|
LogHelper.Info($"ZcWcsInWorkArea出库任务下发终点信息" + JsonConvert.SerializeObject(end), "Wcs下发任务");
|
|
|
if (end == null || end.S_LOCK_STATE != "无")
|
{
|
LogHelper.Info($"ZcWcsInWorkArea出库任务下发失败,终点:{model.curPos},没找到或有锁", "Wcs下发任务");
|
throw new Exception($"终点:{model.curPos},没找到或有锁");
|
}
|
|
workFlow = TaskHelper.selectWorkFlowByType(model.noticeType);
|
|
if (workFlow == null)
|
{
|
LogHelper.Info($"ZCSendTask出库任务下发失败,noticeType:{model.noticeType},没找到对应作业流程", "Wcs下发任务");
|
throw new Exception($"noticeType:{model.noticeType},没找到对应作业流程");
|
}
|
else
|
{
|
LogHelper.Info($"出库作业流程信息" + JsonConvert.SerializeObject(workFlow), "Wcs下发任务");
|
}
|
|
|
//查找起点
|
var strrtList = LocationHelper.GetAllLocList2(workFlow.STARTAREA);
|
Location start = null;
|
|
//寻找货架空托,优先空托
|
start = LocationHelper.FindStartcolByHjArea(strrtList, workFlow.STARTAREA);
|
LogHelper.Info($"ZcWcsInWorkArea出库任务下发空托起点信息" + JsonConvert.SerializeObject(start), "Wcs下发任务");
|
|
//没有空托找空架子
|
if (start == null) {
|
start = LocationHelper.FindStartcolByHjAreaKjz(strrtList, workFlow.STARTAREA);
|
}
|
LogHelper.Info($"ZcWcsInWorkArea出库任务下发空架子起点信息" + JsonConvert.SerializeObject(start), "Wcs下发任务");
|
if (start == null)
|
{
|
LogHelper.Info($"ZcWcsInWorkArea出库任务下发失败,起点库区{workFlow.STARTAREA},没找到起点", "Wcs下发任务");
|
throw new Exception($"起点库区{workFlow.STARTAREA},没找到起点");
|
}
|
|
//获取托盘码
|
var cntrCode = LocationHelper.GetLocCntrCode(start.S_CODE);
|
|
//起点终点查找成功,创建作业
|
|
var taskType = int.Parse(workFlow.FLOWCODE);
|
|
var operation = new WmsWork
|
{
|
// 作业号
|
S_CODE = model.requestPk,
|
// 作业类型
|
N_TYPE = taskType,
|
// 作业类型
|
S_TYPE = workFlow.FLOWNAME,
|
// 起点货位
|
S_START_LOC = start.S_CODE,
|
// 起点库区编码
|
S_START_AREA = start.S_AREA_CODE,
|
//接驳位
|
CONNECTION = "",
|
// 终点货位
|
S_END_LOC = end.S_CODE,
|
// 终点库区编码
|
S_END_AREA = end.S_AREA_CODE,
|
// 容器编码
|
S_CNTR_CODE = cntrCode,
|
// 作业定义名称
|
S_OP_DEF_NAME = workFlow.FLOWNAME,
|
//优先级
|
N_PRIORITY = 1,
|
//工装类型
|
TOOLSTYPE = "" ,
|
//起点库区名称
|
S_START_AREA_NAME = start.S_AREA_Name,
|
//终点库区名称
|
S_END_AREA_NAME = end.S_AREA_Name,
|
//接驳位库区名称
|
CONNECTION_AREA = ""
|
};
|
|
//创建作业
|
if (WMSHelper.CreateWmsWork(operation))
|
{
|
LogHelper.Info($"ZcWcsInWorkArea出库作业创建成功{operation.S_CODE}", "Wcs下发任务");
|
return true;
|
}
|
|
break;
|
//空拖入
|
case "6":
|
break;
|
//空架子入
|
case "7":
|
|
break;
|
default:
|
break;
|
}
|
|
|
return false;
|
}
|
|
|
///// <summary>
|
/// Wcs任务执行通知
|
/// </summary>
|
internal static WcsWarningReurn WcsOperateTask(WcsOperateTaskParme model) {
|
var result = new WcsWarningReurn();
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
|
var taskNo = "";
|
|
if (string.IsNullOrEmpty(model.requestPk))
|
{
|
LogHelper.Info("任务号为空", "Wcs任务执行通知");
|
throw new Exception("任务号为空");
|
}
|
else
|
{
|
taskNo = model.requestPk;
|
}
|
var transportTask = newDb.Queryable<WMSTask>().Where(e => e.S_CODE == taskNo)?.First();
|
|
if (transportTask == null)
|
{
|
LogHelper.Info($"未查询到{taskNo}对应的任务", "Wcs任务执行通知");
|
throw new Exception("未查询到对应的任务");
|
}
|
|
TaskHelper.WcsAddActionRecord(model.requestPk, model.noticeType, "WCS");
|
|
switch (model.noticeType)
|
{
|
//任务开始
|
case "1":
|
LogHelper.Info($"任务{taskNo}开始", "Wcs任务执行通知");
|
TaskHelper.Begin(transportTask);
|
break;
|
//任务完成
|
case "2":
|
LogHelper.Info($"任务{taskNo}完成", "Wcs任务执行通知");
|
LocationHelper.UnLockLoc(transportTask.S_START_LOC);
|
TaskProcess.OperateStatus(transportTask, 4);
|
LocationHelper.UnLockLoc(transportTask.S_END_LOC);
|
TaskProcess.OperateStatus(transportTask, 6);
|
TaskHelper.End(transportTask);
|
LocationHelper.CreateUpAndDown(transportTask);
|
break;
|
//任务执行中
|
case "3":
|
break;
|
//RFID校验上报
|
case "4":
|
if (string.IsNullOrEmpty(model.code))
|
{
|
LogHelper.Info($"RFID校验码为空", "Wcs任务执行通知");
|
throw new Exception("RFID校验码为空");
|
}
|
else {
|
|
WcsRfidCheckoutEntitys RfidChek = new WcsRfidCheckoutEntitys();
|
RfidChek.S_TASK_NO = model.requestPk;
|
RfidChek.S_NEWTRAY_CODE = model.contNo;
|
RfidChek.S_OLDTRAY_CODE = transportTask.S_CNTR_CODE;
|
RfidChek.S_JBWBIT = transportTask.S_START_LOC;
|
|
if (model.code=="0")
|
{
|
LogHelper.Info($"RFID校验码成功", "Wcs任务执行通知");
|
RfidChek.S_RESULT = "RFID校验成功";
|
}
|
if (model.code == "1")
|
{
|
//校验失败 取消立库任务 改agv任务起点终点
|
LogHelper.Info($"RFID校验失败", "Wcs任务执行通知");
|
RfidChek.S_RESULT = "RFID校验失败";
|
if (WcsCancellTask(transportTask))
|
{
|
ContainerHelper.delCntr(transportTask.S_CNTR_CODE);
|
ContainerHelper.delCntrItem(transportTask.S_CNTR_CODE);
|
TaskHelper.Fail(transportTask);
|
TaskProcess.OperateStatus(transportTask, 7);
|
|
var agvTask = TaskHelper.GetTaskByWorkNo(transportTask.S_OP_CODE, "agv");
|
|
if (agvTask == null)
|
{
|
LogHelper.Info($"RFID校验失败,没找到对应{transportTask.S_OP_CODE}的agv任务", "Wcs任务执行通知");
|
throw new Exception($"RFID校验失败,没找到对应{transportTask.S_OP_CODE }的agv任务");
|
}
|
var workFlow = TaskHelper.selectWorkFlowByType(agvTask.N_TYPE.ToString(), agvTask.TOOLSTYPE);
|
|
if (workFlow == null)
|
{
|
LogHelper.Info($"RFID校验失败,没找到对应作业流程", "Wcs任务执行通知");
|
throw new Exception($"RFID校验失败,没找到对应作业流程");
|
}
|
//查找终点
|
var endList = LocationHelper.GetAllLocList1(workFlow.ERRORAREA);
|
|
var end = LocationHelper.FindEndcolByLocList(endList, workFlow.ERRORAREA,workFlow.ROADWAY);
|
LogHelper.Info($"RFID校验失败下发异常终点信息" + JsonConvert.SerializeObject(end), "Wcs任务执行通知");
|
|
|
if (end == null)
|
{
|
LogHelper.Info($"RFID校验失败下发任务失败,终点库区{workFlow.ERRORAREA},没找到终点", "Wcs任务执行通知");
|
throw new Exception($"RFID校验失败终点库区{workFlow.ERRORAREA},没找到终点");
|
}
|
agvTask.S_START_LOC = agvTask.S_END_LOC;
|
agvTask.S_START_AREA = agvTask.S_END_AREA;
|
agvTask.S_END_LOC = end.S_CODE;
|
agvTask.S_END_AREA = end.S_AREA_CODE;
|
agvTask.S_TYPE = workFlow.FLOWNAME;
|
newDb.BeginTran();
|
var I = newDb.Updateable(agvTask).UpdateColumns(it => new { it.S_START_LOC, it.S_START_AREA,it.S_END_LOC,it.S_END_AREA,it.S_TYPE,it.S_B_STATE }).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("修改任务表失败");
|
}
|
newDb.CommitTran();
|
//改参数通知小车
|
|
}
|
}
|
|
newDb.BeginTran();
|
var R = newDb.Insertable(RfidChek).ExecuteCommand();
|
if (R == 0)
|
{
|
throw new Exception("添加RFID校验表失败");
|
}
|
newDb.CommitTran();
|
|
}
|
break;
|
//9取货无货
|
case "9":
|
LogHelper.Info($"任务号{transportTask.S_CODE},取货无货,取消任务", "Wcs任务执行通知");
|
if (WcsCancellTask(transportTask)) {
|
LogHelper.Info($"任务号{transportTask.S_CODE},取消任务成功,起点{transportTask.S_START_LOC}设为异常", "Wcs任务执行通知");
|
TaskHelper.Fail(transportTask);
|
TaskProcess.OperateStatus(transportTask, 7);
|
LocationHelper.updateLocLock(transportTask.S_START_LOC, 4, "异常锁");
|
var agvTask = TaskHelper.GetTaskByWorkNo(transportTask.S_OP_CODE, "agv");
|
if (agvTask!=null)
|
{
|
TaskHelper.Fail(agvTask);
|
NDCApi.CancelOrder(agvTask.S_CODE.Trim());
|
TaskProcess.CacheBitCancelUpdate(agvTask);
|
}
|
}
|
break;
|
default:
|
break;
|
}
|
|
result.msg = "通知成功";
|
result.code = "0";
|
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
result.msg = ex.Message;
|
result.code = "1";
|
LogHelper.Info("Wcs任务执行通知异常" + ex.Message, "Wcs任务执行通知");
|
return result;
|
}
|
return result;
|
}
|
|
|
/// <summary>
|
/// Wcs报警上报
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
internal static WcsWarningReurn WcsTaskProcessing(WcsWarningParme model)
|
{
|
var result = new WcsWarningReurn();
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
var ghh = $" 任务号:{model.taskNo}\n 库区:{model.areaCode} \n 巷道:{model.roadway}\n 故障内容:{model.remarks} 时间:{DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss")}";
|
var dd = new DingDingHelper();
|
dd.button1_Click(ghh);
|
|
newDb.BeginTran();
|
WcsWarningEntitys aloneWcsTask = new WcsWarningEntitys()
|
{
|
requestPk = model.requestPk,
|
taskNo = model.taskNo,
|
errorDes = model.errorDes,
|
errorNo = model.errorNo,
|
remarks = model.remarks,
|
areaCode = model.areaCode,
|
roadway = model.roadway,
|
reqTime = model.reqTime
|
};
|
var I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加立库报警信息表失败");
|
}
|
|
//立库报警修改巷道可用表
|
//var parme = new WcsRoadwaystateParme();
|
//parme.requestPk = model.requestPk;
|
//parme.roadWay = model.roadway;
|
//parme.reqTime = model.reqTime;
|
//parme.areaCode = model.areaCode;
|
//WcsRoadwaystate(parme);
|
|
newDb.CommitTran();
|
result.code = "0";
|
result.msg = "成功";
|
LogHelper.Info("Wcs报警上报返回"+ JsonConvert.SerializeObject(result), "报警上报");
|
return result;
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
result.msg = ex.Message;
|
result.code = "1";
|
LogHelper.Info("Wcs报警信息异常" + ex.Message, "报警上报");
|
return result;
|
}
|
}
|
|
public static WcsPositionAvailableReturn WcsPositionAvailable(string S_TASK_NO ,List<string> list)
|
{
|
WcsPositionAvailableReturn entityTwo = new WcsPositionAvailableReturn();
|
|
var interact = new
|
{
|
requestPk = S_TASK_NO,//任务号
|
stnNo = list,//接驳位
|
operationTime = DateTime.Now.ToString()//操作时间
|
};
|
|
try
|
{
|
LogHelper.Info("查询Wcs立库接驳位 地址信息:" + baseUrl + "positionAvailable", "接驳位");
|
|
LogHelper.Info("查询Wcs立库接驳位 参数信息:" + JsonConvert.SerializeObject(interact),"接驳位");
|
|
var result = apiHelper.Post(baseUrl + "positionAvailable", JsonConvert.SerializeObject(interact));
|
|
LogHelper.Info("查询Wcs立库接驳位 返回信息" + JsonConvert.SerializeObject(result), "接驳位");
|
|
if (string.IsNullOrEmpty(result))
|
{
|
entityTwo.code = "1";
|
return entityTwo;
|
}
|
var data = JsonConvert.DeserializeObject<WcsPositionAvailableReturn>(result);
|
return data;
|
}
|
catch (Exception ex)
|
{
|
entityTwo.code = "1";
|
entityTwo.msg = ex.Message;
|
return entityTwo;
|
}
|
|
}
|
internal static WcsWarningReurn WcsRoadwaystate(WcsRoadwaystateParme model)
|
{
|
var result = new WcsWarningReurn();
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
if (string.IsNullOrEmpty(model.areaCode))
|
{
|
throw new Exception("库区禁止为空");
|
}
|
if (model.roadWay == "0")
|
{
|
throw new Exception("没传巷道号");
|
}
|
if (string.IsNullOrEmpty(model.status))
|
{
|
throw new Exception("状态禁止为空");
|
}
|
if (model.status != "0" && model.status != "1")
|
{
|
throw new Exception($"非法状态码 状态码为 {model.status}");
|
}
|
|
|
var rowdwa = newDb.Queryable<RoadWayEnable>().Where(x => x.areaCode == model.areaCode && x.roadWay == model.roadWay).First();
|
if (rowdwa == null)
|
{
|
//throw new Exception($"巷道表没找到库区是{model.areaCode},巷道是{model.roadWay}的数据");
|
|
|
|
RoadWayEnable rowdwa1 = new RoadWayEnable()
|
{
|
requestPk = model.requestPk,
|
status = model.status,
|
areaCode = model.areaCode,
|
roadWay = model.roadWay,
|
reqTime = model.reqTime
|
};
|
|
newDb.BeginTran();
|
var I = newDb.Insertable(rowdwa1).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加巷道可用表失败");
|
}
|
newDb.CommitTran();
|
}
|
else {
|
if (rowdwa.status == model.status)
|
{
|
result.code = "0";
|
result.msg = "成功";
|
return result;
|
}
|
|
rowdwa.requestPk = model.requestPk;
|
rowdwa.status = model.status;
|
rowdwa.areaCode = model.areaCode;
|
rowdwa.roadWay = model.roadWay;
|
rowdwa.reqTime = model.reqTime;
|
|
newDb.BeginTran();
|
var I = newDb.Updateable(rowdwa).UpdateColumns(it => new { it.requestPk, it.status, it.areaCode, it.roadWay, it.reqTime }).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("修改巷道可用表失败");
|
}
|
newDb.CommitTran();
|
}
|
|
|
result.code = "0";
|
result.msg = "成功";
|
LogHelper.Info("Wcs巷道可用上报返回" + JsonConvert.SerializeObject(result), "巷道可用上报");
|
return result;
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
result.msg = ex.Message;
|
result.code = "1";
|
LogHelper.Info("Wcs巷道可用上报异常" + ex.Message, "巷道可用上报");
|
return result;
|
}
|
}
|
|
|
/// <summary>
|
/// agv执行通知
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <param name="state"></param>
|
/// <param name="forkliftNo"></param>
|
/// <returns></returns>
|
public static bool WcsCallback(WMSTask mst, int state, string forkliftNo = "")
|
{
|
string Type = "";
|
string bit = "";
|
var Meshod = "";
|
var newDb = new SqlHelper<object>().GetInstance();
|
var tac = newDb.Queryable<WcsSafety>().Where(a => a.TaskNo == mst.S_CODE && a.Sign == state).ToList();
|
if (tac.Count() > 0)
|
{
|
LogHelper.Info("查询到安全请求信号记录表已经存在数据,此次信号不下达给立库", "agv执行通知");
|
return true;
|
}
|
switch (state)
|
{
|
case 1101:
|
Type = "1";
|
bit = mst.S_START_LOC;
|
Meshod = "AgvRequest";
|
break;
|
case 1102:
|
Type = "1";
|
bit = mst.S_START_LOC;
|
Meshod = "Complete";
|
break;
|
case 1103:
|
Type = "2";
|
bit = mst.S_END_LOC;
|
Meshod = "AgvRequest";
|
break;
|
case 1104:
|
Type = "2";
|
bit = mst.S_END_LOC;
|
Meshod = "Complete";
|
break;
|
case 7:
|
Type = "5";
|
bit = mst.S_END_LOC;
|
Meshod = "AgvRequestCancel";
|
break;
|
}
|
|
|
|
|
var interact = new
|
{
|
requestPk = mst.S_CODE,//任务号
|
trkType = Type,//任务类型
|
method = Meshod,//API名称
|
stnNo = bit,//目的地站台号
|
carNo = forkliftNo,// 车号
|
clientCode = "WMS",//操作人
|
operationTime = DateTime.Now.ToString()//操作时间
|
};
|
LogHelper.Info("agv执行通知 地址信息:" + baseUrl + "agvCallback", "agv执行通知");
|
LogHelper.Info("agv执行通知 参数信息:" + JsonConvert.SerializeObject(interact), "agv执行通知");
|
var result = apiHelper.Post(baseUrl + "agvCallback", JsonConvert.SerializeObject(interact));
|
LogHelper.Info("agv执行通知 返回信息:" + JsonConvert.SerializeObject(result), "agv执行通知");
|
if (!string.IsNullOrEmpty(result))
|
{
|
var res = JsonConvert.DeserializeObject<WcsTaskCallBack>(result);
|
if (res.code == "0")
|
{
|
WcsSafety Sign = new WcsSafety();
|
Sign.TaskNo = mst.S_CODE;
|
Sign.Sign = state;
|
newDb.BeginTran();
|
var B = newDb.Insertable(Sign).ExecuteCommand();
|
if (B == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
LogHelper.Info("agv执行通知成功:", "agv执行通知");
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
else
|
{
|
LogHelper.Info("agv执行通知成功 返回信息为空", "agv执行通知");
|
return false;
|
}
|
|
}
|
|
|
/// <summary>
|
/// agv开关门执行通知
|
/// </summary>
|
/// <param name="mst"></param>
|
/// <param name="state"></param>
|
/// <param name="forkliftNo"></param>
|
/// <returns></returns>
|
public static bool WcsCallback1(WMSTask mst, int state, string forkliftNo = "")
|
{
|
string Type = "";
|
string bit = "";
|
var Meshod = "";
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
|
if (mst.S_TYPE.Contains("入库"))
|
{
|
if (state == 1023)
|
{
|
Meshod = "AgvRequest";
|
bit = mst.S_END_LOC;
|
Type = "3";
|
}
|
else{
|
Meshod = "AgvRequest";
|
bit = mst.S_END_LOC;
|
Type = "4";
|
}
|
}
|
else if (mst.S_TYPE.Contains("出库"))
|
{
|
if (state == 1023)
|
{
|
Meshod = "AgvRequest";
|
bit = mst.S_START_LOC;
|
Type = "3";
|
}
|
else
|
{
|
Meshod = "AgvRequest";
|
bit = mst.S_START_LOC;
|
Type = "4";
|
}
|
}
|
else
|
{
|
LogHelper.Info("除了出入库其余不需要安全请求", "agv执行通知");
|
return true;
|
}
|
|
|
|
var interact = new
|
{
|
requestPk = mst.S_CODE,//任务号
|
trkType = Type,//任务类型
|
method = Meshod,//API名称
|
stnNo = bit,//目的地站台号
|
carNo = forkliftNo,// 车号
|
clientCode = "WMS",//操作人
|
operationTime = DateTime.Now.ToString()//操作时间
|
};
|
LogHelper.Info("agv执行通知 地址信息:" + baseUrl + "agvCallback", "agv执行通知");
|
LogHelper.Info("agv执行通知 参数信息:" + JsonConvert.SerializeObject(interact), "agv执行通知");
|
var result = apiHelper.Post(baseUrl + "agvCallback", JsonConvert.SerializeObject(interact));
|
LogHelper.Info("agv执行通知 返回信息:" + JsonConvert.SerializeObject(result), "agv执行通知");
|
if (!string.IsNullOrEmpty(result))
|
{
|
var res = JsonConvert.DeserializeObject<WcsTaskCallBack>(result);
|
if (res.code == "0")
|
{
|
WcsSafety Sign = new WcsSafety();
|
Sign.TaskNo = mst.S_CODE;
|
Sign.Sign = state;
|
newDb.BeginTran();
|
var B = newDb.Insertable(Sign).ExecuteCommand();
|
if (B == 0)
|
{
|
newDb.RollbackTran();
|
}
|
newDb.CommitTran();
|
LogHelper.Info("agv执行通知成功:", "agv执行通知");
|
return true;
|
}
|
else
|
{
|
return false;
|
}
|
}
|
else
|
{
|
LogHelper.Info("agv执行通知成功 返回信息为空", "agv执行通知");
|
return false;
|
}
|
|
}
|
|
|
|
/// <summary>
|
/// 放货有货
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public static WcsWarningReurn ZcInChangeBit(changeBitParme model)
|
{
|
var result = new WcsWarningReurn();
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
if (string.IsNullOrEmpty(model.taskNo))
|
{
|
throw new Exception("任务号为空");
|
}
|
|
var task = TaskHelper.GetTask(model.taskNo);
|
if (task==null)
|
{
|
throw new Exception($"未查询到任务号{model.taskNo}的任务");
|
}
|
|
if (task.S_B_STATE.Contains("完成")|| task.S_B_STATE.Contains("取消") || task.S_B_STATE.Contains("失败"))
|
{
|
throw new Exception($"任务号{model.taskNo},任务状态:{task.S_B_STATE},不能改道");
|
}
|
|
var endLoc = LocationHelper.GetLocOne(task.S_END_LOC);
|
|
var end = newDb.Queryable<Location>().Where(a => a.S_AREA_CODE == endLoc.S_AREA_CODE && a.N_ROW == endLoc.N_ROW && a.N_COL > endLoc.N_COL && a.S_LOCK_STATE == "无" && a.N_CURRENT_NUM == 0 && a.C_ENABLE=="Y").OrderBy(b=>b.N_COL).First();
|
|
LogHelper.Info($"Wcs放货有货寻找新终点信息" + JsonConvert.SerializeObject(end), "放货有货");
|
|
if (end!=null)
|
{
|
newDb.BeginTran();
|
endLoc.N_LOCK_STATE = 4;
|
endLoc.S_LOCK_STATE = "异常锁";
|
newDb.Updateable(endLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE }).ExecuteCommand();
|
task.S_END_LOC = end.S_CODE;
|
newDb.Updateable(task).UpdateColumns(it => new { it.S_END_LOC }).ExecuteCommand();
|
newDb.CommitTran();
|
LocationHelper.LockLoc(end.S_CODE, "入库锁", 1);
|
result.msg = end.S_CODE;
|
result.code = "0";
|
}
|
else
|
{
|
throw new Exception($"未查询到库区{endLoc.S_AREA_CODE}有符合的货位");
|
}
|
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
result.msg = ex.Message;
|
result.code = "1";
|
LogHelper.Info("Wcs放货有货异常" + ex.Message, "放货有货");
|
return result;
|
}
|
return result;
|
}
|
|
|
/// <summary>
|
/// agv通知确认
|
/// </summary>
|
/// <param name="model"></param>
|
/// <returns></returns>
|
public static WcsWarningReurn agvResponse(agvResponseParme model) {
|
var result = new WcsWarningReurn();
|
var newDb = new SqlHelper<object>().GetInstance();
|
|
try
|
{
|
newDb.BeginTran();
|
WcsInform aloneWcsTask = new WcsInform()
|
{
|
requestPk = model.requestPk,
|
trkType = model.trkType,
|
isAllow = model.isAllow,
|
stnNo = model.stnNo,
|
carNo = model.carNo,
|
clientCode = model.clientCode,
|
reqTime = model.reqTime
|
};
|
var I = newDb.Insertable(aloneWcsTask).ExecuteCommand();
|
if (I == 0)
|
{
|
throw new Exception("添加立库通知确认表失败");
|
}
|
newDb.CommitTran();
|
result.code = "0";
|
result.msg = "成功";
|
LogHelper.Info("Wcs通知确认返回" + JsonConvert.SerializeObject(result), "通知确认");
|
return result;
|
}
|
catch (Exception ex)
|
{
|
newDb.RollbackTran();
|
result.msg = ex.Message;
|
result.code = "1";
|
LogHelper.Info("Wcs通知确认异常" + ex.Message, "通知确认");
|
return result;
|
}
|
}
|
|
|
}
|
|
|
|
|
/// <summary>
|
/// Wcs任务返回
|
/// </summary>
|
public class WcsTaskReturn
|
{
|
public string code { get; set; }
|
public string msg { get; set; }
|
public string requestPk { get; set; }
|
public string status { get; set; }
|
}
|
|
/// <summary>
|
/// Mes接口返回
|
/// </summary>
|
public class MesReturn
|
{
|
/// <summary>
|
/// 成功:true,失败:false
|
/// </summary>
|
public bool flag { get; set; }
|
/// <summary>
|
/// 失败原因
|
/// </summary>
|
public string message { get; set; }
|
/// <summary>
|
/// List对象
|
/// </summary>
|
public List<MesReturnItem> obj { get; set; }
|
}
|
|
/// <summary>
|
/// Mes返回物料信息
|
/// </summary>
|
public class MesReturnItem {
|
/// <summary>
|
/// 工厂
|
/// </summary>
|
public string facnm { get; set; }
|
/// <summary>
|
/// 条码号
|
/// </summary>
|
public string tmh { get; set; }
|
/// <summary>
|
/// 配方
|
/// </summary>
|
public string recipe { get; set; }
|
/// <summary>
|
/// 胶号
|
/// </summary>
|
public string cdrub { get; set; }
|
/// <summary>
|
/// 机台
|
/// </summary>
|
public string mchid { get; set; }
|
/// <summary>
|
/// 作业日期
|
/// </summary>
|
public string wdate { get; set; }
|
/// <summary>
|
/// 班次
|
/// </summary>
|
public string wsht { get; set; }
|
/// <summary>
|
/// 开始车次
|
/// </summary>
|
public string strbat { get; set; }
|
/// <summary>
|
/// 结束车次
|
/// </summary>
|
public string endbat { get; set; }
|
/// <summary>
|
/// 重量
|
/// </summary>
|
public decimal zl { get; set; }
|
/// <summary>
|
/// 生产计划编号
|
/// </summary>
|
public string planno { get; set; }
|
/// <summary>
|
/// 托盘RFID芯片
|
/// </summary>
|
public string tagno { get; set; }
|
/// <summary>
|
/// 生产时间
|
/// </summary>
|
public string wrkdatetime { get; set; }
|
/// <summary>
|
/// 胶料段
|
/// </summary>
|
public string stage { get; set; }
|
/// <summary>
|
/// 检验结果
|
/// </summary>
|
public string grd { get; set; }
|
}
|
|
|
/// <summary>
|
/// Wcs任务返回
|
/// </summary>
|
public class WcsTaskCallBack
|
{
|
public string code { get; set; }
|
public string msg { get; set; }
|
public string requestPk { get; set; }
|
}
|
|
public class WcsPositionAvailableReturn
|
{
|
public string code { get; set; }
|
public string msg { get; set; }
|
public string requestPk { get; set; }
|
public List<string> available { get; set; }
|
|
}
|
|
|
public class WcsReturnEntityWtp
|
{
|
public string code { get; set; }
|
public string msg { get; set; }
|
public string contNo { get; set; }
|
public string contType { get; set; }
|
public string requestPk { get; set; }
|
}
|
}
|