/// <summary>
        /// 责任人员现场签到,用于网页端
        /// </summary>
        /// <param name="logItem">异常监控队列</param>
        /// <param name="cfgItem">设备编码</param>
        /// <returns></returns>
        public ErrorObject AckErrorLogPersonForWeb(error_log logItem, error_config cfgItem)
        {
            ErrorTypeService      errorTypeService = new ErrorTypeService();
            person                person           = null;
            material_request_info reInfo           = null;
            ErrorObject           errorObject      = null;

            errorObject = LoadErrorLogObject(logItem, cfgItem);
            if (errorObject.ELog != null && errorObject.eConfig != null)
            {
                Dictionary <string, object> dic = new Dictionary <string, object>();
                if (errorObject.eConfig.check_arrival == (int)ArrivalModeEnum.CardArrival)
                {
                    errorObject.eSignedPersons.Add(person);             //记录签到的人员
                    errorObject.ELog.arrival_person_id = person.id;     //更新具体的id信息
                    dic.Add("arrival_person_id", logItem.arrival_person_id);
                    errorObject.eSignedPersons.Add(person);             //签到人员记录
                }

                dic.Add("arrival_time", errorObject.ELog.arrival_time);

                errorLogManager.Update(errorObject.ELog, dic);      //提交数据库
                Console.WriteLine("AckErrorLogPerson,执行结束,id=" + errorObject.ELog.id);
                return(errorObject);
            }

            return(null);
        }
        /// <summary>
        /// 确认并解除异常记录,用于现场提交解除.
        /// 格式1:id&M&M:为web网页物料呼叫传递内容,id为material_require_info表id,M为特殊标识符
        /// 格式2:id:为web网页物料呼叫传递内容,id为error_log表id
        /// </summary>
        /// <param name="ErrorWatchList">当前监控队列</param>
        /// <param name="MachineCode">设备编码</param>
        /// <param name="StationId">站位id</param>
        /// <param name="TagValueInItem">标签值对象</param>
        /// <returns>正确执行返回ErrorObject,错误执行返回null</returns>
        public ErrorObject AckErrorLogDetailsForMat(string MachineCode, int StationId,
                                                    DeviceTagValueInfo TagValueInItem,
                                                    TagAreaAttributeEnum tagAreaAttributeEnum)
        {
            ErrorTypeService errorTypeService = new ErrorTypeService();
            ErrorObject      errorObject      = null;
            int errorLogId = -1;
            material_request_info reInfo = null;

            //支持两种格式,sn或者id&sn,id为异常记录的唯一标识号
            TagIdAndValue valueObject = tagService.GetTagValue(TagValueInItem.tag_value);

            if (tagAreaAttributeEnum == TagAreaAttributeEnum.machine_info)
            {
                MachineInfo machine = AndonGlobalCfg.MachinesList.FirstOrDefault(x => x.machine_code == MachineCode);
                errorObject = LoadErrorLogObject(TagValueInItem.device_id, TagValueInItem.system_tag_code, machine.unit_no, machine.line_id);
            }
            else if (tagAreaAttributeEnum == TagAreaAttributeEnum.station_info)
            {
                station_info station = AndonGlobalCfg.StationsList.FirstOrDefault(x => x.station_id == StationId);
                errorObject = LoadErrorLogObject(TagValueInItem.device_id, TagValueInItem.system_tag_code, station.unit_no, station.line_id);
            }

            if (valueObject.value != null && valueObject.value.Trim().Length >= 0)
            {
                if (AndonGlobalCfg.MaterialType == 0)
                {
                    errorLogId = valueObject.id;
                }
                else
                {
                    if (valueObject.id >= 0 && valueObject.value.Length > 0 && valueObject.value2.Length > 0)//物料呼叫确认
                    {
                        reInfo = materialRequestInfoManager.SelectById(valueObject.id);
                        Console.WriteLine("AckErrorLogDetails,errorLogId=" + errorLogId);
                        Console.WriteLine("AckErrorLogDetails,物料呼叫=" + valueObject.id);
                    }
                }
            }

            if (errorObject != null && errorObject.ELog != null)
            {
                if (reInfo != null)                                         //物料呼叫确认的对象
                {
                    errorObject.ELog.error_type_id    = reInfo.material_id; //更新为物料id信息
                    errorObject.ELog.maintenance_time = TagValueInItem.insert_time.AddHours(GlobalDefine.SysTimeZone);
                    errorObject.RequireMat            = reInfo;
                }
                else
                {
                    errorObject.ELog.error_type_id = -1;    //只有呼叫,无具体信息
                    errorObject.eTypeDetails       = null;
                }

                errorObject.ELog.release_time = TagValueInItem.insert_time.AddHours(GlobalDefine.SysTimeZone); //以变量值的时间更新结束时间

                Dictionary <string, object> dic = new Dictionary <string, object>();                           //加入需要更新的字段信息
                if (errorObject.ELog.error_type_id > 0)
                {
                    dic.Add("error_type_id", errorObject.ELog.error_type_id);//未确认原因的再给值。物料呼叫监测typeid会提前赋值
                    dic.Add("maintenance_time", errorObject.ELog.maintenance_time);
                }

                dic.Add("release_time", errorObject.ELog.release_time);
                errorLogManager.Update(errorObject.ELog, dic);        //提交数据库

                Console.WriteLine("AckErrorLogDetails,确认成功,id=" + errorObject.ELog.id);
                return(errorObject);
            }

            return(null);
        }
        /// <summary>
        /// 责任人员现场签到
        /// 现场提交有3格式:card或者id&card,id&card&M
        /// 格式1:只有card内容时,为HMI触控屏发送的格式,此方式只能确认第一条记录,HMI触控屏无物料呼叫列表;
        /// 格式2:id&card格式:为Web网页异常呼叫时传递内容。Id为error_log表id,card为人员卡号;
        /// 格式3:id&card&M:为web网页物料呼叫传递内容,id为material_require_info表id,card为人员卡号,M为特殊标识符
        /// </summary>
        /// <param name="ErrorWatchList">异常监控队列</param>
        /// <param name="MachineCode">设备编码</param>
        /// <param name="StationId">站位id</param>
        /// <param name="TagValueInItem">标签值对象</param>
        /// <returns></returns>
        public ErrorObject AckErrorLogPerson(string MachineCode, int StationId,
                                             DeviceTagValueInfo TagValueInItem,
                                             TagAreaAttributeEnum tagAreaAttributeEnum = TagAreaAttributeEnum.station_info)
        {
            ErrorTypeService errorTypeService = new ErrorTypeService();
            person           person           = null;
            ErrorObject      errorObject      = null;
            string           PersonCardId     = String.Empty;
            int errorLogId = -1;
            material_request_info reInfo = null;

            TagIdAndValue valueObject = tagService.GetTagValue(TagValueInItem.tag_value);

            if (tagAreaAttributeEnum == TagAreaAttributeEnum.machine_info)
            {
                MachineInfo machine = AndonGlobalCfg.MachinesList.FirstOrDefault(x => x.machine_code == MachineCode);
                errorObject = LoadErrorLogObject(TagValueInItem.device_id, TagValueInItem.system_tag_code, machine.unit_no, machine.line_id);
            }
            else if (tagAreaAttributeEnum == TagAreaAttributeEnum.station_info)
            {
                station_info station = AndonGlobalCfg.StationsList.FirstOrDefault(x => x.station_id == StationId);
                errorObject = LoadErrorLogObject(TagValueInItem.device_id, TagValueInItem.system_tag_code, station.unit_no, station.line_id);
            }
            if (valueObject.value == null || valueObject.value.Trim().Length == 0)
            {
                return(null); //值无效
            }
            else
            {
                if (valueObject.id >= 0 && valueObject.value.Length > 0 && valueObject.value2.Length == 0)
                {
                    errorLogId   = valueObject.id;
                    PersonCardId = valueObject.value;
                    Console.WriteLine("AckErrorLogPerson,errorLogId=" + errorLogId + ",PersonCardId=" + PersonCardId);
                }
                else if (valueObject.id >= 0 && valueObject.value.Length > 0 && valueObject.value2.Length > 0)//物料呼叫传递内容
                {
                    reInfo = materialRequestInfoManager.SelectById(valueObject.id);

                    PersonCardId = valueObject.value;
                    Console.WriteLine("AckErrorLogPerson,物料呼叫传递,PersonCardId=" + PersonCardId);
                }
                else if (valueObject.id < 0 && valueObject.value.Length > 0)
                {
                    PersonCardId = valueObject.value;
                    Console.WriteLine("AckErrorLogPerson,PersonCardId=" + PersonCardId);
                }
            }

            if (errorObject.eConfig.check_arrival == (int)ArrivalModeEnum.CardArrival) //以卡信息签到
            {
                if (PersonCardId.Length > 0)                                           //获取具体的描述对象
                {
                    person = personManager.GetPersonByCardId(PersonCardId);
                    if (person == null)
                    {
                        return(null);
                    }
                }
                else
                {
                    return(null);
                }
            }

            if (errorObject != null && errorObject.ELog != null)
            {
                errorObject.ELog.arrival_time = TagValueInItem.insert_time.AddHours(GlobalDefine.SysTimeZone);  //时间加8小时,更新结束时间
                Dictionary <string, object> dic = new Dictionary <string, object>();
                if (errorObject.eConfig.check_arrival == (int)ArrivalModeEnum.CardArrival)
                {
                    errorObject.eSignedPersons.Add(person);             //记录签到的人员
                    errorObject.ELog.arrival_person_id = person.id;     //更新具体的id信息
                    dic.Add("arrival_person_id", errorObject.ELog.arrival_person_id);
                    errorObject.eSignedPersons.Add(person);             //签到人员记录
                }

                dic.Add("arrival_time", errorObject.ELog.arrival_time);

                errorLogManager.Update(errorObject.ELog, dic);      //提交数据库
                Console.WriteLine("AckErrorLogPerson,执行结束,id=" + errorObject.ELog.id);
                return(errorObject);
            }

            return(null);
        }
        /// <summary>
        /// 确认并解除异常记录,用于现场提交解除.
        /// 支持三种格式:sn或者id&sn,id&M&M
        /// 格式1:只有card内容时,为HMI触控屏发送的格式,此方式只能确认第一条记录,HMI触控屏无物料呼叫列表;
        /// </summary>
        /// <param name="ErrorWatchList">当前监控队列</param>
        /// <param name="MachineCode">设备编码</param>
        /// <param name="StationId">站位id</param>
        /// <param name="TagValueInItem">标签值对象</param>
        /// <returns>正确执行返回ErrorObject,错误执行返回null</returns>
        public ErrorObject AckErrorLogDetails(string MachineCode, int StationId,
                                              DeviceTagValueInfo TagValueInItem,
                                              TagAreaAttributeEnum tagAreaAttributeEnum)
        {
            ErrorTypeService   errorTypeService = new ErrorTypeService();
            error_type_details eDetails         = null;
            ErrorObject        errorObject      = null;
            string             TypeSn           = string.Empty;
            int errorLogId = -1;
            Dictionary <string, object> dic = new Dictionary <string, object>();//加入需要更新的字段信息

            //支持两种格式,sn或者id&sn,id为异常记录的唯一标识号
            TagIdAndValue valueObject = tagService.GetTagValue(TagValueInItem.tag_value);

            if (tagAreaAttributeEnum == TagAreaAttributeEnum.machine_info)
            {
                MachineInfo machine = AndonGlobalCfg.MachinesList.FirstOrDefault(x => x.machine_code == MachineCode);
                errorObject = LoadErrorLogObject(TagValueInItem.device_id, TagValueInItem.system_tag_code, machine.unit_no, machine.line_id);
            }
            else if (tagAreaAttributeEnum == TagAreaAttributeEnum.station_info)
            {
                station_info station = AndonGlobalCfg.StationsList.FirstOrDefault(x => x.station_id == StationId);
                errorObject = LoadErrorLogObject(TagValueInItem.device_id, TagValueInItem.system_tag_code, station.unit_no, station.line_id);
            }

            if (errorObject != null && errorObject.eConfig != null &&
                errorObject.eConfig.check_ack == (int)AckModeEnum.CodeAck)
            {
                if (valueObject.value != null && valueObject.value.Trim().Length >= 0)
                {
                    if (valueObject.id >= 0 && valueObject.value.Length > 0 && valueObject.value2.Length == 0)
                    {
                        errorLogId = valueObject.id;
                        TypeSn     = valueObject.value;
                        Console.WriteLine("AckErrorLogDetails,errorLogId=" + errorLogId + ",TypeSn=" + TypeSn);
                    }

                    else if (valueObject.id < 0 && valueObject.value.Length > 0)
                    {
                        TypeSn = valueObject.value;
                        Console.WriteLine("AckErrorLogDetails,TypeSn=" + TypeSn);
                    }
                }

                if (TypeSn.Length > 0)//获取具体的描述对象
                {
                    eDetails = errorTypeService.GetTypeDetails(-1, TypeSn);
                    if (eDetails == null)
                    {
                        return(null);
                    }
                }
                else
                {
                    return(null);
                }
            }
            else if (errorObject != null && errorObject.eConfig != null &&
                     errorObject.eConfig.check_ack == (int)AckModeEnum.WithoutCodeAck)//不需要代码解除的
            {
                int.TryParse(valueObject.value, out errorLogId);
                if (errorLogId != errorObject.ELog.id)//传递的id不匹配
                {
                    Console.WriteLine("安灯解除出错,id不匹配退出:errorLogId=" + errorLogId + "errorObject.ELog.id=" + errorObject.ELog.id);
                    return(null);
                }
            }

            if (errorObject != null && errorObject.ELog != null)
            {
                if (errorObject.eConfig.check_ack == (int)AckModeEnum.CodeAck)
                {
                    errorObject.ELog.error_type_id    = eDetails.id; //更新具体的id信息
                    errorObject.eTypeDetails          = eDetails;    //记录详细原因
                    errorObject.ELog.maintenance_time = TagValueInItem.insert_time.AddHours(GlobalDefine.SysTimeZone);
                    dic.Add("maintenance_time", errorObject.ELog.maintenance_time);
                    dic.Add("error_type_id", errorObject.ELog.error_type_id);//未确认原因的再给值。物料呼叫监测typeid会提前赋值
                }

                errorObject.ELog.release_time = TagValueInItem.insert_time.AddHours(GlobalDefine.SysTimeZone);  //以变量值的时间更新结束时间
                dic.Add("release_time", errorObject.ELog.release_time);

                int count = errorLogManager.Update(errorObject.ELog, dic);        //提交数据库
                if (count > 0)
                {
                    Console.WriteLine("AckErrorLogDetails,确认成功,id=" + errorObject.ELog.id);
                }
                else
                {
                    Console.WriteLine("安灯解除更新数据失败!");
                }
                return(errorObject);
            }
            else
            {
                Console.WriteLine("安灯解除出错,errorObject != null && errorObject.ELog !=null 失败!");
            }

            return(null);
        }