2024-06-14 16:47:56 +08:00
|
|
|
|
import json
|
|
|
|
|
from datetime import datetime
|
2024-06-12 16:40:51 +08:00
|
|
|
|
|
2024-06-14 16:47:43 +08:00
|
|
|
|
from django.contrib.auth.decorators import login_required
|
2024-06-12 16:40:51 +08:00
|
|
|
|
from django.core.paginator import Paginator
|
2024-06-09 21:23:41 +08:00
|
|
|
|
from django.http import JsonResponse, Http404
|
2024-06-14 16:47:43 +08:00
|
|
|
|
from django.shortcuts import render
|
2024-06-06 18:02:55 +08:00
|
|
|
|
from django.template.loader import render_to_string
|
2024-06-04 16:50:30 +08:00
|
|
|
|
from django.urls import reverse
|
2024-06-14 16:47:56 +08:00
|
|
|
|
from django.views.decorators.csrf import csrf_protect
|
2024-05-15 09:23:16 +08:00
|
|
|
|
|
2024-06-07 03:47:15 +08:00
|
|
|
|
from application.hrm_mgnt.forms import *
|
2024-05-31 20:17:40 +08:00
|
|
|
|
from application.hrm_mgnt.models import *
|
2024-06-16 15:24:35 +08:00
|
|
|
|
from application.org_mgnt.models import SecondaryDepartment
|
2024-06-14 16:47:43 +08:00
|
|
|
|
from common.auth import custom_permission_required
|
2024-05-31 20:17:40 +08:00
|
|
|
|
from common.utils.page_helper import paginate_query_and_assign_numbers
|
2024-05-27 23:39:32 +08:00
|
|
|
|
|
2024-06-14 16:47:56 +08:00
|
|
|
|
from django.http import JsonResponse
|
|
|
|
|
from django.core.files.storage import default_storage
|
|
|
|
|
from django.conf import settings
|
|
|
|
|
from openpyxl import load_workbook
|
|
|
|
|
from django.apps import apps
|
|
|
|
|
from rest_framework.serializers import ModelSerializer
|
|
|
|
|
from django.core.exceptions import ValidationError
|
|
|
|
|
import os
|
|
|
|
|
|
2024-05-27 23:39:32 +08:00
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_employeeinformation')
|
2024-06-04 16:50:30 +08:00
|
|
|
|
def emp_list_view(request):
|
|
|
|
|
# 声明查询集
|
|
|
|
|
query_set = EmployeeInformation.objects.filter().order_by('-employee_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
name = request.GET.get('name', '')
|
|
|
|
|
department = request.GET.get('department', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
2024-06-06 14:18:42 +08:00
|
|
|
|
if name:
|
|
|
|
|
query_set = query_set.filter(name__icontains=name)
|
|
|
|
|
if department:
|
2024-06-06 21:27:24 +08:00
|
|
|
|
query_set = query_set.filter(primary_department=department)
|
2024-06-04 16:50:30 +08:00
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页,每页10条记录
|
|
|
|
|
items = paginate_query_and_assign_numbers(
|
|
|
|
|
request=request,
|
|
|
|
|
queryset=query_set,
|
|
|
|
|
per_page=10
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构建上下文查询参数字符串
|
|
|
|
|
query_params = '&name={}'.format(name) + '&department={}'.format(department)
|
|
|
|
|
|
2024-06-06 14:18:42 +08:00
|
|
|
|
# Excel上传模板
|
|
|
|
|
template_name = "人力资源管理-人员基本信息-Excel上传模板.xlsx"
|
2024-06-04 16:50:30 +08:00
|
|
|
|
|
|
|
|
|
# 构建上下文
|
|
|
|
|
context = {
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 模型设置
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"model_config": "hrm_mgnt.EmployeeInformation",
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 分页数据
|
2024-06-04 16:50:30 +08:00
|
|
|
|
"items": items,
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 面包屑
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"breadcrumb_list": [
|
|
|
|
|
{"title": "首页", "name": "index"},
|
|
|
|
|
{"title": "人力资源管理", "name": "index"},
|
|
|
|
|
{"title": "人员基本信息表", "name": "emt_list"}
|
|
|
|
|
],
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 筛选表单选项
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"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": "星海"}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# Excel上传解析
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"excel_upload_config": {
|
2024-06-17 19:38:02 +08:00
|
|
|
|
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"parse_url": reverse("common_excel_parse"),
|
|
|
|
|
"save_url": reverse("save_excel_table_data"),
|
|
|
|
|
"fields_preview_config": {
|
|
|
|
|
"name": {"type": "text", "width": "180px"},
|
|
|
|
|
"id_number": {"type": "text", "width": "220px"},
|
|
|
|
|
"gender": {"type": "text", "width": "100px"},
|
|
|
|
|
"birthday": {"type": "date", "width": "110px"},
|
|
|
|
|
"age": {"type": "text", "width": "80px"},
|
|
|
|
|
"height": {"type": "text", "width": "100px"},
|
|
|
|
|
"weight": {"type": "text", "width": "100px"},
|
|
|
|
|
"blood_type": {"type": "text", "width": "80px"},
|
|
|
|
|
"ethnicity": {"type": "text", "width": "180px"},
|
|
|
|
|
"domicile": {"type": "text", "width": "220px"},
|
|
|
|
|
"marital_status": {"type": "text", "width": "120px"},
|
|
|
|
|
"political_affiliation": {"type": "text", "width": "120px"},
|
|
|
|
|
"entry_date": {"type": "date", "width": "110px"},
|
|
|
|
|
"regularization_date": {"type": "date", "width": "110px"},
|
|
|
|
|
"employment_type": {"type": "text", "width": "100px"},
|
|
|
|
|
"status": {"type": "text", "width": "80px"},
|
|
|
|
|
"primary_department": {"type": "text", "width": "180px"},
|
|
|
|
|
"secondary_department": {"type": "text", "width": "180px"},
|
|
|
|
|
"position": {"type": "text", "width": "180px"},
|
2024-06-17 00:31:49 +08:00
|
|
|
|
"rank": {"type": "text", "width": "180px"},
|
|
|
|
|
"contract_end_date": {"type": "text", "width": "180px"},
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"mobile_number": {"type": "text", "width": "150px"},
|
|
|
|
|
"email": {"type": "text", "width": "200px"},
|
|
|
|
|
"mailing_address": {"type": "text", "width": "280px"},
|
|
|
|
|
"emergency_contact": {"type": "text", "width": "150px"},
|
|
|
|
|
"relation_with_contact": {"type": "text", "width": "150px"},
|
|
|
|
|
"emergency_contact_phone": {"type": "text", "width": "150px"},
|
|
|
|
|
"education": {"type": "text", "width": "100px"},
|
|
|
|
|
"undergraduate_school": {"type": "text", "width": "220px"},
|
|
|
|
|
"graduate_school": {"type": "text", "width": "220px"},
|
|
|
|
|
"major": {"type": "text", "width": "220px"},
|
|
|
|
|
"technical_title": {"type": "text", "width": "180px"},
|
|
|
|
|
"base_salary": {"type": "text", "width": "120px"},
|
|
|
|
|
"salary_account_number": {"type": "text", "width": "220px"},
|
|
|
|
|
"bank_of_salary_account": {"type": "text", "width": "220px"},
|
|
|
|
|
}
|
|
|
|
|
},
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 上下文查询参数
|
2024-06-04 16:50:30 +08:00
|
|
|
|
"query_params": query_params,
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 表格显示排除配置
|
|
|
|
|
"table_exclude_field_name": ['employee_id'],
|
|
|
|
|
# 筛选表单提交链接
|
2024-06-06 14:18:42 +08:00
|
|
|
|
"form_action_url": "emp_list",
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 修改对象提交链接
|
2024-06-04 16:50:30 +08:00
|
|
|
|
"modify_url": reverse("emp_list_modify"),
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 新增对象提交链接
|
2024-06-04 16:50:30 +08:00
|
|
|
|
"add_url": reverse("emp_list_add"),
|
2024-06-06 18:02:55 +08:00
|
|
|
|
# 删除对象提交链接
|
2024-06-04 16:50:30 +08:00
|
|
|
|
"delete_url": reverse("emp_list_delete"),
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
return render(request, 'emp_list.html', context)
|
2024-06-04 16:50:30 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.add_employeeinformation')
|
2024-06-04 16:50:30 +08:00
|
|
|
|
def emp_list_add(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-12 16:40:51 +08:00
|
|
|
|
form = EmployeeInformationAddForm(request.POST)
|
2024-06-06 18:02:55 +08:00
|
|
|
|
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':
|
2024-06-12 16:40:51 +08:00
|
|
|
|
form = EmployeeInformationAddForm()
|
2024-06-06 18:02:55 +08:00
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-04 16:50:30 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.change_employeeinformation')
|
2024-06-04 16:50:30 +08:00
|
|
|
|
def emp_list_modify(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-12 16:40:51 +08:00
|
|
|
|
current_base_salary = None
|
|
|
|
|
|
2024-06-06 18:02:55 +08:00
|
|
|
|
if 'id' in request.POST:
|
2024-06-06 21:27:24 +08:00
|
|
|
|
instance = EmployeeInformation.objects.get(employee_id=request.POST['id'])
|
2024-06-12 16:40:51 +08:00
|
|
|
|
current_base_salary = instance.base_salary # 获取当前基本工资
|
2024-06-06 18:02:55 +08:00
|
|
|
|
form = EmployeeInformationForm(request.POST, instance=instance)
|
|
|
|
|
else:
|
2024-06-12 16:40:51 +08:00
|
|
|
|
form = EmployeeInformationEditForm(request.POST)
|
2024-06-06 18:02:55 +08:00
|
|
|
|
|
|
|
|
|
if form.is_valid():
|
2024-06-12 16:40:51 +08:00
|
|
|
|
employee = form.save()
|
|
|
|
|
new_base_salary = form.cleaned_data.get('base_salary')
|
|
|
|
|
|
|
|
|
|
# 判断基本工资是否有变化
|
|
|
|
|
if 'id' in request.POST and current_base_salary != new_base_salary:
|
|
|
|
|
SalaryChangeRecord.objects.create(
|
|
|
|
|
employee=employee,
|
2024-06-13 13:43:51 +08:00
|
|
|
|
change_date=datetime.datetime.now(),
|
2024-06-12 16:40:51 +08:00
|
|
|
|
previous_value=current_base_salary if current_base_salary else 0,
|
|
|
|
|
new_value=new_base_salary,
|
|
|
|
|
approved_by=request.user.username
|
|
|
|
|
)
|
|
|
|
|
|
2024-06-06 18:02:55 +08:00
|
|
|
|
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 = EmployeeInformation.objects.get(employee_id=request.GET['id'])
|
2024-06-12 16:40:51 +08:00
|
|
|
|
form = EmployeeInformationEditForm(instance=instance)
|
2024-06-16 15:24:35 +08:00
|
|
|
|
form.fields['secondary_department'].queryset = SecondaryDepartment.objects.filter(primary_department=instance.primary_department).order_by('secondary_department_name')
|
2024-06-06 18:02:55 +08:00
|
|
|
|
except EmployeeInformation.DoesNotExist:
|
|
|
|
|
raise Http404("对象不存在")
|
|
|
|
|
else:
|
2024-06-12 16:40:51 +08:00
|
|
|
|
form = EmployeeInformationEditForm()
|
2024-06-06 18:02:55 +08:00
|
|
|
|
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-04 16:50:30 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.delete_employeeinformation')
|
2024-06-04 16:50:30 +08:00
|
|
|
|
def emp_list_delete(request):
|
|
|
|
|
if request.method == 'GET':
|
2024-06-17 10:33:08 +08:00
|
|
|
|
employee_id = request.GET.get('id')
|
2024-06-04 16:50:30 +08:00
|
|
|
|
EmployeeInformation.objects.filter(employee_id=employee_id).delete()
|
|
|
|
|
return JsonResponse({"message": "删除成功"})
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 14:18:42 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_salarychangerecord')
|
2024-06-12 16:40:51 +08:00
|
|
|
|
def get_salary_change_records(request, employee_id):
|
|
|
|
|
records = SalaryChangeRecord.objects.filter(employee_id=employee_id).values(
|
|
|
|
|
'change_date', 'previous_value', 'new_value', 'approved_by')
|
|
|
|
|
return JsonResponse(list(records), safe=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_employeeattendancerecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def attd_rec_list_view(request):
|
|
|
|
|
# 声明查询集
|
|
|
|
|
query_set = EmployeeAttendanceRecord.objects.filter().order_by('-record_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
employee = request.GET.get('employee', '')
|
|
|
|
|
year_month = request.GET.get('year_month', '')
|
|
|
|
|
primary_department = request.GET.get('primary_department', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
|
|
|
|
if employee:
|
|
|
|
|
query_set = query_set.filter(employee__name__icontains=employee)
|
|
|
|
|
if year_month:
|
|
|
|
|
query_set = query_set.filter(year_month__icontains=year_month)
|
|
|
|
|
if primary_department:
|
|
|
|
|
query_set = query_set.filter(employee__primary_department__icontains=primary_department)
|
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页,每页10条记录
|
|
|
|
|
items = paginate_query_and_assign_numbers(
|
|
|
|
|
request=request,
|
|
|
|
|
queryset=query_set,
|
|
|
|
|
per_page=10
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构建上下文查询参数字符串
|
|
|
|
|
query_params = '&employee={}'.format(employee) + '&year_month={}'.format(
|
|
|
|
|
year_month) + '&primary_department={}'.format(primary_department)
|
|
|
|
|
|
2024-06-06 20:56:06 +08:00
|
|
|
|
# Excel上传模板
|
2024-06-14 16:47:56 +08:00
|
|
|
|
template_name = "人力资源管理-员工考勤记录-Excel上传模板.xlsx"
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
# 构建上下文
|
|
|
|
|
context = {
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"model_config": 'hrm_mgnt.EmployeeAttendanceRecord',
|
2024-06-06 15:33:22 +08:00
|
|
|
|
"items": items,
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"breadcrumb_list": [
|
|
|
|
|
{"title": "首页", "name": "index"},
|
|
|
|
|
{"title": "人力资源管理", "name": "index"},
|
|
|
|
|
{"title": "员工考勤记录表", "name": "attd_rec_list"}
|
|
|
|
|
],
|
2024-06-06 15:33:22 +08:00
|
|
|
|
"filters": [
|
|
|
|
|
{"type": "text", "id": "employee", "name": "employee", "label": "员工", "placeholder": "请输入员工姓名"},
|
|
|
|
|
{"type": "month", "id": "year_month", "name": "year_month", "label": "年月"},
|
|
|
|
|
{"type": "select", "id": "primary_department", "name": "primary_department", "label": "一级部门",
|
|
|
|
|
"options": [{"value": "天信", "display": "天信"}, {"value": "混改", "display": "混改"},
|
|
|
|
|
{"value": "艾力芬特", "display": "艾力芬特"}, {"value": "星河", "display": "星河"},
|
|
|
|
|
{"value": "星海", "display": "星海"}]}
|
|
|
|
|
],
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"excel_upload_config": {
|
2024-06-17 19:38:02 +08:00
|
|
|
|
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
|
2024-06-17 10:23:24 +08:00
|
|
|
|
"parse_url": reverse("common_excel_parse"),
|
|
|
|
|
"save_url": reverse("save_excel_table_data"),
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"fields_preview_config": {
|
2024-06-14 16:47:56 +08:00
|
|
|
|
"employee": {"type": "text", "width": "180px"},
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"year_month": {"type": "date", "width": "110px"},
|
|
|
|
|
"late": {"type": "number", "width": "80px"},
|
|
|
|
|
"early_leave": {"type": "number", "width": "80px"},
|
|
|
|
|
"absenteeism": {"type": "number", "width": "80px"},
|
|
|
|
|
"annual_leave": {"type": "number", "width": "80px"},
|
|
|
|
|
"personal_leave": {"type": "number", "width": "80px"},
|
|
|
|
|
"sick_leave": {"type": "number", "width": "80px"},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"query_params": query_params,
|
|
|
|
|
"form_action_url": 'attd_rec_list',
|
|
|
|
|
"modify_url": reverse("attd_rec_list_modify"),
|
|
|
|
|
"add_url": reverse("attd_rec_list_add"),
|
|
|
|
|
"delete_url": reverse("attd_rec_list_delete"),
|
2024-06-14 16:47:56 +08:00
|
|
|
|
"table_exclude_field_name": ['record_id'],
|
2024-06-06 15:33:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
return render(request, 'attd_list.html', context)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.add_employeeattendancerecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def attd_rec_list_add(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
form = EmployeeAttendanceRecordForm(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 = EmployeeAttendanceRecordForm()
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.change_employeeattendancerecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def attd_rec_list_modify(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
if 'id' in request.POST:
|
|
|
|
|
instance = EmployeeAttendanceRecord.objects.get(record_id=request.POST['id'])
|
|
|
|
|
form = EmployeeAttendanceRecordForm(request.POST, instance=instance)
|
|
|
|
|
else:
|
|
|
|
|
form = EmployeeAttendanceRecordForm(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 = EmployeeAttendanceRecord.objects.get(record_id=request.GET['id'])
|
|
|
|
|
form = EmployeeAttendanceRecordForm(instance=instance)
|
|
|
|
|
except EmployeeAttendanceRecord.DoesNotExist:
|
|
|
|
|
raise Http404("对象不存在")
|
|
|
|
|
else:
|
|
|
|
|
form = EmployeeAttendanceRecordForm()
|
|
|
|
|
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.delete_employeeattendancerecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def attd_rec_list_delete(request):
|
|
|
|
|
if request.method == 'GET':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
record_id = request.GET.get('record_id')
|
|
|
|
|
EmployeeAttendanceRecord.objects.filter(record_id=record_id).delete()
|
2024-06-06 15:33:22 +08:00
|
|
|
|
return JsonResponse({"message": "删除成功"})
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_otherleavedetails')
|
2024-06-12 16:40:51 +08:00
|
|
|
|
def get_other_leave_details(request, attendance_record_id):
|
|
|
|
|
records = OtherLeaveDetails.objects.filter(attendance_record_id=attendance_record_id).values(
|
|
|
|
|
'leave_type', 'days', 'description')
|
|
|
|
|
return JsonResponse(list(records), safe=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_annualleaverecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def alv_list_view(request):
|
|
|
|
|
# 声明查询集
|
|
|
|
|
query_set = AnnualLeaveRecord.objects.filter().order_by('-record_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
employee_name = request.GET.get('employee_name', '')
|
|
|
|
|
year = request.GET.get('year', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
|
|
|
|
if employee_name:
|
|
|
|
|
query_set = query_set.filter(employee_name__icontains=employee_name)
|
|
|
|
|
if year:
|
|
|
|
|
query_set = query_set.filter(year__icontains=year)
|
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页,每页10条记录
|
|
|
|
|
items = paginate_query_and_assign_numbers(
|
|
|
|
|
request=request,
|
|
|
|
|
queryset=query_set,
|
|
|
|
|
per_page=10
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构建上下文查询参数字符串
|
|
|
|
|
query_params = '&employee_name={}'.format(employee_name) + '&year={}'.format(year)
|
|
|
|
|
|
2024-06-06 20:56:06 +08:00
|
|
|
|
# Excel上传模板
|
|
|
|
|
template_name = "人力资源管理-年假使用记录-Excel上传模板.xlsx"
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
# 构建上下文
|
|
|
|
|
context = {
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"model_config": 'hrm_mgnt.AnnualLeaveRecord',
|
2024-06-06 15:33:22 +08:00
|
|
|
|
"items": items,
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"breadcrumb_list": [
|
|
|
|
|
{"title": "首页", "name": "index"},
|
|
|
|
|
{"title": "人力资源管理", "name": "index"},
|
|
|
|
|
{"title": "年假使用记录", "name": "alv_list"}
|
|
|
|
|
],
|
2024-06-06 15:33:22 +08:00
|
|
|
|
"filters": [
|
|
|
|
|
{"type": "text", "id": "employee_name", "name": "employee_name", "label": "姓名",
|
|
|
|
|
"placeholder": "请输入姓名"},
|
|
|
|
|
{"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"}]}
|
|
|
|
|
],
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"excel_upload_config": {
|
2024-06-17 19:38:02 +08:00
|
|
|
|
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"parse_url": reverse("common_excel_parse"),
|
|
|
|
|
"save_url": reverse("save_excel_table_data"),
|
|
|
|
|
"fields_preview_config": {
|
|
|
|
|
"year": {"type": "text", "width": "80px"},
|
|
|
|
|
"employee_name": {"type": "text", "width": "180px"},
|
|
|
|
|
"primary_department": {"type": "text", "width": "180px"},
|
|
|
|
|
"total_annual_leave": {"type": "number", "width": "80px"},
|
|
|
|
|
"used_annual_leave": {"type": "number", "width": "80px"},
|
2024-06-14 16:47:56 +08:00
|
|
|
|
"remaining_annual_leave": {"type": "number", "width": "80px"}
|
2024-06-06 20:56:06 +08:00
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"query_params": query_params,
|
|
|
|
|
"form_action_url": 'alv_list',
|
|
|
|
|
"modify_url": reverse("alv_list_modify"),
|
|
|
|
|
"add_url": reverse("alv_list_add"),
|
|
|
|
|
"delete_url": reverse("alv_list_delete"),
|
2024-06-14 16:47:56 +08:00
|
|
|
|
"table_exclude_field_name": ['record_id'],
|
2024-06-16 23:36:08 +08:00
|
|
|
|
"add_button": True,
|
|
|
|
|
"import_excel_button": True
|
2024-06-06 15:33:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-07 03:47:15 +08:00
|
|
|
|
return render(request, 'items_list.html', context)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.add_annualleaverecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def alv_list_add(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
form = AnnualLeaveRecordForm(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 = AnnualLeaveRecordForm()
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.change_annualleaverecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def alv_list_modify(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
if 'id' in request.POST:
|
|
|
|
|
instance = AnnualLeaveRecord.objects.get(record_id=request.POST['id'])
|
|
|
|
|
form = AnnualLeaveRecordForm(request.POST, instance=instance)
|
|
|
|
|
else:
|
|
|
|
|
form = AnnualLeaveRecordForm(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 = AnnualLeaveRecord.objects.get(record_id=request.GET['id'])
|
|
|
|
|
form = AnnualLeaveRecordForm(instance=instance)
|
|
|
|
|
except AnnualLeaveRecord.DoesNotExist:
|
|
|
|
|
raise Http404("对象不存在")
|
|
|
|
|
else:
|
|
|
|
|
form = AnnualLeaveRecordForm()
|
|
|
|
|
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.delete_annualleaverecord')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def alv_list_delete(request):
|
|
|
|
|
if request.method == 'GET':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
record_id = request.GET.get('record_id')
|
|
|
|
|
AnnualLeaveRecord.objects.filter(record_id=record_id).delete()
|
2024-06-06 15:33:22 +08:00
|
|
|
|
return JsonResponse({"message": "删除成功"})
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_rank')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def rk_list_view(request):
|
|
|
|
|
# 声明查询集
|
|
|
|
|
query_set = Rank.objects.filter().order_by('-rank_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
rank_name = request.GET.get('rank_name', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
|
|
|
|
if rank_name:
|
|
|
|
|
query_set = query_set.filter(rank_name__icontains=rank_name)
|
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页,每页10条记录
|
|
|
|
|
items = paginate_query_and_assign_numbers(
|
|
|
|
|
request=request,
|
|
|
|
|
queryset=query_set,
|
|
|
|
|
per_page=10
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构建上下文查询参数字符串
|
|
|
|
|
query_params = '&rank_name={}'.format(rank_name)
|
|
|
|
|
|
2024-06-06 20:56:06 +08:00
|
|
|
|
# Excel上传模板
|
|
|
|
|
template_name = "人力资源管理-职级表-Excel上传模板.xlsx"
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
2024-06-06 20:56:06 +08:00
|
|
|
|
# 构建上下文
|
2024-06-06 15:33:22 +08:00
|
|
|
|
context = {
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"model_config": 'hrm_mgnt.Rank',
|
|
|
|
|
"items": items,
|
|
|
|
|
"breadcrumb_list": [
|
|
|
|
|
{"title": "首页", "name": "index"},
|
|
|
|
|
{"title": "人力资源管理", "name": "index"},
|
|
|
|
|
{"title": "职级表", "name": "rk_list"}
|
|
|
|
|
],
|
|
|
|
|
"filters": [{"type": "text", "id": "rank_name", "name": "rank_name", "label": "职级名称",
|
2024-06-06 15:33:22 +08:00
|
|
|
|
"placeholder": "请输入职级名称"}],
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"excel_upload_config": {
|
2024-06-17 19:38:02 +08:00
|
|
|
|
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"parse_url": reverse("common_excel_parse"),
|
|
|
|
|
"save_url": reverse("save_excel_table_data"),
|
|
|
|
|
"fields_preview_config": {
|
|
|
|
|
"rank_name": {"type": "text", "width": "180px"},
|
|
|
|
|
"rank_description": {"type": "text", "width": "220px"},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"query_params": query_params,
|
|
|
|
|
"form_action_url": 'rk_list',
|
|
|
|
|
"modify_url": reverse("rk_list_modify"),
|
|
|
|
|
"add_url": reverse("rk_list_add"),
|
|
|
|
|
"delete_url": reverse("rk_list_delete"),
|
2024-06-07 03:47:15 +08:00
|
|
|
|
"table_exclude_field_name": ['rank_id'],
|
2024-06-16 23:36:08 +08:00
|
|
|
|
"add_button": True,
|
|
|
|
|
"import_excel_button": True
|
2024-06-06 15:33:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-07 03:47:15 +08:00
|
|
|
|
return render(request, 'items_list.html', context)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.add_rank')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def rk_list_add(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
form = RankForm(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 = RankForm()
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.change_rank')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def rk_list_modify(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
if 'id' in request.POST:
|
|
|
|
|
instance = Rank.objects.get(rank_id=request.POST['id'])
|
|
|
|
|
form = RankForm(request.POST, instance=instance)
|
|
|
|
|
else:
|
|
|
|
|
form = RankForm(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 = Rank.objects.get(rank_id=request.GET['id'])
|
|
|
|
|
form = RankForm(instance=instance)
|
|
|
|
|
except Rank.DoesNotExist:
|
|
|
|
|
raise Http404("对象不存在")
|
|
|
|
|
else:
|
|
|
|
|
form = RankForm()
|
|
|
|
|
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.delete_rank')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def rk_list_delete(request):
|
|
|
|
|
if request.method == 'GET':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
rank_id = request.GET.get('rank_id')
|
|
|
|
|
Rank.objects.filter(rank_id=rank_id).delete()
|
2024-06-06 15:33:22 +08:00
|
|
|
|
return JsonResponse({"message": "删除成功"})
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.view_position')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def pst_list_view(request):
|
|
|
|
|
# 声明查询集
|
|
|
|
|
query_set = Position.objects.filter().order_by('-position_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
position_name = request.GET.get('position_name', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
|
|
|
|
if position_name:
|
|
|
|
|
query_set = query_set.filter(position_name__icontains=position_name)
|
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页,每页10条记录
|
|
|
|
|
items = paginate_query_and_assign_numbers(
|
|
|
|
|
request=request,
|
|
|
|
|
queryset=query_set,
|
|
|
|
|
per_page=10
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构建上下文查询参数字符串
|
|
|
|
|
query_params = '&position_name={}'.format(position_name)
|
|
|
|
|
|
2024-06-06 20:56:06 +08:00
|
|
|
|
# Excel上传模板
|
|
|
|
|
template_name = "人力资源管理-岗位表-Excel上传模板.xlsx"
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
2024-06-06 20:56:06 +08:00
|
|
|
|
# 构建上下文
|
2024-06-06 15:33:22 +08:00
|
|
|
|
context = {
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"model_config": 'hrm_mgnt.Position',
|
|
|
|
|
"items": items,
|
|
|
|
|
"breadcrumb_list": [
|
|
|
|
|
{"title": "首页", "name": "index"},
|
|
|
|
|
{"title": "人力资源管理", "name": "index"},
|
|
|
|
|
{"title": "岗位表", "name": "pst_list"}
|
|
|
|
|
],
|
|
|
|
|
"filters": [
|
|
|
|
|
{"type": "text", "id": "position_name", "name": "position_name", "label": "岗位名称",
|
|
|
|
|
"placeholder": "请输入岗位名称"}
|
|
|
|
|
],
|
|
|
|
|
"excel_upload_config": {
|
2024-06-17 19:38:02 +08:00
|
|
|
|
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
|
2024-06-06 20:56:06 +08:00
|
|
|
|
"parse_url": reverse("common_excel_parse"),
|
|
|
|
|
"save_url": reverse("save_excel_table_data"),
|
|
|
|
|
"fields_preview_config": {
|
|
|
|
|
"position_name": {"type": "text", "width": "180px"},
|
|
|
|
|
"position_description": {"type": "text", "width": "220px"},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"query_params": query_params,
|
|
|
|
|
"form_action_url": 'pst_list',
|
|
|
|
|
"modify_url": reverse("pst_list_modify"),
|
|
|
|
|
"add_url": reverse("pst_list_add"),
|
|
|
|
|
"delete_url": reverse("pst_list_delete"),
|
2024-06-07 03:47:15 +08:00
|
|
|
|
"table_exclude_field_name": ['position_id'],
|
2024-06-16 23:36:08 +08:00
|
|
|
|
"add_button": True,
|
|
|
|
|
"import_excel_button": True
|
2024-06-06 15:33:22 +08:00
|
|
|
|
}
|
|
|
|
|
|
2024-06-07 03:47:15 +08:00
|
|
|
|
return render(request, 'items_list.html', context)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.add_position')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def pst_list_add(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
form = PositionForm(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 = PositionForm()
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.change_position')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def pst_list_modify(request):
|
|
|
|
|
if request.method == 'POST':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
if 'id' in request.POST:
|
|
|
|
|
instance = Position.objects.get(position_id=request.POST['id'])
|
|
|
|
|
form = PositionForm(request.POST, instance=instance)
|
|
|
|
|
else:
|
|
|
|
|
form = PositionForm(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 = Position.objects.get(position_id=request.GET['id'])
|
|
|
|
|
form = PositionForm(instance=instance)
|
|
|
|
|
except Position.DoesNotExist:
|
|
|
|
|
raise Http404("对象不存在")
|
|
|
|
|
else:
|
|
|
|
|
form = PositionForm()
|
|
|
|
|
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-06 15:33:22 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
@custom_permission_required('hrm_mgnt.delete_position')
|
2024-06-06 15:33:22 +08:00
|
|
|
|
def pst_list_delete(request):
|
|
|
|
|
if request.method == 'GET':
|
2024-06-07 03:47:15 +08:00
|
|
|
|
position_id = request.GET.get('position_id')
|
|
|
|
|
Position.objects.filter(position_id=position_id).delete()
|
2024-06-06 15:33:22 +08:00
|
|
|
|
return JsonResponse({"message": "删除成功"})
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-09 21:23:41 +08:00
|
|
|
|
|
|
|
|
|
|
2024-06-12 16:40:51 +08:00
|
|
|
|
@login_required
|
2024-06-09 21:23:41 +08:00
|
|
|
|
def emp_list_for_create_account_profile(request):
|
|
|
|
|
# 查询还没有创建AccountProfile的员工信息
|
|
|
|
|
query_set = EmployeeInformation.objects.exclude(account_profile__isnull=False).order_by('-employee_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
name = request.GET.get('name', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
|
|
|
|
if name:
|
|
|
|
|
query_set = query_set.filter(name__icontains=name)
|
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页
|
|
|
|
|
paginator = Paginator(query_set, 10) # 每页显示10条记录
|
|
|
|
|
page_number = request.GET.get('page')
|
|
|
|
|
page_obj = paginator.get_page(page_number)
|
|
|
|
|
|
|
|
|
|
# 创建员工信息的列表,包含需要的字段
|
2024-06-16 17:58:47 +08:00
|
|
|
|
employees = [
|
|
|
|
|
{
|
|
|
|
|
'employee_id': emp.employee_id,
|
|
|
|
|
'name': emp.name,
|
|
|
|
|
'email': emp.email,
|
|
|
|
|
'mobile_number': emp.mobile_number,
|
|
|
|
|
'primary_department': emp.primary_department.department_name if emp.primary_department else '',
|
|
|
|
|
'position': emp.position.position_name if emp.position else ''
|
|
|
|
|
}
|
|
|
|
|
for emp in page_obj.object_list
|
|
|
|
|
]
|
2024-06-09 21:23:41 +08:00
|
|
|
|
|
|
|
|
|
# 返回JSON响应
|
|
|
|
|
return JsonResponse({
|
|
|
|
|
'success': True,
|
|
|
|
|
'employees': employees,
|
|
|
|
|
'has_previous': page_obj.has_previous(),
|
|
|
|
|
'has_next': page_obj.has_next(),
|
|
|
|
|
'num_pages': paginator.num_pages,
|
|
|
|
|
'current_page': page_obj.number
|
|
|
|
|
})
|
2024-06-13 00:12:17 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
# @custom_permission_required('hrm_mgnt.view_performanceevaluation')
|
2024-06-13 00:12:17 +08:00
|
|
|
|
def performance_list_view(request):
|
|
|
|
|
# 声明查询集
|
|
|
|
|
query_set = PerformanceEvaluation.objects.select_related('employee').order_by('-performance_id')
|
|
|
|
|
|
|
|
|
|
# 获取查询参数
|
|
|
|
|
name = request.GET.get('name', '')
|
|
|
|
|
department = request.GET.get('department', '')
|
|
|
|
|
|
|
|
|
|
# 根据提供的参数进行筛选
|
|
|
|
|
if name:
|
|
|
|
|
query_set = query_set.filter(employee__name__icontains=name)
|
|
|
|
|
if department:
|
|
|
|
|
query_set = query_set.filter(employee__primary_department=department)
|
|
|
|
|
|
|
|
|
|
# 对查询结果进行分页,每页10条记录
|
|
|
|
|
items = paginate_query_and_assign_numbers(
|
|
|
|
|
request=request,
|
|
|
|
|
queryset=query_set,
|
|
|
|
|
per_page=10
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# 构建上下文查询参数字符串
|
|
|
|
|
query_params = '&name={}'.format(name) + '&department={}'.format(department)
|
|
|
|
|
|
2024-06-14 16:47:56 +08:00
|
|
|
|
# Excel上传模板
|
|
|
|
|
template_name = "人力资源管理-员工绩效-Excel上传模板.xlsx"
|
|
|
|
|
|
2024-06-13 00:12:17 +08:00
|
|
|
|
# 构建上下文
|
|
|
|
|
context = {
|
|
|
|
|
"model_config": "hrm_mgnt.PerformanceEvaluation",
|
|
|
|
|
"items": items,
|
|
|
|
|
"breadcrumb_list": [
|
|
|
|
|
{"title": "首页", "name": "index"},
|
|
|
|
|
{"title": "人力资源管理", "name": "index"},
|
|
|
|
|
{"title": "员工绩效表", "name": "performance_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": "星海"}
|
|
|
|
|
]
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
"table_exclude_field_name": ['performance_id'],
|
2024-06-14 16:47:56 +08:00
|
|
|
|
"excel_upload_config": {
|
2024-06-17 19:38:02 +08:00
|
|
|
|
"template_url": reverse("dl_excel_tpl", kwargs={'template_name': template_name}),
|
2024-06-17 10:23:24 +08:00
|
|
|
|
"parse_url": reverse("common_excel_parse"),
|
|
|
|
|
"save_url": reverse("save_excel_table_data"),
|
2024-06-14 16:47:56 +08:00
|
|
|
|
"fields_preview_config": {
|
|
|
|
|
"employee": {"type": "text", "width": "180px"},
|
|
|
|
|
"year": {"type": "text", "width": "180px"},
|
|
|
|
|
"performance_score": {"type": "number", "width": "180px"},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"query_params": query_params,
|
2024-06-13 00:12:17 +08:00
|
|
|
|
"form_action_url": "performance_list",
|
|
|
|
|
"modify_url": reverse("performance_modify"),
|
|
|
|
|
"add_url": reverse("performance_add"),
|
|
|
|
|
"delete_url": reverse("performance_delete"),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return render(request, 'performance_list.html', context)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
# @custom_permission_required('hrm_mgnt.add_performanceevaluation')
|
2024-06-13 00:12:17 +08:00
|
|
|
|
def performance_add(request):
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
form = PerformanceEvaluationAddForm(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 = PerformanceEvaluationAddForm()
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
# @custom_permission_required('hrm_mgnt.change_performanceevaluation')
|
2024-06-13 00:12:17 +08:00
|
|
|
|
def performance_modify(request):
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
if 'id' in request.POST:
|
|
|
|
|
instance = PerformanceEvaluation.objects.get(performance_id=request.POST['id'])
|
|
|
|
|
form = PerformanceEvaluationForm(request.POST, instance=instance)
|
|
|
|
|
else:
|
|
|
|
|
form = PerformanceEvaluationForm(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 = PerformanceEvaluation.objects.get(performance_id=request.GET['id'])
|
|
|
|
|
form = PerformanceEvaluationForm(instance=instance)
|
|
|
|
|
except PerformanceEvaluation.DoesNotExist:
|
|
|
|
|
raise Http404("对象不存在")
|
|
|
|
|
else:
|
|
|
|
|
form = PerformanceEvaluationForm()
|
|
|
|
|
|
|
|
|
|
form_html = render_to_string('form_partial.html', {'form': form}, request)
|
|
|
|
|
return JsonResponse({"form_html": form_html})
|
|
|
|
|
else:
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
2024-06-14 16:47:43 +08:00
|
|
|
|
# @custom_permission_required('hrm_mgnt.delete_performanceevaluation')
|
2024-06-13 00:12:17 +08:00
|
|
|
|
def performance_delete(request):
|
|
|
|
|
if request.method == 'GET':
|
|
|
|
|
performance_id = request.GET.get('performance_id')
|
|
|
|
|
PerformanceEvaluation.objects.filter(performance_id=performance_id).delete()
|
|
|
|
|
return JsonResponse({"message": "删除成功"})
|
|
|
|
|
return JsonResponse({"message": "无效的请求方法"}, status=405)
|
2024-06-14 16:47:56 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@csrf_protect
|
|
|
|
|
@login_required
|
|
|
|
|
def save_excel_table_data(request):
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
try:
|
|
|
|
|
data = json.loads(request.body)
|
|
|
|
|
model_config = data.get('model_config')
|
|
|
|
|
table_data = data.get('table_data')
|
|
|
|
|
|
|
|
|
|
if not model_config or not table_data:
|
|
|
|
|
return JsonResponse({'error': '缺少必要的参数'}, status=400)
|
|
|
|
|
|
|
|
|
|
# 分割 model_config 以获取 app_label 和 model_name
|
|
|
|
|
try:
|
|
|
|
|
app_label, model_name = model_config.split('.')
|
|
|
|
|
Model = apps.get_model(app_label, model_name)
|
|
|
|
|
except (ValueError, LookupError):
|
|
|
|
|
return JsonResponse({'error': '无效的 model_config'}, status=400)
|
|
|
|
|
|
|
|
|
|
# 获取模型中配置的不需要的字段
|
|
|
|
|
exclude_fields = getattr(Model, 'excluded_fields', [])
|
|
|
|
|
|
|
|
|
|
# 创建模型实例列表
|
|
|
|
|
instances = []
|
|
|
|
|
for row_data in table_data:
|
|
|
|
|
# 处理employee字段,假设模型中有employee字段并且table_data中包含员工姓名
|
|
|
|
|
employee_name = row_data.get('employee')
|
|
|
|
|
if employee_name:
|
|
|
|
|
try:
|
|
|
|
|
employee_instance = EmployeeInformation.objects.get(name=employee_name)
|
|
|
|
|
row_data['employee'] = employee_instance
|
|
|
|
|
except EmployeeInformation.DoesNotExist:
|
|
|
|
|
return JsonResponse({'error': f'找不到姓名为 {employee_name} 的员工信息。'}, status=400)
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
# 排除不需要的字段
|
|
|
|
|
instance_data = {key: value for key, value in row_data.items() if key not in exclude_fields}
|
|
|
|
|
instance = Model(**instance_data)
|
|
|
|
|
instance.full_clean() # 验证数据
|
|
|
|
|
instances.append(instance)
|
|
|
|
|
except ValidationError as e:
|
|
|
|
|
return JsonResponse({'error': f'数据校验错误: {e.message_dict}'}, status=400)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
return JsonResponse({'error': f'创建实例时出错: {str(e)}'}, status=500)
|
|
|
|
|
|
|
|
|
|
# 批量创建模型实例
|
|
|
|
|
try:
|
|
|
|
|
Model.objects.bulk_create(instances)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
return JsonResponse({'error': f'批量保存数据时出错: {str(e)}'}, status=500)
|
|
|
|
|
|
|
|
|
|
return JsonResponse({'message': '表格数据保存成功'}, status=200)
|
|
|
|
|
except json.JSONDecodeError:
|
|
|
|
|
return JsonResponse({'error': '无效的JSON格式'}, status=400)
|
|
|
|
|
except Exception as e:
|
|
|
|
|
return JsonResponse({'error': f'服务器内部错误: {str(e)}'}, status=500)
|
|
|
|
|
return JsonResponse({'error': '无效的请求方法'}, status=400)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|