forked from erp-dev/erp
feat: printing module
This commit is contained in:
405
api_v1/views/printing/test_services.py
Normal file
405
api_v1/views/printing/test_services.py
Normal file
@@ -0,0 +1,405 @@
|
||||
"""
|
||||
Tests for printing services
|
||||
"""
|
||||
from django.test import TestCase
|
||||
from django.contrib.auth.models import User
|
||||
from django.conf import settings
|
||||
from basic_info.models import Merchant, MerchantTypeEnum, Employee, Customer, Product
|
||||
from stateflow.models import State, Process
|
||||
from printing.models import PrintingOrder, PrintingJob
|
||||
from api_v1.views.printing.services import PrintingOrderService, PrintingJobService
|
||||
|
||||
|
||||
class PrintingOrderServiceTest(TestCase):
|
||||
"""测试 PrintingOrderService"""
|
||||
|
||||
def setUp(self):
|
||||
"""设置测试数据"""
|
||||
self.user = User.objects.create_user(username='testuser', password='testpass')
|
||||
|
||||
# 创建商户
|
||||
self.merchant = Merchant.objects.create(
|
||||
name='测试印染工厂',
|
||||
type=MerchantTypeEnum.FACTORY,
|
||||
)
|
||||
|
||||
# 创建员工
|
||||
self.employee = Employee.objects.create(
|
||||
sys_user=self.user,
|
||||
name='测试员工',
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建客户
|
||||
self.customer = Customer.objects.create(
|
||||
name='测试客户',
|
||||
mobile='13800138000',
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建产品类别
|
||||
from basic_info.models import ProductCategory
|
||||
self.category = ProductCategory.objects.create(
|
||||
name='测试类别',
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建产品
|
||||
self.product = Product.objects.create(
|
||||
name='测试产品',
|
||||
category=self.category,
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建流程
|
||||
self.state1 = State.objects.create(name='待印染')
|
||||
self.state2 = State.objects.create(name='印染中')
|
||||
self.state3 = State.objects.create(name='已完成')
|
||||
|
||||
self.process = Process.objects.create(name='印染流程')
|
||||
self.process.replace_nodes([self.state1, self.state2, self.state3])
|
||||
|
||||
# 设置默认流程
|
||||
settings.PRINTING_DEFAULT_PROCESS_ID = self.process.id
|
||||
|
||||
def test_get_default_process(self):
|
||||
"""测试获取默认流程"""
|
||||
default_process = PrintingOrderService.get_default_process()
|
||||
self.assertIsNotNone(default_process)
|
||||
self.assertEqual(default_process.id, self.process.id)
|
||||
|
||||
def test_create_printing_order_with_default_process(self):
|
||||
"""测试创建订单使用默认流程"""
|
||||
data = {
|
||||
'customer': self.customer,
|
||||
'fabric': '棉布',
|
||||
'width': '150cm',
|
||||
}
|
||||
|
||||
order = PrintingOrderService.create_printing_order(data, self.user)
|
||||
|
||||
self.assertIsNotNone(order)
|
||||
self.assertEqual(order.process.id, self.process.id)
|
||||
self.assertEqual(order.customer, self.customer)
|
||||
|
||||
def test_create_printing_order_with_custom_process(self):
|
||||
"""测试创建订单指定自定义流程"""
|
||||
custom_process = Process.objects.create(name='自定义流程')
|
||||
|
||||
data = {
|
||||
'customer': self.customer,
|
||||
'fabric': '棉布',
|
||||
'width': '150cm',
|
||||
'process': custom_process,
|
||||
}
|
||||
|
||||
order = PrintingOrderService.create_printing_order(data, self.user)
|
||||
|
||||
self.assertEqual(order.process, custom_process)
|
||||
|
||||
def test_update_printing_order_success(self):
|
||||
"""测试更新订单成功"""
|
||||
order = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
process=self.process,
|
||||
)
|
||||
|
||||
update_data = {
|
||||
'fabric': '真丝',
|
||||
'is_urgent': True,
|
||||
}
|
||||
|
||||
success, message, updated_order = PrintingOrderService.update_printing_order(
|
||||
order, update_data, self.user
|
||||
)
|
||||
|
||||
self.assertTrue(success)
|
||||
self.assertEqual(updated_order.fabric, '真丝')
|
||||
self.assertTrue(updated_order.is_urgent)
|
||||
|
||||
def test_update_printing_order_change_process_when_no_jobs(self):
|
||||
"""测试没有任务时可以修改流程"""
|
||||
order = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
process=self.process,
|
||||
)
|
||||
|
||||
new_process = Process.objects.create(name='新流程')
|
||||
|
||||
success, message, updated_order = PrintingOrderService.update_printing_order(
|
||||
order, {'process': new_process}, self.user
|
||||
)
|
||||
|
||||
self.assertTrue(success)
|
||||
self.assertEqual(updated_order.process, new_process)
|
||||
|
||||
def test_update_printing_order_cannot_change_process_when_job_started(self):
|
||||
"""测试有已开始的任务时不能修改流程"""
|
||||
order = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
process=self.process,
|
||||
)
|
||||
|
||||
# 创建任务并开始流程
|
||||
job = PrintingJob.objects.create(
|
||||
printing_order=order,
|
||||
product=self.product,
|
||||
quantity=10,
|
||||
unit='件',
|
||||
size='100x200',
|
||||
pieces=5,
|
||||
)
|
||||
|
||||
# 使用 service 创建 BusinessObject
|
||||
from stateflow.models import BusinessObject
|
||||
business_object = BusinessObject.objects.create(
|
||||
name=f'PrintingJob-{job.id}',
|
||||
process=self.process,
|
||||
)
|
||||
job.business_object = business_object
|
||||
job.save()
|
||||
|
||||
# 推进状态(模拟开始)
|
||||
from stateflow.services import advance_to_next_state
|
||||
advance_to_next_state(business_object, self.user)
|
||||
|
||||
# 尝试修改流程
|
||||
new_process = Process.objects.create(name='新流程')
|
||||
success, message, _ = PrintingOrderService.update_printing_order(
|
||||
order, {'process': new_process}, self.user
|
||||
)
|
||||
|
||||
self.assertFalse(success)
|
||||
self.assertIn('已开始', message)
|
||||
|
||||
def test_can_change_process(self):
|
||||
"""测试判断是否可以修改流程"""
|
||||
order = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
process=self.process,
|
||||
)
|
||||
|
||||
# 没有任务时可以修改
|
||||
self.assertTrue(PrintingOrderService.can_change_process(order))
|
||||
|
||||
# 有任务但未开始时可以修改
|
||||
job = PrintingJob.objects.create(
|
||||
printing_order=order,
|
||||
product=self.product,
|
||||
quantity=10,
|
||||
unit='件',
|
||||
size='100x200',
|
||||
pieces=5,
|
||||
)
|
||||
self.assertTrue(PrintingOrderService.can_change_process(order))
|
||||
|
||||
def test_get_order_progress(self):
|
||||
"""测试计算订单进度"""
|
||||
order = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
process=self.process,
|
||||
)
|
||||
|
||||
# 没有任务时进度为0
|
||||
self.assertEqual(PrintingOrderService.get_order_progress(order), 0)
|
||||
|
||||
# 创建3个任务(使用 service 以便自动创建 business_object)
|
||||
from .services import PrintingJobService
|
||||
jobs = []
|
||||
for i in range(3):
|
||||
job = PrintingJobService.create_printing_job({
|
||||
'printing_order': order,
|
||||
'product': self.product,
|
||||
'quantity': 10,
|
||||
'unit': '件',
|
||||
'size': '100x200',
|
||||
'pieces': 5,
|
||||
}, self.user)
|
||||
jobs.append(job)
|
||||
|
||||
# 没有开始时进度为0(0/3 = 0%)
|
||||
self.assertEqual(PrintingOrderService.get_order_progress(order), 0)
|
||||
|
||||
# 推进第一个任务到部分完成(还没完成)
|
||||
from stateflow.services import advance_to_next_state
|
||||
advance_to_next_state(jobs[0].business_object, self.user)
|
||||
advance_to_next_state(jobs[0].business_object, self.user)
|
||||
|
||||
# 订单进度仍然是0,因为没有任务完全完成(0/3 = 0%)
|
||||
self.assertEqual(PrintingOrderService.get_order_progress(order), 0)
|
||||
|
||||
# 完成第一个任务
|
||||
advance_to_next_state(jobs[0].business_object, self.user)
|
||||
|
||||
# 订单进度应该是 1/3 = 33%
|
||||
self.assertEqual(PrintingOrderService.get_order_progress(order), 33)
|
||||
|
||||
# 完成第二个任务
|
||||
advance_to_next_state(jobs[1].business_object, self.user)
|
||||
advance_to_next_state(jobs[1].business_object, self.user)
|
||||
advance_to_next_state(jobs[1].business_object, self.user)
|
||||
|
||||
# 订单进度应该是 2/3 = 66%
|
||||
self.assertEqual(PrintingOrderService.get_order_progress(order), 66)
|
||||
|
||||
# 完成所有任务
|
||||
advance_to_next_state(jobs[2].business_object, self.user)
|
||||
advance_to_next_state(jobs[2].business_object, self.user)
|
||||
advance_to_next_state(jobs[2].business_object, self.user)
|
||||
|
||||
# 订单进度应该是 3/3 = 100%
|
||||
self.assertEqual(PrintingOrderService.get_order_progress(order), 100)
|
||||
|
||||
|
||||
class PrintingJobServiceTest(TestCase):
|
||||
"""测试 PrintingJobService"""
|
||||
|
||||
def setUp(self):
|
||||
"""设置测试数据"""
|
||||
self.user = User.objects.create_user(username='testuser', password='testpass')
|
||||
|
||||
# 创建商户
|
||||
self.merchant = Merchant.objects.create(
|
||||
name='测试印染工厂',
|
||||
type=MerchantTypeEnum.FACTORY,
|
||||
)
|
||||
|
||||
# 创建员工
|
||||
self.employee = Employee.objects.create(
|
||||
sys_user=self.user,
|
||||
name='测试员工',
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建客户
|
||||
self.customer = Customer.objects.create(
|
||||
name='测试客户',
|
||||
mobile='13800138000',
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建产品类别
|
||||
from basic_info.models import ProductCategory
|
||||
self.category = ProductCategory.objects.create(
|
||||
name='测试类别',
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建产品
|
||||
self.product = Product.objects.create(
|
||||
name='测试产品',
|
||||
category=self.category,
|
||||
merchant=self.merchant,
|
||||
)
|
||||
|
||||
# 创建流程
|
||||
self.state1 = State.objects.create(name='待印染')
|
||||
self.state2 = State.objects.create(name='印染中')
|
||||
self.state3 = State.objects.create(name='已完成')
|
||||
|
||||
self.process = Process.objects.create(name='印染流程')
|
||||
self.process.replace_nodes([self.state1, self.state2, self.state3])
|
||||
|
||||
# 创建订单
|
||||
self.order = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
process=self.process,
|
||||
)
|
||||
|
||||
def test_create_printing_job_with_business_object(self):
|
||||
"""测试创建任务自动创建 BusinessObject"""
|
||||
data = {
|
||||
'printing_order': self.order,
|
||||
'product': self.product,
|
||||
'quantity': 10,
|
||||
'unit': '件',
|
||||
'size': '100x200',
|
||||
'pieces': 5,
|
||||
}
|
||||
|
||||
job = PrintingJobService.create_printing_job(data, self.user)
|
||||
|
||||
self.assertIsNotNone(job)
|
||||
self.assertIsNotNone(job.business_object)
|
||||
self.assertEqual(job.business_object.process, self.process)
|
||||
|
||||
def test_create_printing_job_without_process(self):
|
||||
"""测试创建任务时订单没有流程"""
|
||||
order_no_process = PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='棉布',
|
||||
width='150cm',
|
||||
)
|
||||
|
||||
data = {
|
||||
'printing_order': order_no_process,
|
||||
'product': self.product,
|
||||
'quantity': 10,
|
||||
'unit': '件',
|
||||
'size': '100x200',
|
||||
'pieces': 5,
|
||||
}
|
||||
|
||||
job = PrintingJobService.create_printing_job(data, self.user)
|
||||
|
||||
self.assertIsNotNone(job)
|
||||
self.assertIsNone(job.business_object)
|
||||
|
||||
def test_update_printing_job(self):
|
||||
"""测试更新任务"""
|
||||
job = PrintingJob.objects.create(
|
||||
printing_order=self.order,
|
||||
product=self.product,
|
||||
quantity=10,
|
||||
unit='件',
|
||||
size='100x200',
|
||||
pieces=5,
|
||||
)
|
||||
|
||||
update_data = {
|
||||
'quantity': 20,
|
||||
'pieces': 10,
|
||||
}
|
||||
|
||||
success, message, updated_job = PrintingJobService.update_printing_job(
|
||||
job, update_data, self.user
|
||||
)
|
||||
|
||||
self.assertTrue(success)
|
||||
self.assertEqual(updated_job.quantity, 20)
|
||||
self.assertEqual(updated_job.pieces, 10)
|
||||
|
||||
def test_get_job_status(self):
|
||||
"""测试获取任务状态"""
|
||||
job = PrintingJob.objects.create(
|
||||
printing_order=self.order,
|
||||
product=self.product,
|
||||
quantity=10,
|
||||
unit='件',
|
||||
size='100x200',
|
||||
pieces=5,
|
||||
)
|
||||
|
||||
status_info = PrintingJobService.get_job_status(job)
|
||||
|
||||
self.assertIn('status', status_info)
|
||||
self.assertIn('status_id', status_info)
|
||||
self.assertIn('is_completed', status_info)
|
||||
self.assertIn('has_started', status_info)
|
||||
|
||||
# 未开始状态
|
||||
self.assertEqual(status_info['status'], '未开始')
|
||||
self.assertFalse(status_info['is_completed'])
|
||||
self.assertFalse(status_info['has_started'])
|
||||
Reference in New Issue
Block a user