diff --git a/hb_server/apps/em/migrations/0002_alter_equipment_model.py b/hb_server/apps/em/migrations/0002_alter_equipment_model.py new file mode 100644 index 0000000..f72f26f --- /dev/null +++ b/hb_server/apps/em/migrations/0002_alter_equipment_model.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.6 on 2021-08-16 01:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('em', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='equipment', + name='model', + field=models.CharField(blank=True, max_length=60, null=True, verbose_name='规格型号'), + ), + ] diff --git a/hb_server/apps/em/views.py b/hb_server/apps/em/views.py index ebf4943..912c5ee 100644 --- a/hb_server/apps/em/views.py +++ b/hb_server/apps/em/views.py @@ -3,11 +3,11 @@ from rest_framework.viewsets import ModelViewSet from apps.em.models import Equipment from apps.em.serializers import EquipmentSerializer -from apps.system.mixins import OptimizationMixin +from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin # Create your views here. -class EquipmentViewSet(ModelViewSet): +class EquipmentViewSet(CreateUpdateModelAMixin, OptimizationMixin, ModelViewSet): """ 设备台账-增删改查 """ diff --git a/hb_server/apps/hrm/apps.py b/hb_server/apps/hrm/apps.py index d948875..6ed9897 100644 --- a/hb_server/apps/hrm/apps.py +++ b/hb_server/apps/hrm/apps.py @@ -1,7 +1,7 @@ from django.apps import AppConfig class SystemConfig(AppConfig): - name = 'apps.sam' + name = 'apps.hrm' verbose_name = '人力资源管理' diff --git a/hb_server/apps/hrm/migrations/0001_initial.py b/hb_server/apps/hrm/migrations/0001_initial.py new file mode 100644 index 0000000..496c0e6 --- /dev/null +++ b/hb_server/apps/hrm/migrations/0001_initial.py @@ -0,0 +1,39 @@ +# Generated by Django 3.2.6 on 2021-08-13 09:16 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Employee', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('number', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='人员编号')), + ('photo', models.CharField(blank=True, max_length=1000, null=True, verbose_name='证件照')), + ('ID_number', models.CharField(blank=True, max_length=100, null=True, verbose_name='身份证号')), + ('gender', models.CharField(default='男', max_length=10, verbose_name='性别')), + ('signature', models.CharField(blank=True, max_length=200, null=True, verbose_name='签名图片')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='employee_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='employee_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='employee_user', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': '员工补充信息', + 'verbose_name_plural': '员工补充信息', + }, + ), + ] diff --git a/hb_server/apps/hrm/models.py b/hb_server/apps/hrm/models.py index e868cd6..adb8b44 100644 --- a/hb_server/apps/hrm/models.py +++ b/hb_server/apps/hrm/models.py @@ -9,23 +9,18 @@ from simple_history.models import HistoricalRecords -class Employee(BaseModel): +class Employee(CommonAModel): """ 员工信息 """ - job_choices = ( - ('在职', '在职'), - ('离职', '离职'), - ) - name = models.CharField('姓名', max_length=50) + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='employee_user') number = models.CharField('人员编号', max_length=50,null=True, blank=True, unique=True) - gender = models.CharField('性别', max_length=10,null=True, blank=True) - phone = models.CharField('手机号', max_length=11,null=True, blank=True, unique=True) - jobstate = models.CharField('在职状态', max_length=11,choices=job_choices, default='在职') - dept = models.ForeignKey(Organization, verbose_name='关联部门', on_delete=models.CASCADE, related_name='employee_dept') - description = models.CharField('描述', max_length=200, blank=True, null=True) + photo = models.CharField('证件照', max_length=1000, null=True, blank=True) + ID_number = models.CharField('身份证号', max_length=100, null=True, blank=True) + gender = models.CharField('性别', max_length=10, default='男') + signature = models.CharField('签名图片', max_length=200, null=True, blank=True) class Meta: - verbose_name = '客户信息' + verbose_name = '员工补充信息' verbose_name_plural = verbose_name def __str__(self): diff --git a/hb_server/apps/hrm/serializers.py b/hb_server/apps/hrm/serializers.py new file mode 100644 index 0000000..96ab4df --- /dev/null +++ b/hb_server/apps/hrm/serializers.py @@ -0,0 +1,22 @@ +from apps.system.models import User +from rest_framework.serializers import ModelSerializer + +from .models import Employee +from apps.system.serializers import UserListSerializer, UserSimpleSerializer +from django.db.models.query import Prefetch + +class EmployeeSerializer(ModelSerializer): + # user_ = UserListSerializer(source='user', read_only=True) + class Meta: + model = Employee + fields = '__all__' + # @staticmethod + # def setup_eager_loading(queryset): + # """ Perform necessary eager loading of data. """ + # queryset = queryset.select_related('user', 'user__dept') + # # queryset = queryset.prefetch_related('user','user__dept') + # queryset = queryset.prefetch_related( + # Prefetch('user_', + # queryset=User.objects.filter(employee_user__isnull=True)) + # ) + # return queryset diff --git a/hb_server/apps/hrm/urls.py b/hb_server/apps/hrm/urls.py new file mode 100644 index 0000000..bd532d0 --- /dev/null +++ b/hb_server/apps/hrm/urls.py @@ -0,0 +1,12 @@ +from django.db.models import base +from rest_framework import urlpatterns +from apps.hrm.views import EmployeeViewSet +from django.urls import path, include +from rest_framework.routers import DefaultRouter + +router = DefaultRouter() +router.register('employee', EmployeeViewSet, basename='employee') +urlpatterns = [ + path('', include(router.urls)), +] + diff --git a/hb_server/apps/hrm/views.py b/hb_server/apps/hrm/views.py index 91ea44a..843fa96 100644 --- a/hb_server/apps/hrm/views.py +++ b/hb_server/apps/hrm/views.py @@ -1,3 +1,15 @@ from django.shortcuts import render - +from rest_framework.viewsets import ModelViewSet, GenericViewSet +from rest_framework.mixins import UpdateModelMixin, RetrieveModelMixin +from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin +from apps.hrm.models import Employee +from apps.hrm.serializers import EmployeeSerializer # Create your views here. +class EmployeeViewSet(CreateUpdateModelAMixin, OptimizationMixin, UpdateModelMixin, RetrieveModelMixin, GenericViewSet): + """ + 员工详细信息 + """ + perms_map = {'get': '*', 'put': 'employee_update'} + queryset = Employee.objects.all() + serializer_class = EmployeeSerializer + ordering = ['-pk'] \ No newline at end of file diff --git a/hb_server/apps/pum/views.py b/hb_server/apps/pum/views.py index 30f504b..1258ca9 100644 --- a/hb_server/apps/pum/views.py +++ b/hb_server/apps/pum/views.py @@ -3,11 +3,11 @@ from rest_framework.viewsets import ModelViewSet from apps.pum.models import Vendor from apps.pum.serializers import VendorSerializer -from apps.system.mixins import OptimizationMixin +from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin # Create your views here. -class VendorViewSet(ModelViewSet): +class VendorViewSet(CreateUpdateModelAMixin, ModelViewSet): """ 供应商-增删改查 """ diff --git a/hb_server/apps/system/serializers.py b/hb_server/apps/system/serializers.py index ef5d03b..b3feb82 100644 --- a/hb_server/apps/system/serializers.py +++ b/hb_server/apps/system/serializers.py @@ -119,7 +119,14 @@ class UserSimpleSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['id', 'username', 'name'] - + +# class UserStandardSerializer(serializers.ModelSerializer): +# dept_name = serializers.StringRelatedField(source='dept') +# class Meta: +# model = User +# fields = ['id', 'username', 'name', 'is_active', 'dept_name', 'dept'] + + class UserListSerializer(serializers.ModelSerializer): """ 用户列表序列化 diff --git a/hb_server/requirements.txt b/hb_server/requirements.txt index e7459d6..595fea2 100644 --- a/hb_server/requirements.txt +++ b/hb_server/requirements.txt @@ -7,5 +7,6 @@ django-simple-history==3.0.0 djangorestframework==3.12.4 djangorestframework-simplejwt==4.7.2 drf-yasg==1.20.0 -psycopg2==2.9.1 psutil==5.8.0 +pillow==8.3.1 +opencv-python==4.5.3.56 diff --git a/hb_server/server/settings.py b/hb_server/server/settings.py index d32bcf9..20ca66c 100644 --- a/hb_server/server/settings.py +++ b/hb_server/server/settings.py @@ -49,6 +49,7 @@ INSTALLED_APPS = [ 'apps.monitor', 'apps.pum', 'apps.em', + 'apps.hrm' ] MIDDLEWARE = [ diff --git a/hb_server/server/urls.py b/hb_server/server/urls.py index 959076c..1ee8d0c 100644 --- a/hb_server/server/urls.py +++ b/hb_server/server/urls.py @@ -25,6 +25,7 @@ from rest_framework.documentation import include_docs_urls from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView) from django.views.generic import TemplateView +from utils.view import GenSignature router = routers.DefaultRouter() router.register('', FileViewSet, basename="file") @@ -58,6 +59,10 @@ urlpatterns = [ path('api/monitor/', include('apps.monitor.urls')), path('api/pum/', include('apps.pum.urls')), path('api/em/', include('apps.em.urls')), + path('api/hrm/', include('apps.hrm.urls')), + + # 工具 + path('api/utils/signature/', GenSignature.as_view()), # 前端页面入口 path('',TemplateView.as_view(template_name="index.html"))