feat: 公告按页、身份标签、拼多多订单号、派单与抢单改造

This commit is contained in:
XingQue
2026-06-25 15:35:51 +08:00
parent d1dc65e13b
commit 9575edcfc4
17 changed files with 646 additions and 15 deletions

View File

@@ -1831,6 +1831,7 @@ class ShangjiaPaifaView(APIView):
label_id = data.get('labelId') # 整数或 None
commission_enabled = data.get('commissionEnabled', False)
commission_value_raw = data.get('commissionValue')
waibu_dingdan_id_raw = data.get('waibuDingdanId', '')
# ----- 2. 字符串字段安全处理 -----
dingdan_jieshao = str(dingdan_jieshao_raw).strip()
@@ -1838,6 +1839,7 @@ class ShangjiaPaifaView(APIView):
laoban_name = str(laoban_name_raw).strip()
zhiding_uid = str(zhiding_uid_raw).strip()
commission_value_str = str(commission_value_raw).strip() if commission_value_raw is not None else ''
waibu_dingdan_id = str(waibu_dingdan_id_raw).strip()[:64] if waibu_dingdan_id_raw else ''
# ----- 3. 必填校验 -----
if not all([shangpin_type_id, dingdan_jieshao, laoban_name, jiage_str]):
@@ -1961,6 +1963,7 @@ class ShangjiaPaifaView(APIView):
ImageURL=request.user.Avatar,
User1ID=f"Sj{request.user.UserUID}",
ClubID=club_id,
ExternalOrderID=waibu_dingdan_id or None,
)
logger.info(f"订单主表创建: {dingdan.OrderID}")
@@ -2057,8 +2060,9 @@ class ShangjiaDingdanHuoquView(APIView):
# 🆕 商品类型筛选(兼容 leixing_id / ProductTypeID
leixing_id = pick_leixing_id(data)
# 🆕 模糊搜索关键字支持订单ID、订单介绍、游戏昵称、打手ID
# 🆕 模糊搜索关键字支持订单ID、订单介绍、游戏昵称、打手ID、拼多多订单号
keyword = data.get('keyword', '').strip()
waibu_dingdan_id = str(data.get('waibuDingdanId') or '').strip()
except (ValueError, TypeError):
return Response({
'code': 2,
@@ -2087,8 +2091,10 @@ class ShangjiaDingdanHuoquView(APIView):
if leixing_id is not None:
base_qs = base_qs.filter(Order__ProductTypeID=leixing_id)
# 7. 模糊搜索支持订单ID、订单介绍、游戏昵称、打手ID
if keyword:
# 7. 模糊搜索支持订单ID、订单介绍、游戏昵称、打手ID、拼多多订单号
if waibu_dingdan_id:
base_qs = base_qs.filter(Order__ExternalOrderID__exact=waibu_dingdan_id)
elif keyword:
# 订单ID精确匹配dingdan_id有唯一索引先用精确匹配
dingdan_id_match = Q(Order__OrderID__exact=keyword)
# 订单介绍模糊匹配
@@ -2097,9 +2103,11 @@ class ShangjiaDingdanHuoquView(APIView):
nicheng_match = Q(Order__Nickname__icontains=keyword)
# 打手ID精确匹配
dashou_match = Q(Order__PlayerID__exact=keyword)
# 拼多多订单号精确匹配
waibu_match = Q(Order__ExternalOrderID__exact=keyword)
base_qs = base_qs.filter(
dingdan_id_match | jieshao_match | nicheng_match | dashou_match
dingdan_id_match | jieshao_match | nicheng_match | dashou_match | waibu_match
)
# 8. 计算待结算订单数量状态为8
@@ -2317,6 +2325,9 @@ class ShangjiaDingdanXiangqingView(APIView):
# 新增更换打手后的新订单ID
'xin_dingdan_id': xin_dingdan_id,
# 拼多多订单号(商家/客服可见)
'waibu_dingdan_id': order.ExternalOrderID or '',
}
try:
@@ -3148,12 +3159,43 @@ class DashouDingdanHuoquView(APIView):
})
shangjia_tags_map[oid] = sj_tags
# --- 身份装饰标签 + 优质商家 ---
from jituan.services.identity_tag import (
SHENFEN_DASHOU,
SHENFEN_SHANGJIA,
batch_identity_tags,
)
from users.models import UserShangjia
identity_pairs = []
youzhi_map = {}
merchant_uids = set(shangjia_id_map.values())
if merchant_uids:
for sj in UserShangjia.query.filter(
user__UserUID__in=merchant_uids
).select_related('user').values('user__UserUID', 'is_youzhi_shangjia'):
youzhi_map[sj['user__UserUID']] = bool(sj['is_youzhi_shangjia'])
for item in dingdan_list:
oid = item['OrderID']
zhid = item.get('AssignedID')
if zhid:
identity_pairs.append((zhid, SHENFEN_DASHOU))
if item['Platform'] == 2 and oid in shangjia_id_map:
sj_uid = shangjia_id_map[oid]
if sj_uid:
identity_pairs.append((sj_uid, SHENFEN_SHANGJIA))
club_id = resolve_club_id_from_request(request)
identity_tag_map = batch_identity_tags(club_id, identity_pairs) if identity_pairs else {}
# 12. 格式化返回数据
formatted_list = []
for order in dingdan_list:
oid = order['OrderID']
zid = order.get('AssignedID')
info = zhiding_info.get(zid, {})
sj_uid = shangjia_id_map.get(oid) if order['Platform'] == 2 else None
formatted_list.append({
'dingdan_id': order['OrderID'],
'zhuangtai': order['Status'],
@@ -3176,6 +3218,10 @@ class DashouDingdanHuoquView(APIView):
'xuqiu_biaoqian': xuqiu_tags_map.get(oid, []),
'dashou_biaoqian': dashou_tags_map.get(oid, []),
'shangjia_biaoqian': shangjia_tags_map.get(oid, []),
# 身份装饰标签 + 优质商家
'shangjia_identity_biaoqian': identity_tag_map.get((sj_uid, SHENFEN_SHANGJIA), []) if sj_uid else [],
'zhiding_identity_biaoqian': identity_tag_map.get((zid, SHENFEN_DASHOU), []) if zid else [],
'shangjia_youzhi': bool(youzhi_map.get(sj_uid)) if sj_uid else False,
})
has_more = (page * page_size) < total
@@ -6215,6 +6261,7 @@ class ZxsjghdsView(APIView):
jieshao = old_order.Description
nicheng = old_order.Nickname
beizhu = old_order.Remark
waibu_dingdan_id = old_order.ExternalOrderID
user1_id = old_order.User1ID
tupian = old_order.ImageURL
fadan_pingtai = old_order.Platform
@@ -6303,6 +6350,7 @@ class ZxsjghdsView(APIView):
Remark=beizhu,
User1ID=user1_id, # 商家标识
ImageURL=tupian,
ExternalOrderID=waibu_dingdan_id,
# 不继承zhiding_id, jiedan_dashou_id, dashou_liuyan 等
)
@@ -6418,6 +6466,11 @@ class ShangjiaFakuanApplyView(APIView):
return Response({'code': 5, 'msg': '该打手在此订单已被罚款,不能重复申请'}, status=status.HTTP_400_BAD_REQUEST)
# ========== 6. 本地创建罚单 ==========
staff_kefu_id = None
staff_member = getattr(request, '_staff_member', None)
if staff_member is not None:
staff_kefu_id = getattr(staff_member, 'staff_user_id', None) or None
with transaction.atomic():
Penalty.query.create(
PenalizedUserID=dashou_id,
@@ -6430,6 +6483,7 @@ class ShangjiaFakuanApplyView(APIView):
AffectsGrabbing=yingxiang_qiangdan,
ApplicantIdentity=5, # 申请人是商家
ClubID=resolve_penalty_club_id(order=order, penalized_user_id=dashou_id),
ShopStaffUserID=staff_kefu_id,
)
logger.info(f"商家{shangjia_id}对订单{dingdan_id}打手{dashou_id}罚款成功,金额{fakuanjine}")
return Response({'code': 0, 'msg': '罚款申请已提交'})