示例#1
0
 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
示例#2
0
 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
示例#3
0
    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
示例#4
0
 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
示例#5
0
    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
示例#6
0
    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
示例#7
0
 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
示例#8
0
    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
示例#9
0
 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
示例#10
0
    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
示例#11
0
    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
示例#12
0
 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
示例#13
0
    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
示例#14
0
 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
示例#15
0
    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
示例#16
0
 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
示例#17
0
    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
示例#18
0
    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))
示例#19
0
 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
示例#20
0
    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))
示例#21
0
 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
示例#22
0
    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