rabin 6 years ago
parent
commit
3264757d9b
9 changed files with 146 additions and 11 deletions
  1. 1 1
      admin/page/__load__.py
  2. 34 0
      admin/page/device.py
  3. 21 2
      front/page/device.py
  4. 15 2
      front/static/pc/js/main.js
  5. 14 0
      install.py
  6. 17 0
      model/notice_type.py
  7. 6 0
      pub.py
  8. 24 6
      service/device.py
  9. 14 0
      switch.py

+ 1 - 1
admin/page/__load__.py

@@ -57,6 +57,6 @@ class Load(Base):
 		child = [
 			[['/farm/farm','/farm/product','/device/gateway','/device/info','/device/info?search_status-hidden-=1','/work/work','/work/category','/work/method','/work/land','/origin/batch','/farm/user','/device/printer','/msg/msg'],['农场列表', '农场产品管理', '网关管理', '设备管理', '离线设备列表', '农场农事管理', '农场农事分类', '农场劳作方式', '农场地块管理', '溯源批次管理','农场用户管理','打印机管理', '消息提醒']]
 			,[['/web/set','/web/help_category','/web/help','/web/category','/web/article','/web/menu'],['网站资料设置', '帮助分类', '发布帮助内容', '文章分类', '发布内容文章', '菜单管理']]
-			,[['/device/type','/hardware/type','/msg/type','/admin/admin','/admin/role','/hardware/hardware', '/admin/log'],['设备类型管理','硬件类型管理', '消息类型设置', '管理员设置', '管理权限设置','硬件设备记录', '系统日志']]
+			,[['/device/type','/hardware/type','/device/notice_type','/msg/type','/admin/admin','/admin/role','/hardware/hardware', '/admin/log'],['设备类型管理','硬件类型管理', '消息类型设置', '错误码设置', '管理员设置', '管理权限设置','硬件设备记录', '系统日志']]
 			]
 		return (parent,child)

+ 34 - 0
admin/page/device.py

@@ -393,3 +393,37 @@ class printer_update_path(Load):
 	@Web.auth
 	def delete(self):
 		self.commonDelete('device_printer')
+
+
+class notice_type_path(Load):
+	@Web.auth
+	def get(self):
+		self.common(
+			name = u'错误码设置'
+			,path = '/device/notice_type'
+			,width = '600'
+			,height = '300'
+			,search = (('name-input-mlike','key-input-mlike'), (u'错误码描述',u'错误码key'))
+			,thead = (u'ID', u'错误码描述',u'错误码key', u'更新时间')
+			,tbody = ('id', 'name', 'key', 'cdate')
+			,state = False
+		)
+		self.commonList('notice_type')
+		self.commonView('list')
+
+class notice_type_update_path(Load):
+	@Web.auth
+	def get(self):
+		self.common(
+			path = '/device/notice_type'
+			,label = (u'错误码描述', u'错误码key')
+			,update = ('name-input-required', 'key-input-required')
+		)
+		self.commonOne('notice_type')
+		self.commonView('update')
+	@Web.auth
+	def post(self):
+		self.commonUpdate('notice_type')
+	@Web.auth
+	def delete(self):
+		self.commonDelete('notice_type')

+ 21 - 2
front/page/device.py

@@ -584,16 +584,35 @@ class update_set_condition_path(Load):
 
 #更新控制设备的状态
 class update_path(Load):
+	@tornado.web.asynchronous  
+	@tornado.gen.coroutine
 	@Web.auth
 	def post(self):
 		id = self.input('id')
 		value = self.input('value')
 		if id:
-			Demeter.service('device').switch(id, value)
-			self.out('yes', {'id':id})
+			#response = yield tornado.gen.Task(self.switch, id, value)
+			#yield self.switch(id, value)
+			#Demeter.service('device').switch(id, value)
+			response = Shell.popen(Demeter.path + 'switch.py ' + id + ' ' + value, timeout=3)
+			response = response.replace("\n", "")
+			if response == 'ok':
+				self.out('yes', {'id':id})
+			else:
+				model = Demeter.model('notice_type')
+				model.key = response
+				info = model.select(type='fetchone')
+				if info:
+					response = info['name']
+
+				self.out(response)
 		else:
 			self.out('no')
 
+	@tornado.gen.coroutine
+	def switch(self, id, value):
+		Demeter.service('device').switch(id, value)
+
 class get_path(Load):
 	@Web.auth
 	def get(self):

+ 15 - 2
front/static/pc/js/main.js

@@ -72,8 +72,16 @@ var Farm =
 		self.ClearLoop();
 		e.addClass('loading');
 		self.Request('post', url, data, function(msg)
-		{	
+		{
 			e.removeClass('loading');
+			self.CreateLoop();
+			msg = eval('(' + msg + ')');
+			if (msg.status == 2) {
+				alert(msg.msg);
+				//this.Alert(msg.msg);
+				return;
+			}
+			
 			if (value == 1) {
 				//开启
 				e.addClass('open');
@@ -81,7 +89,6 @@ var Farm =
 				//关闭
 				e.removeClass('open');
 			}
-			self.CreateLoop();
 		})
 	}
 
@@ -111,6 +118,12 @@ var Farm =
 		{	
 			e.removeClass('loading');
 			self.CreateLoop();
+			msg = eval('(' + msg + ')');
+			if (msg.status == 2) {
+				alert(msg.msg);
+				//this.Alert(msg.msg);
+				return;
+			}
 		})
 	}
 

+ 14 - 0
install.py

@@ -153,6 +153,20 @@ def device():
 			model.name = value['name']
 			model.insert()
 
+	# 初始化错误码类型
+	notice_type = (
+		{'name':'设备离线', 'key':'offline'}
+		,{'name':'请求超时', 'key':'timeout'}
+		)
+	model = Demeter.model('notice_type')
+	for value in notice_type:
+		model.key = value['key']
+		info = model.select(type='fetchone')
+		if not info:
+			model.key = value['key']
+			model.name = value['name']
+			model.insert()
+
 manage()
 web()
 farm()

+ 17 - 0
model/notice_type.py

@@ -0,0 +1,17 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+    demeter database
+    name:notice_type.py
+    author:rabin
+"""
+from __load__ import *
+
+class Notice_type(Model):
+	__table__ = 'notice_type'
+	__comment__ = '错误码提醒类型表'
+	id = Fields(type='int', primaryKey=True, autoIncrement=True, comment='类型ID')
+	name = Fields(type='varchar(300)', comment='错误码中文')
+	key = Fields(type='varchar(300)', comment='错误码关键key')
+	state = Fields(type='boolean', default='True', comment='数据存在状态')
+	cdate = Fields(type='int', default='time', comment='创建时间')

+ 6 - 0
pub.py

@@ -13,6 +13,12 @@ import time
 import base64
 
 """
+pub = Pub()
+key = 'status/valve/10086/100107'
+value = 'ok'
+state = pub.push(key, value)
+print state
+
 def callback(param, client, userdata, mid):
 	print mid
 

+ 24 - 6
service/device.py

@@ -74,12 +74,30 @@ class Device(object):
 					#Demeter.temp(key=type_info['key'], name=info['hardware_id'], value=switch)
 					#pub
 					pub = Pub()
-					key = 'update/' + type_info['key'] + '/' + gateway_info['hardware_id']  + '/' + info['hardware_id']
+					key = type_info['key'] + '/' + gateway_info['hardware_id']  + '/' + info['hardware_id']
+					update = 'update/' + key
+					feedback = 'status/' + key
 					value = switch
-					pub.push(key, value, qos=2, callback=self.switchAction, param={'id':info['id'], 'switch':switch})
+					pub.push(update, value, qos=0, callback=self.switchAction, param={'id':info['id'], 'key':feedback, 'switch':switch}, feedback=True)
+		else:
+			Demeter.error('offline')
 
 	# 处理开关-响应
-	def switchAction(self, param, client, userdata, mid):
-		model = Demeter.model('device_info')
-		model.id = param['id']
-		model.update(value=param['switch'])
+	def switchAction(self, param, client, userdata, mid, msg='ok'):
+		if msg == 'ok':
+			model = Demeter.model('device_info')
+			model.id = param['id']
+			model.update(value=param['switch'])
+			print msg
+		else:
+			# 获取错误码
+			"""
+			model = Demeter.model('notice_type')
+			model.key = msg
+			info = model.select(type='fetchone')
+			if info:
+				Demeter.error(info['name'])
+			else:
+				Demeter.error(msg)
+			"""
+			Demeter.error(msg)

+ 14 - 0
switch.py

@@ -0,0 +1,14 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+    demeter web
+    name:pub.py
+    author:rabin
+"""
+from service.device import *
+import sys
+
+id = sys.argv[1]
+value = sys.argv[2]
+device = Device()
+device.switch(id, value)