diff --git a/room/models/room_booking.py b/room/models/room_booking.py index 201fd36ea..8fea2e88b 100644 --- a/room/models/room_booking.py +++ b/room/models/room_booking.py @@ -35,8 +35,10 @@ class RoomBooking(models.Model): meeting_type = fields.Selection([('up', '线上'), ('down', '线下'), ('exterior', '外部')], default='down', string="会议形式", required=True) meeting_type_id = fields.Many2one('room.meeting.type', string="会议类型") - room_users_ids = fields.Many2many('res.users', string="参会人员", store=True) + room_users_ids = fields.Many2many(related='meeting_type_id.users_ids', string="出席人员") other_company_id = fields.Many2one('res.partner', string="外部公司") + host = fields.Many2one(related='meeting_type_id.host_user_id', string="主持人") + stationed_group = fields.Boolean(string="驻组参会") other_company_user_ids = fields.One2many(related="other_company_id.child_ids", string="其他人员") fleet_id = fields.Many2one('fleet.vehicle', string="车辆") diff --git a/room/models/room_meeting_type.py b/room/models/room_meeting_type.py index 7d8074eea..fbfab8e20 100644 --- a/room/models/room_meeting_type.py +++ b/room/models/room_meeting_type.py @@ -9,4 +9,27 @@ class RoomMeetingType(models.Model): sequence = fields.Char(string='序号', store=True) name = fields.Char(string='名字', required=True) - company_id = fields.Many2one('res.company', string="所属公司", index=True, default=lambda self: self.env.company) \ No newline at end of file + host_id = fields.Many2one('soong.user.role', string="主持人") + room_users_ids = fields.Many2many('soong.user.role', string="出席人员", store=True) + host_user_id = fields.Many2one('res.users', string="主持人", compute='_compute_host_user_id', store=True) + users_ids = fields.Many2many('res.users', string="出席人员", compute='_compute_users_ids', store=True) + company_id = fields.Many2one('res.company', string="所属公司", index=True, default=lambda self: self.env.company) + + @api.depends('host_id') + def _compute_host_user_id(self): + for record in self: + if record.host_id.personnel_ids: + record.host_user_id = record.host_id.personnel_ids[0].user_id.id + + @api.depends('room_users_ids', 'host_user_id') + def _compute_users_ids(self): + for record in self: + user_ids = set() + if record.host_user_id: + user_ids.add(record.host_user_id.id) + for role in record.room_users_ids: + for personnel in role.personnel_ids: + if personnel.user_id: + user_ids.add(personnel.user_id.id) + + record.users_ids = [(6, 0, list(user_ids))] diff --git a/room/views/room_booking_views.xml b/room/views/room_booking_views.xml index 9abccebc9..ad8100920 100644 --- a/room/views/room_booking_views.xml +++ b/room/views/room_booking_views.xml @@ -150,27 +150,40 @@ + + + + + + + + + + + - - - - - + + + + + + + diff --git a/room/views/room_meeting_type.xml b/room/views/room_meeting_type.xml index 893c3e86a..c8c5ea17a 100644 --- a/room/views/room_meeting_type.xml +++ b/room/views/room_meeting_type.xml @@ -7,6 +7,10 @@ + + + + diff --git a/soong_workflow/models/soong_note_setting.py b/soong_workflow/models/soong_note_setting.py index dda5b1d75..69c736fe7 100644 --- a/soong_workflow/models/soong_note_setting.py +++ b/soong_workflow/models/soong_note_setting.py @@ -6,4 +6,14 @@ class SoongNoteSetting(models.Model): _name = 'soong.note.setting' name = fields.Char(string="名称") - users_role_ids = fields.Many2many('soong.user.role', string='角色范围') \ No newline at end of file + user_group_ids = fields.Many2many('soong.user.role.group', string='用户组') + users_role_ids = fields.Many2many('soong.user.role', string='角色范围', compute='_compute_users_role_ids', store=True) + + @api.depends('user_group_ids.user_role_ids') + def _compute_users_role_ids(self): + for record in self: + all_role_ids = [] + for group in record.user_group_ids: + all_role_ids.extend(group.user_role_ids.ids) + unique_role_ids = list(set(all_role_ids)) + record.users_role_ids = [(6, 0, unique_role_ids)] \ No newline at end of file diff --git a/soong_workflow/views/soong_note_setting_views.xml b/soong_workflow/views/soong_note_setting_views.xml index f93bb54db..4d384bd31 100644 --- a/soong_workflow/views/soong_note_setting_views.xml +++ b/soong_workflow/views/soong_note_setting_views.xml @@ -6,7 +6,8 @@ - + + diff --git a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py index d27ae6c40..9202daf57 100644 --- a/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py +++ b/yuthon_hr_attendance/models/hr_attendance_detail_wechat.py @@ -287,7 +287,7 @@ class HrAttendanceDetail(models.Model): for user in user_obj: # 判断是否是微信用户 if user.oauth_uid and user.employee_ids.contract_id: - _logger.info("正在梳理考勤人员:{} id:{},全部人数:{},剩余人数:{},所属公司".format(user.name, user.id, total_users,remaining_users, user.employee_id.company_id.name)) + _logger.info("正在梳理考勤人员:{} id:{},全部人数:{},剩余人数:{},所属公司:{}".format(user.name, user.id, total_users,remaining_users, user.employee_ids.company_id.name)) remaining_users -= 1 # 查询当前用户区间内的所有打卡数据没有的创建 for current_date in self.divide_time_range_fixed(start_time, now_time): diff --git a/yuthon_issue/models/inherit_room_booking.py b/yuthon_issue/models/inherit_room_booking.py index 9f358c987..873e10fea 100644 --- a/yuthon_issue/models/inherit_room_booking.py +++ b/yuthon_issue/models/inherit_room_booking.py @@ -57,8 +57,9 @@ class IssueMeetingLine(models.Model): meeting_booking_id = fields.Many2one('room.booking', string='关联会议室') sequence = fields.Char(string='序号', store=True) 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='列席人员') - is_sanda = fields.Boolean(string='是否属于"三重一大"') + is_sanda = fields.Boolean(string="三重一大") decision_results = fields.Selection([('agree', '通过'), ('disagree', '未通过')], string="决策结果") decision_details = fields.Text(string="决策详情") diff --git a/yuthon_issue/models/issue_approval_decision.py b/yuthon_issue/models/issue_approval_decision.py index 7151a0258..1498efff6 100644 --- a/yuthon_issue/models/issue_approval_decision.py +++ b/yuthon_issue/models/issue_approval_decision.py @@ -17,18 +17,19 @@ class IssueApprovalDecision(models.Model): district_state = fields.Selection([('approval', '审'), ('decide', '决')], string="区国资局",) district_government = fields.Selection([('approval', '审'), ('decide', '决')], string="区政府",) district_party= fields.Selection([('approval', '审'), ('decide', '决')], string="区委组织部") - district_bureau = fields.Selection([('record', '备案'), ('approved', '核准'), ('record_approved', '备案、核准')], string='上级单位') department_id = fields.Many2one('hr.department', string="部门") management_matters = fields.Char(string='管理事项') - company_id = fields.Many2one('res.company', string="公司", default=lambda self: self.env.company) - scope = fields.Selection([('one', '一级区属国有企业'), ('two', '二级区属国有企业'), ('one_two', '一级、二级区属国有企业')], string='适用范围') + company_id = fields.Many2one('res.company', string="公司", default=lambda self: self._get_default_company()) + scope = fields.Selection([('one', '一级区属国有企业'), ('two', '二级区属国有企业'), ('one_two', '一级、二级区属国有企业')], string='适用范围', default='one') start_date = fields.Date(string="生效日期") end_date = fields.Date(string="失效日期") remarks = fields.Text(string='备注') - - issue_approval_id = fields.Many2one('issue.approval', string="关联议题审批") + def _get_default_company(self): + company = self.env['res.company'].search([('name', '=', '集团本部')], limit=1) + return company.id if company else False + @api.onchange('decision_type_id') def onchange_sequence(self): for seq in self: @@ -47,3 +48,11 @@ class IssueApprovalDecision(models.Model): if record.team_meet: record.board_meet = 'approval' + + def update_issue(self): + company = self.env['res.company'].search([('name', '=', '集团本部')], limit=1) + issue_active_ids = self.env["issue.approval.decision"].browse( + self._context.get('active_ids', self._context.get('active_id'))) + for record in issue_active_ids: + record.scope = 'one' + record.company_id = company.id diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py index 192b0c3a1..677bdf1c4 100644 --- a/yuthon_issue/models/issue_library.py +++ b/yuthon_issue/models/issue_library.py @@ -7,7 +7,7 @@ class IssueLibrary(models.Model): _name = "issue.library" _description = '议题库' _inherit = ['mail.thread.main.attachment', 'mail.activity.mixin'] - _rec_name = 'code' + _rec_name = 'name' name = fields.Char(string='议题事项') name_text = fields.Text(string='议题事项', compute='_compute_name', readonly=False) @@ -16,10 +16,13 @@ class IssueLibrary(models.Model): issue_state = fields.Selection([('draft', '待提交'), ('approval', '审批中'), ('on_approval', '已审批'), ('will', '待上会'), ('on_meet', '已上会'), ('cancel', '已取消')], default='draft', string="议题状态") - is_party = fields.Boolean(string="党支委会", default=False, compute='_compute_issue_library_line_ids', store=True) - is_class = fields.Boolean(string="班子会", default=False, compute='_compute_issue_library_line_ids', store=True) - is_boss = fields.Boolean(string="董事会", default=False, compute='_compute_issue_library_line_ids', store=True) - is_note = fields.Boolean(string="上级单位", default=False, compute='_compute_issue_library_line_ids', store=True) + is_party = fields.Boolean(string="党支委会", compute='_compute_issue_library_line_ids', store=True) + is_class = fields.Boolean(string="班子会", compute='_compute_issue_library_line_ids', store=True) + is_boss = fields.Boolean(string="董事会", compute='_compute_issue_library_line_ids', store=True) + is_note = fields.Boolean(string="上级单位", compute='_compute_issue_library_line_ids', store=True) + is_district_state = fields.Boolean(string="区国资局", compute='_compute_issue_library_line_ids', store=True) + is_district_government = fields.Boolean(string="区政府", compute='_compute_issue_library_line_ids', store=True) + is_district_party = fields.Boolean(string="区委组织部", compute='_compute_issue_library_line_ids', store=True) creart_datetime = fields.Date(string="创建日期", default=fields.Datetime.now) notice_documents_ids = fields.Many2many('ir.attachment', string='议题附件') issue_type_id = fields.Many2one('issue.type', string="议题类型") @@ -108,6 +111,41 @@ class IssueLibrary(models.Model): } } + def single_issue_pull(self): + # 检查当前记录状态是否允许提交 + if self.issue_state != 'draft': + raise UserError("当前状态不允许提交") + + form_id = self.env.ref("yuthon_issue.issue_library_approval_form").id + issue_decision_lines = [(0, 0, { + 'issue_library_id': self.id, + 'approval_decision_sequence': self.approval_decision_sequence, + 'is_party': self.is_party, + 'is_class': self.is_class, + 'is_boss': self.is_boss, + 'is_note': self.is_note, + 'employee_id': self.employee_id.id + })] + + issue_approval_id = self.env['issue.approval'].create({ + 'issue_approval_ids': issue_decision_lines, + 'name': self.name, + 'employee_id': self.employee_id.id, + }) + self.write({"issue_state": "approval"}) + self.issue_approval_id = issue_approval_id + return { + "type": "ir.actions.act_window", + "name": "提交审批", + "res_model": "issue.approval", + "views": [[form_id, "form"]], + "res_id": issue_approval_id.id, + "context": { + "id": issue_approval_id.id, + "is_issue": True, + } + } + def issue_cancel(self): self.write({"issue_state": "cancel"}) @@ -135,6 +173,26 @@ class IssueLibrary(models.Model): } } + def single_meeting_issue(self): + issue = self.env["issue.library"].browse(self.id) + if issue.state != 'will': + raise UserError("当前状态不允许上会") + self.write({"issue_state": "on_meet"}) + issue_details = [(0, 0, { + 'issue_library_id': issue.id, + })] + form_id = self.env.ref("room.room_booking_view_form").id + return { + "type": "ir.actions.act_window", + "name": "单个上会", + "res_model": "room.booking", + "views": [[form_id, "form"]], + "context": { + 'default_is_issue': True, + 'default_issue_meeting_line_ids': issue_details, + } + } + def approval_details(self): self.ensure_one() for record in self: @@ -155,7 +213,14 @@ class IssueLibrary(models.Model): line.is_party = bool(line.issue_library_line_ids.filtered('council')) line.is_class = bool(line.issue_library_line_ids.filtered('team_meet')) line.is_boss = bool(line.issue_library_line_ids.filtered('board_meet')) - line.is_note = bool(line.issue_library_line_ids.filtered('district_bureau')) + line.is_district_state = bool(line.issue_library_line_ids.filtered('district_state')) + line.is_district_government = bool(line.issue_library_line_ids.filtered('district_government')) + line.is_district_party = bool(line.issue_library_line_ids.filtered('district_party')) + line.is_note = any([ + bool(line.issue_library_line_ids.filtered(lambda rec: rec.issue_approval_decision_id.district_state)), + bool(line.issue_library_line_ids.filtered(lambda rec: rec.issue_approval_decision_id.district_government)), + bool(line.issue_library_line_ids.filtered(lambda rec: rec.issue_approval_decision_id.district_party)) + ]) def unlink(self): for i in self: @@ -197,14 +262,16 @@ class IssueLibrary(models.Model): class IssueLibraryLine(models.Model): _name = "issue.library.line" - _description = '决策清单' + _description = '决策清单明细' issue_library_id = fields.Many2one('issue.library') issue_approval_decision_id = fields.Many2one('issue.approval.decision', string="决策清单") council = fields.Selection(related='issue_approval_decision_id.council', string='党总委员会') team_meet = fields.Selection(related='issue_approval_decision_id.team_meet', string='经营班子会') board_meet = fields.Selection(related='issue_approval_decision_id.board_meet', string='董事会') - district_bureau = fields.Selection(related='issue_approval_decision_id.district_bureau', string='上级单位') + district_state = fields.Selection(related='issue_approval_decision_id.district_state', string="区国资局") + district_government = fields.Selection(related='issue_approval_decision_id.district_government', string="区政府") + district_party = fields.Selection(related='issue_approval_decision_id.district_party', string="区委组织部") ordinal = fields.Char(related='issue_approval_decision_id.sequence', string='序号') diff --git a/yuthon_issue/views/inherit_room_booking.xml b/yuthon_issue/views/inherit_room_booking.xml index 13545d3a0..f91db9f20 100644 --- a/yuthon_issue/views/inherit_room_booking.xml +++ b/yuthon_issue/views/inherit_room_booking.xml @@ -6,7 +6,7 @@ - + @@ -16,7 +16,7 @@ - + diff --git a/yuthon_issue/views/issue_approval_decision_views.xml b/yuthon_issue/views/issue_approval_decision_views.xml index aa13d19ec..fdc64eefe 100644 --- a/yuthon_issue/views/issue_approval_decision_views.xml +++ b/yuthon_issue/views/issue_approval_decision_views.xml @@ -16,7 +16,6 @@ - @@ -54,7 +53,11 @@ - + + + + + @@ -102,4 +105,11 @@ 'search_default_group_decision_type_id': True} + + 更新公司和适用范围 + + + code + action = model.update_issue() + diff --git a/yuthon_issue/views/issue_approval_views.xml b/yuthon_issue/views/issue_approval_views.xml index 9b9640ea7..835fd6661 100644 --- a/yuthon_issue/views/issue_approval_views.xml +++ b/yuthon_issue/views/issue_approval_views.xml @@ -47,17 +47,11 @@ - - - - - - - - - - - + + + + + diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml index 6c1f45747..64d25c0d4 100644 --- a/yuthon_issue/views/issue_library_views.xml +++ b/yuthon_issue/views/issue_library_views.xml @@ -9,19 +9,20 @@ decoration-success="issue_state == 'done'" decoration-muted="issue_state == 'cancel'">
-
- + + + -