/// <summary> /// 单个订单通知任务 /// </summary> private void DoWork(int index) { //DoingWork(Level.Info, string.Format("订单ID:[{0}]", string.Join(",", _queueNotifies.Select(x => x.q_id)))); while (NotifyCount > 0) { OrderNotifyQueueListModel notify; lock (_lock) { notify = _queueNotifies.Dequeue(); } if (notify == null) { continue; } GlobalPara.Request(); //DoingWork(Level.Info, string.Format("正在执行订单通知[{0}]的通知任务...", notify.q_id)); DoingWork(Level.Info, string.Format("正在执行订单通知任务,线程[{0}],交易码[{1}]...", index, notify.trade_code)); var success = SendNotify(notify); if (Success(success)) { GlobalPara.RequestSuccess(); } AfterSendNotify(notify, success); DoingWork(Level.Info, string.Format("订单通知[{0}]的任务已执行完成,结果为:[{1}]", notify.q_id, success)); } }
/// <summary> /// 发送机器人任务 /// </summary> /// <returns></returns> void SendRobotTask() { FmInfo.GetTaskInfo("机器人:一秒后发送机器人任务"); Thread.Sleep(1000); sendTask : if (RoBotState)//读取机器人状态为自动运行 { try { //如果有新增的任务就一直循环取出来发送该条任务,直到该条任务做完,切换下一条任务 while (connectSuccess) //发送机制:取出当前第一条未完成的任务,间隔一秒发送一次,直到这条任务完成,跳到下一条任务! { //获取机器人任务 while (!flag) { FmInfo.GetTaskInfo("机器人:处理完成信号中"); } if (FirstSend)//如果是第一次发送 { robotService.UpdateLastPacktaskNumCigstate(); FirstSend = false; } CreateTask : string taskInfo = robotService.GetRobotInfo(out string outStr); bytes = Encoding.ASCII.GetBytes(taskInfo); if (!RoBotState)//如果中途接收到机器人状态为 关闭状态 ,则停止发送任务 { goto sendTask; } if (string.IsNullOrWhiteSpace(taskInfo)) { // FmInfo.GetTaskInfo("机器人:任务发送完毕"); lblTask.Text = "机器人:任务发送完毕"; break; } try { if (isClientConnected(socketCore)) { socketCore?.Send(bytes, 0, bytes.Length, SocketFlags.None);//发送数据 if (!GlobalPara.JugValueEqualsLastOne2(taskInfo)) { FmInfo.GetTaskInfo("机器人:发送数据,任务:" + taskInfo); } // lblTask.Text = "机器人:发送任务:" + taskInfo; } else { connectSuccess = false; FmInfo.GetTaskInfo("机器人:远程主机强制断开一个现有连接,发送任务失败!"); lblServerInfo.Text = "机器人:服务器连接失败!"; CheckAlive();//断开连接 间隔 } } catch (Exception ex) { FmInfo.GetTaskInfo("机器人:任务发送停止,未知错误:" + ex.Message + "\r\n" + outStr + "任务将在10秒后重新发送!"); Thread.Sleep(10000);//暂停10秒后 继续读取 goto CreateTask; } Thread.Sleep(120); // 0.12秒后再次发送 } } catch (Exception ex) { FmInfo.GetTaskInfo("机器人:任务方法,未知错误:" + ex.Message); goto sendTask; } } else { //FmInfo.GetTaskInfo("机器人自动运行状态为关闭,十秒之后再次检测机器人状态"); lblTask.Text = "机器人:自动运行状态为关闭,一秒之后再次检测机器人状态"; Thread.Sleep(1000);//十秒之后再次检测机器人状态 goto sendTask; } }
/// <summary> /// 响应来自服务端的信息 /// </summary> /// <param name="ar"></param> private void ReceiveCallBack(IAsyncResult ar) { try { int length = socketCore.EndReceive(ar);//结束挂起的异步读取 //开始异步接受来自服务端的信息 socketCore.BeginReceive(buffer, 0, 2048, SocketFlags.None, new AsyncCallback(ReceiveCallBack), socketCore); if (length == 0) { return; } byte[] data = new byte[length]; Array.Copy(buffer, 0, data, 0, length); Invoke(new Action(() => { string msg = string.Empty; msg = Encoding.ASCII.GetString(data); //对获取的数据进行编码转换 //传输的数据会有乱码 if (msg.Length <= 0) // \0\0\0\0\0\\0\0\0\0\0\0\0\0\0\0\0 { return; } int start = msg.IndexOf("F"); //从F开始截取 int end = msg.IndexOf("\0"); //从 \0后截取结束 if (start < 0) { return; } msg = msg.Substring(start, end); string[] arrData = msg.Trim().Split(','); string outStr = ""; //错误信息 if (arrData[0].ToLower() == "f") //F头部 代表机器人完成 { if (GlobalPara.JugValueEqualsLastOne(msg)) //如果数据与上一次的相等 则不做任何操作 { return; } //S 所在的位置 单抓 3 双抓 5 if (msg.Contains("|")) //如果包含双抓 { if (arrData[4].ToLower() == "s") //s头部 代表机器人状态 { if (!CheckRobotRunState(arrData[5].Replace('\0', ' ').Trim())) { return; } } else { FmInfo.GetTaskInfo("机器人:异常收到来自机器人的信息,位置为4的索引不为S," + msg); } string[] newArr = msg.Substring(2).Trim().Split('|'); if (newArr.Length == 2) { flag = false; string[] arr1 = newArr[0].Trim().Split(','); string[] arr2 = newArr[1].Trim().Split(','); List <string[]> arrlist = new List <string[]>(); arrlist.Add(arr1); arrlist.Add(arr2); robotService.UpDateFinishTasks(arrlist, out outStr); //robotService.UpDateFinishTask(arr1, out outStr);//y 修改为一起修改 20190709 //robotService.UpDateFinishTask(arr2, out outStr); FmInfo.AutoRefreshUnShow(Convert.ToDecimal(arr2[0]), Convert.ToInt32(arr2[1])); FmInfo.FuncAutoRefsh();//更新显示界面 flag = true; //FmInfo.AutoRefreshUnShow(int.Parse(arr2[0])); if (!string.IsNullOrWhiteSpace(outStr)) { FmInfo.GetTaskInfo("机器人: " + outStr); } else { FmInfo.GetTaskInfo("机器人:任务号" + arr1[0] + ",条烟流水号:" + arr1[1] + ",数据库更新完成!"); FmInfo.GetTaskInfo("机器人:任务号" + arr2[0] + ",条烟流水号:" + arr2[1] + ",数据库更新完成!"); updateLabel("机器人:任务号" + arr2[0] + ",条烟流水号:" + arr2[1] + ",数据库更新完成!", lblFinshiTask); } if (!string.IsNullOrWhiteSpace(outStr))// { FmInfo.GetTaskInfo(outStr); } } else { FmInfo.GetTaskInfo("机器人:双抓任务完成信号有误,完成信号长度为" + newArr.Length); } } else//单抓的情况下 { if (arrData[3].ToLower() == "s") { if (!CheckRobotRunState(arrData[4].Replace('\0', ' ').Trim())) { return; } } else { FmInfo.GetTaskInfo("机器人:异常收到来自机器人的信息,位置为3的索引不为S," + msg); } updateLabel("机器人:收到单抓完成信号", lblFinshiTask); string[] Arr = msg.Substring(2).Trim().Split(','); if (Arr[1] == "0") { return; } flag = false; robotService.UpDateFinishTask(Arr, out outStr); flag = true; FmInfo.AutoRefreshUnShow(Convert.ToDecimal(Arr[0]), Convert.ToInt32(Arr[1])); FmInfo.FuncAutoRefsh();//更新显示界面 // FmInfo.AutoRefreshUnShow(int.Parse(Arr[0])); if (!string.IsNullOrWhiteSpace(outStr)) { FmInfo.GetTaskInfo("机器人: " + outStr); } else { FmInfo.GetTaskInfo("机器人:任务号" + Arr[0] + ",条烟流水号:" + Arr[1] + ",数据库更新完成!"); updateLabel("机器人:任务号" + Arr[0] + ",条烟流水号:" + Arr[1] + ",数据库更新完成!", lblFinshiTask); } } } })); } catch (ObjectDisposedException) { } catch (Exception ex) { Invoke(new Action(() => { FmInfo.GetTaskInfo("机器人:服务器断开连接。" + ex.Message); //ThreadHeartCheck(); })); } }