1
0
forked from erp-dev/erp

feat: change param_valueto 'like' search for by-process-node

This commit is contained in:
2026-02-06 20:52:43 +08:00
parent 6a638e56cf
commit 72597ce81f
3 changed files with 30 additions and 2 deletions

View File

@@ -840,6 +840,29 @@ class PlateOrderByProcessNodeV2APITest(TestCase):
self.assertEqual(resp.data['count'], 0) self.assertEqual(resp.data['count'], 0)
self.assertEqual(resp.data['results'], []) self.assertEqual(resp.data['results'], [])
def test_param_filter_supports_fuzzy_match(self):
log = stateflow_models.StateFlowRecord.objects.filter(
business_object=self.po_state3.business_object,
state=self.state2,
is_cancelled=False,
).first()
stateflow_models.StateLogParameterRecord.objects.create(
state_log=log,
parameters={'temperature': '30C'},
)
resp = self.client.get(
self.url,
{
'process_node_id': self.node2.id,
'param_key': 'temperature',
'param_value': '30',
},
)
self.assertEqual(resp.status_code, 200)
ids = [item['id'] for item in resp.data['results']]
self.assertEqual(ids, [self.po_state3.id])
def test_date_filter_requires_both(self): def test_date_filter_requires_both(self):
resp = self.client.get(self.url, {'process_node_id': self.node2.id, 'date_from': '2026-02-01'}) resp = self.client.get(self.url, {'process_node_id': self.node2.id, 'date_from': '2026-02-01'})
self.assertEqual(resp.status_code, 400) self.assertEqual(resp.status_code, 400)

View File

@@ -4,6 +4,7 @@ from django.utils import timezone
from django.db import transaction from django.db import transaction
from django.db import models as django_models from django.db import models as django_models
from django.db.models import Q, Count, CharField, Prefetch, Exists, OuterRef, Subquery from django.db.models import Q, Count, CharField, Prefetch, Exists, OuterRef, Subquery
from django.db.models.fields.json import KeyTextTransform
from django.db.models.functions import Cast, Coalesce from django.db.models.functions import Cast, Coalesce
from rest_framework import serializers, status, permissions from rest_framework import serializers, status, permissions
from rest_framework.pagination import LimitOffsetPagination from rest_framework.pagination import LimitOffsetPagination
@@ -577,7 +578,11 @@ class PlateOrderByProcessNodeView(APIView):
business_object_id=OuterRef('business_object_id'), business_object_id=OuterRef('business_object_id'),
state_id=target_state_id, state_id=target_state_id,
is_cancelled=False, is_cancelled=False,
parameter_records__parameters__contains={param_key: param_value}, parameter_records__parameters__has_key=param_key,
).annotate(
_param_value=KeyTextTransform(param_key, 'parameter_records__parameters')
).filter(
_param_value__icontains=param_value,
) )
queryset = queryset.annotate(_has_state_param=Exists(matching_logs)).filter(_has_state_param=True) queryset = queryset.annotate(_has_state_param=Exists(matching_logs)).filter(_has_state_param=True)

View File

@@ -26,7 +26,7 @@
### param_key / param_value 过滤说明 ### param_key / param_value 过滤说明
- 必须成对提供,否则返回 400。 - 必须成对提供,否则返回 400。
- 过滤语义存在任意一次“未撤销”的目标节点状态日志StateFlowRecord.is_cancelled=false其参数记录包含 {param_key: param_value} 即命中。 - 过滤语义存在任意一次“未撤销”的目标节点状态日志StateFlowRecord.is_cancelled=false其参数记录包含 param_key,且对应值 **模糊匹配** param_value 即命中icontains
## 返回结构 ## 返回结构
``` ```