创赢未来评分系统 - 初始化提交(移除大文件)
All checks were successful
Deploy to Server / deploy (push) Successful in 18s

This commit is contained in:
爽哒哒
2026-03-18 22:28:45 +08:00
commit f26d35da66
315 changed files with 36043 additions and 0 deletions

144
backend/shop/sms_utils.py Normal file
View File

@@ -0,0 +1,144 @@
import requests
import threading
import json
from .models import AdminPhoneNumber
# SMS API Configuration
SMS_API_URL = "https://data.tangledup-ai.com/api/send-sms/diy"
SIGN_NAME = "叠加态科技云南"
def send_sms(phone_number, template_code, template_params):
"""
通用发送短信函数 (异步)
"""
def _send():
try:
payload = {
"phone_number": phone_number,
"template_code": template_code,
"sign_name": SIGN_NAME,
"template_params": template_params
}
headers = {
"Content-Type": "application/json",
"accept": "application/json"
}
# print(f"Sending SMS to {phone_number} with params: {template_params}")
response = requests.post(SMS_API_URL, json=payload, headers=headers, timeout=15)
print(f"SMS Response for {phone_number}: {response.status_code} - {response.text}")
except Exception as e:
print(f"发送短信异常: {str(e)}")
threading.Thread(target=_send).start()
def notify_admins_order_paid(order):
"""
通知管理员有新订单支付成功
"""
# 获取激活的管理员手机号最多3个
admins = AdminPhoneNumber.objects.filter(is_active=True)[:3]
if not admins.exists():
print("未配置管理员手机号,跳过管理员通知")
return
# 构造参数
# 模板变量: consignee, order_id, address
# order_id 格式要求: "订单编号/电话号码"
params = {
"consignee": order.customer_name or "未填写",
"order_id": f"{order.id}/{order.phone_number}",
"address": order.shipping_address or "无地址"
}
print(f"准备发送管理员通知,共 {admins.count()}")
for admin in admins:
send_sms(admin.phone_number, "SMS_501735480", params)
def notify_user_order_paid(order):
"""
通知用户下单成功 (支付成功)
"""
if not order.phone_number:
return
# 模板变量: user_nick, address
# 尝试获取用户昵称,如果没有则使用收货人姓名
user_nick = order.customer_name
if order.wechat_user and order.wechat_user.nickname:
user_nick = order.wechat_user.nickname
params = {
"user_nick": user_nick or "用户",
"address": order.shipping_address or "无地址"
}
print(f"准备发送用户支付成功通知: {order.phone_number}")
send_sms(order.phone_number, "SMS_501850529", params)
def notify_user_order_shipped(order):
"""
通知用户已发货
"""
if not order.phone_number:
return
# 模板变量: user_nick, address, delivery_company, order_id (这里指快递单号)
user_nick = order.customer_name
if order.wechat_user and order.wechat_user.nickname:
user_nick = order.wechat_user.nickname
params = {
"user_nick": user_nick or "用户",
"address": order.shipping_address or "无地址",
"delivery_company": order.courier_name or "快递",
"order_id": order.tracking_number or "暂无单号"
}
print(f"准备发送用户发货通知: {order.phone_number}")
#send_sms(order.phone_number, "SMS_501650557", params)
send_sms(order.phone_number, "SMS_501665569", params)
def notify_user_activity_signup_success(order, signup):
"""
通知用户活动报名成功 (支付成功后)
模板CODE: SMS_501990528
模板变量: user_nick, unit_name, time, address
"""
if not order.phone_number:
return
# 1. user_nick
user_nick = order.customer_name
if order.wechat_user and order.wechat_user.nickname:
user_nick = order.wechat_user.nickname
# 2. unit_name (Activity Title)
unit_name = f"{signup.activity.title}"
# 3. time
start_time = signup.activity.start_time
# Format time as YYYY-MM-DD HH:MM
time_str = start_time.strftime("%Y-%m-%d %H:%M") if start_time else "待定"
# 4. address
address = signup.activity.location or "线上活动"
# 5. Handle phone number format (remove +86 or spaces if any)
phone_number = str(order.phone_number) if order.phone_number else ""
if phone_number:
phone_number = phone_number.replace("+86", "").replace(" ", "").strip()
# Ensure phone number is valid (11 digits)
if not phone_number or len(phone_number) != 11 or not phone_number.isdigit():
print(f"无效的手机号: {phone_number}, 跳过短信发送")
return
params = {
"user_nick": user_nick or "用户",
"unit_name": unit_name,
"time": time_str,
"address": address
}
print(f"准备发送活动报名成功通知: {phone_number}")
send_sms(phone_number, "SMS_501990528", params)