From adf9b95038ca89d4b9916bf3549c48338d299cc3 Mon Sep 17 00:00:00 2001 From: TianyangZhang Date: Tue, 4 Nov 2025 10:44:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20srm=20=E5=A2=9E=E5=8A=A0=E8=AE=BA?= =?UTF-8?q?=E6=96=87=E5=8F=B0=E8=B4=A6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/srm/migrations/0003_paperrecord.py | 45 +++++++++++++++++++++++++ apps/srm/models.py | 34 +++++++++++++++++++ apps/srm/serializers.py | 13 +++++-- apps/srm/urls.py | 3 +- apps/srm/views.py | 37 ++++++++++++++++++-- 5 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 apps/srm/migrations/0003_paperrecord.py diff --git a/apps/srm/migrations/0003_paperrecord.py b/apps/srm/migrations/0003_paperrecord.py new file mode 100644 index 00000000..3e262bad --- /dev/null +++ b/apps/srm/migrations/0003_paperrecord.py @@ -0,0 +1,45 @@ +# Generated by Django 3.2.12 on 2025-11-04 02:43 + +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), + ('srm', '0002_patentrecord_pc_type'), + ] + + operations = [ + migrations.CreateModel( + name='PaperRecord', + 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='删除标记')), + ('paper_number', models.CharField(blank=True, max_length=50, null=True, verbose_name='论文编号(投稿后补登)')), + ('pa_type', models.CharField(choices=[('invention', '发明专利'), ('utility', '实用新型专利'), ('design', '外观设计专利')], default='invention', max_length=50, verbose_name='论文类型')), + ('organization', models.CharField(max_length=100, verbose_name='单位')), + ('author', models.CharField(max_length=100, verbose_name='作者')), + ('cor_author', models.CharField(max_length=100, verbose_name='通讯作者')), + ('affiliated_platforms', models.CharField(blank=True, max_length=255, verbose_name='归属平台')), + ('affiliated_projects', models.CharField(blank=True, max_length=255, verbose_name='归属项目')), + ('accept_date', models.DateField(blank=True, null=True, verbose_name='接受日期')), + ('public_date', models.DateField(blank=True, null=True, verbose_name='发表日期')), + ('pub_paid', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='版面费缴纳')), + ('status', models.CharField(choices=[('审稿中', '审稿中'), ('一修', '一修'), ('二修', '二修'), ('接收', '接收'), ('发表', '发表')], max_length=20, verbose_name='状态')), + ('award_info', models.TextField(blank=True, null=True, verbose_name='报奖情况')), + ('bonus_amount', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='奖金金额(元)')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperrecord_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('paper', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='paper_record', to='srm.papersecret', verbose_name='论文名称')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperrecord_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/srm/models.py b/apps/srm/models.py index 45ec807a..56223b78 100644 --- a/apps/srm/models.py +++ b/apps/srm/models.py @@ -81,6 +81,40 @@ class PatentRecord(CommonADModel): award_info = models.TextField(null=True, blank=True, verbose_name="报奖情况") bonus_amount = models.DecimalField(max_digits=10,decimal_places=2, null=True,blank=True,verbose_name="奖金金额(元)") +class PaperRecord(CommonADModel): + """TN: 专利台账登记""" + PAPER_TYPE_CHOICES = ( + ('invention', '发明专利'), + ('utility', '实用新型专利'), + ('design', '外观设计专利'), + ) + paper_number = models.CharField(max_length=50, null=True, blank=True, verbose_name="论文编号(投稿后补登)") + paper = models.ForeignKey('Papersecret', verbose_name="论文名称", on_delete=models.CASCADE, related_name='paper_record') + pa_type = models.CharField('论文类型', max_length=50, choices=PAPER_TYPE_CHOICES, default='invention') + organization = models.CharField(max_length=100, verbose_name="单位") + author = models.CharField(max_length=100, verbose_name="作者") + cor_author = models.CharField(max_length=100, verbose_name="通讯作者") + affiliated_platforms = models.CharField(max_length=255, blank=True, verbose_name="归属平台") + affiliated_projects = models.CharField(max_length=255, blank=True, verbose_name="归属项目") + accept_date = models.DateField(null=True, blank=True, verbose_name="接受日期") + public_date = models.DateField(null=True, blank=True, verbose_name="发表日期") + # validity_years = models.IntegerField(null=True, blank=True, verbose_name="有效年限(年)") + pub_paid = models.DecimalField(max_digits=10,decimal_places=2, null=True,blank=True,verbose_name="版面费缴纳") + + status = models.CharField( + max_length=20, + choices=[ + ("审稿中", "审稿中"), + ("一修", "一修"), + ("二修", "二修"), + ("接收", "接收"), + ("发表", "发表"), + ], + verbose_name="状态" + ) + award_info = models.TextField(null=True, blank=True, verbose_name="报奖情况") + bonus_amount = models.DecimalField(max_digits=10,decimal_places=2, null=True,blank=True,verbose_name="奖金金额(元)") + # class ProjectApproval(CommonBDModel): # """TN: 立项审批表""" diff --git a/apps/srm/serializers.py b/apps/srm/serializers.py index ccf45d1f..2312ce55 100644 --- a/apps/srm/serializers.py +++ b/apps/srm/serializers.py @@ -1,4 +1,4 @@ -from .models import (PatentInfo, Papersecret, PatentRecord) +from .models import (PatentInfo, Papersecret, PatentRecord, PaperRecord) from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from django.db import transaction @@ -30,12 +30,19 @@ class PatentRecordSerializer(CustomModelSerializer): create_by_name = serializers.CharField(source='create_by.name', read_only=True) belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) patent_name = serializers.CharField(source='patent.name', read_only=True, label="专利名称") - patent_type = serializers.CharField(source='patent.type', read_only=True, label="专利类型") class Meta: model = PatentRecord fields = '__all__' read_only_fields = EXCLUDE_FIELDS - + +class PaperRecordSerializer(CustomModelSerializer): + create_by_name = serializers.CharField(source='create_by.name', read_only=True) + belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True) + paper_name = serializers.CharField(source='paper.paper_name', read_only=True, label="论文名称") + class Meta: + model = PaperRecord + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS # class PlatformSerializer(serializers.ModelSerializer): # class Meta: diff --git a/apps/srm/urls.py b/apps/srm/urls.py index 72f33124..5efb09c5 100644 --- a/apps/srm/urls.py +++ b/apps/srm/urls.py @@ -1,6 +1,6 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.srm.views import PatentInfoViewSet, PapersecretViewSet, PatentRecordViewSet +from apps.srm.views import PatentInfoViewSet, PapersecretViewSet, PatentRecordViewSet, PaperRecordViewSet API_BASE_URL = 'api/srm/' @@ -10,6 +10,7 @@ router = DefaultRouter() router.register('patentinfo', PatentInfoViewSet, basename='patentinfo') router.register('paperse', PapersecretViewSet, basename='PaperSe') router.register('patentrecord', PatentRecordViewSet, basename='patentrecord') +router.register('paperrecord', PaperRecordViewSet, basename='patentrecord') urlpatterns = [ path(API_BASE_URL, include(router.urls)), diff --git a/apps/srm/views.py b/apps/srm/views.py index e005fea5..7efc821b 100644 --- a/apps/srm/views.py +++ b/apps/srm/views.py @@ -3,8 +3,8 @@ from django.shortcuts import render # Create your views here. from django.shortcuts import render from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet -from .models import PatentInfo, Papersecret, PatentRecord -from .serializers import PatentInfoSerializer, PaperSeSerializer, PatentRecordSerializer +from .models import PatentInfo, Papersecret, PatentRecord, PaperRecord +from .serializers import PatentInfoSerializer, PaperSeSerializer, PatentRecordSerializer, PaperRecordSerializer from rest_framework.exceptions import ParseError from rest_framework.response import Response @@ -60,4 +60,35 @@ class PatentRecordViewSet(CustomModelViewSet): if search: queryset = queryset.filter(name__icontains=search) patents = [{'id': patent.id, 'name': patent.name} for patent in queryset] - return Response(patents) \ No newline at end of file + return Response(patents) + + +class PaperRecordViewSet(CustomModelViewSet): + """list: 论文台账登记 + + 论文台账登记 + """ + queryset = PaperRecord.objects.all() + serializer_class = PaperRecordSerializer + select_related_fields = ["paper"] + filterset_fields = ["paper_number", "paper","author"] + ordering = ["-create_time", "paper_number"] + search_fields = ["paper_number", "paper", "author"] + + def get_queryset(self): + qs = super().get_queryset() + paper_type = self.request.query_params.get('paper_type', None) + if paper_type: + qs = qs.filter(paper__paper_type=paper_type) + return qs + + + @action(detail=False, methods=['get']) + def paper_name(self, request): + """获取论文列表""" + search = request.query_params.get('search', '') + queryset = Papersecret.objects.all() + if search: + queryset = queryset.filter(paper_name__icontains=search) + papers = [{'id': paper.id, 'name': paper.name} for paper in queryset] + return Response(papers) \ No newline at end of file