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

@@ -0,0 +1,265 @@
"""
测试 PlateOrder advance_to_next_state 是否会跳步
"""
from django.test import TestCase
from django.contrib.auth import get_user_model
from printing import models as printing_models
from stateflow import models as stateflow_models
from basic_info import models as basic_info_models
from stateflow import services as stateflow_services
from django.conf import settings
User = get_user_model()
class PlateOrderAdvanceTestCase(TestCase):
"""测试 PlateOrder 推进到下一步是否会跳步"""
def setUp(self):
"""设置测试数据"""
# 创建用户
self.user = User.objects.create_user(username='testuser', password='testpass123')
# 创建商户
self.merchant = basic_info_models.Merchant.objects.create(
name='测试商户',
type=basic_info_models.MerchantTypeEnum.FACTORY
)
# 创建客户
self.customer = basic_info_models.Customer.objects.create(
name='测试客户',
merchant=self.merchant
)
# 创建流程 - 至少3个状态节点
self.process = stateflow_models.Process.objects.create(
name='开版流程测试',
description='用于测试的开版流程'
)
# 创建3个状态
self.state1 = stateflow_models.State.objects.create(
name='设计',
description='设计阶段'
)
self.state2 = stateflow_models.State.objects.create(
name='制版',
description='制版阶段'
)
self.state3 = stateflow_models.State.objects.create(
name='验收',
description='验收阶段'
)
# 创建流程节点
self.node1 = stateflow_models.ProcessNode.objects.create(
process=self.process,
state=self.state1,
order=1
)
self.node2 = stateflow_models.ProcessNode.objects.create(
process=self.process,
state=self.state2,
order=2
)
self.node3 = stateflow_models.ProcessNode.objects.create(
process=self.process,
state=self.state3,
order=3
)
def test_plate_order_advance_step_by_step(self):
"""测试 PlateOrder 一步一步推进,不应该跳步"""
# 创建 PlateOrder使用测试流程
plate_order = printing_models.PlateOrder.objects.create(
design_code='TEST001',
customer=self.customer,
style_name='测试款式',
process=self.process.id # 使用测试流程ID
)
# 验证 business_object 已创建
self.assertIsNotNone(plate_order.business_object)
bo = plate_order.business_object
# 初始状态:应该是第一个节点
current = stateflow_services.get_business_object_current_state(bo)
self.assertIsNotNone(current)
self.assertEqual(current.id, self.state1.id, "初始状态应该是 state1")
# 检查进度
progress = stateflow_services.get_progress_percentage(bo)
self.assertEqual(progress, 0.0, "初始进度应该是 0%")
print(f"\n初始状态: {current.name}")
print(f"初始进度: {progress}%")
# 第一次推进:完成 state1
success, message, state_log = stateflow_services.advance_to_next_state(bo, self.user)
self.assertTrue(success, f"第一次推进应该成功: {message}")
self.assertEqual(state_log.state.id, self.state1.id, "第一次推进应该完成 state1")
# 检查完成后的状态
current_after_1 = stateflow_services.get_business_object_current_state(bo)
progress_after_1 = stateflow_services.get_progress_percentage(bo)
print(f"\n第一次推进后:")
print(f" 完成的状态: {state_log.state.name}")
print(f" 当前状态 (下一个待执行): {current_after_1.name if current_after_1 else 'None'}")
print(f" 进度: {progress_after_1}%")
self.assertIsNotNone(current_after_1, "第一次推进后current_state 应该是 state2")
self.assertEqual(current_after_1.id, self.state2.id, "第一次推进后,下一个待执行应该是 state2")
self.assertAlmostEqual(progress_after_1, 33.33, places=1, msg="完成1/3进度应该约为 33.33%")
# 第二次推进:完成 state2
success, message, state_log = stateflow_services.advance_to_next_state(bo, self.user)
self.assertTrue(success, f"第二次推进应该成功: {message}")
self.assertEqual(state_log.state.id, self.state2.id, "第二次推进应该完成 state2")
# 检查完成后的状态
current_after_2 = stateflow_services.get_business_object_current_state(bo)
progress_after_2 = stateflow_services.get_progress_percentage(bo)
print(f"\n第二次推进后:")
print(f" 完成的状态: {state_log.state.name}")
print(f" 当前状态 (下一个待执行): {current_after_2.name if current_after_2 else 'None'}")
print(f" 进度: {progress_after_2}%")
self.assertIsNotNone(current_after_2, "第二次推进后current_state 应该是 state3")
self.assertEqual(current_after_2.id, self.state3.id, "第二次推进后,下一个待执行应该是 state3")
self.assertAlmostEqual(progress_after_2, 66.67, places=1, msg="完成2/3进度应该约为 66.67%")
# 第三次推进:完成 state3
success, message, state_log = stateflow_services.advance_to_next_state(bo, self.user)
self.assertTrue(success, f"第三次推进应该成功: {message}")
self.assertEqual(state_log.state.id, self.state3.id, "第三次推进应该完成 state3")
# 检查完成后的状态
current_after_3 = stateflow_services.get_business_object_current_state(bo)
progress_after_3 = stateflow_services.get_progress_percentage(bo)
print(f"\n第三次推进后:")
print(f" 完成的状态: {state_log.state.name}")
print(f" 当前状态 (下一个待执行): {current_after_3}")
print(f" 进度: {progress_after_3}%")
self.assertIsNone(current_after_3, "第三次推进后所有状态都已完成current_state 应该是 None")
self.assertEqual(progress_after_3, 100.0, "完成3/3进度应该是 100%")
# 验证不能再推进了
success, message, _ = stateflow_services.advance_to_next_state(bo, self.user)
self.assertFalse(success, "流程已完成,不应该能继续推进")
self.assertIn("已完成", message, "应该提示流程已完成")
print(f"\n第四次推进(应该失败): {message}")
# 验证 StateFlowRecord 的数量
completed_count = bo.state_logs.filter(is_cancelled=False).count()
self.assertEqual(completed_count, 3, "应该有3条完成记录")
print(f"\n总结:")
print(f" - 共推进3次完成3个状态")
print(f" - 没有跳步")
print(f" - 完成记录数: {completed_count}")
def test_plate_order_with_default_process(self):
"""测试使用默认流程ID的 PlateOrder"""
# 确保默认流程存在
default_process_id = getattr(settings, 'PLATE_ORDER_DEFAULT_PROCESS_ID', None)
if default_process_id:
try:
default_process = stateflow_models.Process.objects.get(id=default_process_id)
print(f"\n默认流程: {default_process.name} (ID: {default_process_id})")
# 创建 PlateOrder会使用默认流程
plate_order = printing_models.PlateOrder.objects.create(
design_code='TEST002',
customer=self.customer,
style_name='测试款式2'
)
self.assertIsNotNone(plate_order.business_object)
self.assertEqual(plate_order.process, default_process_id)
# 获取默认流程的节点数
node_count = default_process.process_nodes.count()
print(f"默认流程节点数: {node_count}")
if node_count > 0:
# 测试第一次推进
bo = plate_order.business_object
first_state = stateflow_services.get_business_object_current_state(bo)
print(f"初始状态: {first_state.name if first_state else 'None'}")
success, message, state_log = stateflow_services.advance_to_next_state(bo, self.user)
if success:
print(f"第一次推进成功: {message}")
current = stateflow_services.get_business_object_current_state(bo)
print(f"推进后的当前状态: {current.name if current else 'None (已完成)'}")
else:
print(f"第一次推进失败: {message}")
except stateflow_models.Process.DoesNotExist:
print(f"\n警告默认流程ID {default_process_id} 不存在")
self.skipTest(f"默认流程ID {default_process_id} 不存在")
else:
print("\n警告:未配置 PLATE_ORDER_DEFAULT_PROCESS_ID")
self.skipTest("未配置 PLATE_ORDER_DEFAULT_PROCESS_ID")
def test_status_display_consistency(self):
"""测试 status 显示的一致性"""
# 创建 PlateOrder
plate_order = printing_models.PlateOrder.objects.create(
design_code='TEST003',
customer=self.customer,
style_name='测试款式3',
process=self.process.id
)
bo = plate_order.business_object
print(f"\n=== 测试 PlateOrder status 显示 ===")
print(f"初始状态:")
print(f" plate_order.status = '{plate_order.status}'")
print(f" plate_order.status_id = {plate_order.status_id}")
print(f" current_state (services) = {stateflow_services.get_business_object_current_state(bo).name if stateflow_services.get_business_object_current_state(bo) else 'None'}")
print(f" 进度 = {plate_order.progress_percentage}%")
# 第一次推进
success, message, state_log = stateflow_services.advance_to_next_state(bo, self.user)
self.assertTrue(success)
plate_order.refresh_from_db()
print(f"\n第一次推进后(完成: {state_log.state.name}:")
print(f" plate_order.status = '{plate_order.status}'")
print(f" plate_order.status_id = {plate_order.status_id}")
print(f" current_state (services) = {stateflow_services.get_business_object_current_state(bo).name if stateflow_services.get_business_object_current_state(bo) else 'None'}")
print(f" 进度 = {plate_order.progress_percentage}%")
print(f" 已完成的状态: {[log.state.name for log in bo.state_logs.filter(is_cancelled=False)]}")
# 验证第一次推进后status 应该显示下一个待执行的状态state2
self.assertEqual(plate_order.status, self.state2.name,
f"第一次推进后status 应该是 '{self.state2.name}',但实际是 '{plate_order.status}'")
self.assertEqual(plate_order.status_id, self.state2.id,
f"第一次推进后status_id 应该是 {self.state2.id},但实际是 {plate_order.status_id}")
# 第二次推进
success, message, state_log = stateflow_services.advance_to_next_state(bo, self.user)
self.assertTrue(success)
plate_order.refresh_from_db()
print(f"\n第二次推进后(完成: {state_log.state.name}:")
print(f" plate_order.status = '{plate_order.status}'")
print(f" plate_order.status_id = {plate_order.status_id}")
print(f" current_state (services) = {stateflow_services.get_business_object_current_state(bo).name if stateflow_services.get_business_object_current_state(bo) else 'None'}")
print(f" 进度 = {plate_order.progress_percentage}%")
print(f" 已完成的状态: {[log.state.name for log in bo.state_logs.filter(is_cancelled=False)]}")
# 验证第二次推进后status 应该显示下一个待执行的状态state3
self.assertEqual(plate_order.status, self.state3.name,
f"第二次推进后status 应该是 '{self.state3.name}',但实际是 '{plate_order.status}'")
self.assertEqual(plate_order.status_id, self.state3.id,
f"第二次推进后status_id 应该是 {self.state3.id},但实际是 {plate_order.status_id}")