1
0
forked from erp-dev/erp

fix: comsume_detial_ids

This commit is contained in:
2026-02-02 18:29:17 +08:00
parent 117e13195c
commit 9c07d7d85a
4 changed files with 48 additions and 3 deletions

View File

@@ -1130,6 +1130,26 @@ def _normalize_order_items(
consume_detail_ids_str = ','.join(str(value) for value in normalized_ids)
quantity = _to_positive_int(raw_item.get('quantity'), f'items[{index}].quantity')
num_of_rolls = len(normalized_ids)
details_by_id = stock_models.StockChangeDetail.objects.select_related(
'stock_change_record'
).filter(
id__in=normalized_ids,
merchant=merchant,
).in_bulk()
if len(details_by_id) == len(normalized_ids):
quantities: List[str] = []
for pos, detail_id in enumerate(normalized_ids):
detail = details_by_id[detail_id]
if detail.product_id != product.id:
raise ValueError(
f'items[{index}].consume_detail_ids[{pos}] 产品不匹配'
)
if detail.stock_change_record.warehouse_id != warehouse.id:
raise ValueError(
f'items[{index}].consume_detail_ids[{pos}] 仓库不匹配'
)
quantities.append(format(detail.quantity.normalize(), 'f'))
quantity_of_rolls = ','.join(quantities)
stock_flow_items.append({
'product_id': product.id,
'consume_detail_ids': normalized_ids,

View File

@@ -192,6 +192,7 @@ 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')
class PreSalesOrderSignalTestCase(TransactionTestCase):

View File

@@ -28,11 +28,32 @@ class SalesOrderServiceTestCase(TestCase):
self.relaxed_items = [
{'product_id': self.product.id, 'quantity': 80, 'num_of_rolls': 2, 'price': '28.0', 'unit': ''}
]
stock_record = stock_models.StockChangeRecord.objects.create(
merchant=self.merchant,
type=stock_models.StockChangeTypeEnum.ADD,
warehouse=self.warehouse_strict_out,
source_type=stock_models.StockChangeSourceEnum.PURCHASE,
created_by=self.user,
)
stock_detail_1 = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=self.product.unit,
stock_change_record=stock_record,
quantity='6',
)
stock_detail_2 = stock_models.StockChangeDetail.objects.create(
merchant=self.merchant,
product=self.product,
unit=self.product.unit,
stock_change_record=stock_record,
quantity='4',
)
self.strict_out_items = [
{
'product_id': self.product.id,
'consume_detail_ids': [1, 2],
'quantity': 40,
'consume_detail_ids': [stock_detail_1.id, stock_detail_2.id],
'quantity': 10,
'price': '32.0',
'unit': '',
}
@@ -169,7 +190,9 @@ class SalesOrderServiceTestCase(TestCase):
created_by=self.user,
)
item = sales_order.items.first()
self.assertEqual(item.consume_detail_ids, '1,2')
consume_ids = [str(value) for value in self.strict_out_items[0]['consume_detail_ids']]
self.assertEqual(item.consume_detail_ids, ','.join(consume_ids))
self.assertEqual(item.quantity_of_rolls, '6,4')
def test_sales_order_outgoing_missing_consume_ids_raises(self):
payload = [