import datetime from dateutil.relativedelta import relativedelta from sqlalchemy import Column, Integer, String, Numeric, Date, UniqueConstraint from commons.models.mixin.base import BaseModelMixin from commons.models.model import Model from core.extensions import db class DataFujian(db.Model, Model, BaseModelMixin): __tablename__ = 'DATA_FUJIAN' id = Column('ID', Integer, primary_key=True) number = Column('NUMBER', String(128), default='', comment='编码') name = Column('NAME', String(128), default='', comment='名称') spec = Column('SPEC', String(128), default='', comment='规格') unit = Column('UNIT', String(128), default='', comment='单位') price_without_tax = Column('PRICE_WITHOUT_TAX', Numeric(16, 4), default=0, comment='除价格') price = Column('PRICE', Numeric(16, 4), default=0, comment='含税价') category = Column('CATEGORY', String(128), default='', comment='分类') year = Column('YEAR', Integer, default=0, comment='年份') month = Column('MONTH', Integer, default=0, comment='月份') city = Column('CITY', String(128), default='', comment='地市') date = Column('DATE', Date, comment='日期') __table_args__ = ( UniqueConstraint(year, month, city, name, spec, name='Idx_key'), {'comment': '福建数据'}, ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) def find_by_key(self): query = DataFujian.query query = query.filter(DataFujian.year == self.year) query = query.filter(DataFujian.month == self.month) query = query.filter(DataFujian.city == self.city) query = query.filter(DataFujian.name == self.name) query = query.filter(DataFujian.spec == self.spec) result = query.one_or_none() return result @classmethod def get_query(cls, year=None, month=None, name=None, spec=None, name_in=None, region='福州', number=None): query = cls.query if year and month: start_date = datetime.date(year, month, 1) end_date = start_date + relativedelta(months=1) query = query.filter(cls.date >= start_date) query = query.filter(cls.date < end_date) if number: query = query.filter(cls.number == number) if name: query = query.filter(cls.name == name) if name_in: query = query.filter(cls.name.in_(name_in)) if spec: query = query.filter(cls.spec.like(f'%{spec}%')) if region: query = query.filter(cls.city.like(f'%{region}%')) return query