diff --git a/yuthon_hr_attendance/controllers/applet_attendance.py b/yuthon_hr_attendance/controllers/applet_attendance.py
index f914faecc..2e0829e71 100644
--- a/yuthon_hr_attendance/controllers/applet_attendance.py
+++ b/yuthon_hr_attendance/controllers/applet_attendance.py
@@ -752,6 +752,12 @@ class AppletAttendance(Controller):
all_records = []
+ # 接口调整, 电表,水表数据拆分.
+ # 先根据状态,再根据楼层
+
+ # 电表数据
+ electric_result_dict = {}
+
# 处理电表
for electric in electric_records:
property_infos = electric.yuthon_property_ids if electric.yuthon_property_ids else [None]
@@ -769,8 +775,8 @@ class AppletAttendance(Controller):
room = ''
address = ''
employee_name = ''
-
- all_records.append({
+ state = electric.state
+ electric_value = {
'code': electric.name or '',
'last_dosage': electric.last_dosage or 0,
'mater_data': str(electric.meter_date) if electric.meter_date else '',
@@ -783,8 +789,31 @@ class AppletAttendance(Controller):
'room': room,
'epitope_values':electric.epitope_values,
'unit_number':electric.unit_number,
- })
+ 'state': electric.state, # 状态 reading unreading
+ }
+ electric_result_dict.setdefault(state, {}).setdefault(building,{}).setdefault(floor, []).append(electric_value)
+
+ electric_result = []
+ for state, building_dict in electric_result_dict.items():
+ building_list = []
+ for building, floor_dict in building_dict.items():
+ floor_list = []
+ for floor, data_list in floor_dict.items():
+ floor_list.append({
+ 'floor': floor,
+ 'data_list': data_list
+ })
+ building_list.append({
+ 'building': building,
+ 'floor_list': floor_list
+ })
+ electric_result.append({
+ 'state': state,
+ 'building_list': building_list
+ })
+
+ water_result_dict = {}
# 处理水表
for water in water_records:
property_infos = water.yuthon_property_ids if water.yuthon_property_ids else [None]
@@ -803,8 +832,8 @@ class AppletAttendance(Controller):
room = ''
address = ''
employee_name = ''
-
- all_records.append({
+ state = water.state
+ water_value = {
'code': water.name or '',
'last_dosage': water.last_dosage or 0,
'mater_data': str(water.meter_date) if water.meter_date else '',
@@ -816,37 +845,74 @@ class AppletAttendance(Controller):
'floor': floor,
'room': room,
'epitope_values':water.epitope_values,
- 'unit_number':water.unit_number
+ 'unit_number':water.unit_number,
+ 'state': water.state, # 状态 reading unreading
+ }
+ water_result_dict.setdefault(state, {}).setdefault(building,{}).setdefault(floor, []).append(water_value)
+
+ water_result = []
+ for state, building_dict in water_result_dict.items():
+ building_list = []
+ for building, floor_dict in building_dict.items():
+ floor_list = []
+ for floor, data_list in floor_dict.items():
+ floor_list.append({
+ 'floor': floor,
+ 'data_list': data_list
+ })
+ building_list.append({
+ 'building': building,
+ 'floor_list': floor_list
})
+ water_result.append({
+ 'state': state,
+ 'building_list': building_list
+ })
# 按“楼盘->楼层”分组
- building_floor_map = {}
- for record in all_records:
- building_name = record['building']
- floor_name = record['epitope_values']
+ # building_floor_map = {}
+ # for record in all_records:
+ # building_name = record['building']
+ # state = record['state']
+ # floor_name = record['epitope_values']
+ #
+ # # 初始化楼盘分组(空楼盘名也作为有效分组)
+ # if building_name not in building_floor_map:
+ # building_floor_map[building_name] = {}
+ #
+ # # 初始化状态分组
+ # if state not in building_floor_map[building_name]:
+ # building_floor_map[building_name][state] = {}
+ #
+ # # 初始化楼层分组(空楼层名也作为有效分组)
+ # if floor_name not in building_floor_map[building_name]:
+ # building_floor_map[building_name][state][floor_name] = []
+ #
+ # # 移除building和floor字段,只保留数据项
+ # record_data = {k: v for k, v in record.items() if k not in ['building', 'epitope_values']}
+ # building_floor_map[building_name][state][floor_name].append(record_data)
+ #
+ # # 组装最终返回结构
+ # table_list = []
+ # # for building, floor_dict in building_floor_map.items():
+ # # floor_list = [
+ # # {'floor': floor, 'data_list': data_list}
+ # # for floor, data_list in floor_dict.items()
+ # # ]
+ # # table_list.append({'building': building, 'floor_list': floor_list})
+ #
+ # # 三层结构组装
+ # for building, state_dict in building_floor_map.items():
+ # state_list = [
+ # {'state': state, 'floor_list': [{'floor': floor, 'data_list': data_list} for floor, data_list in floor_dict.items()]}
+ # for state, floor_dict in state_dict.items()
+ # ]
+ # table_list.append({'building': building, 'state_list': state_list})
- # 初始化楼盘分组(空楼盘名也作为有效分组)
- if building_name not in building_floor_map:
- building_floor_map[building_name] = {}
-
- # 初始化楼层分组(空楼层名也作为有效分组)
- if floor_name not in building_floor_map[building_name]:
- building_floor_map[building_name][floor_name] = []
-
- # 移除building和floor字段,只保留数据项
- record_data = {k: v for k, v in record.items() if k not in ['building', 'epitope_values']}
- building_floor_map[building_name][floor_name].append(record_data)
-
- # 组装最终返回结构
- table_list = []
- for building, floor_dict in building_floor_map.items():
- floor_list = [
- {'floor': floor, 'data_list': data_list}
- for floor, data_list in floor_dict.items()
- ]
- table_list.append({'building': building, 'floor_list': floor_list})
-
- return json.dumps(table_list)
+ return json.dumps({
+ 'electric': electric_result,
+ 'water': water_result,
+ })
@route('/yuthon/meter/dosage', methods=['POST'], type='http', auth='none', cors='*', csrf=False)
def yuthon_meter_dosage(self, **kw):
diff --git a/yuthon_property/models/property_meter_archives.py b/yuthon_property/models/property_meter_archives.py
index 8e0c15287..b3b34b048 100644
--- a/yuthon_property/models/property_meter_archives.py
+++ b/yuthon_property/models/property_meter_archives.py
@@ -3,6 +3,7 @@ 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 = '电表库'
@@ -14,7 +15,8 @@ class PropertyMeterArchives(models.Model):
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')
+ 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='其他')
@@ -25,7 +27,8 @@ class PropertyMeterArchives(models.Model):
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')
+ 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="拆除日期")
@@ -36,6 +39,7 @@ class PropertyMeterArchives(models.Model):
yuthon_property_ids = fields.Many2many('yuthon.property', string='物业信息')
line_ids = fields.One2many('meter.archives.line', 'archives_id', string='明细行')
remarks = fields.Text(string='备注')
+ state = fields.Selection([('unreading', '未抄'), ('reding', '已抄')], string='状态', default='unreading')
@api.depends('yuthon_property_ids')
def _compute_lessee_id(self):
@@ -49,11 +53,12 @@ class PropertyMeterArchives(models.Model):
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
+ 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')))
+ 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():
@@ -88,12 +93,14 @@ class PropertyMeterArchives(models.Model):
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')))
+ 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')))
+ 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'
@@ -136,7 +143,8 @@ class PropertyMeterArchives(models.Model):
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')))
+ 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}'
@@ -191,13 +199,15 @@ class MeterArchivesLine(models.Model):
archives_state = fields.Selection([('stop', '停用'), ('use', '正常'), ('rent', '出租')], string='状态',
default='use')
maximum_count = fields.Integer(string='最大位数')
+ # 状态,已抄 未抄
+ state = fields.Selection([('reading', '已抄'), ('unreading', '未抄')], string='抄表状态', default='unreading')
@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
+ 1 + record.line_loss) * record.gauge_magnification
@api.depends('current_read', 'last_read')
def _compute_current_meter(self):
@@ -245,6 +255,7 @@ class MeterArchivesLine(models.Model):
if record.last_meter:
record.meter_date = record.last_meter
+
class PropertyElectricReading(models.Model):
_name = 'property.electric.reading'
current_meter = fields.Float(string='本次用量', tracking=True)
diff --git a/yuthon_property/models/property_meter_water.py b/yuthon_property/models/property_meter_water.py
index b6476eb26..b45717bf1 100644
--- a/yuthon_property/models/property_meter_water.py
+++ b/yuthon_property/models/property_meter_water.py
@@ -34,6 +34,7 @@ class PropertyMeterWater(models.Model):
standards_id = fields.Many2one('yuthon.electricity.setting', string='标准')
yuthon_property_ids = fields.Many2many('yuthon.property', string='物业信息')
line_ids = fields.One2many('meter.water.line', 'water_id', string='水表明细行')
+ state = fields.Selection([('reading', '已抄'), ('unreading', '未抄')], string='抄表状态', default='unreading')
remarks = fields.Text(string='备注')
def open_record(self):
diff --git a/yuthon_property/views/property_meter_archives_views.xml b/yuthon_property/views/property_meter_archives_views.xml
index b5d09feb3..b37b9816f 100644
--- a/yuthon_property/views/property_meter_archives_views.xml
+++ b/yuthon_property/views/property_meter_archives_views.xml
@@ -106,13 +106,12 @@
meter.archives.line.tree
meter.archives.line
-
+
-
+
diff --git a/yuthon_property/views/property_meter_water_views.xml b/yuthon_property/views/property_meter_water_views.xml
index d8df4af61..fde451a06 100644
--- a/yuthon_property/views/property_meter_water_views.xml
+++ b/yuthon_property/views/property_meter_water_views.xml
@@ -110,13 +110,12 @@
meter.water.line.tree
meter.water.line
-
+
-
+
diff --git a/yuthon_work_brand/views/hr_menus.xml b/yuthon_work_brand/views/hr_menus.xml
index 9ee30c71d..e045bfeea 100644
--- a/yuthon_work_brand/views/hr_menus.xml
+++ b/yuthon_work_brand/views/hr_menus.xml
@@ -673,7 +673,7 @@
name="个人基础信息"
parent="basic_information_board"
sequence="1"
- action="yuthon_hr_employee.action_server_my_employee"/>
+ action="yuthon_hr_employee.action_server_my_employee" />