forked from erp-dev/erp
fix: little bugs, feat: woodpecker settings
This commit is contained in:
@@ -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
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user