Files
gzth/yuthon_property/wizard/property_meter_wizard.py
T
2025-09-06 18:34:05 +08:00

86 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
from odoo import models, fields, api, _, SUPERUSER_ID
from odoo.exceptions import ValidationError, UserError
from pypinyin import pinyin, Style
import xlrd
import base64
import datetime
from datetime import datetime
class PropertyMeterWizard(models.Model):
_name = 'property.meter.wizard'
excel_file = fields.Binary(string="上传Excel表")
excel_name = fields.Char(string="文件名")
def confirm(self):
"""
导入excel文件,按行读取数据并处理
"""
if not self.excel_file:
raise ValidationError('请上传文件。')
book = xlrd.open_workbook(file_contents=base64.decodebytes(self.excel_file))
sh = book.sheet_by_index(0)
for rx in range(1, sh.nrows):
row = sh.row(rx)
self.property_meter_data(row)
def property_meter_data(self, row):
epitope_values = row[0].value
name = row[3].value
type_dict = {'水表': 'water', '电表': 'electric', '电表(电子表)': 'smart', '': ''}
meter_type = type_dict.get(row[4].value)
unit_number = row[1].value
installation_location = row[2].value
if row[5].value:
gauge_magnification = float(row[5].value)
else:
gauge_magnification = None
maximum_count = float(row[6].value) if row[6].value else None
type_dict = {'公共': 'public', '收费': 'fees', '': ''}
type = type_dict.get(row[7].value)
property_id = None
if row[2].value:
property_search = self.env['yuthon.property'].search([('name', '=', row[2].value)])
if property_search:
property_id = property_search[0]
meter_data = {
'name': name,
'meter_type': meter_type,
'epitope_values': epitope_values,
'maximum_count': maximum_count,
'unit_number': unit_number,
'installation_location': installation_location,
'type': type,
'gauge_magnification': gauge_magnification,
}
if property_id:
meter_data['yuthon_property_ids'] = [(4, property_id.id)]
meter_id = self.env['property.meter.archives'].search([('name', '=', row[3].value)], limit=1)
if meter_id:
meter_id.write(meter_data)
else:
meter_id = self.env['property.meter.archives'].create(meter_data)
if property_id:
# 检查物业是否已关联该电表
existing_meter = next((
meter for meter in property_id.energy_meter_ids
if meter.property_meter_archives_id.id == meter_id.id
), None)
if not existing_meter:
existing_entries = [(4, meter.id) for meter in property_id.energy_meter_ids]
new_meter_entry = (0, 0, {
'property_meter_archives_id': meter_id.id,
})
updated_meters = existing_entries + [new_meter_entry]
property_id.write({
'is_electricity_meter': True,
'energy_meter_ids': updated_meters
})