diff --git a/web/collectors/__init__.py b/web/collectors/__init__.py index fb6b5d7..80a649b 100644 --- a/web/collectors/__init__.py +++ b/web/collectors/__init__.py @@ -2,6 +2,7 @@ import datetime from sqlalchemy import func +from calculators import Helper from commons.models.fujian_survey import FujianSurvey from commons.models.price_publish import PricePublish from commons.models.price_result import PriceResult @@ -80,62 +81,42 @@ class Collector: display_digit=display_digit, ).upsert() - def get_from_survey(self): - query = FujianSurvey.get_query(self.year, self.month, material_id_in=self.material_codes) - data = query.all() - for item in data: - PricePublish( - year=self.year, - month=self.month, - material_id=item.material_id, - name=item.name, - spec=item.spec, - price=item.price, - price_fuzhou=item.price, - price_xiamen=item.price, - price_putian=item.price, - price_sanming=item.price, - price_quanzhou=item.price, - price_zhangzhou=item.price, - price_nanpin=item.price, - price_longyan=item.price, - price_ningde=item.price, - price_pintan=item.price, - price_zhangzhoukfq=item.price, - tax=self.tax_map.get(item.material_id, item.tax), # 从材料表获取税率 - type=1, - unit=item.unit - ).upsert() - def get_from_result(self): + # 获取当月趋势表数据 query = PriceResult.get_query(self.year, self.month, material_id_in=self.material_codes) data = query.all() - self.digit_map = {i.material_id:i.display_digit for i in data} + self.digit_map = {i.material_id: i.display_digit for i in data} + # 获取上月发布价数据 + previous = PricePublish.get_query(*Helper.get_last_month(self.year, self.month), type=1) + previous_prices_map = {i.material_id: i for i in previous} + for item in data: - # 从材料表获取税率 - PricePublish( - year=self.year, - month=self.month, - material_id=item.material_id, - name=item.name, - spec=item.spec, - price=item.price_recommend, - price_fuzhou=item.price_recommend, - price_xiamen=item.price_recommend, - price_putian=item.price_recommend, - price_sanming=item.price_recommend, - price_quanzhou=item.price_recommend, - price_zhangzhou=item.price_recommend, - price_nanpin=item.price_recommend, - price_longyan=item.price_recommend, - price_ningde=item.price_recommend, - price_pintan=item.price_recommend, - price_zhangzhoukfq=item.price_recommend, - tax=self.tax_map.get(item.material_id), - type=1, - unit=item.unit, - display_digit=item.display_digit, - ).upsert() + fluctuating = item.fluctuating_recommend + previous_prices = previous_prices_map.get(item.material_id, PricePublish()) + result = { + 'year': self.year, + 'month': self.month, + 'material_id': item.material_id, + 'name': item.name, + 'spec': item.spec, + 'price': item.price_recommend, + 'price_fuzhou': item.price_recommend, + 'price_xiamen': previous_prices.price_xiamen + fluctuating if previous_prices.price_xiamen else item.price_recommend, + 'price_putian': previous_prices.price_putian + fluctuating if previous_prices.price_putian else item.price_recommend, + 'price_sanming': previous_prices.price_sanming + fluctuating if previous_prices.price_sanming else item.price_recommend, + 'price_quanzhou': previous_prices.price_quanzhou + fluctuating if previous_prices.price_quanzhou else item.price_recommend, + 'price_zhangzhou': previous_prices.price_zhangzhou + fluctuating if previous_prices.price_zhangzhou else item.price_recommend, + 'price_nanpin': previous_prices.price_nanpin + fluctuating if previous_prices.price_nanpin else item.price_recommend, + 'price_longyan': previous_prices.price_longyan + fluctuating if previous_prices.price_longyan else item.price_recommend, + 'price_ningde': previous_prices.price_ningde + fluctuating if previous_prices.price_ningde else item.price_recommend, + 'price_pintan': previous_prices.price_pintan + fluctuating if previous_prices.price_pintan else item.price_recommend, + 'price_zhangzhoukfq': previous_prices.price_zhangzhoukfq + fluctuating if previous_prices.price_zhangzhoukfq else item.price_recommend, + 'tax': self.tax_map.get(item.material_id), # 从材料表获取税率 + 'type': 1, + 'unit': item.unit, + 'display_digit': item.display_digit, + } + PricePublish(**result).upsert() def run(self): # 当月价 diff --git a/web/commons/models/price_publish.py b/web/commons/models/price_publish.py index 79a43f2..3d9f948 100644 --- a/web/commons/models/price_publish.py +++ b/web/commons/models/price_publish.py @@ -78,7 +78,7 @@ class PricePublish(db.Model, Model, OperationTrackMixin, BaseModelMixin): return query @classmethod - def get_query(cls, year=None, month=None, name_in=None, material_id_in=None): + def get_query(cls, year=None, month=None, name_in=None, material_id_in=None, type=None): query = cls.query if year: query = query.filter(cls.year == year) @@ -88,4 +88,6 @@ class PricePublish(db.Model, Model, OperationTrackMixin, BaseModelMixin): query = query.filter(cls.name.in_(name_in)) if material_id_in: query = query.filter(cls.material_id.in_(material_id_in)) + if type: + query = query.filter(cls.type == type) return query diff --git a/web/tasks/once/collect.py b/web/tasks/once/collect.py index c508eae..d6f7d43 100644 --- a/web/tasks/once/collect.py +++ b/web/tasks/once/collect.py @@ -15,7 +15,7 @@ if __name__ == '__main__': from core.factory import ClientApp with ClientApp().app_context(): - collect(2024, 8) + collect(2023, 3) # for i in range(2, 12): # collect(2022, i + 1)