From dd00dba39c17d47bb89c0414a8c4738bb3485359 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Wed, 21 Oct 2026 18:08:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BF=90=E8=B4=B9=E9=87=91=E9=A2=9D?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E6=97=B6=E8=BF=94=E5=9B=9E=E7=A9=BA=E5=80=BC?= =?UTF-8?q?=EF=BC=8C=E4=BE=BF=E4=BA=8E=E9=A1=BA=E4=B8=B0=E6=89=B9=E6=AC=A1?= =?UTF-8?q?=E5=B1=95=E7=A4=BA=E6=9C=88=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- backend/app/crud/sample_freight.py | 9 ++++++- backend/app/services/market_freight.py | 11 +++++++- backend/tests/test_sf_express_settlement.py | 30 +++++++++++++++++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/backend/app/crud/sample_freight.py b/backend/app/crud/sample_freight.py index b0dbbdcf..c64e7035 100644 --- a/backend/app/crud/sample_freight.py +++ b/backend/app/crud/sample_freight.py @@ -27,6 +27,7 @@ from app.models.research_donation import ( BizResearchDonationSample, ) from app.services.sample_transport_mode import DICT_TYPE, resolve_transport_mode_value +from app.services.sf_express_settlement import freight_amount_label SAMPLE_SOURCE_CELL = "cell_storage" SAMPLE_SOURCE_DONATION = "research_donation" @@ -160,7 +161,13 @@ def _row_to_dict( "freightNo": getattr(obj, "freight_no", None) or "", "transportMode": obj.transport_mode or "", "transportModeLabel": transport_mode_label or (obj.transport_mode or ""), - "freightAmount": float(amount) if amount is not None else 0.0, + "freightAmount": float(amount) if amount is not None else None, + "freightAmountLabel": freight_amount_label(obj.transport_mode, amount), + "waybillNo": getattr(obj, "waybill_no", None) or "", + "settleStatus": getattr(obj, "settle_status", None) or "", + "settleTime": _fmt_dt(getattr(obj, "settle_time", None)) + if getattr(obj, "settle_time", None) + else "", "linkedSampleCount": int(linked_sample_count or 0), "tenantNo": obj.tenant_no, "orderNum": obj.order_num if obj.order_num is not None else 0, diff --git a/backend/app/services/market_freight.py b/backend/app/services/market_freight.py index 2258c6f9..5e2e566a 100644 --- a/backend/app/services/market_freight.py +++ b/backend/app/services/market_freight.py @@ -43,6 +43,7 @@ from app.services.market_field_scope import ( apply_donation_scope, ) from app.services.sample_transport_mode import DICT_TYPE, resolve_transport_mode_value +from app.services.sf_express_settlement import freight_amount_label from app.services.web_auth_roles import ( _map_role_name_to_web, resolve_web_role_for_user, @@ -307,12 +308,20 @@ def _creator_name_map( def _batch_dict( obj: BizSampleFreight, count: int, label: str, creator_name: str = '' ) -> Dict[str, Any]: + amount = obj.freight_amount + settle_time = getattr(obj, 'settle_time', None) return { 'id': obj.id, 'freightNo': obj.freight_no or '', 'transportMode': obj.transport_mode or '', 'transportModeLabel': label or obj.transport_mode or '', - 'freightAmount': str((obj.freight_amount or Decimal('0')).quantize(Decimal('0.01'))), + 'freightAmount': None + if amount is None + else str(Decimal(amount).quantize(Decimal('0.01'))), + 'freightAmountLabel': freight_amount_label(obj.transport_mode, amount), + 'waybillNo': getattr(obj, 'waybill_no', None) or '', + 'settleStatus': getattr(obj, 'settle_status', None) or '', + 'settleTime': _fmt_dt(settle_time) if settle_time else '', 'visibleItemCount': int(count), 'remark': obj.remark or '', 'createBy': obj.create_by or '', diff --git a/backend/tests/test_sf_express_settlement.py b/backend/tests/test_sf_express_settlement.py index c0be2689..b689cf97 100644 --- a/backend/tests/test_sf_express_settlement.py +++ b/backend/tests/test_sf_express_settlement.py @@ -181,3 +181,33 @@ def test_freight_model_allows_null_amount_and_settlement_columns(): assert cols["waybill_no"].nullable is True assert cols["settle_status"].nullable is True assert cols["settle_time"].nullable is True + + +def test_amount_serializer_keeps_null_instead_of_zero(): + from types import SimpleNamespace + from app.crud.sample_freight import _row_to_dict + from app.services.market_freight import _batch_dict + + obj = SimpleNamespace( + id="f1", + freight_no="YF1", + transport_mode="sfkd", + freight_amount=None, + waybill_no=None, + settle_status="wjs", + settle_time=None, + tenant_no="zkxw", + order_num=0, + remark="", + create_by="u1", + create_time=None, + update_time=None, + ) + admin = _row_to_dict(obj, transport_mode_label="顺丰快递", create_by_name="张三") + market = _batch_dict(obj, 1, "顺丰快递", "张三") + assert admin["freightAmount"] is None + assert admin["waybillNo"] == "" + assert admin["settleStatus"] == "wjs" + assert admin["freightAmountLabel"] == "月结" + assert market["freightAmount"] is None + assert market["freightAmountLabel"] == "月结"