Изменен ИС ЖКХ РС

This commit is contained in:
Gitea
2022-06-02 17:35:32 +09:00
parent c93a73cd52
commit 21e5ad26f2
14 changed files with 220 additions and 74 deletions

48
isjkhrs/crud.py Normal file
View File

@ -0,0 +1,48 @@
from sqlalchemy.orm import Session
from sqlalchemy import text
from isjkhrs.database import get_table
from isjkhrs import schemas
def exec_procedure(session, proc_name, params, database: str = None):
sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}"
for name, value in params.items()])
dbstr = ""
if database:
dbstr = f"[{database}]."
sql_string = """
DECLARE @return_value int;
EXEC @return_value = {dbstr}[dbo].[{proc_name}] {params};
SELECT 'Return Value' = @return_value;
""".format(dbstr=dbstr, proc_name=proc_name, params=sql_params)
data = session.execute(sql_string).fetchall()
session.commit()
session.expire_all()
return data
def exec_procedure_wo_result(session, proc_name, params, database: str = None):
sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}"
for name, value in params.items()])
dbstr = ""
if database:
dbstr = f"[{database}]."
sql_string = """
EXEC {dbstr}[dbo].[{proc_name}] {params}
""".format(dbstr=dbstr, proc_name=proc_name, params=sql_params)
session.execute(sql_string)
session.commit()
class FilterViewSet:
"""get"""
"""post"""
def get_filter_types(db: Session, data: schemas.FilterTypeInit):
return exec_procedure(db, 'uspGetFilterTypes', data.dict(), 'ISJKHRSTO')
def get_filter_list(db: Session, data: schemas.FilterListInit):
return exec_procedure(db, 'uspGetFilterList', data.dict(), 'ISJKHRSTO')
def set_filter_list(db: Session, data: schemas.FilterSetInit):
return exec_procedure_wo_result(db, 'uspSetFilterList', data.dict(), 'ISJKHRSTO')

61
isjkhrs/database.py Normal file
View File

@ -0,0 +1,61 @@
from sqlalchemy import create_engine, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from typing import Optional, Dict
from dataclasses import dataclass
import json
@dataclass
class Database:
engine: str
name: str
host: str
user: str
password: str
options: Optional[Dict] = None
def get_url(self):
option_str = ""
if self.options:
opt = [name+'='+'+'.join(value.split())
for name, value in self.options.items()]
option_str = "?"+"&".join(opt)
return f"{self.engine}://{self.user}:{self.password}@{self.host}/{self.name}{option_str}"
data = {}
with open('settings', 'r') as settings:
data_str = settings.read()
data = json.loads(data_str)
db = Database(**data.get('database'))
SQL_ALCHEMY_DATABASE_URL_MSSQL = db.get_url()
engine = create_engine(
SQL_ALCHEMY_DATABASE_URL_MSSQL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
def get_table(tablename: str, dbname: str = None) -> Table:
metadata = Base.metadata
metadata.reflect(bind=engine)
if dbname == None:
dbname = db.name
return Table(tablename, metadata, schema=dbname+'.dbo', autoload=True, autoload_with=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()

13
isjkhrs/isapi.py Normal file
View File

@ -0,0 +1,13 @@
from fastapi import APIRouter, Depends
from auth import oauth2
from auth.login.schemas import login as schemas
from isjkhrs import ismain
router = APIRouter()
router.include_router(
router=ismain.router,
prefix="",
responses={404: {"description": "IS is Not found"}}
)

View File

@ -1,11 +1,28 @@
from infosys.routers import general
from isjkhrs.routers import general, isjkhrsto
from fastapi import APIRouter, Depends
from auth import oauth2
from auth.login.schemas import login as schemas
router = APIRouter()
router.include_router(
router=general.router,
prefix="",
responses={404: {"description": "info is not found"}}
)
def exec_procedure(session, proc_name, params, database: str = None):
sql_params = ""
if params:
sql_params = ",".join([f"@{name}='{value}'" if type(value) in [str] else f"@{name}={value}"
for name, value in params.items()])
dbstr = ""
if database:
dbstr = f"[{database}]."
sql_string = """
DECLARE @return_value int;
EXEC @return_value = {dbstr}[dbo].[{proc_name}] {params};
SELECT 'Return Value' = @return_value;
""".format(dbstr=dbstr, proc_name=proc_name, params=sql_params)
print(sql_string)
data = session.execute(sql_string).fetchall()
session.commit()
session.expire_all()
return data
router.include_router(general.router, prefix="", tags=["is"])
router.include_router(isjkhrsto.router, prefix="/filter", tags=["FilterViewSet"])

View File

@ -27,17 +27,4 @@ async def get_address(city_id: int, db= Depends(general.get_db)):
@router.get('/getRegions')
async def get_region(db = Depends(general.get_db)):
return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall()
@router.post('/get_filter_types', response_model=List[schemas.FilterTypeSerializer])
async def get_filter_types(request: schemas.FilterTypeInit, db: Session = Depends(general.get_db)):
return db.FilterViewSet.get_filter_types(db, request)
@router.post('/get_filter_list', response_model=List[schemas.FilterListSerializer])
async def get_filter_list(request: schemas.FilterListInit, db: Session = Depends(general.get_db)):
return crud.FilterViewSet.get_filter_list(db, request)
@router.post('/set_report_filter_list', response_model=List[schemas.FilterListSerializer])
async def set_report_filter_list(request: schemas.FilterSetInit, db: Session = Depends(general.get_db)):
return crud.FilterViewSet.set_filter_list(db, request)
return db.execute("SELECT id, name FROM General.dbo.vRegions").fetchall()

View File

@ -1,14 +1,12 @@
import kv.schemas as schemas
import kv.crud as crud
from kv.database import get_db
from sqlalchemy.orm import Session
from fastapi import APIRouter, Depends
from kv.database import get_db
import isjkhrs.crud as crud
from sqlalchemy.orm import Session
from typing import List
import isjkhrs.schemas as schemas
router = APIRouter()
"""post"""
@router.post('/get_filter_types', response_model=List[schemas.FilterTypeSerializer])
async def get_filter_types(request: schemas.FilterTypeInit, db: Session = Depends(get_db)):
return crud.FilterViewSet.get_filter_types(db, request)
@ -21,4 +19,4 @@ async def get_filter_list(request: schemas.FilterListInit, db: Session = Depends
@router.post('/set_report_filter_list', response_model=List[schemas.FilterListSerializer])
async def set_report_filter_list(request: schemas.FilterSetInit, db: Session = Depends(get_db)):
return crud.FilterViewSet.set_filter_list(db, request)
return crud.FilterViewSet.set_filter_list(db, request)

32
isjkhrs/schemas.py Normal file
View File

@ -0,0 +1,32 @@
from decimal import Decimal
from pydantic import BaseModel
from typing import Optional, List
from datetime import date, datetime
class FilterTypeInit(BaseModel):
IDUser: int
GetType: int
NeedClear: bool
class FilterListInit(BaseModel):
IDUser: int = 1
IDFilterType: int
class FilterSetInit(FilterListInit):
IDFilterObject: int
NeedClear: bool
class FilterTypeSerializer(BaseModel):
ID: int
Name: Optional[str] = None
IDParent: int = None
OrderField: int
class FilterListSerializer(BaseModel):
ID: int
Name: Optional[str] = None
IsChecked: bool

Binary file not shown.

View File

@ -208,7 +208,7 @@ class PaymentViewSet:
def save_receipt(db: Session, data: schemas.ReceiptSaveInit = None):
try:
exec_procedure_wo_result(db, 'uspSaveReceipt', **data)
exec_procedure_wo_result(db, 'uspSaveReceipt', data.dict())
return {'msg': 'success'}
except:
return {'msg': 'error'}
@ -232,24 +232,6 @@ class ReportViewSet:
return exec_procedure(db, 'uspGetRentRegisterNotices', **data)
"""ReportFilterViewSet"""
class FilterViewSet:
"""get"""
"""post"""
def get_filter_types(db: Session, data: schemas.FilterTypeInit):
return exec_procedure(db, 'uspGetFilterTypes', data.dict())
def get_filter_list(db: Session, data: schemas.FilterListInit):
return exec_procedure(db, 'uspGetFilterList', data.dict())
def set_filter_list(db: Session, data: schemas.FilterSetInit):
return exec_procedure_wo_result(db, 'uspSetFilterList', data.dict())
"""AccrualViewSet"""
@ -279,6 +261,9 @@ class RecalculationViewSet:
def get_withdrawing_temp(db: Session, data: schemas.WithdrawingTempInit):
return exec_procedure(db, 'uspGetWithdrawingTemp', **data)
def get_accruals_can_be_recalculated(db: Session, data: schemas.AccrualsCanBeRecalculatedInit):
return exec_procedure(db, 'uspGetAccrualsCanBeRecalculated', data.dict())
def save_withdrawing(db: Session, data: schemas.WithdrawingSave = None):
try:
exec_procedure_wo_result(db, 'uspSaveWithdrawing', **data)

View File

@ -1,6 +1,6 @@
from fastapi import Depends, APIRouter
from requests import Session
from kv.routers import address, objectvs, payment, personalaccount, reference, report, accrual, filter, turnover, recalculation
from kv.routers import address, objectvs, payment, personalaccount, reference, report, accrual, turnover, recalculation
from kv.database import get_db, get_table
from typing import List
from kv import schemas
@ -47,8 +47,6 @@ router.include_router(reference.router, prefix="/reference", tags=["ReferenceVie
router.include_router(report.router, prefix="/report", tags=["ReportViewSet"])
router.include_router(filter.router, prefix="/filter", tags=["FilterViewSet"])
router.include_router(turnover.router, prefix="/turnover", tags=["TurnOverViewSet"])
router.include_router(recalculation.router, prefix="/recalculation", tags=["RecalculationViewSet"])

View File

@ -27,6 +27,10 @@ async def set_report_filter_list(request: schemas.WithdrawingCheckInit, db: Sess
async def get_withdrawing_temp(request: schemas.WithdrawingTempInit, db: Session = Depends(get_db)):
return crud.RecalculationViewSet.get_withdrawing_temp(db, request)
@router.post('/get_accruals_can_be_recalculated', response_model=List[schemas.AccrualsCanBeRecalculatedSerializer])
async def get_accruals_can_be_recalculated(request: schemas.AccrualsCanBeRecalculatedInit, db: Session = Depends(get_db)):
return crud.RecalculationViewSet.get_accruals_can_be_recalculated(db, request)
@router.post('/save_withdrawing')
async def save_withdrawing(request: schemas.WithdrawingSave, db: Session = Depends(get_db)):

View File

@ -1,4 +1,6 @@
from decimal import Decimal
from unicodedata import decimal
from numpy import datetime_as_string
from pydantic import BaseModel
from typing import Optional, List
from datetime import date, datetime
@ -48,19 +50,6 @@ class AdvancedSearchInit(AccountInit, CityInit):
Patronymic: Optional[str] = None
class FilterTypeInit(BaseModel):
IDUser: int
GetType: int
NeedClear: bool
class FilterListInit(BaseModel):
IDUser: int = 1
IDFilterType: int
class FilterSetInit(FilterListInit):
IDFilterObject: int
class WithdrawingCheckSerializer(BaseModel):
@ -136,6 +125,12 @@ class WithdrawingTempInit(CashboxInit, GetTypeInit):
class WithdrawingCheckInit(PersonalAccountInit, GetTypeInit, DateInit):
pass
class AccrualsCanBeRecalculatedInit(BaseModel):
IDPersonalAccount: int
DateBegin: str
DateEnd: str
class WithdrawingSave(PersonalAccountInit, WithdrawingCheckSerializer, DateInit):
IDWithdrawingType: int
@ -161,12 +156,18 @@ class RecieptCalculateInit(PersonalAccountInit):
AmountFine: float
class ReceiptSaveInit(RecieptCalculateInit):
class ReceiptSaveInit(BaseModel):
IDUser: int
IDCashbox: int
IDType: int
IDPersonalAccount: int
IDDebtContract: int
IDService: int
DateBegin: date
DateEnd: date
IDMoneyType: int
Amount: float
AmountFine: float
Note: Optional[str] = None
@ -205,7 +206,7 @@ class MeteringDeviceTypeSerializer(BaseModel):
class PersonalAccountSerializer(BaseModel):
IDAddress: int
IDTenants: int
IDTenants: int = None
IDWorker: Optional[int] = None
Address: Optional[str] = None
ObjectStreetName: Optional[str] = None
@ -277,7 +278,7 @@ class EditPersonalAccountAddressInit(BaseModel):
class AddressDetailInfoSerializer(BaseModel):
IDAddress: int
CadastralNumber: Optional[str] = None
Privatization: bool
Privatization: float
Area: float
AreaOwned: float
AreaAdditional: float
@ -449,9 +450,9 @@ class PersonalAccountTOServicesSerializer(BaseModel):
DateEnd: Optional[str] = None
Spor: int
Por: int
IDTariffPopulation: int
Tariff: float
TariffProvider: float
IDTariffPopulation: int = None
Tariff: float = None
TariffProvider: float = None
StandartVolume: float = None
Volume: float
AmountSaldo: float
@ -618,14 +619,16 @@ class WithdrawingTypesSerializer(BaseModel):
class WithdrawingTempSerializer(BaseModel):
IDService: int
ServiceName: Optional[str] = None
Amount: float
class AccrualsCanBeRecalculatedSerializer(BaseModel):
id: int
IDService: int
ServiceName: Optional[str] = None
Por: int
AmountAccrued: float
Amount: float
class ObjectDetailsSerializer(BaseModel):
IDObject: str
IDFias: Optional[str] = None

View File

@ -5,7 +5,7 @@ from fastapi.middleware.cors import CORSMiddleware
from kv import kv
from auth import auth
from kassa import kassa
from infosys import ismain
from isjkhrs import isapi
import uvicorn
middleware = [Middleware(
@ -39,7 +39,7 @@ app.include_router(
app.include_router(
router=ismain.router,
router=isapi.router,
prefix='/is',
tags=['Информационная система'],
responses={404: {"description": "Not found"}}