test_pl_plan_archive_export.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. from decimal import Decimal
  2. from app.schemas.pl.plan import PlanDeliveryRead, PlanLoadRead, PlanStopProductRead
  3. from app.services.pl_internal_customer import INTERNAL_CUSTOMER_NAMES
  4. from app.services.pl_plan_archive_export import (
  5. _append_stop_product_rows,
  6. _plan_common_export_fields,
  7. resolve_archive_list_io_column,
  8. )
  9. def test_resolve_archive_list_io_column():
  10. internal = next(iter(INTERNAL_CUSTOMER_NAMES))
  11. assert resolve_archive_list_io_column("load", internal) == "outbound"
  12. assert resolve_archive_list_io_column("load", "外部客户") == "inbound"
  13. assert resolve_archive_list_io_column("delivery", internal) == "inbound"
  14. assert resolve_archive_list_io_column("delivery", "外部客户") == "outbound"
  15. def test_append_stop_product_rows_io_and_amount():
  16. internal = next(iter(INTERNAL_CUSTOMER_NAMES))
  17. product = PlanStopProductRead(
  18. id="sp1",
  19. planId="p1",
  20. tenantNo="t1",
  21. productId="prod1",
  22. productNo="P001",
  23. productName="甲醇",
  24. model="99%",
  25. unit="吨",
  26. packageSpec="散装",
  27. planQty=Decimal("10"),
  28. inboundQty=Decimal("9.5"),
  29. inboundPrice=Decimal("100"),
  30. inboundAmount=None,
  31. createTime="2026-08-27T00:00:00",
  32. updateTime="2026-08-27T00:00:00",
  33. )
  34. load = PlanLoadRead(
  35. id="load1",
  36. planId="p1",
  37. tenantNo="t1",
  38. customerName=internal,
  39. address="装货地址",
  40. loadTime="2026-08-27T08:00:00",
  41. products=[product],
  42. createTime="2026-08-27T00:00:00",
  43. updateTime="2026-08-27T00:00:00",
  44. )
  45. rows: list[dict] = []
  46. plan_common = {
  47. "planNo": "PL20260827001",
  48. "planDate": "2026-08-27",
  49. }
  50. row_no = _append_stop_product_rows(rows, 0, plan_common, "load", load, None, load.products)
  51. assert row_no == 1
  52. assert len(rows) == 1
  53. row = rows[0]
  54. assert row["stopKind"] == "装货"
  55. assert row["stopCustomer"] == internal
  56. assert row["actualQty"] == Decimal("9.5")
  57. assert row["outboundQty"] == Decimal("9.5")
  58. assert row["inboundQty"] is None
  59. assert row["unitPrice"] == Decimal("100")
  60. assert row["amount"] == Decimal("950")
  61. def test_append_stop_product_rows_delivery_external_outbound():
  62. product = PlanStopProductRead(
  63. id="sp2",
  64. planId="p1",
  65. tenantNo="t1",
  66. productId="prod1",
  67. productNo="P001",
  68. productName="甲醇",
  69. outboundQty=Decimal("8"),
  70. outboundPrice=Decimal("120"),
  71. outboundAmount=Decimal("960"),
  72. createTime="2026-08-27T00:00:00",
  73. updateTime="2026-08-27T00:00:00",
  74. )
  75. delivery = PlanDeliveryRead(
  76. id="del1",
  77. planId="p1",
  78. tenantNo="t1",
  79. seq=1,
  80. customerName="外部客户",
  81. address="送货地址",
  82. deliveryTime="2026-08-28T10:00:00",
  83. products=[product],
  84. createTime="2026-08-27T00:00:00",
  85. updateTime="2026-08-27T00:00:00",
  86. )
  87. rows: list[dict] = []
  88. row_no = _append_stop_product_rows(rows, 0, {"planNo": "P1"}, "delivery", delivery, 1, delivery.products)
  89. row = rows[0]
  90. assert row["stopKind"] == "送货 #1"
  91. assert row["outboundQty"] == Decimal("8")
  92. assert row["inboundQty"] is None
  93. assert row["amount"] == Decimal("960")
  94. class _FakePlan:
  95. plan_no = "PL001"
  96. plan_date = "2026-08-27"
  97. archive_status = "archived"
  98. follow_status = "arranged"
  99. plan_type = "direct"
  100. license_plate = "皖A12345"
  101. trailer_no = "挂001"
  102. erp_entered = 1
  103. freight_amount = Decimal("500")
  104. remark = "测试"
  105. def test_plan_common_export_fields():
  106. fields = _plan_common_export_fields(_FakePlan(), None)
  107. assert fields["planNo"] == "PL001"
  108. assert fields["archiveStatus"] == "已归档"
  109. assert fields["followStatus"] == "已安排"
  110. assert fields["planType"] == "直销单"
  111. assert fields["licensePlate"] == "皖A12345挂001"
  112. assert fields["erpEntered"] == "是"