feat: srm 增加论文台账接口

This commit is contained in:
TianyangZhang 2025-11-04 10:44:20 +08:00
parent b9f9527ff2
commit adf9b95038
5 changed files with 125 additions and 7 deletions

View File

@ -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,
},
),
]

View File

@ -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: 立项审批表"""

View File

@ -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:

View File

@ -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)),

View File

@ -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
@ -61,3 +61,34 @@ class PatentRecordViewSet(CustomModelViewSet):
queryset = queryset.filter(name__icontains=search)
patents = [{'id': patent.id, 'name': patent.name} for patent in queryset]
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)