From 66e4e8a8935a23eb58bd852e6d300c1cbaf15bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=B9=8F=E5=AE=87?= <9664676+pengyuthon@user.noreply.gitee.com> Date: Wed, 24 Sep 2025 17:38:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../models/property_meter_archives.py | 9 ++- .../models/property_meter_water.py | 11 ++-- .../views/property_bank_statements_views.xml | 2 +- .../views/property_meter_archives_views.xml | 6 +- .../views/property_meter_water_views.xml | 6 +- .../views/yuthon_property_views.xml | 1 + .../models/inherit_yuthon_property.py | 61 +++++++++++++------ .../models/property_lease_contract.py | 43 ++++++++++++- 8 files changed, 100 insertions(+), 39 deletions(-) diff --git a/yuthon_property/models/property_meter_archives.py b/yuthon_property/models/property_meter_archives.py index 4442b9301..4a74aa429 100644 --- a/yuthon_property/models/property_meter_archives.py +++ b/yuthon_property/models/property_meter_archives.py @@ -143,7 +143,7 @@ class MeterArchivesLine(models.Model): archives_id = fields.Many2one('property.meter.archives', string='电表库', required=True, ondelete='cascade') name = fields.Char(string='仪表编号') epitope_values = fields.Char(string='表位置') - lessee_id = fields.Many2one('property.tenant.information', string='承租方', compute='_compute_lessee_id') + lessee_id = fields.Many2one('property.tenant.information', string='承租方') yuthon_property_ids = fields.Many2many('yuthon.property', string='物业信息') last_meter = fields.Date(string='上次抄表日期') last_dosage = fields.Float(string='上次用量', compute="compute_meter_values") @@ -208,8 +208,8 @@ class MeterArchivesLine(models.Model): else: line.last_dosage = 0.0 - @api.depends('yuthon_property_ids') - def _compute_lessee_id(self): + @api.onchange('yuthon_property_ids') + def onchange_lessee_id(self): for record in self: if record.yuthon_property_ids: record.lessee_id = record.yuthon_property_ids[0].lessee_id @@ -220,8 +220,7 @@ class MeterArchivesLine(models.Model): meter_ids = self.env["meter.archives.line"].browse( self._context.get('active_ids', self._context.get('active_id'))) for record in meter_ids: - if record.last_meter: - record.meter_date = record.last_meter + record.onchange_lessee_id() class PropertyElectricReading(models.Model): _name = 'property.electric.reading' diff --git a/yuthon_property/models/property_meter_water.py b/yuthon_property/models/property_meter_water.py index df240c6d5..9a12ce571 100644 --- a/yuthon_property/models/property_meter_water.py +++ b/yuthon_property/models/property_meter_water.py @@ -114,7 +114,7 @@ class MeterWaterLine(models.Model): water_id = fields.Many2one('property.meter.water', string='水表库', required=True, ondelete='cascade') name = fields.Char(string='仪表编号') epitope_values = fields.Char(string='表位置') - lessee_id = fields.Many2one('property.tenant.information', string='承租方', compute='_compute_lessee_id') + lessee_id = fields.Many2one('property.tenant.information', string='承租方') yuthon_property_ids = fields.Many2many('yuthon.property', string='物业信息') last_meter = fields.Date(string='上次抄表日期') last_dosage = fields.Float(string='上次用量', compute="compute_meter_values") @@ -184,9 +184,8 @@ class MeterWaterLine(models.Model): else: line.last_dosage = 0.0 - - @api.depends('yuthon_property_ids') - def _compute_lessee_id(self): + @api.onchange('yuthon_property_ids') + def onchange_lessee_id(self): for record in self: if record.yuthon_property_ids: record.lessee_id = record.yuthon_property_ids[0].lessee_id @@ -197,9 +196,7 @@ class MeterWaterLine(models.Model): meter_ids = self.env["meter.water.line"].browse( self._context.get('active_ids', self._context.get('active_id'))) for record in meter_ids: - if record.last_meter: - record.meter_date = record.last_meter - + record.onchange_lessee_id() class PropertyWaterReading(models.Model): _name = 'property.water.reading' diff --git a/yuthon_property/views/property_bank_statements_views.xml b/yuthon_property/views/property_bank_statements_views.xml index 11baa856f..15adb461b 100644 --- a/yuthon_property/views/property_bank_statements_views.xml +++ b/yuthon_property/views/property_bank_statements_views.xml @@ -21,7 +21,7 @@ property.bank.statements.tree property.bank.statements - +
diff --git a/yuthon_property/views/property_meter_archives_views.xml b/yuthon_property/views/property_meter_archives_views.xml index 3eeca4997..f4e0fc0eb 100644 --- a/yuthon_property/views/property_meter_archives_views.xml +++ b/yuthon_property/views/property_meter_archives_views.xml @@ -94,9 +94,9 @@ meter.archives.line -
-
+ + + diff --git a/yuthon_property/views/property_meter_water_views.xml b/yuthon_property/views/property_meter_water_views.xml index fd61501d8..487f0e13d 100644 --- a/yuthon_property/views/property_meter_water_views.xml +++ b/yuthon_property/views/property_meter_water_views.xml @@ -98,9 +98,9 @@ meter.water.line -
-
+ + + diff --git a/yuthon_property/views/yuthon_property_views.xml b/yuthon_property/views/yuthon_property_views.xml index a929010b8..01aaef891 100644 --- a/yuthon_property/views/yuthon_property_views.xml +++ b/yuthon_property/views/yuthon_property_views.xml @@ -86,6 +86,7 @@ + diff --git a/yuthon_property_approval/models/inherit_yuthon_property.py b/yuthon_property_approval/models/inherit_yuthon_property.py index da72a72dc..33ee34124 100644 --- a/yuthon_property_approval/models/inherit_yuthon_property.py +++ b/yuthon_property_approval/models/inherit_yuthon_property.py @@ -58,25 +58,48 @@ class PropertyBankStatements(models.Model): rec.start_time = rec.start_time - timedelta(hours=8) def revocation(self): - for rec in self: - for modify in rec.receivable_modify_ids: - if modify.is_write: - new_delivered = modify.receivable_id.delivered1 - modify.amount - modify.receivable_id.delivered1 = max(new_delivered, 0) - modify.receivable_id.is_reconciliation = False - modify.receivable_id.reconciliation_time = False - modify.receivable_id.payout_date = False - if not modify.is_penalty: - modify.receivable_id.remark = None - else: - modify.receivable_id.unlink() - if rec.receivable_modify_ids: - rec.receivable_modify_ids.unlink() - rec.bank_state = 'not_reconciled' - rec.registered = 0 - rec.no_amount = rec.original_amount - rec.yes_amount = 0 - rec.reconciliation_time = None + self.ensure_one() + current_rec = self[0] + domain = [ + ('your_own_unit', '=', current_rec.your_own_unit), + ('bank_state', '=', 'reconciled'), + ('name', '=', current_rec.name) + ] + same_group_records = self.env[self._name].search(domain) + + # 按start_time倒序排序,找到最近的记录 + sorted_records = sorted( + same_group_records, + key=lambda r: r.start_time or '', + reverse=True + ) + latest_record = sorted_records[0] + + # 检查当前记录是否是最近的一条 + if current_rec.id != latest_record.id: + raise UserError( + f"只能从最近的记录开始撤销!\n" + f"当前记录时间: {current_rec.start_time + timedelta(hours=8)}\n" + f"最近记录时间: {latest_record.start_time + timedelta(hours=8)}" + ) + for modify in self.receivable_modify_ids: + if modify.is_write: + new_delivered = modify.receivable_id.delivered1 - modify.amount + modify.receivable_id.delivered1 = max(new_delivered, 0) + modify.receivable_id.is_reconciliation = False + modify.receivable_id.reconciliation_time = False + modify.receivable_id.payout_date = False + if not modify.is_penalty: + modify.receivable_id.remark = None + else: + modify.receivable_id.unlink() + if self.receivable_modify_ids: + self.receivable_modify_ids.unlink() + self.bank_state = 'not_reconciled' + self.registered = 0 + self.no_amount = self.original_amount + self.yes_amount = 0 + self.reconciliation_time = None def binding_information(self): return { diff --git a/yuthon_property_approval/models/property_lease_contract.py b/yuthon_property_approval/models/property_lease_contract.py index b02e699b3..02f69556c 100644 --- a/yuthon_property_approval/models/property_lease_contract.py +++ b/yuthon_property_approval/models/property_lease_contract.py @@ -483,7 +483,7 @@ class PropertyLeaseContract(models.Model): ('yuthon_property_id', '=', property_addr.id), ('lease_contract_id', '=', contract.id) ], limit=1) - + property_addr.lessee_id = contract.lessee_id.id # 准备要写入的数据 contract_data = { 'yuthon_property_id': property_addr.id, @@ -503,6 +503,47 @@ class PropertyLeaseContract(models.Model): 'property_contract_ids': [(0, 0, contract_data)] }) + contract_lines = self.env['property.contract.line'].search([ + ('lease_contract_id', '=', contract.id) + ]) + + for line in contract_lines: + # 从明细行中获取关键信息 + start_time = line.start_time + end_date = line.end_date + yuthon_property_id = line.yuthon_property_id.id + + if not (start_time and yuthon_property_id): + continue + + # 获取当前物业记录 + property_addr = self.env['yuthon.property'].browse(yuthon_property_id) + if not property_addr: + continue + + date_domain = [ + ('meter_date', '>=', start_time) + ] + if end_date: + date_domain.append(('meter_date', '<=', end_date)) + + # 处理水表 + if property_addr.is_meter: + water_lines = self.env['meter.water.line'].search([ + ('yuthon_property_ids', 'in', [yuthon_property_id]), + *date_domain + ]) + for water_line in water_lines: + water_line.write({'lessee_id': line.lessee_id.id}) + + if property_addr.is_electricity_meter: + electric_lines = self.env['meter.archives.line'].search([ + ('yuthon_property_ids', 'in', [yuthon_property_id]), + *date_domain + ]) + for electric_line in electric_lines: + electric_line.write({'lessee_id': line.lessee_id.id}) + @api.onchange('lessee_id') def _onchange_lessee_id(self): for record in self: