diff --git a/yuthon_report/models/hydropower_report.py b/yuthon_report/models/hydropower_report.py index 280e86383..b348e8a43 100644 --- a/yuthon_report/models/hydropower_report.py +++ b/yuthon_report/models/hydropower_report.py @@ -24,110 +24,65 @@ 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() - # 通过 payout_date 在查询月内的应收账单,取出水费/电费对应的 lessee_id - water_receivables = self.env['property.accounts.receivable'].search([ + # 直接以 property.accounts.receivable 为数据源 + # 按收款日期(payout_date)过滤居水费/电费记录 + water_records = 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_receivables = self.env['property.accounts.receivable'].search([ + electric_records = 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 = {} - for water in water_data: - for property_id in water.yuthon_property_ids: - key = property_id.name - if key not in property_dict: - property_dict[key] = { - '房屋名称': property_id.name, - '业户名称': property_id.lessee_id.name if property_id.lessee_id else '', - '水费': 0.0, - '_water_last_meter': None, - '_water_meter_date': None, - '电费': 0.0, - '_electric_last_meter': None, - '_electric_meter_date': None, - '小计': 0.0 - } - property_dict[key]['水费'] += water.receivables - # 期间 = last_meter 到 meter_date - 1天 - if water.last_meter: - 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 + for rec in water_records: + prop_name = rec.property_name or '' + lessee_name = rec.lessee_id.name if rec.lessee_id else (rec.contract_id.lessee_id.name if rec.contract_id else '') + key = prop_name or str(rec.id) + if key not in property_dict: + property_dict[key] = { + '房屋名称': prop_name, + '业户名称': lessee_name, + '水费': 0.0, + '水费期间': rec.charging_range or '', + '电费': 0.0, + '电费期间': '', + '小计': 0.0 + } + property_dict[key]['水费'] += rec.original_amount or 0.0 + if rec.charging_range: + property_dict[key]['水费期间'] = rec.charging_range - for electric in electric_data: - for property_id in electric.yuthon_property_ids: - key = property_id.name - if key not in property_dict: - property_dict[key] = { - '房屋名称': property_id.name, - '业户名称': property_id.lessee_id.name if property_id.lessee_id else '', - '水费': 0.0, - '_water_last_meter': None, - '_water_meter_date': None, - '电费': 0.0, - '_electric_last_meter': None, - '_electric_meter_date': None, - '小计': 0.0 - } - property_dict[key]['电费'] += electric.receivables - # 期间 = last_meter 到 meter_date - 1天 - if electric.last_meter: - 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 + for rec in electric_records: + prop_name = rec.property_name or '' + lessee_name = rec.lessee_id.name if rec.lessee_id else (rec.contract_id.lessee_id.name if rec.contract_id else '') + key = prop_name or str(rec.id) + if key not in property_dict: + property_dict[key] = { + '房屋名称': prop_name, + '业户名称': lessee_name, + '水费': 0.0, + '水费期间': '', + '电费': 0.0, + '电费期间': rec.charging_range or '', + '小计': 0.0 + } + property_dict[key]['电费'] += rec.original_amount or 0.0 + if rec.charging_range: + property_dict[key]['电费期间'] = rec.charging_range rows = [] total_water = 0.0 total_electric = 0.0 for idx, (key, value) in enumerate(property_dict.items(), start=1): - # 拼装水费期间:最早 last_meter 到 最晚 meter_date - w_last = value.pop('_water_last_meter') - w_curr = value.pop('_water_meter_date') - if w_last and w_curr: - value['水费期间'] = f"{w_last}到{w_curr}" - else: - value['水费期间'] = '' - # 拼装电费期间 - e_last = value.pop('_electric_last_meter') - e_curr = value.pop('_electric_meter_date') - if e_last and e_curr: - value['电费期间'] = f"{e_last}到{e_curr}" - else: - value['电费期间'] = '' - value['小计'] = round(value['水费'] + value['电费'], 2) value['水费'] = round(value['水费'], 2) value['电费'] = round(value['电费'], 2)