"""admin_assignment 任职 CRUD(修复停用不生效、重复插入)。""" from django.db.models import Q from django.utils import timezone from jituan.constants import DATA_SCOPE_ALL, DATA_SCOPE_SINGLE from jituan.models import AdminAssignment def _club_filter(qs, club_id): if club_id is None: return qs.filter(Q(club_id__isnull=True) | Q(club_id='')) return qs.filter(club_id=club_id) def find_assignment(yonghuid, club_id, role_code): qs = AdminAssignment.query.filter(yonghuid=yonghuid, role_code=role_code) return _club_filter(qs, club_id).first() def find_active_assignment(yonghuid, club_id, role_code): qs = AdminAssignment.query.filter(yonghuid=yonghuid, role_code=role_code, status=1) return _club_filter(qs, club_id).first() def create_or_reactivate_assignment( yonghuid, club_id, role_code, data_scope, is_primary, granted_by, ): active = find_active_assignment(yonghuid, club_id, role_code) if active: return None, '该任职记录已存在且有效' inactive = find_assignment(yonghuid, club_id, role_code) if inactive and inactive.status != 1: AdminAssignment.objects.filter(pk=inactive.id).update( status=1, data_scope=data_scope, is_primary=is_primary, granted_by=granted_by, UpdateTime=timezone.now(), ) return inactive.id, None row = AdminAssignment.query.create( yonghuid=yonghuid, club_id=club_id, role_code=role_code, data_scope=data_scope, is_primary=is_primary, granted_by=granted_by, status=1, ) return row.id, None def deactivate_assignment(assignment_id): try: pk = int(assignment_id) except (TypeError, ValueError): return False, '任职 id 无效' updated = AdminAssignment.objects.filter(pk=pk, status=1).update( status=0, UpdateTime=timezone.now(), ) if updated: return True, None exists = AdminAssignment.objects.filter(pk=pk).exists() if exists: return True, None return False, '任职记录不存在' def dedupe_active_assignments(): """停用重复的有效任职,每组 (yonghuid, club_id, role_code) 只保留一条。""" rows = list( AdminAssignment.query.filter(status=1).order_by('yonghuid', 'club_id', 'role_code', 'id') ) seen = {} dup_ids = [] for row in rows: key = (row.yonghuid, row.club_id or '', row.role_code) if key in seen: dup_ids.append(row.id) else: seen[key] = row.id if dup_ids: AdminAssignment.objects.filter(pk__in=dup_ids).update( status=0, UpdateTime=timezone.now(), ) return len(dup_ids)