浏览代码

Se crea el servicio para energía

Oscar Alfredo Leiva Salomón 6 年之前
父节点
当前提交
b393bd61b7
共有 2 个文件被更改,包括 127 次插入0 次删除
  1. 0 0
      app/main/service/__init__.py
  2. 127 0
      app/main/service/energy_service.py

+ 0 - 0
app/main/service/__init__.py


+ 127 - 0
app/main/service/energy_service.py

@@ -0,0 +1,127 @@
+from app.main.model.logs import Logs
+from datetime import datetime, timedelta
+
+
+def _make_pipeline(serial_number, log_number,
+                   register, start_date, end_date, aggregate_by):
+    pipeline = [
+        {'$project':
+            {
+                'serialNumber': 1,
+                'meterLogNumber': 1,
+                'mediciones': 1,
+                'logDate': 1,
+                'hour': {
+                    '$hour': {
+                        '$dateFromString':  {'dateString': '$logDate'}
+                    }
+                },
+                'day': {
+                    '$dayOfMonth': {
+                        '$dateFromString':  {'dateString': '$logDate'}
+                    }
+                },
+                'month': {
+                    '$month': {
+                        '$dateFromString':  {'dateString': '$logDate'}
+                    }
+                },
+                'year': {
+                    '$year': {
+                        '$dateFromString':  {'dateString': '$logDate'}
+                    }
+                },
+            }
+         },
+        {'$unwind': '$mediciones'},
+        {'$match': {
+            'serialNumber': serial_number,
+            'meterLogNumber': int(log_number),
+            "mediciones.registro": register,
+            'logDate': {'$gte': start_date, '$lt': end_date}}},
+        {'$group':
+            {
+                '_id': aggregate_by,
+                'date': {'$min': '$logDate'},
+                'total_energy': {'$sum': {'$toInt': "$mediciones.lectura"}}
+            }
+         },
+        {'$sort': {'date': -1}},
+        {'$project': {'date': 1, 'total_energy': 1, '_id': 0}}
+    ]
+
+    return pipeline
+
+
+def get_total_wh_by_day(serial_number, log_number, start_date, end_date=None):
+    """Get total energy Wh by day
+
+    :serial_number: string object
+    :log_number: string object
+    :date: string object
+
+    """
+    log = Logs.objects(serialNumber=serial_number,
+                       meterLogNumber=log_number,
+                       logDate=start_date + " 00:00:00")
+
+    if not log:
+        return {
+            'error': 'No existe informacion para el medidor, log o fecha'
+        }
+
+    register = 4999
+
+    aggregate_by = {
+        'hour': None,
+        'day': '$day',
+        'month': None,
+        'year': None
+    }
+    if end_date is None:
+        date_dt = datetime.strptime(start_date, "%Y-%m-%d")
+        delta = timedelta(days=1)
+        end_date_dt = date_dt + delta
+        end_date = end_date_dt.strftime("%Y-%m-%d")
+
+    pipeline = _make_pipeline(
+        serial_number, log_number, register, start_date,
+        end_date, aggregate_by)
+    return {'success': [log for log in Logs.objects.aggregate(*pipeline)]}
+
+
+def get_hourly_wh_by_day(serial_number, log_number, start_date, end_date):
+    """Get hourly energy Wh by day
+
+    :serial_number: string object
+    :log_number: string object
+    :date: string object
+
+    """
+    log = Logs.objects(serialNumber=serial_number,
+                       meterLogNumber=log_number,
+                       logDate=start_date + " 00:00:00")
+
+    if not log:
+        return {'error': 'No existe información para el medidor, log o fecha'}
+
+    register = 4999
+
+    aggregate_by = {
+        'hour': '$hour',
+        'day': '$day',
+        'month': None,
+        'year': None
+    }
+
+    if end_date is None:
+        date_dt = datetime.strptime(start_date, "%Y-%m-%d")
+        delta = timedelta(days=1)
+        end_date_dt = date_dt + delta
+        end_date = end_date_dt.strftime("%Y-%m-%d")
+
+    pipeline = _make_pipeline(
+        serial_number, log_number, register, start_date,
+        end_date, aggregate_by)
+    print(pipeline)
+    return {'success': [log for log in Logs.objects.aggregate(*pipeline)]}