1
0
forked from erp-dev/erp

fix: added merchant_id in models of shipment module

This commit is contained in:
2026-01-14 19:43:29 +08:00
parent 8846446ecf
commit 9a367caab7
11 changed files with 558 additions and 10 deletions

View File

@@ -106,6 +106,7 @@ class SalesItemByPrintingOrderAPITestCase(TestCase):
# 创建出货单
self.shipment = shipment_models.Shipment.objects.create(
merchant=self.merchant,
customer=self.customer,
shipment_date='2026-01-14',
created_by=self.user,
@@ -113,6 +114,7 @@ class SalesItemByPrintingOrderAPITestCase(TestCase):
# 创建销售品 - 未关联出货单
self.sales_item1 = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品1',
quantity=Decimal('50.00'),
unit=shipment_models.UnitChoices.METER,
@@ -121,6 +123,7 @@ class SalesItemByPrintingOrderAPITestCase(TestCase):
)
self.sales_item2 = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品2',
quantity=Decimal('30.00'),
unit=shipment_models.UnitChoices.METER,
@@ -132,6 +135,7 @@ class SalesItemByPrintingOrderAPITestCase(TestCase):
# 创建销售品 - 已关联出货单
self.sales_item3 = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品3已出货',
quantity=Decimal('100.00'),
unit=shipment_models.UnitChoices.METER,
@@ -142,6 +146,7 @@ class SalesItemByPrintingOrderAPITestCase(TestCase):
# 创建与该订单无关的销售品
self.sales_item_other = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='其它销售品',
quantity=Decimal('999.00'),
unit=shipment_models.UnitChoices.PIECE,
@@ -304,6 +309,7 @@ class ShipmentCreateAPITestCase(TestCase):
# 创建销售品(未关联出货单)
self.sales_item1 = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品1',
quantity=Decimal('50.00'),
unit=shipment_models.UnitChoices.METER,
@@ -311,6 +317,7 @@ class ShipmentCreateAPITestCase(TestCase):
)
self.sales_item2 = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品2',
quantity=Decimal('30.00'),
unit=shipment_models.UnitChoices.METER,
@@ -319,11 +326,13 @@ class ShipmentCreateAPITestCase(TestCase):
# 创建已关联出货单的销售品
self.existing_shipment = shipment_models.Shipment.objects.create(
merchant=self.merchant,
customer=self.customer,
shipment_date='2026-01-13',
created_by=self.user,
)
self.sales_item_shipped = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品3已出货',
quantity=Decimal('100.00'),
unit=shipment_models.UnitChoices.METER,
@@ -426,3 +435,121 @@ class ShipmentCreateAPITestCase(TestCase):
response = self.client.post('/api/v1/shipment/shipments/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
class ShipmentExternalCreateAPITestCase(TestCase):
"""测试创建出货单 external 版 API"""
def setUp(self):
self.client = APIClient()
# 创建商户
self.merchant = basic_models.Merchant.objects.create(
name='测试印花厂',
type=basic_models.MerchantTypeEnum.FACTORY
)
# 创建用户
self.user = User.objects.create_user(
username='testuser_ext',
password='testpass123',
email='test_ext@example.com'
)
# 创建员工并关联商户
self.employee = basic_models.Employee.objects.create(
sys_user=self.user,
merchant=self.merchant,
name='测试员工Ext',
mobile='13800138002',
status=basic_models.EmployeeStatusEnum.ACTIVE
)
# 创建客户(需要同 merchant
self.customer = basic_models.Customer.objects.create(
merchant=self.merchant,
name='测试客户Ext',
mobile='13900139002',
area='测试地区Ext'
)
# 创建一个销售品(用于验证 external 版不会绑定任何销售品)
self.sales_item = shipment_models.SalesItem.objects.create(
merchant=self.merchant,
name='销售品-不应被绑定',
quantity=Decimal('10.00'),
unit=shipment_models.UnitChoices.METER,
created_by=self.user,
)
self.client.force_authenticate(user=self.user)
def test_create_external_shipment_success(self):
data = {
'customer': self.customer.id,
'shipment_date': '2026-01-14',
'remark': 'external 备注',
'external_id': 'EXT-ORDER-001',
'external_finished_products': [
{'style_name': '款式A', 'num_of_rolls': 2},
{'style_name': '款式B', 'num_of_rolls': 5},
]
}
response = self.client.post('/api/v1/shipment/shipments/external/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
result = response.json()
self.assertEqual(result['customer'], self.customer.id)
self.assertEqual(result['external_id'], 'EXT-ORDER-001')
self.assertEqual(result['items_count'], 0)
self.assertEqual(result['external_finished_products_count'], 2)
shipment_id = result['id']
# 验证外部成品表写入并关联
self.assertEqual(
shipment_models.ExternalFinishedProduct.objects.filter(shipment_id=shipment_id).count(),
2
)
# 验证不会绑定任何销售品
self.sales_item.refresh_from_db()
self.assertIsNone(self.sales_item.shipment_id)
def test_create_external_shipment_external_id_required(self):
data = {
'customer': self.customer.id,
'shipment_date': '2026-01-14',
'external_id': ' ',
'external_finished_products': [
{'style_name': '款式A', 'num_of_rolls': 1},
]
}
response = self.client.post('/api/v1/shipment/shipments/external/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('external_id', response.json())
def test_create_external_shipment_products_required(self):
data = {
'customer': self.customer.id,
'shipment_date': '2026-01-14',
'external_id': 'EXT-ORDER-002',
'external_finished_products': []
}
response = self.client.post('/api/v1/shipment/shipments/external/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('external_finished_products', response.json())
def test_create_external_shipment_unauthenticated(self):
self.client.logout()
data = {
'customer': self.customer.id,
'shipment_date': '2026-01-14',
'external_id': 'EXT-ORDER-003',
'external_finished_products': [
{'style_name': '款式A', 'num_of_rolls': 1},
]
}
response = self.client.post('/api/v1/shipment/shipments/external/', data, format='json')
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)