diff --git a/soong_workflow/models/soong_workflow_mixin.py b/soong_workflow/models/soong_workflow_mixin.py
index fcd04ba59..87e584576 100644
--- a/soong_workflow/models/soong_workflow_mixin.py
+++ b/soong_workflow/models/soong_workflow_mixin.py
@@ -667,6 +667,10 @@ class SoongWorkflowMixin(models.AbstractModel):
sorted_logs = rec.log_ids.sorted(lambda log: log.id)
if sorted_logs and sorted_logs[-1].lase_click_date:
node_update_time = sorted_logs[-1].lase_click_date
+
+ # 补丁:如果审批状态已经是结束,但还没拿到时间,则尝试用当前时间作为办结时间
+ if not node_update_time and record_obj.approve_state == 'end':
+ node_update_time = fields.Datetime.now()
except Exception as e:
_logger.debug(f"Failed to get node_update_time: {e}")
diff --git a/soong_workflow/models/soong_workflow_record.py b/soong_workflow/models/soong_workflow_record.py
index e4625d0fe..f7680c16a 100644
--- a/soong_workflow/models/soong_workflow_record.py
+++ b/soong_workflow/models/soong_workflow_record.py
@@ -622,6 +622,48 @@ class SoongWorkflowRecord(models.Model):
},
}
+ def action_update_history_end_time(self):
+ """
+ 批量计算已结束流程的办结时间
+ """
+ # 寻找所有审批状态为结束(end)且办结时间为空的记录
+ records = self.search([
+ ('approve_state', '=', 'end'),
+ ('node_update_time', '=', False)
+ ])
+
+ count = 0
+ for rec in records:
+ if not rec.res_model or not rec.res_id:
+ continue
+
+ try:
+ # 获取对应的业务单据
+ source_record = self.env[rec.res_model].browse(rec.res_id)
+ if not source_record.exists():
+ continue
+
+ # 提取该单据最后一条审批日志的时间
+ if hasattr(source_record, 'log_ids') and source_record.log_ids:
+ # 按ID排序,取最后一条记录
+ sorted_logs = source_record.log_ids.sorted(lambda l: l.id)
+ if sorted_logs and sorted_logs[-1].lase_click_date:
+ # 更新办结时间
+ rec.write({'node_update_time': sorted_logs[-1].lase_click_date})
+ count += 1
+ except Exception as e:
+ _logger.error(f"计算记录 {rec.id} 办结时间失败: {e}")
+
+ return {
+ 'type': 'ir.actions.client',
+ 'tag': 'display_notification',
+ 'params': {
+ 'title': '处理完成',
+ 'message': f'成功更新了 {count} 条记录的办结时间',
+ 'sticky': False,
+ }
+ }
+
diff --git a/soong_workflow/views/soong_workflow_record.xml b/soong_workflow/views/soong_workflow_record.xml
index 8502c1d9a..c4178c9af 100644
--- a/soong_workflow/views/soong_workflow_record.xml
+++ b/soong_workflow/views/soong_workflow_record.xml
@@ -92,6 +92,8 @@
groups="soong_workflow.group_soong_workflow_manager"/>
+
@@ -140,6 +142,8 @@
groups="soong_workflow.group_soong_workflow_manager"/>
+
@@ -234,6 +238,8 @@
groups="soong_workflow.group_soong_workflow_manager"/>
+
@@ -272,6 +278,8 @@
groups="soong_workflow.group_soong_workflow_manager"/>
+
@@ -328,6 +336,8 @@
groups="soong_workflow.group_soong_workflow_manager"/>
+
@@ -491,6 +501,14 @@
action = model.delete_record()
+
+ 一键补全办结时间
+
+
+ code
+ action = model.action_update_history_end_time()
+
+
管理员强制结束