From 23b91330e1f3e5d3b27e778ec1bbf43c25b291fb Mon Sep 17 00:00:00 2001 From: shahzeydyfah Date: Thu, 3 Oct 2024 23:14:13 +0330 Subject: [PATCH] feat:add report --- app/models/project.py | 2 +- app/models/report.py | 6 +- app/repositories/report.py | 122 +++++++++++++++++++++++++++++++++---- app/urls/report.py | 12 +++- 4 files changed, 127 insertions(+), 15 deletions(-) diff --git a/app/models/project.py b/app/models/project.py index 0f00ee1..d356d3e 100644 --- a/app/models/project.py +++ b/app/models/project.py @@ -100,7 +100,7 @@ class Design(pydantic.BaseModel): date_send: datetime.datetime = Field(description='تاریخ ابالغ/ارجاع') letter: str = Field(description='شماره نامه') land_area:Optional[str] = Field(description="مساحت زمین") - building_infrastructure:Optional[str] = Field(description="زیربنای ساختمان") + building_infrastructure:Optional[int] = Field(description="زیربنای ساختمان") site_area:Optional[str] = Field(description="مساحت محوطه") designer:Optional[List[str]] = Field(description="نام طراح") status_agreement:Optional[str] = Field(description="وضعیت موافقتنامه") diff --git a/app/models/report.py b/app/models/report.py index d51773d..6bb3bd5 100644 --- a/app/models/report.py +++ b/app/models/report.py @@ -11,4 +11,8 @@ class ReportCountry(pydantic.BaseModel): type_id: int = Field(description='کد شناسایی نوع پروژه در این فیلد قرار می گیرد') nature_id: int = Field(description='کد شناسایی ماهبت در این فیلد قرار می گیرد') state: Optional[str] - monitor_type: Optional[int] \ No newline at end of file + monitor_type: Optional[int] + +class DonutList(pydantic.BaseModel): + type: int = Field(description='مقدار وارد شده در گزارش قبل') + donut_select: str = Field(description='آیتم دونات انتخاب شده') \ No newline at end of file diff --git a/app/repositories/report.py b/app/repositories/report.py index 747c18b..78621ee 100644 --- a/app/repositories/report.py +++ b/app/repositories/report.py @@ -1,7 +1,7 @@ import uuid from app.config import TaskEnv -from app.models.report import StatusReport, ReportCountry +from app.models.report import StatusReport, ReportCountry, DonutList from core.service.mongo_db import use_collection @@ -33,17 +33,42 @@ class ReportRepository(): async def report_country(self ,_inp: ReportCountry): + match = {} if _inp.state: - count_nature = await use_collection(TaskEnv.CLN_PROJECT).count_documents( - {'design.nature_id':_inp.nature_id,'design.state':_inp.state}) - count_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'design.type_id': _inp.type_id,'design.state':_inp.state}) - count_monitor_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'monitor.base_information.type': _inp.monitor_type,'design.state':_inp.state}) - else: - count_nature = await use_collection(TaskEnv.CLN_PROJECT).count_documents( - {'design.nature_id': _inp.nature_id}) - count_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'design.type_id':_inp.type_id}) - count_monitor_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'monitor.base_information.type': _inp.monitor_type}) - return {'count_nature':count_nature,'count_type':count_type,'count_monitor_type':count_monitor_type} + match = {'design.state':_inp.state} + if _inp.type_id: + match.update({'design.type_id': _inp.type_id}) + if _inp.nature_id: + match.update({'design.nature_id':_inp.nature_id}) + if _inp.monitor_type: + match.update({'monitor.base_information.type': _inp.monitor_type}) + + # count_nature = await use_collection(TaskEnv.CLN_PROJECT).count_documents( + # {'design.nature_id':_inp.nature_id,'design.state':_inp.state}) + # count_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'design.type_id': _inp.type_id,'design.state':_inp.state}) + # count_monitor_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'monitor.base_information.type': _inp.monitor_type,'design.state':_inp.state}) + + report = await use_collection(TaskEnv.CLN_PROJECT).aggregate([ + {"$match":match}, + {'$group': { + '_id': "$design.state", + 'nature_id': {'$addToSet': '$design.nature_id'}, + 'type_id': {'$addToSet': '$design.type_id'}, + 'monitor_type': {'$addToSet': '$monitor.base_information.type'} + }}, + {'$project': { + 'count_nature_id': {"$size": "$nature_id"}, + 'count_type_id': {"$size": "$type_id"}, + 'count_monitor_type': {"$size": "$monitor_type"}, + "_id": 1 + }} + ]).to_list(None) + # count_nature = await use_collection(TaskEnv.CLN_PROJECT).count_documents( + # {'design.nature_id': _inp.nature_id}) + # count_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'design.type_id':_inp.type_id}) + # count_monitor_type = await use_collection(TaskEnv.CLN_PROJECT).count_documents({'monitor.base_information.type': _inp.monitor_type}) + # return {'count_nature':count_nature,'count_type':count_type,'count_monitor_type':count_monitor_type} + return report async def exist_project_state(self): report = await use_collection(TaskEnv.CLN_PROJECT).aggregate([ @@ -55,4 +80,77 @@ class ReportRepository(): } ]).to_list(None) - return report \ No newline at end of file + return report + + async def donut(self,_select:int): + report = None + if _select == 1: + report = await use_collection(TaskEnv.CLN_PROJECT).aggregate([ + {"$group":{"_id":"$design.nature_id",'count':{'$sum':1}}} + ]).to_list(None) + elif _select == 2: + report = await use_collection(TaskEnv.CLN_PROJECT).aggregate([ + { + "$group": { + "_id": { + "$cond": [ + {"$lt": ["$design.building_infrastructure", 1000]}, # Check if a < 10 + "less_than_1000", + { + "$cond": [ + {"$and": [{"$gte": ["$design.building_infrastructure", 1000]}, {"$lt": ["$design.building_infrastructure", 5000]}]}, # Check if 10 <= a < 20 + "between_1000_and_5000", + { + "$cond": [ + {"$and": [{"$gte": ["$design.building_infrastructure", 5000]}, {"$lt": ["$design.building_infrastructure", 15000]}]}, + "between_5000_and_15000", + { + "$cond": [ + {"$and": [{"$gte": ["$design.building_infrastructure", 15000]}, {"$lt": ["$design.building_infrastructure", 30000]}]}, + "between_15000_and_30000", + "greater_than_or_equal_30000" # Otherwise, a >= 30 + ] + } + ] + } + ] + } + ] + }, + "total": {"$sum": 1}, + } + } + ]).to_list(None) + + elif _select == 3: + report = await use_collection(TaskEnv.CLN_PROJECT).aggregate([ + {"$group": {"_id": "$design.type_id", 'count': {'$sum': 1}}} + ]).to_list(None) + return report + + async def list_donut(self,_inp:DonutList): + _filter = {'design.nature_id':_inp.donut_select} + if _inp.type == 2: + if _inp.donut_select == "less_than_1000": + _filter = {'design.building_infrastructure': {'$lt': 1000}} + elif _inp.donut_select == "between_1000_and_5000": + _filter = {'design.building_infrastructure': {'$lt': 5000, "$gte": 1000 }} + elif _inp.donut_select == "between_5000_and_15000": + _filter = {'design.building_infrastructure': {'$lt': 15000, "$gte": 5000 }} + elif _inp.donut_select == "between_15000_and_30000": + _filter = {'design.building_infrastructure': {'$lt': 30000, "$gte": 15000 }} + else: + _filter = {'design.building_infrastructure': {'$gte': 30000}} + elif _inp.type == 3 : + _filter = {'design.type_id': _inp.donut_select} + report = await use_collection(TaskEnv.CLN_PROJECT).find(_filter).to_list(None) + + return report + + async def delay_donut(self): + ... + # await use_collection(TaskEnv.CLN_BILL_DELAY).aggregate([ + # {'$group':} + # ]) + + diff --git a/app/urls/report.py b/app/urls/report.py index 3ca909c..6775afb 100644 --- a/app/urls/report.py +++ b/app/urls/report.py @@ -1,4 +1,4 @@ -from app.models.report import StatusReport, ReportCountry +from app.models.report import StatusReport, ReportCountry, DonutList from app.repositories.report import ReportRepository from core.app import app from core.utils.router import generate_router, shrink @@ -28,4 +28,14 @@ def report_country(_inp: ReportCountry): def exist_project_state(): pass +@router.get('/donut/{_select}', tags=_tag_base) +@shrink(repo.donut) +def donut(_select:int): + pass + +@router.post('/list-donut', tags=_tag_base) +@shrink(repo.list_donut) +def list_donut(_inp: DonutList): + pass + app.include_router(router) \ No newline at end of file