using HH.WCS.Mobox3.HD.dispatch;
using HH.WCS.Mobox3.HD.process;
using HH.WCS.Mobox3.HD.wms;
using Newtonsoft.Json;
using System.Collections.Generic;
using System.Reflection;
using System.Threading.Tasks;
using HH.WCS.Mobox3.HD.util;
using System.Web.Http;
using static HH.WCS.Mobox3.HD.api.ApiModel;
using static HH.WCS.Mobox3.HD.api.OtherModel;
using static HH.WCS.Mobox3.HD.api.WmsController;
using static HH.WCS.Mobox3.HD.dispatch.ShopFloorControl;
using static System.Runtime.CompilerServices.RuntimeHelpers;
using static HH.WCS.Mobox3.HD.api.MoboxController;
using HH.WCS.Mobox3.HD.device;
using S7.Net;
using HH.WCS.Mobox3.HD.models;
using System.Linq;
using NLog.Fluent;
using System;
using SqlSugar;
using static HH.WCS.Mobox3.HD.core.Monitor;
using static HH.WCS.Mobox3.HD.api.DigitHelper;
using System.Web.SessionState;
using static HH.WCS.Mobox3.HD.util.ExpressionHelper;
using static HH.WCS.Mobox3.HD.wms.WMSHelper;
namespace HH.WCS.Mobox3.HD.api {
///
/// mobox3调用,脚本中调用
///
public class MoboxController : System.Web.Http.ApiController {
///
/// 1.发货确认接口(PDA)
///
///
public SimpleResult sendOver(TrayInfo trayInfo)
{
LogHelper.Info("发货确认接口-sendOver Request:" + JsonConvert.SerializeObject(trayInfo), "Mobox");
var result = new SimpleResult();
var wmsTask = WMSHelper.GetWmsTaskByCntr(trayInfo.trayCode);
if (wmsTask != null)
{
result.resultCode = 1;
result.resultMsg = "托盘存在未完成任务,不能确认发货";
return result;
}
var locCntrRel = ContainerHelper.getLocCntr(trayInfo.trayCode);
if (locCntrRel == null)
{
var cntrItemRels = ItemHelper.GetCntrItemByCntrCode(trayInfo.trayCode);
if (cntrItemRels != null && cntrItemRels.Count > 0)
{
// 发货信息记录
ReleaseRecord releaseRecord = new ReleaseRecord()
{
S_CNTR_CODE = cntrItemRels[0].S_CNTR_CODE,
S_WORK_NO = cntrItemRels[0].S_WORK_NO,
S_PARTDRAW_NO = cntrItemRels[0].S_PARTDRAW_NO,
S_ITEM_TYPE = cntrItemRels[0].S_ITEM_TYPE,
F_QTY = cntrItemRels[0].F_QTY,
F_WEIGHT = cntrItemRels[0].F_WEIGHT,
T_RELEASE_DATE = DateTime.Now,
};
WMSHelper.addReleaseRecord(releaseRecord);
ContainerHelper.deleteCntrItem(trayInfo.trayCode);
}
// 通知车间控制器
LogHelper.Info("容器物料解绑通知车间控制器", "Mobox");
UnBindInfo unBindInfo = new UnBindInfo()
{
trayCode = trayInfo.trayCode,
};
ShopFloorControl.trayMaterialUnBind(unBindInfo);
}
LogHelper.Info("发货确认接口-sendOver response:" + JsonConvert.SerializeObject(result), "Mobox");
return result;
}
///
/// 2.空托盘入库(PDA)
///
///
public SimpleResult emptyTrayInStock(EmptyTrayInStockInfo model)
{
LogHelper.Info("空托盘入库_emptyTrayInStock Request:" + JsonConvert.SerializeObject(model), "Mobox");
SimpleResult result = new SimpleResult();
var startLoc = LocationHelper.GetLoc(model.startLocCode);
Location endLoc = null;
var locMouldCntr = WMSHelper.getLocMouldCntr(model.trayCode);
if (locMouldCntr != null)
{
if (model.endLocCode != null && locMouldCntr.S_LOC_CODE != model.endLocCode)
{
result.resultCode = 1;
result.resultMsg = "模具托盘存在货位容器绑定关系,绑定货位:" + locMouldCntr.S_LOC_CODE;
return result;
}
endLoc = LocationHelper.GetLoc(locMouldCntr.S_LOC_CODE);
}
else {
locMouldCntr = new LocMouldCntr() { S_LOC_CODE = model.endLocCode, S_CNTR_CODE = model.trayCode };
WMSHelper.addLocMouldCntr(locMouldCntr);
}
if (model.endLocCode != null)
{
endLoc = LocationHelper.GetLoc(model.endLocCode);
}
if (endLoc != null && startLoc != null)
{
// 清理原托盘的物料信息
ContainerHelper.deleteCntrItem(model.trayCode);
// 2、创建空盘入库作业任务
WMSTask wmsTask = new WMSTask()
{
S_CNTR_CODE = model.trayCode,
S_CODE = WMSHelper.GenerateTaskNo(),
S_START_LOC = startLoc.S_CODE,
S_START_AREA = startLoc.S_AREA_CODE,
S_END_LOC = endLoc.S_CODE,
S_END_AREA = endLoc.S_AREA_CODE,
S_TYPE = "空托盘入库",
S_OP_DEF_NAME = "空托盘入库(模具)",
N_PRIORITY = 1,
T_START_TIME = DateTime.Now,
};
if (WMSHelper.CreateWmsTask(wmsTask))
{
// 3、创建一段任务
WCSTask wcsTask = new WCSTask
{
S_OP_NAME = wmsTask.S_OP_DEF_NAME,
S_CODE = WCSHelper.GenerateTaskNo(),
S_TYPE = wmsTask.S_TYPE + "-1",
S_START_LOC = wmsTask.S_START_LOC,
S_START_AREA = wmsTask.S_START_AREA,
S_END_LOC = wmsTask.S_END_LOC,
S_END_AREA = wmsTask.S_END_AREA,
S_CNTR_CODE = wmsTask.S_CNTR_CODE,
N_CNTR_COUNT = 1,
S_SCHEDULE_TYPE = "HL",
S_OP_CODE = wmsTask.S_CODE,
N_PRIORITY = wmsTask.N_PRIORITY,
T_START_TIME = DateTime.Now,
};
if (WCSHelper.CreateTask(wcsTask))
{
// 对开始货位、接驳货位、终点货位进行加锁
LocationHelper.LockLoc(startLoc.S_CODE, 2);
LocationHelper.LockLoc(endLoc.S_CODE, 1);
wmsTask.N_B_STATE = 1;
WMSHelper.UpdateTaskState(wmsTask);
}
}
}
else
{
result.resultCode = 1;
result.resultMsg = "起点货位或终点货位不存在";
return result;
}
LogHelper.Info("空托盘入库_emptyTrayInStock response:" + JsonConvert.SerializeObject(result), "Mobox");
return result;
}
///
/// 3.成品发货
/// 批量创建作业
///
///
public SimpleResult finisheProductShipment(FinisheProductInfos model)
{
LogHelper.Info("成品发货_finisheProductShipment Request:" + JsonConvert.SerializeObject(model), "Mobox");
var result = new SimpleResult();
var list = model.finisheProductList;
// 库区对应的发货区
Dictionary areaToShippingArea = new Dictionary();
foreach (var item in Settings.dispatchAreaInfos)
{
areaToShippingArea.Add(item.relateArea, item.areaCode);
}
List wmsTaskList = new List();
foreach (var item in list)
{
// 1.查询容器物料以及货位
LocCntrRel locCntr = ContainerHelper.getLocCntr(item.trayCode);
if (locCntr == null)
{
result.resultCode = 1;
result.resultMsg = "容器编码:" + item.trayCode + " 的货位容器不存在";
return result;
}
var existWmsTask = WMSHelper.GetWmsTaskByCntr(item.trayCode);
if (existWmsTask != null)
{
result.resultCode = 1;
result.resultMsg = "相关容器存在未完成任务";
return result;
}
Location startLoc = LocationHelper.GetLoc(locCntr.S_LOC_CODE);
var endAreaCode = areaToShippingArea[startLoc.S_AREA_CODE];
Location endLoc = WMSHelper.GetDeliverEndLocation(endAreaCode);
// 创建成品出库作业任务
if (endLoc != null)
{
WMSTask wmsTask = new WMSTask()
{
S_CNTR_CODE = item.trayCode,
S_CODE = WMSHelper.GenerateTaskNo(),
S_START_LOC = startLoc.S_CODE,
S_START_AREA = startLoc.S_AREA_CODE,
S_END_AREA = endLoc.S_AREA_CODE,
S_END_LOC = endLoc.S_CODE,
S_TYPE = "成品出库",
/*S_OP_DEF_CODE = model.workNo,*/
S_OP_DEF_NAME = "成品出库",
T_START_TIME = DateTime.Now,
};
if (WMSHelper.CreateWmsTask(wmsTask))
{
LocationHelper.LockLoc(wmsTask.S_START_LOC, 2);
LocationHelper.LockLoc(wmsTask.S_END_LOC, 1);
}
}
else
{
result.resultCode = 1;
result.resultMsg = "终点货位未获取到,容器编号:"+ item.trayCode;
return result;
}
}
LogHelper.Info("成品发货_finisheProductShipment response:" + JsonConvert.SerializeObject(result), "Mobox");
return result;
}
///
/// 3.1成品发货
/// 批量创建作业
///
///
public SimpleResult finisheProductShipment1(FinisheProductInfo model)
{
LogHelper.Info("成品发货_finisheProductShipment Request:" + JsonConvert.SerializeObject(model), "Mobox");
var result = new SimpleResult();
var existWmsTask = WMSHelper.GetWmsTaskByCntr(model.trayCode);
if (existWmsTask != null)
{
result.resultCode = 1;
result.resultMsg = "相关容器存在未完成任务";
return result;
}
Location startLoc = null;
Location firstTaskEnd = null;
ItemStartLoc itemStartLoc = WMSHelper.GetStartLocation(model.itemCode,null ,model.workNo);
if (itemStartLoc.type != 0)
{
startLoc = itemStartLoc.loc;
firstTaskEnd = itemStartLoc.connectloc;
}
else
{
result.resultCode = 1;
result.resultMsg = "库区没有该物料";
return result;
}
if (startLoc == null)
{
result.resultCode = 1;
result.resultMsg = "库区没有该物料";
return result;
}
Location endLoc = LocationHelper.GetLoc(model.endLocCode);
if (endLoc == null) {
result.resultCode = 1;
result.resultMsg = "终点货位不存在,请检查终点货位编码是否正常";
return result;
}
// 2、创建出库作业任务
string cntrCode = null;
LocCntrRel locCntrRel = ContainerHelper.getLocCntrByLoc(startLoc.S_CODE);
if (locCntrRel != null)
{
cntrCode = locCntrRel.S_CNTR_CODE;
}
if (firstTaskEnd != null)
{
var wmsTask = new WMSTask()
{
S_CNTR_CODE = cntrCode,
S_CODE = WMSHelper.GenerateTaskNo(),
S_START_LOC = startLoc.S_CODE,
S_START_AREA = startLoc.S_AREA_CODE,
S_END_LOC = endLoc.S_CODE,
S_END_AREA = endLoc.S_AREA_CODE,
S_TYPE = "成品出库",
S_OP_DEF_NAME = "出库搬运任务",
N_PRIORITY = 1,
T_START_TIME = DateTime.Now
};
if (WMSHelper.CreateWmsTask(wmsTask))
{
// 物料不可取货位,需先进行移库
if (itemStartLoc.type == 2)
{
bool shiftResult = ApiHelper.shiftStock(itemStartLoc.outLoc, wmsTask.S_CODE);
if (!shiftResult)
{
wmsTask.N_B_STATE = 3;
WMSHelper.UpdateTaskState(wmsTask);
result.resultCode = 1;
result.resultMsg = "取货阻塞且巷道两边货物已满,无法取货";
return result;
}
}
// 查询立体库库区
string S_SCHEDULE_TYPE = null;
List areaCodes = Settings.getStoreAreaCodes(2, 1);
if (areaCodes.Contains(startLoc.S_AREA_CODE))
{
S_SCHEDULE_TYPE = "RB";
/*string firstEndLoc = WCSHelper.GetLinePlcInfoByDesc(firstTaskEnd.S_CODE).localtion;
firstTaskEnd = LocationHelper.GetLoc(firstEndLoc);*/
}
var wcsTask = new WCSTask
{
S_OP_NAME = wmsTask.S_OP_DEF_NAME,
S_CODE = WCSHelper.GenerateTaskNo(),
S_TYPE = wmsTask.S_TYPE + "-1",
S_START_LOC = startLoc.S_CODE,
S_START_AREA = startLoc.S_AREA_CODE,
S_END_LOC = firstTaskEnd.S_CODE,
S_END_AREA = firstTaskEnd.S_AREA_CODE,
S_CNTR_CODE = cntrCode,
S_SCHEDULE_TYPE = S_SCHEDULE_TYPE,
S_OP_CODE = wmsTask.S_CODE,
S_EQ_NO = ApiHelper.getEqNo(startLoc.S_AREA_CODE, startLoc.N_ROADWAY),
N_PRIORITY = 1,
T_START_TIME = DateTime.Now
};
if (WCSHelper.CreateTask(wcsTask))
{
// 开始货位、终点货位进行加锁
LocationHelper.LockLoc(startLoc.S_CODE, 2);
LocationHelper.LockLoc(firstTaskEnd.S_CODE, 1);
LocationHelper.LockLoc(endLoc.S_CODE, 1);
// 更新作业任务状态
wmsTask.N_B_STATE = 1;
WMSHelper.UpdateTaskState(wmsTask);
}
}
}
else
{
result.resultCode = 1;
result.resultMsg = "输送线故障或已上锁,请查看";
return result;
}
LogHelper.Info("成品发货_finisheProductShipment response:" + JsonConvert.SerializeObject(result), "Mobox");
return result;
}
///
/// 4.空盘垛入库(PDA)
///
///
public SimpleResult emptyTrayStackInStock(EmptyTrayStackInStockInfo model)
{
LogHelper.Info("空盘垛入库_emptyTrayStackInStock 入参:" + JsonConvert.SerializeObject(model), "Mobox");
var result = new SimpleResult();
var startLoc = LocationHelper.GetLoc(model.startLocCode);
if (startLoc == null) {
result.resultCode = 1;
result.resultMsg = "开始货位不存在";
return result;
}
var existWmsTask = WMSHelper.GetWmsTaskByCntr(model.trayCode);
if (existWmsTask != null)
{
result.resultCode = 1;
result.resultMsg = "托盘任务已生成,请勿重复下发";
return result;
}
model.trayCode.IndexOf("");
Location endLoc = null;
Location connectLoc = null;
var connectLocs = LocationHelper.GetConnectLocation(model.endAreaCode, 1 ,1 ,1,startLoc.S_AREA_CODE);
foreach (var item in connectLocs)
{
var conLoc = LocationHelper.GetLoc(item);
endLoc = WMSHelper.GetEndLocation(model.endAreaCode, null , conLoc.N_ROADWAY, conLoc.N_ROW);
if (endLoc != null)
{
connectLoc = conLoc;
endLoc.S_CODE = "虚拟货位";
break;
}
}
if (endLoc != null && connectLoc != null)
{
// 清理原托盘的物料信息
ContainerHelper.deleteCntrItem(model.trayCode);
ContainerHelper.addCntr(model.trayCode,model.trayNum);
// 2、创建空盘垛入库作业任务
WMSTask wmsTask = new WMSTask()
{
S_CNTR_CODE = model.trayCode,
S_CODE = WMSHelper.GenerateTaskNo(),
S_START_LOC = startLoc.S_CODE,
S_START_AREA = startLoc.S_AREA_CODE,
S_END_LOC = endLoc.S_CODE,
S_END_AREA = endLoc.S_AREA_CODE,
S_TYPE = "空盘垛入库",
S_OP_DEF_NAME = "空盘垛入库",
N_PRIORITY = 1,
T_START_TIME = DateTime.Now,
};
if (WMSHelper.CreateWmsTask(wmsTask))
{
// 3、创建一段任务
WCSTask wcsTask = new WCSTask
{
S_OP_NAME = wmsTask.S_OP_DEF_NAME,
S_CODE = WCSHelper.GenerateTaskNo(),
S_TYPE = wmsTask.S_TYPE + "-1",
S_START_LOC = wmsTask.S_START_LOC,
S_START_AREA = wmsTask.S_START_AREA,
S_END_LOC = connectLoc.S_CODE,
S_END_AREA = connectLoc.S_AREA_CODE,
S_CNTR_CODE = wmsTask.S_CNTR_CODE,
N_CNTR_COUNT = 1,
S_SCHEDULE_TYPE = "LD",
S_OP_CODE = wmsTask.S_CODE,
N_PRIORITY = wmsTask.N_PRIORITY,
T_START_TIME = DateTime.Now,
};
if (WCSHelper.CreateTask(wcsTask))
{
// 对开始货位、接驳货位、终点货位进行加锁
LocationHelper.LockLoc(startLoc.S_CODE, 2);
LocationHelper.LockLoc(connectLoc.S_CODE, 1);
wmsTask.N_B_STATE = 1;
WMSHelper.UpdateTaskState(wmsTask);
}
}
}
else {
result.resultCode = 1;
result.resultMsg = "未获取到终点货位或接驳货位";
}
LogHelper.Info("空盘垛入库_emptyTrayStackInStock 出参:" + JsonConvert.SerializeObject(result), "Mobox");
return result;
}
///
/// 5.根据工作号,查询X5系统钢卷信息
///
///
public ResponseResult findX5SteelCoilInfo(SteelCoilModel model)
{
LogHelper.Info("查询X5系统钢卷信息-sendOver Request:" + JsonConvert.SerializeObject(model), "Mobox");
ResponseResult responseResult = new ResponseResult()
{
success = true,
};
try
{
// 调用X5系统查询
var db = new SqlHelper