Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
sunjie
2026-01-18 20:29:00 +08:00
9 changed files with 43 additions and 32 deletions
@@ -209,6 +209,31 @@ class SoongWorkflowMixin(models.AbstractModel):
soong_record_ids = fields.One2many(comodel_name="soong.workflow.line", inverse_name="res_id", string=" ",)
project_ids = fields.One2many(comodel_name="project.project.line", inverse_name="res_id", string=" ",)
def get_logs_for_print(self, applicant_first=False):
"""
返回用于打印的审批日志列表:
- 按与界面相同的顺序(sequence 升序)
- 同名节点只保留最新一条
- 可选:申请人置顶
"""
self.ensure_one()
logs = self.log_ids.sorted('sequence')
seen = set()
ordered = []
# 逆序去重,保留最新
for log in reversed(logs):
key = log.name or ''
if key in seen:
continue
seen.add(key)
ordered.append(log)
ordered.reverse() # 恢复原有顺序(去重后)
if applicant_first:
applicants = [l for l in ordered if (l.name or '') == '申请人']
others = [l for l in ordered if (l.name or '') != '申请人']
ordered = applicants + others
return ordered
# @api.model_create_multi
# def create(self, vals_list):
# res = super().create(vals_list)
@@ -695,7 +695,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
recipients = [emp for emp in employees]
for employee in recipients:
target_url = f'https://oa.thtzjt.com/web#id={record_id.id}&cids=2&active_id={action_id.id}&model={record_id._name}&view_type=form'
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url)
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url, employee.user_id.id)
if self.res_model == 'purchase.order':
self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
@@ -716,7 +716,6 @@ class SoongWorkflowCommentWizard(models.TransientModel):
workflow_record_id = self.env['soong.workflow.record'].search([('code', '=', record_id.code)])
action_id = self.env['ir.actions.act_window'].search([('res_model', '=', self.res_model)])[0]
target_url = f'https://oa.thtzjt.com/web#id={record_id.id}&cids=2&menu_id={menu_id.id}&active_id={action_id.id}&model={record_id._name}&view_type=form'
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url)
description = "标题: {}\n".format(record_id.name) + self.env.user.name + ' ' + str(fields.Datetime.now() + timedelta(hours=8))
if self.employee_ids:
workflow_record_id.users_ids = [(4, employee.user_id.id) for employee in self.employee_ids if employee.user_id]
@@ -731,6 +730,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"done_by": self.employee_ids.user_id.id,
"node_btn_name": "0",
})
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url, self.employee_ids.user_id.id)
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=self.employee_ids.wecom_userid, title=record_id._description, description=description, url=url, btntxt="查看详情")
if result_data and 'msgid' in result_data[-1]:
msg_id = result_data[-1]['msgid']
@@ -747,6 +747,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"done_by": emp.user_id.id,
"node_btn_name": "4",
})
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url, emp.user_id.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="查看详情")
if result_data and 'msgid' in result_data[-1]:
msg_id = result_data[-1]['msgid']
@@ -781,6 +782,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"node_btn_id": self.node_btn_id.id,
"approval_state": "0",
})
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url, employee.user_id.id)
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa', user_id=employee.wecom_userid, title=record_id._description + "传阅/抄送",description=description, url=url, btntxt="查看详情")
if result_data and 'msgid' in result_data[-1]:
msg_id = result_data[-1]['msgid']
@@ -839,7 +841,6 @@ class SoongWorkflowCommentWizard(models.TransientModel):
menu_id = self.env['ir.ui.menu'].search([('name', '=', '行政收文')])
action_id = self.env['ir.actions.act_window'].search([('res_model', '=', self.res_model)])[0]
target_url = f'https://oa.thtzjt.com/web#id={record_id.id}&cids=2&menu_id={menu_id.id}&active_id={action_id.id}&model={record_id._name}&view_type=form'
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url)
description = "标题: {}\n".format(record_id.name) + self.env.user.name + ' ' + str(fields.Datetime.now() + timedelta(hours=8))
record = self.env[self.res_model].search([('id', '=', self.res_id)])
record.log_ids[-1].write({'is_active_operate': True,
@@ -875,6 +876,7 @@ class SoongWorkflowCommentWizard(models.TransientModel):
"node_btn_id": self.node_btn_id.id,
"approval_state": "0",
})
url = self.sudo().env["wecom.apps"].generate_oauth_login_url(target_url, employee.user_id.id)
result_data = self.sudo().env["wecom.apps"].sync_send_message_textcard(category='oa',
user_id=employee.wecom_userid,
title=record_id._description + "传阅/抄送",
@@ -131,7 +131,8 @@
<tr>
<td class="section-cell" colspan="4">审批详情</td>
</tr>
<t t-foreach="doc.log_ids.sorted('sequence')" t-as="log">
<t t-set="logs_ordered" t-value="doc.get_logs_for_print()"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<!-- 节点名称:保留center -->
<!-- 若节点名称带“(物管)”等后缀,这里只取左侧文字 -->
@@ -67,7 +67,8 @@
<!-- 审批详情 -->
<tr><td class="section" colspan="3">审批详情</td></tr>
<t t-foreach="doc.log_ids.sorted('sequence')" t-as="log">
<t t-set="logs_ordered" t-value="doc.get_logs_for_print()"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<td class="cell-content approval-name approval-col1" style="text-align:center;"><span t-esc="log.name"/></td>
<td class="cell-content approval-col2 no-right-border approval-center"><span t-esc="log.comment"/></td>
@@ -92,7 +92,8 @@
<tr>
<td colspan="4" style="background-color: #d4e6f1; text-align: center;"><strong>审批详情</strong></td>
</tr>
<t t-foreach="doc.log_ids.sorted('sequence')" t-as="log">
<t t-set="logs_ordered" t-value="doc.get_logs_for_print()"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<td colspan="1"><span t-esc="log.name"/></td>
<!-- 核心修改:隐藏意见列右侧边框 -->
@@ -119,7 +119,8 @@
<td class="header-cell" colspan="5" style="text-align:center;"><strong>审批详情</strong></td>
</tr>
<t t-if="doc.log_ids">
<t t-foreach="doc.log_ids.sorted('sequence')" t-as="log">
<t t-set="logs_ordered" t-value="doc.get_logs_for_print()"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<td class="approval-col1" style="text-align:center;"><span t-esc="log.name"/></td>
<!-- 仅修改此处colspan为3,让approval-col2和approval-col3相邻 -->
@@ -116,7 +116,8 @@
<div class="section">审批详情</div>
<table class="po">
<t t-if="doc.log_ids">
<t t-foreach="doc.log_ids.sorted('sequence')" t-as="log">
<t t-set="logs_ordered" t-value="doc.get_logs_for_print()"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<td class="text-center"><span t-esc="log.name or ''"/></td>
<!-- 隐藏意见列右侧边框 + 内容居中 -->
@@ -42,29 +42,7 @@
<tr t-if="doc.is_chapter == 'yes'"><td class="hdr"><strong>用章范围</strong></td><td colspan="2" class="cell-content"><t t-foreach="doc.scope_chapter_ids" t-as="scope"><span t-esc="scope.name"/><t t-if="not scope_last">、</t></t></td></tr>
<tr><td class="hdr"><strong>附件清单</strong></td><td colspan="2" class="cell-content attachment-list"><t t-foreach="doc.document_ids" t-as="att"><div><t t-esc="att.name"/></div></t></td></tr>
<tr><td class="section" colspan="3"><strong>审批详情</strong></td></tr>
<!-- 按 sequence 逆序去重(同名节点保留最新) -->
<t t-set="logs_sorted" t-value="doc.log_ids.sorted('sequence', reverse=True)"/>
<t t-set="seen" t-value="set()"/>
<t t-set="logs_dedup" t-value="[]"/>
<t t-foreach="logs_sorted" t-as="log_tmp">
<t t-if="(log_tmp.name or '') not in seen">
<t t-set="seen" t-value="seen | {log_tmp.name or ''}"/>
<t t-set="logs_dedup" t-value="logs_dedup + [log_tmp]"/>
</t>
</t>
<t t-set="logs_final" t-value="logs_dedup"/>
<!-- 申请人优先:拆分后重组,保证申请人行在最前 -->
<t t-set="logs_applicant" t-value="[]"/>
<t t-set="logs_rest" t-value="[]"/>
<t t-foreach="logs_final" t-as="log_tmp2">
<t t-if="(log_tmp2.name or '') == '申请人'">
<t t-set="logs_applicant" t-value="logs_applicant + [log_tmp2]"/>
</t>
<t t-else="">
<t t-set="logs_rest" t-value="logs_rest + [log_tmp2]"/>
</t>
</t>
<t t-set="logs_ordered" t-value="logs_applicant + logs_rest"/>
<t t-set="logs_ordered" t-value="doc.get_logs_for_print(True)"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<td class="cell-content approval-name approval-col1"><span t-esc="log.name"/></td>
@@ -104,7 +104,8 @@
<td class="header-cell" colspan="7" style="text-align:center; background-color: #d4e6f1;"><strong>审批详情</strong></td>
</tr>
<t t-if="doc.log_ids">
<t t-foreach="doc.log_ids.sorted('sequence')" t-as="log">
<t t-set="logs_ordered" t-value="doc.get_logs_for_print()"/>
<t t-foreach="logs_ordered" t-as="log">
<tr>
<td class="approval-col1 approval-center" colspan="1" style="width:6em;"><span t-esc="log.name"/></td>
<td class="approval-col2 no-right-border approval-center" colspan="4"><span t-esc="log.comment"/></td>