From d2a503c482350281e37ef240e77db6e9a13ff24f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 26 Feb 2024 10:31:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0ecate=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/em/admin.py | 8 +++- apps/em/filters.py | 4 ++ apps/em/migrations/0013_auto_20240226_1018.py | 42 +++++++++++++++++++ apps/em/models.py | 35 +++++++++++----- apps/em/serializers.py | 18 ++++++-- apps/em/urls.py | 3 +- apps/em/views.py | 18 ++++++-- 7 files changed, 109 insertions(+), 19 deletions(-) create mode 100644 apps/em/migrations/0013_auto_20240226_1018.py diff --git a/apps/em/admin.py b/apps/em/admin.py index 8c38f3f3..78ef7551 100644 --- a/apps/em/admin.py +++ b/apps/em/admin.py @@ -1,3 +1,9 @@ from django.contrib import admin - +from apps.em.models import Ecate # Register your models here. + + +@admin.register(Ecate) +class EcateAdmin(admin.ModelAdmin): + list_display = ('id', 'name', 'code', 'type', + 'is_for_safe', 'is_for_enp', 'is_car') diff --git a/apps/em/filters.py b/apps/em/filters.py index 07c6fe57..c3fee8e4 100644 --- a/apps/em/filters.py +++ b/apps/em/filters.py @@ -19,6 +19,10 @@ class EquipFilterSet(filters.FilterSet): "mgroup": ["exact"], "mgroup__name": ["exact"], "name": ["exact", "contains"], + "cate__code": ['exact', 'in', 'contains'], + "cate__is_for_safe": ['exact'], + "cate__is_for_enp": ['exact'], + "cate__is_car": ['exact'] } def filter_tag(self, queryset, name, value): diff --git a/apps/em/migrations/0013_auto_20240226_1018.py b/apps/em/migrations/0013_auto_20240226_1018.py new file mode 100644 index 00000000..5fe74761 --- /dev/null +++ b/apps/em/migrations/0013_auto_20240226_1018.py @@ -0,0 +1,42 @@ +# Generated by Django 3.2.12 on 2024-02-26 02:18 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('em', '0012_auto_20240221_1755'), + ] + + operations = [ + migrations.CreateModel( + name='Ecate', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, 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='删除标记')), + ('name', models.CharField(max_length=50, unique=True, verbose_name='名称')), + ('code', models.CharField(blank=True, max_length=50, null=True, unique=True, verbose_name='编码')), + ('type', models.PositiveSmallIntegerField(choices=[(10, '生产设备'), (20, '计量设备'), (30, '治理设备'), (40, '监控设备')], help_text="((10, '生产设备'), (20, '计量设备'), (30, '治理设备'), (40, '监控设备'))", verbose_name='类型')), + ('is_for_safe', models.BooleanField(default=False, verbose_name='是否用于安全')), + ('is_for_enp', models.BooleanField(default=False, verbose_name='是否用于环保')), + ('is_car', models.BooleanField(default=False, verbose_name='是否为车辆')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ecate_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='ecate_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='equipment', + name='cate', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='cate', to='em.ecate', verbose_name='设备分类'), + ), + ] diff --git a/apps/em/models.py b/apps/em/models.py index 0feff46c..03a50416 100644 --- a/apps/em/models.py +++ b/apps/em/models.py @@ -1,6 +1,6 @@ from django.db import models -from apps.utils.models import CommonBModel, CommonADModel, CommonBDModel -from apps.system.models import User +from apps.utils.models import CommonBModel, CommonADModel +from apps.system.models import User, Dictionary from enum import Enum # Create your models here. @@ -14,6 +14,25 @@ class RuningState(Enum): UNKNOWN = 50 +etype_choices = ( + (10, '生产设备'), + (20, '计量设备'), + (30, '治理设备'), + (40, '监控设备'), +) + + +class Ecate(CommonADModel): + name = models.CharField('名称', max_length=50, unique=True) + code = models.CharField('编码', max_length=50, + unique=True, null=True, blank=True) + type = models.PositiveSmallIntegerField( + '类型', choices=etype_choices, help_text=str(etype_choices)) + is_for_safe = models.BooleanField('是否用于安全', default=False) + is_for_enp = models.BooleanField('是否用于环保', default=False) + is_car = models.BooleanField('是否为车辆', default=False) + + class Equipment(CommonBModel): """ 设备台账信息 @@ -33,12 +52,6 @@ class Equipment(CommonBModel): ) EQUIP_TYPE_PRO = 10 EQUIP_TYPE_MEA = 20 - type_choices = ( - (10, '生产设备'), - (20, '计量设备'), - (30, '治理设备'), - (40, '监控设备'), - ) # mgmtype_choices = ( # (1, 'A'), # (2, 'B'), @@ -53,8 +66,6 @@ class Equipment(CommonBModel): # (1, '专用'), # (2, '公用'), # ) - tags_list_10 = ['生产设备', '输送设备'] - tags_list_20 = ['雾炮', '干雾', '除尘器', '环卫车', '洗车台'] is_online = models.PositiveSmallIntegerField('是否在线', default=0) running_state = models.PositiveSmallIntegerField('运行状态', default=50) ip = models.GenericIPAddressField('IP地址', null=True, blank=True) @@ -64,7 +75,9 @@ class Equipment(CommonBModel): mgroup = models.ForeignKey( 'mtm.mgroup', on_delete=models.SET_NULL, null=True, blank=True) type = models.PositiveSmallIntegerField( - '类型', choices=type_choices, default=10) + '类型', choices=etype_choices, default=10) + cate = models.ForeignKey( + Ecate, verbose_name='设备分类', on_delete=models.SET_NULL, null=True, blank=True, related_name='cate') tags = models.JSONField('设备标签', default=list, null=True) name = models.CharField('设备名称', max_length=50) number_factory = models.CharField( diff --git a/apps/em/serializers.py b/apps/em/serializers.py index 467bdb86..c4bfe136 100644 --- a/apps/em/serializers.py +++ b/apps/em/serializers.py @@ -1,11 +1,18 @@ from apps.utils.serializers import CustomModelSerializer -from apps.em.models import Equipment, EcheckRecord, EInspect +from apps.em.models import Equipment, EcheckRecord, EInspect, Ecate from apps.system.models import Dept from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from rest_framework import serializers from rest_framework.exceptions import ValidationError +class EcateSerializer(CustomModelSerializer): + class Meta: + model = Ecate + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS_BASE + + class EquipmentSerializer(CustomModelSerializer): belong_dept = serializers.PrimaryKeyRelatedField( label='责任部门', queryset=Dept.objects.all()) @@ -19,6 +26,9 @@ class EquipmentSerializer(CustomModelSerializer): mgroup = attrs.get('mgroup', None) if mgroup: attrs['belong_dept'] = mgroup.belong_dept + cate = attrs.get('cate', None) + if cate: + attrs['type'] = cate.type return super().validate(attrs) def get_full_name(self, obj): @@ -32,7 +42,8 @@ class EquipmentSerializer(CustomModelSerializer): class EcheckRecordSerializer(CustomModelSerializer): - equipment_name = serializers.StringRelatedField(source='equipment', read_only=True) + equipment_name = serializers.StringRelatedField( + source='equipment', read_only=True) class Meta: model = EcheckRecord @@ -47,7 +58,8 @@ class EcheckRecordSerializer(CustomModelSerializer): class EInspectSerializer(CustomModelSerializer): - equipment_name = serializers.StringRelatedField(source='equipment', read_only=True) + equipment_name = serializers.StringRelatedField( + source='equipment', read_only=True) inspect_user_name = serializers.CharField( source='inspect_user.name', read_only=True) diff --git a/apps/em/urls.py b/apps/em/urls.py index 5055297e..e9600734 100644 --- a/apps/em/urls.py +++ b/apps/em/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.em.views import EquipmentViewSet, EcheckRecordViewSet, EInspectViewSet +from apps.em.views import EquipmentViewSet, EcheckRecordViewSet, EInspectViewSet, EcateViewSet API_BASE_URL = 'api/em/' HTML_BASE_URL = 'em/' @@ -9,6 +9,7 @@ router = DefaultRouter() router.register('equipment', EquipmentViewSet, basename='equipment') router.register('echeckrecord', EcheckRecordViewSet, basename='echeckrecord') router.register('einspect', EInspectViewSet, basename='einspect') +router.register('ecate', EcateViewSet, basename='ecate') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/em/views.py b/apps/em/views.py index e63ceb53..61da31f2 100644 --- a/apps/em/views.py +++ b/apps/em/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render -from apps.em.models import Equipment, EcheckRecord, EInspect +from apps.em.models import Equipment, EcheckRecord, EInspect, Ecate from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet -from apps.em.serializers import EquipmentSerializer, EcheckRecordSerializer, EInspectSerializer +from apps.em.serializers import EquipmentSerializer, EcheckRecordSerializer, EInspectSerializer, EcateSerializer from apps.em.filters import EquipFilterSet from rest_framework.exceptions import ParseError from rest_framework.mixins import ListModelMixin, CreateModelMixin, DestroyModelMixin @@ -16,6 +16,19 @@ from django.conf import settings # Create your views here. +class EcateViewSet(CustomModelViewSet): + queryset = Ecate.objects.all() + serializer_class = EcateSerializer + ordering = ['id', 'type', 'code', 'create_time'] + filterset_fields = { + "type": ['exact', 'in'], + "code": ['exact', 'in', 'contains'], + "is_for_safe": ['exact'], + "is_for_enp": ['exact'], + "is_car": ['exact'] + } + + class EquipmentViewSet(CustomModelViewSet): queryset = Equipment.objects.all() serializer_class = EquipmentSerializer @@ -39,7 +52,6 @@ class EquipmentViewSet(CustomModelViewSet): return Response() - class EcheckRecordViewSet(ListModelMixin, CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): """ list:校准/检定记录