@@ -97,7 +97,6 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
def _compute_is_show_add_sign(self):
|
||||
for record in self:
|
||||
record.is_show_add_sign = True
|
||||
|
||||
domain_hide_01 = [
|
||||
('workflow_id', '=', record.workflow_id.id),
|
||||
('res_id', '=', record.id),
|
||||
@@ -115,10 +114,13 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
]
|
||||
has_done = record.log_ids.search(domain_hide_done)
|
||||
|
||||
# 如果有日志,取【第一个节点】的经办人 == 当前登录人 → 隐藏
|
||||
# 如果有日志,取【第一个节点】的经办人 == 当前登录人 → 隐藏 (归档待办的除外)
|
||||
has_first_user = False
|
||||
if record.log_ids:
|
||||
first_log = record.log_ids.sorted('sequence')[:1]
|
||||
valid_logs = record.log_ids.filtered(
|
||||
lambda l: l.name != '归档' and l.approval_state in ['0', '1']
|
||||
)
|
||||
if valid_logs:
|
||||
first_log = valid_logs.sorted('sequence')[:1]
|
||||
if first_log and first_log.done_by == self.env.user:
|
||||
has_first_user = True
|
||||
|
||||
@@ -184,8 +186,9 @@ class SoongWorkflowMixin(models.AbstractModel):
|
||||
record.is_back = True
|
||||
|
||||
same_node_logs = record.log_ids.filtered(lambda log: log.name == next_log.name)
|
||||
if same_node_logs and any(log.approval_state in ['1', '2'] for log in same_node_logs):
|
||||
record.is_back = False
|
||||
if next_log.name != '加签':
|
||||
if same_node_logs and any(log.approval_state in ['1', '2'] for log in same_node_logs):
|
||||
record.is_back = False
|
||||
|
||||
if record._name in ['yuthon.official.incoming.normal', 'yuthon.sub.enterprises']:
|
||||
current_user_in_logs2 = any(log.done_by.id == self.env.uid for log in record.log_ids2)
|
||||
@@ -1248,7 +1251,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 or is_show_transfer"
|
||||
if button.name == "退回":
|
||||
btn_exec_action_el.set("class", "btn btn-return")
|
||||
id_el = etree.Element("field")
|
||||
|
||||
@@ -621,19 +621,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
|
||||
|
||||
if self.node_btn_name == '加签':
|
||||
if not is_admin:
|
||||
current_node_log = self.sudo().env["soong.workflow.log"].search(
|
||||
[
|
||||
("model", "=", self.res_model),
|
||||
("res_id", "=", self.res_id),
|
||||
("done_by", "=", self.env.user.id),
|
||||
("node_id", "=", self.node_btn_id.node_id.id),
|
||||
],
|
||||
order="create_date DESC",
|
||||
limit=1
|
||||
)
|
||||
else:
|
||||
current_node_log = record_id.log_ids[-1]
|
||||
current_node_log = record_id.log_ids[-1]
|
||||
current_node_log.write({
|
||||
"comment": self.comment,
|
||||
"approval_state": "2", # 已完成
|
||||
@@ -709,10 +697,18 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
last_sign_log = log_obj.search([
|
||||
("model", "=", self.res_model),
|
||||
("res_id", "=", self.res_id),
|
||||
("node_id", "=", node_id),
|
||||
("name", "!=", "加签"),
|
||||
("name", "=", "归档"),
|
||||
], order="create_date DESC", limit=1)
|
||||
|
||||
# 没找到归档,再取原来的最后一条(非加签)
|
||||
if not last_sign_log:
|
||||
last_sign_log = log_obj.search([
|
||||
("model", "=", self.res_model),
|
||||
("res_id", "=", self.res_id),
|
||||
("node_id", "=", node_id),
|
||||
("name", "!=", "加签"),
|
||||
], order="create_date DESC", limit=1)
|
||||
|
||||
# 如果没有加签日志,直接跳过
|
||||
if not last_sign_log:
|
||||
return
|
||||
@@ -732,15 +728,21 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
all_other_done = all(log.approval_state == "2" for log in all_logs)
|
||||
# 4. 如果满足 → 创建一条新日志给【最新加签的经办人】
|
||||
if all_other_done:
|
||||
log_obj.create({
|
||||
# 判断是否需要设置为归档
|
||||
log_name = last_sign_log.name if last_sign_log.name == '归档' else False
|
||||
log_vals = {
|
||||
"model": self.res_model,
|
||||
"res_id": self.res_id,
|
||||
"workflow_id": self.node_btn_id.workflow_id.id,
|
||||
"node_id": node_id,
|
||||
"done_by": last_sign_user.id, # 最新加签的经办人
|
||||
"done_by": last_sign_user.id,
|
||||
"approval_state": "0",
|
||||
"create_date": fields.Datetime.now(),
|
||||
})
|
||||
}
|
||||
# 如果是归档,自动写入 name = 归档
|
||||
if log_name:
|
||||
log_vals["name"] = log_name
|
||||
log_obj.create(log_vals)
|
||||
workflow_record_id = self.env['soong.workflow.record'].sudo().search([('res_id', '=', record_id.id),
|
||||
(
|
||||
'res_model', '=', record_id._name)
|
||||
@@ -1047,9 +1049,19 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
record = self.env[self.res_model].search([('id', '=', self.res_id)])
|
||||
is_admin = current_user.has_group('base.group_system') or current_user.has_group('base.group_admin')
|
||||
log_ids = record.log_ids.sorted('sequence')
|
||||
has_sign_log = log_ids.filtered(lambda log: log.name == '加签' and log.node_id.name == record.state)
|
||||
last_normal_log = log_ids.filtered(lambda l: l.name != '加签').sorted('create_date')[-1:]
|
||||
# 2. 如果有最后正常节点,只取【这个时间之后】的加签
|
||||
if last_normal_log:
|
||||
last_create_date = last_normal_log.create_date
|
||||
has_sign_log = log_ids.filtered(lambda log:
|
||||
log.name == '加签'
|
||||
and log.node_id.name == record.state
|
||||
and log.create_date > last_create_date # 关键:只取最后正常节点之后的加签
|
||||
)
|
||||
else:
|
||||
has_sign_log = log_ids.filtered(lambda log: log.name == '加签' and log.node_id.name == record.state)
|
||||
# 3. 判断这些加签是否已处理
|
||||
if has_sign_log:
|
||||
# 加签日志
|
||||
for log in has_sign_log:
|
||||
if log.approval_state != '0':
|
||||
raise UserError('加签流程已处理,不可收回!')
|
||||
@@ -1111,10 +1123,11 @@ class SoongWorkflowCommentWizard(models.TransientModel):
|
||||
prev_log.write({'approval_state': '1'})
|
||||
|
||||
# 回退状态
|
||||
record.write({
|
||||
'state': prev_log.name,
|
||||
'work_end': False,
|
||||
})
|
||||
if prev_log.name != '归档':
|
||||
record.write({
|
||||
'state': prev_log.name,
|
||||
'work_end': False,
|
||||
})
|
||||
|
||||
if self.node_btn_name == '归档':
|
||||
menu_id = self.env['ir.ui.menu'].search([('name', '=', '行政收文')], limit=1)
|
||||
|
||||
Reference in New Issue
Block a user