# -*- coding: utf-8 -*- from odoo import api, fields, models from datetime import datetime, timedelta, date class IssueApproval(models.Model): _name = "issue.approval" _description = '议题申报' _inherit = ['soong.workflow.mixin', 'mail.thread.main.attachment', 'mail.activity.mixin'] _order = 'create_time desc' _rec_name = 'name' name = fields.Char(string='标题', required=True) code = fields.Char(string='编号', required=True, copy=False, default=lambda self: self.env['ir.sequence'].next_by_code('issue_approval_code')) create_time = fields.Date(string='创建日期', default=lambda self: fields.Date.today()) employee_id = fields.Many2one('hr.employee', string="经办人", default=lambda self: self.env.user.employee_id) department_id = fields.Many2one(related='employee_id.department_id', string="部门") company_id = fields.Many2one(related='employee_id.company_id', string="公司") user_id = fields.Many2one('res.users', string="经办人", default=lambda self: self.env.user) meeting_details = fields.Char(string="会议详情") job_id = fields.Many2one(related='employee_id.job_id', string="岗位") is_attend = fields.Boolean(string="是否上会", default=True) work_end = fields.Boolean(string="结束") issues_result = fields.Html(string="会议结果") issue_text = fields.Text(string="正文") documents_ids = fields.Many2many('ir.attachment', string='议题附件') issue_approval_ids = fields.One2many('issue.approval.line', 'issue_approval_id', string="关联议题", store=True) issue_display = fields.Text(string="议题事项") decision_display = fields.Text(string="决策清单") is_parent_unit = fields.Boolean(string="上级单位") active = fields.Boolean('Active', default=True, tracking=True) urgency_level = fields.Selection([('normal', '普件'), ('urgent', '急件'), ('emergency', '特急件')], string='紧急度', default='normal') employee_ids = fields.Many2many('hr.employee', string="当前经办人", compute='_compute_workflow') users_ids = fields.Many2many('res.users', string="当前用户", compute='_compute_workflow_users') approve_state = fields.Selection([("start", "草稿"), ("pending", "审批中"), ("end", "结束")], string="审批状态", compute='_compute_workflow') member_of_department = fields.Boolean("是否是本部门数据", compute='_compute_part_of_department', search='_search_part_of_department') @api.depends_context('uid', 'company') @api.depends('department_id') def _compute_part_of_department(self): # 检查当前用户是否属于管理员群组 is_manager = self.env.user.has_group('soong_workflow.group_soong_workflow_manager') if is_manager: # 管理员可以看到所有数据,全部标记为 True for record in self: record.member_of_department = True return user_employee = self._get_valid_employee_for_user() active_department = user_employee.department_id if active_department: department_ids = self.env['hr.department'].search([ ('id', 'child_of', active_department.id) ]).ids else: department_ids = [] for record in self: record.member_of_department = record.department_id.id in department_ids def _get_default_name_title(self): return self._description if self._description else self._name name_title = fields.Char(default=_get_default_name_title) is_company = fields.Boolean(string="本公司", default=True, compute='_compute_is_company',search='_search_part_of_company') @api.depends_context('uid', 'company') @api.depends('company_id') def _compute_is_company(self): active_company_ids = self.env.companies for employee in self: employee.is_company = employee.company_id in active_company_ids def _search_part_of_company(self, operator, value): company_ids = self.env.companies.ids if not value: operator = '!=' if operator == '=' else '=' if operator == '=': return [('company_id', 'in', company_ids)] else: return [('company_id', 'not in', company_ids)] def _get_valid_employee_for_user(self): user = self.env.user employee = user.employee_ids if not employee: user_employees = user.employee_id.sudo().search([ ('user_id', '=', user.id) ]) employee = user_employees.filtered(lambda r: r.company_id == user.company_id) or user_employees[:1] return employee def _search_part_of_department(self, operator, value): # 检查当前用户是否属于管理员群组 is_manager = self.env.user.has_group('soong_workflow.group_soong_workflow_manager') if is_manager: # 管理员搜索时返回所有数据(domain 为空) if (operator == '=' and value) or (operator == '!=' and not value): return [] # 如果搜索条件是 False,则返回空数据 elif (operator == '=' and not value) or (operator == '!=' and value): return [('id', '=', False)] user_employee = self._get_valid_employee_for_user() active_department = user_employee.department_id if active_department: base_domain = [('department_id', 'child_of', active_department.id)] else: base_domain = [('department_id', '=', False)] return (['!'] if operator == '!=' else []) + base_domain @api.depends('code') def _compute_workflow(self): for record in self: record.employee_ids = False record.approve_state = False workflow = self.env['soong.workflow.record'].search( [('code', '=', record.code)], limit=1 ) if workflow: record.employee_ids = workflow.employee_ids record.approve_state = workflow.approve_state @api.depends('employee_ids') def _compute_workflow_users(self): for record in self: if record.employee_ids: user_ids = record.employee_ids.mapped('user_id') record.users_ids = user_ids else: record.users_ids = False @api.constrains("issue_approval_ids") def _check_issue_approval_ids(self): for rec in self: if rec.issue_approval_ids: issue_names = [] for issue_library in rec.issue_approval_ids: name_val = issue_library.issue_library_id.name or "" issue_names.append(str(name_val)) decision_sequences = [] for issue_library in rec.issue_approval_ids: seq_val = issue_library.approval_decision_sequence if isinstance(seq_val, bool): decision_sequences.append("是" if seq_val else "否") else: decision_sequences.append(str(seq_val or "")) rec.issue_display = "\n".join(issue_names) rec.decision_display = "\n".join(decision_sequences) else: rec.issue_display = "" def end_approval(self): for rec in self: if rec.issue_approval_ids: for issue_library in rec.issue_approval_ids: issue_library.issue_library_id.write({'issue_state': 'to_approval', }) if issue_library.issue_library_id.is_party == True: issue_library.issue_library_id.write({'is_push_party': True}) if issue_library.issue_library_id.is_class == True: issue_library.issue_library_id.write({'is_push_class': True}) if issue_library.issue_library_id.is_boss == True: issue_library.issue_library_id.write({'is_push_boss': True}) if not issue_library.issue_library_id.issue_approval_id: issue_library.issue_library_id.issue_approval_id = rec.id if rec.code: exist_line = self.env['issue.library.approval.line'].search_count([ ('issue_library_id', '=', issue_library.issue_library_id.id), ('code', '=', rec.code), ]) if not exist_line: self.env['issue.library.approval.line'].create({ 'issue_library_id': issue_library.issue_library_id.id, 'code': rec.code, 'approval_date': fields.Datetime.now() + timedelta(hours=8), }) class IssueApprovalLine(models.Model): _name = 'issue.approval.line' _description = '关联议题明细' issue_approval_id = fields.Many2one('issue.approval', string='议题审批') issue_library_id = fields.Many2one('issue.library', string='议题事项') employee_id = fields.Many2one(related='issue_library_id.employee_id', string='创建人') approval_decision_sequence = fields.Char(string='决策清单') is_party = fields.Boolean(related='issue_library_id.is_party', string="党支部会") is_class = fields.Boolean(related='issue_library_id.is_class', string="班子会") is_boss = fields.Boolean(related='issue_library_id.is_boss', string="董事会") is_note = fields.Boolean(related='issue_library_id.is_note', string="上级单位") def open_record(self): self.ensure_one() is_modify = False if self.issue_approval_id and self.issue_approval_id.state == '申请人': if self.employee_id and self.issue_library_id and self.employee_id == self.issue_library_id.employee_id: is_modify = True if self.issue_library_id: self.issue_library_id.write({'is_modify': is_modify}) return { 'type': 'ir.actions.act_window', 'res_model': 'issue.library', 'res_id': self.issue_library_id.id, 'view_mode': 'form', 'target': 'current', } class IssueRoomApproval(models.Model): _name = 'issue.room.approval'