fix: 组队仅队长提交修改,组员可见交付;罚单聚合改撤联动

详情返回 can_submit/can_modify;交付图按订单聚合;组队均摊罚单展示总额并联动修改/撤销;罚单 ClubID 归属订单店。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-27 08:05:34 +08:00
parent c5ceacf3d3
commit 7d366e8075
4 changed files with 275 additions and 73 deletions

View File

@@ -642,21 +642,37 @@ class ShangjiaDingdanXiangqingView(APIView):
if hasattr(dashou_user, 'DashouProfile') and dashou_user.DashouProfile:
dashou_nicheng = dashou_user.DashouProfile.nicheng or ''
# 6. 罚款数据(如果存在
fadan_obj = Penalty.query.filter(
RelatedOrderID=dingdan_id,
PenalizedUserID=dashou_yonghuid
).first()
# 6. 罚款数据(组队均摊:聚合全部罚单;展示总额+明细
from orders.services.team_recruit import list_team_split_penalties
split_list = list_team_split_penalties(dingdan_id, include_rejected=True)
fadan_qs = Penalty.query.filter(RelatedOrderID=dingdan_id).order_by('id')
if split_list:
fadan_list = split_list
else:
fadan_list = list(
fadan_qs.filter(PenalizedUserID=dashou_yonghuid)[:1]
) or list(fadan_qs[:1])
fadan_obj = fadan_list[0] if fadan_list else None
fadan_dict = None
if fadan_obj:
fadan_items = []
if fadan_list:
total_fine = 0.0
total_bonus = 0.0
rate = 0.0
for p in fadan_list:
total_fine += float(p.FineAmount or 0)
total_bonus += float(p.ApplicantBonusAmount or 0)
if p.ApplicantBonusRate:
rate = float(p.ApplicantBonusRate)
fadan_items.append({
'id': p.id,
'beichufa_id': p.PenalizedUserID or '',
'fakuanjine': float(p.FineAmount or 0),
'zhuangtai': p.Status,
'yingde_fenhong': float(p.ApplicantBonusAmount or 0),
})
ct = fmt_datetime(fadan_obj.CreateTime)
ut = fmt_datetime(fadan_obj.UpdateTime)
zhengju_urls = list(
PenaltyAppealImage.query.filter(Penalty=fadan_obj, Purpose=1).values_list('ImageURL', flat=True)
)
shensu_urls = list(
PenaltyAppealImage.query.filter(Penalty=fadan_obj, Purpose=2).values_list('ImageURL', flat=True)
)
zhengju_imgs = [
{'id': t.id, 'url': t.ImageURL}
for t in PenaltyAppealImage.query.filter(Penalty=fadan_obj, Purpose=1)
@@ -665,20 +681,23 @@ class ShangjiaDingdanXiangqingView(APIView):
{'id': t.id, 'url': t.ImageURL}
for t in PenaltyAppealImage.query.filter(Penalty=fadan_obj, Purpose=2)
]
reason = (fadan_obj.Reason or '').replace('【组队均摊】', '', 1)
fadan_dict = {
'id': fadan_obj.id,
'chufaliyou': fadan_obj.Reason or '',
'fakuanjine': float(fadan_obj.FineAmount) if fadan_obj.FineAmount else 0.0,
'chufaliyou': reason,
'fakuanjine': total_fine,
'yingxiang_qiangdan': fadan_obj.AffectsGrabbing,
'zhuangtai': fadan_obj.Status,
'shensuliyou': fadan_obj.AppealReason or '',
'tongyi_chufaliyou': fadan_obj.ApproveReason or '',
'bohuiliyou': fadan_obj.RejectReason or '',
'yingde_fenhong': float(fadan_obj.ApplicantBonusAmount or 0),
'fenhong_lilv': float(fadan_obj.ApplicantBonusRate or 0),
'fenhong_yiruzhang': bool(fadan_obj.BonusCredited),
'yingde_fenhong': total_bonus,
'fenhong_lilv': rate,
'fenhong_yiruzhang': all(bool(p.BonusCredited) for p in fadan_list),
'zhengju_tupian': zhengju_imgs,
'shensu_tupian': shensu_imgs,
'is_team_split': len(fadan_list) > 1 or (fadan_obj.Reason or '').startswith('【组队均摊】'),
'items': fadan_items,
'CreateTime': ct,
'create_time': ct,
'UpdateTime': ut,