RobotEquip_ConnectServerTimer.cs 15.0 KB
using Asa;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;

namespace OnlineStore.DeviceLibrary
{
    public partial class RobotEquip
    {
        private System.Timers.Timer serverConnectTimer;
        public void InitConnectServerTimer()
        {
            serverConnectTimer = new System.Timers.Timer();
            serverConnectTimer.Interval = 1000;
            serverConnectTimer.AutoReset = true;
            serverConnectTimer.Enabled = true;
            serverConnectTimer.Elapsed += server_connect_timer_Tick;
        }
        internal void SetConnectServerTimer(bool open)
        {
            serverConnectTimer.Enabled = open;
        }
        #region 与服务器通信定时器

        private string CodeMsg = "";
        private bool isInProcess = false;
        private DateTime lastConTime = DateTime.Now;
        public void server_connect_timer_Tick(object sender, EventArgs e)
        {
            if (isInProcess)
            {
                TimeSpan span = DateTime.Now - lastConTime;
                if (span.TotalSeconds < 60)
                {
                    return;
                }
            }
            isInProcess = true;
            lastConTime = DateTime.Now;
            try
            {
                //humBean.HumidityProcess(this);
                if (IsDebug)
                {

                }
                else
                {
                    if (StoreManager.IsConnectServer)
                    {
                        GetRobotTask();
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(Name + "定时SendLineStatus出错:" + ex.ToString());
            }
            finally
            {
                isInProcess = false;
            }
        }
        /// <summary>
        /// 获取整个料仓的状态
        /// </summary> 
        //public Operation getLineBoxStatus()
        //{
        //    //构建发送给服务器的对象
        //    Operation lineOperation = new Operation();
        //    lineOperation.msg = "";
        //    lineOperation.alarmList = new List<AlarmInfo>();
        //    lineOperation.cid = CID;
        //    lineOperation.seq = ConfigAppSettings.nextSeq();
        //    lineOperation.status = 1;
        //    if (WarnMsg != "")
        //    {
        //        lineOperation.status = (int)DeviceStatus.Warning;
        //        lineOperation.msg = WarnMsg;
        //    }
        //    lineOperation.status = (int)DeviceStatus.StoreOnline;

        //    BoxStatus boxStatus = new BoxStatus();
        //    boxStatus.boxId = 1;

        //    boxStatus.msg = WarnMsg;
        //    lineOperation.msg = WarnMsg;

        //    if (WarnMsg.Equals(""))
        //    {
        //        boxStatus.msg = CodeMsg;
        //        lineOperation.msg = CodeMsg;
        //    }
        //    CodeMsg = "";
        //    //WarnMsg = ""; 
        //    //状态
        //    boxStatus.status = (int)deviceStatus;
        //    if (IsDebug)
        //    {
        //        boxStatus.status = (int)DeviceStatus.Debugging;
        //    }
        //    else if (runStatus.Equals(DeviceStatus.OutStoreBoxEnd) || runStatus.Equals(DeviceStatus.InStoreEnd))
        //    {
        //        boxStatus.data.Add(ParamDefine.posId, lastPosId);
        //        boxStatus.data.Add(ParamDefine.barcode,lastBarcode);
        //        boxStatus.data.Add(ParamDefine.executeTime, executeTime);
        //    }
        //    else if (!lastPosId.Equals(""))
        //    {
        //        boxStatus.data.Add(ParamDefine.posId, lastPosId);
        //        boxStatus.data.Add(ParamDefine.barcode, lastBarcode);
        //        boxStatus.data.Add(ParamDefine.executeTime,executeTime);
        //        boxStatus.status = (int)deviceStatus;
        //        if (lastPosId != "")
        //        {
        //            LogUtil.info("给服务器发送出入库消息:" + Name + ",status【" + deviceStatus + "】posId【" + lastPosId + "】barcode【"+lastBarcode+"】");
        //        }
        //        lastPosId = "";
        //        lastBarcode = "";
        //    }

        //    if (MoveInfo.MoveType.Equals(MoveType.InStore)||MoveInfo.MoveType.Equals(MoveType.OutStore))
        //    {
        //        if ((MoveInfo.MoveParam != null)&&( MoveInfo.MoveParam.PosInfo!=null))
        //        {
        //            if (!boxStatus.data.ContainsKey(ParamDefine.posId))
        //            {
        //                boxStatus.data.Add(ParamDefine.posId, MoveInfo.MoveParam.PosInfo.PosId);
        //            }
        //            boxStatus.data.Add(ParamDefine.code, MoveInfo.MoveParam.PosInfo.barcode);
        //        }
        //    }

        //    //温湿度
        //    //ASTemperateParam param = HumitureServer.GetTemperateParam(Config.Temperate_Serveraddress);
        //    HumitureParam param = humBean.LastData;
        //    if (param != null)
        //    {
        //        boxStatus.humidity = param.Humidity.ToString();
        //        boxStatus.temperature = param.Temperate.ToString();
        //    }
        //    lineOperation.boxStatus.Add(1, boxStatus);

        //    if (!alarmType.Equals(AlarmType.None))
        //    {
        //        lineOperation.alarmList.Add(alarmInfo);
        //    }
        //    return lineOperation;
        //}

        //public void SendLineStatus()
        //{
        //    DateTime time = DateTime.Now;
        //    //构建发送给服务器的对象
        //    Operation lineOperation = getLineBoxStatus();
        //    //如果还没湿度范围,先获取
        //    if (humBean.NeedGetTem())
        //    {
        //        lineOperation.op = 5;
        //        LogUtil.error(Name + "没有湿度预警范围,需要从服务器获取,发送OP=" + lineOperation.op, DeviceID + 105);
        //    }
        //    string server = ConfigAppSettings.GetValue(Setting_Init.http_server);
        //    Operation resultOperation = HttpHelper.PostOperation(SServerManager.GetPostApi(server), lineOperation);
        //    //LogUtil.info("resultOperation="+ JsonHelper.SerializeObject(resultOperation));
        //    //发送状态信息到服务器 
        //    if (resultOperation == null || (resultOperation.op <= 0))
        //    {
        //        //判断服务端是否返回出库操作
        //        return;
        //    }
        //    if (resultOperation.op.Equals(1))
        //    {
        //        //ReviceInStoreProcess("", resultOperation);
        //    }
        //    else if (resultOperation.op.Equals(2))
        //    {
        //        ReviceOutStoreProcess(resultOperation);
        //    }
        //    else if (resultOperation.op.Equals(5))
        //    {
        //        humBean.ProcessHumidityCMD(resultOperation);
        //    }
        //    else
        //    {
        //        LogUtil.error("收到服务器命令:op=" + resultOperation.op + ",未找到对应处理");
        //    }
        //    TimeSpan span = DateTime.Now - time;
        //    if (span.TotalMilliseconds > 10)
        //    {
        //        LogUtil.info(Name + "执行TimerProcess 共处理了【" + span.TotalMilliseconds + "】毫秒");
        //    }
        //}

        public void GetRobotTask()
        {
            DateTime time = DateTime.Now;
            //获取出库任务
            TaskData taskData = SServerManager.GetRobotTask();
            //发送状态信息到服务器 
            if (taskData == null || (taskData.code <0))
            {
                //判断服务端是否返回出库操作
                return;
            }
            if (taskData.code.Equals(1))
            {
                //上个任务还未结束
                return;
            }
            else if (taskData.code.Equals(0))
            {
                ReviceOutStoreProcess(taskData);
            }
            else
            {
                LogUtil.error("收到服务器命令:op=" + taskData.code + ",未找到对应处理");
            }
            TimeSpan span = DateTime.Now - time;
            if (span.TotalMilliseconds > 10)
            {
                LogUtil.info(Name + "执行TimerProcess 共处理了【" + span.TotalMilliseconds + "】毫秒");
            }
        }
        //public bool ReviceInStoreCMD(string posId, int plateH, int plateW, string message)
        //{
        //    string logName = "入库库位验证【 " + message + "】【" + posId + "】:";
        //    try
        //    {

        //        if (runStatus.Equals(RunStatus.Wait))
        //        {
        //            LogUtil.info(logName + " 设备未启动,验证失败");
        //            return false;
        //        }
        //        //发送扫码内容到服务器进行入库操作
        //        Operation operation = getLineBoxStatus();
        //        operation.op = 1;
        //        operation.data = new Dictionary<string, string>() { { "code", message }, { "boxId", this.DeviceID.ToString() } };
        //        operation.data.Add("inPos", posId);
        //        string server = ConfigAppSettings.GetValue(Setting_Init.http_server);
        //        for (int i = 1; i <= 3; i++)
        //        {
        //            bool timeOut = false;
        //            Operation resultOperation = HttpHelper.PostOperation(SServerManager.GetPostApi(server), operation);
        //            if (timeOut)
        //            {
        //                LogUtil.info(logName + " 第" + i + "次发送超时 ");
        //                continue;
        //            }
        //            if (resultOperation == null)
        //            {
        //                // CodeMsg = "二维码【" + message + "】没有收到服务器反馈";
        //                LogUtil.info(logName + " 没有收到服务器反馈 ");
        //            }
        //            else if (!string.IsNullOrEmpty(resultOperation.msg))
        //            {
        //                //如果有提示消息,直接显示提示
        //                LogUtil.info(logName + "服务器反馈 :" + resultOperation.msg);

        //            }
        //            else if (resultOperation.op.Equals(1))
        //            {
        //                LogUtil.info(logName + " 成功");
        //                return true;
        //            }
        //            else
        //            {
        //                LogUtil.info(logName + "服务器反馈 :" + JsonHelper.SerializeObject(resultOperation));
        //            }
        //            break;
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        LogUtil.info(logName + " 出错:" + ex.ToString());

        //    }
        //    return false;
        //}
        //public string LastVisualRfid = "";
        private void ReviceOutStoreProcess(TaskData resultOperation)
        {
            DateTime time = DateTime.Now;
            Dictionary<string, string> data = resultOperation.data;
            if (data != null && data.ContainsKey(ParamDefine.posId)
                      && data.ContainsKey(ParamDefine.plateH) && data.ContainsKey(ParamDefine.plateW)&&
                      data.ContainsKey(ParamDefine.type)&& data.ContainsKey(ParamDefine.cid))
            {
                char splitChar = '|';
                string[] cids= data[ParamDefine.cid].Split(splitChar);
                string[] posIdArray = data[ParamDefine.posId].Split(splitChar);
                string[] plateWArray = data[ParamDefine.plateW].Split(splitChar);
                string[] plateHArray = data[ParamDefine.plateH].Split(splitChar);

                string barcode = data.ContainsKey(ParamDefine.barcode) ? data[ParamDefine.barcode] : "";
                string dataStr = JsonHelper.SerializeObject(data);
                int type = int.Parse(data[ParamDefine.type]);
                if (type == 1)
                {
                    LogUtil.error($"收到服务器出库消息类型异常;{dataStr}");
                    return;
                }
                LogUtil.info("收到服务器出库消息:【" + dataStr + "】");

                int index = -1;
                foreach (string cid in cids)
                {
                    index++;
                    int plateW = Convert.ToInt32(plateWArray[index]);
                    int plateH = Convert.ToInt32(plateHArray[index]);
                    string posId = posIdArray[index];
                    InOutParam inoutParam = new InOutParam(new InOutPosInfo(barcode, posId, plateW, plateH));
                    inoutParam.PosInfo.Cid = cid;
                    //根据发送的cid
                    string[] existCids = ConfigAppSettings.GetValue(Setting_Init.Line_CID).Split(',');
                    bool hasCid = existCids.Contains(cid);
                    if (!hasCid)
                    {
                        //出入库没有找到服务器发送的库位,需要打印日志方便查询原因
                        WarnMsg = Name + "未找到料仓:【" + inoutParam.PosInfo.ToStr() + "】";
                        LogUtil.error(WarnMsg);
                        continue;
                    }
                    try
                    {
                        //判断是否接收过此料仓的出库信息
                        if (MoveInfo.MoveType.Equals(MoveType.OutStore) && (MoveInfo.MoveParam.PosInfo.Cid.Equals(cid)))
                        {
                            LogUtil.error(Name + " 出库命令【" + inoutParam.PosInfo.ToStr() + "】重复,正在【" + cid + "】出库中");
                            continue;
                        }

                        //判断排队列表中是否已存在
                        List<InOutParam> reviceList = new List<InOutParam>();
                        reviceList.AddRange(waitOutStoreList);
                        reviceList = (from m in reviceList where m.PosInfo.Cid.Equals(cid) select m).ToList<InOutParam>();
                        if (reviceList.Count > 0)
                        {
                            LogUtil.error(Name + " 出库命令【" + inoutParam.PosInfo.ToStr() + "】重复,排队列表中已存在【" + reviceList[0].PosInfo.ToStr() + "】");
                            continue;
                        }

                    }
                    catch (Exception ex)
                    {
                        LogUtil.error(Name + "验证出库【" + inoutParam.PosInfo.ToStr() + "】是否重复出错:" + ex.ToString());
                    }
                    StartExecuctOut(inoutParam);
                }

                TimeSpan span = DateTime.Now - time;
                if (span.TotalMilliseconds > 10)
                {
                    LogInfo(Name + "执行 ReviceOutStoreProcess 共处理了【" + span.TotalMilliseconds + "】毫秒");
                }
            }
        }
        #endregion

    }
}