1
0
forked from erp-dev/erp

feat: improve for report

This commit is contained in:
2026-01-16 17:25:21 +08:00
parent 0c24c7e7e9
commit 2e0b7dc335
6 changed files with 417 additions and 73 deletions

View File

@@ -6,6 +6,7 @@ from rest_framework.decorators import action
from rest_framework.response import Response
from django_filters.rest_framework import DjangoFilterBackend
from django_filters import rest_framework as django_filters
from django.db.models import Exists, OuterRef
from flower.viewsets import LimitedModelViewSet
from stateflow import models, services
@@ -30,6 +31,40 @@ class BusinessObjectFilterSet(django_filters.FilterSet):
)
content_type_str = django_filters.CharFilter(method='filter_content_type')
has_content_object = django_filters.BooleanFilter(method='filter_has_content_object')
# 按“已完成的 state_id + 参数 key/value”反查 BusinessObject
#
# 说明:
# - stateflow 的工艺参数保存在 StateLogParameterRecord.parameters(JSONField),并挂在某次 StateFlowRecord完成某节点之下
# - 本过滤器只匹配“未撤销”的 StateFlowRecordis_cancelled=False
# - 为避免意外放宽查询范围:当提供了 state_id 但缺少 param_key/param_value 时,返回空结果
state_id = django_filters.NumberFilter(method='filter_completed_state_param')
param_key = django_filters.CharFilter(method='noop')
param_value = django_filters.CharFilter(method='noop')
def noop(self, queryset, name, value):
"""占位param_key/param_value 仅作为 state_id 组合过滤的输入,不单独过滤"""
return queryset
def filter_completed_state_param(self, queryset, name, value):
"""
过滤:存在未撤销的 StateFlowRecord(state_id=value),且该 state_log 下存在参数记录满足 {param_key: param_value}
"""
if value in (None, ''):
return queryset
param_key = (self.data.get('param_key') or '').strip()
param_value = (self.data.get('param_value') or '').strip()
if not param_key or not param_value:
return queryset.none()
matching_logs = models.StateFlowRecord.objects.filter(
business_object_id=OuterRef('pk'),
state_id=value,
is_cancelled=False,
parameter_records__parameters__contains={param_key: param_value},
)
return queryset.annotate(_has_state_param=Exists(matching_logs)).filter(_has_state_param=True)
def filter_overall_status(self, queryset, name, value):
"""过滤整体状态"""
@@ -58,8 +93,17 @@ class BusinessObjectFilterSet(django_filters.FilterSet):
class Meta:
model = models.BusinessObject
fields = ['name', 'process', 'process_name', 'overall_status',
'content_type_str', 'has_content_object']
fields = [
'name',
'process',
'process_name',
'overall_status',
'content_type_str',
'has_content_object',
'state_id',
'param_key',
'param_value',
]
class BusinessObjectViewSet(LimitedModelViewSet):