1
0
forked from erp-dev/erp

fix: business cancel service merged

This commit is contained in:
2026-06-11 15:33:31 +08:00
parent 65564f772a
commit 80db7867f4
18 changed files with 574 additions and 125 deletions

View File

@@ -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)