This commit is contained in:
pengyuthon
2025-10-19 23:46:09 +08:00
parent e2f53c280e
commit 323eb387ef
14 changed files with 227 additions and 132 deletions
+1
View File
@@ -67,6 +67,7 @@
'wizard/electric_water_wizard_views.xml',
'wizard/meter_price_wizard.xml',
'wizard/property_statements_wizard_views.xml',
'wizard/utility_meter_wizard_views.xml',
'views/menuitem.xml',
],
'assets': {
@@ -227,6 +227,7 @@ class MeterArchivesLine(models.Model):
last_read = fields.Float(string="上次读数", store=True, group_operator=None, compute="_compute_last")
meter_date = fields.Date(string="任务日期")
meter_date_month = fields.Char(string="任务日期月份", compute="_compute_meter_date_month", store=True, index=True,)
def _compute_meter_date_month(self):
for rec in self:
if rec.meter_date:
+7 -19
View File
@@ -176,32 +176,18 @@ class MeterWaterLine(models.Model):
_order = "number asc, sequence asc"
# name = fields.Char(string='仪表编号')
water_id = fields.Many2one(
"property.meter.water", string="水表库", required=True, ondelete="cascade"
)
water_id = fields.Many2one("property.meter.water", string="水表库", required=True, ondelete="cascade")
initial_value = fields.Float(string="初始值")
number = fields.Integer(
related="epitope_values_id.sequence", string="序号", store=True
)
number = fields.Integer(related="epitope_values_id.sequence", string="序号", store=True)
sequence = fields.Integer(related="water_id.sequence1", string="表序号", store=True)
epitope_values_id = fields.Many2one("yuthon.epitope.values", string="表位置")
lessee_id = fields.Many2one("property.tenant.information", string="承租方")
yuthon_property_ids = fields.Many2many("yuthon.property", string="物业信息")
last_meter = fields.Date(string="上次抄表日期", compute="_compute_last")
last_dosage = fields.Float(
string="上次用量", store=True, group_operator=None, compute="_compute_last"
)
last_read = fields.Float(
string="上次读数", group_operator=None, compute="_compute_last"
)
last_dosage = fields.Float(string="上次用量", store=True, group_operator=None, compute="_compute_last")
last_read = fields.Float(string="上次读数", group_operator=None, compute="_compute_last")
meter_date = fields.Date(string="任务日期")
meter_date_month = fields.Char(
string="任务日期月份",
compute="_compute_meter_date_month",
store=True,
index=True,
)
meter_date_month = fields.Char(string="任务日期月份", compute="_compute_meter_date_month", store=True, index=True)
current_meter = fields.Float(string="本次用量", group_operator=None, compute="_compute_current_meter")
current_read = fields.Float(string='本次读数', group_operator=None)
unit_number = fields.Char(string='单元编号/用途')
@@ -336,3 +322,5 @@ class MeterWaterLine(models.Model):
"default_water_ids": water_ids.ids,
}
}
+71 -18
View File
@@ -190,25 +190,56 @@ class YuthonProperty(models.Model):
'company_id': False,
})
# 物业关联电表按钮
def add_archives_meter_button(self):
"""
关联水电表按钮
:return:
"""
return {
'name': '物业关联电表弹窗',
'type': 'ir.actions.act_window',
'res_model': 'utility.meter.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_property_id': self.id,
'default_meter_type': 'archives',
}
}
@api.onchange('energy_meter_ids')
def _onchange_energy_meter_ids(self):
if not hasattr(self.id, 'origin') or not self.id.origin:
return
target_property_id = self.id.origin
meter_model = self.env['property.meter.archives']
related_meters = meter_model.search([
('yuthon_property_ids', 'in', [target_property_id])
])
if related_meters:
related_meters.write({
'yuthon_property_ids': [(6, 0, [])]
})
for rec in self.energy_meter_ids:
meter_id = meter_model.browse(rec.property_meter_archives_id.id)
meter_id.write({
'yuthon_property_ids': [(6, 0, [target_property_id])]
})
# 物业关联水表按钮
def add_water_meter_button(self):
return {
'name': '物业关联水表弹窗',
'type': 'ir.actions.act_window',
'res_model': 'utility.meter.wizard',
'view_mode': 'form',
'target': 'new',
'context': {
'default_property_id': self.id,
'default_meter_type': 'water',
}
}
# @api.onchange('energy_meter_ids')
# def _onchange_energy_meter_ids(self):
# if not hasattr(self.id, 'origin') or not self.id.origin:
# return
# target_property_id = self.id.origin
# meter_model = self.env['property.meter.archives']
# related_meters = meter_model.search([
# ('yuthon_property_ids', 'in', [target_property_id])
# ])
# if related_meters:
# related_meters.write({
# 'yuthon_property_ids': [(6, 0, [])]
# })
# for rec in self.energy_meter_ids:
# meter_id = meter_model.browse(rec.property_meter_archives_id.id)
# meter_id.write({
# 'yuthon_property_ids': [(6, 0, [target_property_id])]
# })
@api.onchange('water_meter_ids')
def _onchange_water_meter_idss(self):
@@ -552,6 +583,17 @@ class YuthonPropertyWater(models.Model):
epitope_values_id = fields.Many2one(related='property_meter_water_id.epitope_values_id', string="位置")
yuthon_property_id = fields.Many2one('yuthon.property', string="物业管理")
# 水表跳转
def detail(self):
return {
"type": "ir.actions.act_window",
"name": "水表库",
"res_model": "property.meter.water",
"res_id": self.property_meter_water_id.id,
"view_mode": "form",
"target": "new"
}
class YuthonPropertyEnergy(models.Model):
_name = 'yuthon.property.energy'
@@ -565,6 +607,17 @@ class YuthonPropertyEnergy(models.Model):
epitope_values_id = fields.Many2one(related='property_meter_archives_id.epitope_values_id', string="位置")
yuthon_property_id = fields.Many2one('yuthon.property', string="物业管理")
# 水表跳转
def detail(self):
return {
"type": "ir.actions.act_window",
"name": "电表库",
"res_model": "property.meter.archives",
"res_id": self.property_meter_archives_id.id,
"view_mode": "form",
"target": "new"
}
class TitleInformationLine(models.Model):
_name = 'title.information.line'
+2 -1
View File
@@ -100,4 +100,5 @@ access_receivable_modify_line, receivable.modify.line,model_receivable_modify_li
access_meter_archives_line, meter.archives.line,model_meter_archives_line,base.group_user,1,1,1,1
access_meter_water_line, meter.water.line,model_meter_water_line,base.group_user,1,1,1,1
access_yuthon_epitope_values, yuthon.epitope.values,model_yuthon_epitope_values,base.group_user,1,1,1,1
access_task_push_wizard,task.push.wizard,model_task_push_wizard,base.group_user,1,1,1,1
access_task_push_wizard,task.push.wizard,model_task_push_wizard,base.group_user,1,1,1,1
access_utility_meter_wizard,utility.meter.wizard,model_utility_meter_wizard,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
100 access_yuthon_epitope_values yuthon.epitope.values model_yuthon_epitope_values base.group_user 1 1 1 1
101 access_task_push_wizard task.push.wizard model_task_push_wizard base.group_user 1 1 1 1
102 access_utility_meter_wizard utility.meter.wizard model_utility_meter_wizard base.group_user 1 1 1 1
103
104
@@ -40,7 +40,6 @@
<field name="name"/>
<field name="unit_number"/>
<field name="type"/>
<field name="lessee_id" options="{'no_create': True}" />
<field name="epitope_values_id" domain="[('type', '=', 'ammeter')]" options="{'no_open': True}"/>
<field name="gauge_magnification"/>
<field name="maximum_count"/>
@@ -59,7 +58,6 @@
<tree editable="bottom">
<field name="archives_id" options="{'no_open': True}"/>
<field name="epitope_values_id" domain="[('type', '=', 'ammeter')]" options="{'no_open': True}"/>
<field name="lessee_id" options="{'no_create': True, 'no_open': True}"/>
<field name="yuthon_property_ids" string="物业信息" widget="many2many_tags" options="{'no_open': True}"/>
<field name="last_meter" />
<field name="last_dosage"/>
+65 -60
View File
@@ -116,7 +116,6 @@
<page string="产权信息" name="information_info">
<field name="title_information_ids">
<tree editable="bottom">
<button name="message_record" string="详情" type="object" class="btn-primary"/>
<field name="yuthon_property_id" column_invisible="1"/>
<field name="property_message_id" options="{'no_open': True}"/>
<field name="owner_id" options="{'no_open': True}"/>
@@ -125,6 +124,7 @@
<field name="registered_id" options="{'no_open': True}"/>
<field name="start_time"/>
<field name="end_date"/>
<button name="message_record" string="详情" type="object" class="btn-primary"/>
</tree>
</field>
</page>
@@ -145,45 +145,46 @@
</tree>
</field>
</page>
<page string="招商信息">
<group>
<group>
<field name="ame"/>
</group>
<group>
<field name="decoration_type"/>
</group>
</group>
</page>
<page string="其他信息">
<group>
<group>
<field name="remark"/>
<field name="is_confirm_authorization"/>
<field name="is_handle_land"/>
</group>
<group>
<field name="vr_link"/>
<field name="is_hvac"/>
</group>
</group>
</page>
<page string="评估">
<field name="assessment_ids">
<tree editable="bottom">
<field name="yuthon_property_id" column_invisible="1"/>
<field name="name"/>
</tree>
</field>
</page>
<page string="维修">
<field name="repair_ids">
<tree editable="bottom">
<field name="yuthon_property_id" column_invisible="1"/>
<field name="name"/>
</tree>
</field>
</page>
<!-- 暂时注释 -->
<!-- <page string="招商信息">-->
<!-- <group>-->
<!-- <group>-->
<!-- <field name="ame"/>-->
<!-- </group>-->
<!-- <group>-->
<!-- <field name="decoration_type"/>-->
<!-- </group>-->
<!-- </group>-->
<!-- </page>-->
<!-- <page string="其他信息">-->
<!-- <group>-->
<!-- <group>-->
<!-- <field name="remark"/>-->
<!-- <field name="is_confirm_authorization"/>-->
<!-- <field name="is_handle_land"/>-->
<!-- </group>-->
<!-- <group>-->
<!-- <field name="vr_link"/>-->
<!-- <field name="is_hvac"/>-->
<!-- </group>-->
<!-- </group>-->
<!-- </page>-->
<!-- <page string="评估">-->
<!-- <field name="assessment_ids">-->
<!-- <tree editable="bottom">-->
<!-- <field name="yuthon_property_id" column_invisible="1"/>-->
<!-- <field name="name"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </page>-->
<!-- <page string="维修">-->
<!-- <field name="repair_ids">-->
<!-- <tree editable="bottom">-->
<!-- <field name="yuthon_property_id" column_invisible="1"/>-->
<!-- <field name="name"/>-->
<!-- </tree>-->
<!-- </field>-->
<!-- </page>-->
<page string="安全生产">
<field name="produce_ids">
<tree editable="bottom">
@@ -240,21 +241,9 @@
<page string="被合并信息" invisible="not is_done_merge">
<field name="property_merge_approval_id"/>
</page>
<page string="水表列表" invisible="is_meter == False">
<field name="water_meter_ids">
<tree editable="bottom">
<field name="yuthon_property_id" column_invisible="1"/>
<field name="property_meter_water_id" options="{'no_open': True}"/>
<field name="rate"/>
<field name="standard_id" options="{'no_open': True}"/>
<field name="installation_date"/>
<field name="demolition_date"/>
<field name="epitope_values_id"/>
</tree>
</field>
</page>
<page string="电表列表" invisible="is_electricity_meter == False">
<field name="energy_meter_ids">
<button name="add_archives_meter_button" type="object" class="btn btn-success" string="关联电表"/>
<field name="energy_meter_ids" readonly="1">
<tree editable="bottom">
<field name="yuthon_property_id" column_invisible="1"/>
<field name="property_meter_archives_id" options="{'no_open': True}"/>
@@ -263,17 +252,33 @@
<field name="installation_date"/>
<field name="demolition_date"/>
<field name="epitope_values_id"/>
<button name="detail" type="object" class="btn btn-secondary" string="详情"/>
</tree>
</field>
</page>
<page string="水表列表" invisible="is_meter == False">
<button name="add_water_meter_button" type="object" class="btn btn-success" string="关联水表"/>
<field name="water_meter_ids" readonly="1">
<tree editable="bottom">
<field name="yuthon_property_id" column_invisible="1"/>
<field name="property_meter_water_id" options="{'no_open': True}"/>
<field name="rate"/>
<field name="standard_id" options="{'no_open': True}"/>
<field name="installation_date"/>
<field name="demolition_date"/>
<field name="epitope_values_id"/>
<button name="detail" type="object" class="btn btn-secondary" string="详情"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" groups="base.group_user"
options="{'post_refresh': 'recipients'}"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div>
<!-- <div class="oe_chatter">-->
<!-- <field name="message_follower_ids" groups="base.group_user"-->
<!-- options="{'post_refresh': 'recipients'}"/>-->
<!-- <field name="activity_ids"/>-->
<!-- <field name="message_ids"/>-->
<!-- </div>-->
</form>
</field>
</record>
+1
View File
@@ -10,3 +10,4 @@ from . import water_price_wizard
from . import initialize_wizard
from . import electric_water_wizard
from . import task_push_wizard
from . import utility_meter_wizard
@@ -0,0 +1,33 @@
# -*- 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 UtilityMeterWizard(models.TransientModel):
_name = 'utility.meter.wizard'
_description = '物业关联水电表弹窗'
property_id = fields.Many2one('yuthon.property', string="物业信息")
meter_type = fields.Selection([('archives', '电表'), ('water', '水表')], string="表类型")
epitope_values_archives_id = fields.Many2one("yuthon.epitope.values", string="电表位置")
epitope_values_water_id = fields.Many2one("yuthon.epitope.values", string="水表位置")
archives_ids = fields.Many2many('property.meter.archives', string="电表库")
water_ids = fields.Many2many('property.meter.water', string="水表库")
def confirm(self):
if self.meter_type == 'archives':
for archives in self.archives_ids:
archives.yuthon_property_ids |= self.property_id
# self.archives_ids.write({'yuthon_property_ids': [(4, self.property_id.id)]})
if self.meter_type == 'water':
for water in self.water_ids:
# 使用 |= 操作符来追加到 Many2many 字段
water.yuthon_property_ids |= self.property_id
# self.water_ids.write({'yuthon_property_ids': [(4, self.property_id.id)]})
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="utility_meter_wizard_form" model="ir.ui.view">
<field name="name">utility.meter.wizard.form</field>
<field name="model">utility.meter.wizard</field>
<field name="arch" type="xml">
<form sting="物业关联水电表">
<group>
<field name="property_id" invisible="1"/>
<field name="meter_type" invisible="1"/>
<field name="epitope_values_archives_id" domain="[('type', '=', 'ammeter')]" invisible="meter_type == 'water'" string="电表位置"/>
<field name="archives_ids" domain="[('epitope_values_id', '=', epitope_values_archives_id)]" invisible="meter_type == 'water'" widget="many2many_tags"/>
<field name="epitope_values_water_id" domain="[('type', '=', 'watermeter')]" invisible="meter_type == 'archives'" string="水表位置"/>
<field name="water_ids" domain="[('epitope_values_id', '=', epitope_values_water_id)]" invisible="meter_type == 'archives'" widget="many2many_tags"/>
</group>
<footer>
<button name="confirm" string="确定" type="object" class="oe_highlight"/>
<button string="取消" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
</odoo>
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id ="inherit_property_meter_archives_form" model="ir.ui.view">
<field name="name">inherit.property.meter.archives.form</field>
<field name="model">property.meter.archives</field>
<field name="inherit_id" ref="yuthon_property.property_meter_archives_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='yuthon_property_ids']" position="after">
<field name="contract_id"/>
</xpath>
</field>
</record>
<!-- <record id ="inherit_property_meter_archives_form" model="ir.ui.view">-->
<!-- <field name="name">inherit.property.meter.archives.form</field>-->
<!-- <field name="model">property.meter.archives</field>-->
<!-- <field name="inherit_id" ref="yuthon_property.property_meter_archives_form"/>-->
<!-- <field name="arch" type="xml">-->
<!-- <xpath expr="//field[@name='yuthon_property_ids']" position="after">-->
<!-- <field name="contract_id"/>-->
<!-- </xpath>-->
<!-- </field>-->
<!-- </record>-->
<record id="inherit_property_meter_water_form" model="ir.ui.view">
<field name="name">inherit.property.meter.water.form</field>
<field name="model">property.meter.water</field>
@@ -285,11 +285,11 @@
parent="yuthon_property.yuthon_property_meter_menu"
action="yuthon_property.view_yuthon_epitope_values_action"/>
<menuitem id="yuthon_property_water_list"
sequence="30"
name="水费列表"
parent="yuthon_property.yuthon_property_fee_management"
action="view_property_water_list_action"/>
<!-- <menuitem id="yuthon_property_water_list"-->
<!-- sequence="30"-->
<!-- name="水费列表"-->
<!-- parent="yuthon_property.yuthon_property_fee_management"-->
<!-- action="view_property_water_list_action"/>-->
<menuitem id="yuthon_property_deposit_list"
sequence="40"
name="押金列表"
+5 -16
View File
@@ -131,10 +131,7 @@ class YuthonWillTask(models.Model):
hour_from = float(task.request_hour_from)
start_hour = int(hour_from)
start_minute = int((hour_from - start_hour) * 60)
start_datetime = datetime.combine(
fields.Date.from_string(task.start_date),
time(start_hour, start_minute)
) + timedelta(hours=8)
start_datetime = datetime.combine(fields.Date.from_string(task.start_date), time(start_hour, start_minute))
if task.request_hour_to:
hour_to = float(task.request_hour_to)
end_hour = int(hour_to)
@@ -146,16 +143,14 @@ class YuthonWillTask(models.Model):
if now > end_datetime:
task.write({'task_state': 'done'})
continue
_logger.info("定时任务执行中")
_logger.info(f"判断前 now:{now} --- start:{start_datetime}")
_logger.info(f"日程消息提醒定时任务判断\n当前时间:{now} --- 任务开始时间:{start_datetime}")
if now <= start_datetime:
if task.task_time_ids:
for task_time in task.task_time_ids:
duration = self._compute_duration(task_time)
trigger_time = now + duration
if (trigger_time.day == start_datetime.day and
trigger_time.hour == start_datetime.hour and
trigger_time.minute == start_datetime.minute):
_logger.info(f"判断可否发送消息\n任务天:-{trigger_time.day}时:-{trigger_time.hour}分:-{trigger_time.minute}\n当前天:-{start_datetime.day}时:-{start_datetime.hour}分:-{start_datetime.minute}")
if (trigger_time.day == start_datetime.day and trigger_time.hour == start_datetime.hour and trigger_time.minute == start_datetime.minute):
task.add_comment()
def _compute_duration(self, task_time):
@@ -176,18 +171,12 @@ class YuthonWillTask(models.Model):
raise UserError("请同步{}的企业微信".format(employee_id.name))
url = f'http:://oa.thtzjt.com/webh5#/journey?id={self.id}'
data_name = "事项名称: " + self.name + '\n'
# data_start_time = '开始时间:' + str(self.start_time + timedelta(hours=8)) + '\n'
data_user_ids = '参与人: ' + ', '.join(self.employee_ids.mapped('name')) + '\n'
data_employee_id = ('司机:' + ', '.join(self.employee_ids2.mapped('name')) + '\n') if self.employee_ids2 else ''
data_nota = ('备注:' + self.remarks) if self.remarks else ('') + '\n'
# data = data_name + data_start_time + data_user_ids + data_nota + data_employee_id
data = data_name + data_user_ids + data_nota + data_employee_id
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id=employee_id.wecom_userid,
title="日程事项提醒", description=data,
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='task', user_id=employee_id.wecom_userid,title="日程事项提醒", description=data,
url=url, btntxt="详细信息")
# for record in self:
# partner_ids = record.employee_ids.user_id.partner_id.ids
# record.with_context(lang=record.env.lang)._message_auto_subscribe_notify(partner_ids,'yuthon_will_task.mail_action_yuthon_will_task_add_comment')
def button_add_comment(self):
self.add_comment()
+1 -1
View File
@@ -783,7 +783,7 @@
sequence="5"/>
<menuitem id="yuthon_accounts_receivable_menu"
sequence="1"
name="应收账单(明细)"
name="应收账单(明细)"
parent="yuthon_financial_management_menu"
action="yuthon_property_approval.property_accounts_receivable_action"/>
<menuitem