Files
gzth/yuthon_property/models/property_meter_archives.py
T
2025-09-16 11:16:38 +08:00

165 lines
7.4 KiB
Python

from email.policy import default
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError
class PropertyMeterArchives(models.Model):
_name = 'property.meter.archives'
_description = '电表库'
name = fields.Char(string='仪表编号')
unit_number = fields.Char(string='单元编号/用途')
installation_location = fields.Char(string='安装位置')
is_state = fields.Boolean(string='是否启用')
type = fields.Selection([('public', '公共'), ('fees', '收费')], string='类型')
gauge_magnification = fields.Integer(string='仪表倍率', default=1)
maximum_count = fields.Integer(string='最大位数')
lessee_id = fields.Many2one('property.tenant.information', string='承租方', store=True, compute='_compute_lessee_id')
employee_ids = fields.Many2many('hr.employee', string='抄表人')
epitope_values = fields.Char(string='表位置')
other = fields.Char(string='其他')
meter_date = fields.Date(string='任务日期')
last_dosage = fields.Float(string='上次用量')
last_read = fields.Float(string='上次读数')
last_meter = fields.Date(string='上次抄表日期')
current_meter = fields.Float(string='本次用量', tracking=True)
current_read = fields.Float(string='本次读数', tracking=True)
unit = fields.Float(string='当月单价')
archives_state = fields.Selection([('stop', '停用'), ('use', '正常'), ('rent', '出租')], string='状态', compute='_compute_archives_state', store=True, default='use')
is_push = fields.Boolean(string='已推送')
start_time = fields.Date(string="安装日期")
end_time = fields.Date(string="拆除日期")
line_loss = fields.Float(string="线损", default=0.02)
receivables = fields.Float(string="应收", compute='_compute_receivables', store=True)
last_reading_time = fields.Date(string="最后读数时间")
standards_id = fields.Many2one('yuthon.electricity.setting', string='标准')
yuthon_property_ids = fields.Many2many('yuthon.property', string='物业信息')
remarks = fields.Text(string='备注')
@api.depends('yuthon_property_ids')
def _compute_lessee_id(self):
for record in self:
if record.yuthon_property_ids:
record.lessee_id = record.yuthon_property_ids[0].lessee_id
else:
record.lessee_id = False
@api.depends('line_loss', 'current_meter', 'unit')
def _compute_receivables(self):
for record in self:
if record.line_loss and record.current_meter and record.unit:
record.receivables = record.current_meter * record.unit * (1 + record.line_loss) * record.gauge_magnification
def format_update(self):
insurances_ids = self.env["property.meter.archives"].browse(
self._context.get('active_ids', self._context.get('active_id')))
for record in insurances_ids:
value = record.unit_number
if isinstance(value, str) and value.replace('.', '', 1).isdigit():
unit_number = int(float(value))
record.write({'unit_number': unit_number})
record.write({'maximum_count': 99999,
})
def open_record(self):
return {
'type': 'ir.actions.act_window',
'res_model': 'property.meter.archives',
'res_id': self.id,
'view_mode': 'form',
}
@api.depends('lessee_id')
def _compute_archives_state(self):
for record in self:
if record.lessee_id:
record.archives_state = 'rent'
else:
record.archives_state = 'use'
@api.model
def create(self, vals):
record = super().create(vals)
if record.lessee_id:
record.archives_state = 'rent'
else:
record.archives_state = 'use'
return record
def button_archives_state(self):
archives_ids = self.env["property.meter.archives"].browse(self._context.get('active_ids', self._context.get('active_id')))
for record in archives_ids:
record.archives_state = 'stop'
def update_meter(self):
meter_ids = self.env["property.meter.archives"].browse(self._context.get('active_ids', self._context.get('active_id')))
for record in meter_ids:
if record.lessee_id:
record.archives_state = 'rent'
else:
record.archives_state = 'use'
@api.onchange('current_read', 'last_read')
def _onchange_current_meter(self):
for record in self:
if record.current_read > record.last_read:
record.current_meter = record.current_read - record.last_read
else:
if record.maximum_count > 0:
max_value = 10 ** record.maximum_count - 1
record.current_meter = max_value - record.last_read + record.current_read
else:
record.current_meter = 0
@api.onchange('yuthon_property_ids')
def _onchange_property(self):
if self.yuthon_property_ids:
meter_list = []
for yuthon_property_id in self.yuthon_property_ids:
property_id = self.env['yuthon.property'].search([('id', '=', yuthon_property_id.id.origin)])
property_id.is_electricity_meter = True
meter_list.append((0, 0, {
'yuthon_property_id': property_id.id,
'property_meter_archives_id': self.id.origin,
}))
property_id.energy_meter_ids = meter_list
def action_property_meter_wizard(self):
return {
"type": "ir.actions.act_window",
"name": "批量导入物业电表",
"res_model": "property.meter.wizard",
"view_mode": "form",
"target": "new",
}
def reading_publish(self):
menu_id = self.env['ir.ui.menu'].search([('name', '=', '水表抄表')])
reading_ids = self.env["property.meter.archives"].browse(self._context.get('active_ids', self._context.get('active_id')))
for record in reading_ids:
for employee_id in record.employee_ids:
url = f'https://oa.thtzjt.com/web#id={self.id}&cids=2&action={menu_id.action.id}&model=property.meter.archives&view_type=list&menu_id={menu_id.id}'
we_id = self.env['hr.employee'].search([('id', '=', employee_id)]).wecom_userid
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='notice', user_id=we_id,
title="通知公告",
description="您有抄表待处理,请及时处理",
url=url, btntxt="详细信息")
def batch_reading_push(self):
active_ids = self._context.get('active_ids', [])
return {
'name': '电水表推送',
'type': 'ir.actions.act_window',
'res_model': 'electric.water.wizard',
'view_mode': 'form',
'view_type': 'form',
'target': 'new',
'context': {
'default_meter_ids': [(6, 0, active_ids)]
}
}
class PropertyElectricReading(models.Model):
_name = 'property.electric.reading'
current_meter = fields.Float(string='本次用量', tracking=True)