1
0
forked from erp-dev/erp
This commit is contained in:
2026-02-02 17:32:06 +08:00
parent 3c56b9ea8b
commit 117e13195c
2 changed files with 215 additions and 1 deletions

View File

@@ -229,3 +229,180 @@ class PreSalesOrderAPITestCase(TestCase):
self.assertEqual(convert_resp.data['status'], business_models.SalesOrderStatusEnum.PENDING)
sales_order = business_models.SalesOrder.objects.get(id=convert_resp.data['id'])
self.assertEqual(sales_order.from_pre_sales_order_id, order_id)
def test_detail_filters_cancelled_allocation_records(self):
"""单体查询应过滤掉已撤销的配货记录"""
resp = self.client.post('/api/v1/pre-sales-orders/', self.payload, format='json')
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
order_id = resp.data['id']
item_id = resp.data['items'][0]['id']
# 创建库存明细
stock_record = stock_models.StockChangeRecord.objects.create(
merchant=self.merchant,
type=stock_models.StockChangeTypeEnum.ADD,
warehouse=self.warehouse,
source_type=stock_models.StockChangeSourceEnum.PURCHASE,
created_by=self.user,
)
stock_detail1 = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=ProductUnitEnum.METER,
stock_change_record=stock_record,
quantity='10',
)
stock_detail2 = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=ProductUnitEnum.METER,
stock_change_record=stock_record,
quantity='5',
)
# 创建两条配货记录
item = business_models.PreSalesOrderItem.objects.get(id=item_id)
allocation1 = allocation_services.create_allocation_record(
item=item,
stock_ids=[stock_detail1.id],
quantity='10',
unit='',
scanned_by=self.employee,
)
allocation2 = allocation_services.create_allocation_record(
item=item,
stock_ids=[stock_detail2.id],
quantity='5',
unit='',
scanned_by=self.employee,
)
# 撤销第一条记录
allocation_services.cancel_allocation_record_with_unfreeze(record=allocation1)
# 查询单体
detail_resp = self.client.get(f'/api/v1/pre-sales-orders/{order_id}/')
self.assertEqual(detail_resp.status_code, status.HTTP_200_OK)
records = detail_resp.data['items'][0]['allocation_records']
# 应该只包含未撤销的记录
self.assertEqual(len(records), 1)
self.assertEqual(records[0]['id'], allocation2.id)
self.assertEqual(records[0]['status'], business_models.AllocationRecordStatusEnum.ACTIVE)
def test_list_includes_progress_fields(self):
"""列表查询应包含allocated_quantity和progress字段"""
# 创建订单
resp = self.client.post('/api/v1/pre-sales-orders/', self.payload, format='json')
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
order_id = resp.data['id']
item_id = resp.data['items'][0]['id']
# 创建库存并配货
stock_record = stock_models.StockChangeRecord.objects.create(
merchant=self.merchant,
type=stock_models.StockChangeTypeEnum.ADD,
warehouse=self.warehouse,
source_type=stock_models.StockChangeSourceEnum.PURCHASE,
created_by=self.user,
)
stock_detail = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=ProductUnitEnum.METER,
stock_change_record=stock_record,
quantity='12.5',
)
item = business_models.PreSalesOrderItem.objects.get(id=item_id)
allocation_services.create_allocation_record(
item=item,
stock_ids=[stock_detail.id],
quantity='5.0',
unit='',
scanned_by=self.employee,
)
# 查询列表
list_resp = self.client.get('/api/v1/pre-sales-orders/')
self.assertEqual(list_resp.status_code, status.HTTP_200_OK)
self.assertIn('results', list_resp.data)
# 查找当前订单
order_data = None
for order in list_resp.data['results']:
if order['id'] == order_id:
order_data = order
break
self.assertIsNotNone(order_data)
# 验证进度字段存在
self.assertIn('allocated_quantity', order_data)
self.assertIn('progress', order_data)
# 需求量12.5已配货5.0
self.assertEqual(order_data['allocated_quantity'], '5.00')
# 进度 = 5.0 / 12.5 = 0.4
self.assertEqual(order_data['progress'], '0.4000')
def test_list_progress_excludes_cancelled_allocations(self):
"""列表查询的进度字段应排除已撤销的配货记录"""
resp = self.client.post('/api/v1/pre-sales-orders/', self.payload, format='json')
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
order_id = resp.data['id']
item_id = resp.data['items'][0]['id']
# 创建库存
stock_record = stock_models.StockChangeRecord.objects.create(
merchant=self.merchant,
type=stock_models.StockChangeTypeEnum.ADD,
warehouse=self.warehouse,
source_type=stock_models.StockChangeSourceEnum.PURCHASE,
created_by=self.user,
)
stock_detail1 = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=ProductUnitEnum.METER,
stock_change_record=stock_record,
quantity='10',
)
stock_detail2 = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=ProductUnitEnum.METER,
stock_change_record=stock_record,
quantity='5',
)
# 创建两条配货,然后撤销一条
item = business_models.PreSalesOrderItem.objects.get(id=item_id)
allocation1 = allocation_services.create_allocation_record(
item=item,
stock_ids=[stock_detail1.id],
quantity='10',
unit='',
scanned_by=self.employee,
)
allocation2 = allocation_services.create_allocation_record(
item=item,
stock_ids=[stock_detail2.id],
quantity='2.5',
unit='',
scanned_by=self.employee,
)
allocation_services.cancel_allocation_record_with_unfreeze(record=allocation1)
# 查询列表
list_resp = self.client.get('/api/v1/pre-sales-orders/')
self.assertEqual(list_resp.status_code, status.HTTP_200_OK)
order_data = None
for order in list_resp.data['results']:
if order['id'] == order_id:
order_data = order
break
self.assertIsNotNone(order_data)
# 应该只统计未撤销的配货2.5而不是10+2.5
self.assertEqual(order_data['allocated_quantity'], '2.50')
# 进度 = 2.5 / 12.5 = 0.2
self.assertEqual(order_data['progress'], '0.2000')