device.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. import json
  2. import os
  3. import xlrd
  4. from flask import request, jsonify, current_app, Response
  5. from flask_restx import Resource, Namespace, reqparse
  6. from sqlalchemy import select, insert, update, delete
  7. from sqlalchemy.orm import Session
  8. from werkzeug.datastructures import FileStorage
  9. from app.defines import StatesCode, Module, OperationType
  10. from app.modle.device import DeviceType, SecurityDevice
  11. from app.utils.jwt_util import login_required
  12. from app.utils.save_log import save_log
  13. from app.utils.util import to_dict
  14. from config import Config
  15. ns = Namespace('device', description='设备管理接口')
  16. config = Config()
  17. device_type = reqparse.RequestParser(bundle_errors=True)
  18. device_type.add_argument(name='id', type=str, location='form', required=True, help='设备类别id')
  19. device_type.add_argument(name='name', type=str, location='form', required=True, help='设备类别名称')
  20. @ns.route('/device_type')
  21. class DeviceTypeApi(Resource):
  22. method_decorators = [login_required]
  23. @ns.doc(id='device_list', description='设备类别列表')
  24. def get(self):
  25. """设备类型列表"""
  26. try:
  27. with Session(current_app.engine) as session:
  28. stmt = select(DeviceType)
  29. results = session.execute(stmt).scalars().all()
  30. save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.SUCCESS)
  31. return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
  32. except Exception as e:
  33. save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.UNKNOWN_ERROR)
  34. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  35. @ns.doc(id='add_device', description='添加设备类别')
  36. @ns.expect(device_type)
  37. def post(self):
  38. """添加设备类型"""
  39. device_name = request.form.get('name')
  40. if device_name is None:
  41. return jsonify(code=StatesCode.PARA_ERROR, message='设备类别不能为空')
  42. try:
  43. with Session(current_app.engine) as session:
  44. stmt = insert(DeviceType).values(
  45. name=device_name
  46. )
  47. session.execute(stmt)
  48. session.commit()
  49. save_log(request, Module.DEVICE, OperationType.ADD, StatesCode.SUCCESS)
  50. return jsonify(code=StatesCode.SUCCESS, message='成功')
  51. except Exception as e:
  52. save_log(request, Module.DEVICE, OperationType.ADD, StatesCode.UNKNOWN_ERROR)
  53. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  54. @ns.doc(id='update_device', description='修改设备类别')
  55. @ns.expect(device_type)
  56. def put(self):
  57. """修改设备类型"""
  58. device_type_id = request.form.get('id')
  59. device_name = request.form.get('name')
  60. if device_type_id is None or device_name is None:
  61. return jsonify(code=StatesCode.PARA_ERROR, message='设备类别或设备类别id不能为空')
  62. try:
  63. with Session(current_app.engine) as session:
  64. stmt = update(DeviceType).where(DeviceType.id == device_type_id).values(
  65. name=device_name
  66. )
  67. session.execute(stmt)
  68. session.commit()
  69. save_log(request, Module.DEVICE, OperationType.UPDATE, StatesCode.SUCCESS)
  70. return jsonify(code=StatesCode.SUCCESS, message='成功')
  71. except Exception as e:
  72. save_log(request, Module.DEVICE, OperationType.UPDATE, StatesCode.UNKNOWN_ERROR)
  73. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  74. device_list = reqparse.RequestParser(bundle_errors=True)
  75. device_list.add_argument(name='id', type=str, location='args', required=True, help='设备类别id')
  76. @ns.route('/device_list')
  77. class DeviceListApi(Resource):
  78. method_decorators = [login_required]
  79. @ns.doc(id='device_list', description='设备列表')
  80. @ns.expect(device_list)
  81. def get(self):
  82. """获取设备列表"""
  83. device_type_id = request.args.get('id')
  84. if device_type_id is None:
  85. return jsonify(code=StatesCode.PARA_ERROR, message='设备类别或设备类别id不能为空')
  86. try:
  87. with Session(current_app.engine) as session:
  88. stmt = select(SecurityDevice).where(SecurityDevice.device_group == device_type_id)
  89. results = session.execute(stmt).scalars().all()
  90. save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.SUCCESS)
  91. return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
  92. except Exception as e:
  93. save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.UNKNOWN_ERROR)
  94. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  95. device = reqparse.RequestParser(bundle_errors=True)
  96. device.add_argument(name='id', type=str, location='args', required=True, help='设备id')
  97. device_details = reqparse.RequestParser(bundle_errors=True)
  98. device_details.add_argument(name='id', type=str, location='form', required=False, help='设备id')
  99. device_details.add_argument(name='device_name', type=str, location='form', required=False, help='设备名称')
  100. device_details.add_argument(name='device_id', type=str, location='form', required=False, help='设备id')
  101. device_details.add_argument(name='device_type', type=str, location='form', required=False, help='设备类型(1-摄像头)')
  102. device_details.add_argument(name='device_location', type=str, location='form', required=False, help='设备位置')
  103. device_details.add_argument(name='device_age', type=str, location='form', required=False, help='设备年限')
  104. device_details.add_argument(name='company_id', type=str, location='form', required=False, help='所属单位ID')
  105. device_details.add_argument(name='user_id', type=str, location='form', required=False, help='设备责任人')
  106. device_details.add_argument(name='device_group', type=str, location='form', required=False, help='设备分组')
  107. device_details.add_argument(name='status', type=str, location='form', required=False, help='设备状态(1-开启)')
  108. device_details.add_argument(name='floor_id', type=str, location='form', required=False, help='楼层id')
  109. device_details.add_argument(name='third_id', type=str, location='form', required=False, help='')
  110. @ns.route('/device')
  111. class DeviceApi(Resource):
  112. method_decorators = [login_required]
  113. @ns.doc(id='device', description='设备详情')
  114. @ns.expect(device)
  115. def get(self):
  116. """获取设备详情"""
  117. device_id = request.args.get('id')
  118. if device_id is None:
  119. return jsonify(code=StatesCode.PARA_ERROR, message='设备id不能为空')
  120. try:
  121. with Session(current_app.engine) as session:
  122. stmt = select(SecurityDevice).where(SecurityDevice.id == device_id)
  123. results = session.execute(stmt).scalars().all()
  124. save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.SUCCESS)
  125. return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
  126. except Exception as e:
  127. save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.UNKNOWN_ERROR)
  128. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  129. @ns.doc(id='add_device', description='添加设备详情')
  130. @ns.expect(device_details)
  131. def post(self):
  132. """添加设备"""
  133. device_name = request.form.get('device_name')
  134. device_id = request.form.get('device_id')
  135. device_type = request.form.get('device_type')
  136. device_location = request.form.get('device_location')
  137. device_age = request.form.get('device_age')
  138. company_id = request.form.get('company_id')
  139. user_id = request.form.get('user_id')
  140. device_group = request.form.get('device_group')
  141. status = request.form.get('status')
  142. floor_id = request.form.get('floor_id')
  143. third_id = request.form.get('third_id')
  144. if device_name is None:
  145. return jsonify(code=StatesCode.PARA_ERROR, message='设备名称不能为空')
  146. try:
  147. with Session(current_app.engine) as session:
  148. stmt = insert(SecurityDevice).values(
  149. device_name=device_name,
  150. device_id=device_id,
  151. device_type=device_type,
  152. device_location=device_location,
  153. device_age=device_age,
  154. company_id=company_id,
  155. user_id=user_id,
  156. device_group=device_group,
  157. status=status,
  158. floor_id=floor_id,
  159. third_id=third_id
  160. )
  161. session.execute(stmt)
  162. session.commit()
  163. save_log(request, Module.DEVICE, OperationType.ADD, StatesCode.SUCCESS)
  164. return jsonify(code=StatesCode.SUCCESS, message='成功')
  165. except Exception as e:
  166. save_log(request, Module.DEVICE, OperationType.ADD, StatesCode.UNKNOWN_ERROR)
  167. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  168. @ns.doc(id='update_device', description='添加设备')
  169. @ns.expect(device_details)
  170. def put(self):
  171. """修改设备"""
  172. id = request.form.get('id')
  173. device_name = request.form.get('device_name')
  174. device_id = request.form.get('device_id')
  175. device_type = request.form.get('device_type')
  176. device_location = request.form.get('device_location')
  177. device_age = request.form.get('device_age')
  178. company_id = request.form.get('company_id')
  179. user_id = request.form.get('user_id')
  180. device_group = request.form.get('device_group')
  181. status = request.form.get('status')
  182. floor_id = request.form.get('floor_id')
  183. third_id = request.form.get('third_id')
  184. if device_name is None:
  185. return jsonify(code=StatesCode.PARA_ERROR, message='设备名称不能为空')
  186. try:
  187. with Session(current_app.engine) as session:
  188. stmt = update(SecurityDevice).where(SecurityDevice.id == id).values(
  189. device_name=device_name,
  190. device_id=device_id,
  191. device_type=device_type,
  192. device_location=device_location,
  193. device_age=device_age,
  194. company_id=company_id,
  195. user_id=user_id,
  196. device_group=device_group,
  197. status=status,
  198. floor_id=floor_id,
  199. third_id=third_id
  200. )
  201. session.execute(stmt)
  202. session.commit()
  203. save_log(request, Module.DEVICE, OperationType.UPDATE, StatesCode.SUCCESS)
  204. return jsonify(code=StatesCode.SUCCESS, message='成功')
  205. except Exception as e:
  206. save_log(request, Module.DEVICE, OperationType.UPDATE, StatesCode.UNKNOWN_ERROR)
  207. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  208. @ns.doc(id='delete_device', description='删除设备')
  209. @ns.expect(device_details)
  210. def delete(self):
  211. """删除设备"""
  212. id = request.form.get('id')
  213. if id is None:
  214. return jsonify(code=StatesCode.PARA_ERROR, message='设备id不能为空')
  215. try:
  216. with Session(current_app.engine) as session:
  217. stmt = delete(SecurityDevice).where(SecurityDevice.id == id)
  218. session.execute(stmt)
  219. session.commit()
  220. save_log(request, Module.DEVICE, OperationType.DELETE, StatesCode.SUCCESS)
  221. return jsonify(code=StatesCode.SUCCESS, message='成功')
  222. except Exception as e:
  223. save_log(request, Module.DEVICE, OperationType.DELETE, StatesCode.UNKNOWN_ERROR)
  224. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  225. batch_delete_user = reqparse.RequestParser(bundle_errors=True)
  226. batch_delete_user.add_argument(name='devices_id', type=str, required=True, location='form', help='设备id列表')
  227. @ns.route('/batch_delete_device')
  228. class BatchDeleteDeviceApi(Resource):
  229. method_decorators = [login_required]
  230. @ns.doc(id='batch_delete_device', description='批量删除设备')
  231. @ns.expect(batch_delete_user)
  232. def delete(self):
  233. """批量删除设备"""
  234. device_id = request.form.get('devices_id')
  235. if device_id is not None:
  236. device_id = json.loads(device_id)
  237. else:
  238. return jsonify(code=StatesCode.UNKNOWN_ERROR, message='设备id不能为空')
  239. try:
  240. with Session(current_app.engine) as session:
  241. stmt = select(SecurityDevice).where(SecurityDevice.id.in_(device_id))
  242. results = session.execute(stmt).scalars().all()
  243. for result in results:
  244. session.delete(result)
  245. session.commit()
  246. save_log(request, Module.DEVICE, OperationType.BATCH_DELETE, StatesCode.SUCCESS)
  247. return jsonify(code=StatesCode.SUCCESS, message='批量删除成功')
  248. except Exception as e:
  249. save_log(request, Module.DEVICE, OperationType.DELETE, StatesCode.UNKNOWN_ERROR)
  250. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  251. import_device = reqparse.RequestParser(bundle_errors=True)
  252. import_device.add_argument(name='files', type=FileStorage, required=True, location='files', help='导入设备xls文件')
  253. import_device.add_argument(name='group_id', type=str, required=True, location='form', help='设备类别id')
  254. @ns.route('/import_device')
  255. class ImportDeviceApi(Resource):
  256. method_decorators = [login_required]
  257. @ns.doc(id='import_device', description='导入模版下载')
  258. def get(self):
  259. """导入模版下载"""
  260. try:
  261. manage_path = os.path.dirname(os.path.abspath(__file__))
  262. config_yml_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(manage_path))), 'config',
  263. 'device.xls')
  264. file_data = open(config_yml_path, 'rb')
  265. buf = file_data.read()
  266. file_data.close()
  267. response = Response(buf)
  268. response.headers['Content-Type'] = 'application/octet-stream'
  269. response.headers['Content-Disposition'] = 'attachment; filename=%s' % 'device.xls'
  270. save_log(request, Module.DEVICE, OperationType.EXPORT, StatesCode.SUCCESS)
  271. return response
  272. except Exception as e:
  273. save_log(request, Module.DEVICE, OperationType.EXPORT, StatesCode.UNKNOWN_ERROR)
  274. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
  275. @ns.doc(id='import_device', description='设备导入')
  276. @ns.expect(import_device)
  277. def post(self):
  278. """设备导入"""
  279. device_file = request.files.get('files')
  280. device_group_id = request.form.get('group_id')
  281. if os.path.splitext(device_file.name)[-1] != '.xls':
  282. return jsonify(code=StatesCode.PARA_ERROR, message='不支持的文件格式,仅支持 .xls 文件')
  283. if device_group_id is None:
  284. return jsonify(code=StatesCode.PARA_ERROR, message='设备类型id不能为空')
  285. try:
  286. xlsx = xlrd.open_workbook(file_contents=device_file.read())
  287. with Session(current_app.engine) as session:
  288. for sheet in xlsx.sheets():
  289. # 添加设备数据
  290. for i in range(1, sheet.nrows): # 逐行打印sheet数据
  291. value = sheet.row_values(i)
  292. add_device = insert(SecurityDevice).values(
  293. device_name=value[0],
  294. device_id=value[1],
  295. device_type=int(value[2]) if value[2] != '' else None,
  296. device_location=value[3],
  297. device_age=int(value[4]) if value[4] != '' else None,
  298. company_id=value[5],
  299. user_id=value[6],
  300. device_group=device_group_id,
  301. status=int(value[7]) if value[7] != '' else None,
  302. floor_id=int(value[8]) if value[8] != '' else None,
  303. third_id=value[9]
  304. )
  305. session.execute(add_device)
  306. session.commit()
  307. save_log(request, Module.DEVICE, OperationType.IMPORT, StatesCode.SUCCESS)
  308. return jsonify(code=StatesCode.SUCCESS, message='成功')
  309. except Exception as e:
  310. save_log(request, Module.DEVICE, OperationType.IMPORT, StatesCode.UNKNOWN_ERROR)
  311. return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))