from sqlalchemy import Column, Integer, String, Numeric, Date, UniqueConstraint, func from commons.models.mixin.calculator import CalculatorMixin from core.extensions import db class Cement(db.Model, CalculatorMixin): __tablename__ = 'CEMENT' id = Column('ID', Integer, primary_key=True) name = Column('NAME', String(128), default='', comment='名称') spec = Column('SPEC', String(128), default='', comment='规格') pack = Column('PACK', String(64), default='', comment='包装') source = Column('SOURCE', String(64), default='', comment='产地') price = Column('PRICE', Numeric(16, 4), default=0, comment='价格') fluctuating = Column('FLUCTUATING', Numeric(16, 4), default=0, comment='浮动') date = Column('DATE', Date, comment='日期') __table_args__ = ( UniqueConstraint(name, spec, pack, source, date, name='Idx_key'), {'comment': '水泥'}, ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @classmethod def get_items(cls, year, month, spec_in, name_in, pack): query = cls.query query = cls.query_by_month(query, year, month) query = query.filter(cls.pack == pack) query = query.filter(cls.spec.in_(spec_in)) query = query.filter(cls.name.in_(name_in)) query = query.with_entities(func.avg(cls.price)) result = query.all() return result @classmethod def get_by_key(cls, name, spec, pack, source, date): query = cls.query query = query.filter( cls.name == name, cls.spec == spec, cls.pack == pack, cls.source == source, cls.date == date, ) return query.one_or_none() def upsert(self): result = self.get_by_key(self.name, self.spec, self.pack, self.source, self.date) if not result: session = db.session session.add(self) session.commit() else: session = db.session self.id = result.id session.add(result) session.commit()