海门当升调度软件
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.

743 lines
34 KiB

using DBFactory;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
namespace WcfControlMonitorLib
{
public class IHttpHelperMonitor
{
public static List<MyHttp> HttpPostRequest = new List<MyHttp>();
public static DBOperator dbo = CStaticClass.dbo;
public static StringBuilder sql = new StringBuilder();
public static DataView dv = new DataView();
public static void createHttpPostRequest(bool bl)
{
if (bl)
{
try
{
HttpPostRequest = new List<MyHttp>();
HttpPostRequest.Add(new MyHttp() { HttpPostListener = new HttpListener(), HttpPostUrl = CStaticClass.AGV_Receive_HTTPURL });
foreach (var hpr in HttpPostRequest)
{
try
{
string url = hpr.HttpPostUrl;
hpr.HttpPostListener.Prefixes.Add(url);
hpr.HttpPostListener.Start();
Thread ThrednHttpPostRequest = new Thread(new ParameterizedThreadStart(HttpPostRequestHandle)) { IsBackground = true };
ThrednHttpPostRequest.Start(hpr);
}
catch (Exception ex)
{
//new DisplaySet().AddListBoxItem("", ex.Message);
}
//new DisplaySet().AddListBoxItem("", "启动监听成功:" + hpr.HttpPostUrl);
}
}
catch (Exception ex)
{
//new DisplaySet().AddListBoxItem("", "启动监听失败:" + ex.Message);
}
}
else
{
try
{
foreach (var hpr in HttpPostRequest)
{
hpr.HttpPostListener.Stop();
hpr.HttpPostListener.Prefixes.Clear();
hpr.HttpPostListener.Close();
hpr.HttpPostListener = null;
//new DisplaySet().AddListBoxItem("", "关闭监听成功:" + hpr.HttpPostUrl);
}
}
catch (Exception ex)
{
//new DisplaySet().AddListBoxItem("", "关闭监听失败:" + ex.Message);
}
}
}
/// <summary>
/// 获取监听数据
/// </summary>
/// <param name="myHttp"></param>
private static void HttpPostRequestHandle(object myHttp)
{
while (true)
{
try
{
if (myHttp is MyHttp)
{
HttpListenerContext rContext = (myHttp as MyHttp).HttpPostListener.GetContext();
Thread thread = new Thread(new ParameterizedThreadStart((context) =>
{
#region
HttpListenerContext MyContext = (HttpListenerContext)context;
string RecieveBuffer = string.Empty;
string en1 = MyContext.Request.ContentEncoding.EncodingName;
string ContentType = MyContext.Request.ContentType;
using (Stream myRequestStream = MyContext.Request.InputStream)
{
using (StreamReader myStreamReader = new StreamReader(myRequestStream, Encoding.UTF8))
{
RecieveBuffer = myStreamReader.ReadToEnd();
myStreamReader.Close();
myRequestStream.Close();
}
}
MyContext.Response.StatusCode = 200;
////MyContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
MyContext.Response.ContentType = "application/json";
MyContext.Response.ContentEncoding = Encoding.UTF8;
string url = MyContext.Request.Url.ToString();
string repose = string.Empty;//方法返回异常
string InterfaceNote = string.Empty;//方法注释
string retjson = string.Empty;//返回JSON串
string InterfaceFlow = " AGV==>> WMS";//接口方向
string InterfaceName = string.Empty;
//接口访问方法地址信息
string[] InterfaceURL = url.Split('/').Where(c => !string.IsNullOrEmpty(c)).ToArray();
//固定接收地址
string[] receiveURL = CStaticClass.AGV_Receive_HTTPURL.Split('/').Where(c => !string.IsNullOrEmpty(c)).ToArray();
int n = 0;//固定地址层级
for (int i = 0; i < InterfaceURL.Length; i++)
{
if (InterfaceURL[i] == receiveURL[receiveURL.Length - 1])
{
n = i;
break;
}
}
for (int i = n + 1; i < InterfaceURL.Length; i++)
{
InterfaceName = InterfaceName + ">>" + InterfaceURL[i];
}
InterfaceName = InterfaceName.TrimStart('>');
#endregion
switch (InterfaceName.ToUpper())
{
#region 测试
case "TEST":
#region
InterfaceNote = "测试接口";
InterfaceFlow = "WMS ==>> WCS";
retjson = "{\"code\":\"0\",\"message\":\"sucess\",\"data\":[{\"id\":\"485484115282370560\",\"orderId\":\"485823953844051968\",\"materialNo\":\"F03C.K38.784\",\"storageLocation\":\"M002\",\"storageBin\":\"A280330\",\"quantity\":\"2\",\"materialName\":\"10606无油衬套\",\"description\":\"C-MUBZ10-16\",\"timeStamp\":\"2022-09-02 16:21:00\"}]}";
break;
#endregion
case "V1>>MOVEPALLET":
InterfaceNote = "测试--下发AGV任务";
string taskId = GetReceiveValues(RecieveBuffer, "relatedOrder");
JObject data = new JObject();
data.Add(new JProperty("missionId", taskId));//托盘编码
JObject ob = new JObject();
ob.Add(new JProperty("msg", "操作成功"));
ob.Add(new JProperty("code", 200));
ob.Add(new JProperty("data", data));
retjson = JsonConvert.DeserializeObject(ob.ToString()).ToString();
break;
case "LOGIN":
JObject obToken = new JObject();
obToken.Add(new JProperty("msg", "操作成功"));
obToken.Add(new JProperty("code", 200));
obToken.Add(new JProperty("token", Guid.NewGuid().ToString()));
retjson = JsonConvert.DeserializeObject(obToken.ToString()).ToString();
break;
#endregion
#region 正式
case "AGVTASKFEEDBACK":
InterfaceNote = "AGV任务信息反馈";
LogOperation(InterfaceName, RecieveBuffer, retjson);
retjson = AGVTaskFeedback(RecieveBuffer);
break;
#endregion
default:
#region
InterfaceNote = "";
JObject objMis = new JObject();
objMis.Add(new JProperty("method", InterfaceName));
objMis.Add(new JProperty("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
JObject objDate = new JObject();
objDate.Add(new JProperty("code", "200"));//库号
objDate.Add(new JProperty("msg", "无效方法"));//入库输送站台编号
objDate.Add(new JProperty("taskId", ""));//容器编号
objMis.Add(new JProperty("data", objDate));
retjson = JsonConvert.DeserializeObject(objMis.ToString()).ToString();
break;
#endregion
}
#region 接口日志记录
if (string.IsNullOrEmpty(InterfaceNote))
{
InterfaceNote = InterfaceNote;
LogOperation(InterfaceName, RecieveBuffer, retjson);
}
#endregion 接口日志记录
byte[] SendBuffer = System.Text.Encoding.UTF8.GetBytes(retjson);
MyContext.Response.ContentLength64 = SendBuffer.Length;
using (var myOutputStream = MyContext.Response.OutputStream)
{
myOutputStream.Write(SendBuffer, 0, SendBuffer.Length);
myOutputStream.Close();
}
}))
{ IsBackground = true };
thread.Start(rContext);
}
}
catch (Exception)
{
}
Thread.Sleep(50);
}
}
/// <summary>
/// AGV任务信息反馈
/// </summary>
/// <param name="recieveBuffer"></param>
/// <returns></returns>
private static string AGVTaskFeedback(string recieveBuffer)
{
string retJson = string.Empty;
try
{
// {
// "taskId":1223, //任务Id
//"relatedOrder":"xxxx",
//"status":"completed", //completed(成功) ,failed(失败),outbin(离开起始点),redirect
//"msg":"msg", //异常消息
//"dst":"A-01-01", // ⽬标库位
//"alias":"alias",
//"robot":"robot-1" //运⾏⻋的code
//}
string taskId = GetReceiveValues(recieveBuffer, "taskId");//主任务id
//string relatedOrder = GetReceiveValues(recieveBuffer, "relatedOrder");//订单号/子任务 id
string status = GetReceiveValues(recieveBuffer, "status");//状态 completed(成功) ,failed(失败),outbin(离开起始点),redirect
string msg = GetReceiveValues(recieveBuffer, "msg");//异常消息
//string robot = GetReceiveValues(recieveBuffer, "robot");//运⾏⻋的code
//接收到AGV 任务反馈,根据AGV任务号,修改 AGV_task 表和 子任务表信息
sql.Remove(0, sql.Length);
sql.Append("SELECT * FROM AGV_TASK WHERE REMARK = ").Append(taskId);
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
if (dv.Count > 0)
{
//任务状态:0等待执行;AGV控制台更新,7AGV已经接受,10开始分配执行,999执行完成;错误码待定
//Started:任务启动 Failed:任务失败 Done:任务完成 RackUp:货架抬起 RackDown:货架放下
int AGV_TASK_STATUS = 0;
switch (status)
{
case "TargetOutDone"://成功
case "Done"://成功
AGV_TASK_STATUS = 999;
break;
case "Failed"://失败
AGV_TASK_STATUS = 30;
break;
case "RackUp"://离开起始点
AGV_TASK_STATUS = 980;
string sqlStr = string.Format("select * from AGV_TASK where REMARK = '{0}'", taskId);
DataView dataView = dbo.ExceSQL(sqlStr).Tables[0].DefaultView;
if (dataView != null && dataView.Count > 0)
{
int device_code = Convert.ToInt32(dataView[0]["START_DEVICE_CODE"]);
if (device_code == 12029 || device_code == 12033 || device_code == 12035 || device_code == 12037)
{
automaticTask(device_code, "12070");
}
}
break;
//case "redirect"://更改
// AGV_TASK_STATUS = 10;
break;
default:
AGV_TASK_STATUS = 30;//异常
break;
}
sql.Remove(0, sql.Length);
//sql.Append("UPDATE AGV_TASK SET AGV_TASK_STATUS = " + AGV_TASK_STATUS + " ,AGV_CODE = " + robot + " where FID = " + taskId + " ");
sql.Append("UPDATE AGV_TASK SET AGV_TASK_STATUS = " + AGV_TASK_STATUS + " where REMARK = '" + taskId + "' ");
int exNum = dbo.ExecuteSql(sql.ToString());
if (AGV_TASK_STATUS == 999)
{
//完成任务
}
JObject data = new JObject();
data.Add(new JProperty("missionId", taskId));//托盘编码
JObject ob = new JObject();
if (exNum > 0)
{
ob.Add(new JProperty("msg", "操作成功"));
ob.Add(new JProperty("code", 200));
}
else
{
ob.Add(new JProperty("msg", "操作失败"));
ob.Add(new JProperty("code", 500));
}
ob.Add(new JProperty("data", data));
retJson = JsonConvert.DeserializeObject(ob.ToString()).ToString();
}
else
{
JObject ob = new JObject();
ob.Add(new JProperty("msg", "操作失败"));
ob.Add(new JProperty("code", 500));
retJson = JsonConvert.DeserializeObject(ob.ToString()).ToString();
}
return retJson;
}
catch (Exception ex)
{
return retJson;
}
}
/// <summary>
/// AGV 任务下发
/// </summary>
public static bool AGVTaskRelease(string fid)
{
bool bl = false;
string reqJson = string.Empty;
try
{
string InterfaceAdd = CStaticClass.AGV_Upper_URL + "v1/movePallet";//请求路径
StringBuilder sql = new StringBuilder();
sql.Remove(0, sql.Length);
sql.Append("SELECT * FROM AGV_TASK WHERE AGV_TASK_STATUS = 0 and fid = " + fid);
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
for (int i = 0; i < dv.Count; i++)
{
StringBuilder sDor = new StringBuilder();
#region json
//起始位置
JObject takeFrom = new JObject();
takeFrom.Add(new JProperty("code", dv[i]["START_DEVICE_CODE"]));//货位编码
takeFrom.Add(new JProperty("height", 0));//库位地点高度
takeFrom.Add(new JProperty("useAlias", true));//是否使用别名
//目标位置
JObject transferTo = new JObject();
transferTo.Add(new JProperty("code", dv[i]["FINISH_DEVICE_CODE"]));//货位编码
transferTo.Add(new JProperty("height", 0));//库位地点高度
transferTo.Add(new JProperty("useAlias", true));//是否使用别名
//货物信息
JObject cargo = new JObject();
//cargo.Add(new JProperty("pallet", dv[i]["PALLET_BARCODE"]));//托盘编码
//cargo.Add(new JProperty("palletHeight", 0));//托盘高度
//cargo.Add(new JProperty("palletLength", 0));//托盘长度
//cargo.Add(new JProperty("palletWidth", 0));//托盘宽度
//cargo.Add(new JProperty("height", 0));//总高度
cargo.Add(new JProperty("type", "Pallet"));//总高度
string mapID = string.Empty;//地图编码
switch (dv[i]["START_DEVICE_CODE2"].ToString())
{
case "50001": mapID = "floor2"; break;
case "50002": mapID = "floor1"; break;
case "50003": mapID = "floor3"; break;
}
JObject objMis = new JObject();
objMis.Add(new JProperty("floor", mapID));//地图编码
objMis.Add(new JProperty("takeFrom", dv[i]["START_DEVICE_CODE"]));
objMis.Add(new JProperty("transferTo", dv[i]["FINISH_DEVICE_CODE"]));
objMis.Add(new JProperty("cargo", cargo));
objMis.Add(new JProperty("relatedOrder", dv[i]["REMARK"]));//单号
string json = JsonConvert.DeserializeObject(objMis.ToString()).ToString();
#endregion
reqJson = JsonConvert.DeserializeObject(objMis.ToString()).ToString();
LogOperation("AGVTaskRelease", "请求地址", InterfaceAdd);
string mode = CommonClassLib.AppSettings.GetValue("Mode");
if (mode != "test")
{
string retJson = PostJson(InterfaceAdd, reqJson);
string code = GetReceiveValues(retJson, "code");
string msg = GetReceiveValues(retJson, "msg");
if (code == "200")
{
bl = true;
}
else if (code == "601")//token 过期
{
GetAGVToKen();
}
#region 添加接口日志 及界面显示
LogOperation("AGVTaskRelease", reqJson, retJson);
#endregion
}
}
return bl;
}
catch (Exception ex)
{
LogOperation("AGVTaskRelease", reqJson, ex.Message);
return false;
}
}
/// <summary>
/// 向AGV 获取 token
/// </summary>
public static void GetAGVToKen()
{
string reqJson = string.Empty;
try
{
//http://ip:port/prod-api/api/v1/movePallet
//http://ip:port/prod-api/api/login
string InterfaceAdd = CStaticClass.AGV_Upper_URL + "login";//请求路径
StringBuilder sql = new StringBuilder();
sql.Remove(0, sql.Length);
sql.Append("SELECT * FROM AGV_TASK WHERE AGV_TASK_STATUS = 0 ");
dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;
#region json
JObject objMis = new JObject();
//objMis.Add(new JProperty("taskId", UtilityBLL.GetUuid()));//接口交互 任务号 谁发起,谁生成
objMis.Add(new JProperty("username", CStaticClass.AGV_username));//接口交互 任务号
objMis.Add(new JProperty("password", CStaticClass.AGV_password));
#endregion
reqJson = JsonConvert.DeserializeObject(objMis.ToString()).ToString();
string mode = CommonClassLib.AppSettings.GetValue("Mode");
if (mode != "test")
{
string retJson = PostJson(InterfaceAdd, reqJson);
string code = GetReceiveValues(retJson, "code");
//状态码 200 成功
if (code == "200")
{
string AGV_token = GetReceiveValues(retJson, "token");
string AGV_token_LastTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm");
//保存获取到的 token 值
CommonClassLib.AppSettings.SetValue("AGV_token", AGV_token);
CommonClassLib.AppSettings.SetValue("AGV_token_LastTime", AGV_token_LastTime);
CStaticClass.AGV_token = AGV_token;//AGV_token
CStaticClass.AGV_token_LastTime = AGV_token_LastTime;//AGV_token 上次请求时间
}
#region 添加接口日志 及界面显示
LogOperation("AGVTaskRelease", reqJson, retJson);
#endregion
}
}
catch (Exception ex)
{
LogOperation("AGVTaskRelease", reqJson, ex.Message);
}
}
/// <summary>
/// http传参 设置header值
/// </summary>
/// <param name="url">路径</param>
/// <param name="strPost">请求JSON body</param>
/// <param name="contentType">类别</param>
/// <param name=""></param>
/// <returns></returns>
public static string PostJson(string url, string strPost, string contentType = "application/json;charset=utf-8")
{
string retJson = string.Empty;
try
{
//string reqCode = UtilityBLL.GetReceiveValues(strPost, "reqCode");
string reqCode = "";
Hashtable head = new Hashtable();
//head.Add("appKey", Global.appKey);
//head.Add("requestPlan", Global.requestPlan);
//head.Add("timestamp", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//head.Add("version", Global.version);
//head.Add("httpVersion", Global.httpVersion);
//head.Add("sign", utilityBLL.GenerateMD5(Global.appSecret + reqCode));
//head.Add("sign", "A71253A5731E6261ADE4E23283AF2B28");
LogOperation("AGVTaskRelease", CStaticClass.AGV_token, retJson);
head.Add("Authorization", CStaticClass.AGV_token);
retJson = Http(url, "POST", contentType, head, strPost);
return retJson;
//string code = UtilityBLL.GetReceiveValues(retJson, "data,code");
#region 修改前
//string code = GetReceiveValues(retJson, "code");
//if (code == "0" || code == "1" || code == "00" || code == "01" || code == "99" || code == "200")
//{
// return retJson;
//}
//else
//{
// reqCode = GetReceiveValues(strPost, "reqCode");
// retJson = JsonConvert.SerializeObject(new { reqCode = reqCode, code = 200, message = retJson });
// return retJson;
//}
#endregion
//if (retJson == "操作超时")
//{
// reqCode = utilityBLL.getReceiveValues(strPost, "reqCode");
// retJson = JsonConvert.SerializeObject(new { reqCode = reqCode, code = 200, message = retJson });
//}else if(retJson == "远程服务器返回错误: (500) 内部服务器错误。")
//{
// reqCode = utilityBLL.getReceiveValues(strPost, "reqCode");
// retJson = JsonConvert.SerializeObject(new { reqCode = reqCode, code = 200, message = retJson });
//}
}
catch (Exception ex)
{
string reqCode = GetReceiveValues(strPost, "strPost");
return JsonConvert.SerializeObject(new { reqCode = reqCode, code = 200, message = ex.Message });
}
}
/// <summary>
/// 不做catch处理,需要在外部做
/// </summary>
/// <param name="url"></param>
/// <param name="method">默认GET,空则补充为GET</param>
/// <param name="contenttype">默认json,空则补充为json</param>
/// <param name="header">请求头部</param>
/// <param name="data">请求body内容</param>
/// <returns></returns>
public static string Http(string url, string method = "GET", string contenttype = "application/json;charset=utf-8", Hashtable header = null, string data = null)
{
string json = string.Empty;
try
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = string.IsNullOrEmpty(method) ? "GET" : method;
request.ContentLength = 0;
request.KeepAlive = false; //设置不建立持久性连接连接
request.ProtocolVersion = HttpVersion.Version10; //http的版本有2个,一个是1.0,一个是1.1 具体更具实际情况测试替换
request.ContentType = string.IsNullOrEmpty(contenttype) ? "application/json;charset=utf-8" : contenttype;
Encoding encoding = Encoding.UTF8;
//request.ContentLength = buffer.Length;
//request.GetRequestStream().Write(buffer, 0, buffer.Length);
if (header != null)
{
foreach (var i in header.Keys)
{
request.Headers.Add(i.ToString(), header[i].ToString());
}
}
if (!string.IsNullOrEmpty(data))
{
//request.Accept = "text/html, application/xhtml+xml, */*";
byte[] buffer = encoding.GetBytes(data.ToString());
request.ContentLength = buffer.Length;
request.GetRequestStream().Write(buffer, 0, buffer.Length);
}
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
request.Timeout = 1000 * 60;
Stream ResponseStream = response.GetResponseStream();
StreamReader StreamReader = new StreamReader(ResponseStream, Encoding.GetEncoding("utf-8"));
json = StreamReader.ReadToEnd();
StreamReader.Close();
ResponseStream.Close();
return json;
}
catch (Exception ex)
{
return json = ex.Message;
}
}
/// <summary>
/// 获取json中指定Key的value值 不能取集合中数据
/// </summary>
/// <param name="recieveBuffer">json串</param>
/// <param name="key">json节点</param>
/// <returns></returns>
public static string GetReceiveValues(string recieveBuffer, string key)
{
try
{
key = key.Replace(" ", "");
string[] keys = key.Split(',');
string resMag = recieveBuffer;
if (!string.IsNullOrEmpty(recieveBuffer))
{
for (int i = 0; i < keys.Count(); i++)
{
JObject obj = Newtonsoft.Json.Linq.JObject.Parse(resMag);
resMag = obj[keys[i]].ToString();
}
}
return resMag;
}
catch (Exception ex)
{
//LogHelper.ErrorLog(ex);
return "";
}
}
/// <summary>
/// 创建接口访问日志
/// </summary>
/// <param name="MethodName">方法名</param>
/// <param name="RequestJson">请求JSON</param>
/// <param name="ReturnJson">返回JSON</param>
public static void LogOperation(string methodName, string requestJson, string returnJson)
{
try
{
string path = System.Environment.CurrentDirectory;
string newPath = path + "\\" + methodName + "\\";
if (!System.IO.Directory.Exists(newPath))
{
System.IO.Directory.CreateDirectory(newPath);
}
string fName = newPath + DateTime.Now.ToString("yyyy-MM-dd") + ".log";
FileInfo fileInfo = new FileInfo(fName);
if (fileInfo.Exists == false)
{
using (StreamWriter sw = fileInfo.CreateText())
{
sw.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff"));
sw.WriteLine("请求:" + requestJson.Replace("\r\n", "").Replace("\n", ""));
sw.WriteLine("反馈:" + returnJson.Replace("\r\n", "").Replace("\n", ""));
sw.WriteLine();
sw.Flush();
sw.Close();
}
FilesDelete(fileInfo.DirectoryName);
}
else
{
using (StreamWriter sw = fileInfo.AppendText())
{
sw.WriteLine("时间:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ffff"));
sw.WriteLine("请求:" + requestJson.Replace("\r\n", "").Replace("\n", ""));
sw.WriteLine("反馈:" + returnJson.Replace("\r\n", "").Replace("\n", ""));
sw.WriteLine();
sw.Flush();
sw.Close();
}
}
}
catch (Exception)
{
}
}
private static void FilesDelete(string delURL, string suffix = ".log", int days = 30)
{
try
{
DirectoryInfo root = new DirectoryInfo(delURL);
FileInfo[] files = root.GetFiles();
if (files.Length <= 10)
{
return;
}
foreach (FileInfo fi in files)
{
if (fi.Extension.ToUpper() == suffix.ToUpper())
{
DateTime createTime = fi.CreationTime;
DateTime newTime = DateTime.Now.AddDays(-1);
if (Convert.ToDateTime(fi.CreationTime) <= DateTime.Now.AddDays(-days))
{
createTime = fi.CreationTime;
fi.Delete();
}
}
}
}
catch (Exception)
{
throw;
}
}
public class MyHttp
{
/// <summary>
/// 侦听器
/// </summary>
public HttpListener HttpPostListener { get; set; }
/// <summary>
/// URL地址
/// </summary>
public string HttpPostUrl { get; set; }
}
public static void automaticTask(int stVal, string endVal)
{
string dtime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
CCommonFunction ccf = new CCommonFunction();
int AutoManageIdx = ccf.GetTempManageIdx();
//插入临时调度任务T_Manage_Task(监控下的调度任务):
string Sql = "insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL," +
"FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME) " +
"values(" + AutoManageIdx + ",'" + "PP" + stVal.ToString() + "','4',2,'1','" + stVal + "','-','1','"
+ endVal + "','-', '-' ,'','-','" + dtime + "')";//20101028
if (dbo.ExecuteSql(Sql) > 0)
{
CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "生成自动任务成功", stVal.ToString(), $"生成{stVal}到{endVal} 任务成功!");
}
}
}
}