!7903 添加功能

Merge pull request !7903 from 李鹏宇/dev_zhou
This commit is contained in:
李鹏宇
2026-01-12 13:51:17 +00:00
committed by Gitee
8 changed files with 102 additions and 58 deletions
+10 -7
View File
@@ -45,12 +45,12 @@ class SoongWorkflowLog(models.Model):
@api.depends("workflow_id", "node_id", "node_btn_id")
def _compute_name(self):
for rec in self:
# rec.name = "%(workflow_id_name)s - %(node_id_name)s - %(node_btn_name)s" % {
# "workflow_id_name": rec.workflow_id.name,
# "node_id_name": rec.node_id.name,
# "node_btn_name": rec.node_btn_id.name,
# }
rec.name = "%(node_id_name)s" % {"node_id_name": rec.node_id.name}
if rec.name == '归档':
pass
if rec.node_id:
rec.name = "%(node_id_name)s" % {"node_id_name": rec.node_id.name}
else:
rec.name = ""
@api.depends("workflow_id")
def _compute_sequence(self):
@@ -91,7 +91,10 @@ class SoongWorkflowLog2(models.Model):
@api.depends("workflow_id", "node_id", "node_btn_id")
def _compute_name(self):
for rec in self:
rec.name = "%(node_id_name)s" % {"node_id_name": rec.node_id.name}
if rec.node_id and rec.node_btn_id:
rec.name = "%(node_id_name)s" % {"node_id_name": rec.node_id.name}
else:
rec.name = None
@api.depends("workflow_id")
def _compute_sequence(self):
+20 -14
View File
@@ -96,17 +96,24 @@ class SoongWorkflowMixin(models.AbstractModel):
if matched_logs and all(log.approval_state == '0' for log in matched_logs):
record.is_back = True
if record._name == 'yuthon.official.incoming.normal':
has_handling_log = any(
log.name == '承办' and log.approval_state == '1'
for log in record.log_ids
)
has_handling_log2 = any(
log.approval_state == '1'
current_user_in_logs2 = any(
log.done_by.id == self.env.uid
for log in record.log_ids2
)
if has_handling_log or has_handling_log2:
record.is_back = False
else:
organizer_user_in_logs = any(
log.done_by.id == self.env.user.id
for log in record.log_ids.filtered(lambda l: l.name == '承办')
)
all_handling_logs_approval_0 = all(
log.approval_state == '0'
for log in record.log_ids.filtered(lambda l: l.name == '承办')
)
all_logs2_approval_0 = all(
log.approval_state == '0'
for log in record.log_ids2
)
if all_logs2_approval_0 and all_handling_logs_approval_0 and not current_user_in_logs2 and not organizer_user_in_logs:
record.is_back = True
def _compute_is_active(self):
@@ -115,7 +122,7 @@ class SoongWorkflowMixin(models.AbstractModel):
query_user_id = self.user_id.id
elif hasattr(self, 'users_id') and self.users_id:
query_user_id = self.users_id.id
if query_user_id == current_user_id and self.work_end:
if query_user_id == current_user_id and self.work_end and self.log_ids[-1].approval_state in ['0', '1']:
self.is_active = True
else:
self.is_active = False
@@ -128,9 +135,9 @@ class SoongWorkflowMixin(models.AbstractModel):
('res_id', '=', record.id), ('approval_state', 'in', ['0', '1'])]
lg2 = record.log_ids2.search(domain)
lg1 = record.log_ids.search(domain)
if lg2:
if lg2 or lg1:
record.is_confirm = False
if lg1:
if not lg1 and not lg2:
record.is_end = False
@api.depends("node_id", "log_ids")
@@ -215,7 +222,7 @@ class SoongWorkflowMixin(models.AbstractModel):
def _create_update_logs(self, btn_rec):
log_obj = self.env["soong.workflow.log"]
if btn_rec.name not in ['转交', '分发', '加签', '加签确认', '退回', '收回', '结束']:
if btn_rec.name not in ['转交', '分发', '加签', '加签确认', '退回', '收回', '结束', '归档', '确认']:
record_obj = log_obj.search(
[("model", "=", self._name),
("res_id", "=", self.id),
@@ -508,7 +515,6 @@ class SoongWorkflowMixin(models.AbstractModel):
'default_comment_note_id': comment_note_id,
"default_code": self.code,
"default_res_model": self._name,
"default_log_ids": logs.ids,
"default_node_btn_id": btn_rec.id,
"default_is_supervising": is_supervising,
"default_trans_link_id": self.env['trans.link'].search(trans_domain, limit=1).id if btn_rec.name == '转交' else False,
+13 -2
View File
@@ -336,7 +336,7 @@ class SoongWorkflowRecord(models.Model):
def get_view(self, view_id=None, view_type='form', **options):
all_records = self.search([
('users_ids', 'in', self.env.user.id),
('soong_state', '!=', 'active')
('soong_state', '!=', 'active'),
])
for record in all_records:
record_id = self.env[record.res_model].browse(record.res_id)
@@ -345,11 +345,22 @@ class SoongWorkflowRecord(models.Model):
continue
for log in record_id.log_ids:
if log.done_by.name == self.env.user.name:
if log.approval_state == '0'or log.approval_state == '1':
if log.name == '归档' and (log.approval_state == '0' or log.approval_state == '1'):
record.write({'soong_state': 'to_active'})
elif log.name == '归档' and log.approval_state == '2':
record.write({'soong_state': 'active'})
elif log.approval_state == '0' or log.approval_state == '1':
record.write({'soong_state': 'to_do'})
else:
record.write({'soong_state': 'done'})
for log2 in record_id.log_ids2:
if log2.done_by.name == self.env.user.name:
if log2.approval_state == '2':
record.write({'soong_state': 'done'})
elif log2.approval_state in ['0', '1']:
record.write({'soong_state': 'to_do'})
return super(SoongWorkflowRecord, self).get_view(view_id, view_type, **options)
# def get_department_employees(self, department_id):
@@ -41,7 +41,6 @@
options="{'no_create': True}"/>
<field name="is_apostille"/>
<field name="is_end"/>
<field name="is_archive"/>
<field name="is_confirm"/>
</group>
</group>
@@ -154,7 +153,7 @@
<field name="model">soong.workflow.node.button</field>
<field name="arch" type="xml">
<form>
<field name="workflow_id" invisible="1"/>
<field name="workflow_id" invisible="0"/>
<field name="invisible_expression_model" invisible="1"/>
<sheet>
<group>
@@ -317,7 +317,7 @@
<field name="res_model">soong.workflow.record</field>
<field name="view_mode">tree,kanban,search</field>
<field name="context">{'header_search_default_approve_state': 1, 'header_search_default_to_do':1, 'check_employee': 1}</field>
<field name="domain">[('users_ids', 'in', uid), ('reclaim_state', '=', False), ('soong_state', 'in', ['to_do', 'active'])]</field>
<field name="domain">[('users_ids', 'in', uid), ('reclaim_state', '=', False), ('soong_state', 'in', ['to_do', 'to_active'])]</field>
<field name="search_view_id" ref="soong_workflow_record_search1"/>
<field name="view_id" ref="soong_workflow_record_my_tree"/>
</record>
@@ -327,7 +327,7 @@
<field name="res_model">soong.workflow.record</field>
<field name="view_mode">tree,kanban,search</field>
<field name="context">{'header_search_default_approve_state': 1, 'header_search_default_to_do':1, 'check_employee': 1}</field>
<field name="domain">[('users_ids', 'in', uid), ('reclaim_state', '=', False), ('soong_state', '=', 'done')]</field>
<field name="domain">[('users_ids', 'in', uid), ('reclaim_state', '=', False), ('soong_state', 'in', ['done', 'active'])]</field>
<field name="search_view_id" ref="soong_workflow_record_search1"/>
<field name="view_id" ref="soong_workflow_record_my_tree"/>
</record>
@@ -456,10 +456,18 @@ class SoongWorkflowCommentWizard(models.TransientModel):
fields.Datetime.now() + timedelta(
hours=8)),
url=url, btntxt="查看详情")
# msg_id = result_data[-1]['msgid']
# target_logs = next_node_log_records.filtered(lambda l: l.done_by.id == employee.user_id.id)
# if target_logs:
# target_logs.msg_id = msg_id
msg_id = None
try:
if result_data and isinstance(result_data, list) and len(result_data) > 0:
last_item = result_data[-1]
if isinstance(last_item, dict) and 'msgid' in last_item:
msg_id = last_item['msgid']
except (IndexError, KeyError, TypeError):
msg_id = None
if msg_id:
target_logs = next_node_log_records.filtered(lambda l: l.done_by.id == employee.user_id.id)
if target_logs:
target_logs.msg_id = msg_id
else: # 串审模式 (沿用原有逻辑)
# 查找下一个节点
@@ -615,9 +623,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
same_name_logs = record_id.log_ids.filtered(
lambda log: log.name == last_log.name and log.node_btn_name == '4' and log.id != last_log.id
)
all_approved = all(log.approval_state == '3' for log in same_name_logs)
all_approved = all_approved and (last_log.approval_state == '3')
all_approved = all(log.approval_state == '3' for log in same_name_logs) or not same_name_logs
log2_ids_all_qualified = True
if record_id.log_ids2:
log2_ids_all_qualified = all(log2.approval_state == '2' for log2 in record_id.log_ids2)
@@ -628,21 +634,23 @@ class SoongWorkflowCommentWizard(models.TransientModel):
if workflow_record:
workflow_record.write({
'approve_state': 'end',
'employee_ids': applicant.id,
'employee_ids': [(6, 0, [applicant.employee_ids.id])],
'soong_state': 'to_active',
'node_id': False,
})
self.sudo().env["soong.workflow.log"].create({
"code": self.code,
"model": self.res_model,
"res_id": self.res_id,
"workflow_id": self.node_btn_id.workflow_id.id,
"lase_click_date": fields.Datetime.now(),
"done_by": applicant.id,
"approval_state": "0",
"commit":'待归档',
"node_btn_id": self.node_btn_id.id,
})
log_id = record_id.log_ids.filtered(lambda l: l.comment in ['归档', '待归档'])
if not log_id:
self.env["soong.workflow.log"].create({
'name': '归档',
"code": self.code,
"model": self.res_model,
"res_id": self.res_id,
"workflow_id": self.node_btn_id.workflow_id.id,
"lase_click_date": fields.Datetime.now(),
"done_by": applicant.id,
"approval_state": "0",
"node_btn_id": self.node_btn_id.id,
})
record_id.work_end = True
# 给申请人发消息
@@ -706,9 +714,13 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"done_by": self.employee_ids.user_id.id,
"node_btn_name": "0",
})
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id='18562027762', title=record_id._description, description=description, url=url, btntxt="查看详情")
# msg_id = result_data[-1]['msgid']
# log_id.msg_id = msg_id
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=emp.wecom_userid, title=record_id._description, description=description, url=url, btntxt="查看详情")
msg_id = None
if result_data and isinstance(result_data, list) and len(result_data) > 0:
last_item = result_data[-1]
if isinstance(last_item, dict) and 'msgid' in last_item:
msg_id = last_item['msgid'] or ""
log_id.msg_id = msg_id
for emp in self.dep_manager_employee_ids:
workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.dep_manager_employee_ids if employee.user_id]
next_node_id = record_id.workflow_id.node_ids.search([('name', '=', '承办'), ('workflow_id', '=', record_id.workflow_id.id)])
@@ -722,8 +734,12 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"node_btn_name": "4",
})
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=emp.wecom_userid, title=record_id._description + "承办", description=description, url=url, btntxt="查看详情")
# msg_id = result_data[-1]['msgid']
# log_id.msg_id = msg_id
msg_id = None
if result_data and isinstance(result_data, list) and len(result_data) > 0:
last_item = result_data[-1]
if isinstance(last_item, dict) and 'msgid' in last_item:
msg_id = last_item['msgid'] or ""
log_id.msg_id = msg_id
for employee in self.circulated_employee_ids:
workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.circulated_employee_ids if employee.user_id]
record_id = self.env[self.res_model].search([('id', '=', self.res_id)])
@@ -746,9 +762,13 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"node_btn_id": self.node_btn_id.id,
"approval_state": "0",
})
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id='18562027762', title=record_id._description + "传阅/抄送",description=description, url=url, btntxt="查看详情")
# msg_id = result_data[-1]['msgid']
# log2_id.msg_id = msg_id
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=emp.wecom_userid, title=record_id._description + "传阅/抄送",description=description, url=url, btntxt="查看详情")
msg_id = None
if result_data and isinstance(result_data, list) and len(result_data) > 0:
last_item = result_data[-1]
if isinstance(last_item, dict) and 'msgid' in last_item:
msg_id = last_item['msgid'] or ""
log2_id.msg_id = msg_id
workflow_record_id.employee_ids = self.dep_manager_employee_ids + self.employee_ids + self.circulated_employee_ids
record_id.log_ids[-1].write({"comment": self.comment, "approval_state": "2", "lase_click_date": fields.Datetime.now()})
if self.node_btn_name == "收回":
@@ -776,11 +796,14 @@ class SoongWorkflowCommentWizard(models.TransientModel):
self.node_btn_id.with_context(cx).run()
if self.node_btn_name == '归档':
record = self.env[self.res_model].search([('id', '=', self.res_id)])
record.log_ids[-1].write({'approval_state': '2'})
if self.document_ids:
record.log_ids[-1].write({'document_ids': [(6, 0, self.document_ids.ids)]})
workflow_record_id = self.env['soong.workflow.record'].search([('code', '=', record_id.code)])
workflow_record_id.write({'soong_state': 'active',
'employee_ids':False
}
)
})
if self.node_btn_name != "收回":
@@ -24,6 +24,9 @@
</group>
<div invisible="node_btn_name != '归档'">
<h2>你确认要归档吗?</h2>
<group>
<field name="document_ids" widget="many2many_tags"/>
</group>
</div>
<group invisible="node_btn_name != '结束'">
<div>
@@ -69,7 +72,7 @@
<group col="2" invisible="node_btn_name in ['分发', '结束', '收回', '确认', '归档']">
<group>
<!-- 转交人员 -->
<field name="trans_link_id" string="转交节点" invisible="node_btn_name == '退回'" domain="[('id', 'not in', invalid_link_ids)]" options="{'no_open': True}" widget="radio"/>
<field name="trans_link_id" string="转交节点" invisible="node_btn_name == '退回'" domain="[('id', 'not in', invalid_link_ids)]" options="{'no_open': True}" widget="radio" force_save="1"/>
<field name="employee_trans_domain_ids" invisible="1"/>
<!-- 退回意见退回类型 -->
<field name="return_link_id" invisible="node_btn_name != '退回'" string="退回节点" widget="radio"/>
@@ -11,7 +11,6 @@ class IssueMeetingMinutes(models.Model):
name = fields.Char(string='名称')
number_of_meetings = fields.Integer(string='会议次数')
meeting_id = fields.Many2one('room.booking', string='会议名称', required=True)
meeting_type_id = fields.Many2one('room.meeting.type', string="会议类型")
meeting_date = fields.Datetime(string="会议时间")