from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.http import JsonResponse, Http404 from django.shortcuts import render from django.template.loader import render_to_string from django.urls import reverse from django.views.decorators.http import require_http_methods from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.decorators import api_view, permission_classes from common.auth import custom_permission_required from common.utils.page_helper import paginate_query_and_assign_numbers from .forms import * from .models import GroupBusinessTarget, TargetAudit, EmployeeTargetAudit, EmployeePerformanceTarget from .serializers import TargetAuditSerializer, EmployeeTargetAuditSerializer @custom_permission_required('perf_mgnt.view_groupbusinesstarget') def gbo_list_view(request): """ 基础数据-业绩管理-集团经营目标表-列表 """ # 声明查询集 query_set = GroupBusinessTarget.objects.filter().order_by('-target_id') # 获取查询参数 primary_department = request.GET.get('primary_department', '') year = request.GET.get('year', '') project_nature = request.GET.get('project_nature', '') # 根据提供的参数进行筛选 if primary_department: query_set = query_set.filter(primary_department=primary_department) if year: query_set = query_set.filter(year=year) if project_nature: query_set = query_set.filter(project_nature=project_nature) # 对查询结果进行分页,每页10条记录 items = paginate_query_and_assign_numbers( request=request, queryset=query_set, per_page=10 ) # 构建上下文查询参数字符串 query_params = '&primary_department={}&year={}&project_nature={}'.format(primary_department, year, project_nature) # Excel上传模板 template_name = "业绩管理-集团经营目标-Excel上传模板.xlsx" # 构建上下文 context = { "model_config": 'perf_mgnt.GroupBusinessTarget', "items": items, "breadcrumb_list": [ {"title": "首页", "name": "index"}, {"title": "基础数据", "name": "index"}, {"title": "集团经营目标表", "name": "gbo_list"} ], "filters": [ { "type": "select", "id": "primary_department", "name": "primary_department", "label": "一级部门", "options": [ {"value": "天信", "display": "天信"}, {"value": "混改", "display": "混改"}, {"value": "艾力芬特", "display": "艾力芬特"}, {"value": "星河", "display": "星河"}, {"value": "星海", "display": "星海"} ] }, { "type": "select", "id": "year", "name": "year", "label": "年份", "options": [ {"value": "2024", "display": "2024"}, {"value": "2023", "display": "2023"}, {"value": "2022", "display": "2022"}, {"value": "2021", "display": "2021"}, {"value": "2020", "display": "2020"} ] }, { "type": "select", "id": "project_nature", "name": "project_nature", "label": "项目性质", "options": [ {"value": "新增", "display": "新增"}, {"value": "存续", "display": "存续"}, {"value": "新增及存续", "display": "新增及存续"}, {"value": "老客户新业务", "display": "老客户新业务"} ] } ], "table_exclude_field_name": ['target_id'], "excel_upload_config": { "template_name": template_name, "template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}), "parse_url": reverse("ep_common_parse"), "save_url": reverse("save_excel_table_data") }, "query_params": query_params, "form_action_url": reverse('gbo_list'), "modify_url": reverse("gbo_list_modify"), "add_url": reverse("gbo_list_add"), "delete_url": reverse("gbo_list_delete"), "add_button": True, "import_excel_button": True } return render(request, 'items_list.html', context) @custom_permission_required('perf_mgnt.add_groupbusinesstarget') def gbo_list_add(request): """ 基础数据-业绩管理-集团经营目标表-添加 """ if request.method == 'POST': form = GroupBusinessTargetForm(request.POST) if form.is_valid(): form.save() return JsonResponse({"message": "添加成功"}) else: form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400) elif request.method == 'GET': form = GroupBusinessTargetForm() form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html}) else: return JsonResponse({"message": "无效的请求方法"}, status=405) @custom_permission_required('perf_mgnt.change_groupbusinesstarget') def gbo_list_modify(request): """ 基础数据-业绩管理-集团经营目标表-修改 """ if request.method == 'POST': if 'id' in request.POST: instance = GroupBusinessTarget.objects.get(target_id=request.POST['id']) form = GroupBusinessTargetForm(request.POST, instance=instance) else: form = GroupBusinessTargetForm(request.POST) if form.is_valid(): form.save() return JsonResponse({"message": "保存成功"}) else: form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400) elif request.method == 'GET': if 'id' in request.GET: try: instance = GroupBusinessTarget.objects.get(target_id=request.GET['id']) form = GroupBusinessTargetForm(instance=instance) except GroupBusinessTarget.DoesNotExist: raise Http404("对象不存在") else: form = GroupBusinessTargetForm() form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html}) else: return JsonResponse({"message": "无效的请求方法"}, status=405) @require_http_methods(["POST"]) @custom_permission_required('perf_mgnt.delete_groupbusinesstarget') def gbo_list_delete(request): """ 基础数据-业绩管理-集团经营目标表-删除 """ target_id = request.POST.get('id') if target_id: GroupBusinessTarget.objects.filter(target_id=target_id).delete() return JsonResponse({"message": "删除成功"}) else: return JsonResponse({"message": "请求参数错误"}, status=400) @custom_permission_required('perf_mgnt.view_targetaudit') @api_view(['GET']) @permission_classes([IsAuthenticated]) def gbo_audit_record_list_view(request): """ 基础数据-业绩管理-集团经营目标表-修改记录列表 """ # 设置每页显示的记录数,默认为10 per_page = request.GET.get('per_page', 5) page_number = request.GET.get('page', 1) # 获取所有修改记录的查询集 queryset = TargetAudit.objects.all().order_by('-modification_date') # 使用Django的Paginator进行分页处理 paginator = Paginator(queryset, per_page) try: page_obj = paginator.page(page_number) except EmptyPage: page_obj = paginator.page(paginator.num_pages) # 如果页码太大,显示最后一页 except PageNotAnInteger: page_obj = paginator.page(1) # 如果页码不是整数,显示第一页 # 序列化分页后的数据 serializer = TargetAuditSerializer(page_obj, many=True) # 构造响应数据,包含分页信息 response_data = { 'modal_title': '集团经营目标修改记录', 'columns': ['修改对象', '修改字段', '旧值', '新值', '修改时间', '修改人'], 'records': serializer.data, 'page': page_obj.number, 'num_pages': paginator.num_pages, 'has_previous': page_obj.has_previous(), 'has_next': page_obj.has_next(), 'start_index': page_obj.start_index(), 'end_index': page_obj.end_index(), 'total_items': paginator.count } return Response(response_data) @custom_permission_required('perf_mgnt.view_employeeperformancetarget') def emt_list_view(request): """ 基础数据-业绩管理-员工业绩目标表-列表 """ # 声明查询集 query_set = EmployeePerformanceTarget.objects.filter().order_by('-target_id') # 获取查询参数 name = request.GET.get('name', '') department = request.GET.get('department', '') year = request.GET.get('year', '') project_nature = request.GET.get('project_nature', '') # 根据提供的参数进行筛选 if name: query_set = query_set.filter(name__icontains=name) if department: query_set = query_set.filter(department=department) if year: query_set = query_set.filter(year=year) if project_nature: query_set = query_set.filter(project_nature=project_nature) # 对查询结果进行分页,每页10条记录 items = paginate_query_and_assign_numbers( request=request, queryset=query_set, per_page=10 ) # 构建上下文查询参数字符串 query_params = '&name={}&department={}&year={}&project_nature={}'.format(name, department, year, project_nature) # Excel上传模板 template_name = "业绩管理-员工业绩目标-Excel上传模板.xlsx" # 构建上下文 context = { "model_config": 'perf_mgnt.EmployeePerformanceTarget', "items": items, "breadcrumb_list": [ {"title": "首页", "name": "index"}, {"title": "业绩管理", "name": "index"}, {"title": "员工业绩目标表", "name": "emt_list"} ], "filters": [ {"type": "text", "id": "name", "name": "name", "label": "姓名", "placeholder": "请输入姓名"}, { "type": "select", "id": "department", "name": "department", "label": "一级部门", "options": [ {"value": "天信", "display": "天信"}, {"value": "混改", "display": "混改"}, {"value": "艾力芬特", "display": "艾力芬特"}, {"value": "星河", "display": "星河"}, {"value": "星海", "display": "星海"} ] }, { "type": "select", "id": "year", "name": "year", "label": "年份", "options": [ {"value": "2024", "display": "2024"}, {"value": "2023", "display": "2023"}, {"value": "2022", "display": "2022"}, {"value": "2021", "display": "2021"}, {"value": "2020", "display": "2020"} ] }, { "type": "select", "id": "project_nature", "name": "project_nature", "label": "项目性质", "options": [ {"value": "新增", "display": "新增"}, {"value": "存续", "display": "存续"}, {"value": "新增及存续", "display": "新增及存续"}, {"value": "老客户新业务", "display": "老客户新业务"} ] } ], "table_exclude_field_name": ['target_id'], "excel_upload_config": { "template_name": template_name, "template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}), "parse_url": reverse("ep_common_parse"), "save_url": reverse("save_excel_table_data") }, "query_params": query_params, "form_action_url": reverse('emt_list'), "modify_url": reverse("emt_list_modify"), "add_url": reverse("emt_list_add"), "delete_url": reverse("emt_list_delete"), "add_button": True, "import_excel_button": True } return render(request, 'items_list.html', context) @custom_permission_required('perf_mgnt.add_employeeperformancetarget') def emt_list_add(request): """ 基础数据-业绩管理-员工业绩目标表-添加 """ if request.method == 'POST': form = EmployeePerformanceTargetForm(request.POST) if form.is_valid(): form.save() return JsonResponse({"message": "添加成功"}) else: form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400) elif request.method == 'GET': form = EmployeePerformanceTargetForm() form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html}) else: return JsonResponse({"message": "无效的请求方法"}, status=405) @custom_permission_required('perf_mgnt.change_employeeperformancetarget') def emt_list_modify(request): """ 基础数据-业绩管理-员工业绩目标表-修改 """ if request.method == 'POST': if 'id' in request.POST: instance = EmployeePerformanceTarget.objects.get(target_id=request.POST['id']) form = EmployeePerformanceTargetForm(request.POST, instance=instance) else: form = EmployeePerformanceTargetForm(request.POST) if form.is_valid(): form.save() return JsonResponse({"message": "保存成功"}) else: form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html, "errors": form.errors}, status=400) elif request.method == 'GET': if 'id' in request.GET: try: instance = EmployeePerformanceTarget.objects.get(target_id=request.GET['id']) form = EmployeePerformanceTargetForm(instance=instance) except EmployeePerformanceTarget.DoesNotExist: raise Http404("对象不存在") else: form = EmployeePerformanceTargetForm() form_html = render_to_string('form_partial.html', {'form': form}, request) return JsonResponse({"form_html": form_html}) else: return JsonResponse({"message": "无效的请求方法"}, status=405) @require_http_methods(["POST"]) @custom_permission_required('perf_mgnt.delete_employeeperformancetarget') def emt_list_delete(request): """ 基础数据-业绩管理-员工业绩目标表-删除 """ target_id = request.POST.get('id') if target_id: EmployeePerformanceTarget.objects.filter(target_id=target_id).delete() return JsonResponse({"message": "删除成功"}) return JsonResponse({"message": "请求参数错误"}, status=404) @custom_permission_required('perf_mgnt.view_employeeperformancetargetaudit') @api_view(['GET']) @permission_classes([IsAuthenticated]) def emt_audit_record_list(request): """ 基础数据-业绩管理-员工业绩目标表-修改记录 """ per_page = request.GET.get('per_page', 10) page_number = request.GET.get('page', 1) queryset = EmployeeTargetAudit.objects.all().order_by('-modification_date') paginator = Paginator(queryset, per_page) try: page_obj = paginator.page(page_number) except EmptyPage: page_obj = paginator.page(paginator.num_pages) except PageNotAnInteger: page_obj = paginator.page(1) serializer = EmployeeTargetAuditSerializer(page_obj, many=True) response_data = { 'modal_title': '修改记录', 'columns': ['修改对象', '修改字段', '旧值', '新值', '修改时间', '修改人'], 'records': serializer.data, 'page': page_obj.number, 'num_pages': paginator.num_pages, 'has_previous': page_obj.has_previous(), 'has_next': page_obj.has_next(), 'start_index': page_obj.start_index(), 'end_index': page_obj.end_index(), 'total_items': paginator.count } return Response(response_data)