diff --git a/backend/views/guanli.py b/backend/views/guanli.py index 4c0b2b0..80874ed 100644 --- a/backend/views/guanli.py +++ b/backend/views/guanli.py @@ -241,6 +241,7 @@ class GetGuanliListView(APIView): 'avatar': user.Avatar or '', 'nickname': boss.nickname if boss else '', 'zhuangtai': guanshi.zhuangtai, + 'fengjin_yuanyin': getattr(guanshi, 'fengjin_yuanyin', '') or '', 'yaogingshuliang': guanshi.yaogingshuliang, 'yue': str(guanshi.yue), 'chongzhifenrun': str(guanshi.chongzhifenrun), @@ -318,6 +319,7 @@ class GetGuanliDetailView(APIView): 'dianhua': guanshi.dianhua or '', 'wechat': guanshi.wechat or '', 'zhuangtai': guanshi.zhuangtai, + 'fengjin_yuanyin': getattr(guanshi, 'fengjin_yuanyin', '') or '', 'yaoqingma': guanshi.yaoqingma, 'yaoqingren': guanshi.yaoqingren, 'invite_qrcode_url': guanshi.invite_qrcode_url or '', @@ -615,11 +617,22 @@ class UpdateGuanliView(APIView): try: zt = int(zhuangtai) if zt in (0, 1): + yuanyin = (request.data.get('yuanyin') or request.data.get('fengjin_yuanyin') or '').strip() + if zt == 0 and zt != old_zhuangtai and not yuanyin: + return Response({'code': 400, 'msg': '封禁必须填写原因'}) guanshi.zhuangtai = zt + if zt == 0: + if yuanyin: + guanshi.fengjin_yuanyin = yuanyin[:200] + else: + guanshi.fengjin_yuanyin = '' if zt != old_zhuangtai: zt_map = {0: '禁用', 1: '正常'} - base_changes.append(f'状态:{zt_map.get(old_zhuangtai, old_zhuangtai)}→{zt_map.get(zt, zt)}') - except: + reason_part = f',原因={yuanyin}' if (zt == 0 and yuanyin) else '' + base_changes.append( + f'状态:{zt_map.get(old_zhuangtai, old_zhuangtai)}→{zt_map.get(zt, zt)}{reason_part}' + ) + except ValueError: pass if avatar is not None: user.Avatar = avatar diff --git a/backend/views/kefu.py b/backend/views/kefu.py index 7f310ca..d938f72 100644 --- a/backend/views/kefu.py +++ b/backend/views/kefu.py @@ -763,6 +763,8 @@ class KefuUpdateDashouView(APIView): if new_status not in [0, 1]: return Response({'code': 400, 'msg': '状态值无效(0=封禁,1=正常)'}) yuanyin = (request.data.get('yuanyin') or request.data.get('fengjin_yuanyin') or '').strip() + if new_status == 0 and not yuanyin: + return Response({'code': 400, 'msg': '封禁必须填写原因'}) dashou_profile.zhanghaozhuangtai = new_status if new_status == 0: dashou_profile.fengjin_yuanyin = yuanyin[:200] @@ -1121,6 +1123,7 @@ class KefuGetShangjiaDetailView(APIView): 'avatar': user.Avatar or '', 'nicheng': shangjia.nicheng, 'zhuangtai': shangjia.zhuangtai, # 1正常,2禁用 + 'fengjin_yuanyin': getattr(shangjia, 'fengjin_yuanyin', '') or '', 'dianhua': shangjia.dianhua, 'wechat': shangjia.wechat, 'yue': str(shangjia.yue), @@ -1255,25 +1258,34 @@ class KefuUpdateShangjiaView(APIView): if action == 'ban': if shangjia.zhuangtai == 2: return Response({'code': 400, 'msg': '商家已是封禁状态'}) + yuanyin = (request.data.get('yuanyin') or request.data.get('fengjin_yuanyin') or '').strip() + if not yuanyin: + return Response({'code': 400, 'msg': '封禁必须填写原因'}) shangjia.zhuangtai = 2 - shangjia.save(update_fields=['zhuangtai']) + shangjia.fengjin_yuanyin = yuanyin[:200] + shangjia.save(update_fields=['zhuangtai', 'fengjin_yuanyin']) write_xiugai_log( yonghuid=yonghuid, xiugaiid=kefu.user.Phone, leixing=XIUGAI_LEIXING_SHANGJIA, qitashuoming=( - f'【后台】封禁商家账号:正常 → 禁用,' + f'【后台】封禁商家账号:正常 → 禁用,原因={yuanyin},' f'商家ID={yonghuid},昵称={shangjia.nicheng},操作人={kefu.user.Phone}' ), ) - return Response({'code': 0, 'msg': '商家已封禁', 'data': {'zhuangtai': 2}}) + return Response({ + 'code': 0, + 'msg': '商家已封禁', + 'data': {'zhuangtai': 2, 'fengjin_yuanyin': shangjia.fengjin_yuanyin}, + }) # 解封 if action == 'unban': if shangjia.zhuangtai == 1: return Response({'code': 400, 'msg': '商家已是正常状态'}) shangjia.zhuangtai = 1 - shangjia.save(update_fields=['zhuangtai']) + shangjia.fengjin_yuanyin = '' + shangjia.save(update_fields=['zhuangtai', 'fengjin_yuanyin']) write_xiugai_log( yonghuid=yonghuid, xiugaiid=kefu.user.Phone, diff --git a/backend/views/zuzhang.py b/backend/views/zuzhang.py index acafcf0..d9a5071 100644 --- a/backend/views/zuzhang.py +++ b/backend/views/zuzhang.py @@ -233,6 +233,7 @@ class GetZuzhangListView(APIView): 'ketixian_jine': float(zu.ketixian_jine), 'yaoqing_zongshu': zu.yaoqing_zongshu, 'zhuangtai': zu.zhuangtai, + 'fengjin_yuanyin': getattr(zu, 'fengjin_yuanyin', '') or '', }) return Response({ @@ -312,6 +313,7 @@ class GetZuzhangDetailView(APIView): 'dianhua': '', # 组长表无电话字段?组长扩展表没有电话/微信,但前端可能需要,可从User关联?实际上组长表无电话字段,这里留空或从其他表获取 'wechat': '', 'zhuangtai': zuzhang.zhuangtai, + 'fengjin_yuanyin': getattr(zuzhang, 'fengjin_yuanyin', '') or '', 'yaoqingma': zuzhang.yaoqingma, 'yaoqingren': '', # 组长表没有邀请人字段 'haibao_url': zuzhang.haibao_url or '', @@ -461,11 +463,22 @@ class UpdateZuzhangView(APIView): try: zt = int(zhuangtai) if zt in (0, 1): + yuanyin = (request.data.get('yuanyin') or request.data.get('fengjin_yuanyin') or '').strip() + if zt == 0 and zt != old_zhuangtai and not yuanyin: + return Response({'code': 400, 'msg': '封禁必须填写原因'}) zuzhang.zhuangtai = zt + if zt == 0: + if yuanyin: + zuzhang.fengjin_yuanyin = yuanyin[:200] + else: + zuzhang.fengjin_yuanyin = '' if zt != old_zhuangtai: zt_map = {0: '禁用', 1: '正常'} - base_changes.append(f'状态:{zt_map.get(old_zhuangtai, old_zhuangtai)}→{zt_map.get(zt, zt)}') - except: + reason_part = f',原因={yuanyin}' if (zt == 0 and yuanyin) else '' + base_changes.append( + f'状态:{zt_map.get(old_zhuangtai, old_zhuangtai)}→{zt_map.get(zt, zt)}{reason_part}' + ) + except ValueError: pass if nickname: if not boss: