This commit is contained in:
李鹏宇
2026-02-02 18:58:10 +08:00
9 changed files with 109 additions and 17 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>
+19 -2
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="会议地点")
@@ -91,8 +92,24 @@ class RoomBooking(models.Model):
@api.onchange('meeting_type_id')
def _onchange_meeting_type_id(self):
if self.meeting_type_id:
self.room_users_ids = self.meeting_type_id.users_ids
self.host = self.meeting_type_id.host_user_id.id if self.meeting_type_id.host_user_id else False
host_role_id = self.meeting_type_id.host_id.id
host_employee = self.env['hr.employee'].search([
'|',
('user_role_ids', 'in', host_role_id),
('user_role_id', '=', host_role_id),
('company_id', '=', self.meeting_type_id.company_id.id)
], limit=1)
room_user_role_ids = self.meeting_type_id.room_users_ids.ids
room_employees = self.env['hr.employee'].search([
'|',
('user_role_ids', 'in', room_user_role_ids),
('user_role_id', 'in', room_user_role_ids),
('id', '!=', host_employee.id),
('company_id', '=', self.meeting_type_id.company_id.id)
])
room_user_ids = room_employees.mapped('user_id.id')
self.host = host_employee.id
self.room_users_ids = [(6, 0, room_user_ids)]
else:
self.room_users_ids = [(5, 0, 0)]
self.host = False
+1
View File
@@ -202,6 +202,7 @@
</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="recorder_ids" widget="many2many_tags" domain="[('user_role_ids.name', 'ilike', '会议记录员')]"/>
<field 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"/>
+2 -5
View File
@@ -115,8 +115,5 @@ class CustomerPortal(portal.CustomerPortal):
@http.route('/phone/vacation/self/status', type='http', auth="none", csrf=False, cors='*')
def phone_vacation_self_status(self, **kw):
record_id = request.env['yuthon.vacation.reports'].sudo().search([('id', '=', kw.get('id'))])
if record_id.is_abnormal:
return json.dumps({'code': 500, 'message': '考勤异常,请先核对考勤记录'})
else:
record_id.write({'vacation_state': 'confirmed'})
return json.dumps({'code': 200, 'message': 'OK'})
record_id.write({'vacation_state': 'confirmed'})
return json.dumps({'code': 200, 'message': 'OK'})
@@ -47,6 +47,9 @@ class CardApprovals(models.Model):
], limit=1)
if vacation_report:
self.number_cards_replaced = vacation_report.number_card
else:
self.number_cards_replaced = 0
@api.constrains("users_id")
def _check_user(self):
@@ -424,7 +424,7 @@ class OvertimeApprovals(models.Model):
if rec.duration == 0:
rec.name = f"{rec.users_id.name}加班 {start_time_str}-{end_time_str}"
else:
rec.name = f"{rec.users_id.name}加班{rec.duration}小时 {start_time_str}-{end_time_str}"
rec.name = f"{rec.users_id.name}加班{start_time_str}-{end_time_str},共{rec.duration}小时 "
@api.depends('start_time', 'end_time')
def _compute_overtime_type(self):
+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="决策详情")
+65 -5
View File
@@ -20,7 +20,7 @@ class IssueLibrary(models.Model):
is_invisible_workflow = fields.Boolean(string="流程隐藏的判断")
code = fields.Char(string='编号', required=True, copy=False,
default=lambda self: self.env['ir.sequence'].next_by_code('issue_library_code'))
issue_state = fields.Selection([('draft', '待申报'), ('to_approval', '待审批'), ('approval', '审批中'), ('on_approval', '已审批'),
issue_state = fields.Selection([('draft', '待申报'), ('to_draft', '申报中'), ('to_approval', '待上会审批'), ('approval', '上会审批中'), ('on_approval', '已上会审批'),
('will', '待上会'), ('on_meet', '已上会'), ('cancel', '已取消')],
default='draft', string="议题状态")
is_party = fields.Boolean(string="党总支", store=True)
@@ -491,24 +491,83 @@ 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
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_meeting_type_id': target_meeting_type_id,
'default_start_datetime': fields.Datetime.now() + timedelta(hours=8),
'default_issue_meeting_line_ids': issue_details,
}
@@ -540,6 +599,7 @@ class IssueLibrary(models.Model):
if not record.issue_approval_id:
raise UserError('请提交审批后查看')
form_id = self.env.ref("yuthon_issue.issue_library_approval_form").id
record.issue_state = 'to_draft'
return{
"type": "ir.actions.act_window",
"name": "审批详情",
+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"/>