import datetime from dateutil.relativedelta import relativedelta from sqlalchemy import Column, Integer, String, Date, UniqueConstraint, Numeric from commons.models.mixin.base import BaseModelMixin from commons.models.model import Model from core.extensions import db class FujianSurvey(db.Model, Model, BaseModelMixin): __tablename__ = 'FUJIAN_SURVEY' id = Column('ID', Integer, primary_key=True) name = Column('NAME', String(128), default='', comment='名称') spec = Column('SPEC', String(128), default='', comment='规格') price = Column('PRICE', Numeric(16, 4), default=0, comment='价格') date = Column('DATE', Date, comment='日期') material_id = Column('MATERIAL_ID', String(128), comment='材料id') unit = Column('UNIT', String(128), comment='单位') brand = Column('BRAND', String(128), comment='品牌') tax = Column('TAX', Integer, comment='税率') region = Column('REGION', String(128), comment='地区') __table_args__ = ( UniqueConstraint(name, spec, date, region, name='Idx_key'), {'comment': '福建省交通工程材料调查表'}, ) def find_by_key(self): query = FujianSurvey.query query = query.filter(FujianSurvey.name == self.name) query = query.filter(FujianSurvey.spec == self.spec) query = query.filter(FujianSurvey.region == self.region) query = query.filter(FujianSurvey.date == self.date) result = query.one_or_none() return result @classmethod def get_query(cls, year=None, month=None, name=None, spec=None, name_in=None, region='福州', material_id=None, material_id_in=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 name: query = query.filter(cls.name == name) if material_id: query = query.filter(cls.material_id == material_id) if name_in: query = query.filter(cls.name.in_(name_in)) if material_id_in: query = query.filter(cls.material_id.in_(material_id_in)) if spec: query = query.filter(cls.spec.like(f'%{spec}%')) if region: query = query.filter(cls.region.like(f'%{region}%')) return query