1
0
forked from erp-dev/erp

feat: product quick api and param create api

This commit is contained in:
2025-11-19 09:03:15 +08:00
parent 2efd11c019
commit 7f822b0064
20 changed files with 2284 additions and 42 deletions

View File

@@ -196,7 +196,7 @@ class BusinessObjectAdmin(admin.ModelAdmin):
return f'已完成 ({current_state.name if current_state else "-"})'
elif current_state:
# 显示最后完成的状态
return f'进行中 (已完成: {current_state.name})'
return f'进行中 (下一步: {current_state.name})'
return '-'
@admin.display(description='进度')

View File

@@ -236,13 +236,13 @@ def can_advance_to_next_state(business_object: 'models.BusinessObject') -> Tuple
def get_business_object_state_timeline(business_object: 'models.BusinessObject') -> List[dict]:
"""
获取业务对象状态时间线(包括未开始、进行中和已完成的状态)
获取业务对象状态时间线(包括未开始和已完成的状态)
返回格式:
[
{
'state': State对象,
'status': 'not_started' | 'in_progress' | 'completed' | 'cancelled',
'status': 'not_started' | 'completed' | 'cancelled',
'order': 顺序号,
'completed_at': 完成时间(如果已完成),
'completed_by': 完成人(如果已完成),
@@ -255,8 +255,11 @@ def get_business_object_state_timeline(business_object: 'models.BusinessObject')
状态判断规则:
- cancelled: 有日志记录且已撤销
- completed: 有日志记录且未撤销
- in_progress: 没有日志记录,但是 current_state下一个待执行的节点且已有完成记录
- not_started: 其他未开始的节点
- not_started: 没有日志记录(还未完成)
注意:移除了 'in_progress' 状态,因为在当前设计中:
- current_state 表示"下一个待执行的节点",它还未开始执行,所以是 not_started
- 一个节点要么已完成,要么还未开始,没有"进行中"的中间状态
"""
timeline = []
process_nodes = business_object.process.process_nodes.select_related('state').order_by('order', 'id')
@@ -288,12 +291,9 @@ def get_business_object_state_timeline(business_object: 'models.BusinessObject')
cancelled_at = log.cancelled_at
is_cancelled = log.is_cancelled
else:
# 未开始的节点,判断是 in_progress 还是 not_started
# 如果是 current_state 且有任何完成记录,则为 in_progress
if has_any_completed and state.id == current_state_id:
status = 'in_progress'
else:
status = 'not_started'
# 未开始的节点
# current_state 是"下一个待执行的节点",它还未开始,所以状态是 not_started
status = 'not_started'
completed_at = None
completed_by = None
cancelled_at = None

View File

@@ -121,8 +121,8 @@ class BusinessObjectAPITestCase(TestCase):
self.assertEqual(response.data[0]['completed_by'], 'testuser')
self.assertFalse(response.data[0]['is_cancelled'])
# 第二个状态是进行中(下一个待执行的)
self.assertEqual(response.data[1]['status'], 'in_progress')
# 第二和第三个状态都是未开始
self.assertEqual(response.data[1]['status'], 'not_started')
self.assertEqual(response.data[2]['status'], 'not_started')
def test_timeline_api_with_step_back(self):

View File

@@ -117,8 +117,8 @@ class StateFlowServicesTestCase(TestCase):
timeline = self.business_object.get_timeline()
self.assertEqual(timeline[0]['status'], 'completed')
# 第二个状态是 current_state下一个待执行的节点且已有完成记录,所以是 in_progress
self.assertEqual(timeline[1]['status'], 'in_progress')
# 第二个状态是 current_state下一个待执行的节点,还未开始,所以是 not_started
self.assertEqual(timeline[1]['status'], 'not_started')
self.assertEqual(timeline[2]['status'], 'not_started')
self.assertIsNotNone(timeline[0]['completed_by'])
self.assertEqual(timeline[0]['completed_by'].id, self.user.id)