Browse Source

fix load data from database

zhuyf 2 years ago
parent
commit
fa7431341e
2 changed files with 222 additions and 6 deletions
  1. 116 1
      db/db_card.cpp
  2. 106 5
      module_service/module_traffic_light_manager.cpp

+ 116 - 1
db/db_card.cpp

@@ -14,7 +14,7 @@ namespace db_card
 {
 	std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> load_car(const std::string & lszId64)
 	{
-		std::string sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, cf.freq_value, \
+		/*std::string sql = "SELECT ve.vehicle_id, ve.card_id, c.card_type_id, cf.freq_value, \
 						   ve.dept_id, ve.group_id, v.vehicle_type_id, vt.vehicle_level_id, \
 						   vt.is_railroad AS vt_is_railroad,ve.need_display ,ve.power_alarm,\
 						   vt.vehicle_category_id,v.bigger_car_flag,vc.over_speed, ve.enable_anti_collision \
@@ -118,6 +118,120 @@ namespace db_card
 	        
             map.insert({cardid,clb});
 
+            log_info("cardId:%s,id:%d dept_id:%d,need_display:%d-cardid:%s,categoryid:%d,vchile_id:%d,type:%d,vehicle_type_id:%d, anti_collision:%d",
+                    card_id.c_str(),
+                    vsid,
+                    dept_id,
+                    need_display,
+                    card_id.c_str(),
+                    vehicle_category_id,
+                    vehicle_id,
+                    card_type_id,
+                    vehicle_type_id,
+                    anti_collision
+                    );
+        }
+
+		return map;*/
+		std::string sql = "SELECT ve.vehicle_id, ve.card_id, ve.dept_id, c.card_type_id, cf.freq_value, v.vehicle_type_id, v.bigger_car_flag \
+		                            FROM dat_vehicle_extend ve \
+									LEFT JOIN dat_vehicle v ON ve.vehicle_id = v.vehicle_id \
+									LEFT JOIN dat_card c ON ve.card_id = c.card_id \
+									LEFT JOIN dat_dept d ON ve.dept_id = d.dept_id \
+								    LEFT JOIN dat_vehicle_type vt ON v.vehicle_type_id = vt.vehicle_type_id \
+									LEFT JOIN dat_card_freq cf on cf.freq_id = c.freq_id \
+									WHERE c.state_id = 0";
+
+		std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> map;
+
+		if("" == lszId64)
+		{
+			sql.append(";");
+		}
+		else
+		{
+			sql.append(" AND ve.card_id ='");
+			sql.append(lszId64);
+			sql.append("';");
+		}
+
+		std::string Error;
+		YADB::CDBResultSet DBRes;
+		sDBConnPool.Query(sql.c_str(),DBRes,Error);
+		int nCount = DBRes.GetRecordCount( Error );
+		if (nCount < 1)
+		{
+			log_error("增加或修改失败,数据库中找不到: sql=%s", sql.c_str());
+			return map;
+		}
+
+		while ( DBRes.GetNextRecod(Error) )
+		{
+			unsigned int vehicle_id  = 0;
+			DBRes.GetField( "vehicle_id",vehicle_id, Error );
+
+			std::string card_id;
+			DBRes.GetField( "card_id",card_id, Error );
+
+			uint32_t vsid = atoi(card_id.substr(3).c_str());
+
+			unsigned int card_type_id  = 0;
+			DBRes.GetField( "card_type_id",card_type_id, Error );
+
+            double freq = 0;
+            DBRes.GetField("freq_value", freq, Error);
+
+			int dept_id = 0;
+			DBRes.GetField( "dept_id",dept_id, Error );
+
+			int group_id = 0;
+			//DBRes.GetField( "group_id",group_id, Error );
+
+			int vehicle_type_id = 0;
+			DBRes.GetField( "vehicle_type_id",vehicle_type_id, Error );
+
+			int vehicle_level_id = 0;
+			//DBRes.GetField( "vehicle_level_id",vehicle_level_id, Error );
+
+			int need_display = 0;
+			//DBRes.GetField( "need_display",need_display, Error );
+
+			int power_alarm = 0;
+			//DBRes.GetField( "power_alarm",power_alarm, Error );
+
+			int vehicle_category_id = 0;
+			//DBRes.GetField( "vehicle_category_id",vehicle_category_id, Error );
+
+			int bigger_car_flag= 0;
+			DBRes.GetField( "bigger_car_flag",bigger_car_flag, Error );
+
+			double over_speed= 0;
+			//DBRes.GetField( "over_speed",over_speed, Error );
+            uint32_t type = tool_other::card_id_to_type(card_id);
+            if(type != card_type_id)
+            {
+                log_error("init_vehicle_card error.Type is not matching..");
+                continue;
+            }
+			std::string strategy;
+			if(card_type_id ==CT_VEHICLE)
+				strategy = config.get("car.strategy","CS_1");
+			else if(vehicle_type_id==VT_COAL_CUTTER)
+				strategy = config.get("coalface.strategy","WS_1");
+            else
+				strategy = config.get("person.strategy","PS_1");
+
+			auto clb = card_location_base::make_car(strategy,vsid,need_display,card_type_id,
+					dept_id,vehicle_category_id, vehicle_type_id,vehicle_level_id,vehicle_id);
+			uint64_t cardid = tool_other::type_id_to_u64(card_type_id,vsid);
+            clb->m_freq = freq;
+
+            int anti_collision = 0;
+            //DBRes.GetField("enable_anti_collision", anti_collision, Error);
+            clb->m_enable_anti_collision = ((anti_collision == 1) ? true : false);
+	        
+            map.insert({cardid,clb});
+
             log_info("cardId:%s,id:%d dept_id:%d,need_display:%d-cardid:%s,categoryid:%d,vchile_id:%d,type:%d,vehicle_type_id:%d, anti_collision:%d",
                     card_id.c_str(),
                     vsid,
@@ -133,6 +247,7 @@ namespace db_card
         }
 
 		return map;
+
 	}
 
 	std::unordered_map<uint64_t,std::shared_ptr<card_location_base>> load_person(const std::string & lszId64,const std::string&strategy)

+ 106 - 5
module_service/module_traffic_light_manager.cpp

@@ -13,11 +13,19 @@ traffic_light_manager* traffic_light_manager::instance()
 }
 
 /*
- * 加载红绿灯基础信息
+ * @breif
+ *		加载红绿灯基础信息
+ * @param
+ *		int lid		红绿灯号
+ * @return
+ *		无
+ * @note
+ * @warning
+ * @bug
  * */
 void traffic_light_manager::init_light_from_db(int lid)
 {
-    std::string sql = "select light_id, lights_group_id, ip, x, y ,z, reader_id, state, port, physics_light_id, physics_light_direction, special_flag, stream_state from dat_light";
+    /*std::string sql = "select light_id, lights_group_id, ip, x, y ,z, reader_id, state, port, physics_light_id, physics_light_direction, special_flag, stream_state from dat_light";
     if(0 == lid){
         sql += ";";
     }else{
@@ -72,15 +80,73 @@ void traffic_light_manager::init_light_from_db(int lid)
         }
     }
 
+    logn_info(2, "sql:%s",sql.c_str());*/
+	std::string sql = "select light_id, lights_group_id, x, y, stream_state from dat_light";
+    if(0 == lid){
+        sql += ";";
+    }else{
+        sql += " where light_id = " + std::to_string(lid);
+        sql += ";";
+    }
+
+    std::string err = "";
+
+    YADB::CDBResultSet res;
+    sDBConnPool.Query(sql.c_str(), res, err);
+    int count =  res.GetRecordCount(err);
+    if(count < 1){
+        log_error("增加或修改失败,error:%s", sql.c_str());
+        return;
+    }
+
+    while(res.GetNextRecod(err)){
+        int light_id = 0;
+        res.GetField("light_id", light_id, err);
+        int group_id = 0;
+        res.GetField("lights_group_id", group_id, err);
+        std::string ip = "";
+        res.GetField("ip", ip, err);
+        double x = 0.0, y = 0.0, z = 0.0;
+        res.GetField("x", x, err);
+        res.GetField("y", y, err);
+        int site_id = 0, state = 0, port = 0, phy_light_id = 0, phy_direction = 0, special = 0, stream = 0;
+        res.GetField("stream_state", stream, err);
+        traffic_light_ptr pl = find_light(light_id);
+        if(nullptr == pl){
+            pl = std::make_shared<traffic_light>(x, y, z, light_id, group_id, ip, state, port, phy_light_id, phy_direction, special, stream);
+            m_unmap_lights.insert(std::make_pair(light_id, pl));           
+        }else{
+            pl->update(x, y , z, light_id, group_id, ip, state, port, phy_light_id, phy_direction, special, stream);
+        }
+
+        // 将红绿灯分配到对应组中
+        auto it_group = m_unmap_groups.find(pl->m_group_id);
+        if(it_group != m_unmap_groups.end())
+        {
+            it_group->second->m_vt_lights.push_back(pl);
+            pl->m_area_id = it_group->second->m_area_id;
+            pl->m_map_id  = it_group->second->m_map_id;
+        }
+    }
+
     logn_info(2, "sql:%s",sql.c_str());
 }
 
 /*
- * 加载红绿灯组基础信息
+ * @brief
+ *		 加载红绿灯组基础信息
+ * @param
+ *		int gid		红绿灯组id
+ * @return
+ *		无
+ * @note
+ * @warning
+ * @bug
+ *
  * */
 void traffic_light_manager::init_light_group_from_db(int gid)
 {
-    std::string sql = "select lights_group_id, x, y, z, scope, map_id, area_id, manual_control_time, light_auto_interval, up_stream_idx from dat_lights_group";
+    /*std::string sql = "select lights_group_id, x, y, z, scope, map_id, area_id, manual_control_time, light_auto_interval, up_stream_idx from dat_lights_group";
     if(gid > 0){
         sql += " where lights_group_id = " + std::to_string(gid);
     }
@@ -127,7 +193,42 @@ void traffic_light_manager::init_light_group_from_db(int gid)
     }
     
     logn_info(2, "sql:%s",sql.c_str());
-    output_upstreamidx();
+    output_upstreamidx();*/
+	
+	std::string sql = "select lights_group_id, x, y, scope from dat_lights_group";
+    if(gid > 0){
+        sql += " where lights_group_id = " + std::to_string(gid);
+    }
+    sql += ";";
+
+    std::string err = "";
+    YADB::CDBResultSet res;
+    
+    sDBConnPool.Query(sql.c_str(), res, err);
+    int count = res.GetRecordCount(err);
+    if(count < 1){
+        log_error("增加或修改失败,数据库中找不到:sql=%s", sql.c_str());
+        return;
+    }
+
+    while(res.GetNextRecod(err)){
+        int group_id = 0;       
+        res.GetField("lights_group_id", group_id, err); 
+        double x = 0.0, y = 0.0, z = 0.0, scope = 0.0;
+        res.GetField("x", x, err);
+        res.GetField("y", y, err);
+        res.GetField("scope", scope, err);
+        int map_id = 0, area_id = 0;
+        traffic_light_group_ptr pg = find_group(group_id);
+        if(nullptr == pg){
+            pg = std::make_shared<traffic_light_group>(x, y, 0.0, group_id, scope, 0, 0, 0);
+            m_unmap_groups.insert(std::make_pair(group_id, pg));
+        }else{
+            pg->update(x, y, z, group_id, scope, 0, 0, 0);
+        }
+    }
+    
+    logn_info(2, "sql:%s",sql.c_str());
 }
 
 void traffic_light_manager::init_light_group_path()