RobotEquip_ConnectServerTimer.cs 15.1 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 code)
        {
            string logName = "入库库位验证【 " + code + "】【" + 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", code }, { "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 = "";
        string lastdataStr = "";
        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 taskid = data.ContainsKey(ParamDefine.taskId) ? data[ParamDefine.taskId] : "";
                string dataStr = JsonHelper.SerializeObject(data);
                int type = int.Parse(data[ParamDefine.type]);
                if (type == 1)
                {
                    LogUtil.error($"收到服务器出库消息类型异常;{dataStr}");
                    return;
                }
                if(!lastdataStr.Equals(dataStr))
                {
                    LogUtil.info("收到服务器出库消息:【" + dataStr + "】");
                    lastdataStr=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;
                    inoutParam.PosInfo.taskId = taskid;
                    //根据发送的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

    }
}