217 lines
7.5 KiB
Python
217 lines
7.5 KiB
Python
from __future__ import annotations
|
|
|
|
from backend.app.repositories.reminder_repository import ReminderRepository
|
|
from backend.app.services.event_bus import EventBus
|
|
from backend.app.services.service_account_notification_service import ServiceAccountNotificationService
|
|
|
|
|
|
def test_service_account_payload_fields_match_current_templates():
|
|
service = ServiceAccountNotificationService()
|
|
|
|
cases = [
|
|
(
|
|
"order_approval_needed",
|
|
{
|
|
"order_no": "SO-001",
|
|
"approval_type": "订单审批",
|
|
"submitter": "张三",
|
|
"submit_time": "2026-06-26 10:00",
|
|
"order_status": "待审批",
|
|
},
|
|
{
|
|
"character_string2": "SO-001",
|
|
"thing8": "订单审批",
|
|
"thing7": "张三",
|
|
"time15": "2026-06-26 10:00",
|
|
"phrase3": "待审批",
|
|
},
|
|
),
|
|
(
|
|
"task_assigned",
|
|
{
|
|
"driver_name": "司机A",
|
|
"driver_phone": "13800000005",
|
|
"tracking_number": "YT1234567890",
|
|
"order_no": "SO-002",
|
|
},
|
|
{
|
|
"thing1": "司机A",
|
|
"phone_number2": "13800000005",
|
|
"character_string3": "YT1234567890",
|
|
"character_string4": "SO-002",
|
|
},
|
|
),
|
|
(
|
|
"order_status_change",
|
|
{
|
|
"status_text": "订单审批通过",
|
|
"order_no": "SO-003",
|
|
"logistics_status": "已审核",
|
|
"update_time": "2026-06-26 12:00",
|
|
"current_location": "后台审批完成",
|
|
},
|
|
{
|
|
"thing2": "订单审批通过",
|
|
"character_string3": "SO-003",
|
|
"phrase6": "已审核",
|
|
"time7": "2026-06-26 12:00",
|
|
"thing13": "后台审批完成",
|
|
},
|
|
),
|
|
(
|
|
"logistics_timeout",
|
|
{
|
|
"tracking_number": "SF123456789",
|
|
"latest_location": "广州分拨中心",
|
|
"update_time": "2026-06-26 13:00",
|
|
"order_no": "SO-004",
|
|
"destination": "上海仓库",
|
|
},
|
|
{
|
|
"character_string2": "SF123456789",
|
|
"thing11": "广州分拨中心",
|
|
"time7": "2026-06-26 13:00",
|
|
"character_string9": "SO-004",
|
|
"thing5": "上海仓库",
|
|
},
|
|
),
|
|
(
|
|
"arrears",
|
|
{
|
|
"pending_amount": "1888.50",
|
|
"due_time": "2026-06-30 00:00",
|
|
"debtor_name": "李四",
|
|
},
|
|
{
|
|
"amount2": "1888.50",
|
|
"time4": "2026-06-30 00:00",
|
|
"thing6": "李四",
|
|
},
|
|
),
|
|
(
|
|
"inactive_customer",
|
|
{
|
|
"customer_name": "王五",
|
|
"visit_time": "2026-06-26 09:00",
|
|
"contact_phone": "13900000001",
|
|
},
|
|
{
|
|
"thing2": "王五",
|
|
"time3": "2026-06-26 09:00",
|
|
"phone_number8": "13900000001",
|
|
},
|
|
),
|
|
]
|
|
|
|
for reminder_type, data, expected in cases:
|
|
field_map = service.TEMPLATE_FIELD_MAP[reminder_type]
|
|
payload_data = service._build_payload_data(field_map, "测试标题", data)
|
|
values = {key: item["value"] for key, item in payload_data.items()}
|
|
assert values == expected
|
|
|
|
|
|
def test_reminder_repository_builds_task_assigned_service_account_data(db_session, make_task):
|
|
from backend.app.models.business import SystemReminder
|
|
|
|
task = make_task(driver_id=5, tracking_number="YD99887766")
|
|
reminder = SystemReminder(
|
|
reminder_type="task_assigned",
|
|
biz_type="logistics_task",
|
|
biz_id=task.id,
|
|
receiver_user_id=5,
|
|
reminder_title="新任务分配",
|
|
reminder_content="请及时接单",
|
|
status="pending",
|
|
)
|
|
|
|
extra_data = ReminderRepository()._build_extra_data(db_session, reminder)
|
|
assert extra_data["driver_name"]
|
|
assert extra_data["driver_phone"] == "13800000005"
|
|
assert extra_data["tracking_number"] == "YD99887766"
|
|
assert extra_data["order_no"] == task._test_order.order_no
|
|
|
|
|
|
def test_reminder_repository_builds_arrears_service_account_data(db_session, make_customer, make_order):
|
|
from datetime import date
|
|
|
|
from backend.app.models.business import CustomerArrears, SystemReminder
|
|
|
|
customer = make_customer(customer_name="客户甲", mobile="13700000000")
|
|
order = make_order(customer_name=customer.customer_name, customer_id=customer.id, customer_mobile=customer.mobile)
|
|
arrears = CustomerArrears(
|
|
customer_id=customer.id,
|
|
order_id=order.id,
|
|
arrears_amount=2888.0,
|
|
due_date=date(2026, 6, 30),
|
|
status="overdue",
|
|
)
|
|
db_session.add(arrears)
|
|
db_session.flush()
|
|
|
|
reminder = SystemReminder(
|
|
reminder_type="arrears",
|
|
biz_type="customer_arrears",
|
|
biz_id=arrears.id,
|
|
receiver_user_id=2,
|
|
reminder_title="客户欠款逾期提醒 - 客户甲",
|
|
reminder_content="客户累计逾期欠款 2888.00 元,请及时跟进催收。",
|
|
status="pending",
|
|
)
|
|
|
|
extra_data = ReminderRepository()._build_extra_data(db_session, reminder)
|
|
assert extra_data["pending_amount"] == "2888.0"
|
|
assert extra_data["due_time"] == "2026-06-30 00:00"
|
|
assert extra_data["debtor_name"] == "客户甲"
|
|
assert extra_data["order_no"] == order.order_no
|
|
def test_event_bus_builds_status_change_wechat_data_with_after_status_text(db_session):
|
|
service = ServiceAccountNotificationService()
|
|
payload = EventBus()._build_wechat_data(
|
|
db_session,
|
|
"order_status_changed",
|
|
{
|
|
"order_no": "SO-001",
|
|
"title": "订单状态变更 - SO-001",
|
|
"content": "订单 SO-001 状态由「待审核」变更为「已通过」。",
|
|
"before_status_text": "待审核",
|
|
"after_status_text": "已通过",
|
|
},
|
|
)
|
|
|
|
assert payload["status_text"] == "已通过"
|
|
assert payload["status_desc"] == "已通过"
|
|
assert payload["status"] == "已通过"
|
|
|
|
payload_data = service._build_payload_data(
|
|
service.TEMPLATE_FIELD_MAP["order_status_change"],
|
|
payload["title"],
|
|
service._build_extra_data("order_status_change", payload, payload["title"]),
|
|
)
|
|
values = {key: item["value"] for key, item in payload_data.items()}
|
|
assert values["character_string3"] == "SO-001"
|
|
assert values["phrase6"] == "已通过"
|
|
|
|
|
|
def test_service_account_status_change_prefers_status_text_over_title():
|
|
service = ServiceAccountNotificationService()
|
|
|
|
payload_data = service._build_payload_data(
|
|
service.TEMPLATE_FIELD_MAP["order_status_change"],
|
|
"订单状态变更 - SO-042",
|
|
service._build_extra_data(
|
|
"order_status_change",
|
|
{
|
|
"title": "订单状态变更 - SO-042",
|
|
"order_no": "SO-042",
|
|
"status_text": "已通过",
|
|
"status_desc": "已通过",
|
|
"status": "approved",
|
|
"change_time": "2026-06-27 09:04",
|
|
"content": "订单 SO-042 状态由「待审核」变更为「已通过」。",
|
|
},
|
|
"订单状态变更 - SO-042",
|
|
),
|
|
)
|
|
|
|
values = {key: item["value"] for key, item in payload_data.items()}
|
|
assert values["phrase6"] == "已通过"
|