forked from erp-dev/erp
fix: business cancel service merged
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
"""
|
||||
PrintingJob API 测试
|
||||
"""
|
||||
from decimal import Decimal
|
||||
|
||||
from django.test import TestCase
|
||||
from django.conf import settings
|
||||
from rest_framework.test import APIClient
|
||||
@@ -9,6 +11,7 @@ from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Permission
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from basic_info import models as basic_models
|
||||
from business import models as business_models
|
||||
from printing import models as printing_models
|
||||
from shipment import models as shipment_models
|
||||
from stateflow import models as stateflow_models
|
||||
@@ -101,6 +104,9 @@ class PrintingJobAPITestCase(TestCase):
|
||||
|
||||
def test_create_printing_job(self):
|
||||
"""测试创建印染款式明细"""
|
||||
self.printing_order.external_order_id = 'KD20410611'
|
||||
self.printing_order.save(update_fields=['external_order_id'])
|
||||
|
||||
data = {
|
||||
'printing_order': self.printing_order.id,
|
||||
'product': self.product.id,
|
||||
@@ -113,6 +119,7 @@ class PrintingJobAPITestCase(TestCase):
|
||||
|
||||
response = self.client.post('/api/v1/printing-jobs/', data, format='json')
|
||||
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
|
||||
self.assertEqual(response.data['external_order_id'], 'KD20410611')
|
||||
|
||||
# 新增字段:批量推进记录(稳定输出 key,默认空数组)
|
||||
self.assertIn('batch_advance_records', response.data)
|
||||
@@ -176,6 +183,128 @@ class PrintingJobAPITestCase(TestCase):
|
||||
self.assertIsInstance(item['batch_advance_records'], list)
|
||||
self.assertEqual(len(item['batch_advance_records']), 0)
|
||||
|
||||
def test_list_printing_jobs_includes_is_sales_order_bound(self):
|
||||
"""测试列表返回是否已绑定销售单字段,并支持关闭该字段"""
|
||||
unbound_job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=100,
|
||||
unit='米',
|
||||
)
|
||||
bound_job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=200,
|
||||
unit='米',
|
||||
)
|
||||
warehouse = basic_models.WareHouse.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='测试仓库',
|
||||
mode=basic_models.WareHouseModeEnum.UNRESTRICTED,
|
||||
)
|
||||
sales_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date='2026-06-10',
|
||||
operator=self.employee,
|
||||
warehouse=warehouse,
|
||||
status=business_models.SalesOrderStatusEnum.APPROVED,
|
||||
)
|
||||
business_models.SalesOrderItem.objects.create(
|
||||
sales_order=sales_order,
|
||||
product=self.product,
|
||||
printing_job=bound_job,
|
||||
price='10.00',
|
||||
quantity='1.00',
|
||||
unit='米',
|
||||
empty_diff_percent='0.00',
|
||||
)
|
||||
cancelled_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date='2026-06-10',
|
||||
operator=self.employee,
|
||||
warehouse=warehouse,
|
||||
status=business_models.SalesOrderStatusEnum.CANCELLED,
|
||||
)
|
||||
cancelled_only_job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=300,
|
||||
unit='米',
|
||||
)
|
||||
business_models.SalesOrderItem.objects.create(
|
||||
sales_order=cancelled_order,
|
||||
product=self.product,
|
||||
printing_job=cancelled_only_job,
|
||||
price='10.00',
|
||||
quantity='1.00',
|
||||
unit='米',
|
||||
empty_diff_percent='0.00',
|
||||
)
|
||||
|
||||
response = self.client.get('/api/v1/printing-jobs/')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
bound_by_id = {item['id']: item['is_sales_order_bound'] for item in response.data['results']}
|
||||
billed_by_id = {item['id']: item['billed_quantity'] for item in response.data['results']}
|
||||
self.assertFalse(bound_by_id[unbound_job.id])
|
||||
self.assertTrue(bound_by_id[bound_job.id])
|
||||
self.assertFalse(bound_by_id[cancelled_only_job.id])
|
||||
self.assertEqual(billed_by_id[unbound_job.id], '0.00')
|
||||
self.assertEqual(billed_by_id[bound_job.id], '1.00')
|
||||
self.assertEqual(billed_by_id[cancelled_only_job.id], '0.00')
|
||||
|
||||
response = self.client.get('/api/v1/printing-jobs/?include_sales_order_bound=false')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
for item in response.data['results']:
|
||||
self.assertNotIn('is_sales_order_bound', item)
|
||||
|
||||
def test_billed_quantity_ignores_cancelled_sales_order_items(self):
|
||||
"""测试开单数量忽略已作废销售单明细"""
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=100,
|
||||
unit='米',
|
||||
)
|
||||
warehouse = basic_models.WareHouse.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='开单数量测试仓库',
|
||||
mode=basic_models.WareHouseModeEnum.UNRESTRICTED,
|
||||
)
|
||||
approved_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date='2026-06-10',
|
||||
operator=self.employee,
|
||||
warehouse=warehouse,
|
||||
status=business_models.SalesOrderStatusEnum.APPROVED,
|
||||
)
|
||||
cancelled_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date='2026-06-10',
|
||||
operator=self.employee,
|
||||
warehouse=warehouse,
|
||||
status=business_models.SalesOrderStatusEnum.CANCELLED,
|
||||
)
|
||||
for order, quantity in [(approved_order, '7.50'), (cancelled_order, '20.00')]:
|
||||
business_models.SalesOrderItem.objects.create(
|
||||
sales_order=order,
|
||||
product=self.product,
|
||||
printing_job=job,
|
||||
price='10.00',
|
||||
quantity=quantity,
|
||||
unit='米',
|
||||
empty_diff_percent='0.00',
|
||||
)
|
||||
|
||||
self.assertEqual(job.billed_quantity, Decimal('7.50'))
|
||||
|
||||
response = self.client.get(f'/api/v1/printing-jobs/{job.id}/')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(response.data['billed_quantity'], '7.50')
|
||||
|
||||
def test_mark_production_completed(self):
|
||||
"""测试显式标记完成生产接口"""
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
@@ -283,6 +412,81 @@ class PrintingJobAPITestCase(TestCase):
|
||||
self.assertIsInstance(response.data['batch_advance_records'], list)
|
||||
self.assertEqual(len(response.data['batch_advance_records']), 0)
|
||||
|
||||
def test_retrieve_printing_job_includes_is_sales_order_bound(self):
|
||||
"""测试详情返回是否已绑定销售单字段"""
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=100,
|
||||
unit='米',
|
||||
)
|
||||
warehouse = basic_models.WareHouse.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='详情测试仓库',
|
||||
mode=basic_models.WareHouseModeEnum.UNRESTRICTED,
|
||||
)
|
||||
sales_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date='2026-06-10',
|
||||
operator=self.employee,
|
||||
warehouse=warehouse,
|
||||
status=business_models.SalesOrderStatusEnum.APPROVED,
|
||||
)
|
||||
business_models.SalesOrderItem.objects.create(
|
||||
sales_order=sales_order,
|
||||
product=self.product,
|
||||
printing_job=job,
|
||||
price='10.00',
|
||||
quantity='1.00',
|
||||
unit='米',
|
||||
empty_diff_percent='0.00',
|
||||
)
|
||||
|
||||
response = self.client.get(f'/api/v1/printing-jobs/{job.id}/')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertTrue(response.data['is_sales_order_bound'])
|
||||
self.assertEqual(response.data['billed_quantity'], '1.00')
|
||||
|
||||
response = self.client.get(f'/api/v1/printing-jobs/{job.id}/?include_sales_order_bound=false')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertNotIn('is_sales_order_bound', response.data)
|
||||
|
||||
def test_retrieve_printing_job_ignores_cancelled_sales_order_bound(self):
|
||||
"""测试详情判断销售单绑定时忽略已作废销售单"""
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
quantity=100,
|
||||
unit='米',
|
||||
)
|
||||
warehouse = basic_models.WareHouse.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='详情作废测试仓库',
|
||||
mode=basic_models.WareHouseModeEnum.UNRESTRICTED,
|
||||
)
|
||||
cancelled_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date='2026-06-10',
|
||||
operator=self.employee,
|
||||
warehouse=warehouse,
|
||||
status=business_models.SalesOrderStatusEnum.CANCELLED,
|
||||
)
|
||||
business_models.SalesOrderItem.objects.create(
|
||||
sales_order=cancelled_order,
|
||||
product=self.product,
|
||||
printing_job=job,
|
||||
price='10.00',
|
||||
quantity='1.00',
|
||||
unit='米',
|
||||
empty_diff_percent='0.00',
|
||||
)
|
||||
|
||||
response = self.client.get(f'/api/v1/printing-jobs/{job.id}/')
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertFalse(response.data['is_sales_order_bound'])
|
||||
|
||||
def test_batch_advance_records_in_list_and_detail(self):
|
||||
"""测试 PrintingJob 序列化输出包含批量推进记录(有记录时返回明细,无记录返回空)"""
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
@@ -417,6 +621,9 @@ class PrintingJobAPITestCase(TestCase):
|
||||
|
||||
def test_update_printing_job(self):
|
||||
"""测试更新款式明细"""
|
||||
self.printing_order.external_order_id = 'KD20410611'
|
||||
self.printing_order.save(update_fields=['external_order_id'])
|
||||
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
@@ -442,6 +649,7 @@ class PrintingJobAPITestCase(TestCase):
|
||||
format='json'
|
||||
)
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(response.data['external_order_id'], 'KD20410611')
|
||||
|
||||
job.refresh_from_db()
|
||||
self.assertEqual(job.quantity, 200)
|
||||
@@ -502,6 +710,9 @@ class PrintingJobAPITestCase(TestCase):
|
||||
|
||||
def test_partial_update_printing_job(self):
|
||||
"""测试部分更新款式明细"""
|
||||
self.printing_order.external_order_id = 'KD20410611'
|
||||
self.printing_order.save(update_fields=['external_order_id'])
|
||||
|
||||
job = printing_models.PrintingJob.objects.create(
|
||||
printing_order=self.printing_order,
|
||||
product=self.product,
|
||||
@@ -522,6 +733,7 @@ class PrintingJobAPITestCase(TestCase):
|
||||
format='json'
|
||||
)
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(response.data['external_order_id'], 'KD20410611')
|
||||
|
||||
job.refresh_from_db()
|
||||
self.assertEqual(job.quantity, 150)
|
||||
|
||||
Reference in New Issue
Block a user