using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Windows.Forms; using XS_BLL; using XS_DAL; using XS_Model; namespace XS_HttpServer_LR { public partial class XS_HttpServerToART : Form { #region 全局变量 /// /// 展示数据 /// public string jsonData; /// /// 服务已启动 /// bool Connect { get; set; } List HttpPostRequest = new List(); /// /// 车辆实时上报 /// public int ti = 0; /// /// 亲求接口命中次数 /// public int num = 0; IO_INTERFACE_LOG IModel = new IO_INTERFACE_LOG(); #endregion 全局变量 public XS_HttpServerToART() { InitializeComponent(); } private void XS_HttpServerToLR_Load(object sender, EventArgs e) { XS_BLL.DisplaySet.CheckForIllegalCrossThreadCalls = false; XS_BLL.DisplaySet ds = new XS_BLL.DisplaySet(); ds.Dock = DockStyle.Fill; this.pDisplay.Controls.Add(ds); } #region 点击事件 /// /// 启动或停止接口 /// /// /// private void Btn_StartOrStop_Click(object sender, EventArgs e) { #region 数据连接验证 if (this.btn_StartOrStop.Text == "启动接口") { if (UtilityBLL.IsDbConnected(Global.connstring)) { new DisplaySet().AddListBoxItem("", "接数据库成功。。。"); } else { MessageBox.Show("数据库连接失败!!!"); new DisplaySet().AddListBoxItem("", "数据库连接失败。。。"); new DisplaySet().ErrorAddListBoxItem("", "数据库连接失败。。。"); return; } } #endregion string retTemp = string.Empty; #region 监听1 if (!Connect) { #region 发起请求线程 new Thread(() => upper_computer_interface()) { IsBackground = true }.Start(); new Thread(() => upper_computer_interface_WcsApply()) { IsBackground = true }.Start(); #endregion Connect = true; this.btn_StartOrStop.Text = "停止接口"; this.button2.Text = "停止上传"; try { HttpPostRequest = new List(); HttpPostRequest.Add(new MyHttp() { HttpPostListener = new HttpListener(), HttpPostUrl = Global.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 { Connect = false; this.btn_StartOrStop.Text = "启动接口"; this.button2.Text = "启动上传"; Thread.Sleep(2000); 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); } } #endregion } /// /// 清除数据 /// /// /// private void BtnReset_Click(object sender, EventArgs e) { new DisplaySet().eliminate(); } /// /// 数据查询 /// /// /// private void Btn_Query_Click(object sender, EventArgs e) { new DisplaySet().FileExhibition(); } /// /// 连接配置 /// /// /// private void Btn_UpCon_Click(object sender, EventArgs e) { if (!Connect) { FrmSetConfig frm = new FrmSetConfig(); this.Visible = false; frm.ShowDialog(); //this.Dispose(); this.Visible = true; } else { MessageBox.Show("请先停止接口!!!"); } } #endregion 点击事件 #region 接口方法 private static object objFB = new object(); /// /// 原料分拨接口 /// private void upper_computer_interface_WcsApply() { Boolean done = false; try { while (!done) { lock (objFB) { try { if (Connect) { //原料分拨申请 PRODUCT_ALLOC PRODUCT_ALLOC_BLL.PRODUCT_ALLOC();// 单独提线程 } } catch (Exception) { } Thread.Sleep(200); } } } catch (Exception ex) { LogHelper.ErrorLog(ex); } } private static object obj = new object(); /// /// 调取上位机WMS接口方法 /// private void upper_computer_interface() { Boolean done = false; try { while (!done) { lock (obj) { try { if (Connect) { IO_CONTROL_APPLY caModel = new IO_CONTROL_APPLY(); if (num % 10 == 0) { if (!this.checkBox2.Checked) { //wcs任务状态回传 CALLBACK_MOVECONFIRM_BLL.CALLBACK_MOVECONFIRM();//6 } } //删除 任务 PUBLIC_BLL.del(); #region 处理io_control_apply表 int count = caModel.GetModelList(" APPLY_TASK_STATUS in (0) ").Count; if (count > 0) { #region 安睿特 if (num % 10 == 0) { //托盘组要盘申请(申请空托盘垛) PALLET_EMPTY_BLL.PALLET_EMPTY();// } //原料分拨申请 PRODUCT_ALLOC //PRODUCT_ALLOC_BLL.PRODUCT_ALLOC();// 单独提线程 if (num % 4 == 0) { //托盘状态查询 CONTAINER/QUERYSTATUS CONTAINER_QUERYSTATUS_BLL.CONTAINER_QUERYSTATUS();// 类型 13 站台12007, 12008, 12011, 12014 //码垛完成上报(机械手码满包装袋后,申请入库) CONTAINER_PALLET_BLL.CONTAINER_PALLET();//类型 14 站台12007, 12008, 12011, 12014 } //备料托盘到位 MATERIAL_PREPARATION_BLL.MATERIAL_PREPARATION(); //拆分原料完成 SPLIT_MATERIAL_BLL.SPLIT_MATERIAL(); if (num % 10 == 0) { //入库巷道申请 STACK_INBOUNDROADWAYAPPLY_BLL.STACK_INBOUNDROADWAYAPPLY();//66 //入库库位分配 STACK/INBOUNDAPPLY STACK_INBOUNDAPPLY_BLL.STACK_INBOUNDAPPLY();// //空托盘组盘 STACK/EMPTYGROUP STACK_EMPTYGROUP_BLL.STACK_EMPTYGROUP();//6 } #region //任务异常上报(通用) /异常回传WCS/ERRORREPORT //EXCEPTION //WCS_ERRORREPORT_BLL.ERRORREPORT();//修改重写 // WCS任务取消(通用)WMS/CANCELTASK //WCS_CANCELTASK_BLL.WCS_CANCELTASK();//修改重写 //WCS 和 楚天接口 //WCS_REQUEST_PLATFORM_STATUS_BLL.WCS_REQUEST_PLATFORM_STATUS(); #endregion //新加异常状态上报 if (num % 20 == 0) { //设备异常上报 FAULTREPORT_BLL.FAULTREPORT(); } #endregion } #endregion #region 处理io_control表 IO_CONTROL cModel = new IO_CONTROL(); int count1 = cModel.GetModelList("CONTROL_STATUS in (999,77,7)").Count; if (count1 > 0) { //原盘拆垛申请 SPILTCONTSINER_BLL.SPILTCONTSINER_ALLOC(); } //码垛机任务生成和满垛生成上报任务 ZH_BLL.PALLETIZING_COUNT(); #endregion num++; if (num >= 1000) { num = 0; } } } catch (Exception) { } Thread.Sleep(Global.ThreadTime * 100); } } } catch (Exception) { } } /// /// 获取监听数据 /// /// private 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 = "WMS ==>> WCS";//接口方向 string InterfaceName = string.Empty; //接口访问方法地址信息 string[] InterfaceURL = url.Split('/').Where(c => !string.IsNullOrEmpty(c)).ToArray(); //固定接收地址 string[] receiveURL = Global.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('>'); //string glUrl = Global.Receive_HTTPURL.TrimEnd('/'); //if (url.Substring(url.Length - 1, 1) != "/") //{ // methodName = url.Substring(url.LastIndexOf('/') + 1, url.Length - url.LastIndexOf('/') - 1); //} //else //{ // methodName = UtilityBLL.GetReceiveValues(RecieveBuffer, "method"); //} #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 "API>>WCS>>PRODUCT>>ALLOC": case "WCSAPPLY": InterfaceNote = "测试--原料分拨申请"; retjson = PRODUCT_ALLOC_BLL.response_PRODUCT_ALLOC(); break; case "API>>WCS>>CONTAINER>>PALLET": InterfaceNote = "测试--码垛完成上报"; retjson = CONTAINER_PALLET_BLL.response_CONTAINER_PALLET(RecieveBuffer); break; case "API>>WCS>>CONTAINER>>STATUS": InterfaceNote = "测试--码垛托盘申请"; retjson = CONTAINER_QUERYSTATUS_BLL.response_CONTAINER_QUERYSTATUS(); break; case "AGV>>MOVECONFIRM": InterfaceNote = "测试--搬运确认"; retjson = AGV_MOVECONFIRM_BLL.response_AGV_MOVECONFIRM(); break; case "API>>WCS>>TASK>>CALLBACK": InterfaceNote = "测试--任务异常上报"; retjson = WCS_ERRORREPORT_BLL.response_ERRORREPORT(); break; case "WMS>>CANCELTASK": InterfaceNote = "测试--WCS任务取消"; retjson = WCS_CANCELTASK_BLL.response_WCS_CANCELTASK(); break; case "API>>WCS>>STACK>>INBOUNDLOCATORAPPLY": InterfaceNote = "测试--入库库位分配"; retjson = STACK_INBOUNDAPPLY_BLL.response_STACK_INBOUNDAPPLY(); break; case "STACK>>INBOUNDCONFIRM": InterfaceNote = "测试--上架/下架确认"; retjson = STACK_INBOUNDCONFIRM_BLL.response_STACK_INBOUNDCONFIRM(); break; case "PALLET>>EMPTY": InterfaceNote = "测试--托盘到位申请备货"; retjson = PALLET_EMPTY_BLL.response_PALLET_EMPTY(); break; case "API>>WCS>>CONTAINER>>EMPTYGROUP": InterfaceNote = "测试--空托盘组盘"; retjson = STACK_EMPTYGROUP_BLL.response_STACK_EMPTYGROUP(); break; case "API>>WCS>>STACK>>INBOUNDROADWAYAPPLY": InterfaceNote = "测试--入库巷道分配"; retjson = STACK_INBOUNDROADWAYAPPLY_BLL.response_STACK_INBOUNDROADWAYAPPLY(); break; case "API>>WCS>>SPILTCONTAINER": InterfaceNote = "测试--原盘备货"; retjson = SPILTCONTSINER_BLL.response_SPILTCONTAINER(); break; case "FAULTREPORT": InterfaceNote = "测试--设备异常上报"; retjson = FAULTREPORT_BLL.response_FAULTREPORT(); break; #endregion #region 正式 case "API>>WMS>>VISION>>RELEASE": InterfaceNote = "视觉扫描任务下发"; retjson = WMS_VISION_RELEASE_BLL.VISION_RELEASE(RecieveBuffer); break; case "API>>WMS>>TASK>>BIND": InterfaceNote = "物料任务启动/截批申请"; retjson = WMS_TASK_APPLYRELEASE_BLL.TASK_APPLYRELEASE(RecieveBuffer); break; case "API>>WMS>>AGV>>TASK": InterfaceNote = "AGV搬运任务"; retjson = WMS_AGV_MOVE_BLL.AGV_MOVE(RecieveBuffer); break; case "API>>AGV>>RELEASE": case "API>>WCS>>CANTAINER>>RELEASE": InterfaceNote = "任务释放"; retjson = WMS_AGV_RELEASE_BLL.AGV_RELEASE(RecieveBuffer); break; case "API>>WMS>>TASK>>CANCEL": InterfaceNote = "WMS任务取消(通用)"; retjson = WMS_CANCELTASK_BLL.CANCELTASK(RecieveBuffer); break; case "STACK>>OUTBOUND": case "API>>WMS>>STACK>>TASK": if (InterfaceName.ToUpper().Contains("API>>WMS>>STACK>>TASK")) { InterfaceNote = "出库或移库任务"; } else if (InterfaceName.ToUpper().Contains("STACK>>OUTBOUND")) { InterfaceNote = "线上盘点任务"; } retjson = WMS_STACK_OUTBOUND_BLL.STACK_OUTBOUND(RecieveBuffer, InterfaceName.ToUpper(), InterfaceNote); break; case "API>>WMS>>RESOURCE>>STATUS": InterfaceNote = "线路状态同步"; retjson = RESOURCE_SYNC_BLL.RESOURCE_SYNC(RecieveBuffer); break; #endregion case "WCS_REQUEST_PLATFORM_STATUS": InterfaceNote = "WMS与楚天接口"; retjson = WCS_REQUEST_PLATFORM_STATUS_BLL.WCS_REQUEST_PLATFORM_STATUS(RecieveBuffer); break; 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 接口日志记录 //IModel.interface_name = methodName; //IModel.interface_flow = direction; //IModel.interface_request = RecieveBuffer; //IModel.interface_datetime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); //IModel.interface_feedback = retjson; //IModel.interface_meno = message; //IModel.Insert(); if (string.IsNullOrEmpty(InterfaceNote)) { InterfaceNote = "无效方法:"; UtilityBLL.CreateINTERFACE_LOG(InterfaceName, InterfaceFlow, RecieveBuffer, retjson, InterfaceNote); } UtilityBLL.CreateINTERFACE_LOG(url, InterfaceFlow, 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); } } #endregion 接口方法 public class MyHttp { /// /// 侦听器 /// public HttpListener HttpPostListener { get; set; } /// /// URL地址 /// public string HttpPostUrl { get; set; } } private void XS_HttpServerToLR_FormClosing(object sender, FormClosingEventArgs e) { if (Connect) { MessageBox.Show("请先停止接口!!!"); e.Cancel = true; } } private void Button2_Click(object sender, EventArgs e) { if (!Connect) { Connect = true; this.button2.Text = "停止上传"; new DisplaySet().AddListBoxItem("", "启动上传接口:"); } else { Connect = false; this.button2.Text = "启动上传"; new DisplaySet().AddListBoxItem("", "停止上传接口:"); } } private void CheckBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked == true) { Global.checkBox1 = 1; } else { Global.checkBox1 = 0; } } private void Btn_dataQuery_Click(object sender, EventArgs e) { FrmInterfaceFeedback frm = new FrmInterfaceFeedback(); this.Visible = true; //frm.ShowDialog(); //this.Visible = true; frm.Show(); } /// /// 移库 /// /// /// private void Button3_Click(object sender, EventArgs e) { try { if (checkBox3.Checked) { string[] statePlace = textBox1.Text.Split('-'); string[] endPlace = textBox2.Text.Split('-'); int P = (Convert.ToInt32(endPlace[0]) - Convert.ToInt32(statePlace[0])) + 1; int L = (Convert.ToInt32(endPlace[1]) - Convert.ToInt32(statePlace[1])) + 1; int C = (Convert.ToInt32(endPlace[2]) - Convert.ToInt32(statePlace[2])) + 1; DataTable dt = DBOperator.GetTableSql($"select * from ST_CELL ");// where FCELLCODE = '{place}' if (dt != null && dt.Rows.Count > 0) { for (int p1 = 0; p1 < P; p1++) { for (int i = 0; i < L; i++) { for (int c1 = 0; c1 < C; c1++) { int pai = Convert.ToInt32(statePlace[0]) + p1; int lie = Convert.ToInt32(statePlace[1]) + i; int cen = Convert.ToInt32(statePlace[2]) + c1; if (pai > 4 || lie > 31 || cen > 19 || pai == 0 || lie == 0 || cen == 0) { continue; } string place = pai.ToString().PadLeft(2, '0') + "-" + lie.ToString().PadLeft(2, '0') + "-" + cen.ToString().PadLeft(2, '0'); int placeNum = dt.AsEnumerable().Where(c => c.Field("FCELLCODE") == place).Count(); if (placeNum > 0) { string fromRoadwayCode = Convert.ToInt32(endPlace[0]) + p1 > 2 ? "18002" : "18001"; string reqJson = string.Empty; #region json JObject objMis = new JObject(); objMis.Add(new JProperty("taskId", DateTime.Now.ToString("yyyyMMddHHmmssffff")));//任务号 objMis.Add(new JProperty("taskNo", 123));//WMS的任务号 objMis.Add(new JProperty("containerCode", "YKCS" + place));//托盘条码 objMis.Add(new JProperty("taskType", "CK"));//任务类型 IN 入库;OUT 出库;MV 移库任务;CK 盘点任务 objMis.Add(new JProperty("fromLocatorCode", place));//string 资源点 objMis.Add(new JProperty("fromRoadwayCode", fromRoadwayCode));//巷道 objMis.Add(new JProperty("fromStorey", cen));//层 objMis.Add(new JProperty("fromPlatoon", pai));//pai objMis.Add(new JProperty("fromLie", lie));//lie objMis.Add(new JProperty("fromLocatorCodeDepth", "1"));//深度 objMis.Add(new JProperty("toLocatorCode", place));//string 资源点 objMis.Add(new JProperty("toRoadwayCode", fromRoadwayCode));//巷道 objMis.Add(new JProperty("toStorey", cen));//层 objMis.Add(new JProperty("toPlatoon", pai));//pai objMis.Add(new JProperty("toLie", lie));//lie objMis.Add(new JProperty("toLocatorDepth", "1"));//深度 reqJson = JsonConvert.DeserializeObject(objMis.ToString()).ToString(); #endregion string InterfaceAdd = "http://10.10.16.23:8089/XS_HttpServer/STACK/OUTBOUND";//临时指定路径 string retJson = HttpHelper.PostJson(InterfaceAdd, reqJson); } } } } } } } catch (Exception) { throw; } } } }