You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
549 lines
22 KiB
549 lines
22 KiB
using Microsoft.AspNetCore.Mvc;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Data;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using WcfControlMonitorLib;
|
|
|
|
namespace WcfControlMonitorWebLib.Controllers
|
|
{
|
|
[ApiController, Route("api/handcommand")]
|
|
public class HandCommandController : ControllerBase
|
|
{
|
|
SControlMonitor sc = new SControlMonitor(false);
|
|
|
|
|
|
/// <summary>
|
|
/// 页面加载 查询
|
|
/// </summary>
|
|
/// <param name="fid">调度任务号</param>
|
|
/// <param name="deviceIndex">设备编号</param>
|
|
/// <param name="sort"></param>
|
|
/// <param name="offset"></param>
|
|
/// <param name="limit"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public IActionResult Get(
|
|
[FromQuery] string fid,
|
|
[FromQuery] string deviceIndex,
|
|
[FromQuery] string sort,
|
|
[FromQuery] int? offset,
|
|
[FromQuery] int? limit)
|
|
{
|
|
|
|
if (offset == null)
|
|
{
|
|
offset = 0;
|
|
}
|
|
if (limit == null)
|
|
{
|
|
limit = 30;
|
|
}
|
|
#region 排序信息需要转一下
|
|
if (sort?.Length > 1)
|
|
{
|
|
var format = sort?.StartsWith("~") == true ? "{0} DESC" : "{0}";
|
|
if ((bool)sort?.StartsWith("~"))
|
|
{
|
|
switch (sort.Substring(2))
|
|
{
|
|
case "id":
|
|
sort = string.Format(format, "调度任务索引");
|
|
break;
|
|
default:
|
|
sort = "调度任务索引";
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (sort.Substring(1))
|
|
{
|
|
case "id":
|
|
sort = string.Format(format, "调度任务索引");
|
|
break;
|
|
default:
|
|
sort = "调度任务索引";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sort = "调度任务索引";
|
|
}
|
|
#endregion
|
|
#region 拼接 where 条件
|
|
var where = "任务类型='手工任务' ";
|
|
if (!string.IsNullOrEmpty(deviceIndex))
|
|
{
|
|
where = $"{where} AND 设备索引 = {deviceIndex}";
|
|
}
|
|
|
|
#endregion
|
|
var sql = $"SELECT top {limit} barcode,fid,TaskKind,ftaskLevel,id,DeviceIndex,DeviceName,OrderName,DeviceStatus,AheadDetect,StartZ,StartX,StartY,EndZ,EndX,EndY,StartTime,Status FROM (SELECT 条码 as barcode, 调度任务索引 AS FID,任务类型 as TaskKind,优先级 as ftaskLevel,设备指令索引 as id,设备索引 as DeviceIndex,设备名称 as DeviceName,设备命令索引 as OrderIndex,设备命令名称 as OrderName,设备状态 as DeviceStatus,执行检测未通过提示 as AheadDetect,起点Z as StartZ,起点X as StartX ,起点Y as StartY,终点Z as EndZ,终点X as EndX,终点Y as EndY,开始时间 AS StartTime,F_Status AS Status,ROW_NUMBER() OVER (ORDER BY {sort}) AS ROW_NUM FROM V_Monitor_Task WHERE {where}) AS T WHERE ROW_NUM > {offset}";
|
|
var sqlAll = $"SELECT barcode,fid,TaskKind,ftaskLevel,id,DeviceIndex,DeviceName,OrderName,DeviceStatus,AheadDetect,StartZ,StartX,StartY,EndZ,EndX,EndY,StartTime,Status FROM (SELECT 条码 as barcode, 调度任务索引 AS FID,任务类型 as TaskKind,优先级 as ftaskLevel,设备指令索引 as id,设备索引 as DeviceIndex,设备名称 as DeviceName,设备命令索引 as OrderIndex,设备命令名称 as OrderName,设备状态 as DeviceStatus,执行检测未通过提示 as AheadDetect,起点Z as StartZ,起点X as StartX ,起点Y as StartY,终点Z as EndZ,终点X as EndX,终点Y as EndY,开始时间 AS StartTime,F_Status AS Status,ROW_NUMBER() OVER (ORDER BY {sort}) AS ROW_NUM FROM V_Monitor_Task WHERE {where}) AS T WHERE ROW_NUM > 0";
|
|
|
|
DataView dv1 = CStaticClass.dbo.ExceSQL(sqlAll.ToString()).Tables[0].DefaultView;//满足的条件的所有数据 返回总记录条数用
|
|
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
|
|
var items = new dynamic[dv.Count];
|
|
for (int i = 0; i < dv.Count; i++)
|
|
{
|
|
items[i] = new
|
|
{
|
|
//barcode,fid,TaskKind,ftaskLevel,id,DeviceIndex,DeviceName,DeviceStatus,AheadDetect,StartZ,StartX,StartY,EndZ,EndX,EndY,StartTime,Status
|
|
id = Convert.ToInt32(dv[i]["id"]),
|
|
barcode = Convert.ToString(dv[i]["barcode"]),
|
|
taskKind = Convert.ToString(dv[i]["taskKind"]),
|
|
fid = Convert.ToString(dv[i]["fid"]),
|
|
ftaskLevel = Convert.ToInt32(dv[i]["ftaskLevel"]),
|
|
deviceIndex = Convert.ToString(dv[i]["DeviceIndex"]),
|
|
deviceName = Convert.ToString(dv[i]["DeviceName"]),
|
|
ordername = Convert.ToString(dv[i]["OrderName"]),
|
|
deviceStatus = Convert.ToString(dv[i]["DeviceStatus"]),
|
|
aheadDetect = Convert.ToString(dv[i]["AheadDetect"]),
|
|
startZ = Convert.ToInt32(dv[i]["StartZ"]),
|
|
startX = Convert.ToString(dv[i]["StartX"]),
|
|
startY = Convert.ToString(dv[i]["StartY"]),
|
|
endZ = Convert.ToString(dv[i]["EndZ"]),
|
|
endX = Convert.ToString(dv[i]["EndX"]),
|
|
endY = Convert.ToString(dv[i]["EndY"]),
|
|
startTime = Convert.ToString(dv[i]["StartTime"]),
|
|
status = Convert.ToString(dv[i]["Status"])
|
|
};
|
|
}
|
|
return Ok(new { total = dv1.Count, items });
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取排列层
|
|
/// </summary>
|
|
/// <param name="device">设备编号</param>
|
|
/// <param name="z">排</param>
|
|
/// <param name="x">列</param>
|
|
/// <returns></returns>
|
|
[HttpGet("zxy")]
|
|
public IActionResult GetZXY(
|
|
[FromQuery] string device,
|
|
[FromQuery] string z,
|
|
[FromQuery] string x)
|
|
{
|
|
string where = "1=1";
|
|
string SELECT = "F_Z";
|
|
if (!string.IsNullOrEmpty(device))
|
|
{
|
|
//string tempdevice = "11222";
|
|
//if (device == "11001" || device == "11002")
|
|
// tempdevice = "11222";
|
|
//where = $"{where} AND FStack = {tempdevice}";
|
|
where = $"{where} AND FStack = {device}";
|
|
}
|
|
if (!string.IsNullOrEmpty(z))
|
|
{
|
|
where = $"{where} AND F_Z = {z}";
|
|
SELECT = "F_X";
|
|
}
|
|
if (!string.IsNullOrEmpty(x))
|
|
{
|
|
where = $"{where} AND F_X = {x}";
|
|
SELECT = "F_Y";
|
|
}
|
|
//if (!string.IsNullOrEmpty(y))
|
|
//{
|
|
// where = $"{where} AND F_Y = {y}";
|
|
//}
|
|
var sql = $"select DISTINCT {SELECT} from ST_CELL where {where} order by {SELECT} ";
|
|
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
var items = new dynamic[dv.Count];
|
|
for (int i = 0; i < dv.Count; i++)
|
|
{
|
|
items[i] = new
|
|
{
|
|
id = Convert.ToInt32(dv[i][SELECT]),
|
|
name = Convert.ToString(dv[i][SELECT]),
|
|
};
|
|
}
|
|
return Ok(new { total = dv.Count, items });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加载设备列表
|
|
/// 在数据库T_Base_device表里新建了F_nextDevice字段
|
|
/// 存放这个设备可以去到的目标位置
|
|
/// 不采取原有设计方案 直接全部或者根据DB1是否有值来加载列表
|
|
/// 改为判断F_nextDevice这个字段是否为NULL
|
|
/// 需要将可以发送指令的设备 及目标位置 维护到这个字段中
|
|
/// 堆垛机 只填写站台位置就行 前端会自动添加“立库货位“来实现货位的任务
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet("devicelist")]
|
|
public IActionResult GetDeviceList()
|
|
{
|
|
//var sql = $"select F_DeviceIndex,F_DeviceKindIndex,F_DeviceName,F_nextdevice from T_Base_Device where F_nextdevice is not null order by F_DeviceKindIndex,F_DeviceIndex";
|
|
// 202410 HSCP - SQL查询拍出空字符串
|
|
var sql = $"select F_DeviceIndex,F_DeviceKindIndex,F_DeviceName,F_nextdevice from T_Base_Device where F_nextdevice is not null and F_nextdevice <> '' order by F_DeviceKindIndex,F_DeviceIndex";
|
|
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
var items = new dynamic[dv.Count];
|
|
for (int i = 0; i < dv.Count; i++)
|
|
{
|
|
items[i] = new
|
|
{
|
|
id = Convert.ToInt32(dv[i]["F_DeviceIndex"]),
|
|
name = Convert.ToString(dv[i]["F_DeviceName"]),
|
|
devicekind = Convert.ToString(dv[i]["F_DeviceKindIndex"])
|
|
};
|
|
}
|
|
return Ok(new { total = dv.Count, items });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询所选择的设备对应的指令动作
|
|
/// </summary>
|
|
/// <param name="device"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("order")]
|
|
public IActionResult GetOrder(
|
|
[FromQuery] string device)
|
|
{
|
|
if (!string.IsNullOrEmpty(device))
|
|
{
|
|
var sql = $"SELECT T_Base_Device.F_DeviceKindIndex, F_DeviceCommandName,F_DeviceCommandIndex FROM T_Base_Device , T_Base_Device_Command WHERE T_Base_Device.F_DeviceKindIndex= T_Base_Device_Command.F_DeviceKindIndex and F_DeviceIndex= {device} and F_DeviceCommandIndex != -1";
|
|
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
var items = new dynamic[dv.Count];
|
|
for (int i = 0; i < dv.Count; i++)
|
|
{
|
|
items[i] = new
|
|
{
|
|
id = Convert.ToInt32(dv[i]["F_DeviceCommandIndex"]),
|
|
name = Convert.ToString(dv[i]["F_DeviceCommandName"]),
|
|
};
|
|
}
|
|
return Ok(new { total = dv.Count, items });
|
|
}
|
|
else
|
|
{
|
|
return StatusCode(422);
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询所选择设备的目标位置
|
|
/// 通过T_Base_device表里新增的F_nextdevice字段里面取出来的
|
|
/// 需要处理一下设备名称
|
|
/// </summary>
|
|
/// <param name="device"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("arrowlocation")]
|
|
public IActionResult GetArrowlocation(
|
|
[FromQuery] string device)
|
|
{
|
|
Model.MDevice deviceInfo = new Model.MDevice();
|
|
|
|
try
|
|
{
|
|
deviceInfo = sc.GetDeviceInfo(Convert.ToInt32(device), out string err);
|
|
}
|
|
catch (Exception err)
|
|
{
|
|
return StatusCode(422);
|
|
}
|
|
if (!string.IsNullOrEmpty(device))
|
|
{
|
|
//string sql = "";
|
|
//int devicekind = sc.GetDeviceKindIndex(out string error,Convert.ToInt32(device));
|
|
//switch (devicekind)
|
|
//{
|
|
// case 1:
|
|
// sql = string.Format("SELECT F_DeviceIndex, F_DeviceName FROM T_Base_Lane_Gate,T_Base_LaneInfo,T_Base_Device where F_LaneIndex = F_LaneDeviceIndex and T_Base_LaneInfo.F_StackIndex={0} and T_Base_Lane_Gate.F_LaneGateDeviceIndex=T_Base_Device.F_DeviceIndex order by F_DeviceIndex",device);
|
|
// break;
|
|
// case 2:
|
|
// sql = string.Format("SELECT F_DeviceIndex, F_DeviceName FROM T_Base_Device WHERE F_DeviceKindIndex =2 and F_DBW1Address is not null and f_s7connection='{0}'", deviceInfo.S7Connection);
|
|
// break;
|
|
//}
|
|
var sql = $"select F_DeviceIndex,F_DeviceKindIndex,F_DeviceName,F_nextdevice from T_Base_Device where F_nextdevice is not null and F_DeviceIndex={device} order by F_DeviceKindIndex,F_DeviceIndex ";
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
|
|
char[] sp = new char[1] { ';' };
|
|
|
|
// 202410 HSCP - 去掉最后的";\r\n",否则有空选项,查询报错
|
|
string NextDevice = dv[0]["F_nextdevice"].ToString().Trim().Replace("\r\n", "");
|
|
if (NextDevice.Substring(NextDevice.Length - 1) == ";") NextDevice = NextDevice.Substring(0, NextDevice.Length - 1);
|
|
string[] nextdevice = NextDevice.Split(sp);
|
|
|
|
//string[] nextdevice = Convert.ToString(dv[0]["F_nextdevice"]).Split(sp);
|
|
|
|
if (nextdevice.Length > 0)
|
|
{
|
|
var items = new dynamic[nextdevice.Length];
|
|
for (int j = 0; j < nextdevice.Length; j++)
|
|
{
|
|
sql = $"select F_DeviceIndex,F_DeviceName from T_Base_Device where F_DeviceIndex={nextdevice[j]}";
|
|
DataView dw = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
|
|
|
|
items[j] = new
|
|
{
|
|
id = Convert.ToInt32(dw[0]["F_DeviceIndex"]),
|
|
name = Convert.ToString(dw[0]["F_DeviceName"]),
|
|
};
|
|
}
|
|
return Ok(new { total = nextdevice.Length, items });
|
|
}
|
|
return StatusCode(422);
|
|
|
|
}
|
|
else
|
|
{
|
|
return StatusCode(422);
|
|
}
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 查询所选择的堆垛机货叉add for TJBS
|
|
/// </summary>
|
|
/// <param name="fork"></param>
|
|
/// <returns></returns>
|
|
[HttpGet("Fork")]
|
|
public IActionResult GetFork(
|
|
[FromQuery] string device)
|
|
{
|
|
if (!string.IsNullOrEmpty(device))
|
|
{
|
|
|
|
var sql = $"SELECT F_FORKAMOUNT FROM T_BASE_STACKINFO WHERE F_STACKINDEX = {device} ";
|
|
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
var count = Convert.ToInt32(dv.Count);
|
|
var items = new dynamic[dv.Count];
|
|
|
|
for (int i = 0; i < dv.Count; i++)
|
|
{
|
|
int fork1 = 0;
|
|
int fork2 = 0;
|
|
if (Convert.ToInt32(dv[i]["F_FORKAMOUNT"]) == 2)
|
|
{
|
|
items = new dynamic[2];
|
|
count = 2;
|
|
fork1 = 1;
|
|
fork2 = 2;
|
|
count = 2;
|
|
for (int k = 0; k < 2; k++)
|
|
{
|
|
|
|
items[k] = new
|
|
{
|
|
id = k + 1,
|
|
forkF = fork1,
|
|
forkS = fork2,
|
|
};
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
items[i] = new
|
|
{
|
|
id = Convert.ToString(dv[i]["F_FORKAMOUNT"]),
|
|
forkF = fork1,
|
|
forkS = fork2,
|
|
//name = Convert.ToString(dv[i]["F_DeviceCommandName"]),
|
|
};
|
|
}
|
|
}
|
|
|
|
if ("26011,26012".Contains(device))
|
|
{
|
|
count = 2;
|
|
items = new dynamic[2];
|
|
for (int i = 0; i < 2; i++)
|
|
{
|
|
int fork1 = 1;
|
|
int fork2 = 2;
|
|
for (int k = 0; k < 2; k++)
|
|
{
|
|
items[k] = new
|
|
{
|
|
id = k + 1,
|
|
forkF = fork1,
|
|
forkS = fork2,
|
|
};
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return Ok(new { total = count, items });
|
|
}
|
|
else
|
|
{
|
|
return StatusCode(422);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 创建单一设备指令 add for TJBS
|
|
/// 当前方法没考虑多叉堆垛机
|
|
/// </summary>
|
|
/// <param name="id">设备编号</param>
|
|
/// <param name="order">动作指令</param>
|
|
/// <param name="arrowlocation">目标位置</param>
|
|
/// <param name="z">排</param>
|
|
/// <param name="x">列</param>
|
|
/// <param name="y">层</param>
|
|
/// <returns></returns>
|
|
[HttpPost]
|
|
public IActionResult Post(
|
|
[FromMember] int id,
|
|
[FromMember] int order,
|
|
[FromMember] int arrowlocation,
|
|
[FromMember] int z,
|
|
[FromMember] int x,
|
|
[FromMember] int y,
|
|
[FromMember] int f,
|
|
[FromMember] int pallettype)
|
|
{
|
|
#region tjbs
|
|
// 写入数据库
|
|
//WcfControl.ModifyMonitorTask(device, id, action, out o);
|
|
//if (!string.IsNullOrEmpty(o))
|
|
//{
|
|
// return StatusCode(422);
|
|
//}
|
|
|
|
//add for TJBS 增加个排列层限制
|
|
/*
|
|
if (arrowlocation.ToString().Length != 5)
|
|
{
|
|
if (id == 11001)
|
|
{
|
|
if (x > 102)
|
|
{
|
|
return StatusCode(407);
|
|
}
|
|
}
|
|
else if (id == 11002)
|
|
{
|
|
if (x < 9 || x > 112)
|
|
{
|
|
return StatusCode(407);
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
#endregion
|
|
|
|
int[] Arr = { 15301, 15302, 15303, 15304 };
|
|
int intpallettype = 5;
|
|
if (!string.IsNullOrEmpty(pallettype.ToString()) && intpallettype != 0 && Arr.Contains(id) == false )
|
|
{
|
|
intpallettype = pallettype;
|
|
// 1是小托盘 2 是大托盘
|
|
if (intpallettype != 1 && intpallettype != 2)
|
|
{
|
|
return StatusCode(408);
|
|
}
|
|
}
|
|
int forkno = f;//货叉编号
|
|
int beginDeviceIndex = 0;//原程序中高端设备用的
|
|
string epp = string.Empty;
|
|
epp = arrowlocation.ToString();
|
|
string cellcode = string.Empty;//货位编码
|
|
string enCellcode = string.Empty;//原程序 终止货位编码 选择送货的时候 取这个货位了
|
|
string cforks = string.Empty;//原程序中 几个货叉
|
|
|
|
Model.MDevice deviceInfo = new Model.MDevice();
|
|
deviceInfo = sc.GetDeviceInfo(id, out string err);
|
|
if (deviceInfo.DeviceKind == 1)
|
|
{
|
|
//if (forkno == 0)
|
|
//{
|
|
// var sql = $"SELECT F_FORKAMOUNT FROM T_BASE_STACKINFO WHERE F_STACKINDEX = {id} ";
|
|
// DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
// if (dv.Count > 0)
|
|
// {
|
|
// if (Convert.ToInt32(dv[0]["F_FORKAMOUNT"]) == 2)
|
|
// {
|
|
// return StatusCode(423);
|
|
// }
|
|
|
|
// }
|
|
//}
|
|
if (arrowlocation == -1)
|
|
{
|
|
//当给堆垛机下任务并且选的是货位 并且XYZ没有传递实际值 认为出错了
|
|
//arrowlocation=-1时 证明选的是”立库货位“ 在前端设置的
|
|
if (x == 0 || y == 0 || z == 0)
|
|
{
|
|
return StatusCode(422);
|
|
}
|
|
|
|
//选择的是立库货位
|
|
StringBuilder zxystr = new StringBuilder();
|
|
zxystr.Append((z.ToString().Length == 1 ? "0" + z.ToString() : z.ToString())).Append("-").Append(
|
|
((x.ToString().Length == 1) ? ("0" + x.ToString()) : (x.ToString()))).Append("-").Append(
|
|
((y.ToString().Length == 1) ? ("0" + y.ToString()) : (y.ToString())));
|
|
|
|
if (order == 2 || order == 4 || order == 7)//将取 取货
|
|
{
|
|
cellcode = zxystr.ToString();
|
|
}
|
|
if (order == 3 || order == 5)//将送 送货
|
|
{
|
|
enCellcode = zxystr.ToString();
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
//选的是站台
|
|
var sql = $"select F_ZXY from T_Base_Lane_Gate where F_LaneGateDeviceIndex={arrowlocation}";
|
|
DataView dv = CStaticClass.dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
|
|
|
|
if (order == 2 || order == 4 || order == 7)//将取 取货
|
|
{
|
|
cellcode = dv[0]["F_ZXY"].ToString();
|
|
}
|
|
if (order == 3 || order == 5)//将送 送货
|
|
{
|
|
enCellcode = dv[0]["F_ZXY"].ToString();
|
|
}
|
|
}
|
|
}
|
|
if (deviceInfo.DeviceKind == 2)
|
|
{
|
|
epp = arrowlocation.ToString();
|
|
}
|
|
|
|
|
|
|
|
Model.HandTask ht = new Model.HandTask(id , order, beginDeviceIndex, epp,cellcode, enCellcode, forkno, cforks, intpallettype.ToString());
|
|
|
|
sc.BuildHandTask(ht, out string error);
|
|
if (error == null || error == "")
|
|
{
|
|
return StatusCode(200);
|
|
}
|
|
else
|
|
{
|
|
return StatusCode(409);
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
}
|