From 70b3a0d246c4a5755fa41eedd6bc4e1c7c4741ae Mon Sep 17 00:00:00 2001 From: colaftc Date: Mon, 22 Jun 2026 22:27:28 +0800 Subject: [PATCH] feat: red flush and cost --- .env | 2 +- api_v1/tests.py | 45 ++ api_v1/views/business/purchase/views.py | 3 + .../views/business/purchase_return/views.py | 3 + api_v1/views/business/sales/views.py | 26 ++ api_v1/views/business/sales_return/views.py | 3 + api_v1/views/printing/serializers.py | 54 ++- api_v1/views/printing/views.py | 22 +- .../0032_order_balance_before_snapshot.py | 31 ++ business/models.py | 16 + business/services.py | 26 +- .../tests/test_balance_before_snapshot.py | 225 ++++++++++ business/tests/test_red_flush_services.py | 31 ++ business/tests/test_statement_services.py | 342 ++++++++++++++ celerybeat-schedule | Bin 12288 -> 12288 bytes celerybeat-schedule-shm | Bin 32768 -> 32768 bytes celerybeat-schedule-wal | Bin 4120032 -> 4120032 bytes docker-compose.yml | 2 +- docs/2026-06-12_business_red_flush_api.md | 4 +- docs/2026-06-12_business_red_flush_design.md | 21 +- ...6-06-22_balance_before_snapshot_handoff.md | 423 ++++++++++++++++++ docs/business_api_reference.md | 6 +- docs/sales_order_approval_and_red_flush.md | 6 +- docs/开版看板-plate-orders接口字段使用清单.md | 102 +++++ flower/settings.py | 2 + 25 files changed, 1375 insertions(+), 20 deletions(-) create mode 100644 business/migrations/0032_order_balance_before_snapshot.py create mode 100644 business/tests/test_balance_before_snapshot.py create mode 100644 docs/2026-06-22_balance_before_snapshot_handoff.md create mode 100644 docs/开版看板-plate-orders接口字段使用清单.md diff --git a/.env b/.env index fefb949..87795b7 100644 --- a/.env +++ b/.env @@ -1,6 +1,6 @@ SECRET_KEY=testing_$weak_secret_is_allowd DEBUG=True -ALLOWED_HOSTS=yuwenerp.yuwen.cloud,localhost, +ALLOWED_HOSTS=yuwenerp.yuwen.cloud,localhost,testbackend.yuwen.cloud DB_HOST=pgm-7xvr252q2037b3s5.pg.rds.aliyuncs.com DB_PORT=6432 DB_NAME=flower diff --git a/api_v1/tests.py b/api_v1/tests.py index 7ea0fcd..6036637 100644 --- a/api_v1/tests.py +++ b/api_v1/tests.py @@ -224,8 +224,10 @@ class PurchaseOrderAPITestCase(TestCase): self.assertIn('id', response.data) self.assertIn('human_id', response.data) self.assertEqual(response.data['status'], 1) + self.assertEqual(response.data['balance_before_snapshot'], Decimal('0')) self.assertIn('等待审批', response.data['message']) order = business_models.PurchaseOrder.objects.get(id=response.data['id']) + self.assertEqual(order.balance_before_snapshot, Decimal('0')) expected_human_id = f"CG{order.created_at.strftime('%Y%m%d')}{order.id:06d}" self.assertEqual(response.data['human_id'], expected_human_id) mock_delay.assert_not_called() @@ -499,6 +501,8 @@ class SalesOrderAPITestCase(TestCase): expected_human_id = f"XS{order.created_at.strftime('%Y%m%d')}{order.id:06d}" self.assertEqual(response.data['human_id'], expected_human_id) self.assertEqual(response.data['status'], business_models.SalesOrderStatusEnum.PENDING) + self.assertEqual(response.data['balance_before_snapshot'], Decimal('0')) + self.assertEqual(order.balance_before_snapshot, Decimal('0')) mock_delay.assert_not_called() def test_create_sales_order_invalid_customer(self): @@ -726,7 +730,9 @@ class PurchaseReturnOrderAPITestCase(TestCase): self.assertIn('id', response.data) self.assertIn('human_id', response.data) self.assertEqual(response.data['status'], business_models.PurchaseReturnStatusEnum.PENDING) + self.assertEqual(response.data['balance_before_snapshot'], Decimal('0')) order = business_models.PurchaseReturnOrder.objects.get(id=response.data['id']) + self.assertEqual(order.balance_before_snapshot, Decimal('0')) expected_human_id = f"CT{order.created_at.strftime('%Y%m%d')}{order.id:06d}" self.assertEqual(response.data['human_id'], expected_human_id) @@ -880,7 +886,9 @@ class SalesReturnOrderAPITestCase(TestCase): self.assertEqual(response.status_code, status.HTTP_201_CREATED) self.assertIn('human_id', response.data) self.assertEqual(response.data['status'], business_models.SalesReturnStatusEnum.PENDING) + self.assertEqual(response.data['balance_before_snapshot'], Decimal('0')) order = business_models.SalesReturnOrder.objects.get(id=response.data['id']) + self.assertEqual(order.balance_before_snapshot, Decimal('0')) expected_human_id = f"XT{order.created_at.strftime('%Y%m%d')}{order.id:06d}" self.assertEqual(response.data['human_id'], expected_human_id) @@ -1462,6 +1470,43 @@ class BusinessRedFlushAPITestCase(TestCase): self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertTrue(response.data['is_red_flushed']) + def test_sales_order_red_flush_without_stock_success(self): + order = services.create_sales_order( + merchant=self.merchant, + customer=self.customer, + order_date=datetime.date(2025, 11, 26), + warehouse=self.warehouse, + operator=self.employee, + items=self._items(quantity='8', price='7'), + ) + services.review_sales_order( + sales_order=order, + target_status=business_models.SalesOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + response = self.client.post( + f'/api/v1/sales-orders/{order.id}/red-flush/', + {'reason': '销售无库存红冲'}, + format='json', + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertTrue(response.data['is_red_flushed']) + order.refresh_from_db() + self.assertTrue(order.is_red_flushed) + self.assertEqual( + business_models.BalanceChangeRecord.objects.filter( + source_type=business_models.BalanceChangeSourceEnum.SALES_ORDER, + source_id=order.id, + red_flush_id=order.red_flush_id, + ).count(), + 2, + ) + self.assertFalse( + stock_models.StockChangeRecord.objects.filter(red_flush_id=order.red_flush_id).exists() + ) + def test_purchase_return_order_red_flush_success(self): order = self._create_approved_purchase_return_order() response = self.client.post( diff --git a/api_v1/views/business/purchase/views.py b/api_v1/views/business/purchase/views.py index 5161437..9fc3925 100644 --- a/api_v1/views/business/purchase/views.py +++ b/api_v1/views/business/purchase/views.py @@ -54,12 +54,14 @@ class PurchaseOrderSerializer(serializers.ModelSerializer): 'total_amount', 'diff_quantity', 'total_quantity', 'operator', 'operator_name', 'warehouse', 'warehouse_name', 'status', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', 'remarks', 'created_at', 'updated_at', 'items', 'quantity_of_rolls', ] read_only_fields = [ 'id', 'created_at', 'updated_at', 'items', 'supplier_name', 'operator_name', 'warehouse_name', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', ] @@ -142,6 +144,7 @@ class PurchaseOrderView(StockChangeViewMixin, views.APIView): 'id': purchase_order.id, 'human_id': purchase_order.human_id, 'status': purchase_order.status, + 'balance_before_snapshot': purchase_order.balance_before_snapshot, 'message': '采购单创建成功,等待审批', }, status=status.HTTP_201_CREATED, diff --git a/api_v1/views/business/purchase_return/views.py b/api_v1/views/business/purchase_return/views.py index 245b7b0..e47e6d7 100644 --- a/api_v1/views/business/purchase_return/views.py +++ b/api_v1/views/business/purchase_return/views.py @@ -58,12 +58,14 @@ class PurchaseReturnOrderSerializer(serializers.ModelSerializer): 'total_amount', 'diff_quantity', 'total_quantity', 'operator', 'operator_name', 'warehouse', 'warehouse_name', 'status', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', 'remarks', 'created_at', 'updated_at', 'items', 'quantity_of_rolls', ] read_only_fields = [ 'id', 'created_at', 'updated_at', 'items', 'supplier_name', 'operator_name', 'warehouse_name', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', ] @@ -144,6 +146,7 @@ class PurchaseReturnOrderView(StockChangeViewMixin, views.APIView): 'id': purchase_return.id, 'human_id': purchase_return.human_id, 'status': purchase_return.status, + 'balance_before_snapshot': purchase_return.balance_before_snapshot, 'message': '采购退货单创建成功,等待审批', }, status=status.HTTP_201_CREATED, diff --git a/api_v1/views/business/sales/views.py b/api_v1/views/business/sales/views.py index 9f81009..2ea408b 100644 --- a/api_v1/views/business/sales/views.py +++ b/api_v1/views/business/sales/views.py @@ -55,12 +55,14 @@ class SalesOrderSerializer(serializers.ModelSerializer): 'total_amount', 'diff_quantity', 'total_quantity', 'operator', 'operator_name', 'warehouse', 'warehouse_name', 'status', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', 'remarks', 'created_at', 'updated_at', 'items', 'quantity_of_rolls', ] read_only_fields = [ 'id', 'created_at', 'updated_at', 'items', 'customer_name', 'operator_name', 'warehouse_name', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', ] @@ -83,6 +85,29 @@ class SalesOrderView(StockChangeViewMixin, views.APIView): queryset = business_models.SalesOrder.objects.filter(merchant=merchant).prefetch_related( 'items', 'customer', 'operator', 'warehouse' ) + + # Query 参数过滤 + qp = request.query_params + customer_id = qp.get('customer') + warehouse_id = qp.get('warehouse') + status_value = qp.get('status') + kind = qp.get('kind') + + if customer_id: + try: + queryset = queryset.filter(customer_id=int(customer_id)) + except (TypeError, ValueError): + pass + if warehouse_id: + try: + queryset = queryset.filter(warehouse_id=int(warehouse_id)) + except (TypeError, ValueError): + pass + if status_value: + queryset = queryset.filter(status=status_value) + if kind: + queryset = queryset.filter(kind=kind) + paginator = self.pagination_class() page = paginator.paginate_queryset(queryset.order_by('-created_at'), request, view=self) serializer = SalesOrderSerializer(page, many=True) @@ -145,6 +170,7 @@ class SalesOrderView(StockChangeViewMixin, views.APIView): 'id': sales_order.id, 'human_id': sales_order.human_id, 'status': sales_order.status, + 'balance_before_snapshot': sales_order.balance_before_snapshot, 'message': '销售单创建成功,等待审批', }, status=status.HTTP_201_CREATED, diff --git a/api_v1/views/business/sales_return/views.py b/api_v1/views/business/sales_return/views.py index 205d833..78049a7 100644 --- a/api_v1/views/business/sales_return/views.py +++ b/api_v1/views/business/sales_return/views.py @@ -57,12 +57,14 @@ class SalesReturnOrderSerializer(serializers.ModelSerializer): 'total_amount', 'diff_quantity', 'total_quantity', 'quantity_of_rolls', 'operator', 'operator_name', 'warehouse', 'warehouse_name', 'status', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', 'remarks', 'created_at', 'updated_at', 'items', ] read_only_fields = [ 'id', 'created_at', 'updated_at', 'items', 'customer_name', 'operator_name', 'warehouse_name', 'is_red_flushed', 'red_flush_id', 'red_flushed_at', + 'balance_before_snapshot', ] @@ -143,6 +145,7 @@ class SalesReturnOrderView(StockChangeViewMixin, views.APIView): 'id': sales_return.id, 'human_id': sales_return.human_id, 'status': sales_return.status, + 'balance_before_snapshot': sales_return.balance_before_snapshot, 'message': '销售退货单创建成功,等待审批', }, status=status.HTTP_201_CREATED, diff --git a/api_v1/views/printing/serializers.py b/api_v1/views/printing/serializers.py index 1a026a6..13d7ba8 100644 --- a/api_v1/views/printing/serializers.py +++ b/api_v1/views/printing/serializers.py @@ -303,7 +303,7 @@ class PrintingOrderCreateUpdateSerializer(serializers.ModelSerializer): 'fabric_source', 'is_fabric_received', 'craft', 'description', 'outgoing_date', 'curve', 'new_curve', 'position', 'printing_warn', 'rolling_warn', 'production_warn', 'is_invalid', - 'process' + 'process', 'external_order_id', ] read_only_fields = ['id'] @@ -651,6 +651,58 @@ class PlateOrderDesignCodeMixin: return data +class PlateOrderKanbanListSerializer(serializers.ModelSerializer): + """开版订单看板列表序列化器(精简版,仅包含看板实际使用的字段,消除 N+1 查询)""" + customer_name = serializers.CharField(source="customer.name", read_only=True) + salesperson_name = serializers.CharField(source="salesperson.name", read_only=True) + merchandiser_name = serializers.CharField(source="merchandiser.name", read_only=True) + created_by_name = serializers.CharField(source="created_by.employee.name", read_only=True, default=None) + process_name = serializers.CharField(source="annotated_process_name", read_only=True, default=None) + plate_image = serializers.SerializerMethodField() + plate_image_url = serializers.SerializerMethodField() + last_completed_state = serializers.CharField(read_only=True) + + class Meta: + model = models.PlateOrder + fields = [ + 'id', 'design_code', 'customer_name', 'area', + 'salesperson_name', 'merchandiser_name', 'fabric_source', 'fabric', + 'width', 'plate_type', 'plate_date', 'plate_method', + 'plate_image', 'plate_image_url', 'plate_notes', 'reprint_reason', + 'urgency_level', 'production_method', 'is_mark_frame', + 'drawing_rating', 'color_matching_rating', 'sample_rating', + 'difficulty_rating', 'style_name', 'required_sample_meters', + 'required_completion_date', 'completion_date', 'approval_result', + 'customer_feedback', 'last_completed_state', 'business_object_id', + 'original_id', 'process_name', 'print_count', 'created_at', + 'created_by_name', + ] + + def _get_cached_plate_images(self, obj): + cache_attr = '_cached_plate_images' + images = getattr(obj, cache_attr, None) + if images is None: + images = _serialize_plate_images( + getattr(obj, 'plate_image', None), + self.context.get('request'), + ) + setattr(obj, cache_attr, images) + return images + + def get_plate_image(self, obj): + return self._get_cached_plate_images(obj) + + def get_plate_image_url(self, obj): + images = self._get_cached_plate_images(obj) + return [entry.get('url') for entry in images if entry.get('url')] + + def to_representation(self, instance): + data = super().to_representation(instance) + if not data.get('design_code') and instance.id: + data['design_code'] = str(instance.id) + return data + + class PlateOrderListSerializer(PlateOrderDesignCodeMixin, serializers.ModelSerializer): """开版订单列表序列化器""" customer_name = serializers.CharField(source="customer.name", read_only=True) diff --git a/api_v1/views/printing/views.py b/api_v1/views/printing/views.py index d86ef3c..a60cf46 100644 --- a/api_v1/views/printing/views.py +++ b/api_v1/views/printing/views.py @@ -10,7 +10,7 @@ from rest_framework.permissions import BasePermission from rest_framework.permissions import DjangoModelPermissions from rest_framework.parsers import MultiPartParser, FormParser, JSONParser from django.core.exceptions import ValidationError -from django.db.models import CharField, Exists, OuterRef, Prefetch +from django.db.models import CharField, Exists, OuterRef, Prefetch, Subquery from django.db.models.functions import Cast, Coalesce from django.views.decorators.cache import cache_page from django.views.decorators.http import condition @@ -1065,13 +1065,14 @@ class PlateOrderViewSet(CustomerVisibilityFilterMixin, LimitedModelViewSet): def get_serializer_class(self): """根据动作选择序列化器""" from .serializers import ( + PlateOrderKanbanListSerializer, PlateOrderListSerializer, PlateOrderDetailSerializer, PlateOrderCreateUpdateSerializer, ) if self.action == "list": - return PlateOrderListSerializer + return PlateOrderKanbanListSerializer elif self.action in ["create", "update", "partial_update"]: return PlateOrderCreateUpdateSerializer else: # retrieve @@ -1092,13 +1093,24 @@ class PlateOrderViewSet(CustomerVisibilityFilterMixin, LimitedModelViewSet): if self.action in ["list", "retrieve"]: queryset = queryset.select_related( - "customer", "salesperson", "merchandiser", "business_object" + "customer", + "salesperson", + "merchandiser", + "business_object", + "created_by__employee", ) - # 为搜索提供 design_code 的兜底(为空时使用主键字符串) + + # 预取流程名称(process 是 IntegerField 非外键,用 Subquery 避免 N+1) + from stateflow.models import Process + queryset = queryset.annotate( design_code_normalized=Coalesce( "design_code", Cast("id", output_field=CharField()) - ) + ), + annotated_process_name=Subquery( + Process.objects.filter(id=OuterRef("process")).values("name")[:1], + output_field=CharField(), + ), ) return queryset diff --git a/business/migrations/0032_order_balance_before_snapshot.py b/business/migrations/0032_order_balance_before_snapshot.py new file mode 100644 index 0000000..93b4ff8 --- /dev/null +++ b/business/migrations/0032_order_balance_before_snapshot.py @@ -0,0 +1,31 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('business', '0031_red_flush_fields'), + ] + + operations = [ + migrations.AddField( + model_name='purchaseorder', + name='balance_before_snapshot', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True, verbose_name='创建前供应商余额快照'), + ), + migrations.AddField( + model_name='salesorder', + name='balance_before_snapshot', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True, verbose_name='创建前客户余额快照'), + ), + migrations.AddField( + model_name='purchasereturnorder', + name='balance_before_snapshot', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True, verbose_name='创建前供应商余额快照'), + ), + migrations.AddField( + model_name='salesreturnorder', + name='balance_before_snapshot', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=15, null=True, verbose_name='创建前客户余额快照'), + ), + ] diff --git a/business/models.py b/business/models.py index db392ba..a541208 100644 --- a/business/models.py +++ b/business/models.py @@ -133,6 +133,10 @@ class PurchaseOrder(OrderItemsAggregationMixin, OrderDirectionMixin, OrderCounte is_red_flushed = models.BooleanField(default=False, db_index=True, verbose_name='已红冲') red_flush_id = models.UUIDField(null=True, blank=True, db_index=True, verbose_name='红冲批次ID') red_flushed_at = models.DateTimeField(null=True, blank=True, verbose_name='红冲时间') + balance_before_snapshot = models.DecimalField( + max_digits=15, decimal_places=2, null=True, blank=True, + verbose_name='创建前供应商余额快照', + ) from_pre_purchase_order_id = models.BigIntegerField( null=True, blank=True, @@ -283,6 +287,10 @@ class SalesOrder(OrderItemsAggregationMixin, OrderDirectionMixin, OrderCounterpa is_red_flushed = models.BooleanField(default=False, db_index=True, verbose_name='已红冲') red_flush_id = models.UUIDField(null=True, blank=True, db_index=True, verbose_name='红冲批次ID') red_flushed_at = models.DateTimeField(null=True, blank=True, verbose_name='红冲时间') + balance_before_snapshot = models.DecimalField( + max_digits=15, decimal_places=2, null=True, blank=True, + verbose_name='创建前客户余额快照', + ) remarks = models.TextField(blank=True, null=True, verbose_name='备注') from_pre_sales_order_id = models.BigIntegerField( blank=True, @@ -795,6 +803,10 @@ class PurchaseReturnOrder(OrderItemsAggregationMixin, OrderDirectionMixin, Order is_red_flushed = models.BooleanField(default=False, db_index=True, verbose_name='已红冲') red_flush_id = models.UUIDField(null=True, blank=True, db_index=True, verbose_name='红冲批次ID') red_flushed_at = models.DateTimeField(null=True, blank=True, verbose_name='红冲时间') + balance_before_snapshot = models.DecimalField( + max_digits=15, decimal_places=2, null=True, blank=True, + verbose_name='创建前供应商余额快照', + ) remarks = models.TextField(blank=True, null=True, verbose_name='备注') class Meta: @@ -923,6 +935,10 @@ class SalesReturnOrder(OrderItemsAggregationMixin, OrderDirectionMixin, OrderCou is_red_flushed = models.BooleanField(default=False, db_index=True, verbose_name='已红冲') red_flush_id = models.UUIDField(null=True, blank=True, db_index=True, verbose_name='红冲批次ID') red_flushed_at = models.DateTimeField(null=True, blank=True, verbose_name='红冲时间') + balance_before_snapshot = models.DecimalField( + max_digits=15, decimal_places=2, null=True, blank=True, + verbose_name='创建前客户余额快照', + ) remarks = models.TextField(blank=True, null=True, verbose_name='备注') class Meta: diff --git a/business/services.py b/business/services.py index b246b5c..2bab41f 100644 --- a/business/services.py +++ b/business/services.py @@ -288,6 +288,9 @@ def create_purchase_order( purchase_order = models.PurchaseOrder.objects.create( merchant=merchant, supplier=supplier, + balance_before_snapshot=BalanceService.get_supplier_balance( + merchant=merchant, supplier=supplier, + ), purchase_date=normalized_date, operator=operator, warehouse=warehouse, @@ -425,6 +428,9 @@ def create_sales_order( sales_order = models.SalesOrder.objects.create( merchant=merchant, customer=customer, + balance_before_snapshot=BalanceService.get_customer_balance( + merchant=merchant, customer=customer, + ), sales_date=normalized_date, operator=operator, warehouse=warehouse, @@ -577,6 +583,9 @@ def create_purchase_return_order( return_order = models.PurchaseReturnOrder.objects.create( merchant=merchant, supplier=supplier, + balance_before_snapshot=BalanceService.get_supplier_balance( + merchant=merchant, supplier=supplier, + ), purchase_order=resolved_purchase_order, return_date=normalized_date, operator=operator, @@ -727,6 +736,9 @@ def create_sales_return_order( return_order = models.SalesReturnOrder.objects.create( merchant=merchant, customer=customer, + balance_before_snapshot=BalanceService.get_customer_balance( + merchant=merchant, customer=customer, + ), sales_order=resolved_sales_order, return_date=normalized_date, operator=operator, @@ -1164,6 +1176,7 @@ def red_flush_sales_order( approved_status=models.SalesOrderStatusEnum.APPROVED, balance_source_type=models.BalanceChangeSourceEnum.SALES_ORDER, stock_source_type=stock_models.StockChangeSourceEnum.SALES, + require_stock_records=False, counterparty_field='customer', error_label='销售单', red_flushed_by=red_flushed_by, @@ -1279,6 +1292,7 @@ def _red_flush_order_impl( stock_source_type: stock_models.StockChangeSourceEnum | None, counterparty_field: str, error_label: str, + require_stock_records: bool = True, red_flushed_by=None, reason: str | None = '', ): @@ -1328,6 +1342,7 @@ def _red_flush_order_impl( red_flushed_by=red_flushed_by, reason=reason_text, error_label=error_label, + require_stock_records=require_stock_records, ) locked_order.is_red_flushed = True @@ -1412,6 +1427,7 @@ def _red_flush_stock_records_for_order( red_flushed_by, reason: str, error_label: str, + require_stock_records: bool = True, ) -> None: stock_records = list( stock_models.StockChangeRecord.objects.select_for_update().filter( @@ -1421,7 +1437,9 @@ def _red_flush_stock_records_for_order( ).order_by('id') ) if not stock_records: - raise ValueError(f'{error_label}缺少可红冲的库存记录') + if require_stock_records: + raise ValueError(f'{error_label}缺少可红冲的库存记录') + return stock_service = StockFlowService(merchant=order.merchant, created_by=red_flushed_by) for stock_record in stock_records: @@ -2532,6 +2550,7 @@ class _CustomerStatementBuilder(_StatementBuilder): merchant=self.merchant, customer=customer, status=models.SalesOrderStatusEnum.APPROVED, + is_red_flushed=False, ) .select_related('customer', 'warehouse') .prefetch_related('items__product') @@ -2565,6 +2584,7 @@ class _CustomerStatementBuilder(_StatementBuilder): merchant=self.merchant, customer=customer, status=models.SalesReturnStatusEnum.APPROVED, + is_red_flushed=False, ) .select_related('customer', 'warehouse') .prefetch_related('items__product') @@ -2598,6 +2618,7 @@ class _CustomerStatementBuilder(_StatementBuilder): merchant=self.merchant, customer=customer, status=models.ReceiptOrderStatusEnum.APPROVED, + is_red_flushed=False, ) .select_related('customer') ) @@ -2685,6 +2706,7 @@ class _SupplierStatementBuilder(_StatementBuilder): merchant=self.merchant, supplier=supplier, status=models.PurchaseOrderStatusEnum.APPROVED, + is_red_flushed=False, ) .select_related('supplier', 'warehouse') .prefetch_related('items__product') @@ -2718,6 +2740,7 @@ class _SupplierStatementBuilder(_StatementBuilder): merchant=self.merchant, supplier=supplier, status=models.PurchaseReturnStatusEnum.APPROVED, + is_red_flushed=False, ) .select_related('supplier', 'warehouse') .prefetch_related('items__product') @@ -2751,6 +2774,7 @@ class _SupplierStatementBuilder(_StatementBuilder): merchant=self.merchant, supplier=supplier, status=models.PaymentOrderStatusEnum.APPROVED, + is_red_flushed=False, ) .select_related('supplier') ) diff --git a/business/tests/test_balance_before_snapshot.py b/business/tests/test_balance_before_snapshot.py new file mode 100644 index 0000000..5ad7369 --- /dev/null +++ b/business/tests/test_balance_before_snapshot.py @@ -0,0 +1,225 @@ +from decimal import Decimal + +from django.test import TestCase +from django.utils import timezone + +from basic_info import models as basic_models +from business import models as business_models, services + +from .fixtures import create_basic_fixtures, create_sales_fixtures + + +class OrderBalanceBeforeSnapshotTestCase(TestCase): + def setUp(self): + ( + self.supplier_merchant, + self.supplier, + _supplier_strict_warehouse, + self.supplier_warehouse, + self.supplier_product, + self.supplier_operator, + ) = create_basic_fixtures() + ( + self.customer_merchant, + self.customer, + _customer_strict_warehouse, + self.customer_warehouse, + _customer_strict_out_warehouse, + self.customer_product, + self.customer_operator, + ) = create_sales_fixtures() + + def _supplier_items(self): + return [ + { + 'product_id': self.supplier_product.id, + 'quantity': '3', + 'num_of_rolls': 1, + 'price': '12.50', + } + ] + + def _customer_items(self): + return [ + { + 'product_id': self.customer_product.id, + 'quantity': '4', + 'num_of_rolls': 1, + 'price': '8.25', + } + ] + + def _create_supplier_orders(self): + purchase_order = services.create_purchase_order( + merchant=self.supplier_merchant, + supplier=self.supplier, + order_date=timezone.now().date(), + warehouse=self.supplier_warehouse, + operator=self.supplier_operator, + items=self._supplier_items(), + ) + purchase_return_order = services.create_purchase_return_order( + merchant=self.supplier_merchant, + supplier=self.supplier, + return_date=timezone.now().date(), + warehouse=self.supplier_warehouse, + operator=self.supplier_operator, + items=self._supplier_items(), + purchase_order=purchase_order, + ) + return purchase_order, purchase_return_order + + def _create_customer_orders(self): + sales_order = services.create_sales_order( + merchant=self.customer_merchant, + customer=self.customer, + order_date=timezone.now().date(), + warehouse=self.customer_warehouse, + operator=self.customer_operator, + items=self._customer_items(), + ) + sales_return_order = services.create_sales_return_order( + merchant=self.customer_merchant, + customer=self.customer, + return_date=timezone.now().date(), + warehouse=self.customer_warehouse, + operator=self.customer_operator, + items=self._customer_items(), + sales_order=sales_order, + ) + return sales_order, sales_return_order + + def test_all_four_creation_services_capture_current_balance(self): + business_models.SupplierBalance.objects.create( + merchant=self.supplier_merchant, + supplier=self.supplier, + balance=Decimal('123.45'), + ) + business_models.CustomerBalance.objects.create( + merchant=self.customer_merchant, + customer=self.customer, + balance=Decimal('-67.89'), + ) + + purchase_order, purchase_return_order = self._create_supplier_orders() + sales_order, sales_return_order = self._create_customer_orders() + + self.assertEqual(purchase_order.balance_before_snapshot, Decimal('123.45')) + self.assertEqual(purchase_return_order.balance_before_snapshot, Decimal('123.45')) + self.assertEqual(sales_order.balance_before_snapshot, Decimal('-67.89')) + self.assertEqual(sales_return_order.balance_before_snapshot, Decimal('-67.89')) + + def test_missing_balance_rows_snapshot_zero_instead_of_null(self): + purchase_order, purchase_return_order = self._create_supplier_orders() + sales_order, sales_return_order = self._create_customer_orders() + + for order in ( + purchase_order, + purchase_return_order, + sales_order, + sales_return_order, + ): + self.assertEqual(order.balance_before_snapshot, Decimal('0')) + self.assertIsNotNone(order.balance_before_snapshot) + + def test_updates_and_later_balance_changes_do_not_recalculate_snapshot(self): + supplier_balance = business_models.SupplierBalance.objects.create( + merchant=self.supplier_merchant, + supplier=self.supplier, + balance=Decimal('100.00'), + ) + customer_balance = business_models.CustomerBalance.objects.create( + merchant=self.customer_merchant, + customer=self.customer, + balance=Decimal('200.00'), + ) + purchase_order, purchase_return_order = self._create_supplier_orders() + sales_order, sales_return_order = self._create_customer_orders() + + other_supplier = basic_models.Supplier.objects.create( + merchant=self.supplier_merchant, + name='快照测试供应商B', + ) + other_customer = basic_models.Customer.objects.create( + merchant=self.customer_merchant, + name='快照测试客户B', + ) + business_models.SupplierBalance.objects.create( + merchant=self.supplier_merchant, + supplier=other_supplier, + balance=Decimal('999.00'), + ) + business_models.CustomerBalance.objects.create( + merchant=self.customer_merchant, + customer=other_customer, + balance=Decimal('888.00'), + ) + + supplier_balance.balance = Decimal('300.00') + supplier_balance.save(update_fields=['balance', 'updated_at']) + customer_balance.balance = Decimal('400.00') + customer_balance.save(update_fields=['balance', 'updated_at']) + + services.update_purchase_order( + purchase_order=purchase_order, + supplier=other_supplier, + items=self._supplier_items(), + ) + services.update_purchase_return_order( + purchase_return_order=purchase_return_order, + supplier=other_supplier, + items=self._supplier_items(), + ) + services.update_sales_order( + sales_order=sales_order, + customer=other_customer, + items=self._customer_items(), + ) + services.update_sales_return_order( + sales_return_order=sales_return_order, + customer=other_customer, + items=self._customer_items(), + ) + + for order in (purchase_order, purchase_return_order): + order.refresh_from_db() + self.assertEqual(order.balance_before_snapshot, Decimal('100.00')) + for order in (sales_order, sales_return_order): + order.refresh_from_db() + self.assertEqual(order.balance_before_snapshot, Decimal('200.00')) + + def test_api_serializers_expose_snapshot_as_read_only(self): + business_models.SupplierBalance.objects.create( + merchant=self.supplier_merchant, + supplier=self.supplier, + balance=Decimal('123.45'), + ) + business_models.CustomerBalance.objects.create( + merchant=self.customer_merchant, + customer=self.customer, + balance=Decimal('67.89'), + ) + purchase_order, purchase_return_order = self._create_supplier_orders() + sales_order, sales_return_order = self._create_customer_orders() + + from api_v1.views.business.purchase.views import PurchaseOrderSerializer + from api_v1.views.business.purchase_return.views import PurchaseReturnOrderSerializer + from api_v1.views.business.sales.views import SalesOrderSerializer + from api_v1.views.business.sales_return.views import SalesReturnOrderSerializer + + cases = ( + (PurchaseOrderSerializer, purchase_order, '123.45'), + (PurchaseReturnOrderSerializer, purchase_return_order, '123.45'), + (SalesOrderSerializer, sales_order, '67.89'), + (SalesReturnOrderSerializer, sales_return_order, '67.89'), + ) + for serializer_class, order, expected in cases: + with self.subTest(serializer=serializer_class.__name__): + self.assertEqual(serializer_class(order).data['balance_before_snapshot'], expected) + serializer = serializer_class( + order, + data={'balance_before_snapshot': '9999.99'}, + partial=True, + ) + self.assertTrue(serializer.is_valid(), serializer.errors) + self.assertNotIn('balance_before_snapshot', serializer.validated_data) diff --git a/business/tests/test_red_flush_services.py b/business/tests/test_red_flush_services.py index 27bb854..7fa922b 100644 --- a/business/tests/test_red_flush_services.py +++ b/business/tests/test_red_flush_services.py @@ -146,6 +146,37 @@ class BusinessRedFlushServiceTestCase(TestCase): red_flush_id=flushed.red_flush_id, ) + def test_red_flush_sales_order_without_stock_reverses_balance_only(self): + merchant, customer, _, warehouse, _, product, operator = create_sales_fixtures() + self._disable_auto_stock_tasks(merchant) + order = services.create_sales_order( + merchant=merchant, + customer=customer, + order_date=timezone.now().date(), + warehouse=warehouse, + operator=operator, + items=[{'product_id': product.id, 'quantity': 20, 'num_of_rolls': 1, 'price': '15'}], + ) + services.review_sales_order( + sales_order=order, + target_status=business_models.SalesOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + flushed = services.red_flush_sales_order(merchant=merchant, sales_order=order, red_flushed_by=self.user) + + self.assertTrue(flushed.is_red_flushed) + balance = business_models.CustomerBalance.objects.get(merchant=merchant, customer=customer) + self.assertEqual(balance.balance, Decimal('0.00')) + self._assert_balance_red_flushed( + source_type=business_models.BalanceChangeSourceEnum.SALES_ORDER, + source_id=order.id, + red_flush_id=flushed.red_flush_id, + ) + self.assertFalse( + stock_models.StockChangeRecord.objects.filter(red_flush_id=flushed.red_flush_id).exists() + ) + def test_red_flush_purchase_return_order_reverses_balance_and_stock(self): merchant, supplier, _, warehouse, product, operator = create_basic_fixtures() self._disable_auto_stock_tasks(merchant) diff --git a/business/tests/test_statement_services.py b/business/tests/test_statement_services.py index 3e0c753..c38ea73 100644 --- a/business/tests/test_statement_services.py +++ b/business/tests/test_statement_services.py @@ -1,10 +1,13 @@ from decimal import Decimal +from django.contrib.auth import get_user_model from django.test import TestCase from django.utils import timezone from basic_info import models as basic_models from business import models as business_models, services +from stock import models as stock_models +from stock import services as stock_services from .fixtures import create_basic_fixtures, create_sales_fixtures @@ -163,3 +166,342 @@ class BusinessStatementServiceTestCase(TestCase): self.assertEqual(purchase_record['items'][0]['num_of_rolls'], 2) payment_record = next(record for record in payload['records'] if record['source_type'] == 'payment_order') self.assertEqual(payment_record['negative_amount'], Decimal('15.00')) + + +class BusinessStatementRedFlushExclusionTestCase(TestCase): + """对账单 builders 必须排除已红冲的正式单据。 + + Bug 复核:红冲服务在保留单据 status=APPROVED 的同时把 is_red_flushed 置为 True。 + 若 _build_*_records 仅过滤 status,已红冲单据会以原金额继续出现在对账单 records 中, + 导致 summary 的 positive_total/negative_total 把红冲金额多算一次。 + + 本测试类对客户侧 3 类与供应商侧 3 类单据各红冲一次后,断言: + - 对应 source_type 不在 records 列表中 + - summary 的金额合计中没有该单金额 + """ + + def setUp(self): + User = get_user_model() + self.user = User.objects.create_user(username='statement-red-flush', password='pass123') + + def _disable_auto_stock_tasks(self, merchant): + basic_models.MerchantSetting.objects.filter( + merchant=merchant, + key=basic_models.MerchantSettingKeyEnum.AUTO_CREATE_STOCK_CHANGE_TASKS, + ).update(val_bool=False) + + def _complete_stock_record(self, record_id): + record = stock_models.StockChangeRecord.objects.get(id=record_id) + stock_services.make_stock_change_completed(record) + return record + + def _create_and_complete_purchase_order(self, *, merchant, supplier, warehouse, operator, product, quantity, price): + order = services.create_purchase_order( + merchant=merchant, + supplier=supplier, + order_date=timezone.now().date(), + warehouse=warehouse, + operator=operator, + items=[{'product_id': product.id, 'quantity': quantity, 'num_of_rolls': 1, 'price': str(price)}], + remarks='采购对账', + ) + services.review_purchase_order( + purchase_order=order, + target_status=business_models.PurchaseOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + payload = services.create_purchase_order_stock_entries_sync( + purchase_order_id=order.id, + warehouse_id=warehouse.id, + items=services._build_stock_flow_items_from_order(order), + created_by_id=self.user.id, + ) + self._complete_stock_record(payload['stock_change_record_id']) + return order + + # ============ 客户侧 ============ + + def test_red_flushed_sales_order_excluded_from_customer_statement(self): + merchant, customer, warehouse_strict, warehouse_relaxed, _, product, operator = create_sales_fixtures() + self._disable_auto_stock_tasks(merchant) + today = timezone.now().date() + + # 一个保留的销售单 + 一个会被红冲的销售单 + keep = services.create_sales_order( + merchant=merchant, + customer=customer, + order_date=today, + warehouse=warehouse_strict, + operator=operator, + items=[{'product_id': product.id, 'numbers': [6, 4], 'price': '10', 'unit': '米'}], + remarks='保留销售单', + ) + services.review_sales_order( + sales_order=keep, + target_status=business_models.SalesOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + to_flush = services.create_sales_order( + merchant=merchant, + customer=customer, + order_date=today, + warehouse=warehouse_strict, + operator=operator, + items=[{'product_id': product.id, 'numbers': [5, 5], 'price': '20', 'unit': '米'}], + remarks='红冲销售单', + ) + services.review_sales_order( + sales_order=to_flush, + target_status=business_models.SalesOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + services.red_flush_sales_order( + merchant=merchant, + sales_order=to_flush, + red_flushed_by=self.user, + reason='测试红冲销售单', + ) + + payload = services.build_customer_statement(merchant=merchant, customer=customer) + sales_records = [r for r in payload['records'] if r['source_type'] == 'sales_order'] + self.assertEqual(len(sales_records), 1) + self.assertEqual(sales_records[0]['source_id'], keep.id) + + summary = services.build_statement_summary(payload) + # 保留单金额 = 10 * 10 = 100;若红冲单未排除,会再多 200 = 300 + self.assertEqual(summary['positive_total'], '100.00') + + def test_red_flushed_sales_return_order_excluded_from_customer_statement(self): + merchant, customer, warehouse_strict, warehouse_relaxed, _, product, operator = create_sales_fixtures() + self._disable_auto_stock_tasks(merchant) + today = timezone.now().date() + + def _make_sales_return(quantity, price, remark): + ret = services.create_sales_return_order( + merchant=merchant, + customer=customer, + return_date=today, + warehouse=warehouse_relaxed, + operator=operator, + items=[{'product_id': product.id, 'quantity': quantity, 'num_of_rolls': 1, 'price': str(price)}], + remarks=remark, + ) + services.review_sales_return_order( + sales_return_order=ret, + target_status=business_models.SalesReturnStatusEnum.APPROVED, + reviewed_by=self.user, + ) + sync_payload = services.create_sales_return_order_stock_entries_sync( + sales_return_order_id=ret.id, + warehouse_id=warehouse_relaxed.id, + items=services._build_stock_flow_items_from_order(ret), + created_by_id=self.user.id, + ) + self._complete_stock_record(sync_payload['stock_change_record_id']) + return ret + + keep = _make_sales_return(3, Decimal('10'), '保留销退') + to_flush = _make_sales_return(2, Decimal('20'), '红冲销退') + + services.red_flush_sales_return_order( + merchant=merchant, + sales_return_order=to_flush, + red_flushed_by=self.user, + reason='测试红冲销退单', + ) + + payload = services.build_customer_statement(merchant=merchant, customer=customer) + sr_records = [r for r in payload['records'] if r['source_type'] == 'sales_return_order'] + self.assertEqual(len(sr_records), 1) + self.assertEqual(sr_records[0]['source_id'], keep.id) + + summary = services.build_statement_summary(payload) + # 保留销退 negative=3*10=30;红冲若未排除会再多 2*20=40,合计 70 + self.assertEqual(summary['negative_total'], '30.00') + + def test_red_flushed_receipt_order_excluded_from_customer_statement(self): + merchant, customer, _wh1, _wh2, _, _, operator = create_sales_fixtures() + self._disable_auto_stock_tasks(merchant) + today = timezone.now().date() + + keep = services.create_receipt_order( + merchant=merchant, + customer=customer, + receipt_date=today, + amount='40', + operator=operator, + remarks='保留收款', + ) + services.review_receipt_order( + receipt_order=keep, + target_status=business_models.ReceiptOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + to_flush = services.create_receipt_order( + merchant=merchant, + customer=customer, + receipt_date=today, + amount='25', + operator=operator, + remarks='红冲收款', + ) + services.review_receipt_order( + receipt_order=to_flush, + target_status=business_models.ReceiptOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + services.red_flush_receipt_order( + merchant=merchant, + receipt_order=to_flush, + red_flushed_by=self.user, + reason='测试红冲收款单', + ) + + payload = services.build_customer_statement(merchant=merchant, customer=customer) + receipt_records = [r for r in payload['records'] if r['source_type'] == 'receipt_order'] + self.assertEqual(len(receipt_records), 1) + self.assertEqual(receipt_records[0]['source_id'], keep.id) + + summary = services.build_statement_summary(payload) + # 保留收款 negative=40;红冲未排除会再 +25 = 65 + self.assertEqual(summary['negative_total'], '40.00') + + # ============ 供应商侧 ============ + + def test_red_flushed_purchase_order_excluded_from_supplier_statement(self): + merchant, supplier, warehouse_strict, warehouse_relaxed, product, operator = create_basic_fixtures() + self._disable_auto_stock_tasks(merchant) + + keep = self._create_and_complete_purchase_order( + merchant=merchant, supplier=supplier, warehouse=warehouse_relaxed, + operator=operator, product=product, quantity=10, price=Decimal('5'), + ) + to_flush = self._create_and_complete_purchase_order( + merchant=merchant, supplier=supplier, warehouse=warehouse_relaxed, + operator=operator, product=product, quantity=8, price=Decimal('7'), + ) + + services.red_flush_purchase_order( + merchant=merchant, + purchase_order=to_flush, + red_flushed_by=self.user, + reason='测试红冲采购单', + ) + + payload = services.build_supplier_statement(merchant=merchant, supplier=supplier) + purchase_records = [r for r in payload['records'] if r['source_type'] == 'purchase_order'] + self.assertEqual(len(purchase_records), 1) + self.assertEqual(purchase_records[0]['source_id'], keep.id) + + summary = services.build_statement_summary(payload) + # 保留单 10*5=50;若红冲单未排除会再多 8*7=56,合计 106 + self.assertEqual(summary['positive_total'], '50.00') + + def test_red_flushed_purchase_return_order_excluded_from_supplier_statement(self): + merchant, supplier, warehouse_strict, warehouse_relaxed, product, operator = create_basic_fixtures() + self._disable_auto_stock_tasks(merchant) + today = timezone.now().date() + + # 先建一个采购单提供库存底盘,然后做两个退货单(一个保留 + 一个红冲) + purchase = self._create_and_complete_purchase_order( + merchant=merchant, supplier=supplier, warehouse=warehouse_relaxed, + operator=operator, product=product, quantity=50, price=Decimal('5'), + ) + + def _make_return(quantity, price, remark): + ret = services.create_purchase_return_order( + merchant=merchant, + supplier=supplier, + return_date=today, + warehouse=warehouse_relaxed, + operator=operator, + items=[{'product_id': product.id, 'quantity': quantity, 'num_of_rolls': 1, 'price': str(price)}], + remarks=remark, + purchase_order=purchase, + ) + services.review_purchase_return_order( + purchase_return_order=ret, + target_status=business_models.PurchaseReturnStatusEnum.APPROVED, + reviewed_by=self.user, + ) + sync_payload = services.create_purchase_return_order_stock_entries_sync( + purchase_return_order_id=ret.id, + warehouse_id=warehouse_relaxed.id, + items=services._build_stock_flow_items_from_order(ret), + created_by_id=self.user.id, + ) + self._complete_stock_record(sync_payload['stock_change_record_id']) + return ret + + keep = _make_return(3, Decimal('5'), '保留采退') + to_flush = _make_return(2, Decimal('7'), '红冲采退') + + services.red_flush_purchase_return_order( + merchant=merchant, + purchase_return_order=to_flush, + red_flushed_by=self.user, + reason='测试红冲采退单', + ) + + payload = services.build_supplier_statement(merchant=merchant, supplier=supplier) + pr_records = [r for r in payload['records'] if r['source_type'] == 'purchase_return_order'] + self.assertEqual(len(pr_records), 1) + self.assertEqual(pr_records[0]['source_id'], keep.id) + + summary = services.build_statement_summary(payload) + # 保留采退 negative=3*5=15;若红冲未排除会再多 2*7=14,合计 29 + self.assertEqual(summary['negative_total'], '15.00') + + def test_red_flushed_payment_order_excluded_from_supplier_statement(self): + merchant, supplier, _wh1, _wh2, _product, operator = create_basic_fixtures() + self._disable_auto_stock_tasks(merchant) + today = timezone.now().date() + + keep = services.create_payment_order( + merchant=merchant, + supplier=supplier, + payment_date=today, + amount='30', + operator=operator, + remarks='保留付款', + ) + services.review_payment_order( + payment_order=keep, + target_status=business_models.PaymentOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + to_flush = services.create_payment_order( + merchant=merchant, + supplier=supplier, + payment_date=today, + amount='18', + operator=operator, + remarks='红冲付款', + ) + services.review_payment_order( + payment_order=to_flush, + target_status=business_models.PaymentOrderStatusEnum.APPROVED, + reviewed_by=self.user, + ) + + services.red_flush_payment_order( + merchant=merchant, + payment_order=to_flush, + red_flushed_by=self.user, + reason='测试红冲付款单', + ) + + payload = services.build_supplier_statement(merchant=merchant, supplier=supplier) + payment_records = [r for r in payload['records'] if r['source_type'] == 'payment_order'] + self.assertEqual(len(payment_records), 1) + self.assertEqual(payment_records[0]['source_id'], keep.id) + + summary = services.build_statement_summary(payload) + # 保留付款 negative=30;若红冲未排除会再多 18 合计 48 + self.assertEqual(summary['negative_total'], '30.00') + diff --git a/celerybeat-schedule b/celerybeat-schedule index d098cd36aa57f73a89c7e676a5a9eb093222c552..04f010c567a0d7abbebed709bb3dd738fe3da037 100644 GIT binary patch delta 399 zcmZojXh_(=D!|Pr&%l3&|2Y35KKYG>OW8U4Gap6ur#?}gyjNUCxZm}O8jI9?hSa>0 zqRiCd2G*(TC!Z0Q-dHHX=G0XGE}BKEwFDuT$;bc(wNrXjiYxPy<5Me2Qj78ubK;Xr zi%arzQ;Xu$GV>Dil2hYT5;JouC%+X}t|v<6lpgb>(&Eg#)Z${jlEmWdVm$)p7bj<= zrj+KSrcCMKNJ%V7Ey>JHMP^Q(;>^YVicOT2735;o$ypN7jI5K7Nhq_j_AqKqnd~Sd zVqdJM^u&}|$s|6$EVZaOGe0jr9vA?e5I-{Xu$t*Dx|+XBJ>8sWLL=VU}WohLw4=0J9PklDS5v073kU_5c6? literal 12288 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 diff --git a/docker-compose.yml b/docker-compose.yml index e2c7a98..126867f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -85,7 +85,7 @@ services: DJANGO_SETTINGS_MODULE: flower.settings PYTHONPATH: /app DEBUG: "1" - ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud" + ALLOWED_HOSTS: "localhost,127.0.0.1,0.0.0.0,8.148.215.233,yuwenerp.yuwen.cloud,testbackend.yuwen.cloud" DB_HOST: pgbouncer DB_PORT: "6432" DB_NAME: flower diff --git a/docs/2026-06-12_business_red_flush_api.md b/docs/2026-06-12_business_red_flush_api.md index d8252fb..c9a3f3f 100644 --- a/docs/2026-06-12_business_red_flush_api.md +++ b/docs/2026-06-12_business_red_flush_api.md @@ -72,7 +72,7 @@ The API first scopes order lookup by `request.user.employee.merchant`. The servi ## Audit Notes -`red_flush_id` is written to the source order, related `BalanceChangeRecord` rows, and related `StockChangeRecord` rows when inventory is involved. Existing `offset_to`/`offset_id` relationships remain the precise reverse-link mechanism for balance and stock records. +`red_flush_id` is written to the source order and related `BalanceChangeRecord` rows. It is also written to related `StockChangeRecord` rows when the source order actually has inventory records. Sales orders may be red-flushed without inventory records; in that case only the balance side is reversed. Existing `offset_to`/`offset_id` relationships remain the precise reverse-link mechanism for balance and stock records. ## Test Coverage @@ -85,4 +85,4 @@ python manage.py test business.tests.test_red_flush_services api_v1.tests.Busine Coverage expectations: - Service tests cover all six order types, balance reversal, inventory reversal, duplicate blocking, merchant isolation, missing balance/stock records, transaction rollback, and external payment/receipt rejection. -- API tests cover all six endpoints, required `reason`, employee permission rejection, merchant-scoped 404, non-approved orders, duplicate red flush, external payment/receipt rejection, stock-validation error mapping, and sampled balance/stock side effects. +- API tests cover all six endpoints, required `reason`, employee permission rejection, merchant-scoped 404, non-approved orders, duplicate red flush, external payment/receipt rejection, stock-validation error mapping, sales red flush without stock records, and sampled balance/stock side effects. diff --git a/docs/2026-06-12_business_red_flush_design.md b/docs/2026-06-12_business_red_flush_design.md index bcdf0a5..d2e3823 100644 --- a/docs/2026-06-12_business_red_flush_design.md +++ b/docs/2026-06-12_business_red_flush_design.md @@ -10,6 +10,7 @@ - 红冲后原单据 `status` 保持 `APPROVED`,不回退、不作废。 - 原单据增加“已红冲”标记,用于列表查询提速。 +- 因为 `status` 保持 `APPROVED`,**对账单 builder 必须额外按 `is_red_flushed=False` 过滤**,否则红冲单会被原值计入 `positive_amount`/`negative_amount`,summary 多算一倍。 - 每次红冲由 service 自动生成一个 UUID 类型的 `red_flush_id`。 - `red_flush_id` 用于跨表、跨记录追踪同一次红冲涉及的所有数据,是审计关联批次 ID。 - 不新增 `red_flush_no`。该编号只适合人工展示,目前无需求。 @@ -103,7 +104,7 @@ - 只允许 `APPROVED` 单据红冲。 - `is_red_flushed=True` 的单据不能重复红冲。 - 原始余额变动记录必须存在且未被冲抵。 -- 有库存影响的单据必须找到对应库存记录,库存记录必须已完成且未被红冲。 +- 有库存影响且要求库存闭环的单据必须找到对应库存记录,库存记录必须已完成且未被红冲;销售单允许不存在库存记录,此时只红冲余额。 - 资金和库存任一红冲失败,整体事务回滚。 资金侧实现: @@ -125,7 +126,7 @@ 新增 service 测试覆盖: - 采购单整单红冲:余额反向、库存反向、单据标记、批次 ID 写入。 -- 销售单整单红冲:余额反向、库存反向、单据标记、批次 ID 写入。 +- 销售单整单红冲:余额反向、单据标记、批次 ID 写入;若存在销售出库记录则同步库存反向,若无库存记录则跳过库存红冲。 - 采购退货单整单红冲。 - 销售退货单整单红冲。 - 付款单整单红冲。 @@ -143,11 +144,25 @@ API 测试覆盖: - 无员工身份权限拒绝。 - 跨商户查询隔离。 - 外部付款/收款单拒绝。 -- 未审核、重复红冲、缺库存记录等 service 校验错误映射为 400。 +- 未审核、重复红冲、采购等要求库存闭环的单据缺库存记录等 service 校验错误映射为 400。 - 成功响应包含 `is_red_flushed`、`red_flush_id`、`red_flushed_at`,并抽样断言余额/库存副作用。 目标:red flush 关键 service/API 路径需要有定向测试覆盖。 +## 对账单 builder 联动修复(2026-06-22) + +`business.services._CustomerStatementBuilder._build_sales_records` / `_build_sales_return_records` / `_build_receipt_records` 以及 `_SupplierStatementBuilder._build_purchase_records` / `_build_purchase_return_records` / `_build_payment_records` 之前只过滤 `status=APPROVED`,未过滤 `is_red_flushed`。 + +红冲后单据 `status` 仍为 `APPROVED`,所以会继续以原金额出现在 `build_customer_statement` / `build_supplier_statement` 的 `records` 列表中,被 `build_statement_summary` 双倍计入 `positive_total`/`negative_total`。 + +修复办法:6 个 builder queryset 全部追加 `is_red_flushed=False`。 + +注意: +- `BalanceService.get_customer_balance` / `get_supplier_balance` 读取 `CustomerBalance/SupplierBalance` 表,红冲服务通过反向 `BalanceChangeRecord` 已经把余额抵消,因此 `current_balance` 字段一直是正确的;只有 `records` 与 `summary` 受影响。 +- `ExternalCustomerStatementOrder` 目前不在 6 类红冲入口里,相关 builder/adjustment 暂不需要过滤,将来若开放外部单红冲必须同步更新。 + +定向测试:见 `business.tests.test_statement_services.BusinessStatementRedFlushExclusionTestCase`,覆盖 6 类正式单据红冲后 statement 中 `records` 不再包含、`summary` 不再多算。 + ## 测试命令 开发环境在容器内运行测试,并绕过 PgBouncer: diff --git a/docs/2026-06-22_balance_before_snapshot_handoff.md b/docs/2026-06-22_balance_before_snapshot_handoff.md new file mode 100644 index 0000000..5400a4d --- /dev/null +++ b/docs/2026-06-22_balance_before_snapshot_handoff.md @@ -0,0 +1,423 @@ +# 四类主要业务单据 `balance_before_snapshot` 实现交接 + +日期:2026-06-22 +状态:已完成。核心实现、入口扫描、定向测试、API 测试、迁移检查及相关回归测试均已通过。 + +## 0. 最终完成结果 + +本任务已于 2026-06-22 完成,当前没有余额快照相关的待实现项。 + +最终落地内容: + +- 四类主单模型均已新增可空 `balance_before_snapshot`。 +- 新增 `0032_order_balance_before_snapshot` 迁移,不回填历史数据。 +- 四个正式创建 service 均必写当前本地往来余额;不存在余额行时写 `0`。 +- 更新、往来单位变更、余额后续变化、审批、作废及红冲均不重算快照。 +- 四类 API serializer 输出该字段并设为只读。 +- 四个 POST 创建响应均显式返回该字段。 +- 生产代码扫描确认没有绕过正式 service 直接创建四类主单的入口。 +- 预销售转正式销售调用 `business_services.create_sales_order()`,已自然覆盖快照逻辑。 + +新增测试文件:`business/tests/test_balance_before_snapshot.py`,共 4 个测试,覆盖: + +- 四类创建读取已有正数/负数余额。 +- 无余额行时四类创建均写 `0` 而非 `NULL`。 +- 四类更新、更换往来单位以及余额后续变化均不重算快照。 +- 四类 API serializer 输出且拒绝客户端写入快照。 + +另在 `api_v1/tests.py` 四个既有成功创建测试中加入 POST 响应和数据库落值断言。 + +已在 `web` 容器内使用 `DB_HOST=postgres DB_PORT=5432` 直连 PostgreSQL、绕过 PgBouncer 完成验证: + +- `makemigrations --check --dry-run`:通过,`No changes detected`。 +- `manage.py check`:通过,0 issues。 +- 新增余额快照定向测试:4/4 通过。 +- 四类单据 service/API 回归:74/74 通过。 +- 红冲、对账单及红冲 API 共享服务回归:36/36 通过。 +- 本任务相关已跟踪文件 `git diff --check`:通过。 +- 新增迁移与新增测试文件的补丁格式检查:通过。 + +下文保留了实现细节和原始验收清单,方便以后维护和排查回归;其中“尚未完成”内容已经全部执行完毕。 + +## 1. 需求目标 + +为以下四类主要业务单据增加 `balance_before_snapshot` 字段: + +1. `PurchaseOrder`(采购单) +2. `SalesOrder`(销售单) +3. `PurchaseReturnOrder`(采购退货单) +4. `SalesReturnOrder`(销售退货单) + +字段语义必须保持一致: + +- 字段记录单据正常创建时,对应往来单位在本地余额表中的当前余额。 +- 采购单、采购退货单记录供应商余额,即 `SupplierBalance.balance`。 +- 销售单、销售退货单记录客户余额,即 `CustomerBalance.balance`。 +- 对应余额记录不存在时,快照写入 `Decimal('0')`,不能因为数据库字段可空而让正常创建的新单据写入 `NULL`。 +- 数据库字段必须允许 `NULL`,用于兼容迁移前的历史单据。 +- 不对历史数据执行回填或推算;历史行保持 `NULL`。 +- 快照只在创建时写一次。之后即使往来余额发生变化,或者单据被修改、审批、作废、红冲,都不能重新计算或覆盖该字段。 +- 客户快照采用本地 `CustomerBalance` 口径,不叠加 `ExternalCustomerStatementOrder`。当前实现调用 `BalanceService.get_customer_balance()`,没有调用 `get_customer_statement_balance()`。 + +## 2. 接手前工作区情况 + +本次任务开始时工作区已有大量未提交修改,主要涉及: + +- 业务单据红冲逻辑和测试。 +- 对账单排除已红冲单据。 +- 销售单列表查询过滤。 +- 开版看板序列化与查询优化。 +- 环境、域名、文档及 Celery schedule 文件。 + +这些改动属于上一轮或用户已有工作,不能清理、回退或覆盖。后续只应增量修改余额快照相关文件。特别不要使用 `git reset --hard`、`git checkout --` 等命令。 + +在 `business/services.py` 和 `api_v1/views/business/sales/views.py` 中,本次余额快照修改与已有未提交修改位于同一文件。审阅 diff 时应按具体代码块区分,不要把整份文件都视为本任务新增。 + +## 3. 已写入的实现 + +### 3.1 模型字段 + +文件:`business/models.py` + +已在四个模型中加入 `balance_before_snapshot`: + +```python +balance_before_snapshot = models.DecimalField( + max_digits=15, + decimal_places=2, + null=True, + blank=True, + verbose_name='创建前供应商余额快照', # 客户侧为“创建前客户余额快照” +) +``` + +具体口径: + +| 模型 | 快照对象 | verbose_name | +|---|---|---| +| `PurchaseOrder` | 供应商余额 | `创建前供应商余额快照` | +| `SalesOrder` | 客户余额 | `创建前客户余额快照` | +| `PurchaseReturnOrder` | 供应商余额 | `创建前供应商余额快照` | +| `SalesReturnOrder` | 客户余额 | `创建前客户余额快照` | + +字段没有默认值,数据库允许为空。这样迁移不会给历史单据制造一个看似真实但无法验证的余额。 + +### 3.2 数据库迁移 + +文件:`business/migrations/0032_order_balance_before_snapshot.py` + +已新增迁移,依赖: + +```python +dependencies = [ + ('business', '0031_red_flush_fields'), +] +``` + +迁移包含四个 `AddField`,全部是: + +- `DecimalField(max_digits=15, decimal_places=2)` +- `null=True` +- `blank=True` +- 无 `default` +- 无数据迁移和历史回填 + +需要在后续验证迁移依赖仍然是当前分支最新叶子;当前检查时 `0031_red_flush_fields.py` 是最新已存在迁移,`0032` 是本任务新文件。 + +### 3.3 正常创建服务写入快照 + +文件:`business/services.py` + +以下四个服务函数的 `objects.create(...)` 已加入快照赋值: + +#### `create_purchase_order(...)` + +```python +balance_before_snapshot=BalanceService.get_supplier_balance( + merchant=merchant, + supplier=supplier, +), +``` + +#### `create_sales_order(...)` + +```python +balance_before_snapshot=BalanceService.get_customer_balance( + merchant=merchant, + customer=customer, +), +``` + +#### `create_purchase_return_order(...)` + +```python +balance_before_snapshot=BalanceService.get_supplier_balance( + merchant=merchant, + supplier=supplier, +), +``` + +#### `create_sales_return_order(...)` + +```python +balance_before_snapshot=BalanceService.get_customer_balance( + merchant=merchant, + customer=customer, +), +``` + +这些调用位于各自已有的 `transaction.atomic()` 中,并在创建主单据时直接写字段。 + +`BalanceService.get_supplier_balance()` 和 `get_customer_balance()` 的既有行为是:余额行存在则返回其 `balance`;不存在则返回 `Decimal('0')`。因此正常服务创建入口理论上不会写入 `NULL`。 + +### 3.4 “之后不重算”的当前实现状态 + +四个更新服务当前均未把 `balance_before_snapshot` 放进赋值或 `update_fields`: + +- `update_purchase_order(...)` +- `update_sales_order(...)` +- `update_purchase_return_order(...)` +- `update_sales_return_order(...)` + +审批、作废、红冲逻辑也没有写该字段。模型没有为该字段增加 `save()` 自动计算或 signal。因此按照当前代码结构,创建完成后不会自动重算。 + +这一点尚缺定向测试,必须补测试防止未来回归。 + +### 3.5 API 输出 + +以下四个 ModelSerializer 的 `fields` 已加入 `balance_before_snapshot`,同时加入 `read_only_fields`: + +- `api_v1/views/business/purchase/views.py` + - `PurchaseOrderSerializer` +- `api_v1/views/business/sales/views.py` + - `SalesOrderSerializer` +- `api_v1/views/business/purchase_return/views.py` + - `PurchaseReturnOrderSerializer` +- `api_v1/views/business/sales_return/views.py` + - `SalesReturnOrderSerializer` + +因此列表、详情、更新结果、审批结果和红冲结果只要使用上述 serializer,都会输出该字段,且客户端不能通过 serializer 修改它。 + +四个创建 API 当前返回的是手工构造的精简字典,不走 ModelSerializer,所以创建成功响应中也已显式加入: + +```python +'balance_before_snapshot': order.balance_before_snapshot, +``` + +具体变量名分别为: + +- `purchase_order.balance_before_snapshot` +- `sales_order.balance_before_snapshot` +- `purchase_return.balance_before_snapshot` +- `sales_return.balance_before_snapshot` + +## 4. 已完成的收尾工作(原验收计划) + +### 4.1 扫描所有生产创建入口 + +已确认四个主要 API 创建入口均调用 `business.services` 中对应的 `create_*` 函数,因此已覆盖: + +- `POST` 采购单 +- `POST` 销售单 +- `POST` 采购退货单 +- `POST` 销售退货单 + +但最后一次完整生产代码扫描尚未完成。接手后应再次执行: + +```bash +rg -n "create_(purchase_order|sales_order|purchase_return_order|sales_return_order)\(" \ + api_v1 business \ + --glob '!business/services.py' \ + --glob '!**/tests/**' \ + --glob '!**/test*.py' +``` + +还应扫描是否有生产代码绕过 service 直接创建四类模型: + +```bash +rg -n "(PurchaseOrder|SalesOrder|PurchaseReturnOrder|SalesReturnOrder)\.objects\.(create|get_or_create|update_or_create|bulk_create)" \ + api_v1 business \ + --glob '!**/tests/**' \ + --glob '!**/test*.py' +``` + +如果发现正常业务入口绕过 service,应让其改用 service,或在同一创建事务中显式写快照。数据导入、测试 fixture、历史修复脚本不一定属于“正常创建入口”,需要按用途判断,不能盲目强制。 + +预销售单/预采购单转正式单通常会调用正式单据 service;需要通过上述扫描确认,避免漏掉转换入口。 + +### 4.2 补定向服务测试 + +建议新增: + +`business/tests/test_balance_before_snapshot.py` + +至少覆盖以下场景。 + +#### 场景 A:四类创建均写当前余额 + +1. 使用 `create_basic_fixtures()` 创建供应商侧数据。 +2. 建立或更新 `SupplierBalance(balance=Decimal('123.45'))`。 +3. 通过 `create_purchase_order()` 创建采购单,断言快照为 `123.45`。 +4. 通过 `create_purchase_return_order()` 创建采购退货单,断言快照为 `123.45`。 +5. 使用 `create_sales_fixtures()` 创建客户侧数据。 +6. 建立或更新 `CustomerBalance(balance=Decimal('-67.89'))`。 +7. 通过 `create_sales_order()` 创建销售单,断言快照为 `-67.89`。 +8. 通过 `create_sales_return_order()` 创建销售退货单,断言快照为 `-67.89`。 + +测试应调用正式 service,而不是直接 `objects.create()`,以验证正常入口。 + +#### 场景 B:余额行不存在时,新单快照写零而不是 NULL + +对供应商侧和客户侧至少各测一个: + +```python +self.assertEqual(order.balance_before_snapshot, Decimal('0')) +self.assertIsNotNone(order.balance_before_snapshot) +``` + +这是“数据库允许空”和“正常创建必写”之间最容易回归的边界。 + +#### 场景 C:余额变化后不重算 + +1. 余额为 `100.00` 时创建单据。 +2. 创建后把对应 `SupplierBalance`/`CustomerBalance` 改成其他值,或审批另一张会改变余额的单据。 +3. `refresh_from_db()` 原单据。 +4. 断言快照仍为 `100.00`。 + +#### 场景 D:更新单据后不重算 + +更新服务允许审批中的单据更换供应商/客户。需要明确验证快照仍是最初创建时的值,而不是新往来单位当前余额: + +1. 往来单位 A 余额为 `100.00`,创建单据。 +2. 往来单位 B 余额为 `999.00`。 +3. 调用对应 `update_*` 将单据往来单位改为 B,并提交合法 items。 +4. 断言 `balance_before_snapshot` 仍为 `100.00`。 + +供应商侧与客户侧至少各覆盖一次。若产品语义认为更换往来单位应另有约束,也不能在更新时重算快照;需求已经明确“之后不重算”。 + +#### 场景 E:序列化字段只读 + +可以在 API 测试中验证: + +- 创建响应包含正确快照。 +- 列表或详情响应包含正确快照。 +- PATCH/PUT 请求即使携带伪造的 `balance_before_snapshot`,数据库值仍不变。 + +由于当前 API 更新路径手工提取允许字段,本身不会读取该请求字段;serializer 中也已标记只读。 + +### 4.3 迁移与系统检查 + +需要运行: + +```bash +python manage.py makemigrations --check --dry-run +python manage.py check +``` + +预期: + +- `makemigrations --check --dry-run` 不再生成额外迁移。 +- `manage.py check` 无本任务引入的问题。 + +若项目约定在 Docker 内运行,应使用现有项目测试容器,并按当前开发环境配置绕过 PgBouncer。不要擅自修改 `.env`、`docker-compose.yml` 或数据库配置来迁就测试;这些文件已有其他未提交改动。 + +### 4.4 定向测试命令 + +新增测试文件后建议先运行: + +```bash +python manage.py test business.tests.test_balance_before_snapshot +``` + +然后运行四类既有 service/API 测试,具体模块可根据项目现有测试命名选择: + +```bash +python manage.py test \ + business.tests.test_purchase_order \ + business.tests.test_sales_order \ + business.tests.test_purchase_return \ + business.tests.test_sales_return +``` + +API 测试集中在 `api_v1/tests.py` 时,可至少运行相关 TestCase: + +```bash +python manage.py test \ + api_v1.tests.PurchaseOrderAPITestCase \ + api_v1.tests.SalesOrderAPITestCase \ + api_v1.tests.PurchaseReturnOrderAPITestCase \ + api_v1.tests.SalesReturnOrderAPITestCase +``` + +最后根据时间运行更宽范围回归。由于工作区已有红冲与 statement 修改,如果宽范围测试失败,需先判断失败属于余额快照还是已有未提交工作。 + +## 5. 需要重点复核的设计点 + +### 5.1 快照时点 + +当前实现是在四个创建 service 的 `transaction.atomic()` 内、执行主单 `objects.create()` 参数求值时读取余额。这符合“创建时快照”。 + +当前读取函数没有使用 `select_for_update()`。在绝大多数正常流程中会读取当时已提交的余额;但如果产品要求与并发余额调整建立严格串行顺序,需要额外评估是否应锁定余额行。 + +不要未经评估直接把读取改成 `get_or_create(...).select_for_update()`:这会使每次创建单据都创建一行零余额记录,改变现有数据行为。若要增强并发语义,应先查看项目现有并发策略和数据库隔离级别,并补并发测试。 + +本需求当前未明确要求强锁,建议先保持现有简单读取,完成基础测试后再决定是否扩展。 + +### 5.2 更新时更换往来单位 + +当前更新服务允许把审批中的采购类单据改为另一供应商,或把销售类单据改为另一客户。快照仍保留创建时旧往来单位余额。 + +这看起来可能与更新后的往来单位不一致,但符合“创建时快照,之后不重算”的明确要求。不要在更新 service 中加入重算,除非用户重新定义业务语义。 + +### 5.3 历史数据 + +迁移不能回填 `0`,也不能依据当前余额倒推历史余额。历史单据的正确创建前余额通常无法可靠恢复,因此 `NULL` 本身就是“未知”的有效表达。 + +### 5.4 API 可写性 + +字段必须是输出字段而不是客户端输入字段。当前 serializer 已标记只读,创建 API 也没有读取客户端传入的同名字段。后续若引入新的 create serializer,要继续把字段设为 read-only,并由 service 计算。 + +## 6. 建议的完成顺序 + +1. 用 `git diff` 和 `git status --short` 确认上述八个代码/迁移文件的实际状态。 +2. 扫描所有生产创建入口和直接 ORM 创建点。 +3. 补 `business/tests/test_balance_before_snapshot.py`。 +4. 补必要的 API 字段测试。 +5. 运行 `makemigrations --check --dry-run` 和 `manage.py check`。 +6. 运行定向测试及四类既有回归测试。 +7. 执行 `git diff --check`;注意工作区已有文件可能存在与本任务无关的尾部空行问题,应区分来源。 +8. 最终审阅只聚焦本任务的文件/代码块,保留所有既有未提交修改。 + +## 7. 本任务相关文件清单 + +已修改或新增: + +- `business/models.py` +- `business/services.py` +- `business/migrations/0032_order_balance_before_snapshot.py`(新增、未提交) +- `api_v1/views/business/purchase/views.py` +- `api_v1/views/business/sales/views.py` +- `api_v1/views/business/purchase_return/views.py` +- `api_v1/views/business/sales_return/views.py` + +计划新增: + +- `business/tests/test_balance_before_snapshot.py` + +可能按测试结果增量修改: + +- `api_v1/tests.py`,或拆分后的对应 API 测试文件 +- 业务 API 文档(只有在项目要求公开列出响应字段时再补,不是核心实现的阻塞项) + +## 8. 完成判定 + +只有同时满足以下条件,才能认为本任务完成: + +- 四个数据库字段存在且允许 `NULL`。 +- 迁移不回填历史数据。 +- 四个正式创建 service 对余额存在和不存在两种情况均写入非空快照。 +- 所有正常生产创建入口都经过上述逻辑。 +- 更新、审批、作废、红冲以及余额后续变化不会改写快照。 +- 四类 API 能返回快照,且客户端不能写入或篡改。 +- 模型与迁移一致。 +- 定向测试通过,既有四类业务单据测试无本任务引入的回归。 diff --git a/docs/business_api_reference.md b/docs/business_api_reference.md index 9a895a9..c26263e 100644 --- a/docs/business_api_reference.md +++ b/docs/business_api_reference.md @@ -293,7 +293,7 @@ | API | 方法 | 描述 | |-----|------|------| | `/purchase-orders//red-flush/` | POST | 红冲已审批采购单,反向余额和库存影响 | -| `/sales-orders//red-flush/` | POST | 红冲已审批销售单,反向余额和库存影响 | +| `/sales-orders//red-flush/` | POST | 红冲已审批销售单;反向余额,若存在销售出库记录则同步反向库存 | | `/purchase-return-orders//red-flush/` | POST | 红冲已审批采购退货单,反向余额和库存影响 | | `/sales-return-orders//red-flush/` | POST | 红冲已审批销售退货单,反向余额和库存影响 | | `/payment-orders//red-flush/` | POST | 红冲已审批付款单,反向供应商余额 | @@ -307,7 +307,7 @@ } ``` -`reason` 必填且不能为空。红冲成功后原单据状态保持已审批,并返回 `is_red_flushed=true`、`red_flush_id`、`red_flushed_at`。外部来源付款/收款单不允许红冲。 +`reason` 必填且不能为空。红冲成功后原单据状态保持已审批,并返回 `is_red_flushed=true`、`red_flush_id`、`red_flushed_at`。销售单没有对应库存记录时只反向余额,不执行库存红冲。外部来源付款/收款单不允许红冲。 ## 7. 对账单(Statements) @@ -337,7 +337,7 @@ | 非本商户数据 | 403 | `{"error": "forbidden", "message": "无权限访问"}` | | 单据不存在 | 404 | `{"error": "purchase_order_not_found"}` 等 | | 审批非法状态 | 400 | 例如 `{"error": "purchase_order_has_stock_records"}`、`{"error": "receipt_order_already_approved"}` | -| 红冲非法状态 | 400 | 例如未审批、重复红冲、缺少可红冲库存/余额记录、外部来源单据不允许红冲 | +| 红冲非法状态 | 400 | 例如未审批、重复红冲、要求库存闭环的单据缺少可红冲库存记录、缺少可红冲余额记录、外部来源单据不允许红冲 | --- diff --git a/docs/sales_order_approval_and_red_flush.md b/docs/sales_order_approval_and_red_flush.md index 8a878fe..620b3c0 100644 --- a/docs/sales_order_approval_and_red_flush.md +++ b/docs/sales_order_approval_and_red_flush.md @@ -70,11 +70,11 @@ ## 8. 红冲(对冲)落地状态 -与采购单一致,销售单已支持整单红冲。已审批销售单可通过 `POST /api/v1/sales-orders//red-flush/` 触发,生成反向余额记录和反向库存记录。关键原则: +销售单已支持整单红冲。已审批销售单可通过 `POST /api/v1/sales-orders//red-flush/` 触发,生成反向余额记录;若原销售单存在 `source_type=SALES` 的出库记录,则同步生成反向库存记录。关键原则: - 采用新增反向记录的方式,保留所有历史变动。 -- 红冲记录需要指向原 `StockChangeRecord` / `StockSnapshot`,保证审计可追溯。 -- 红冲需与业务对象绑定,避免孤立库存操作。 +- 存在库存记录时,红冲记录需要指向原 `StockChangeRecord` / `StockSnapshot`,保证审计可追溯。 +- 红冲需与业务对象绑定;没有库存记录的销售单只处理余额侧,不执行库存红冲。 红冲能力已补充独立 API 文档与定向测试,确保审批、出库、红冲形成闭环。详细 API 见 `docs/2026-06-12_business_red_flush_api.md`。 diff --git a/docs/开版看板-plate-orders接口字段使用清单.md b/docs/开版看板-plate-orders接口字段使用清单.md new file mode 100644 index 0000000..03f4a69 --- /dev/null +++ b/docs/开版看板-plate-orders接口字段使用清单.md @@ -0,0 +1,102 @@ +# 开版看板 `/api/v1/plate-orders/` GET 接口字段使用清单 + +整理范围:只统计开版管理看板页面对 `GET /api/v1/plate-orders/` 列表接口返回数据的字段使用情况。 + +主要代码位置: + +- `src/pages/Production/PlateOrderKanban.tsx` +- `src/pages/Production/PlateOrderDetailModal.tsx` +- `src/pages/Production/PlatePrintTemplate.tsx` + +## 响应结构字段 + +| 字段 | 用途 | +|---|---| +| `results` | 订单列表数据源 | +| `count` | 判断后端总数是否大于本次加载数量,超出时提示用户缩小“下单时间”范围 | + +## 订单对象字段 + +| 字段 | 用途 | +|---|---| +| `id` | 卡片 ID、选择、拖拽、详情、编辑、打印、二维码内容、打印次数对象 ID | +| `auto_code` | 卡片副标题;打印顶部订单编号,缺失时用 `design_code` 兜底 | +| `design_code` | 卡片主标题;详情设计编号;打印设计编号;流程弹窗业务对象名称 | +| `customer_name` | 卡片客户;详情客户名称;打印客户 | +| `area` | 详情客户区域;打印默认地址/区域 | +| `salesperson_name` | 详情业务人员;打印业务员 | +| `merchandiser_name` | 详情跟单人员;打印跟单员 | +| `fabric_source` | 详情面料来源;打印布料 | +| `fabric` | 详情面料名称;打印打版面料 | +| `width` | 详情面料幅宽;打印幅宽 | +| `plate_type` | 卡片起版情况标签;详情起版情况;打印起版情况 | +| `plate_date` | 卡片下版时间;详情订单时间;打印订单时间 | +| `plate_method` | 详情开版方式;打印开版方式 | +| `plate_image_url` | 卡片图片优先来源;详情图片预览;打印开版图 | +| `plate_image` | 卡片图片兜底来源 | +| `plate_notes` | 详情打版备注;打印打版注意事项 | +| `reprint_reason` | 打印复版原因 | +| `urgency_level` | 卡片紧急程度;详情紧急程度;打印紧急程度 | +| `production_method` | 详情做货方式;打印做货方式 | +| `is_mark_frame` | 打印是否套唛架 | +| `drawing_rating` | 详情画图评级;打印画图难度 | +| `color_matching_rating` | 详情调色评级;打印调色难度 | +| `sample_rating` | 详情套样评级;打印套样难度 | +| `difficulty_rating` | 详情难度评级;打印难度评级 | +| `style_name` | 详情款号名称;打印款号名称 | +| `required_sample_meters` | 打印样品米数 | +| `required_completion_date` | 详情开版时间;打印开版时间 | +| `completion_date` | 详情要求时间;打印要求时间 | +| `approval_result` | 打印审批结果 | +| `customer_feedback` | 打印客户反馈 | +| `last_completed_state` | 看板分列依据;卡片状态;动态补充流程列;快速跳转当前状态 | +| `business_object_id` | 推进、回退、快速跳转;详情/打印加载当前订单工序日志 | +| `original_id` | 详情原订单入口;打印历史工序入口;批量打印历史工序入口 | +| `process_name` | 卡片流程标签;详情关联流程;打印开发进程 | +| `print_count` | 卡片打印次数;判断进入“未打印”或“客户开版”列 | +| `created_at` | 组装进打印数据,但当前打印模板未实际展示 | +| `created_by_name` | 打印拥有者/制单人 | + +## 去重字段列表 + +```text +id +auto_code +design_code +customer_name +area +salesperson_name +merchandiser_name +fabric_source +fabric +width +plate_type +plate_date +plate_method +plate_image_url +plate_image +plate_notes +reprint_reason +urgency_level +production_method +is_mark_frame +drawing_rating +color_matching_rating +sample_rating +difficulty_rating +style_name +required_sample_meters +required_completion_date +completion_date +approval_result +customer_feedback +last_completed_state +business_object_id +original_id +process_name +print_count +created_at +created_by_name +``` + +说明:`next`、`previous` 当前看板未使用;`status`、`is_completed`、`is_ordered`、`is_invalid`、`progress_percentage`、`updated_at`、`created_by` 只在复制订单时重置/透传逻辑里出现,不属于当前列表 GET 响应的实际展示或看板流程消费字段,未计入本清单。 diff --git a/flower/settings.py b/flower/settings.py index 38c95f6..162f230 100644 --- a/flower/settings.py +++ b/flower/settings.py @@ -52,9 +52,11 @@ DEBUG = env('DEBUG', default=False) ALLOWED_HOSTS = env.list('ALLOWED_HOSTS', default=[ 'yuwenerp.yuwen.cloud', + 'testbackend.yuwen.cloud', ]) CSRF_TRUSTED_ORIGINS = env.list('CSRF_TRUSTED_ORIGINS', default=[ 'https://yuwenerp.yuwen.cloud', + 'https://testbackend.yuwen.cloud', ]) # 明道云同步配置