fix: 运费金额为空时返回空值,便于顺丰批次展示月结

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-21 18:08:11 +08:00
1 parent 92c59d67b4
commit dd00dba39c
3 files changed
+48 -2

No files matched your search

+8 -1
View File
@@ -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,
+10 -1
View File
@@ -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 '',
@@ -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"] == "月结"