Ver Fonte

2023-5-12

zhangnaiwen há 2 anos atrás
pai
commit
93f7a6cd22

+ 6 - 5
config/config.yml

@@ -5,6 +5,7 @@ common:
   INFORMATION_TYPE: ["楼层地图信息配置", "安保人员信息配置"]
 
   SAVE_FILE_PATH: /data/files
+  FILE_URL: http://127.0.0.1/
 
 RabbitMq:
   HOST: 8.130.177.22 # ip地址
@@ -26,8 +27,8 @@ system_monitoring:
 database:
   # 数据库配置信息
   # 如果使用外部数据库,例如polardb,请修改以下配置信息
-  HOST: 127.0.0.1 # 数据库IP地址
-  PORT: 5432 # 数据库端口号
-  USER: mac # 用户名
-  PASSWORD: ''  # 密码
-  DB: postgres # 数据库名
+  HOST: 121.43.55.7 # 数据库IP地址
+  PORT: 5433 # 数据库端口号
+  USER: postgres # 用户名
+  PASSWORD: SKYversation@0816  # 密码
+  DB: building # 数据库名

+ 3 - 0
src/app/api/__init__.py

@@ -32,3 +32,6 @@ api.add_namespace(download)
 
 api.add_namespace(system_monitoring)
 api.add_namespace(server)
+
+
+# todo 公司联级查询,增加字段,角色成员人数

+ 7 - 7
src/app/api/data.py

@@ -34,7 +34,7 @@ company_file_path = os.path.join(manage_path, 'config', 'company_data.json')
 
 @ns.route('/template_list')
 class TemplateConfigListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='template_list', description='模版列表')
     @ns.expect(template_list)
@@ -91,7 +91,7 @@ building_details.add_argument(name='template_type', type=int, location='files',
 
 @ns.route('/template')
 class TemplateConfigApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_template', description='获取模版详情')
     @ns.expect(template)
@@ -237,7 +237,7 @@ batch_delete_template.add_argument(name='template_ids', type=str, required=True,
 
 @ns.route('/batch_delete_template')
 class BatchTemplateConfigApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='batch_delete_template', description='批量删除模版')
     @ns.expect(batch_delete_template)
@@ -278,7 +278,7 @@ company_data.add_argument(name='picture', type=FileStorage, location='files', re
 
 @ns.route('/company')
 class CompanyApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_company', description='获取公司信息')
     def get(self):
@@ -381,7 +381,7 @@ class CompanyApi(Resource):
 
 @ns.route('/building_list')
 class BuildingListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='building_list', description='获取楼宇列表')
     def get(self):
@@ -417,7 +417,7 @@ building_details.add_argument(name='picture', type=FileStorage, location='files'
 
 @ns.route('/building')
 class BuildingApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='building_list', description='获取楼宇列表')
     @ns.expect(building)
@@ -565,7 +565,7 @@ underlying_system.add_argument(name='picture', type=FileStorage, location='files
 
 @ns.route('/underlying_system')
 class UnderlyingSystemMessageApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='underlying_system_list', description='获取底层系统')
     @ns.expect()

+ 139 - 80
src/app/api/device.py

@@ -9,7 +9,7 @@ from sqlalchemy.orm import Session
 from werkzeug.datastructures import FileStorage
 
 from app.defines import StatesCode, Module, OperationType
-from app.modle.device import DeviceType, SecurityDevice
+from app.modle.device import DeviceType, SecurityDevice, EnergyDeviceType
 from app.utils.jwt_util import login_required
 from app.utils.save_log import save_log
 from app.utils.util import to_dict
@@ -26,7 +26,7 @@ device_type.add_argument(name='name', type=str, location='form', required=False,
 
 @ns.route('/device_type')
 class DeviceTypeApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='device_list', description='设备类别列表')
     @ns.expect(device_type_list)
@@ -65,7 +65,8 @@ class DeviceTypeApi(Resource):
         try:
             with Session(current_app.engine) as session:
                 stmt = insert(DeviceType).values(
-                    type_name=device_name
+                    type_name=device_name,
+                    device_ids=json.dumps([])
                 )
                 session.execute(stmt)
                 session.commit()
@@ -105,25 +106,68 @@ class DeviceTypeApi(Resource):
             save_log(request, Module.DEVICE, OperationType.UPDATE, StatesCode.UNKNOWN_ERROR)
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
 
+    @ns.doc(id='delete_device', description='删除设备类别')
+    @ns.expect(device_type)
+    def delete(self):
+        """删除设备类别"""
+
+        device_type_id = request.form.get('id')
+
+        if device_type_id is None:
+            return jsonify(code=StatesCode.PARA_ERROR, message='设备类别id不能为空')
+
+        try:
+            with Session(current_app.engine) as session:
+                stmt = delete(DeviceType).where(DeviceType.id == device_type_id)
+                session.execute(stmt)
+                session.commit()
+
+            save_log(request, Module.DEVICE, OperationType.DELETE, StatesCode.SUCCESS)
+
+            return jsonify(code=StatesCode.SUCCESS, message='成功')
+
+        except Exception as e:
+            save_log(request, Module.DEVICE, OperationType.DELETE, StatesCode.UNKNOWN_ERROR)
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
+
+
+@ns.route('/device_kind')
+class DeviceKindApi(Resource):
+    @ns.doc(description='设备种类列表')
+    def get(self):
+        """获取设备种类"""
+        try:
+            with Session(current_app.engine) as session:
+                stmt = select(EnergyDeviceType)
+                results = session.execute(stmt).scalars().all()
+
+            save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.SUCCESS)
+
+            return jsonify(code=StatesCode.SUCCESS, message='成功', data=to_dict(results))
+
+        except Exception as e:
+            save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.UNKNOWN_ERROR)
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
+
 
 device_list = reqparse.RequestParser(bundle_errors=True)
 device_list.add_argument(name='id', type=str, location='args', required=False, help='设备类别id')
-device_list.add_argument(name='name', type=str, location='args', required=False, help='过滤设备名')
+# device_list.add_argument(name='name', type=str, location='args', required=False, help='过滤设备名')
 device_list.add_argument(name='page_size', type=int, location='args', required=False, help='每页记录数量,默认:20')
 device_list.add_argument(name='page', type=int, location='args', required=False, help='第几页')
 
 
 @ns.route('/device_list')
 class DeviceListApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
-    @ns.doc(id='device_list', description='设备列表')
+    @ns.doc(id='device_list', description='根据类别获取设备列表')
     @ns.expect(device_list)
     def get(self):
-        """获取设备列表"""
+        """根据类别获取设备列表"""
 
         device_type_id = request.args.get('id')
-        device_name = request.args.get('name')
+        # device_name = request.args.get('name')
         page_size = int(request.args.get('page_size', 20))
         page = int(request.args.get('page', 1))
 
@@ -132,14 +176,15 @@ class DeviceListApi(Resource):
 
         try:
             with Session(current_app.engine) as session:
-                stmt = select(SecurityDevice).where(SecurityDevice.device_group == device_type_id)
-
-                if device_name:
-                    stmt = stmt.where(SecurityDevice.device_name.like("%{}%".format(device_name)))
+                stmt = select(DeviceType.device_ids).where(DeviceType.id == device_type_id)
+                device_ids = session.execute(stmt).scalars().first()
 
-                stmt = stmt.offset(page_size * (page - 1)).limit(page_size)
-
-                results = session.execute(stmt).scalars().all()
+                if device_ids:
+                    stmt = select(SecurityDevice).where(SecurityDevice.id.in_(json.loads(device_ids))).offset(
+                        page_size * (page - 1)).limit(page_size)
+                    results = session.execute(stmt).scalars().all()
+                else:
+                    results = []
 
             save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.SUCCESS)
 
@@ -153,24 +198,31 @@ class DeviceListApi(Resource):
 device = reqparse.RequestParser(bundle_errors=True)
 device.add_argument(name='id', type=str, location='args', required=True, help='设备id')
 
+add_device = reqparse.RequestParser(bundle_errors=True)
+add_device.add_argument(name='device_ids', type=str, location='form', required=False, help='设备ids')
+add_device.add_argument(name='device_type_id', type=str, location='form', required=False, help='设备类别id')
+
+delete_device = reqparse.RequestParser(bundle_errors=True)
+delete_device.add_argument(name='device_id', type=str, location='form', required=False, help='设备id')
+delete_device.add_argument(name='device_type_id', type=str, location='form', required=False, help='设备类别id')
+
+
 device_details = reqparse.RequestParser(bundle_errors=True)
 device_details.add_argument(name='id', type=str, location='form', required=False, help='设备id')
 device_details.add_argument(name='device_name', type=str, location='form', required=False, help='设备名称')
 device_details.add_argument(name='device_id', type=str, location='form', required=False, help='设备id')
 device_details.add_argument(name='device_type', type=str, location='form', required=False, help='设备类型(1-摄像头)')
 device_details.add_argument(name='device_location', type=str, location='form', required=False, help='设备位置')
-device_details.add_argument(name='device_age', type=str, location='form', required=False, help='设备年限')
-device_details.add_argument(name='company_id', type=str, location='form', required=False, help='所属单位ID')
-device_details.add_argument(name='user_id', type=str, location='form', required=False, help='设备责任人')
-device_details.add_argument(name='device_group', type=str, location='form', required=False, help='设备分组')
+device_details.add_argument(name='loop_detail', type=str, location='form', required=False, help='回路地址')
+device_details.add_argument(name='gateway_code', type=str, location='form', required=False, help='所属单位ID')
+device_details.add_argument(name='gateway_ip', type=str, location='form', required=False, help='网关服务器')
+device_details.add_argument(name='usage', type=str, location='form', required=False, help='用途')
 device_details.add_argument(name='status', type=str, location='form', required=False, help='设备状态(1-开启)')
-device_details.add_argument(name='floor_id', type=str, location='form', required=False, help='楼层id')
-device_details.add_argument(name='third_id', type=str, location='form', required=False, help='')
 
 
 @ns.route('/device')
 class DeviceApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='device', description='设备详情')
     @ns.expect(device)
@@ -195,39 +247,25 @@ class DeviceApi(Resource):
             save_log(request, Module.DEVICE, OperationType.INQUIRE, StatesCode.UNKNOWN_ERROR)
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
 
-    @ns.doc(id='add_device', description='添加设备详情')
-    @ns.expect(device_details)
+    @ns.doc(id='add_device', description='添加设备')
+    @ns.expect(add_device)
     def post(self):
         """添加设备"""
+        device_ids = request.form.get('device_ids')
+        device_type_id = request.form.get('device_type_id', [])
 
-        device_name = request.form.get('device_name')
-        device_id = request.form.get('device_id')
-        device_type = request.form.get('device_type')
-        device_location = request.form.get('device_location')
-        device_age = request.form.get('device_age')
-        company_id = request.form.get('company_id')
-        user_id = request.form.get('user_id')
-        device_group = request.form.get('device_group')
-        status = request.form.get('status')
-        floor_id = request.form.get('floor_id')
-        third_id = request.form.get('third_id')
-
-        if device_name is None:
-            return jsonify(code=StatesCode.PARA_ERROR, message='设备名称不能为空')
+        if device_ids is None:
+            return jsonify(code=StatesCode.PARA_ERROR, message='设备id不能为空')
         try:
             with Session(current_app.engine) as session:
-                stmt = insert(SecurityDevice).values(
-                    device_name=device_name,
-                    device_id=device_id,
-                    device_type=device_type,
-                    device_location=device_location,
-                    device_age=device_age,
-                    company_id=company_id,
-                    user_id=user_id,
-                    device_group=device_group,
-                    status=status,
-                    floor_id=floor_id,
-                    third_id=third_id
+                res = session.execute(
+                    select(DeviceType.device_ids).where(DeviceType.id == device_type_id)
+                ).scalars().first()
+                res = json.loads(res)
+                res.extend(json.loads(device_ids))
+
+                stmt = update(DeviceType).where(DeviceType.id == device_type_id).values(
+                    device_ids=json.dumps(res)
                 )
                 session.execute(stmt)
                 session.commit()
@@ -250,13 +288,11 @@ class DeviceApi(Resource):
         device_id = request.form.get('device_id')
         device_type = request.form.get('device_type')
         device_location = request.form.get('device_location')
-        device_age = request.form.get('device_age')
-        company_id = request.form.get('company_id')
-        user_id = request.form.get('user_id')
-        device_group = request.form.get('device_group')
+        loop_detail = request.form.get('device_age')
+        gateway_code = request.form.get('company_id')
+        gateway_ip = request.form.get('user_id')
+        usage = request.form.get('device_group')
         status = request.form.get('status')
-        floor_id = request.form.get('floor_id')
-        third_id = request.form.get('third_id')
 
         if device_name is None:
             return jsonify(code=StatesCode.PARA_ERROR, message='设备名称不能为空')
@@ -267,13 +303,12 @@ class DeviceApi(Resource):
                     device_id=device_id,
                     device_type=device_type,
                     device_location=device_location,
-                    device_age=device_age,
-                    company_id=company_id,
-                    user_id=user_id,
-                    device_group=device_group,
+                    loop_detail=loop_detail,
+                    gateway_code=gateway_code,
+                    gateway_ip=gateway_ip,
+                    usage=usage,
                     status=status,
-                    floor_id=floor_id,
-                    third_id=third_id
+
                 )
                 session.execute(stmt)
                 session.commit()
@@ -287,18 +322,33 @@ class DeviceApi(Resource):
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
 
     @ns.doc(id='delete_device', description='删除设备')
-    @ns.expect(device_details)
+    @ns.expect(delete_device)
     def delete(self):
         """删除设备"""
 
-        id = request.form.get('id')
+        device_id = request.form.get('device_id')
+        device_type_id = request.form.get('device_type_id')
 
-        if id is None:
-            return jsonify(code=StatesCode.PARA_ERROR, message='设备id不能为空')
+        if device_id is not None or device_type_id is not None:
+            device_id = int(device_id)
+        else:
+            return jsonify(code=StatesCode.PARA_ERROR, message='设备id和设备类别不能为空')
 
         try:
             with Session(current_app.engine) as session:
-                stmt = delete(SecurityDevice).where(SecurityDevice.id == id)
+
+                res = session.execute(
+                    select(DeviceType.device_ids).where(DeviceType.id == device_type_id)
+                ).scalars().first()
+                res = json.loads(res)
+                if device_id in res:
+                    res.remove(device_id)
+                else:
+                    return jsonify(code=StatesCode.PARA_ERROR, message='设备类别:%s下无此设备' % device_type_id)
+
+                stmt = update(DeviceType).where(DeviceType.id == device_type_id).values(
+                    device_ids=json.dumps(res)
+                )
                 session.execute(stmt)
                 session.commit()
 
@@ -311,32 +361,41 @@ class DeviceApi(Resource):
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
 
 
-batch_delete_user = reqparse.RequestParser(bundle_errors=True)
-batch_delete_user.add_argument(name='devices_id', type=str, required=True, location='form', help='设备id列表')
+batch_delete_device = reqparse.RequestParser(bundle_errors=True)
+batch_delete_device.add_argument(name='device_ids', type=str, required=False, location='form', help='设备id列表')
+batch_delete_device.add_argument(name='device_type_id', type=str, location='form', required=False, help='设备类别id')
 
 
 @ns.route('/batch_delete_device')
 class BatchDeleteDeviceApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='batch_delete_device', description='批量删除设备')
-    @ns.expect(batch_delete_user)
+    @ns.expect(batch_delete_device)
     def delete(self):
         """批量删除设备"""
-        device_id = request.form.get('devices_id')
+        device_ids = request.form.get('device_ids')
+        device_type_id = request.form.get('device_type_id')
 
-        if device_id is not None:
-            device_id = json.loads(device_id)
+        if device_ids is not None or device_type_id is not None:
+            device_ids = json.loads(device_ids)
+            device_type_id = int(device_type_id)
         else:
-            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='设备id不能为空')
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='设备id和设备类别id不能为空')
 
         try:
             with Session(current_app.engine) as session:
-                stmt = select(SecurityDevice).where(SecurityDevice.id.in_(device_id))
-                results = session.execute(stmt).scalars().all()
+                res = session.execute(
+                    select(DeviceType.device_ids).where(DeviceType.id == device_type_id)
+                ).scalars().first()
+                res = json.loads(res)
+                for device_id in device_ids:
+                    res.remove(device_id)
 
-                for result in results:
-                    session.delete(result)
+                stmt = update(DeviceType).where(DeviceType.id == device_type_id).values(
+                    device_ids=json.dumps(res)
+                )
+                session.execute(stmt)
                 session.commit()
 
             save_log(request, Module.DEVICE, OperationType.BATCH_DELETE, StatesCode.SUCCESS)
@@ -355,7 +414,7 @@ import_device.add_argument(name='group_id', type=str, required=True, location='f
 
 @ns.route('/import_device')
 class ImportDeviceApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='import_device', description='导入模版下载')
     def get(self):

+ 1 - 1
src/app/api/download.py

@@ -14,7 +14,7 @@ config = Config()
 
 @ns.route('/<file_name>')
 class DownloadFileApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(description='文件下载')
     def get(self, file_name):

+ 99 - 26
src/app/api/information.py

@@ -1,4 +1,6 @@
 import base64
+import json
+import os
 
 from flask import request, jsonify, current_app, g
 from flask_restx import Resource, Namespace, reqparse
@@ -7,10 +9,10 @@ from sqlalchemy.orm import Session
 from werkzeug.datastructures import FileStorage
 
 from app.defines import Module, OperationType, StatesCode
-from app.modle.information import FloorConfiguration, StaffConfiguration, SecurityPerson
+from app.modle.information import FloorConfiguration, StaffConfiguration, SecurityPerson, FloorConfigurationHistory
 from app.utils.jwt_util import login_required
 from app.utils.save_log import save_log
-from app.utils.util import to_dict
+from app.utils.util import to_dict, cn_now
 from config import Config
 
 ns = Namespace('information', description='信息管理接口')
@@ -26,9 +28,37 @@ def information_list(rows):
     return res
 
 
+def upload_history(floor_configuration_id, url):
+    """
+    记录楼层表地图信息配置历史记录
+    :param floor_configuration_id: 楼层表地图信息配置id
+    :param url: 图片url
+    :return:
+    """
+    with Session(current_app.engine) as session:
+        stmt = select(FloorConfigurationHistory.url).where(
+            FloorConfigurationHistory.floor_configuration == floor_configuration_id)
+        res = session.execute(stmt).scalars().first()
+        if res:
+            res = json.loads(res)
+            res.append({'time': cn_now(), 'url': url, 'account': g.user_name})
+            up_stmt = update(FloorConfigurationHistory).where(
+                FloorConfigurationHistory.floor_configuration == floor_configuration_id).values(url=json.dumps(res))
+
+        else:
+            res = []
+            res.append({'time': cn_now(), 'url': url, 'account': g.user_name})
+            up_stmt = insert(FloorConfigurationHistory).values(
+                floor_configuration=floor_configuration_id,
+                url=json.dumps(res)
+            )
+        session.execute(up_stmt)
+        session.commit()
+
+
 @ns.route('/information_list')
 class InformationTypeApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='information_list', description='信息列表')
     def get(self):
@@ -70,12 +100,12 @@ floor_configuration.add_argument(name='name', type=str, location='form', require
 floor_configuration.add_argument(name='location', type=str, location='form', required=False, help='楼层位置')
 floor_configuration.add_argument(name='use', type=str, location='form', required=False, help='楼层用途')
 floor_configuration.add_argument(name='remark', type=str, location='form', required=False, help='备注')
-floor_configuration.add_argument(name='attachment', type=FileStorage, location='files', required=False, help='附件')
+floor_configuration.add_argument(name='attachment_url', type=str, location='form', required=False, help='附件url')
 
 
 @ns.route('/floor_configuration')
 class FloorConfigurationApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='floor_configuration', description='获取楼层地图信息配置')
     @ns.expect(floor_configuration_details)
@@ -104,18 +134,11 @@ class FloorConfigurationApi(Resource):
         location = request.form.get('location')
         use = request.form.get('use')
         remark = request.form.get('remark')
-        attachment = request.files.get('attachment')
+        attachment_url = request.form.get('attachment_url')
 
         if name is None:
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message="配置名不能为空")
 
-        if attachment:
-            ext = attachment.filename.split('.')[-1]
-            base64_data = b'data:image/%s;base64,' % ext.encode('utf-8') + base64.b64encode(attachment.read())
-            base64_data = base64_data.decode('utf-8')
-        else:
-            base64_data = None
-
         try:
             with Session(current_app.engine) as session:
                 stmt = insert(FloorConfiguration).values(
@@ -123,11 +146,13 @@ class FloorConfigurationApi(Resource):
                     location=location,
                     use=use,
                     remark=remark,
-                    attachment=base64_data,
+                    attachment=attachment_url,
                     account=g.user_name
                 )
-                session.execute(stmt)
+                result = session.execute(stmt)
                 session.commit()
+                # 添加历史记录
+                upload_history(result.inserted_primary_key[0], attachment_url)
 
             save_log(request, Module.INFORMATION, OperationType.ADD, StatesCode.SUCCESS)
 
@@ -146,18 +171,11 @@ class FloorConfigurationApi(Resource):
         location = request.form.get('location')
         use = request.form.get('use')
         remark = request.form.get('remark')
-        attachment = request.files.get('attachment')
+        attachment_url = request.form.get('attachment_url')
 
         if name is None:
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message="配置名不能为空")
 
-        if attachment:
-            ext = attachment.filename.split('.')[-1]
-            base64_data = b'data:image/%s;base64,' % ext.encode('utf-8') + base64.b64encode(attachment.read())
-            base64_data = base64_data.decode('utf-8')
-        else:
-            base64_data = None
-
         try:
             with Session(current_app.engine) as session:
                 stmt = update(FloorConfiguration).where(FloorConfiguration.id == floor_configuration_id).values(
@@ -165,11 +183,13 @@ class FloorConfigurationApi(Resource):
                     location=location,
                     use=use,
                     remark=remark,
-                    attachment=base64_data,
+                    attachment=attachment_url,
                     account=g.user_name
                 )
                 session.execute(stmt)
                 session.commit()
+                # 记录历史
+                upload_history(floor_configuration_id, attachment_url)
 
             save_log(request, Module.INFORMATION, OperationType.UPDATE, StatesCode.SUCCESS)
 
@@ -203,7 +223,7 @@ class FloorConfigurationApi(Resource):
 
 @ns.route('/security_person')
 class GetSecurityPersonApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     def get(self):
         """获取人员名单"""
@@ -235,7 +255,7 @@ floor_configuration.add_argument(name='remark', type=str, location='form', requi
 
 @ns.route('/staff_configuration')
 class StaffConfigurationApi(Resource):
-    method_decorators = [login_required]
+    # method_decorators = [login_required]
 
     @ns.doc(id='staff_configuration', description='获取人员配置信息')
     @ns.expect(staff_configuration_details)
@@ -345,3 +365,56 @@ class StaffConfigurationApi(Resource):
         except Exception as e:
             save_log(request, Module.INFORMATION, OperationType.DELETE, StatesCode.UNKNOWN_ERROR)
             return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))
+
+
+upload_pictures = reqparse.RequestParser(bundle_errors=True)
+upload_pictures.add_argument(name='file', type=FileStorage, location='files', required=False, help='图片')
+
+
+@ns.route('/upload_pictures')
+class UploadPictures(Resource):
+    @ns.doc(description='图片上传')
+    @ns.expect(upload_pictures)
+    def post(self):
+        """上传图片"""
+        file = request.files.get('file')
+        if file:
+            file.save(os.path.join(config.common.SAVE_FILE_PATH, file.filename))
+            file_url = config.common.FILE_URL + file.filename
+        else:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message='图片不能为空')
+
+        return jsonify(code=StatesCode.SUCCESS, message='成功', data=file_url)
+
+
+get_floor_configuration_history = reqparse.RequestParser(bundle_errors=True)
+get_floor_configuration_history.add_argument(name='floor_configuration_id', type=str, location='args', required=False,
+                                             help='楼层地图信息配置id')
+
+
+@ns.route('/get_floor_configuration_history')
+class GetFloorConfigurationHistory(Resource):
+
+    @ns.doc(description='获取楼层地图信息配置历史记录')
+    @ns.expect(get_floor_configuration_history)
+    def get(self):
+        """获取楼层地图信息配置历史记录"""
+
+        floor_configuration_id = request.args.get('floor_configuration_id')
+
+        if floor_configuration_id is None:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message="配置id不能为空")
+
+        try:
+            with Session(current_app.engine) as session:
+                stmt = select(FloorConfigurationHistory.url).where(
+                    FloorConfigurationHistory.floor_configuration == floor_configuration_id)
+                results = session.execute(stmt).scalars().first()
+
+            save_log(request, Module.INFORMATION, OperationType.INQUIRE, StatesCode.SUCCESS)
+
+            return jsonify(code=StatesCode.SUCCESS, message='成功', data=results)
+
+        except Exception as e:
+            save_log(request, Module.INFORMATION, OperationType.INQUIRE, StatesCode.UNKNOWN_ERROR)
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message=str(e))

+ 2 - 2
src/app/api/log.py

@@ -26,7 +26,7 @@ log_list.add_argument(name='end_time', type=str, location='args', required=False
 
 @ns.route('/log_list')
 class LogList(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='log', description='日志列表')
     @ns.expect(log_list)
@@ -73,7 +73,7 @@ class LogList(Resource):
 
 @ns.route('/log_export')
 class LogExportApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='log_export', description='日志导出')
     def get(self):

+ 2 - 2
src/app/api/message.py

@@ -22,7 +22,7 @@ config = Config()
 
 @ns.route('/message_list')
 class MessageTypeApi(Resource):
-    method_decorators = [login_required]
+    ####method_decorators = [login_required]
 
     @ns.doc(id='message_list', description='消息列表')
     def get(self):
@@ -105,7 +105,7 @@ message.add_argument(name='type', type=str, location='form', required=False, hel
 
 @ns.route('/message')
 class MessageApi(Resource):
-    method_decorators = [login_required]
+    ####method_decorators = [login_required]
 
     @ns.doc(id='message_details', description='获取消息详情')
     @ns.expect(message_details)

+ 15 - 5
src/app/api/organization.py

@@ -23,7 +23,7 @@ company_list.add_argument(name='name', type=str, location='args', required=False
 
 @ns.route('/company_list')
 class CompanyListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_company_list', description='获取公司列表')
     @ns.expect(company_list)
@@ -64,6 +64,8 @@ company_details.add_argument(name='code', type=str, location='form', required=Fa
 company_details.add_argument(name='registered_address', type=str, location='form', required=False, help='注册地址')
 company_details.add_argument(name='business_address', type=str, location='form', required=False, help='经营地址')
 company_details.add_argument(name='legal_person_name', type=str, location='form', required=False, help='法人姓名')
+company_details.add_argument(name='contact_person', type=str, location='form', required=False, help='联系人')
+company_details.add_argument(name='contact_information', type=str, location='form', required=False, help='联系人电话')
 company_details.add_argument(name='company_code', type=str, location='form', required=False, help='公司编码')
 company_details.add_argument(name='staff_size', type=str, location='form', required=False, help='编制人数')
 company_details.add_argument(name='on_guard_size', type=str, location='form', required=False, help='在岗人数')
@@ -77,7 +79,7 @@ get_company_details.add_argument(name='company_id', type=int, location='args', r
 
 @ns.route('/company')
 class CompanyApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_company_details', description='获取公司详情')
     @ns.expect(get_company_details)
@@ -113,6 +115,8 @@ class CompanyApi(Resource):
         registered_address = request.form.get('registered_address')
         business_address = request.form.get('business_address')
         legal_person_name = request.form.get('legal_person_name')
+        contact_person = request.form.get('contact_person')
+        contact_information = request.form.get('contact_information')
         company_code = request.form.get('company_code')
         staff_size = request.form.get('staff_size')
         on_guard_size = request.form.get('on_guard_size')
@@ -144,6 +148,8 @@ class CompanyApi(Resource):
                     registered_address=registered_address,
                     business_address=business_address,
                     legal_person_name=legal_person_name,
+                    contact_person=contact_person,
+                    contact_information=contact_information,
                     company_code=company_code,
                     staff_size=staff_size,
                     on_guard_size=on_guard_size
@@ -171,6 +177,8 @@ class CompanyApi(Resource):
         registered_address = request.form.get('registered_address')
         business_address = request.form.get('business_address')
         legal_person_name = request.form.get('legal_person_name')
+        contact_person = request.form.get('contact_person')
+        contact_information = request.form.get('contact_information')
         company_code = request.form.get('company_code')
         staff_size = request.form.get('staff_size')
         on_guard_size = request.form.get('on_guard_size')
@@ -195,6 +203,8 @@ class CompanyApi(Resource):
                     registered_address=registered_address,
                     business_address=business_address,
                     legal_person_name=legal_person_name,
+                    contact_person=contact_person,
+                    contact_information=contact_information,
                     company_code=company_code,
                     staff_size=staff_size,
                     on_guard_size=on_guard_size
@@ -249,7 +259,7 @@ department_details.add_argument(name='censure', type=str, location='form', requi
 
 @ns.route('/department_list')
 class DepartmentListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='department_list', description='获取公司下部门列表')
     @ns.expect(get_company_details)
@@ -284,7 +294,7 @@ get_department.add_argument(name='department_id', type=str, location='args', req
 
 @ns.route('/department')
 class DepartmentApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_department_details', description='获取部门详情')
     @ns.expect(get_department)
@@ -425,7 +435,7 @@ batch_delete_company.add_argument(name='company_ids', type=list, location='form'
 
 @ns.route('/batch_delete_company')
 class BatchDeleteCompanyApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='batch_delete_users', description='批量删除公司')
     @ns.expect(batch_delete_company)

+ 2 - 2
src/app/api/permission.py

@@ -14,7 +14,7 @@ ns = Namespace('permission', description='权限管理')
 
 @ns.route('/permission')
 class PermissionApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_permission', description='获取权限配置信息')
     @ns.expect()
@@ -45,7 +45,7 @@ auth_permission.add_argument(name='path', type=str, location='args', required=Fa
 
 @ns.route('/auth_permission')
 class AuthPermissionApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='auth_permission', description='权限认证')
     @ns.expect(auth_permission)

+ 3 - 3
src/app/api/role.py

@@ -21,7 +21,7 @@ role_list.add_argument(name='page', type=int, location='args', required=False, h
 
 @ns.route('/role_list')
 class GetUserListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_role_list', description='获取角色列表')
     @ns.expect(role_list)
@@ -60,7 +60,7 @@ role_id.add_argument(name='role_id', type=int, location='args', required=False,
 
 @ns.route('/role')
 class RoleApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_role', description='获取角色')
     @ns.expect(role_id)
@@ -192,7 +192,7 @@ batch_del_member.add_argument(name='users_id', type=str, location='form', requir
 
 @ns.route('/member')
 class RoleMemberApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_role_member', description='获取角色成员')
     @ns.expect(get_member)

+ 1 - 1
src/app/api/server.py

@@ -9,7 +9,7 @@ ns = Namespace('server', description='服务管理接口')
 
 @ns.route('/server_list')
 class ServerListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_server_list', description='获取服务列表')
     def get(self):

+ 1 - 1
src/app/api/strategy.py

@@ -19,7 +19,7 @@ config = Config()
 
 @ns.route('')
 class StrategyList(Resource):
-    method_decorators = [login_required]
+    # #method_decorators = [login_required]
 
     @ns.doc(description='获取策略配置')
     def get(self):

+ 40 - 0
src/app/api/system_index.py

@@ -0,0 +1,40 @@
+import requests
+from flask import request, jsonify
+from flask_restx import Resource, Namespace, reqparse
+
+from app.defines import StatesCode
+from app.utils.jwt_util import login_required
+from config import Config
+
+ns = Namespace('index', description='指标配置')
+
+config = Config()
+
+index_list = reqparse.RequestParser(bundle_errors=True)
+index_list.add_argument(name='page_size', type=int, location='args', required=False, help='每页记录数量,默认:20')
+index_list.add_argument(name='page', type=int, location='args', required=False, help='第几页')
+index_list.add_argument(name='parent_id', type=int, location='args', required=False, help='父id')
+
+
+@ns.route('index_list')
+class IndexApi(Resource):
+    #method_decorators = [login_required]
+
+    @ns.doc(description='获取指标配置列表')
+    @ns.expect(index_list)
+    def get(self):
+        parent_id = int(request.args.get('parent_id'))
+        page_size = int(request.args.get('page_size', 20))
+        page = int(request.args.get('page', 1))
+        params = {
+            'parentId': parent_id,
+            'page': page,
+            'pageSize': page_size
+        }
+        rep = requests.get(
+            'http://{host}:{post}/ioc-api/system_index/getIndexList'.format(host=config.system_monitoring.HOST,
+                                                                            post=config.system_monitoring.POST
+                                                                            ),
+            params=params, headers={'clientId': "99"}).json()
+
+        return jsonify(code=StatesCode.SUCCESS, message='成功', data=rep)

+ 1 - 1
src/app/api/system_monitoring.py

@@ -20,7 +20,7 @@ job_list.add_argument(name='page', type=int, location='args', required=False, he
 
 @ns.route('/job_list')
 class TimedTaskApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(description='获取定时任务列表')
     @ns.expect(job_list)

+ 6 - 6
src/app/api/users.py

@@ -25,7 +25,7 @@ get_users.add_argument(name='page', type=int, location='args', required=False, h
 
 @ns.route('/user_list')
 class GetUserListApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_users_list', description='获取用户列表')
     @ns.expect(get_users)
@@ -83,7 +83,7 @@ user_details.add_argument(name='id', type=int, required=True, location='args', h
 
 @ns.route('/user')
 class UsersApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='get_users_details', description='获取用户详情')
     @ns.expect(user_details)
@@ -258,7 +258,7 @@ users_status.add_argument(name='status', type=int, required=True, location='form
 
 @ns.route('/user_status')
 class GetUsersApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='modify_users_status', description='修改用户状态,激活、禁用')
     @ns.expect(users_status)
@@ -290,7 +290,7 @@ batch_delete_user.add_argument(name='users_id', type=str, required=True, locatio
 
 @ns.route('/batch_delete_user')
 class BatchDeleteUserApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='batch_delete_users', description='批量删除用户')
     @ns.expect(batch_delete_user)
@@ -328,7 +328,7 @@ batch_modify_user_status.add_argument(name='status', type=int, required=True, lo
 
 @ns.route('/batch_modify_user_status')
 class BatchModifyUsersStatusApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='batch_modify_user_status', description='批量修改用户状态,激活、禁用')
     @ns.expect(batch_modify_user_status)
@@ -365,7 +365,7 @@ class BatchModifyUsersStatusApi(Resource):
 
 @ns.route('/export_data')
 class ExportDataApi(Resource):
-    method_decorators = [login_required]
+    #method_decorators = [login_required]
 
     @ns.doc(id='export_data', description='导出用户数据')
     def get(self):

+ 38 - 10
src/app/modle/device.py

@@ -10,12 +10,23 @@ class DeviceType(Base):
 
     id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, unique=True, doc='id')
     type_name = Column(String, nullable=False, unique=True, index=False, doc='类别名称', comment='类别名称')
+    device_ids = Column(String, nullable=False, unique=True, index=False, doc='关联设备id列表',
+                        comment='关联设备id列表')
+
+
+class EnergyDeviceType(Base):
+    """设备种类"""
+
+    __tablename__ = 'energy_device_type'
+
+    id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, unique=True, doc='id')
+    name = Column(String, nullable=False, unique=False, index=False, doc='类别名称', comment='类别名称')
+    code = Column(Integer, nullable=False, unique=False, index=False, doc='类别编码', comment='类别编码')
 
 
 class SecurityDevice(Base):
     """设备表"""
-
-    __tablename__ = 'security_device'
+    __tablename__ = 'energy_device'
 
     id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, unique=True, doc='id')
     device_name = Column(String, nullable=False, unique=False, index=False, doc='设备名称', comment='设备名称')
@@ -23,11 +34,28 @@ class SecurityDevice(Base):
     device_type = Column(Integer, nullable=True, unique=False, index=False, doc='设备类型(1-摄像头)',
                          comment='设备类型(1-摄像头)')
     device_location = Column(String, nullable=True, unique=False, index=False, doc='设备位置', comment='设备位置')
-    device_age = Column(Integer, nullable=True, unique=False, index=False, doc='设备年限', comment='设备年限')
-    company_id = Column(String, nullable=True, unique=False, index=False, doc='所属单位ID', comment='所属单位ID')
-    user_id = Column(String, nullable=True, unique=False, index=False, doc='设备责任人', comment='设备责任人')
-    device_group = Column(String, nullable=True, unique=False, index=False, doc='设备分组', comment='设备分组')
-    status = Column(Integer, nullable=True, unique=False, index=False, doc='设备状态(1-开启)',
-                    comment='设备状态(1-开启)')
-    floor_id = Column(Integer, nullable=True, unique=False, index=False, doc='楼层id', comment='楼层id')
-    third_id = Column(String, nullable=True, unique=False, index=False, doc='', comment='')
+    loop_detail = Column(String, nullable=True, unique=False, index=False, doc='回路地址', comment='回路地址')
+    gateway_code = Column(String, nullable=True, unique=False, index=False, doc='所属单位ID', comment='所属单位ID')
+    gateway_ip = Column(String, nullable=True, unique=False, index=False, doc='网关服务器', comment='网关服务器')
+    usage = Column(String, nullable=True, unique=False, index=False, doc='用途', comment='用途')
+    status = Column(String, nullable=True, unique=False, index=False, doc='设备状态(1-开启)', comment='设备状态(1-开启)')
+
+# class SecurityDevice(Base):
+#     """设备表"""
+#
+#     __tablename__ = 'security_device'
+#
+#     id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, unique=True, doc='id')
+#     device_name = Column(String, nullable=False, unique=False, index=False, doc='设备名称', comment='设备名称')
+#     device_id = Column(String, nullable=True, unique=False, index=False, doc='设备id', comment='设备id')
+#     device_type = Column(Integer, nullable=True, unique=False, index=False, doc='设备类型(1-摄像头)',
+#                          comment='设备类型(1-摄像头)')
+#     device_location = Column(String, nullable=True, unique=False, index=False, doc='设备位置', comment='设备位置')
+#     device_age = Column(Integer, nullable=True, unique=False, index=False, doc='设备年限', comment='设备年限')
+#     company_id = Column(String, nullable=True, unique=False, index=False, doc='所属单位ID', comment='所属单位ID')
+#     user_id = Column(String, nullable=True, unique=False, index=False, doc='设备责任人', comment='设备责任人')
+#     device_group = Column(String, nullable=True, unique=False, index=False, doc='设备分组', comment='设备分组')
+#     status = Column(Integer, nullable=True, unique=False, index=False, doc='设备状态(1-开启)',
+#                     comment='设备状态(1-开启)')
+#     floor_id = Column(Integer, nullable=True, unique=False, index=False, doc='楼层id', comment='楼层id')
+#     third_id = Column(String, nullable=True, unique=False, index=False, doc='', comment='')

+ 14 - 3
src/app/modle/information.py

@@ -1,11 +1,11 @@
-from sqlalchemy import String, Column, Integer, DateTime
+from sqlalchemy import String, Column, Integer, DateTime, JSON
 
 from app.modle import Base
 from app.utils.util import cn_now
 
 
 class FloorConfiguration(Base):
-    """楼层表"""
+    """楼层表地图信息配置"""
 
     __tablename__ = 'FloorConfiguration'
 
@@ -19,8 +19,18 @@ class FloorConfiguration(Base):
     time = Column(String, nullable=True, unique=False, index=False, default=cn_now(), doc='上传时间')
 
 
+class FloorConfigurationHistory(Base):
+    """楼层表地图信息配置历史记录"""
+
+    __tablename__ = 'FloorConfigurationHistory'
+
+    id = Column(Integer, primary_key=True, autoincrement=True, nullable=False, unique=True, doc='id')
+    floor_configuration = Column(Integer, nullable=False, unique=False, index=False, doc='楼层表地图信息配置id')
+    url = Column(String, nullable=False, unique=False, index=False, default={}, doc='图片url列表')
+
+
 class StaffConfiguration(Base):
-    """人员配置"""
+    """安保人员信息配置"""
 
     __tablename__ = 'StaffConfiguration'
 
@@ -30,6 +40,7 @@ class StaffConfiguration(Base):
     responsibility_range = Column(String, nullable=True, unique=False, index=False, doc='职责范围')
     staff_list = Column(String, nullable=True, unique=False, index=False, doc='人员名单')
     remark = Column(String, nullable=True, unique=False, index=False, doc='备注')
+    duty_time = Column(JSON, nullable=True, unique=False, index=False, doc="值班日期:{'start_time': '', end_time: ''}")
 
 
 class SecurityPerson(Base):

+ 3 - 0
src/app/modle/organization.py

@@ -17,9 +17,12 @@ class Company(Base):
     registered_address = Column(String, nullable=True, unique=False, index=False, doc='注册地址')
     business_address = Column(String, nullable=True, unique=False, index=False, doc='经营地址')
     legal_person_name = Column(String, nullable=True, unique=False, index=False, doc='法人姓名')
+    contact_person = Column(String, nullable=True, unique=False, index=False, doc='联系人')
+    contact_information = Column(String, nullable=True, unique=False, index=False, doc='联系人电话')
     company_code = Column(Integer, nullable=True, unique=False, index=False, doc='公司编码')
     staff_size = Column(Integer, nullable=True, unique=False, index=False, doc='编制人数')
     on_guard_size = Column(Integer, nullable=True, unique=False, index=False, doc='在岗人数')
+    Parent_company = Column(Integer, nullable=True, unique=False, index=False, doc='上级公司id')
     department = relationship('Department', cascade='all, delete-orphan')