forked from erp-dev/erp
feat: stateflow v2 (params required)
This commit is contained in:
@@ -4,21 +4,55 @@ from django.utils.safestring import mark_safe
|
||||
from . import models
|
||||
|
||||
|
||||
class StateParameterInline(admin.StackedInline):
|
||||
model = models.StateParameter
|
||||
extra = 1
|
||||
fields = ('key', 'value', 'attachment', 'description')
|
||||
readonly_fields = ('attachment_preview',)
|
||||
@admin.register(models.StateParameter)
|
||||
class StateParameterAdmin(admin.ModelAdmin):
|
||||
"""工艺参数管理"""
|
||||
list_display = (
|
||||
'id',
|
||||
'key',
|
||||
'value',
|
||||
'is_required',
|
||||
'is_image_path',
|
||||
'state_list',
|
||||
'description',
|
||||
'attachment_preview',
|
||||
)
|
||||
search_fields = ('key', 'description')
|
||||
list_filter = ('is_required', 'is_image_path', 'created_at', 'updated_at', 'states__processes__name')
|
||||
readonly_fields = ('attachment_preview_detail', 'value_preview')
|
||||
|
||||
@admin.display(description='附件')
|
||||
def attachment_preview(self, obj):
|
||||
"""显示附件预览"""
|
||||
"""列表中显示是否有附件"""
|
||||
if obj.attachment:
|
||||
return '有'
|
||||
return '无'
|
||||
|
||||
@admin.display(description='所属节点')
|
||||
def state_list(self, obj):
|
||||
"""显示关联的状态节点"""
|
||||
states = obj.states.all()
|
||||
if states:
|
||||
return mark_safe('<br>'.join([f"{state.name}" for state in states]))
|
||||
return '-'
|
||||
|
||||
def attachment_preview_detail(self, obj):
|
||||
"""详情页显示附件预览"""
|
||||
if obj.attachment:
|
||||
if obj.attachment.name.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp')):
|
||||
return mark_safe(f'<img src="{obj.attachment.url}" style="max-width: 200px; max-height: 200px;" />')
|
||||
return mark_safe(f'<img src="{obj.attachment.url}" style="max-width: 400px; max-height: 400px;" />')
|
||||
else:
|
||||
return mark_safe(f'<a href="{obj.attachment.url}" target="_blank">查看附件</a>')
|
||||
return mark_safe(f'<a href="{obj.attachment.url}" target="_blank">下载附件</a>')
|
||||
return "-"
|
||||
attachment_preview.short_description = '附件预览'
|
||||
attachment_preview_detail.short_description = '附件预览'
|
||||
|
||||
def value_preview(self, obj):
|
||||
"""如果标记为图片路径,则显示图片预览"""
|
||||
if obj.is_image_path and obj.value:
|
||||
# 假设 value 是图片 URL
|
||||
return mark_safe(f'<img src="{obj.value}" style="max-width: 400px; max-height: 400px;" onerror="this.style.display=\'none\'; this.parentNode.innerHTML+=\'<span>(图片加载失败)</span>\';" />')
|
||||
return obj.value or "-"
|
||||
value_preview.short_description = 'Value预览'
|
||||
|
||||
|
||||
class ProcessNodeInline(admin.StackedInline):
|
||||
@@ -36,25 +70,22 @@ class StateAdmin(admin.ModelAdmin):
|
||||
'description',
|
||||
'created_at',
|
||||
'updated_at',
|
||||
'parameter_overview',
|
||||
'parameter_count',
|
||||
)
|
||||
search_fields = ('name', 'description')
|
||||
list_filter = ('created_at', 'updated_at', 'processes__name')
|
||||
inlines = [StateParameterInline]
|
||||
filter_horizontal = ('parameters',)
|
||||
|
||||
@admin.display(description='参数概览')
|
||||
def parameter_overview(self, obj: models.State):
|
||||
params = obj.parameters.all()
|
||||
if params:
|
||||
result = []
|
||||
for param in params:
|
||||
param_str = f"{param.key}={param.value}"
|
||||
if param.attachment:
|
||||
param_str += f' <a href="{param.attachment.url}" target="_blank">📎</a>'
|
||||
result.append(param_str)
|
||||
return mark_safe("<br>".join(result))
|
||||
else:
|
||||
return "-"
|
||||
@admin.display(description='参数数量')
|
||||
def parameter_count(self, obj: models.State):
|
||||
count = obj.parameters.count()
|
||||
if count > 0:
|
||||
params = obj.parameters.all()[:3]
|
||||
keys = ', '.join([p.key for p in params])
|
||||
if count > 3:
|
||||
keys += f' 等{count}个'
|
||||
return f"{count} ({keys})"
|
||||
return "0"
|
||||
|
||||
|
||||
@admin.register(models.Process)
|
||||
@@ -125,7 +156,7 @@ class BusinessObjectAdmin(admin.ModelAdmin):
|
||||
messages = []
|
||||
|
||||
for obj in queryset:
|
||||
success, message = services.advance_to_next_state(obj, request.user)
|
||||
success, message, _ = services.advance_to_next_state(obj, request.user)
|
||||
if success:
|
||||
success_count += 1
|
||||
messages.append(f"{obj.name}: {message}")
|
||||
@@ -162,17 +193,19 @@ class BusinessObjectAdmin(admin.ModelAdmin):
|
||||
if overall_status == 'not_started':
|
||||
return '未开始'
|
||||
elif overall_status == 'completed':
|
||||
return '已完成'
|
||||
return f'已完成 ({current_state.name if current_state else "-"})'
|
||||
elif current_state:
|
||||
return current_state.name
|
||||
# 显示最后完成的状态
|
||||
return f'进行中 (已完成: {current_state.name})'
|
||||
return '-'
|
||||
|
||||
@admin.display(description='进度')
|
||||
def progress(self, obj: models.BusinessObject):
|
||||
return f"{obj.get_progress_percentage():.1f}%"
|
||||
|
||||
@admin.display(description='本步骤参数')
|
||||
@admin.display(description='最后完成状态参数')
|
||||
def params(self, obj: models.BusinessObject):
|
||||
"""显示最后完成状态的参数"""
|
||||
current_state = obj.get_current_state()
|
||||
if current_state:
|
||||
params = current_state.parameters.all()
|
||||
|
||||
Reference in New Issue
Block a user