1
0
forked from erp-dev/erp

feat: printing module

This commit is contained in:
2025-11-13 18:22:42 +08:00
parent 8097d6941c
commit f071e5fff9
35 changed files with 5537 additions and 440 deletions

View File

@@ -0,0 +1,233 @@
"""
PlateOrder 模型测试
"""
from django.test import TestCase
from django.contrib.auth import get_user_model
from django.utils import timezone
from decimal import Decimal
from printing import models as printing_models
from basic_info import models as basic_models
from stateflow import models as stateflow_models
User = get_user_model()
class PlateOrderModelTestCase(TestCase):
"""测试 PlateOrder 模型"""
def setUp(self):
"""设置测试数据"""
self.user = User.objects.create_user(username='testuser', password='testpass')
# 创建商户
self.merchant = basic_models.Merchant.objects.create(
name='测试印花厂',
type=basic_models.MerchantTypeEnum.FACTORY
)
# 创建客户
self.customer = basic_models.Customer.objects.create(
merchant=self.merchant,
name='测试客户',
mobile='13900139000',
area='测试地区'
)
# 创建员工
self.salesperson = basic_models.Employee.objects.create(
sys_user=self.user,
merchant=self.merchant,
name='销售员',
mobile='13800138000',
job_type=basic_models.EmployeeTypeEnum.PRINTER,
status=basic_models.EmployeeStatusEnum.ACTIVE
)
self.merchandiser = basic_models.Employee.objects.create(
merchant=self.merchant,
name='跟单员',
mobile='13800138001',
job_type=basic_models.EmployeeTypeEnum.ROLLING,
status=basic_models.EmployeeStatusEnum.ACTIVE
)
def test_create_plate_order_basic(self):
"""测试创建基本的开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-1',
design_code='DES001',
customer=self.customer,
plate_type='首版',
urgency_level='正常',
style_name='测试款式',
fabric='纯棉',
width='150cm',
)
self.assertIsNotNone(plate_order.id)
self.assertEqual(plate_order.plate_code, '20251113-1')
self.assertEqual(plate_order.customer, self.customer)
self.assertEqual(plate_order.style_name, '测试款式')
def test_plate_order_with_employees(self):
"""测试带销售员和跟单员的开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-2',
customer=self.customer,
salesperson=self.salesperson,
merchandiser=self.merchandiser,
urgency_level='加急',
)
self.assertEqual(plate_order.salesperson, self.salesperson)
self.assertEqual(plate_order.merchandiser, self.merchandiser)
self.assertEqual(plate_order.urgency_level, '加急')
def test_plate_order_with_ratings(self):
"""测试带质量评级的开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-3',
customer=self.customer,
drawing_rating='A',
color_matching_rating='B',
sample_rating='A',
difficulty_rating='',
is_mark_frame=True,
)
self.assertEqual(plate_order.drawing_rating, 'A')
self.assertEqual(plate_order.color_matching_rating, 'B')
self.assertEqual(plate_order.sample_rating, 'A')
self.assertEqual(plate_order.difficulty_rating, '')
self.assertTrue(plate_order.is_mark_frame)
def test_plate_order_with_dates(self):
"""测试带时间信息的开版订单"""
now = timezone.now()
completion_date = now + timezone.timedelta(days=7)
required_date = (now + timezone.timedelta(days=10)).date()
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-4',
customer=self.customer,
plate_date=now,
completion_date=completion_date,
required_completion_date=required_date,
)
self.assertIsNotNone(plate_order.plate_date)
self.assertIsNotNone(plate_order.completion_date)
self.assertIsNotNone(plate_order.required_completion_date)
def test_plate_order_with_sample_info(self):
"""测试带样品信息的开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-5',
customer=self.customer,
sample_meter='米样1',
required_sample_meters=Decimal('100.50'),
)
self.assertEqual(plate_order.sample_meter, '米样1')
self.assertEqual(plate_order.required_sample_meters, Decimal('100.50'))
def test_plate_order_status_without_business_object(self):
"""测试没有 business_object 时的状态"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-6',
customer=self.customer,
)
self.assertEqual(plate_order.status, '未开始')
self.assertFalse(plate_order.is_completed)
self.assertFalse(plate_order.has_started) # 因为没有 business_object
self.assertEqual(plate_order.progress_percentage, 0.0)
def test_plate_order_with_business_object(self):
"""测试带 business_object 的开版订单"""
# 创建流程
state1 = stateflow_models.State.objects.create(name='画图')
state2 = stateflow_models.State.objects.create(name='调色')
state3 = stateflow_models.State.objects.create(name='套样')
process = stateflow_models.Process.objects.create(name='开版流程')
process.replace_nodes([state1, state2, state3])
# 创建 BusinessObject
business_object = stateflow_models.BusinessObject.objects.create(
name='PlateOrder-Test',
process=process,
)
# 创建开版订单
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-7',
customer=self.customer,
business_object=business_object,
)
self.assertIsNotNone(plate_order.business_object)
self.assertEqual(plate_order.progress_percentage, 0.0)
# 推进一个状态
from stateflow.services import advance_to_next_state
advance_to_next_state(business_object, self.user)
# 刷新并检查状态
plate_order.refresh_from_db()
self.assertEqual(plate_order.status, state2.name) # 应该在第二个状态
self.assertFalse(plate_order.is_completed)
self.assertTrue(plate_order.has_started)
self.assertGreater(plate_order.progress_percentage, 0)
def test_plate_order_str(self):
"""测试字符串表示"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-8',
customer=self.customer,
)
self.assertEqual(str(plate_order), '20251113-8')
def test_plate_order_with_approval_and_order_status(self):
"""测试带审批和订单状态的开版订单"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-9',
customer=self.customer,
approval_result='通过',
is_ordered=True,
customer_feedback='颜色需要调整',
)
self.assertEqual(plate_order.approval_result, '通过')
self.assertTrue(plate_order.is_ordered)
self.assertEqual(plate_order.customer_feedback, '颜色需要调整')
def test_plate_order_unique_plate_code(self):
"""测试版单编号的唯一性"""
printing_models.PlateOrder.objects.create(
plate_code='20251113-10',
customer=self.customer,
)
# 尝试创建相同编号的订单应该失败
with self.assertRaises(Exception):
printing_models.PlateOrder.objects.create(
plate_code='20251113-10',
customer=self.customer,
)
def test_plate_order_nullable_fields(self):
"""测试可空字段"""
plate_order = printing_models.PlateOrder.objects.create(
plate_code='20251113-11',
customer=self.customer,
)
# 验证所有可空字段都可以为空
self.assertIsNone(plate_order.design_code)
self.assertIsNone(plate_order.plate_type)
self.assertIsNone(plate_order.plate_date)
self.assertIsNone(plate_order.salesperson)
self.assertIsNone(plate_order.merchandiser)
self.assertIsNone(plate_order.business_object)