This commit is contained in:
李鹏宇
2025-02-16 18:13:06 +08:00
parent 13b407dcc7
commit 19a5d4160e
12 changed files with 43 additions and 57 deletions
+3 -19
View File
@@ -18,9 +18,9 @@ class YuthonUserRole(models.Model):
end_time = fields.Date(string="结束时间")
parent_id = fields.Many2one('soong.user.role', string='上级角色', index=True)
personnel_ids = fields.Many2many('hr.employee', string='在岗人员', compute='_compute_employee_ids', store=True)
personnel = fields.Text(string="在岗人员", compute='_compute_personnel', store=True)
number_people = fields.Integer(string="在岗人数", compute='_compute_employee_ids', store=True)
personnel = fields.Text(string="在岗人员", store=True)
employee_ids = fields.One2many('hr.employee', 'user_role_id')
number_people = fields.Integer(string="在岗人数", compute='_compute_number_people', store=True)
child_ids = fields.One2many('soong.user.role', 'parent_id', string='下级角色', index=True)
yuthon_company = fields.Selection([('thtz', '天河投资集团'), ('thwg', '天河物管'),
('thlc', '天河粮储'), ('thtjbb', '天河投资本部')], string="所属公司", compute='compute_company')
@@ -61,29 +61,13 @@ class YuthonUserRole(models.Model):
domain = expression.AND([search_domain, domain])
return self._search(domain, limit=limit, order=order)
@api.depends('number_people')
def _compute_employee_ids(self):
for rec in self:
employee_ids = rec.env['hr.employee'].search(['|', ('user_role_id', '=', rec.id), ('user_role_ids', 'in', [rec.id])])
employee_list = [rec.id for rec in employee_ids]
rec.personnel_ids = employee_list
rec.number_people = len(employee_list)
@api.depends('personnel_ids')
def _compute_number_people(self):
for record in self:
record.number_people = len(record.personnel_ids)
@api.depends('personnel_ids')
def _compute_personnel(self):
for rec in self:
employee_list = [personnel.name for personnel in rec.personnel_ids]
rec.personnel = ','.join(employee_list)
# @api.onchange('personnel_ids')
# def _onchange_personnel_ids(self):
# for employee in self.personnel_ids:
# if self.id not in employee.user_role_ids.ids:
# employee.user_role_ids = [(4, self.id)]
def f5_new(self):
job_ids = self.env["soong.user.role"].browse(self._context.get('active_ids', self._context.get('active_id')))
+1 -1
View File
@@ -76,7 +76,7 @@ class SoongWorkflow(models.Model):
default.update({
'name': self.name + '-v' + str(workflow_version),
'model_id': False,
'remove_default_attrs_mod': self.remove_default_attrs_mod,
# 'remove_default_attrs_mod': self.remove_default_attrs_mod,
'current_stage_highlight_color': self.current_stage_highlight_color,
})
res = super(SoongWorkflow, self).copy(default)
+25 -33
View File
@@ -7,6 +7,7 @@ from odoo.exceptions import UserError
from datetime import datetime, date, time, timedelta
from lxml import etree
import logging
import ast
_logger = logging.getLogger(__name__)
@@ -74,7 +75,6 @@ class SoongWorkflowMixin(models.AbstractModel):
string="审批明细")
approval_sign_ids = fields.Many2many('res.users', store=False, compute="_compute_approval_sign_ids", string="加签人员")
@api.depends("node_id", "log_ids")
def _compute_approval_sign_ids(self):
for record in self:
@@ -347,10 +347,11 @@ class SoongWorkflowMixin(models.AbstractModel):
def _add_comment(self, logs, btn_rec):
wizard = self.env.ref("soong_workflow.view_soong_workflow_comment_wizard")
# 状态列表
state_list = ['拟办' if i.node_name == 'start' else i.node_name for i in btn_rec.workflow_id.node_ids]
state_list = [i.node_name for i in btn_rec.workflow_id.node_ids]
# 当前节点状态
self_state = state_list.index('拟办' if self.state == 'start' else self.state)
self_state = state_list.index(self.state)
self.env['trans.link'].search([]).unlink()
# 退回节点根据日志进行判断
if btn_rec.name == '退回':
for state in state_list[0:self_state]:
self.env['trans.link'].create({
@@ -375,33 +376,26 @@ class SoongWorkflowMixin(models.AbstractModel):
"default_node_link_len": '转交2' if len(btn_rec.node_id.out_link_ids) > 1 and btn_rec.name == '转交' else '',
},
}
# 下一个节点
if self_state + 1 != len(state_list):
next_state = btn_rec.workflow_id.node_ids[self_state + 1].button_ids[0]
# 转交逻辑调整。之后的所有流程
if btn_rec.name == '转交' and len(btn_rec.node_id.out_link_ids) >= 1:
for state in btn_rec.node_id.out_link_ids:
trans_link_id = self.env['trans.link'].create({
'node_button_id': btn_rec.id,
'name': state.name.split('-> ')[1],
'link_type': 'trans',
'record_id': self.id,
})
# 不自动匹配
employee_user_role_ids = self.env['hr.employee'].search(
['|', ('user_role_id', '=', next_state.users_role_id.id),
('user_role_ids', 'in', next_state.users_role_id.id)])
# 自动匹配
employee_user_role_id = self.env['hr.employee'].search(
['|', ('user_role_id', '=', next_state.users_role_id.id), ('user_role_id', '=', next_state.users_role_id.id),
'|', ('department_id', '=', self.department_id.id), ('department_ids', 'in', self.department_id.id),
('yuthon_company', '=', self.create_uid.employee_id.yuthon_company)])
employee_ids = employee_user_role_ids.ids if not next_state.is_automatic else employee_user_role_id.ids
if not employee_ids:
state = btn_rec.workflow_id.node_ids[self_state + 1]
raise UserError('请配置{}的角色人员'.format(state.name))
if btn_rec.name == '分发':
employee_ids = [self.env['hr.employee'].search([('user_role_id.name', '=', '董事长')])[0].id]
if btn_rec.name == '转交':
for i in btn_rec.workflow_id.node_ids[self_state:]:
for node in i.out_link_ids:
if len(i.out_link_ids) > 1:
if node.node_to.button_ids[0].btn_hide:
if node.node_to.button_ids[0].review_type == 'invisible':
domain = ast.literal_eval(node.node_to.button_ids[0].invisible_expression)
if domain[0][0] == 'user_role_id':
domain = ['|'] + domain + [('user_role_ids', '=', domain[0][2])]
employee_ids = self.env['hr.employee'].search(domain)
else:
raise UserError('多条线路分支,转交按钮必须选择隐藏条件')
elif len(i.out_link_ids) == 1:
self.env['trans.link'].create({
'node_button_id': btn_rec.id,
'name': node.node_to.name,
'sequence': node.node_to.sequence,
'link_type': 'trans',
'record_id': self.id,
})
# 分发督办隐藏过滤
is_supervising = False
if self._module in ['yuthon_official']:
@@ -419,10 +413,8 @@ class SoongWorkflowMixin(models.AbstractModel):
"default_res_model": self._name,
"default_log_ids": logs.ids,
"default_is_supervising": is_supervising,
"default_is_automatic": next_state.is_automatic if btn_rec.name != '分发' else False,
"default_employee_ids": employee_ids,
"default_node_btn_id": btn_rec.id,
"default_trans_link_id": trans_link_id.id if btn_rec.name == '转交' else False,
"default_trans_link_id": self.env['trans.link'].search([])[0].id if btn_rec.name == '转交' else False,
"default_node_link_len": '转交2' if len(btn_rec.node_id.out_link_ids) > 1 and btn_rec.name == '转交' else '',
},
}
@@ -89,6 +89,7 @@ class SoongWorkflowNode(models.Model):
is_apostille = fields.Boolean(string="加签", default=False)
employee_ids = fields.Many2many('hr.employee', string='抄送/传阅人员')
is_end = fields.Boolean(string="结束", default=False)
department_id = fields.Many2many('hr.department', string='部门')
@api.onchange("is_apostille")
def onchange_is_apostille(self):
+1
View File
@@ -5,6 +5,7 @@ from odoo import api, fields, models, _
class TransLink(models.Model):
_name = 'trans.link'
_rec_name = 'name'
_order = 'sequence'
node_button_id = fields.Many2one('soong.workflow.node.button', string="按钮")
name = fields.Char(string="节点名称")
+6 -1
View File
@@ -66,11 +66,16 @@
parent="menu_soong_other_setting"
action="action_soong_workflow_log"
sequence="2"/>
<menuitem id="menu_trans_link_action_setting"
name="工作流节点配置(后台测试)"
parent="menu_soong_other_setting"
action="trans_link_action"
sequence="3"/>
<menuitem id="menu_soong_approval_note"
name="常用审批意见"
parent="menu_soong_other_setting"
action="soong_note_action"
sequence="3"/>
sequence="4"/>
<menuitem id="menu_soong_approval_setting"
name="常用审批设置"
parent="menu_soong_other_setting"
@@ -24,8 +24,7 @@
<field name="name" required="1"/>
<field name="user_type"/>
<field name="department_id"/>
<field name="personnel_ids" widget="many2many_tags" column_invisible="1"/>
<field name="personnel"/>
<field name="personnel_ids" widget="many2many_tags"/>
<field name="number_people"/>
<field name="pinyin_name" column_invisible="1"/>
<field name="parent_id"/>
@@ -12,6 +12,7 @@
<group>
<field name="name" placeholder="ex. 'Draft' or 'Direct Manager'" required="1"/>
<field name="node_name" placeholder="ex. 'draft' or 'direct_manager'" required="1"/>
<field name="department_id" widget="many2many_tags"/>
</group>
<group>
<field name="sequence" required="1"/>
@@ -6,6 +6,7 @@
<field name="type">tree</field>
<field name="arch" type="xml">
<tree editable="bottom">
<field name="sequence"/>
<field name="name"/>
<field name="node_button_id"/>
<field name="link_type"/>
@@ -24,7 +24,7 @@
</group>
<group invisible="node_btn_name != '分发'">
<field name="comment_note_id" require="1" string="分发意见"/>
<field name="employee_ids" widget="many2many_tags" string="董事长"/>
<field name="employee_ids" widget="many2many_tags" string="董事长" domain="[('user_role_id.name', '=', '董事长')]"/>
<field name="circulated_employee_ids" widget="many2many_tags"/>
<field name="supervising_employee_ids" widget="many2many_tags" invisible="not is_supervising"/>
</group>
@@ -129,6 +129,7 @@ class HolidaysRequestBatch(models.Model):
index=True)
users_id = fields.Many2one('res.users', string="请假人", default=lambda self: self.env.user.id)
department_id = fields.Many2one(related='users_id.employee_id.department_id', string="部门")
user_role_id = fields.Many2one(related='users_id.employee_id.user_role_id', string="角色")
details = fields.Text(string="假期流程说明", compute='_compute_details')
days = fields.Float(string='天数')
hours = fields.Float(string='小时')
+1
View File
@@ -36,6 +36,7 @@
<field name="is_hour"/>
<field name="is_day"/>
<field name="department_id" invisible="1"/>
<field name="user_role_id" invisible="1"/>
<field name="is_issues" invisible="1"/>
</group>
<group>