XH_Digital_Management/application/perf_mgnt/views.py

437 lines
17 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)