forked from erp-dev/erp
feat: improve for report
This commit is contained in:
@@ -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(完成某节点)之下
|
||||
# - 本过滤器只匹配“未撤销”的 StateFlowRecord(is_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):
|
||||
|
||||
Reference in New Issue
Block a user