StoreManager.cs 14.4 KB
using log4net;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.IO.Ports;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text; 
using System.Windows.Forms;

namespace OnlineStore.DeviceLibrary
{
    public class StoreManager
    {
        /// <summary>
        /// 当前出入库的模式
        /// </summary>
        public static int CurrInOutType = 0;
         
        public static StoreBean Store = null;
        public static StoreConfig Config = null;
        private static bool isInit = false;
        public static bool IsConnectServer = !ConfigAppSettings.GetValue(Setting_Init.http_server).Equals("");
        public static Dictionary<int, BaseConfig> allConfigMap = new Dictionary<int, BaseConfig>();
        public static Dictionary<string, string> StepDesMap = new Dictionary<string, string>();
        public StoreManager()
        {
        }
        #region 配置文件加载更新
        public static void CheckEnum(Type type, bool isStep=false)
        {
            if (type.IsEnum)
            {
                List<int> valueList = new List<int>();
                foreach (int item in Enum.GetValues(type))
                {
                    if (valueList.Contains(item))
                    {
                        LogUtil.error(type.Name + "枚举值:" + item + "重复存在,请检查代码,即将 退出程序!");
                        MessageBox.Show(type.Name + "枚举值:" + item + "重复存在,请检查代码,即将 退出程序!");
                        Application.Exit();
                        break;
                    }
                    valueList.Add(item);
                    if (isStep)
                    {
                        StoreMoveStep en = (StoreMoveStep)item;
                        string des = EnumDesHelper.GetStepDes(en);
                        StepDesMap.Add(en.ToString(), des);
                    }
                }
            }
        }
        public static StoreBean InitStore()
        {
            try
            {
                allConfigMap = new Dictionary<int, BaseConfig>();
                BaseConfig.SubDIList = new Dictionary<int, Dictionary<string, ConfigIO>>();
                BaseConfig.SubDOList = new Dictionary<int, Dictionary<string, ConfigIO>>();
                BaseConfig.ProIOIpMap = new Dictionary<string, string>();
                if (!isInit)
                {
                    string server = ConfigAppSettings.GetValue(Setting_Init.http_server);
                    if (server.Equals(""))
                    {
                        IsConnectServer = false;
                    } 
                    CheckEnum(typeof(StoreMoveStep),true);
                    CheckEnum(typeof(StoreStatus));
                    CheckEnum(typeof(StoreRunStatus));

                    isInit = true;
                    //string storeType = ConfigAppSettings.GetValue(Setting_Init.Store_Type);
                    int count = ConfigAppSettings.GetIntValue(Setting_Init.store_count);
                    LogUtil.info("配置的料仓 count=" + count + ",开始加载料仓配置");
                    string appPath = Application.StartupPath;
                    string CID = ConfigAppSettings.GetValue(Setting_Init.Store_CID);
                    Dictionary<int, BoxConfig> BoxList = new Dictionary<int, BoxConfig>();

                    string linefilePath = appPath + ConfigAppSettings.GetValue(Setting_Init.Store_ConfigPath);
                    Config = CSVConfigReader.LoadStoreConfig(0, CID, "Line", linefilePath);


                    string moveEquipConfig = ConfigAppSettings.GetValue(Setting_Init.Box_ConfigPath);
                    for (int i = 1; i <= count; i++)
                    {
                        string nameStr = i.ToString().PadLeft(1, '0');
                        string config = appPath + moveEquipConfig.Replace(".csv", "_" + nameStr + ".csv");
                        string storeIdConfig = Setting_Init.Store_CID + "_" + i;
                        string boxCid = ConfigAppSettings.GetValue(storeIdConfig);
                        BoxConfig boxConfig = CSVConfigReader.LoadBoxConfig(i, boxCid, "BOX", config);
                        boxConfig.SetIO(0);
                        boxConfig.SetIO(i);
                        BoxList.Add(i, boxConfig);
                        allConfigMap.Add(i, boxConfig);
                    }
                    string positionConfigFile = appPath + ConfigAppSettings.GetValue(Setting_Init.Store_Position_Config);
                    if (count > 1 || (!File.Exists(positionConfigFile)))
                    {
                        for (int i = 1; i <= count; i++)
                        {
                            int storeId = i;
                            if (BoxList.ContainsKey(i))
                            {
                                storeId = BoxList[i].GetStoreId();
                            }
                            string nameStr = i.ToString().PadLeft(1, '0');
                            string fileN = positionConfigFile.Replace(".csv", "_" + nameStr + ".csv");
                            CSVPositionReader<ACStorePosition>.AddCSVFile(fileN, storeId);
                        }
                    }
                    else
                    {
                        CSVPositionReader<ACStorePosition>.AddCSVFile(positionConfigFile);
                    }
                    LogUtil.info("加载料仓完成!"); 
                    Store = new StoreBean(Config, BoxList);
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
                MessageBox.Show(ex.ToString(), "加载配置错误(请检查配置)");
                Application.Exit();
            }
            return Store;
        }
       

        #endregion
 
        public static string GetLocationPosId(int deviceID, int width)
        {
            if (deviceID <= 0)
            {
                string config = ConfigAppSettings.GetValue(Setting_Init.Location_PosID_ + width);
                return config;
            }
            else
            {
                string config = ConfigAppSettings.GetValue(Setting_Init.Location_PosID_ +deviceID+"_"+ width);
                return config;
            }
        }
 
        public static void UpdateStoreConfig(StoreConfig storeConfig)
        {
            try
            {
                //位置配置到文件中
                string appPath = Application.StartupPath;

                string configFile = appPath + ConfigAppSettings.GetValue(Setting_Init.Store_ConfigPath);
                bool result = CSVConfigReader.SaveBoxPosition(configFile, storeConfig);
                if (!result)
                {
                    LogUtil.error("保存配置文件失败:" + configFile);
                }
                Store.Config = storeConfig;
                Config = storeConfig;
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:", ex);
            }
        }
        public static bool UpdateBoxConfig(BoxConfig storeConfig)
        {
            try
            {
                //位置配置到文件中
                string appPath = Application.StartupPath;
                string configFile = appPath + ConfigAppSettings.GetValue(Setting_Init.Box_ConfigPath);
                if (!Directory.Exists(configFile))
                {

                    configFile = configFile.Replace(".csv", "_" + storeConfig.DeviceID + ".csv");
                }
                bool result = CSVConfigReader.SaveBoxPosition(configFile, storeConfig);

                if (!result)
                {
                    LogUtil.error("保存配置文件失败:" + configFile);
                }
                allConfigMap[storeConfig.DeviceID] = storeConfig;
                Store.BoxConfigMap[storeConfig.DeviceID] = storeConfig;
                Store.BoxMap[storeConfig.DeviceID].Config = storeConfig;
                Store.BoxMap[storeConfig.DeviceID].MoveAxisConfig();
                return true;
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
            }
            return false;
        }
        private static string api_communication = "service/store/communication";    //流水线状态通信接口
        private static string api_nextFeeder = "service/store/nextFeeder";  // 出库站位列表切换接口
        public static string GetPostApi(string host)
        {
            if (host == "")
            {
                host = ConfigAppSettings.GetValue(Setting_Init.http_server);
            }
            if (!host.StartsWith("http://"))
            {
                host = "http://" + host;
            }
            if (!host.EndsWith("/"))
            {
                host = host + "/";
            }
            return host + api_communication;
        }
        public static string GetNextFeederApi(string host)
        {
            if (host == "")
            {
                host = ConfigAppSettings.GetValue(Setting_Init.http_server);
            }
            if (!host.StartsWith("http://"))
            {
                host = "http://" + host;
            }
            if (!host.EndsWith("/"))
            {
                host = host + "/";
            }
            return host + api_nextFeeder;
        }

        public static string Addr_posReelCheck = "/rest/api/qisda/device/posReelCheck";
        public static string GetPosReelCheckApi(string host)
        {
            if (host == "")
            {
                host = ConfigAppSettings.GetValue(Setting_Init.http_server);
            }
            if (!host.StartsWith("http://"))
            {
                host = "http://" + host;
            }
            if (!host.EndsWith("/"))
            {
                host = host + "/";
            }
            return host + Addr_posReelCheck;
        }

        public static string GetAddr(string addr, Dictionary<string, string> paramsMap)
        {
            string server = ConfigAppSettings.GetValue(Setting_Init.http_server);
            if (server.EndsWith("/"))
            {
                server = server.Substring(0, server.Length - 1);
            }
            string path = server + addr.Trim() + "?";
            foreach (string paramName in paramsMap.Keys)
            {
                string par = System.Web.HttpUtility.UrlEncode(paramsMap[paramName], System.Text.Encoding.UTF8);
                path += paramName + "=" + par + "&";
            }
            path = path.Substring(0, path.Length - 1);
            return path;
        }
        public static bool checkWatch(Stopwatch watch, int targetMs, bool isStop = false)
        {
            if (!watch.IsRunning)
            {
                watch.Restart();
                return false;
            }
            else if (watch.ElapsedMilliseconds >= targetMs)
            {
                if (isStop)
                {
                    watch.Stop();
                }
                return true;
            }
            return false;
        }


        //        取消出库任务地址:   /cancelOutTask      //参数: barcode
        private static string Addr_cancelPutInTask = "/rest/api/qisda/device/cancelOutTask";
        public static string cancelOutTask(  string barcode)
        {
            string msg = "";
            try
            {
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("barcode", barcode);

                string server = GetAddr(Addr_cancelPutInTask, paramMap);
                DateTime startTime = DateTime.Now;
                string resultStr = HttpHelper.Post(server, "");
                LogUtil.info("cancelOutTask    " + FormUtil.GetSpanStr(DateTime.Now - startTime) + "  【" + server + "】【" + resultStr + "】");

                ResultData data = JsonHelper.DeserializeJsonToObject<ResultData>(resultStr);

                if (data == null)
                {
                    return msg = " cancelOutTask【 " + barcode + "】 没有收到服务器反馈";
                }
                else if (data.code.Equals(0).Equals(false))
                {
                    return msg =  " cancelOutTask【 " + barcode + "】   :" + data.msg;
                }

                return "";
            }
            catch (Exception ex)
            {
                LogUtil.error(" cancelOutTask error :" + ex.ToString());
            }
            return msg;
        }

 

        //        料仓进出轴报警时,屏蔽正在执行的库位:   /rest/api/qisda/device/disablePos      //参数: posName: 库位编号
        //   返回:{ "code":0,"msg":"ok","data":""} code: 0为正常,其他为异常,msg: 消息,data:
        private static string Addr_disablePos = "/rest/api/qisda/device/disablePos";
        public static string disablePos(string posName)
        {
            string msg = "";
            try
            {
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("posName", posName);

                string server = GetAddr(Addr_cancelPutInTask, paramMap);
                DateTime startTime = DateTime.Now;
                string resultStr = HttpHelper.Post(server, "");
                LogUtil.info("disablePos    " + FormUtil.GetSpanStr(DateTime.Now - startTime) + "  【" + server + "】【" + resultStr + "】");

                ResultData data = JsonHelper.DeserializeJsonToObject<ResultData>(resultStr);

                if (data == null)
                {
                    return msg = " disablePos【 " + posName + "】 没有收到服务器反馈";
                }
                else if (data.code.Equals(0).Equals(false))
                {
                    return msg = " disablePos【 " + posName + "】   :" + data.msg;
                }

                return "";
            }
            catch (Exception ex)
            {
                LogUtil.error(" disablePos error :" + ex.ToString());
            }
            return msg;
        }

        public static string PlanName_CloseDoor = "DoorClosed";
        public static string PlanName_OpenDoor = "DoorOpening";
    }
    public class ResultData
    {
        //{"code":0,"msg":"ok","data":"7"} 
        public int code { get; set; }

        public string msg { get; set; }

        public object data { get; set; }
    }
}