forked from erp-dev/erp
feat: change param_valueto 'like' search for by-process-node
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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)。
|
||||||
|
|
||||||
## 返回结构
|
## 返回结构
|
||||||
```
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user