feat: 组队招募(/zudui)+ 结单/自动结算/罚款挂钩

新增 Team 表与接口;进8强制锁、组队分账优先且失败不回退全额队长。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-27 03:12:04 +08:00
parent e9e5ee85e2
commit 7002da6093
14 changed files with 1466 additions and 63 deletions

View File

@@ -888,12 +888,35 @@ class ShangjiaJiesuanView(APIView):
# 原子更新打手数据(可提现走冻结网关;未开启时与原先全额进 yue 一致)
from jituan.services.fund_freeze import credit_dashou_order_settle
credit_dashou_order_settle(
order=order,
dashou_profile=dashou,
user_id=jiedan_dashou_id,
amount=dashou_fencheng,
)
from orders.services.team_recruit import settle_team_or_legacy, get_active_recruit, lock_recruit
from orders.models import TeamRecruit, TeamSettleLedger
team_done = False
try:
rec = get_active_recruit(order.OrderID)
if rec and rec.status == TeamRecruit.STATUS_RECRUITING:
lock_recruit(rec.id, actor_uid='system', reason='merchant_settle_force_lock')
team_done = settle_team_or_legacy(order, set_idle_leader=True)
except Exception as e:
logger.error('商家结单组队分账失败 %s: %s', dingdan_id, e)
if TeamSettleLedger.query.filter(order_id=dingdan_id).exists() or get_active_recruit(dingdan_id):
return Response({
'code': 8,
'msg': f'组队分账失败,已阻止全额打给队长: {e}',
'data': None
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
if not team_done:
if get_active_recruit(order.OrderID):
return Response({
'code': 8,
'msg': '存在有效组队但分账未完成,已阻止全额打给队长',
'data': None
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
credit_dashou_order_settle(
order=order,
dashou_profile=dashou,
user_id=jiedan_dashou_id,
amount=dashou_fencheng,
)
# 更新商家成交单量
UserShangjia.query.filter(id=shangjia.id).update(