Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# OS artifacts
.DS_Store
Thumbs.db

# IDE / editor folders
.idea/
.vscode/

# Python build artifacts
__pycache__/
*.py[cod]
*.pyo
*.pyd
*.so
*.egg
*.egg-info/
.Python
build/
dist/

# Django / local data
*.sqlite3
media/
staticfiles/
*.log
*/migrations/*.py
!*/migrations/__init__.py

# Virtual environments
env/
venv/
.venv/
src/backend/venv/

# Environment / secret files
*.env
.env.*
src/backend/item_manager/secure.json

# Node / frontend artifacts
node_modules/
src/fronted/node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
.pnpm-store/
dist/
src/fronted/dist/

# Coverage / test reports
.coverage
coverage.xml
htmlcov/

# Local tooling
.pytest_cache/
.mypy_cache/
.ruff_cache/
.sass-cache/

.gitignore
14 changes: 14 additions & 0 deletions src/backend/evaluation/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.contrib import admin

from .models import EvaluationRecord


@admin.register(EvaluationRecord)
class EvaluationRecordAdmin(admin.ModelAdmin):
list_display = [
'evaluation_date', 'department', 'personnel', 'item_description',
'bonus_score', 'deduction_score', 'total_score', 'created_at'
]
list_filter = ['department', 'evaluation_date', 'created_at']
search_fields = ['personnel__name', 'item_description', 'remarks']
ordering = ['-evaluation_date', '-created_at']
6 changes: 6 additions & 0 deletions src/backend/evaluation/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class EvaluationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'evaluation'
33 changes: 33 additions & 0 deletions src/backend/evaluation/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import django_filters
from finance.models import Department
from personnel.models import Personnel

from .models import EvaluationRecord


class EvaluationRecordFilter(django_filters.FilterSet):
department = django_filters.ModelChoiceFilter(
queryset=Department.objects.all(),
field_name='department',
label='部门'
)
personnel = django_filters.ModelChoiceFilter(
queryset=Personnel.objects.all(),
field_name='personnel',
label='人员'
)
date_from = django_filters.DateFilter(
field_name='evaluation_date',
lookup_expr='gte',
label='开始日期'
)
date_to = django_filters.DateFilter(
field_name='evaluation_date',
lookup_expr='lte',
label='结束日期'
)

class Meta:
model = EvaluationRecord
fields = ['department', 'personnel', 'evaluation_date']

42 changes: 42 additions & 0 deletions src/backend/evaluation/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
from django.db import models
from django.utils import timezone


class EvaluationRecord(models.Model):
"""考评记录"""
department = models.ForeignKey(
'finance.Department',
on_delete=models.CASCADE,
related_name='evaluation_records',
verbose_name='所属部门'
)
personnel = models.ForeignKey(
'personnel.Personnel',
on_delete=models.CASCADE,
related_name='evaluation_records',
verbose_name='人员'
)
item_description = models.CharField(max_length=255, verbose_name='加/扣分事项说明')
bonus_score = models.DecimalField(max_digits=8, decimal_places=2, default=0, verbose_name='加分数值')
deduction_score = models.DecimalField(max_digits=8, decimal_places=2, default=0, verbose_name='扣分数值')
remarks = models.CharField(max_length=255, blank=True, verbose_name='备注')
total_score = models.DecimalField(max_digits=8, decimal_places=2, default=0, verbose_name='总计分数')
evaluation_date = models.DateField(default=timezone.now, verbose_name='考评日期')
created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间')

class Meta:
verbose_name = '考评记录'
verbose_name_plural = verbose_name
ordering = ['-evaluation_date', '-created_at']
indexes = [
models.Index(fields=['department', 'evaluation_date']),
models.Index(fields=['personnel', 'evaluation_date']),
]

def __str__(self):
return f'{self.evaluation_date} {self.personnel.name} ({self.total_score})'

def save(self, *args, **kwargs):
self.total_score = (self.bonus_score or 0) - (self.deduction_score or 0)
super().save(*args, **kwargs)
18 changes: 18 additions & 0 deletions src/backend/evaluation/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from rest_framework import serializers

from .models import EvaluationRecord


class EvaluationRecordSerializer(serializers.ModelSerializer):
department_name = serializers.CharField(source='department.name', read_only=True)
personnel_name = serializers.CharField(source='personnel.name', read_only=True)

class Meta:
model = EvaluationRecord
fields = [
'id', 'department', 'department_name', 'personnel', 'personnel_name',
'item_description', 'bonus_score', 'deduction_score', 'remarks',
'total_score', 'evaluation_date', 'created_at', 'updated_at'
]
read_only_fields = ['total_score', 'created_at', 'updated_at']

3 changes: 3 additions & 0 deletions src/backend/evaluation/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
from django.test import TestCase

# Create your tests here.
12 changes: 12 additions & 0 deletions src/backend/evaluation/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter

from .views import EvaluationRecordViewSet

router = DefaultRouter()
router.register(r'evaluation-records', EvaluationRecordViewSet)

urlpatterns = [
path('api/', include(router.urls)),
]

Loading