fix: 强制结单组队分账+按打手俱乐部冻结

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-28 15:03:54 +08:00
parent 4414b74119
commit e91bf6c982
2 changed files with 128 additions and 8 deletions

View File

@@ -1803,19 +1803,81 @@ class KefuForceCompleteView(APIView):
if not dashou_fencheng or dashou_fencheng <= 0:
return Response({'code': 400, 'msg': '打手分成金额无效'})
# 5. 给打手结算
# 5. 给打手结算(组队分账优先;均走冻结入账网关)
try:
dashou_user = User.query.get(UserUID=dashou_id)
dashou_profile = dashou_user.DashouProfile
except (User.DoesNotExist, AttributeError):
return Response({'code': 400, 'msg': '打手不存在或扩展表缺失'})
freeze_result = {
'available': str(dashou_fencheng),
'frozen': '0.00',
'skipped_freeze': True,
'team_settled': False,
}
team_done = False
try:
from orders.services.team_recruit import (
settle_team_or_legacy, get_active_recruit, lock_recruit, team_should_split,
)
from orders.models import TeamRecruit, TeamSettleLedger
rec = get_active_recruit(order.OrderID)
if rec and rec.status == TeamRecruit.STATUS_RECRUITING:
lock_recruit(rec.id, actor_uid='system', reason='force_settle_lock')
team_done = settle_team_or_legacy(order, set_idle_leader=True)
except Exception as e:
logger.error('强制结单组队分账异常 %s: %s', dingdan_id, e, exc_info=True)
from orders.models import TeamSettleLedger
# 必须抛出让 atomic 回滚,禁止 return 提交半成品入账
if TeamSettleLedger.query.filter(order_id=dingdan_id).exists():
raise RuntimeError(f'组队分账异常且已有入账记录: {e}') from e
try:
from orders.services.team_recruit import team_should_split, get_active_recruit
if get_active_recruit(dingdan_id) or team_should_split(order):
raise RuntimeError(f'组队分账失败: {e}') from e
except RuntimeError:
raise
except Exception:
pass
team_done = False
if team_done:
freeze_result['team_settled'] = True
freeze_result['skipped_freeze'] = False
logger.info('强制结单组队分账完成 order=%s', dingdan_id)
else:
try:
from orders.services.team_recruit import get_active_recruit
if get_active_recruit(dingdan_id):
raise RuntimeError('存在有效组队但分账未完成,已阻止全额打给队长')
except RuntimeError:
raise
except Exception:
pass
from jituan.services.fund_freeze import credit_dashou_order_settle
credit_dashou_order_settle(
settle_ret = credit_dashou_order_settle(
order=order,
dashou_profile=dashou_profile,
user_id=dashou_id,
amount=dashou_fencheng,
)
except (User.DoesNotExist, AttributeError):
return Response({'code': 400, 'msg': '打手不存在或扩展表缺失'})
freeze_result = {
'available': str(settle_ret.get('available') or 0),
'frozen': str(settle_ret.get('frozen') or 0),
'skipped_freeze': bool(settle_ret.get('skipped_freeze')),
'skip_reason': settle_ret.get('skip_reason'),
'club_id': settle_ret.get('club_id'),
'ledger_id': settle_ret.get('ledger_id'),
'team_settled': False,
}
logger.info(
'强制结单打手入账 order=%s dashou=%s available=%s frozen=%s skip=%s reason=%s club=%s',
dingdan_id, dashou_id,
freeze_result['available'], freeze_result['frozen'],
freeze_result['skipped_freeze'], freeze_result.get('skip_reason'),
freeze_result.get('club_id'),
)
# 6. 如果是商家发单,更新商家成交订单数量
if order.Platform == 2:
@@ -1910,7 +1972,7 @@ class KefuForceCompleteView(APIView):
kefu.zongchuli = F('zongchuli') + 1
kefu.save(update_fields=['jinrichuli', 'jinyuechuli', 'zongchuli'])
return Response({'code': 0, 'msg': '强制结单成功'})
return Response({'code': 0, 'msg': '强制结单成功', 'data': freeze_result})
except Order.DoesNotExist:
return Response({'code': 404, 'msg': '订单不存在'})