import datetime from sqlalchemy import func from commons.models.fujian_survey import FujianSurvey from commons.models.price_publish import PricePublish from commons.models.price_result import PriceResult MATERIAL_ID_TYPE_1 = [] MATERIAL_ID_TYPE_2 = [] class Collector: def __init__(self, year, month, force=True): self.year = year self.month = month self.force = True # todo-2 已发布的价格不在覆盖计算 def get_avg(self): query = PricePublish.get_query(name_in=( '杉原木', '松原木', '锯材', '锯材', '毛竹', '冷轧带肋钢筋网', '预应力粗钢筋', '高强钢丝', '钢板', '钢板', '圆钢', '钢轨', '钢管', '镀锌钢管', '镀锌无缝钢管', '镀锌钢板', '钢丝绳', '波形钢板(双波)', '波形钢板(三波)', '四氟板式橡胶组合支座', '板式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '模数式伸缩装置', '模数式伸缩装置', '钢绞线群锚(3孔)', '钢绞线群锚(7孔)', '钢绞线群锚(15孔)', '不锈钢板', '铁件', '铝合金标志', '铸铁管', '钢板网', '铁丝编织网', '橡胶护舷', '橡胶护舷', '橡胶护舷', '鼓型橡胶护舷', '鼓型橡胶护舷', '鼓型橡胶护舷', '油漆', '塑料排水板', '路缘石', '乳化炸药', '硝铵炸药', '导火线', '普通雷管', '电雷管', '工业数码电子雷管', '导爆索', '引爆母线', '重油', '光圆钢筋', '带肋钢筋', '型钢', '钢绞线', '32.5级水泥', '42.5级水泥', '进口沥青', '国产沥青', '进口改性沥青', '国产改性沥青', '汽油(89)', '汽油(92)', '柴油(0)', )) query = PricePublish.query_previous_month(query, start_date=datetime.date(self.year, self.month, 1), count=6) query = query.with_entities( PricePublish.material_id, PricePublish.name, PricePublish.spec, func.avg(PricePublish.price), func.avg(PricePublish.price_fuzhou), func.avg(PricePublish.price_xiamen), func.avg(PricePublish.price_putian), func.avg(PricePublish.price_sanming), func.avg(PricePublish.price_quanzhou), func.avg(PricePublish.price_zhangzhou), func.avg(PricePublish.price_nanpin), func.avg(PricePublish.price_longyan), func.avg(PricePublish.price_ningde), func.avg(PricePublish.price_pintan), func.avg(PricePublish.price_zhangzhoukfq), PricePublish.tax, PricePublish.unit, ) query = query.filter(PricePublish.price != 0) query = query.group_by( PricePublish.material_id, PricePublish.name, PricePublish.spec, PricePublish.tax, PricePublish.unit, ) data = query.all() for item in data: material_id, name, spec, price, price_fuzhou, price_xiamen, price_putian, price_sanming, price_quanzhou, \ price_zhangzhou, price_nanpin, price_longyan, price_ningde, price_pintan, price_zhangzhoukfq, tax, unit = item PricePublish( year=self.year, month=self.month, material_id=material_id, name=name, spec=spec, price=round(price, 2), price_fuzhou=round(price_fuzhou or 0, 2), price_xiamen=round(price_xiamen or 0, 2), price_putian=round(price_putian or 0, 2), price_sanming=round(price_sanming or 0, 2), price_quanzhou=round(price_quanzhou or 0, 2), price_zhangzhou=round(price_zhangzhou or 0, 2), price_nanpin=round(price_nanpin or 0, 2), price_longyan=round(price_longyan or 0, 2), price_ningde=round(price_ningde or 0, 2), price_pintan=round(price_pintan or 0, 2), price_zhangzhoukfq=round(price_zhangzhoukfq or 0, 2), tax=tax, type=2, unit=unit, ).upsert() def get_from_survey(self): query = FujianSurvey.get_query(self.year, self.month, name_in=( '杉原木', '松原木', '锯材', '锯材', '毛竹', '冷轧带肋钢筋网', '预应力粗钢筋', '高强钢丝', '钢板', '钢板', '圆钢', '钢轨', '钢管', '镀锌钢管', '镀锌无缝钢管', '镀锌钢板', '钢丝绳', '波形钢板(双波)', '波形钢板(三波)', '四氟板式橡胶组合支座', '板式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '盆式橡胶支座', '模数式伸缩装置', '模数式伸缩装置', '钢绞线群锚(3孔)', '钢绞线群锚(7孔)', '钢绞线群锚(15孔)', '不锈钢板', '铁件', '铝合金标志', '铸铁管', '钢板网', '铁丝编织网', '橡胶护舷', '橡胶护舷', '橡胶护舷', '鼓型橡胶护舷', '鼓型橡胶护舷', '鼓型橡胶护舷', '油漆', '塑料排水板', '路缘石', '乳化炸药', '硝铵炸药', '导火线', '普通雷管', '电雷管', '工业数码电子雷管', '导爆索', '引爆母线', '重油', )) 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=item.tax, type=1, unit=item.unit ).upsert() def get_from_result(self): query = PriceResult.get_query(self.year, self.month, material_id_in=( '2001001', '2001002', '2001008', '2003004', '2003005', '2003005001', '5509001', '5509002', '5509003', '3001001002', '3001001001', '3001002002', '3001002001', '3003002001', '3003002002', '3003003', '4003001001', '4003001002', '4003002002', '4003002001', '4005001', '2001003', '2001006', '2001013', '2003006', '2003007', '2003008', '2003009', '2004004', '2003012', '2001019', '2003015', '2003016', '2003017001', '2003017002', '2003021', '2003022', '6001002', '6001003', '6001059', '6001071', '6001080', '6001086', '6001089', '6001092', '6003001', '6003003', '6005005', '6005009', '6005015', '2005002', '2009028', '6007002', '2009033', '2001025', '2001026', '6002001', '6002002', '6002003', '6002004', '6002005', '6002006', '5009002', '5506001', '5005001', '5005002', '5005003', '5005006', '5005007', '5006001', '5005009', '5006002', '5007003001', '3003001', )) 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_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=9.00, type=1, unit=item.unit, ).upsert() def run(self): # 当月价 # self.get_from_survey() self.get_from_result() # 近半年平均价 self.get_avg() if __name__ == '__main__': from core.factory import ClientApp with ClientApp().app_context(): collector = Collector(2023, 11) collector.run()