#include #include "common_tool.h" #include "message.h" #include "loc_message.h" #include "config_file.h" #include "card_person.h" #include "card_car.h" #include "db/db_card.h" #include "db/db_api/CDBSingletonDefine.h" #include "db/db_api/CDBResultSet.h" #include "tool_time.h" #include "mine.h" #include "log.h" #include "area.h" #include "card.h" #include "mine_business.h" extern config_file config; void card_list::init_staffer(int64_t id64) { std::string strategy = config.get("person.strategy","PS_1"); std::unordered_map> map=std::move(db_card::load_person(id64,strategy)); if(map.empty()) { log_error("增加或修改失败,数据库中找不到: card_id=%013lld", id64); return ; } if(-1 == id64) { log_info( "init_staffer. The record count=%d\n", map.size() ); card_list::instance()->add(map); } else { auto db_person=map.begin()->second; auto card_ptr = card_list::instance()->get(id64); if(card_ptr) { person* tmp_ptr= static_cast(card_ptr.get()); person* db_person_ptr= static_cast(db_person.get()); tmp_ptr->m_cid = db_person_ptr->m_cid; tmp_ptr->m_type = db_person_ptr->m_type; tmp_ptr->m_deptid = db_person_ptr->m_deptid; //group_id //occ_id tmp_ptr->m_level_id = db_person_ptr->m_level_id; tmp_ptr->m_display = db_person_ptr->m_display; tmp_ptr->m_workLine = db_person_ptr->m_workLine; tmp_ptr->m_stafferName = db_person_ptr->m_stafferName; tmp_ptr->m_deptName = db_person_ptr->m_deptName; tmp_ptr->m_worktype_id = db_person_ptr->m_worktype_id; } else { card_list::instance()->add(id64, db_person); } log_info("基础数据 增加或修改人卡成功:卡id:%ld, dept_id:%d,need_display:%d,occupation_level_id:%d", id64,db_person->m_deptid,db_person->m_display,db_person->m_level_id); } } void card_list::init_vehicle(int64_t id64) { std::unordered_map> map=std::move(db_card::load_car(id64)); if(map.empty()) { log_error("增加或修改失败,数据库中找不到: card_id=%013lld", id64); return ; } if(-1 == id64) { log_info( "init_vehicle. The record count=%d\n", map.size() ); card_list::instance()->add(map); } else { car* db_car= static_cast(map.begin()->second.get()); auto card_ptr = card_list::instance()->get(id64); if(card_ptr) { car* tmp_ptr= static_cast(card_ptr.get()); tmp_ptr->m_display = static_cast(db_car->m_display); tmp_ptr->m_deptid = db_car->m_deptid; tmp_ptr->m_vehicle_category_id = db_car->m_vehicle_category_id; tmp_ptr->m_vehicle_type_id = db_car->m_vehicle_type_id; tmp_ptr->m_level_id = db_car->m_level_id; } else { card_list::instance()->add(id64, map.begin()->second); } log_info("基础数据 增加或修改车卡成功:卡id:%ld, dept_id:%d,need_display:%d,categoryid:%d", id64,db_car->m_deptid,db_car->m_display,db_car->m_vehicle_category_id); } } void card_list::init_card_from_db() { init_staffer(-1); init_vehicle(-1); } void card_list::load_his_card_postion_from_db() { load_his_card_postion_vehicle(); load_his_card_postion_staff(); for(auto&iter: m_map) { auto card_ptr = iter.second; auto mine_tool_ptr = card_ptr->get_mine_tool(); if(mine_tool_ptr->m_is_attendance) { auto str = tool_time::to_str_ex( tool_time::to_ms(mine_tool_ptr->m_attendance_start_time)); log_info("加载考勤,考勤开始时间: %s, 卡id=%d,卡type=%d", str.c_str(), card_ptr->m_id, card_ptr->m_type); //还在考勤中表示,还在井下(初始化话数据) if(card_ptr->is_person()) { //CMineCardManager::instance()->OnPersonDown(card_ptr,true); } if(card_ptr->is_vehicle()) { //CMineCardManager::instance()->OnVehicleDown(card_ptr,true); } } } //初始化后检查是否超员 //CMineCardManager::instance()->OnPersonOvercrowdingWarning(); //CMineCardManager::instance()->OnVehicleOvercrowdingWarning(); auto area_map = area_list::instance()->m_map; for(auto&iter: area_map) { auto area_ptr = iter.second; if(area_ptr->m_person_count) { log_info("加载区域人数: 区域id=%d,区域人数=%d",area_ptr->m_id, area_ptr->m_person_count.load()); } if(area_ptr->m_vehicle_count) { log_info("加载区域车数: 区域id=%d,区域车数=%d",area_ptr->m_id, area_ptr->m_vehicle_count.load()); } } } void card_list::load_his_card_postion_vehicle() { const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.area_info, l.state, \ case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \ att.start_time, att.end_time from rt_location l, rt_att_vehicle att, dat_card c, dat_vehicle_extend v \ where l.card_id = c.card_id and l.card_id = att.card_id and l.card_id=v.card_id \ and c.state_id=0;"; std::string Error; YADB::CDBResultSet DBRes; sDBConnPool.Query(sql,DBRes,Error); if(!Error.empty()) log_error("load_his_card_postion_vehicle列表 Error,%s",Error.c_str()); uint64_t nCount = DBRes.GetRecordCount( Error ); if (nCount > 0) { log_info( "load_his_card_postion_vehicle. The record count=%ld\n", nCount ); while ( DBRes.GetNextRecod(Error) ) { long long int card_id = 0; DBRes.GetField( "card_id",card_id, Error ); auto temp_ptr = card_list::instance()->get(card_id); if(!temp_ptr || !temp_ptr->is_vehicle()) { log_error("全局卡列表中找不到卡,卡id=%lu", card_id); continue; } auto card_ptr = static_cast(temp_ptr.get()); double x = 0; DBRes.GetField( "x",x, Error ); double y = 0; DBRes.GetField( "y",y, Error ); double z = 0; DBRes.GetField( "z",z, Error ); std::string strAreaInfo = ""; DBRes.GetField( "area_info",strAreaInfo, Error ); int state = 0; DBRes.GetField( "state",state, Error ); double speed = 0; DBRes.GetField( "speed",speed, Error ); std::string start_time = ""; DBRes.GetField( "start_time",start_time, Error ); std::string end_time = ""; DBRes.GetField( "end_time",end_time, Error ); int landmark_id = 0; DBRes.GetField( "landmark_id",landmark_id, Error ); int direction_mapper_id = 0; DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error ); double landmark_dist = 0; DBRes.GetField( "landmark_dist",landmark_dist, Error ); card_ptr->x = x; card_ptr->y = y; card_ptr->z = z; //解析area_info const char * split = "|"; char *p = strtok(const_cast(strAreaInfo.c_str()), split); while (p != NULL) { int area_id = 0; uint64_t enter_time = 0; sscanf(p, "%d,%lu", &area_id, &enter_time); p = strtok(NULL, split); if (area_id <= 0) continue; auto area = area_list::instance()->get(area_id); if(area == nullptr) { log_error("load_vehicle...area_list 找不到区域:区域id=%d", area_id); continue; } area->m_vehicle_count++; card_ptr->m_speed = speed; if(end_time.empty()) { auto mine_tool_ptr = card_ptr->get_mine_tool(); mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time); mine_tool_ptr->m_is_attendance = true; } card_ptr->m_time = tool_time::now_to_ms(); //要放到最后 auto area_hover_ptr = std::make_shared(); area_hover_ptr->m_area = area; area_hover_ptr->m_enter_time = enter_time; card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr); area_hover_ptr->m_area->on_enter(area_hover_ptr, temp_ptr); } } } } void card_list::load_his_card_postion_staff() { const char *sql = "select l.card_id, l.cur_time, l.x, l.y, l.z, l.area_info l.state, \ case when l.cur_time >= date_sub(now(), interval 2 minute) then l.speed else 0 end as speed, \ att.start_time, att.end_time from rt_location l, rt_att_staff att, dat_card c, dat_staff_extend s \ where l.card_id = c.card_id and l.card_id = att.card_id and l.card_id=s.card_id\ and c.state_id=0;"; std::string Error; YADB::CDBResultSet DBRes; sDBConnPool.Query(sql,DBRes,Error); if(!Error.empty()) log_error("load_his_card_postion_staff列表 Error,%s",Error.c_str()); uint64_t nCount = DBRes.GetRecordCount( Error ); if (nCount > 0) { log_info( "load_his_card_postion_staff. The record count=%ld\n", nCount ); while ( DBRes.GetNextRecod(Error) ) { std::string end_time = ""; DBRes.GetField( "end_time",end_time, Error ); if(!end_time.empty()) // 已升井,不再读入 { continue; } long long int card_id = 0; DBRes.GetField( "card_id",card_id, Error ); auto temp_ptr = card_list::instance()->get(card_id); if(!temp_ptr || !temp_ptr->is_person()) { log_error("全局卡列表中找不到卡,卡id=%lu", card_id); continue; } auto card_ptr = static_cast(temp_ptr.get()); double x = 0; DBRes.GetField( "x",x, Error ); double y = 0; DBRes.GetField( "y",y, Error ); double z = 0; DBRes.GetField( "z",z, Error ); std::string strAreaInfo = ""; DBRes.GetField( "area_info",strAreaInfo, Error ); int state = 0; DBRes.GetField( "state",state, Error ); double speed = 0; DBRes.GetField( "speed",speed, Error ); std::string start_time = ""; DBRes.GetField( "start_time",start_time, Error ); int landmark_id = 0; DBRes.GetField( "landmark_id",landmark_id, Error ); int direction_mapper_id = 0; DBRes.GetField( "direction_mapper_id",direction_mapper_id, Error ); double landmark_dist = 0; DBRes.GetField( "landmark_dist",landmark_dist, Error ); card_ptr->x = x; card_ptr->y = y; card_ptr->z = z; //解析area_info const char * split = "|"; char *p = strtok(const_cast(strAreaInfo.c_str()), split); while (p != NULL) { int area_id = 0; uint64_t enter_time = 0; sscanf(p, "%d,%lu", &area_id, &enter_time); p = strtok(NULL, split); if (area_id <= 0) continue; auto area = area_list::instance()->get(area_id); if(area == nullptr) { log_error("area_list 找不到区域:区域id=%d", area_id); continue; } area->m_person_count++; card_ptr->m_speed = speed; if(end_time.empty()) { auto mine_tool_ptr = card_ptr->get_mine_tool(); mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time); mine_tool_ptr->m_is_attendance = true; } card_ptr->m_time = tool_time::now_to_ms(); //要放到最后 auto area_hover_ptr = std::make_shared(); area_hover_ptr->m_area = area; area_hover_ptr->m_enter_time = enter_time; card_ptr->m_area_tool->m_hover_list.push_back(area_hover_ptr); area_hover_ptr->m_area->on_enter(area_hover_ptr, temp_ptr); } } } } void card_list::on_message(zloop *loop,const message_locinfo&loc,bool is_history) { uint64_t cardid = tool_other::type_id_to_u64(loc.m_card_type,loc.m_card_id); const auto c=card_list::instance()->get(cardid); if(c==nullptr) { log_warn("数据库中未定义该卡的信息,card_id=%d, card_type=%d,cardid:%lld",loc.m_card_id,loc.m_card_type,cardid); return; } log_info("card message:site=%d,ant=%d,card=%d,tof=%lld,rav=%02X,acc=%02X,rssi=%d,stamp=%llu", loc.m_site_id,loc.m_ant_id,loc.m_card_id,loc.m_tof,loc.m_rav,loc.m_acc,loc.m_rssi,loc.m_time_stamp); c->on_message(loop,loc,is_history); } bool card_list_visit::visit(std::shared_ptr c) { c->get_card(); return true; } //template<> std::shared_ptr single_base>::m_instance=std::make_shared();