添加功能

This commit is contained in:
李鹏宇
2026-02-02 17:23:39 +08:00
parent 9b3a0869aa
commit bfc6fe7ed5
6 changed files with 95 additions and 9 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="room_meeting_setting_sequence0" model="room.meeting.type">
<field name="name">党委会</field>
<field name="name">党总支</field>
</record>
<record id="room_meeting_setting_sequence1" model="room.meeting.type">
<field name="name">班子会</field>
+1
View File
@@ -56,6 +56,7 @@ class RoomBooking(models.Model):
other_company_id = fields.Many2one('res.partner', string="外部公司")
host = fields.Many2one('hr.employee', string="主持人")
stationed_group = fields.Boolean(string="派驻组")
recorder_ids = fields.Many2many('hr.employee', string='记录员')
other_company_user_ids = fields.Many2many('other.meet.employee', string="其他人员")
fleet_id = fields.Many2one('fleet.vehicle', string="车辆")
meeting_place = fields.Char(string="会议地点")
+2 -1
View File
@@ -202,7 +202,8 @@
</group>
<group>
<field name="room_users_ids" widget="many2many_tags" domain = "[('company_id', '=', company_id), ('name', '!=', 'Administrator')] if is_this_company else []" options="{'no_create': True}"/>
<field name="other_company_user_ids" widget="many2many_tags" readonly="0" options="{'no_create': True}"/>
<filed name="recorder_ids" widget="many2many_tags" domain="[('user_role_ids.name', 'ilike', '会议记录员')]"/>
<filed name="other_company_user_ids" widget="many2many_tags" readonly="0" options="{'no_create': True}"/>
<field name="partner_ids" widget="many2many_tags" force_save="1" invisible="1"/>
<field name="is_meeting" invisible="1"/>
<field name="is_notice"/>
+14 -1
View File
@@ -108,7 +108,20 @@ class IssueMeetingLine(models.Model):
issue_library_id = fields.Many2one('issue.library', string='议题')
issue_library_name = fields.Char(related='issue_library_id.name', string='议题')
employee_id = fields.Many2one('hr.employee', string='传达人')
attendees = fields.Char(string='列席人员')
designated_person_ids = fields.Many2many(
'hr.employee',
'issue_meeting_line_designated_person_rel'
'line_id',
'employee_id',
string='指定人员'
)
attendees_ids = fields.Many2many(
'hr.employee',
'issue_meeting_line_attendees_rel',
'line_id',
'employee_id',
string='列席人员'
)
is_sanda = fields.Boolean(string="三重一大")
decision_results = fields.Selection([('agree', '通过'), ('disagree', '重新上会'), ('rejected', '驳回')], string="决策结果")
decision_details = fields.Text(string="决策详情")
+74 -4
View File
@@ -491,24 +491,94 @@ class IssueLibrary(models.Model):
self.write({"issue_state": "cancel"})
def all_meeting_issue(self):
issue_active_ids = self.env["issue.library"].browse(self._context.get('active_ids', self._context.get('active_id')))
issue_active_ids = self.env["issue.library"].browse(
self._context.get('active_ids', self._context.get('active_id', []))
)
current_user = self.env.user
user_company_name = current_user.company_id.name if current_user.company_id else ""
for record in issue_active_ids:
if record.issue_state != 'will':
raise UserError("当前状态不允许上会")
raise UserError(
f"事项【{record.name or record.id}】状态为{record.issue_state},非待上会状态,不允许上会!")
issue_details = []
target_meeting_type_id = False
meeting_priority = [
('is_party', 'is_party_passed', None), # 党总支:动态匹配名称(集团本部=党总支/其他=党支委)
('is_class', 'is_class_passed', '班子'), # 班子会:匹配含「班子」的名称
('is_boss', 'is_boss_passed', '董事'), # 董事会:匹配含「董事」的名称
]
def get_all_sub_departments(department):
dept_ids = [department.id]
sub_depts = self.env['hr.department'].search([('parent_id', '=', department.id)])
for sub_dept in sub_depts:
dept_ids += get_all_sub_departments(sub_dept)
return dept_ids
all_dept_ids = get_all_sub_departments(self.department_id)
target_employees = self.env['hr.employee'].search([
('department_id', 'in', all_dept_ids),
('active', '=', True)
])
manager_employee = self.env['hr.employee'].search([
('id', 'in', target_employees.ids),
('user_role_id.name', '=', '部门经理')
], limit=1)
for issue in issue_active_ids:
issue_details.append((0, 0, {
'issue_library_id': issue.id,
'employee_id': manager_employee.id,
'designated_person_ids': [(6, 0, target_employees.ids)],
}))
form_id = self.env.ref("room.room_booking_view_form").id
if target_meeting_type_id:
continue
# 按「党→班子→董事」优先级匹配
for idx, (field_flag, field_passed, keyword) in enumerate(meeting_priority):
# 跳过未勾选的会议类型
if not getattr(issue, field_flag, False):
continue
passed_result = getattr(issue, field_passed, '')
# 逻辑:空/未通过 → 匹配对应会议类型;已通过 → 继续匹配下一级
if passed_result in (False, 'reject'):
if idx == 0:
if user_company_name == "集团本部":
party_meeting_name = "党总支"
else:
party_meeting_name = "党支委"
meeting_type = self.env['room.meeting.type'].search([
('name', 'ilike', party_meeting_name)
], limit=1)
else:
meeting_type = self.env['room.meeting.type'].search([
('name', 'ilike', keyword)
], limit=1)
if meeting_type:
target_meeting_type_id = meeting_type.id
break
elif passed_result == 'pass':
continue
host_role_id = meeting_type.host_id.id
host_employee = self.env['hr.employee'].search([
('user_role_ids', 'in', host_role_id),
], limit=1)
room_user_role_ids = meeting_type.room_users_ids.ids
room_employees = self.env['hr.employee'].search([
('user_role_ids', 'in', room_user_role_ids),
])
room_user_ids = room_employees.mapped('user_id.id')
form_id = self.env.ref("room.room_booking_view_form", raise_if_not_found=False)
return {
"type": "ir.actions.act_window",
"name": "批量上会",
"res_model": "room.booking",
"views": [[form_id, "form"]],
"views": [[form_id.id, "form"]],
"context": {
'default_is_issue': True,
'default_state': '申请人',
'default_host': host_employee.id,
'default_room_users_ids': [(6, 0, room_user_ids)],
'default_meeting_type_id': target_meeting_type_id,
'default_start_datetime': fields.Datetime.now() + timedelta(hours=8),
'default_issue_meeting_line_ids': issue_details,
}
+3 -2
View File
@@ -24,8 +24,9 @@
<tree editable="bottom">
<field name="meeting_booking_id" column_invisible="1"/>
<field name="issue_library_id"/>
<field name="employee_id" options="{'no_create': True}"/>
<field name="attendees"/>
<field name="employee_id" options="{'no_create': True}" domain="[('id', 'in', designated_person_ids)]"/>
<field name="attendees_ids" widget="many2many_tags" domain="[('id', 'in', designated_person_ids)]"/>
<field name="designated_person_ids" widget="many2many_tags" column_invisible="1"/>
<field name="is_sanda"/>
<field name="decision_results"/>
<field name="decision_details"/>