1
0
forked from erp-dev/erp

fix: little bugs, feat: woodpecker settings

This commit is contained in:
2025-11-14 15:11:26 +08:00
parent 107e65afc0
commit af523d0350
9 changed files with 852 additions and 27 deletions

View File

@@ -482,9 +482,6 @@ class HasActivatePlateOrderPermission(BasePermission):
return request.user.has_perm('printing.can_activate_plateorder')
class PlateOrderFilterSet(django_filters.FilterSet):
"""开版订单过滤器"""
customer_name = django_filters.CharFilter(field_name='customer__name', lookup_expr='icontains')
@@ -523,6 +520,10 @@ class PlateOrderViewSet(viewsets.ModelViewSet):
partial_update: 部分更新开版订单
invalidate: 作废开版订单
activate: 恢复开版订单
advance_to_next_state: 推进到下一个状态
step_back_one_state: 回退一步
completed_states: 查询已完成的流程列表
timeline: 获取流程时间线
查询参数:
- customer: 客户ID
@@ -651,3 +652,169 @@ class PlateOrderViewSet(viewsets.ModelViewSet):
'detail': '开版订单已恢复',
'data': serializer.data
})
@action(detail=True, methods=['post'], url_path='advance-to-next-state')
def advance_to_next_state(self, request, pk=None):
"""
推进到下一个状态
将开版订单推进到下一个流程状态
"""
plate_order = self.get_object()
if not plate_order.business_object:
return Response(
{'detail': '该开版订单没有关联的流程实例'},
status=status.HTTP_400_BAD_REQUEST
)
from stateflow import services as stateflow_services
success, message = stateflow_services.advance_to_next_state(
plate_order.business_object, request.user
)
if not success:
return Response(
{'detail': message},
status=status.HTTP_400_BAD_REQUEST
)
# 重新获取 plate_order 以刷新状态
plate_order.refresh_from_db()
from .serializers import PlateOrderDetailSerializer
serializer = PlateOrderDetailSerializer(plate_order, context={'request': request})
return Response({
'detail': message,
'data': serializer.data
})
@action(detail=True, methods=['post'], url_path='step-back-one-state')
def step_back_one_state(self, request, pk=None):
"""
回退一步
将开版订单回退到上一个流程状态
"""
plate_order = self.get_object()
if not plate_order.business_object:
return Response(
{'detail': '该开版订单没有关联的流程实例'},
status=status.HTTP_400_BAD_REQUEST
)
from stateflow import services as stateflow_services
success, message = stateflow_services.step_back_one_state(
plate_order.business_object, request.user
)
if not success:
return Response(
{'detail': message},
status=status.HTTP_400_BAD_REQUEST
)
# 重新获取 plate_order 以刷新状态
plate_order.refresh_from_db()
from .serializers import PlateOrderDetailSerializer
serializer = PlateOrderDetailSerializer(plate_order, context={'request': request})
return Response({
'detail': message,
'data': serializer.data
})
@action(detail=True, methods=['get'], url_path='completed-states')
def completed_states(self, request, pk=None):
"""
查询已完成的流程列表
查询参数:
- include_cancelled: 是否包含已撤销的流程true/false默认 false
"""
plate_order = self.get_object()
if not plate_order.business_object:
return Response({
'count': 0,
'results': []
})
# 获取查询参数
include_cancelled = request.query_params.get('include_cancelled', 'false').lower() == 'true'
# 查询已完成的状态
state_logs = plate_order.business_object.state_logs.select_related('state', 'completed_by').order_by('completed_at')
if not include_cancelled:
state_logs = state_logs.filter(is_cancelled=False)
results = []
for log in state_logs:
results.append({
'id': log.id,
'state_id': log.state.id,
'state_name': log.state.name,
'completed_at': log.completed_at,
'completed_by': log.completed_by.username if log.completed_by else None,
'completed_by_name': getattr(log.completed_by, 'employee', None) and log.completed_by.employee.name or None,
'is_cancelled': log.is_cancelled,
'cancelled_at': log.cancelled_at,
})
return Response({
'count': len(results),
'results': results
})
@action(detail=True, methods=['get'], url_path='timeline')
def timeline(self, request, pk=None):
"""
获取流程时间线
返回该开版订单的完整流程时间线,包括未开始、进行中和已完成的状态
不包含已撤销的流程记录
"""
plate_order = self.get_object()
if not plate_order.business_object:
return Response({
'count': 0,
'results': []
})
from stateflow import services as stateflow_services
# 获取流程
from stateflow.models import Process
try:
process = Process.objects.get(id=plate_order.process)
except Process.DoesNotExist:
return Response({
'count': 0,
'results': []
})
timeline_data = stateflow_services.get_business_object_state_timeline(plate_order.business_object)
# 过滤掉已撤销的记录
timeline_data = [item for item in timeline_data if not item.get('is_cancelled')]
results = []
for item in timeline_data:
results.append({
'state_id': item['state'].id,
'state_name': item['state'].name,
'state_description': item['state'].description,
'order': item['order'],
'status': item['status'], # not_started, in_progress, completed
'completed_at': item['completed_at'],
'completed_by': item['completed_by'].username if item['completed_by'] else None,
'completed_by_name': getattr(item['completed_by'], 'employee', None) and item['completed_by'].employee.name or None if item['completed_by'] else None,
})
return Response({
'count': len(results),
'results': results
})