@@ -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': '订单不存在'})
|
||||
|
||||
Reference in New Issue
Block a user