60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
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()
|