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: