From 1c630606c8446454154667d3a69ba04aa57b1ac1 Mon Sep 17 00:00:00 2001 From: colaftc Date: Mon, 2 Feb 2026 18:45:29 +0800 Subject: [PATCH] fix: quantity when converting to sales_order --- api_v1/test_pre_sales_order_api.py | 7 ++++--- business/pre_order_services.py | 15 ++++++++++++++- business/tests/test_pre_sales_order.py | 7 ++++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/api_v1/test_pre_sales_order_api.py b/api_v1/test_pre_sales_order_api.py index 821f280..63e3b15 100644 --- a/api_v1/test_pre_sales_order_api.py +++ b/api_v1/test_pre_sales_order_api.py @@ -209,12 +209,12 @@ class PreSalesOrderAPITestCase(TestCase): product=self.product, unit=ProductUnitEnum.METER, stock_change_record=stock_record, - quantity='10', + quantity='12', ) allocation_services.create_allocation_record( item=item, stock_ids=[stock_detail.id], - quantity='10', + quantity='12', unit='米', scanned_by=self.employee, ) @@ -229,7 +229,8 @@ 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) - self.assertEqual(sales_order.items.first().quantity_of_rolls, '10') + self.assertEqual(sales_order.items.first().quantity_of_rolls, '12') + self.assertEqual(str(sales_order.items.first().quantity), '12.00') def test_detail_filters_cancelled_allocation_records(self): """单体查询应过滤掉已撤销的配货记录""" diff --git a/business/pre_order_services.py b/business/pre_order_services.py index 0ce7564..6dc7a02 100644 --- a/business/pre_order_services.py +++ b/business/pre_order_services.py @@ -9,6 +9,7 @@ from django.core.exceptions import ValidationError from django.utils import timezone from basic_info import models as basic_info_models +from stock import models as stock_models from . import models from . import services as business_services @@ -437,11 +438,23 @@ def convert_pre_sales_order_to_sales_order( if not consume_ids: raise ValueError(f'明细 {item.id} 缺少配货库存明细') + quantity_from_details: Decimal | None = None + if consume_ids: + details_by_id = stock_models.StockChangeDetail.objects.filter( + id__in=consume_ids, + merchant=merchant, + ).in_bulk() + if details_by_id: + total = Decimal('0') + for detail in details_by_id.values(): + total += detail.quantity + quantity_from_details = total + items_payload.append( { 'product_id': item.product_id, 'price': '0', - 'quantity': str(item.quantity), + 'quantity': str(quantity_from_details or item.quantity), 'unit': item.unit or None, 'color': item.color, 'spec': item.spec, diff --git a/business/tests/test_pre_sales_order.py b/business/tests/test_pre_sales_order.py index e52d1f0..7c5251c 100644 --- a/business/tests/test_pre_sales_order.py +++ b/business/tests/test_pre_sales_order.py @@ -166,13 +166,13 @@ class PreSalesOrderServiceTestCase(TestCase): product=self.product, unit=basic_models.ProductUnitEnum.METER, stock_change_record=stock_record, - quantity='10', + quantity='12', ) allocation_services.create_allocation_record( item=item, stock_ids=[stock_detail.id], - quantity='10', + quantity='12', unit='米', scanned_by=self.operator, ) @@ -192,7 +192,8 @@ class PreSalesOrderServiceTestCase(TestCase): sales_item = sales_order.items.first() self.assertEqual(sales_item.product_id, self.product.id) self.assertEqual(sales_item.consume_detail_ids, str(stock_detail.id)) - self.assertEqual(sales_item.quantity_of_rolls, '10') + self.assertEqual(sales_item.quantity_of_rolls, '12') + self.assertEqual(str(sales_item.quantity), '12.00') class PreSalesOrderSignalTestCase(TransactionTestCase):