def lost_seconds(self, imei): #设备信息 _dev = db.query("SELECT * FROM Device WHERE imei='{0}'".format(imei)) dev = _dev[0] #判定是否失联 lost_alm_after_minutes = (15 if dev.lost_alm_after_minutes == 0 else dev.lost_alm_after_minutes) lost_seconds = int( (datetime.datetime.now() - dev.heardbeat_at).total_seconds()) #print("lost_seconds:{0}".format(lost_seconds)) if lost_seconds > 7 * 24 * 60 * 60: lost_state = "long" elif lost_seconds > lost_alm_after_minutes * 60: lost_state = "short" else: lost_state = "" lost_seconds = 0 _ret = db.query("SELECT * FROM Device WHERE imei='{0}'".format(imei)) dev = _ret[0] if dev.lost_state == lost_state: #状态没有变化 db.update("Device", where='imei=$imei', vars=locals(), report_needed=0) else: db.update("Device", where='imei=$imei', vars=locals(), lost_state=lost_state, report_needed=1) return lost_seconds
def getAboutMsg(self,data): openid = objWeixin.getOpenid(data) imei = data.imei _ret = db.query('SELECT * FROM Device WHERE imei="{0}"'.format(imei)) cfgPara = { "result":"failed" } if len(_ret)>0: dev = _ret[0] #查询该imei所属的管理分组 _group = db.query("""SELECT *,DeviceGroup.id AS grpId FROM DeviceGroup,GroupHasDevice WHERE GroupHasDevice.imei ='{0}' AND GroupHasDevice.devicegroup_id =DeviceGroup.id AND DeviceGroup.type = "管理分组" """.format(imei)) if len(_group)>0: grp = _group[0] grpName = grp.name grpId = grp.grpId _ret = db.query("SELECT * FROM BusLine WHERE busgroupid={0}".format(grpId)) busline = _ret[0] busline_id = busline.id company_id = busline.company_id else: grpName = "未知" grpId = -1 company_id = 0 busline_id = -1 cfgPara = { "result" :"success", "name" :dev.name, "openid" :openid, "busline_id" :busline_id, "grpName" :grpName, "grpId" :grpId, "devType" :("天网1代" if dev.devType=="" else dev.devType), "manufacturer" :dev.manufacturer, "imei" :dev.imei, "phone" :dev.phone, "arm_type" :dev.arm_type, "seat_type" :dev.seat_type, "create_at" :dev.regedit_at.strftime("%Y-%m-%d"), "warehouse_id" :dev.warehouse_id, "company_id" :company_id, } if web.ctx.method=='GET': sharePara=tradeObj.genPreSharePara("transfer",openid,imei) #设定缺省车型 sharePara["sel"]={"midbus":"","bed":"","test":""} sharePara["sel"][dev.seat_type]='selected = "selected"' sharePara["company_id"]= company_id jdkSign = objWeixin.get_jdk_sign(self.env['url']) _cfgPara=json.dumps(cfgPara,ensure_ascii=False) ret = self.render.single_device_mgr(_cfgPara,jdkSign,sharePara) else: ret = uTools.formatPostMsg(cfgPara) return ret
def getGroupByOpenid(self, openid): #获取该用户下的所有可见的分组信息 _grps = db.query("""SELECT * FROM CustomerHasDeviceGroup,DeviceGroup WHERE CustomerHasDeviceGroup.Customer_openid ='{0}' AND DeviceGroup.id = CustomerHasDeviceGroup.DeviceGroup_id """.format(openid)) if len(_grps) == 0: #该用户还没有设备,取演示分组的设备 _grps = db.query( "SELECT *,id AS DeviceGroup_id FROM DeviceGroup WHERE id =1") grpRet = [] for grp in _grps: _grp = [] _devs = db.query( """SELECT *,Device.heardbeat_at AS lastTIme FROM Device,CurrentLocation WHERE CurrentLocation.imei = Device.imei AND Device.DeviceGroup_id ={0}""". format(grp.DeviceGroup_id)) for dev in _devs: timeDiff = (datetime.datetime.now() - dev.lastTIme).seconds online = ("离线" if (timeDiff > 600) else "在线") _grp.append({ 'name': dev.name, 'speed': dev.speed, 'online': online, 'addr': dev.province[0:2] + dev.city, 'imei': dev.imei }) grpRet.append({'name': grp.name, 'devs': _grp}) return grpRet
def delLine(self, openid, data): busline_id = data.busline_id _ret = db.query( "SELECT * FROM BusLine WHERE id = {0}".format(busline_id)) busline = _ret[0] #确认该线路下没有班车队 ret = db.query( """SELECT COUNT(*) AS sum FROM GroupHasDevice WHERE devicegroup_id={0}""" .format(busline.busgroupid)) if ret[0].sum > 0: #还有车队,不能删除 cfgPara = {"result": "fail", "msg": "busgroup is not empty!"} else: lineSites = db.query( "SELECT * FROM LineSites WHERE busline_id={0}".format( busline.id)) for lineSite in lineSites: db.query("DELETE FROM Sites WHERE id={0}".format( lineSite.site_id)) #删除该线路的站点信息 db.query("DELETE FROM LineSites WHERE busline_id={0}".format( busline.id)) #删除该线路信息 db.query("DELETE FROM BusLine WHERE id={0}".format(busline.id)) cfgPara = {"result": "success", "msg": "busline delete succeed!"} cfgPara = uTools.formatPostMsg(cfgPara) return cfgPara
def setLineSite(self, openid, data): busline_id = data.busline_id _ret = db.query( "SELECT MAX(seq) AS max_seq FROM LineSites WHERE busline_id = {0}" .format(busline_id)) max_seq = _ret[0].max_seq changeType = data.changeType #新加入的站点 if changeType == "add-new": #依据微信上报信息获取位置信息 _ret = db.query( "SELECT * FROM Customer WHERE openid='{0}'".format(openid)) user = _ret[0] site_id = db.insert("Sites", gpsLat=user.gpsLat, gpsLng=user.gpsLng, baiduLat=user.baiduLat, baiduLng=user.baiduLng, qqLat=user.qqLat, qqLng=user.qqLng, name=data.name, address=user.address, setting_type="manual") db.insert("LineSites", site_id=site_id, seq=max_seq + 1, busline_id=busline_id) else: _ret = db.query( "SELECT * AS sum FROM LineSites WHERE busline_id = {0} AND seq={1}" .format(busline_id, data.old_seq)) linesite = _ret[0] site_id = linesite.site_id db.update("Sites", where="id=$site_id", name=data.name, vars=locals()) db.update("LineSites", where="id=$site_id", vars=locals(), seq=data.new_seq) linedb.orderLineSiteSeq(busline_id) sites = linedb.getSitesByLineid(busline_id) cfgPara = uTools.formatPostMsg({ "result": "success", "msg": "busline config succeed!", "sites": sites }) return cfgPara
def startLineStat(self, openid, data): busline_id = data.busline_id company_id = data.company_id _ret = db.query( "SELECT * FROM BusLine WHERE id={0}".format(busline_id)) busline = _ret[0] items = devdb.getDeviceByGroupid(openid, busline.busgroupid) line_name = busline.from_name + " " + busline.to_name jdkSign = objWeixin.get_jdk_sign(self.url) fixPara = icfg.getFixPara(openid, busline_id=busline_id, company_id=company_id) cfgPara = { "openid": openid, "buses": items, "busline_id": busline_id, "company_id": company_id, "line_name": line_name } _cfgPara = json.dumps(cfgPara, ensure_ascii=False) ret = self.render.start_busline_stat(_cfgPara, jdkSign, fixPara) return ret
def updateLinePrice(self, openid, data): busline_id = data.busline_id price = data.price site_ids = data.site_id.split("-") from_site_id = int(site_ids[0]) to_site_id = int(site_ids[1]) _ret = db.query("""SELECT * FROM LinePrice WHERE BusLine_id={0} AND from_site_id={1} AND to_site_id ={2} """.format( busline_id, from_site_id, to_site_id)) if len(_ret) == 1: db.update("LinePrice", where="id=$_ret[0].id", price=price, vars=locals()) else: db.insert("LinePrice", price=price, BusLine_id=busline_id, from_site_id=from_site_id, to_site_id=to_site_id) cfgPara = uTools.formatPostMsg({ "result": "success", "msg": "lineprice update succeed!" }) return cfgPara
def designLinePrice(self, openid, data): jdkSign = objWeixin.get_jdk_sign(self.url) busline_id = data.busline_id company_id = data.company_id #获取相关数据 sites = linedb.getSitesByLineid(busline_id) prices = linedb.getLinePrice(busline_id) _ret = db.query( "SELECT * FROM BusLine WHERE id = {0}".format(busline_id)) busline = _ret[0] line_name = busline.from_name + "-" + busline.to_name #结果拼装 cfgPara = { "openid": openid, "sites": sites, "prices": prices, "line_name": line_name, "busline_id": busline_id, "company_id": company_id } fixPara = icfg.getFixPara(openid, busline_id=busline_id, company_id=company_id) _cfgPara = json.dumps(cfgPara, ensure_ascii=False) ret = self.render.design_line_price(_cfgPara, jdkSign, fixPara) return ret
def getLineBuses(self, openid, data): _ret = db.query("SELECT * FROM BusLine WHERE id={0}".format( data.busline_id)) busline = _ret[0] #判定是否为赛维员工 manager = linedb.getManageEmployee(openid) items = devdb.getDeviceByGroupid(openid, busline.busgroupid) line_name = busline.from_name + " " + busline.to_name if web.ctx.method == 'GET': jdkSign = objWeixin.get_jdk_sign(self.url) cfgPara = { "openid": openid, "items": items, "busline_id": data.busline_id, "busgroupid": busline.busgroupid, "company_id": data.company_id, "line_name": line_name } fixPara = icfg.getFixPara(openid, manager=manager, busline_id=data.busline_id, busgroupid=busline.busgroupid, company_id=busline.company_id) _cfgPara = json.dumps(cfgPara, ensure_ascii=False) ret = self.render.line_buses(_cfgPara, jdkSign, fixPara) else: cfgPara = {"items": items, "result": "succuss"} ret = uTools.formatPostMsg(cfgPara) return ret
def getHistoryStatMsg(self, openid, data): imei = data.imei startTime = data.startTime endTime = data.endTime statRet = historyTrackMgr.getHistoryStat(imei, startTime, endTime) _dev = db.query("SELECT * FROM Device WHERE imei='{0}'".format(imei)) dev = _dev[0] cfgPara = { 'imei': imei, 'name': dev.name, 'pts': statRet, 'url': "/m/bustrack?act=HISTORY-STAT&strict=y&openid={0}&startTime={1}&endTime={1}&imei=" .format(openid, data.startTime, data.endTime), } if web.ctx.env['REQUEST_METHOD'] == 'GET': ret = self.render.historystat( json.dumps(cfgPara, ensure_ascii=False)) else: ret = uTools.formatPostMsg(cfgPara) return ret
def getMineTrackMsg(self, openid, data): #jdkSign = objWeixin.get_jdk_sign(self.url) company_id = data.company_id jdkSign = {} dev = devdb.getDevice(data.imei) if dev != "": #查询设备位置信息 arm = historyTrackMgr.getMineTrack(dev['imei']) _ret = db.query( "SELECT * FROM BusLine WHERE busgroupid={0}".format( dev["groupid"])) busline = _ret[0] sites = linedb.getSitesByLineid(busline.id, "manual") cfgPara = { "pt": arm, 'openid': openid, 'dev': dev, 'busline_id': busline.id, 'sites': sites["manual"], 'url': "gxsaiwei/m/bustrack?act=MINE_TRACK&openid={0}&imei=".format( openid), 'imei': dev['imei'], "company_id": company_id, } else: cfgPara = { "pt": "", 'openid': openid, 'dev': "", 'url': "#", 'imei': "", 'sites': [], 'busline_id': -1, "company_id": company_id, } if web.ctx.method == 'GET': jdkSign = objWeixin.get_jdk_sign(self.url) sharePara = tradeObj.genPreSharePara("share_view", openid, cfgPara['imei']) _cfgPara = json.dumps(cfgPara, ensure_ascii=False) ret = self.render.mytrackqq_v2(_cfgPara, jdkSign, sharePara) #ret = self.render.mytrackqq_v1(cfgPara,_cfgPara) else: ret = uTools.formatPostMsg(cfgPara) return ret
def home(self, openid, data): _ret = db.query("SELECT * FROM Device WHERE imei='{0}'".format( data.imei)) dev = _ret[0] fireMinutes = 15 if dev.fireMinutes == 0 else dev.fireMinutes fireDistance = 200 if dev.fireDistance == 0 else dev.fireDistance moveSpeaker = "off" if dev.moveSpeaker is None else dev.moveSpeaker poweroffSpeaker = "off" if dev.poweroffSpeaker is None else dev.poweroffSpeaker _ret = db.query( "SELECT * FROM CurrentLocation WHERE imei='{0}'".format(data.imei)) _devState = _ret[0] _cfgPara = { 'openid': openid, 'imei': data.imei, 'fireMinutes': fireMinutes, 'fireDistance': fireDistance, 'moveSpeaker': moveSpeaker, 'poweroffSpeaker': poweroffSpeaker, 'monitorState': dev.monitorState, 'alm_low_voltage': _devState.alm_low_voltage, 'alm_power_off': _devState.alm_power_off, 'lost_seconds': self.lost_seconds(data.imei), 'lost_alm_after_minutes': (dev.lost_alm_after_minutes if dev.lost_alm_after_minutes > 0 else 15) } if web.ctx.method == 'GET': jdkSign = objWeixin.get_jdk_sign(self.env["url"]) cfgPara = json.dumps(_cfgPara, ensure_ascii=False) ret = self.render.security_item(cfgPara, jdkSign) else: ret = uTools.formatPostMsg(_cfgPara) return ret
def openidOwnerImei(self, openid, imei): #判定该用户对该imei具有管理权限 _ret = db.query("""SELECT * FROM GroupHasDevice,DeviceGroup WHERE GroupHasDevice.imei = '{0}' AND GroupHasDevice.devicegroup_id = DeviceGroup.id AND DeviceGroup.Customer_openid ='{1}' AND DeviceGroup.type = '管理分组' """.format(imei, openid)) ret = (True if len(_ret) == 1 else False) return ret
def getArmPos(self, imeis, openid=""): arms = [] for imei in imeis: _ret = db.query( "SELECT * FROM CurrentLocation WHERE imei='{0}'".format(imei)) arm = _ret[0] arms.append({ 'lat': arm.qqLat, 'lng': arm.qqLng, 'addr': arm.addr, 'speed': arm.speed }) return arms
def delLineSite(self, openid, data): busline_id = data.busline_id site_seq = data.site_seq #获取站点信息 #print("SELECT * FROM LineSites WHERE busline_id={0} AND seq={1}".format(busline_id,data.site_seq)) _ret = db.query( "SELECT * FROM LineSites WHERE busline_id={0} AND seq={1}".format( busline_id, site_seq)) linesite = _ret[0] #删除LineSite的站点 db.query("DELETE FROM LineSites WHERE id={0}".format(linesite.id)) #删除Sites站点信息 db.query("DELETE FROM Sites WHERE id={0}".format(linesite.site_id)) linedb.orderLineSiteSeq(busline_id) sites = linedb.getSitesByLineid(busline_id) cfgPara = uTools.formatPostMsg({ "result": "success", "msg": "busline delete succeed!", "sites": sites }) return cfgPara
def updateManagerDeviceGroup(self,openid,data): imei = data.imei _ret = db.query("SELECT * FROM BusLine WHERE id={0}".format(data.busline_id)) busline =_ret[0] #更新分组信息 self.changeDeviceGroup(openid,imei,busline.busgroupid) db.update("Device",where = "imei=$imei",vars=locals(), Distributor_id= 6, #何秋文的账号 name = data.name, phone = data.phone, arm_type = (data.arm_type if data.has_key("arm_type") else "bus")) return imei
def friendManager(self,openid,imei): items =[] #权限验证 company = linedb.getCompanyByImei(imei) employee = linedb.getCompanyEmployeeByOpenid(openid,company["id"]) if employee["privilege"]=="manager":#是设备主人 _grps = db.query("""SELECT *,GroupHasDevice.created_at AS received_at,GroupHasDevice.id AS ghdId FROM GroupHasDevice,DeviceGroup WHERE GroupHasDevice.imei='{0}' AND GroupHasDevice.devicegroup_id = DeviceGroup.id AND DeviceGroup.type ='视图分组'""".format(imei)) for grp in _grps: _user = db.query("SELECT * FROM Customer WHERE openid='{0}'".format(grp.Customer_openid)) for user in _user: items.append({ "nickname" :user.nickname, "received_at":grp.received_at.strftime("%Y-%m-%d %H:%M:%S"), "ghdId" :grp.ghdId, "openid" :grp.Customer_openid, "privilege" :grp.privilege }) _dev = db.query("SELECT * FROM Device WHERE imei='{0}'".format(imei)) cfgPara={"openid" :openid, "items" :items, "imei" :imei, "devName":_dev[0].name } if web.ctx.method=='GET': jdkSign = objWeixin.get_jdk_sign(self.env["url"]) sharePara=tradeObj.genPreSharePara("share-view",openid,imei) _cfgPara =json.dumps(cfgPara,ensure_ascii=False) ret = self.render.friend_manager(_cfgPara,jdkSign,sharePara) else: ret =uTools.formatPostMsg(cfgPara) return ret
def autoMonitor(self, type="auto"): if type == "auto": #根据情况自动检测 _devsReport = db.query( "SELECT COUNT(*) AS sum FROM Device WHERE report_needed=1 ") if _devsReport[0].sum == 0: #没有发生变化,不需要上报 return _devs = db.query("SELECT * FROM Device") for dev in _devs: self.monitorAndNotifyRelations(dev.imei) _ret = db.query( "SELECT COUNT(*) AS sum FROM Device WHERE lost_state='short'") shortSum = _ret[0].sum if shortSum == 0: #没有短期失联的设备 return #存在短期失联的设备,需要上报运维人员 _ret = db.query( "SELECT COUNT(*) AS sum FROM Device WHERE lost_state='long'") longSum = _ret[0].sum _ret = db.query("SELECT COUNT(*) AS sum FROM Device") sum = _ret[0].sum onlineSum = sum - shortSum - longSum shortPercent = "%0.1f" % (100.0 * shortSum / sum) longPercent = "%0.1f" % (100.0 * longSum / sum) onlinePercent = 100 - float(longPercent) - float(shortPercent) _mgr = db.query("""SELECT * FROM Manager,Customer WHERE Manager.openid=Customer.openid AND enRange='all'""") systemMsg = objWeixin.iconfig.systemMsg systemMsg["data"]["first"]["value"] = "设备失联情况通报" systemMsg["data"]["keyword1"]["value"] = "在线状况统计" systemMsg["data"]["keyword2"]["value"] = datetime.datetime.now( ).strftime("%Y-%m-%d %H:%M:%S") systemMsg["data"]["remark"]["value"] = """ 在线: {5}({6}%) 离线>15分钟:{0}({1}%) 离线> 7天:{2}({3}%) 设备总数:{4}""".format(shortSum, shortPercent, longSum, longPercent, sum, onlineSum, onlinePercent) cmd = "autoMonitor_{0}_{1}_{2}".format(onlineSum, shortSum, longSum) for mgr in _mgr: if objWeixin.customser_msg_is_frequent(mgr.openid, cmd): continue systemMsg[ "url"] = "{0}/m/device?act=GET-ONLINE-STATE&openid={1}".format( icfg.domain, mgr.openid) systemMsg["touser"] = mgr.openid try: objWeixin.send_template_msg(systemMsg) except Exception as e: print("openid:{0} -nickname:{1} -except:{2}".format( mgr.openid, mgr.nickname, e))
def monitorSetup(self, openid, imei, state): #初始化返回值 cfgPara = {"openid": openid} if self.openidOwnerImei(openid, imei) == False: cfgPara["result"] = "fails:owner is invalid" elif state in ["fired", "waiting0"]: #满足条件,更新数据库 db.update("Device", where='imei=$imei', vars=locals(), stopTime="0000-00-00 00:00:00", stopBaiduLat=0, stopBaiduLng=0, monitorState=state, monitor_at="0000-00-00 00:00:00") #从数据库中重新读取,确认数据正确 _ret = db.query( "SELECT * FROM Device WHERE imei='{0}'".format(imei)) cfgPara["state"] = _ret[0].monitorState cfgPara["result"] = "success" else: #不符合更新条件 cfgPara["result"] = "fails:state is invalid-{0}".format(state) ret = uTools.formatPostMsg(cfgPara) return ret
def monitorAndNotifyRelations(self, imei): #判定是否失联 lost_seconds = self.lost_seconds(imei) #设备信息 _dev = db.query("SELECT * FROM Device WHERE imei='{0}'".format(imei)) dev = _dev[0] #当前位置 _pos = db.query( "SELECT * FROM CurrentLocation WHERE imei='{0}'".format(imei)) if len(_pos) == 0: #还没有数据上报 return else: pos = _pos[0] i = 1 eventMsg = "" #异常事件描述 event = [] #异常事件 if dev.lost_state != "": #检测对象已经失联,没有必要再进行进一步检查 if dev.report_needed == 1: eventMsg += "{0} : GPS主机失去联系达:{1};".format( i, self.secondsFormat(lost_seconds)) event.append("主机失联") i += 1 else: if dev.report_needed == 1: event.append("主机上线") eventMsg += "{0} : GPS主机回复上线!".format(i) i += 1 #获取上次上报的信息 _hisPos = db.query( "SELECT * FROM HistoryTrack WHERE imei='{0}' ORDER BY report_at DESC LIMIT 0,3" .format(imei)) if len(_hisPos) == 0: #还没有数据上报 return hisPos = _hisPos[0] #车辆移动的位置距离设定位置距离 ret = self.bdmap.routematrix( [[dev.stopBaiduLat, dev.stopBaiduLng]], [[pos.baiduLat, pos.baiduLng]]) try: movedDistance = ( 0 if ret == "" else int(ret[0]["distance"]["value"]) ) #移动距离 except: movedDistance = 0 print ret if movedDistance < 1000: movedDistance = "{0}米".format(movedDistance) else: movedDistance = "%0.3f公里" % (movedDistance / 1000.0) speaker = False if pos.alm_power_off == 1 and hisPos.alm_power_off == 0: eventMsg += "{0} : GPS电源断了;".format(i) event.append("主机断电") i += 1 if dev.poweroffSpeaker == "on": #需要启动车辆上的报警 speaker = True if pos.alm_power_off == 0 and hisPos.alm_power_off == 1: event.append("主机恢复供电") eventMsg += "{0} : GPS电源恢复正常;".format(i) i += 1 if pos.alm_low_voltage == 1 and hisPos.alm_low_voltage == 0: event.append("电压过低") eventMsg += "{0} : 电瓶电压过低;".format(i) i += 1 if pos.alm_low_voltage == 0 and hisPos.alm_low_voltage == 1: event.append("电压恢复正常") eventMsg += "{0} : 电瓶电压回复正常;".format(i) i += 1 if eventMsg == "": #没有异常情况,直接返回 return #合并消息接收人 车辆的朋友 _swmgrs = db.query("""SELECT * FROM Customer WHERE openid IN( SELECT openid FROM CompanyHasEmployee WHERE company_id=1 AND privilege<>'invisible')""" ) msg = self.assumeNotifyExceptMsg(dev, pos, event, eventMsg) if msg == None: return #发送消息给朋友 for mgr in _swmgrs: #发送台频繁,就不再发送了 cmd = "monitorAndNotifyRelations_" + imei if objWeixin.customser_msg_is_frequent(mgr.openid, cmd): continue msg["url"] = "{0}/m/device?act=seat-status-test&openid={1}&imei={2}".format( icfg.domain, mgr.openid, dev.imei) msg["touser"] = mgr.openid try: objWeixin.send_template_msg(msg) except Exception as e: print("openid:{0} -nickname:{1} -except:{2}".format( mgr.openid, mgr.nickname, e))
def autoSecurity(self, imei): _ret = db.query( "SELECT * FROM CurrentLocation WHERE imei ='{0}'".format(imei)) pos = _ret[0] #获取设防条件 _ret = db.query("SELECT * FROM Device WHERE imei='{0}'".format(imei)) dev = _ret[0] if dev.monitorState in ['fired', 'going_out']: #用户主动放弃监控 return elif dev.monitorState == 'on': #已经启动监控 : if pos.speed < 0.5: #车辆处于静止状态,安全范围内, return else: #车辆在移动中!需要进一步确认是否在安全距离内 ret = self.bdmap.routematrix( [[dev.stopBaiduLat, dev.stopBaiduLng]], [[pos.baiduLat, pos.baiduLng]]) movedDistance = int(ret[0]["distance"]["value"]) #移动距离 #安全位置缺省为200米 fireDistance = (200 if dev.fireDistance == 0 else dev.fireDistance) if movedDistance < fireDistance: #在安全范围内, return else: #促发告警 db.update("Device", where='imei=$imei', vars=locals(), monitorState="going_out") elif dev.monitorState == 'waiting0': #等待监控 if pos.speed > 0: #车处于运行状态中 return #不需要监控 else: #用户停车了,开始监控准备:设置开始时间以及停止位置 ,当停车时间超过设定值则会启动监控 db.update("Device", where='imei=$imei', vars=locals(), stopTime=datetime.datetime.now(), stopBaiduLat=pos.baiduLat, stopBaiduLng=pos.baiduLng, monitorState="waiting1") elif dev.monitorState == 'waiting1': #等待监控 #已经完成第一次的静止检测,需要考虑是否需要促发告警还是继续等待 if pos.speed < 0.5: #车处于静止状态 #达到了促发设防条件,促发时间缺省为15分钟 fireMinutes = (15 if dev.fireMinutes == 0 else dev.fireMinutes) if (datetime.datetime.now() - dev.stopTime).total_seconds() >= fireMinutes * 60: db.update("Device", where='imei=$imei', vars=locals(), monitorState="on", monitor_at=datetime.datetime.now()) else: #没有达到监控条件,继续等待 return else: #车处于运行状态中,没有达到监控条件,设防恢复为初始态 db.update("Device", where='imei=$imei', vars=locals(), stopTime="0000-00-00 00:00:00", stopBaiduLat=0, stopBaiduLng=0, monitorState="waiting0") return
def setLineSite2(self, openid, data): busline_id = data.busline_id _ret = db.query( "SELECT COUNT(*) AS sum FROM LineSites WHERE busline_id = {0}". format(busline_id)) site_sum = _ret[0] #新加入的站点 if (site_sum < data.old_seq): changeType = "add-new" #缺省是增加新站点 else: changeType = "renew-old" _ret = db.query( "SELECT * AS sum FROM LineSites WHERE busline_id = {0} AND seq={1}" .format(busline_id, data.old_seq)) linesite = _ret[0] #调整现有站点顺序 if (data.new_seq < data.old_seq): #站点向前调整顺序 changeSites = db.query( "SELECT * FROM LineSites WHERE seq>={0} AND seq<{1}".format( data.new_seq, data.old_seq)) for site in changeSites: db.update("LineSites", where="id=$site.id", seq=site.seq + 1, vars=locals()) else: changeSites = db.query( "SELECT * FROM LineSites WHERE seq>{0} AND seq<={1}".format( data.old_seq, data.new_seq)) for site in changeSites: db.update("LineSites", where="id=$site.id", seq=site.seq - 1, vars=locals()) if changeType == "add-new": #依据微信上报信息获取位置信息 _ret = db.query( "SELECT * FROM Customer WHERE openid='{0}'".format(openid)) user = _ret[0] site_id = db.insert("Sites", gpsLat=user.gpsLat, gpsLng=user.gpsLng, baiduLat=user.baiduLat, baiduLng=user.baiduLng, qqLat=user.qqLat, qqLng=user.qqLng, name=data.name, address=user.address, setting_type="manual") db.insert("LineSites", site_id=site_id, seq=data.new_seq, busline_id=busline_id) else: site_id = linesite.site_id db.update("Sites", where="id=$site_id", name=data.name, vars=locals()) db.update("LineSites", where="id=$linesite,id", seq=data.new_seq) sites = linedb.getSitesByLineid(busline_id) cfgPara = uTools.formatPostMsg({ "result": "success", "msg": "busline config succeed!", "sites": sites }) return cfgPara