Commit f85e10e2 authored by harshavardhan.c's avatar harshavardhan.c

updated oee changes pushed to develop

parent afaf91ef
...@@ -3,7 +3,6 @@ from copy import deepcopy ...@@ -3,7 +3,6 @@ from copy import deepcopy
from scripts.constants.db_connections import mongo_client from scripts.constants.db_connections import mongo_client
from scripts.constants.ui_constants import DonutChart, BaseWaterChart from scripts.constants.ui_constants import DonutChart, BaseWaterChart
from scripts.db.mongo.ilens_configuration.collections.constants import Constants from scripts.db.mongo.ilens_configuration.collections.constants import Constants
from scripts.schemas.batch_oee import WaterFallChart from scripts.schemas.batch_oee import WaterFallChart
...@@ -11,10 +10,10 @@ class ChartMaker: ...@@ -11,10 +10,10 @@ class ChartMaker:
def __init__(self, project_id=None): def __init__(self, project_id=None):
self.constants_con = Constants(mongo_client=mongo_client) self.constants_con = Constants(mongo_client=mongo_client)
def main_creator(self, data, activity_length, overall=True): def main_creator(self, data, overall=True):
chart_data = dict() chart_data = dict()
chart_data["waterfall"] = self.waterfall_chart(WaterFallChart(**data)) chart_data["waterfall"] = self.waterfall_chart(WaterFallChart(**data))
return self.donut_chart(data, chart_data, activity_length, overall) return self.donut_chart(data, chart_data, overall)
@staticmethod @staticmethod
def waterfall_chart(data: WaterFallChart): def waterfall_chart(data: WaterFallChart):
...@@ -40,7 +39,7 @@ class ChartMaker: ...@@ -40,7 +39,7 @@ class ChartMaker:
return waterfall_base["data"] return waterfall_base["data"]
@staticmethod @staticmethod
def donut_chart(data, chart_data, activity_length, overall: bool): def donut_chart(data, chart_data, overall: bool):
base = DonutChart.base base = DonutChart.base
chart_keys = DonutChart.chart_keys chart_keys = DonutChart.chart_keys
for each in chart_keys: for each in chart_keys:
...@@ -65,7 +64,7 @@ class ChartMaker: ...@@ -65,7 +64,7 @@ class ChartMaker:
for k, v in data.items(): for k, v in data.items():
if k not in do_not_display: if k not in do_not_display:
if k in ["total_units", "good_units"] and not overall: if k in ["total_units", "good_units"] and not overall:
v = round(v - activity_length, 2) v = round(v, 2)
chart_data.update( chart_data.update(
{ {
k: dict(label=k.capitalize().replace("_", " "), value=v) k: dict(label=k.capitalize().replace("_", " "), value=v)
......
from datetime import datetime from datetime import datetime
import pendulum
import pytz
from scripts.constants import UOM, TagCategoryConstants from scripts.constants import UOM, TagCategoryConstants
from scripts.errors import ErrorCodes from scripts.errors import ErrorCodes
from scripts.logging import logger from scripts.logging import logger
...@@ -201,7 +204,7 @@ class OEEEngine: ...@@ -201,7 +204,7 @@ class OEEEngine:
batch_oee = BatchOEEData( batch_oee = BatchOEEData(
**request_data.dict(), **request_data.dict(),
calculated_on=datetime.now().astimezone(tz=request_data.tz).isoformat(), calculated_on=datetime.now().astimezone(tz=pytz.timezone(request_data.tz)).isoformat(),
productive_time=productive_time, productive_time=productive_time,
availability=availability * 100, availability=availability * 100,
performance=performance * 100, performance=performance * 100,
...@@ -213,18 +216,19 @@ class OEEEngine: ...@@ -213,18 +216,19 @@ class OEEEngine:
) )
return batch_oee return batch_oee
except Exception: except Exception as e:
logger.exception(f"Exception occurred while calculating batch oee {e.args}")
raise raise
@staticmethod @staticmethod
def get_updated_planned_production_time(input_time, return_type): def get_updated_planned_production_time(input_time: pendulum.Duration, return_type):
if return_type == "minutes": if return_type == "minutes":
return input_time.minutes return input_time.in_minutes()
elif return_type == "seconds": elif return_type == "seconds":
return input_time.seconds return input_time.in_seconds()
elif return_type == "hours": elif return_type == "hours":
return input_time.hours return input_time.in_hours()
elif return_type == "microseconds": elif return_type == "microseconds":
return input_time.microseconds return input_time.total_seconds()
else: else:
return input_time.seconds return input_time.in_minutes()
import json import json
from datetime import datetime from datetime import datetime
import pandas as pd
import pytz import pytz
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from scripts.constants import ResponseCodes from scripts.config import DBConf
from scripts.core.engine.oee_calculator import OEEEngine from scripts.constants import ResponseCodes, CommonConstants, TagCategoryConstants
from scripts.core.engine.oee_calculator import OEEEngine, OEETagFinder
from scripts.core.handlers.tag_handler import TagHierarchyHandler
from scripts.db.psql.oee_discrete import DiscreteOEE from scripts.db.psql.oee_discrete import DiscreteOEE
from scripts.db.redis_connections import oee_production_db from scripts.db.redis_connections import oee_production_db
from scripts.errors import DataNotFound
from scripts.logging import logger from scripts.logging import logger
from scripts.schemas.batch_oee import OEEDataInsertRequest, BatchOEEData, OEEDataSaveRequest from scripts.schemas.batch_oee import OEEDataInsertRequest, BatchOEEData, OEEDataSaveRequest
from scripts.schemas.response_models import DefaultResponse from scripts.schemas.response_models import DefaultResponse
from scripts.utils.common_utils import CommonUtils from scripts.utils.common_utils import CommonUtils
from scripts.utils.kairos_db_util import BaseQuery
from scripts.utils.kairos_db_util.df_formation_util import create_kairos_df
from scripts.utils.kairos_db_util.query_kairos import KairosQuery
oee_engine = OEEEngine() oee_engine = OEEEngine()
...@@ -20,6 +27,9 @@ class CalculateBatchOEEHandler: ...@@ -20,6 +27,9 @@ class CalculateBatchOEEHandler:
def __init__(self, project_id=None): def __init__(self, project_id=None):
self.common_util = CommonUtils() self.common_util = CommonUtils()
self.base_query = BaseQuery()
self.oee_tag_finder = OEETagFinder()
self.tag_hierarchy_handler = TagHierarchyHandler(project_id=project_id)
def calculate_oee(self, db, request_data: OEEDataInsertRequest): def calculate_oee(self, db, request_data: OEEDataInsertRequest):
table_obj = DiscreteOEE(db=db) table_obj = DiscreteOEE(db=db)
...@@ -27,12 +37,20 @@ class CalculateBatchOEEHandler: ...@@ -27,12 +37,20 @@ class CalculateBatchOEEHandler:
record_presence = table_obj.get_oee_data_by_reference_id(reference_id=request_data.reference_id, record_presence = table_obj.get_oee_data_by_reference_id(reference_id=request_data.reference_id,
hierarchy=request_data.hierarchy, hierarchy=request_data.hierarchy,
project_id=request_data.project_id) project_id=request_data.project_id)
request_data.total_units, request_data.reject_units = self.get_data_for_tags(input_data=request_data)
redis_key = f"{request_data.project_id}${request_data.reference_id}" redis_key = f"{request_data.project_id}${request_data.reference_id}"
if not record_presence: if not record_presence:
if not request_data.prod_start_time: if not request_data.prod_start_time:
request_data.prod_start_time = datetime.now().astimezone( request_data.prod_start_time = datetime.now().astimezone(
tz=pytz.timezone(request_data.tz)).isoformat() tz=pytz.timezone(request_data.tz)).isoformat()
else:
request_data.prod_start_time = datetime.strptime(request_data.prod_start_time,
CommonConstants.USER_META_TIME_FORMAT).astimezone(
tz=pytz.timezone(request_data.tz)).isoformat()
if request_data.prod_end_time:
request_data.prod_end_time = datetime.strptime(request_data.prod_end_time,
CommonConstants.USER_META_TIME_FORMAT).astimezone(
tz=pytz.timezone(request_data.tz)).isoformat()
request_data = OEEDataSaveRequest(**request_data.dict(exclude_none=True)) request_data = OEEDataSaveRequest(**request_data.dict(exclude_none=True))
request_data.downtime = self.common_util.get_downtime_details_by_hierarchy( request_data.downtime = self.common_util.get_downtime_details_by_hierarchy(
hierarchy=request_data.hierarchy, project_id=request_data.project_id) hierarchy=request_data.hierarchy, project_id=request_data.project_id)
...@@ -95,3 +113,45 @@ class CalculateBatchOEEHandler: ...@@ -95,3 +113,45 @@ class CalculateBatchOEEHandler:
return True return True
except Exception as e: except Exception as e:
raise e raise e
def get_data_for_tags(self, input_data: OEEDataInsertRequest):
total_units_value = 0
reject_units_value = 0
try:
start_epoch = int(
datetime.strptime(input_data.prod_start_time, CommonConstants.USER_META_TIME_FORMAT).astimezone(
tz=pytz.timezone(input_data.tz)).timestamp()) * 1000
end_epoch = int(
datetime.strptime(input_data.prod_end_time, CommonConstants.USER_META_TIME_FORMAT).astimezone(
tz=pytz.timezone(input_data.tz)).timestamp()) * 1000
# hierarchy_tags = self.tag_hierarchy_handler.get_tags_list_by_hierarchy(GetTagsLists(**input_data.dict()))
hierarchy_tags = {TagCategoryConstants.TOTAL_UNITS_CATEGORY: "site_114$line_1306$equipment_5812$tag_100",
TagCategoryConstants.REJECT_UNITS_CATEGORY: "site_114$line_1306$equipment_5812$tag_60538"}
total_units_tag_id = self.oee_tag_finder.get_total_units_tag_id(input_data=hierarchy_tags)
reject_units_tag_id = self.oee_tag_finder.get_reject_units_tag_id(input_data=hierarchy_tags)
kairos_util = KairosQuery(url=DBConf.KAIROS_URL)
data = kairos_util.query(
self.base_query.form_generic_query(tags_list=[total_units_tag_id, reject_units_tag_id],
project_id=input_data.project_id,
start_epoch=start_epoch, end_epoch=end_epoch))
master_df = pd.DataFrame()
data = [data] if not isinstance(data, list) else data
for each_data in data:
master_df = create_kairos_df(
master_df=master_df,
response_data=each_data,
tags_list=[total_units_tag_id, reject_units_tag_id],
group_by_tags=[total_units_tag_id, reject_units_tag_id, DBConf.KAIROS_DEFAULT_FULL_TAG],
tz=input_data.tz
)
if master_df.empty:
raise DataNotFound
master_df_columns = list(master_df.columns)
if f'{total_units_tag_id}_diff' not in master_df_columns:
return total_units_value, reject_units_value
total_units_value = master_df[f'{total_units_tag_id}_diff'].sum()
if f'{reject_units_tag_id}_diff' in master_df_columns:
reject_units_value = master_df[f'{reject_units_tag_id}_diff'].sum()
return total_units_value, reject_units_value
except Exception as e:
raise
...@@ -12,8 +12,7 @@ class OEEDiscreteTable(Base): ...@@ -12,8 +12,7 @@ class OEEDiscreteTable(Base):
reference_id = Column(String, nullable=True, unique=True) reference_id = Column(String, nullable=True, unique=True)
prod_start_time = Column(TIMESTAMP(timezone=True), nullable=False) prod_start_time = Column(TIMESTAMP(timezone=True), nullable=False)
prod_end_time = Column(TIMESTAMP(timezone=True), nullable=True) prod_end_time = Column(TIMESTAMP(timezone=True), nullable=True)
total_downtime = Column(Float, default=0) downtime = Column(Float, default=0)
planned_units = Column(Float, nullable=False)
total_units = Column(Float) total_units = Column(Float)
reject_units = Column(Float, default=0) reject_units = Column(Float, default=0)
cycle_time = Column(Float) cycle_time = Column(Float)
......
...@@ -2,7 +2,6 @@ from typing import Optional, Union, List ...@@ -2,7 +2,6 @@ from typing import Optional, Union, List
from pydantic import BaseModel, validator from pydantic import BaseModel, validator
from scripts.utils.common_utils import CommonUtils from scripts.utils.common_utils import CommonUtils
common_utils = CommonUtils() common_utils = CommonUtils()
...@@ -101,7 +100,7 @@ class OEEDataInsertRequest(BaseModel): ...@@ -101,7 +100,7 @@ class OEEDataInsertRequest(BaseModel):
prod_status: Optional[str] = "running" prod_status: Optional[str] = "running"
downtime: Optional[Union[float, int]] downtime: Optional[Union[float, int]]
hierarchy: str hierarchy: str
reference_id: str reference_id: Optional[str]
setup_time: Optional[Union[float, int]] setup_time: Optional[Union[float, int]]
cycle_time: Optional[Union[float, int]] cycle_time: Optional[Union[float, int]]
total_units: Optional[Union[float, int]] total_units: Optional[Union[float, int]]
...@@ -143,6 +142,7 @@ class OEEDataInsertRequest(BaseModel): ...@@ -143,6 +142,7 @@ class OEEDataInsertRequest(BaseModel):
class OEEDataSaveRequest(BaseModel): class OEEDataSaveRequest(BaseModel):
prod_start_time: str prod_start_time: str
prod_end_time: str prod_end_time: str
prod_status: Optional[str] = "running"
downtime: Optional[Union[float, int]] = 0 downtime: Optional[Union[float, int]] = 0
hierarchy: Optional[str] hierarchy: Optional[str]
reference_id: Optional[str] reference_id: Optional[str]
...@@ -152,38 +152,11 @@ class OEEDataSaveRequest(BaseModel): ...@@ -152,38 +152,11 @@ class OEEDataSaveRequest(BaseModel):
reject_units: Optional[Union[float, int]] = 0 reject_units: Optional[Union[float, int]] = 0
uom: Optional[str] = "mins" uom: Optional[str] = "mins"
tz: Optional[str] = 'Asia/Kolkata' tz: Optional[str] = 'Asia/Kolkata'
trigger_by: Optional[str]
project_id: str project_id: str
class Config:
schema_extra = {
"example": {
"hierarchy": "site_100$dept_100$line_100$equipment_100",
"prod_start_time": "2022-04-22 19:49:00",
"prod_end_time": "2022-04-22 19:49:00",
"tz": "Asia/Kolkata",
"project_id": "project_099",
"reference_id": "reference_id",
"downtime": "",
"setup_time": "",
"cycle_time": "",
"total_units": "",
"reject_units": "",
"uom": "'"
}
}
# @validator('prod_start_time')
# def date_format_validator_start_date(cls, v):
# common_utils.check_date_format(v, "%Y-%m-%d %H:%M:%S")
# return v
#
# @validator('prod_end_time')
# def date_format_validator_end_date(cls, v):
# common_utils.check_date_format(v, "%Y-%m-%d %H:%M:%S")
# return v
class BatchOEEData(OEEDataInsertRequest): class BatchOEEData(OEEDataSaveRequest):
calculated_on: str calculated_on: str
productive_time: float productive_time: float
availability: float availability: float
......
...@@ -39,7 +39,7 @@ class CommonUtils: ...@@ -39,7 +39,7 @@ class CommonUtils:
diff = to_time - from_time diff = to_time - from_time
if difference: if difference:
return diff return diff
return f"{int(diff.in_hours())} hours {int(diff.minutes)} minutes" return f"{int(diff.in_hours())} hours {int(diff.in_hours())} minutes"
except Exception as e: except Exception as e:
logger.exception(f"Exception in getting data: {e}") logger.exception(f"Exception in getting data: {e}")
raise raise
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment