diff --git a/yuthon_report/models/hydropower_report.py b/yuthon_report/models/hydropower_report.py index ecd43eeb4..280e86383 100644 --- a/yuthon_report/models/hydropower_report.py +++ b/yuthon_report/models/hydropower_report.py @@ -24,19 +24,37 @@ class HydropowerReport(models.Model): start_date = datetime.fromisoformat(date_start).date() if date_start else date.today().replace(day=1) end_date = datetime.fromisoformat(date_end).date() if date_end else date.today() - # 获取水表数据 - water_data = self.env['meter.water.line'].search([ - ('meter_date', '>=', start_date), - ('meter_date', '<=', end_date), - ('state', '=', 'reading') + # 通过 payout_date 在查询月内的应收账单,取出水费/电费对应的 lessee_id + water_receivables = self.env['property.accounts.receivable'].search([ + ('payout_date', '>=', start_date), + ('payout_date', '<=', end_date), + ('management_type_id.name', '=', '水费'), + ('is_invalid', '=', False), ]) + water_lessee_ids = water_receivables.mapped('contract_id.lessee_id').ids - # 获取电表数据 - electric_data = self.env['meter.archives.line'].search([ + electric_receivables = self.env['property.accounts.receivable'].search([ + ('payout_date', '>=', start_date), + ('payout_date', '<=', end_date), + ('management_type_id.name', '=', '电费'), + ('is_invalid', '=', False), + ]) + electric_lessee_ids = electric_receivables.mapped('contract_id.lessee_id').ids + + # 用 lessee_id 查抄表记录(不限 meter_date,取该租户最近一条 reading 记录) + water_data = self.env['meter.water.line'].search([ + ('lessee_id', 'in', water_lessee_ids), ('meter_date', '>=', start_date), ('meter_date', '<=', end_date), ('state', '=', 'reading') - ]) + ]) if water_lessee_ids else self.env['meter.water.line'] + + electric_data = self.env['meter.archives.line'].search([ + ('lessee_id', 'in', electric_lessee_ids), + ('meter_date', '>=', start_date), + ('meter_date', '<=', end_date), + ('state', '=', 'reading') + ]) if electric_lessee_ids else self.env['meter.archives.line'] # 整合数据 property_dict = {} @@ -57,19 +75,14 @@ class HydropowerReport(models.Model): '小计': 0.0 } property_dict[key]['水费'] += water.receivables - # 期间结束 = last_meter - 1天(上次抄表日前一天) + # 期间 = last_meter 到 meter_date - 1天 if water.last_meter: - period_end = water.last_meter - timedelta(days=1) + if property_dict[key]['_water_last_meter'] is None or water.last_meter < property_dict[key]['_water_last_meter']: + property_dict[key]['_water_last_meter'] = water.last_meter + if water.meter_date: + period_end = water.meter_date - timedelta(days=1) if property_dict[key]['_water_meter_date'] is None or period_end > property_dict[key]['_water_meter_date']: property_dict[key]['_water_meter_date'] = period_end - # 期间开始 = 上一次抄表记录的 meter_date - prev = self.env['meter.water.line'].search([ - ('water_id', '=', water.water_id.id), - ('meter_date', '<', water.last_meter), - ], order='meter_date desc', limit=1) - period_start = prev.meter_date if prev else water.last_meter - if property_dict[key]['_water_last_meter'] is None or period_start < property_dict[key]['_water_last_meter']: - property_dict[key]['_water_last_meter'] = period_start for electric in electric_data: for property_id in electric.yuthon_property_ids: @@ -87,18 +100,14 @@ class HydropowerReport(models.Model): '小计': 0.0 } property_dict[key]['电费'] += electric.receivables - # 期间结束 = last_meter - 1天。期间开始 = 上一次抄表记录的 meter_date + # 期间 = last_meter 到 meter_date - 1天 if electric.last_meter: - period_end = electric.last_meter - timedelta(days=1) + if property_dict[key]['_electric_last_meter'] is None or electric.last_meter < property_dict[key]['_electric_last_meter']: + property_dict[key]['_electric_last_meter'] = electric.last_meter + if electric.meter_date: + period_end = electric.meter_date - timedelta(days=1) if property_dict[key]['_electric_meter_date'] is None or period_end > property_dict[key]['_electric_meter_date']: property_dict[key]['_electric_meter_date'] = period_end - prev = self.env['meter.archives.line'].search([ - ('archives_id', '=', electric.archives_id.id), - ('meter_date', '<', electric.last_meter), - ], order='meter_date desc', limit=1) - period_start = prev.meter_date if prev else electric.last_meter - if property_dict[key]['_electric_last_meter'] is None or period_start < property_dict[key]['_electric_last_meter']: - property_dict[key]['_electric_last_meter'] = period_start rows = [] total_water = 0.0