diff --git a/app/config/__init__.py b/app/config/__init__.py index 9855258..9c4b7a8 100644 --- a/app/config/__init__.py +++ b/app/config/__init__.py @@ -10,6 +10,7 @@ class TaskEnv: CLN_MONITOR_PYSICAL = 'monitor_physical' CLN_MONITOR_RIAL = 'monitor_rial' CLN_MONITOR_SECONDARY = 'monitor_secondary' + CLN_MONITOR_SUB_SECONDARY = 'monitor_sub_secondary' CLN_FINANCIAL_PRE_PAYMENT = 'financial_pre_payment' CLN_FINANCIAL_STATUS = 'financial_status' CLN_FINANCIAL_ADJUST = 'financial_adjust' diff --git a/app/models/monitor_physical_secondary_progress.py b/app/models/monitor_physical_secondary_progress.py index 43a7506..f42f5f7 100644 --- a/app/models/monitor_physical_secondary_progress.py +++ b/app/models/monitor_physical_secondary_progress.py @@ -2,6 +2,7 @@ import uuid from datetime import datetime from typing import Optional, Literal +import pydantic from pydantic import Field from core.models.base import BaseModel @@ -10,17 +11,28 @@ from core.models.base import BaseModel class SecondaryProgressModel(BaseModel): id: Optional[uuid.UUID] = Field(alias='_id') project_id: Optional[uuid.UUID] = Field(description="کد شناسایی پروژه در این فیلد قرار می گیرد") - title:Optional[str] = Field(description='عنوان در این فیلد قرار میگیرد') - weight:Optional[int]=Field(description='وزن در این فیلد قرار می گیرد') + title: Optional[str] = Field(description='عنوان در این فیلد قرار میگیرد') + weight: Optional[int] = Field(description='وزن در این فیلد قرار می گیرد') + + +class SubSecondaryProgressModel(BaseModel): + id: Optional[uuid.UUID] = Field(alias='_id') + parent_id: Optional[uuid.UUID] = Field(description="کد شناسایی پیشرفت های فیزیکی فرعی در این فیلد قرار می گیرد") program: Optional[int] = Field(description=" برنامه ای") real: Optional[int] = Field(description=" واقعی") - deviation:Optional[int] = Field(description="انحراف از برنامه") - date_at:Optional[datetime] = Field(description="تاریخ گزارش پیشرفت") - last_month:Optional[int] = Field(description='واقعی ماه اخیر') - collection:Optional[Literal['all','work','various','secondary_building','block']] = Field(description=""" + deviation: Optional[int] = Field(description="انحراف از برنامه") + date_at: Optional[datetime] = Field(description="تاریخ گزارش پیشرفت") + last_month: Optional[int] = Field(description='واقعی ماه اخیر') + collection: Optional[Literal['all', 'work', 'various', 'secondary_building', 'block']] = Field(description=""" all: کلی work: پیشرفت جبهه های کاری various: پیشرفت رشته های مختلف secondary_building: پیشرفت ساختمان های جنبی block: پیشرفت بلوک ها """) + +class LastRecord(pydantic.BaseModel): + parent_id:Optional[uuid.UUID] = Field(description="کد شناسایی پدر در این فیلد قرار می گیرد") + date_at:Optional[datetime] = Field(description='تاریخ وارد شده') + + diff --git a/app/repositories/monitor_physical_secondary_progress.py b/app/repositories/monitor_physical_secondary_progress.py index 0462a68..db50729 100644 --- a/app/repositories/monitor_physical_secondary_progress.py +++ b/app/repositories/monitor_physical_secondary_progress.py @@ -1,7 +1,9 @@ +import datetime import uuid from app.config import TaskEnv -from app.models.monitor_physical_secondary_progress import SecondaryProgressModel +from app.models.monitor_physical_secondary_progress import SecondaryProgressModel, SubSecondaryProgressModel, LastRecord +from app.repositories.monitor_physical_progress import PhysicalProgressRepository from core.repositories.base import BaseRepository from core.service.mongo_db import use_collection @@ -9,8 +11,40 @@ class SecondaryProgressRepository(BaseRepository): def __init__(self): super().__init__(collection=TaskEnv.CLN_MONITOR_SECONDARY, model=SecondaryProgressModel) - async def last_record(self,project_id:uuid.UUID): - last = await use_collection(TaskEnv.CLN_MONITOR_SECONDARY).find({'project_id':project_id}).sort("$natural", -1).to_list(None) + async def get_list(self,project_id:uuid.UUID): + get_list = await use_collection(TaskEnv.CLN_MONITOR_SECONDARY).find({'project_id':project_id}).to_list(None) + ids = [i["_id"] for i in get_list] + get_subs = await use_collection(TaskEnv.CLN_MONITOR_SUB_SECONDARY).aggregate([ + {"$match":{'parent_id':{"$in":ids}}}, + {"$group":{"_id":"$parent_id",'subs': {"$push": "$$ROOT"}}} + ]).to_list(None) + for i in get_list: + for j in get_subs: + if i["_id"] == j["_id"]: + i['subs'] = j["subs"] + return get_list + + + + +class SubSecondaryProgressRepository(BaseRepository): + def __init__(self): + super().__init__(collection=TaskEnv.CLN_MONITOR_SUB_SECONDARY, model=SubSecondaryProgressModel) + + async def get_list_by_parent_id(self,parent_id:uuid.UUID): + get_subs = await use_collection(TaskEnv.CLN_MONITOR_SUB_SECONDARY).find({"parent_id":parent_id}).to_list(None) + return get_subs + + + async def last_record(self, _inp: LastRecord): + m_first = _inp.date_at - datetime.timedelta(days=35) + print(m_first) + m_end = _inp.date_at - datetime.timedelta(days=25) + print(m_end) + last = await use_collection(TaskEnv.CLN_MONITOR_SUB_SECONDARY).find({ + 'parent_id': _inp.parent_id, + 'date_at': {'$gte': m_first, '$lte': m_end} + }).sort("$natural", -1).to_list(None) if last: return last[0] else: diff --git a/app/urls/monitor_secondary.py b/app/urls/monitor_secondary.py index 6578f2f..9fef42d 100644 --- a/app/urls/monitor_secondary.py +++ b/app/urls/monitor_secondary.py @@ -2,26 +2,62 @@ from uuid import UUID from fastapi import Body -from app.models.monitor_physical_secondary_progress import SecondaryProgressModel -from app.repositories.monitor_physical_secondary_progress import SecondaryProgressRepository +from app.models.monitor_physical_secondary_progress import SecondaryProgressModel, SubSecondaryProgressModel, LastRecord +from app.repositories.monitor_physical_secondary_progress import SecondaryProgressRepository, \ + SubSecondaryProgressRepository from core.app import app from core.utils.router import generate_router, shrink from core.utils.table_engine import TableEngineExport, TableEngineRequestType ThisModel = SecondaryProgressModel +ThisSubModel = SubSecondaryProgressModel router_base_url = 'monitor-secondary' _tag_base = [router_base_url] router = generate_router(router_base_url, auth_dependencies=False, version='v2') repo = SecondaryProgressRepository() +repo_sub = SubSecondaryProgressRepository() + +@router.post('/sub/create', response_model=ThisSubModel, tags=_tag_base, description='ایجاد زیر مجموعه پیشرفت فیزیکی فرعی') +@shrink(repo_sub.create) +def create_sub(coding: ThisSubModel = Body(...)): + pass + +@router.get('/sub/list/{parent_id}', response_model=list[ThisSubModel], tags=_tag_base, description='گرفتن زیر مجموعه پیشرفت فیزیکی فرعی') +@shrink(repo_sub.get_list_by_parent_id) +def get_list_by_parent_id(parent_id: UUID): + pass + +@router.post('/sub/last', response_model=ThisSubModel, tags=_tag_base, description='گرفتن زیر مجموعه پیشرفت فیزیکی فرعی') +@shrink(repo_sub.last_record) +def last_record(last:LastRecord): + pass +@router.put('/sub/{_id}', response_model=ThisSubModel, tags=_tag_base, description='ویرایش زیر مجموعه پیشرفت فیزیکی فرعی') +@shrink(repo_sub.update) +def update_sub(_id: UUID, coding: ThisSubModel = Body(...)): + pass + +@router.get('/sub/{_id}', response_model=ThisSubModel, tags=_tag_base, description='گرفتن زیر مجموعه پیشرفت فیزیکی فرعی') +@shrink(repo_sub.get) +def get_sub(_id: UUID): + pass + +@router.delete('/sub/{_id}', response_model=ThisSubModel, tags=_tag_base) +@shrink(repo_sub.delete) +def delete_sub(_id: UUID): + pass +@router.post('/sub', response_model=TableEngineExport[ThisSubModel], tags=_tag_base, description='زیر مجموعه پیشرفت فیزیکی فرعی') +@shrink(repo_sub.fetch) +def fetch_sub(body: TableEngineRequestType = Body(...)): + pass @router.post('/create', response_model=ThisModel, tags=_tag_base, description='پیشرفت فیزیکی فرعی') @shrink(repo.create) def create(coding: ThisModel = Body(...)): pass -@router.post('/last/{project_id}', response_model=ThisModel, tags=_tag_base, description='پیشرفت فیزیکی فرعی') -@shrink(repo.last_record) -def last_record(project_id:UUID): +@router.get('/list/{_id}', response_model=ThisModel, tags=_tag_base, description='پیشرفت فیزیکی فرعی') +@shrink(repo.get_list) +def get_list(_id: UUID): pass @router.put('/{_id}', response_model=ThisModel, tags=_tag_base, description='پیشرفت فیزیکی فرعی')