Files
a_long/dengji/services.py
2026-06-14 02:38:05 +08:00

87 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# dengji/services.py
import logging
from django.db import transaction, IntegrityError
from django.utils import timezone
from .models import DashouBiaoxian
logger = logging.getLogger('dengji')
def record_dashou_biaoxian(dingdan_id, dashou_id, xingwei, **kwargs):
"""
统一记录打手订单表现
:param dingdan_id: 订单ID
:param dashou_id: 打手ID
:param xingwei: 行为类型 1-抢单 2-提交订单 3-结算
:param kwargs: 可选字段(与模型字段同名):
jiedan_time, tijiao_time,
bankuai, shangxian_sudu, fuwu_taidu, fanche_cishu
注意不管是哪种行为dingdan_id 和 dashou_id 都是必传的,
如果没传时间且业务需要时间,则自动取当前时间。
"""
try:
# ----- 抢单:创建记录 -----
if xingwei == 1:
jiedan_time = kwargs.get('jiedan_time') or timezone.now()
bankuai = kwargs.get('bankuai') # 可为 None
# 避免重复创建(同一订单只会有一条表现记录)
obj, created = DashouBiaoxian.objects.get_or_create(
dingdan_id=dingdan_id,
dashou_id=dashou_id,
defaults={
'bankuai': bankuai,
'jiedan_time': jiedan_time,
}
)
if not created:
logger.info(f"表现记录已存在,跳过创建: dingdan={dingdan_id}, dashou={dashou_id}")
else:
logger.info(f"创建抢单表现记录: dingdan={dingdan_id}, dashou={dashou_id}")
# ----- 提交订单:更新提交时间 -----
elif xingwei == 2:
tijiao_time = kwargs.get('tijiao_time') or timezone.now()
# 只更新已存在的记录,找不到就直接跳过
updated = DashouBiaoxian.objects.filter(
dingdan_id=dingdan_id,
dashou_id=dashou_id
).update(tijiao_time=tijiao_time)
if updated:
logger.info(f"更新提交时间: dingdan={dingdan_id}, dashou={dashou_id}")
else:
logger.info(f"无对应记录,跳过提交时间更新: dingdan={dingdan_id}, dashou={dashou_id}")
# ----- 结算:更新评价信息 -----
elif xingwei == 3:
# 构建要更新的字段,只更新 kwargs 中传入的非 None 字段
update_fields = {}
for field in ['shangxian_sudu', 'fuwu_taidu', 'fanche_cishu']:
val = kwargs.get(field)
if val is not None:
update_fields[field] = val
# 如果还传了板块也可以更新
bankuai = kwargs.get('bankuai')
if bankuai is not None:
update_fields['bankuai'] = bankuai
if update_fields:
updated = DashouBiaoxian.objects.filter(
dingdan_id=dingdan_id,
dashou_id=dashou_id
).update(**update_fields)
if updated:
logger.info(f"更新评价信息: dingdan={dingdan_id}, dashou={dashou_id}, fields={update_fields}")
else:
logger.info(f"无对应记录,跳过评价更新: dingdan={dingdan_id}, dashou={dashou_id}")
else:
logger.info(f"结算时未传入任何评价字段,跳过更新")
else:
logger.warning(f"未知的行为类型: {xingwei}")
except IntegrityError as e:
# 唯一约束冲突get_or_create 理论上已处理,但并发时仍可能撞上)
logger.warning(f"表现记录写入冲突,可能并发创建: {e}")
except Exception as e:
# 无论发生什么错误,都不影响主流程
logger.error(f"记录打手表现异常: dingdan={dingdan_id}, dashou={dashou_id}, xingwei={xingwei}, error={e}", exc_info=True)