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,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)
# 没有开始时进度为00/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'])