Merge pull request !11996 from 李鹏宇/dev
This commit is contained in:
李鹏宇
2026-06-10 09:35:07 +00:00
committed by Gitee
5 changed files with 89 additions and 2 deletions
@@ -459,7 +459,7 @@
<field name="type">ir.actions.act_window</field>
<field name="res_model">soong.workflow.record</field>
<field name="view_mode">tree,kanban,search</field>
<field name="domain">[('reclaim_state', '=', False), ('is_company', '=', True),('approve_state','!=','start'),('approvals_group_id.name', 'not in', ['考勤', '人事'])]</field>
<field name="domain">[('reclaim_state', '=', False), ('approve_state','!=','start'),('approvals_group_id.name', 'not in', ['考勤', '人事']), '|', ('users_ids', 'in', [uid]), ('member_of_department', '=', True)]</field>
<field name="context">{'search_default_my_department_shifts': True, 'default_order': 'display_end_time desc'}</field>
<field name="search_view_id" ref="soong_workflow_record_search1"/>
<field name="view_id" ref="soong_workflow_record_department_tree"/>
@@ -19,6 +19,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
res_model = fields.Char()
res_id = fields.Integer()
code = fields.Char()
log_ids = fields.Many2many(comodel_name="soong.workflow.log")
node_btn_id = fields.Many2one(comodel_name="soong.workflow.node.button")
node_btn_name = fields.Char(string="动作名称", related='node_btn_id.name')
@@ -35,6 +36,51 @@ class SoongWorkflowCommentWizard(models.TransientModel):
workflow_record_id = fields.Many2one('soong.workflow.record', string="流程")
is_selection = fields.Boolean(string="是否自动选择")
trans_link_id = fields.Many2one('trans.link', string='转交节点', ondelete='set null')
is_avoid = fields.Boolean(string='是否回避')
allowed_issue_ids = fields.Many2many('issue.library', 'soong_comment_wizard_allowed_issue_rel',
'wizard_id', 'issue_id', string='可选议题')
avoid_issue_ids = fields.Many2many('issue.library', 'soong_comment_wizard_avoid_issue_rel',
'wizard_id', 'issue_id', string='回避议题')
avoid_comment = fields.Char(string='回避意见')
@api.model
def default_get(self, fields_list):
res = super().default_get(fields_list)
ctx = self.env.context
res_model = ctx.get('default_res_model') or res.get('res_model')
res_id = ctx.get('default_res_id') or res.get('res_id')
if res_model and res_id:
source = self.env[res_model].browse(res_id)
if hasattr(source, 'line_ids'):
res['allowed_issue_ids'] = [(6, 0, source.line_ids.mapped('issue_id').ids)]
return res
@api.onchange('avoid_issue_ids')
def _onchange_avoid_issue_ids(self):
if self.avoid_issue_ids and self.allowed_issue_ids:
invalid = self.avoid_issue_ids - self.allowed_issue_ids
if invalid:
self.avoid_issue_ids = [(6, 0, (self.avoid_issue_ids - invalid).ids)]
return {
'warning': {
'title': '无效议题',
'message': f'以下议题不在当前申报范围内,已自动移除:{", ".join(invalid.mapped("name"))}',
}
}
@api.onchange('is_avoid')
def _onchange_is_avoid(self):
if not self.is_avoid:
self.avoid_issue_ids = [(5, 0, 0)]
self.avoid_comment = False
def _handle_avoidance(self):
"""回避处理:勾选回避且选了议题时,在对应议题中记录回避"""
if not self.is_avoid or not self.avoid_issue_ids:
return
for issue in self.avoid_issue_ids:
issue.log_avoidance(self.env.user, self.avoid_comment or '')
document_ids = fields.Many2many('ir.attachment', string="附件")
return_link_id = fields.Many2one('trans.link', string='退回节点', ondelete='set null')
invalid_link_ids = fields.Many2many(
@@ -130,7 +176,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
])
self.employee_ids2 = self.env['hr.employee'].search(domain)
@api.depends('comment_note_id', 'comment_note')
@api.depends('comment_note_id', 'comment_note', 'avoid_comment')
def _compute_comment(self):
for record in self:
comment_parts = []
@@ -138,6 +184,8 @@ class SoongWorkflowCommentWizard(models.TransientModel):
comment_parts.append(record.comment_note_id.name)
if record.comment_note:
comment_parts.append(record.comment_note)
if record.avoid_comment:
comment_parts.append(f'【回避意见】{record.avoid_comment}')
record.comment = " ".join(comment_parts) if comment_parts else ""
@api.depends('user_id.employee_ids.user_role_ids', 'user_id.employee_ids.user_role_id')
@@ -564,6 +612,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
title=record_id._description + '传阅/抄送,测试提醒',
description=description, url=url,
btntxt="查看详情")
self._handle_avoidance()
if self.node_btn_name == '退回':
if not self.return_link_id:
raise UserError('请选择退回节点')
@@ -970,6 +1019,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
title=title,
description=f"标题为{record_id.name}的{title}已结束,请归档",
url=url, btntxt="查看详情")
self._handle_avoidance()
if self.node_btn_name == "分发":
record_id.is_send = True
menu_id = self.env['ir.ui.menu'].search([('name', '=', '行政收文')], limit=1)
@@ -12,6 +12,7 @@
<field name="approval_concatenation" widget="radio"/>
<field name="invalid_link_ids" widget="many2many_tags"/>
<field name="user_role_ids"/>
<field name="res_model" invisible="1"/>
<field name="comment"/>
</group>
<group invisible="node_btn_name in ['分发', '结束', '收回', '确认', '归档', '加签', '加签确认']">
@@ -136,6 +137,11 @@
<field name="trans_link_id" string="转交节点" invisible="node_btn_name == '退回'"
domain="[('id', 'not in', invalid_link_ids), ('workflow_record_id', '=', workflow_record_id)]"
options="{'no_open': True}" widget="radio" force_save="1"/>
<field name="is_avoid" invisible="res_model not in ['issue.party.approval', 'issue.boss.approval', 'issue.class.approval']"/>
<field name="allowed_issue_ids" invisible="1"/>
<field name="avoid_issue_ids" widget="many2many_tags"
invisible="not is_avoid" options="{'no_create': True}"/>
<field name="avoid_comment" invisible="not is_avoid" placeholder="请输入回避意见..."/>
<field name="employee_trans_domain_ids" invisible="1"/>
<!-- 退回意见退回类型 -->
<div invisible="node_btn_name != '退回'" style="white-space: nowrap; color: #dc3545; font-weight: bold; font-size: 14px; padding: 2px 8px; border-left: 3px solid #dc3545; margin-bottom: 6px;">退回节点</div>
+21
View File
@@ -71,6 +71,7 @@ class IssueLibrary(models.Model):
issue_approval_id = fields.Many2one('issue.approval', string="关联议题审批")
issue_library_line_ids = fields.One2many('issue.library.line', 'issue_library_id', string="决策明细")
issue_library_approval_line_ids = fields.One2many('issue.library.approval.line', 'issue_library_id', string='流程记录')
avoid_line_ids = fields.One2many('issue.library.avoid.line', 'issue_library_id', string='回避记录')
approval_decision_sequence = fields.Char(string="决策清单事项")
is_booking = fields.Boolean(string="是否上会")
issues_result = fields.Html(string="会议结果")
@@ -113,6 +114,15 @@ class IssueLibrary(models.Model):
is_push_depart = fields.Boolean(string="部门推送")
is_meeting = fields.Boolean(string="已过会", compute='_compute_meeting', store=True)
def log_avoidance(self, avoid_user, avoid_comment=''):
"""记录回避信息"""
self.env['issue.library.avoid.line'].create({
'issue_library_id': self.id,
'avoid_user_id': avoid_user.id,
'avoid_date': fields.Datetime.now() + timedelta(hours=8),
'avoid_comment': avoid_comment,
})
def correction_confirm(self):
for rec in self:
rec.is_confirm = False
@@ -1006,3 +1016,14 @@ class IssueLibraryRoomLine(models.Model):
'target': 'current',
}
class IssueLibraryAvoidLine(models.Model):
_name = 'issue.library.avoid.line'
_description = '回避记录'
_order = 'avoid_date desc'
issue_library_id = fields.Many2one('issue.library', string='关联议题')
avoid_user_id = fields.Many2one('res.users', string='回避人', default=lambda self: self.env.user)
avoid_date = fields.Datetime(string='回避时间', default=fields.Datetime.now)
avoid_comment = fields.Text(string='回避意见')
@@ -328,6 +328,16 @@
</tree>
</field>
</page>
<page string="回避记录">
<field name="avoid_line_ids">
<tree create="false" delete="false">
<field name="issue_library_id" column_invisible="1"/>
<field name="avoid_user_id"/>
<field name="avoid_date"/>
<field name="avoid_comment"/>
</tree>
</field>
</page>
</notebook>
</sheet>
</form>