/// <summary>
        /// 获取sensor实例
        /// </summary>
        /// <param name="sensor"></param>
        /// <returns></returns>
        private Entity.Config.Sensor GetSensor(T_DIM_SENSOR sensor)
        {
            using (var db = new SecureCloud_Entities())
            {
                if (sensor == null)
                {
                    return(null);
                }

                var sensinfo = (from p in db.T_DIM_SENSOR_PRODUCT
                                from s in db.T_DIM_PROTOCOL_TYPE
                                from f in db.T_DIM_SAFETY_FACTOR_TYPE
                                where p.PROTOCOL_ID == s.PROTOCOL_ID && p.PRODUCT_ID == sensor.PRODUCT_SENSOR_ID && f.SAFETY_FACTOR_TYPE_ID == sensor.SAFETY_FACTOR_TYPE_ID
                                select new { p.PRODUCT_ID, p.PRODUCT_CODE, p.FORMAULAID, s.PROTOCOL_CODE, f.THEMES_TABLE_NAME, f.THEMES_COLUMNS })
                               .FirstOrDefault();
                string dtucode = (from d in db.T_DIM_REMOTE_DTU
                                  where d.ID == sensor.DTU_ID
                                  select d.REMOTE_DTU_NUMBER).FirstOrDefault();
                if (sensinfo == null)
                {
                    return(null);
                }

                var sensorinfo = new Entity.Config.Sensor
                {
                    SensorID        = (uint)sensor.SENSOR_ID,
                    StructId        = sensor.STRUCT_ID == null ? 0 : (uint)sensor.STRUCT_ID,
                    DtuID           = sensor.DTU_ID == null ? 0 : (uint)sensor.DTU_ID,
                    DtuCode         = dtucode,
                    ModuleNo        = sensor.MODULE_NO == null ? 0 : (uint)sensor.MODULE_NO,
                    ChannelNo       = sensor.DAI_CHANNEL_NUMBER == null ? 0 : (uint)sensor.DAI_CHANNEL_NUMBER,
                    Name            = sensor.SENSOR_LOCATION_DESCRIPTION,
                    ProtocolType    = Convert.ToUInt32(sensinfo.PROTOCOL_CODE),
                    FormulaID       = sensinfo.FORMAULAID == null ? 0 : (uint)sensinfo.FORMAULAID,
                    FactorType      = sensor.SAFETY_FACTOR_TYPE_ID == null ? 0 : (uint)sensor.SAFETY_FACTOR_TYPE_ID,
                    FactorTypeTable = sensinfo.THEMES_TABLE_NAME,
                    TableColums     = sensinfo.THEMES_COLUMNS,
                    ProductCode     = sensinfo.PRODUCT_CODE,
                    ProductId       = sensinfo.PRODUCT_ID,
                    SensorType      = (SensorType)sensor.Identification,
                    //TODO 3-3
                    UnEnable = sensor.Enable
                };
                if (sensinfo.FORMAULAID != null)
                {
                    var pname = (from pf in db.T_DIM_FORMULA_PARA
                                 from pn in db.T_DIM_FORMULA_PARA_NAME
                                 where pf.ParaNameID == pn.ParaNameID && pf.FormulaID == sensinfo.FORMAULAID
                                 orderby pf.Order
                                 select new { pf.FormulaID, pf.FormulaParaID, pn.ParaName, pn.ParaAlias, pf.Order }
                                 ).ToList();
                    //sensorinfo.ParamCount = (ushort)pname.Count;
                    T_DIM_FORMULAID_SET param0 = (from pf in db.T_DIM_FORMULAID_SET
                                                  where pf.SENSOR_ID == sensor.SENSOR_ID
                                                  select pf).ToList().FirstOrDefault();
                    if (param0 == null)
                    {
                        return(sensorinfo);
                    }
                    for (int i = 0; i < pname.Count; i++)
                    {
                        var f = new FormulaParam
                        {
                            FID   = (int)pname[i].FormulaID,
                            PID   = pname[i].FormulaParaID,
                            Index = (int)pname[i].Order,
                            Name  = pname[i].ParaName,
                            Alias = pname[i].ParaAlias
                        };
                        var sp = new SensorParam(f)
                        {
                            Value =
                                Convert.ToDouble(param0.GetType()
                                                 .GetProperty("Parameter" + (i + 1))
                                                 .GetValue(param0, null))
                        };
                        sensorinfo.AddParameter(sp);
                    }
                }
                //else
                //{
                //    sensorinfo.ParamCount = 0;
                //}

                return(sensorinfo);
            }
        }
        public HttpResponseMessage AddSensor([FromBody] Sensor model)
        {
            using (var db = new SecureCloud_Entities())
            {
                try
                {
                    var sensor = new T_DIM_SENSOR();
                    sensor.STRUCT_ID             = model.StructId;
                    sensor.SAFETY_FACTOR_TYPE_ID = model.FactorId;
                    sensor.DTU_ID                      = model.DtuId;
                    sensor.MODULE_NO                   = model.ModuleNo;
                    sensor.DAI_CHANNEL_NUMBER          = (byte?)model.Channel;
                    sensor.PRODUCT_SENSOR_ID           = model.ProductId;
                    sensor.SENSOR_LOCATION_DESCRIPTION = model.Location;
                    sensor.IsDeleted                   = false;
                    sensor.Identification              = model.Identify;
                    sensor.Enable                      = model.Enable;

                    var entry = db.Entry(sensor);
                    entry.State = System.Data.EntityState.Added;

                    var query = (from p in db.T_DIM_SENSOR_PRODUCT
                                 join fn in db.T_DIM_FORMULA_PARA on p.FORMAULAID equals fn.FormulaID into forluma
                                 from f in forluma.DefaultIfEmpty()
                                 join fname in db.T_DIM_FORMULA_PARA_NAME on f.ParaNameID equals fname.ParaNameID into
                                 name
                                 from n in name
                                 where p.PRODUCT_ID == model.ProductId
                                 orderby f.Order
                                 select f.FormulaParaID).ToList();

                    var para = (from q in query
                                from v in model.Params
                                where q == v.Id
                                select new { q, v.Value }).ToList();

                    var old = from o in db.T_DIM_FORMULAID_SET where o.SENSOR_ID == sensor.SENSOR_ID select o;
                    foreach (var o in old)
                    {
                        db.Entry(o).State = System.Data.EntityState.Deleted;
                    }

                    var newParam = new T_DIM_FORMULAID_SET();
                    newParam.SENSOR_ID = sensor.SENSOR_ID;
                    for (int i = 0; i < para.Count(); i++)
                    {
                        newParam.GetType().GetProperty("FormulaParaID" + (i + 1)).SetValue(newParam, para[i].q, null);
                        newParam.GetType().GetProperty("Parameter" + (i + 1)).SetValue(newParam, (decimal?)para[i].Value, null);
                    }

                    db.Entry(newParam).State = System.Data.EntityState.Added;

                    if (model.CorrentId != null)
                    {
                        var correntSensor = new T_DIM_SENSOR_CORRENT();
                        var array         = model.CorrentId.Split(',');
                        for (int j = 0; j < array.Length; j++)
                        {
                            correntSensor.SensorId = sensor.SENSOR_ID;
                            var correntId = array.GetValue(j);
                            correntSensor.CorrentSensorId = Convert.ToInt32(correntId);
                            db.T_DIM_SENSOR_CORRENT.Add(correntSensor);
                            db.SaveChanges();
                        }
                    }


                    #region 日志信息

                    var fac =
                        db.T_DIM_SAFETY_FACTOR_TYPE.Where(f => f.SAFETY_FACTOR_TYPE_ID == model.FactorId)
                        .Select(f => f.SAFETY_FACTOR_TYPE_NAME)
                        .FirstOrDefault();

                    var dtu =
                        db.T_DIM_REMOTE_DTU.Where(d => d.ID == model.DtuId)
                        .Select(d => d.REMOTE_DTU_NUMBER)
                        .FirstOrDefault();

                    var pdt =
                        db.T_DIM_SENSOR_PRODUCT.Where(p => p.PRODUCT_ID == model.ProductId)
                        .Select(p => new { p.PRODUCT_NAME, p.PRODUCT_CODE })
                        .FirstOrDefault();

                    this.Request.Properties["ActionParameter"]     = JsonConvert.SerializeObject(model);
                    this.Request.Properties["ActionParameterShow"] =
                        string.Format(
                            "位置:{0},监测因素:{1},dtu:{2},模块号:{3},通道号:{4},设备类型:{5},参数:{6}",
                            string.IsNullOrEmpty(model.Location) ? string.Empty : model.Location,
                            fac ?? string.Empty,
                            dtu ?? string.Empty,
                            model.ModuleNo,
                            model.Channel,
                            pdt == null ? string.Empty : string.Format("{0}({1})", pdt.PRODUCT_NAME, pdt.PRODUCT_CODE),
                            model.Params == null ? string.Empty : string.Join(",", model.Params.Select(p => p.Value)));

                    #endregion

                    db.SaveChanges();
                    if (sensor.Identification != 2)
                    {
                        Entity.Config.Sensor sensorinfo = GetSensor(sensor);
                        var senopera = new SensorOperation
                        {
                            Action      = Operations.Add,
                            Sensor      = sensorinfo,
                            OldDtuId    = sensorinfo.DtuID,
                            OldSensorId = sensorinfo.SensorID
                        };
                        WebClientService.SendToET(ConfigChangedMsgHelper.GetSensorConfigChangedMsg(senopera));
                    }
                    return(Request.CreateResponse(HttpStatusCode.Accepted, StringHelper.GetMessageString("传感器新增成功")));
                }
                catch (NullReferenceException e)
                {
                    return(Request.CreateResponse(
                               HttpStatusCode.BadRequest,
                               StringHelper.GetMessageString("传感器新增失败:参数无效")));
                }
                catch (Exception e)
                {
                    return(Request.CreateResponse(HttpStatusCode.BadRequest, StringHelper.GetMessageString("传感器新增失败")));
                }
            }
        }