StoreManager.cs 9.6 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.Text; 
using System.Windows.Forms;

namespace OnlineStore.DeviceLibrary
{
    public class StoreManager
    {
        public static TinStoreBean Store = null;
        public static TieStoreConfig Config = null;
        private static bool isInit = false;
        public static bool IsConnectServer = !ConfigAppSettings.GetValue(Setting_Init.http_server).Equals("");
        public StoreManager()
        {
        }
        public static void CheckEnum(Type type)
        {
            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 + "重复存在,请检查代码!");
                        Application.Exit();
                        break;
                    }
                    valueList.Add(item);
                }
            }
        }
        public static TinStoreBean InitStore()
        {
            try
            {
                if (!isInit)
                {
                    string server = ConfigAppSettings.GetValue(Setting_Init.http_server);
                    if (server.Equals(""))
                    {
                        IsConnectServer = false;
                    }
                    else
                    {
                        //IsConnectServer = true;
                    }
                    CheckEnum(typeof(StoreMoveStep));
                    CheckEnum(typeof(StoreStatus));
                    CheckEnum(typeof(StoreRunStatus));

                    isInit = true;
                    string storeType = ConfigAppSettings.GetValue(Setting_Init.Store_Type);
                    LogUtil.info("配置的料仓 类型=" + storeType + ",开始加载料仓配置");
                    if (storeType == StoreType.RC_AC_SA_TIN)
                    {
                        string appPath = Application.StartupPath;
                        string CID = ConfigAppSettings.GetValue(Setting_Init.Store_CID);
                        string linefilePath = appPath + ConfigAppSettings.GetValue(Setting_Init.Store_ConfigPath);

                        StoreConfig storeConfig = CSVConfigReader.LoadConfig(1, CID, StoreType.RC_AC_SA_TIN, linefilePath);
                        string positionConfigFile = appPath + ConfigAppSettings.GetValue(Setting_Init.Store_Position_Config);

                        if (File.Exists(positionConfigFile))
                        {
                            LogUtil.info("加载位置文件:" + positionConfigFile);
                            CSVPositionReader<TinStorePosition>.ReloadCSVFile(positionConfigFile);
                        }
                        List<TinStorePosition> allList = new List<TinStorePosition>(CSVPositionReader<TinStorePosition>.allPositionMap.Values);
                        List<TinStorePosition> weightList = (from m in allList where m.PosType >= 100 orderby m.PosType descending select m).ToList<TinStorePosition>();
                        if (weightList.Count <= 0)
                        {
                            LogUtil.error("加载配置出错:未找到砝码配置,即将退出程序");
                            MessageBox.Show("加载配置出错:未找到砝码配置,即将退出程序");
                            System.Environment.Exit(System.Environment.ExitCode);
                            return null;
                        }
                        Config = (TieStoreConfig)storeConfig;
                        Store = new TinStoreBean(Config);
                        Store.CID = CID;
                        LogUtil.info("加载料仓完成!");
                        return Store;
                    }
                }
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
                MessageBox.Show(ex.ToString(), "加载配置错误(请检查配置)");
                System.Environment.Exit(System.Environment.ExitCode);
            }
            return Store;
        }
        /// <summary>
        /// 修改了料仓配置,更新缓存,更新配置文件(只能更新PRO的配置)
        /// </summary>
        public static bool UpdateBoxConfig(TieStoreConfig 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;
                Store.MoveAxisConfig();
                return true;
            }
            catch (Exception ex)
            {
                LogUtil.error("出错:" + ex.ToString());
            }
            return false;
        }
        public static bool checkWatch(Stopwatch watch, int targetMs, bool isStop = true)
        {
            if (!watch.IsRunning)
            {
                watch.Restart();
                return false;
            }
            else if (watch.ElapsedMilliseconds >= targetMs)
            {
                if (isStop)
                {
                    watch.Stop();
                }
                return true;
            }
            return false;
        }
        private static string api_communication = "service/store/communication";    //流水线状态通信接口 
        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;
        }
        private 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;
        }
        private static string Addr_matchMixSolder = "/service/store/solder/matchMixSolder";
        //        public class
        //        搅拌时获取与第一罐重量匹配的锡膏 
        //>地址: 
        //>>/service/store/solder/matchMixSolder
        //>
        //>参数:
        //>>barcode: 第一罐的条码
        //>
        //>   返回: 
        //>>` {"code":0,"msg":"ok","data":{"posId":"3D03B02","barcode":"xxxx","weight":"100"}}`
        //>>
        //>> - code: 0为正常,其他为异常, 
        //>> - msg:消息, 
        //>> - data:
        //>> - posId: 匹配的锡膏所在库位
        //>> - barcode: 匹配的锡膏条码
        //>> - weight: 匹配的锡膏的重量
        public static MixData matchMixSolder(string barcode, out string msg)
        {
            msg = "";
            string logName = " matchMixSolder [" + barcode + "] ";
            try
            {
                Dictionary<string, string> paramMap = new Dictionary<string, string>();
                paramMap.Add("barcode", barcode);//  barcode = 扫到的条码

                string server = GetAddr(Addr_matchMixSolder, paramMap);
                DateTime startTime = DateTime.Now;
                string resultStr = HttpHelper.Post(server, "");

                LogUtil.info(logName+ FormUtil.GetSpanStr(DateTime.Now - startTime) + " 【" + server + "】【" + resultStr + "】");
                //返回: { "code": 0, "msg":"ok", data: 7} 
                ServerData serverResult = JsonHelper.DeserializeJsonToObject<ServerData>(resultStr);
                if (serverResult == null)
                {
                    msg = logName + "  没有收到服务器反馈";
                }
                else if (serverResult.code.Equals(0).Equals(false))
                {
                    msg = logName + "  返回:" + "[" + serverResult.code + "]" + serverResult.msg;
                }

                else if (!serverResult.data.Equals(""))
                {
                    return serverResult.data;
                }
            }
            catch (Exception ex)
            {
                LogUtil.error(logName + " "+ ex.ToString());
            }
            return null;
        }

    }
    public class ServerData
    {
        //{"code":0,"msg":"ok","data":{"posId":"3D03B02","barcode":"xxxx","weight":"100"}}`
        public int code { get; set; }

        public string msg { get; set; }

        public MixData data { get; set; }
    }
    public class MixData
    {
        public int mixTime { get; set; }

        public int weight { get; set; }

        public string posId { get; set; }

        public string barcode { get; set; }

    }
}