diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py
index 1cab37a02..17f89cf26 100644
--- a/soong_workflow/models/soong_workflow_mixin.py
+++ b/soong_workflow/models/soong_workflow_mixin.py
@@ -989,7 +989,7 @@ class SoongWorkflowMixin(models.AbstractModel):
id_el = etree.Element("field")
id_el.set("name", "log_ids")
id_el.set("invisible", "1")
- invisible += "or not is_end"
+ invisible += " or not is_end"
if button.name == "退回":
btn_exec_action_el.set("class", "btn btn-return")
id_el = etree.Element("field")
diff --git a/yuthon_contract/models/inherit_hr_contract.py b/yuthon_contract/models/inherit_hr_contract.py
index 60922c293..0d979c484 100644
--- a/yuthon_contract/models/inherit_hr_contract.py
+++ b/yuthon_contract/models/inherit_hr_contract.py
@@ -301,11 +301,6 @@ class HrContract(models.Model):
else: # operator == '!='
return [("company_id", "not in", company_ids)]
- # @api.onchange('resource_calendar_id')
- # def _onchange_resource_calendar_id(self):
- # if self.resource_calendar_id:
- # self.employee_id.sudo().write({'resource_calendar_id': self.resource_calendar_id.id})
-
@api.depends("contract_type_id")
def _compute_simplified_name(self):
for record in self:
@@ -322,17 +317,21 @@ class HrContract(models.Model):
@api.depends("contract_type_id")
def _compute_name(self):
for record in self:
+ has_copy_suffix = "(副本)" in (record.name or "")
if record.contract_type_id and record.employee_id:
- record.name = (
- record.employee_id.name + record.contract_type_id.name + "合同"
- )
+ new_name = record.employee_id.name + record.contract_type_id.name + "合同"
else:
- record.name = " "
+ new_name = " "
+
+ if has_copy_suffix:
+ record.name = new_name + "(副本)"
+ else:
+ record.name = new_name
+
if record.contract_type_id:
- if record.contract_type_id.name == "实习协议":
- record.is_internship = True
- else:
- record.is_internship = False
+ record.is_internship = record.contract_type_id.name == "实习协议"
+ else:
+ record.is_internship = False
def action_hr_contract(self):
return {
diff --git a/yuthon_issue/models/issue_library.py b/yuthon_issue/models/issue_library.py
index 7e96a3df7..aa524a9a6 100644
--- a/yuthon_issue/models/issue_library.py
+++ b/yuthon_issue/models/issue_library.py
@@ -592,9 +592,67 @@ class IssueLibrary(models.Model):
issue = self.env["issue.library"].browse(self.id)
if issue.issue_state != 'will':
raise UserError("当前状态不允许上会")
- issue_details = [(0, 0, {
- 'issue_library_id': issue.id,
- })]
+ current_user = self.env.user
+ user_company_name = current_user.company_id.name if current_user.company_id else ""
+ 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 self:
+ issue_details.append((0, 0, {
+ 'issue_library_id': issue.id,
+ 'employee_id': manager_employee.id,
+ 'designated_person_ids': [(6, 0, target_employees.ids)],
+ }))
+ 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").id
return {
"type": "ir.actions.act_window",
@@ -604,6 +662,8 @@ class IssueLibrary(models.Model):
"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,
}
}
diff --git a/yuthon_issue/views/issue_library_views.xml b/yuthon_issue/views/issue_library_views.xml
index d1e818288..cb36bec32 100644
--- a/yuthon_issue/views/issue_library_views.xml
+++ b/yuthon_issue/views/issue_library_views.xml
@@ -341,6 +341,7 @@
+
@@ -500,6 +501,7 @@
+
@@ -647,6 +649,7 @@
+