forked from erp-dev/erp
feat: batch add parameters
This commit is contained in:
223
api_v2/tests.py
223
api_v2/tests.py
@@ -1654,3 +1654,226 @@ class PrintingOrderBatchAdvanceRecordsAPITest(TestCase):
|
||||
self.client.logout()
|
||||
response = self.client.get(f'/api/v2/printing-orders/{self.printing_order.id}/batch-advance-records/')
|
||||
self.assertEqual(response.status_code, 401)
|
||||
|
||||
|
||||
class PrintingJobBatchAddParametersAPITest(TestCase):
|
||||
"""测试批量补充工艺参数 API"""
|
||||
|
||||
def setUp(self):
|
||||
self.client = APIClient()
|
||||
self.merchant = basic_models.Merchant.objects.create(
|
||||
name='测试工厂',
|
||||
type=basic_models.MerchantTypeEnum.FACTORY,
|
||||
)
|
||||
self.user = get_user_model().objects.create_user(username='factory_user', password='pass12345')
|
||||
self.employee = basic_models.Employee.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='工厂员工',
|
||||
sys_user=self.user
|
||||
)
|
||||
self.client.force_authenticate(user=self.user)
|
||||
|
||||
# 创建客户
|
||||
self.customer = basic_models.Customer.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='测试客户'
|
||||
)
|
||||
|
||||
# 创建产品类别和产品
|
||||
self.category = basic_models.ProductCategory.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='测试类别'
|
||||
)
|
||||
self.product = basic_models.Product.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='测试产品',
|
||||
category=self.category,
|
||||
unit=basic_models.ProductUnitEnum.METER
|
||||
)
|
||||
|
||||
# 创建流程状态
|
||||
self.state1 = stateflow_models.State.objects.create(name='染色', description='染色工序')
|
||||
self.state2 = stateflow_models.State.objects.create(name='整理', description='整理工序')
|
||||
|
||||
# 创建流程
|
||||
self.process = stateflow_models.Process.objects.create(name='印染流程')
|
||||
stateflow_models.ProcessNode.objects.create(process=self.process, state=self.state1, order=1)
|
||||
stateflow_models.ProcessNode.objects.create(process=self.process, state=self.state2, order=2)
|
||||
|
||||
# 创建印染订单
|
||||
self.printing_order = printing_models.PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='测试面料',
|
||||
width='150cm',
|
||||
process=self.process
|
||||
)
|
||||
|
||||
# 创建印染明细并绑定流程实例
|
||||
self.job1 = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=100,
|
||||
unit='米'
|
||||
)
|
||||
self.job2 = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=200,
|
||||
unit='米'
|
||||
)
|
||||
|
||||
# 创建业务对象并推进到 state1
|
||||
from stateflow import services as stateflow_services
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
|
||||
ct = ContentType.objects.get_for_model(printing_models.PrintingJob)
|
||||
|
||||
self.bo1 = stateflow_models.BusinessObject.objects.create(
|
||||
name=f'PrintingJob-{self.job1.id}',
|
||||
process=self.process,
|
||||
content_type=ct,
|
||||
object_id=self.job1.id
|
||||
)
|
||||
self.job1.business_object = self.bo1
|
||||
self.job1.save()
|
||||
|
||||
self.bo2 = stateflow_models.BusinessObject.objects.create(
|
||||
name=f'PrintingJob-{self.job2.id}',
|
||||
process=self.process,
|
||||
content_type=ct,
|
||||
object_id=self.job2.id
|
||||
)
|
||||
self.job2.business_object = self.bo2
|
||||
self.job2.save()
|
||||
|
||||
# 推进到 state1(创建 state_log)
|
||||
stateflow_services.advance_to_next_state(self.bo1, self.user, temperature='25.0')
|
||||
stateflow_services.advance_to_next_state(self.bo2, self.user, temperature='25.0')
|
||||
|
||||
def test_batch_add_parameters_success(self):
|
||||
"""测试成功批量补充参数"""
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [self.job1.id, self.job2.id],
|
||||
'state_id': self.state1.id,
|
||||
'parameters': {'temperature': '26.0', 'operator': '李四'},
|
||||
'remark': '补测数据'
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
data = response.data
|
||||
self.assertEqual(data['detail'], '批量补充参数成功')
|
||||
self.assertEqual(data['printing_order_id'], self.printing_order.id)
|
||||
self.assertEqual(set(data['printing_job_ids']), {self.job1.id, self.job2.id})
|
||||
self.assertEqual(data['state_id'], self.state1.id)
|
||||
self.assertEqual(data['state_name'], '染色')
|
||||
self.assertEqual(data['affected_count'], 2)
|
||||
|
||||
# 验证创建了批量操作记录
|
||||
record = printing_models.PrintingJobBatchAdvanceRecord.objects.get(id=data['batch_record_id'])
|
||||
self.assertTrue(record.only_parameters)
|
||||
self.assertEqual(record.parameters, {'temperature': '26.0', 'operator': '李四'})
|
||||
self.assertEqual(record.printing_jobs.count(), 2)
|
||||
|
||||
def test_batch_add_parameters_empty_parameters(self):
|
||||
"""测试参数为空时返回错误"""
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [self.job1.id],
|
||||
'state_id': self.state1.id,
|
||||
'parameters': {},
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 400)
|
||||
|
||||
def test_batch_add_parameters_job_not_found(self):
|
||||
"""测试 job 不存在时返回错误"""
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [99999],
|
||||
'state_id': self.state1.id,
|
||||
'parameters': {'temperature': '26.0'},
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertIn('missing_jobs', response.data)
|
||||
|
||||
def test_batch_add_parameters_state_not_found(self):
|
||||
"""测试 state 不存在时返回错误"""
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [self.job1.id],
|
||||
'state_id': 99999,
|
||||
'parameters': {'temperature': '26.0'},
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 400)
|
||||
|
||||
def test_batch_add_parameters_missing_state_log(self):
|
||||
"""测试 job 没有对应 state_log 时返回错误"""
|
||||
# state2 的 state_log 尚未创建(还没推进到那一步)
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [self.job1.id],
|
||||
'state_id': self.state2.id, # 还没推进到这个状态
|
||||
'parameters': {'temperature': '26.0'},
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 400)
|
||||
self.assertIn('missing_state_log', response.data)
|
||||
|
||||
def test_batch_add_parameters_different_orders(self):
|
||||
"""测试 jobs 属于不同订单时返回错误"""
|
||||
# 创建另一个订单和 job
|
||||
another_order = printing_models.PrintingOrder.objects.create(
|
||||
customer=self.customer,
|
||||
fabric='另一面料',
|
||||
width='160cm'
|
||||
)
|
||||
another_job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=another_order,
|
||||
product=self.product,
|
||||
quantity=300,
|
||||
unit='米'
|
||||
)
|
||||
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [self.job1.id, another_job.id],
|
||||
'state_id': self.state1.id,
|
||||
'parameters': {'temperature': '26.0'},
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 400)
|
||||
|
||||
def test_batch_add_parameters_unauthenticated(self):
|
||||
"""测试未登录时返回 401"""
|
||||
self.client.logout()
|
||||
response = self.client.post(
|
||||
'/api/v2/printing-jobs/batch-add-parameters/',
|
||||
{
|
||||
'printing_job_ids': [self.job1.id],
|
||||
'state_id': self.state1.id,
|
||||
'parameters': {'temperature': '26.0'},
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
self.assertEqual(response.status_code, 401)
|
||||
|
||||
Reference in New Issue
Block a user