This commit is contained in:
caoqianming 2025-10-31 11:09:23 +08:00
commit caf00a107a
10 changed files with 184 additions and 52 deletions

View File

@ -0,0 +1,18 @@
# Generated by Django 3.2.12 on 2025-10-28 08:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('enm', '0058_mpoint_save_expr'),
]
operations = [
migrations.AlterField(
model_name='mpoint',
name='cal_related_mgroup_running',
field=models.PositiveSmallIntegerField(blank=True, choices=[(10, '不涉及'), (20, '运行时统计')], default=10, null=True, verbose_name='与工段运行状态的关联'),
),
]

View File

@ -0,0 +1,41 @@
# Generated by Django 3.2.12 on 2025-10-29 03:13
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),
('wf', '0004_workflow_view_path2'),
('ofm', '0025_alter_patentinfo_area'),
]
operations = [
migrations.CreateModel(
name='PaperSe',
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_name', models.CharField(max_length=100, verbose_name='拟发表论文名称')),
('publication_name', models.CharField(max_length=100, verbose_name='拟投期刊名称')),
('author', models.CharField(max_length=100, verbose_name='作者')),
('paper_type', models.CharField(max_length=100, verbose_name='拟发表文章类型')),
('is_chinese_core', models.BooleanField(default=False, verbose_name='是否为中文核心')),
('is_sci', models.BooleanField(default=False, verbose_name='是否被SCI/EI收录')),
('tech_status', models.JSONField(blank=True, default=list, help_text='技术状态信息列表每个条目包含name(名称)、status(状态)、file(文件)字段', verbose_name='技术状态')),
('tech_file', models.JSONField(default=list, help_text='技术文件信息列表每个条目包含name(名称)page(页数)字段', verbose_name='技术文件')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('ticket', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_ticket', to='wf.ticket', verbose_name='关联工单')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
]

View File

@ -0,0 +1,44 @@
# Generated by Django 3.2.12 on 2025-10-29 06:26
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),
('wf', '0004_workflow_view_path2'),
('ofm', '0026_paperse'),
]
operations = [
migrations.CreateModel(
name='Papersecret',
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_name', models.CharField(max_length=100, verbose_name='拟发表论文名称')),
('publication_name', models.CharField(max_length=100, verbose_name='拟投期刊名称')),
('author', models.CharField(max_length=100, verbose_name='作者')),
('paper_type', models.CharField(max_length=100, verbose_name='拟发表文章类型')),
('is_chinese_core', models.BooleanField(default=False, verbose_name='是否为中文核心')),
('is_sci', models.BooleanField(default=False, verbose_name='是否被SCI/EI收录')),
('tech_status', models.JSONField(blank=True, default=list, help_text='技术状态信息列表每个条目包含name(名称)、status(状态)、file(文件)字段', verbose_name='技术状态')),
('tech_file', models.JSONField(default=list, help_text='技术文件信息列表每个条目包含name(名称)page(页数)字段', verbose_name='技术文件')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='papersecret_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('ticket', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='paperse_ticket', to='wf.ticket', verbose_name='关联工单')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='papersecret_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
],
options={
'abstract': False,
},
),
migrations.DeleteModel(
name='PaperSe',
),
]

View File

@ -0,0 +1,20 @@
# Generated by Django 3.2.12 on 2025-10-30 05:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('system', '0006_auto_20241213_1249'),
('ofm', '0027_auto_20251029_1426'),
]
operations = [
migrations.AddField(
model_name='papersecret',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='papersecret_belong_dept', to='system.dept', verbose_name='所属部门'),
),
]

View File

@ -182,39 +182,20 @@ class PatentInfo(CommonBDModel):
ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单',
on_delete=models.SET_NULL, related_name='patentInfo_ticket', null=True, blank=True, db_constraint=False) on_delete=models.SET_NULL, related_name='patentInfo_ticket', null=True, blank=True, db_constraint=False)
# class PaperOfm(CommonADModel): class Papersecret(CommonBDModel):
# """TN: 论文申密审批表单""" """TN: 论文申密审批表单"""
# PAPER_TYPE_CHOICES = ( paper_name = models.CharField('拟发表论文名称', max_length=100)
# ('research', '研究论文'), publication_name = models.CharField('拟投期刊名称', max_length=100)
# ('comprehensive', '综合'), author = models.CharField('作者', max_length=100)
# ) paper_type = models.CharField('拟发表文章类型', max_length=100)
# name = models.CharField('拟申请专利名称', max_length=100) is_chinese_core = models.BooleanField('是否为中文核心', default=False)
# author = models.CharField('发明人(设计人)', max_length=100) is_sci = models.BooleanField('是否被SCI/EI收录', default=False)
# paper_type = models.CharField('论文类型', max_length=50, choices=PAPER_TYPE_CHOICES, default='research') tech_status = models.JSONField('技术状态', default=list, blank=True, help_text='技术状态信息列表每个条目包含name(名称)、status(状态)、file(文件)字段')
# is_chinese_core = models.BooleanField('是否为中文核心', default=False) tech_file = models.JSONField('技术文件', default=list, help_text='技术文件信息列表每个条目包含name(名称)page(页数)字段')
# is_sci = models.BooleanField('是否被SCI/EI收录', default=False) ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单',
# has_appraisal = models.BooleanField('是否进行过科技成果鉴定', default=False) on_delete=models.SET_NULL, related_name='paperse_ticket', null=True, blank=True, db_constraint=False)
# has_published_article = models.BooleanField('是否发表过文章', default=False)
# has_exhibited = models.BooleanField('是否参与过展会展出', default=False)
# has_applied_in_production = models.BooleanField('是否参与应用于生产/销售', default=False)
# has_technical_exchange = models.BooleanField('是否参与过技术交流', default=False)
# paper_page_count = models.PositiveIntegerField('论文页数', null=True, blank=True)
# image_count = models.PositiveIntegerField('图/照片张数', null=True, blank=True)
# class Platform(CommonADModel):
# name = models.CharField(max_length=100)
# def __str__(self):
# return self.name
# class Project(CommonADModel):
# name = models.CharField(max_length=100)
# def __str__(self):
# return self.name
# class PatentRecord(CommonADModel): # class PatentRecord(CommonADModel):
# """TN: 专利台账登记""" # """TN: 专利台账登记"""
# volume_number = models.CharField(max_length=50, null=True, blank=True, verbose_name="卷号") # volume_number = models.CharField(max_length=50, null=True, blank=True, verbose_name="卷号")

View File

@ -1,4 +1,4 @@
from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo) from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo, Papersecret)
# Publicity, PatetInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) # Publicity, PatetInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
from apps.utils.serializers import CustomModelSerializer from apps.utils.serializers import CustomModelSerializer
from rest_framework import serializers from rest_framework import serializers
@ -132,11 +132,14 @@ class PatentInfoSerializer(CustomModelSerializer):
read_only_fields = EXCLUDE_FIELDS read_only_fields = EXCLUDE_FIELDS
# class PaperSerializer(CustomModelSerializer): class PaperSeSerializer(CustomModelSerializer):
# class Meta: create_by_name = serializers.CharField(source='create_by.name', read_only=True)
# model = PaperOfm belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
# fields = '__all__' ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
# read_only_fields = EXCLUDE_FIELDS class Meta:
model = Papersecret
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS
# class PlatformSerializer(serializers.ModelSerializer): # class PlatformSerializer(serializers.ModelSerializer):

View File

@ -1,7 +1,7 @@
from apps.wf.models import Ticket from apps.wf.models import Ticket
# TicketFlow, Transition, Workflow, CustomField, State, # TicketFlow, Transition, Workflow, CustomField, State,
from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord, Publicity, MroomBooking, MroomSlot, PatentInfo from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord, Publicity, MroomBooking, MroomSlot, PatentInfo, Papersecret
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
@ -164,4 +164,29 @@ def patent_save_ticket_data(ticket: Ticket, new_ticket_data: dict, **kwargs):
for k, v in data_save.items(): for k, v in data_save.items():
setattr(obj, k, v) setattr(obj, k, v)
obj.save() obj.save()
def paperse_patent(ticket: Ticket, transition, new_ticket_data: dict):
ins = Papersecret.objects.get(id=new_ticket_data['t_id'])
ticket_data = ticket.ticket_data
ticket_data.update({
't_model': 'paperse',
't_id': ins.id,
})
ticket.ticket_data = ticket_data
ticket.create_by = ins.create_by
ticket.save()
if ins.ticket is None:
ins.ticket = ticket
ins.save()
def paperse_save_ticket_data(ticket: Ticket, new_ticket_data: dict, **kwargs):
try:
obj = Papersecret.objects.get(id=new_ticket_data['t_id'])
except Papersecret.DoesNotExist:
raise ParseError("Publicity t_id 不存在")
data_save = {k: v for k, v in new_ticket_data.items() if k not in ['t_model', 't_id']}
for k, v in data_save.items():
setattr(obj, k, v)
obj.save()

View File

@ -1,7 +1,7 @@
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet, FilerecordViewSet, from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet, VehicleViewSet, FilerecordViewSet,
FileborrowViewSet, PublicityViewSet, PatentInfoViewSet) FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PapersecretViewSet)
# SealModelViewSet, # SealModelViewSet,
# , PublicityViewSet, , PaperViewSet, PlatformViewSet, # , PublicityViewSet, , PaperViewSet, PlatformViewSet,
# ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet) # ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet)
@ -20,7 +20,7 @@ router.register('filerecord', FilerecordViewSet, basename='filerecord')
router.register('fileborrow', FileborrowViewSet, basename='fileborrow') router.register('fileborrow', FileborrowViewSet, basename='fileborrow')
router.register('publicity', PublicityViewSet, basename='publicity') router.register('publicity', PublicityViewSet, basename='publicity')
router.register('patentinfo', PatentInfoViewSet, basename='patentinfo') router.register('patentinfo', PatentInfoViewSet, basename='patentinfo')
# router.register('paper', PaperViewSet, basename='paper') router.register('paperse', PapersecretViewSet, basename='PaperSe')
# router.register('platform', PlatformViewSet, basename='platform') # router.register('platform', PlatformViewSet, basename='platform')
# router.register('project', ProjectViewSet, basename='project') # router.register('project', ProjectViewSet, basename='project')
# router.register('patentrecord', PatentRecordViewSet, basename='patentrecord') # router.register('patentrecord', PatentRecordViewSet, basename='patentrecord')

View File

@ -1,9 +1,9 @@
from django.shortcuts import render from django.shortcuts import render
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo, Papersecret
# Publicity, , PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) # Publicity, , PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer,
VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, PatentInfoSerializer) VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, PatentInfoSerializer, PaperSeSerializer)
# ,SealSerializer, # ,SealSerializer,
# LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer,
# PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer) # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer)
@ -182,15 +182,15 @@ class PatentInfoViewSet(CustomModelViewSet):
ordering = ["-create_time", "name", "author", "type"] ordering = ["-create_time", "name", "author", "type"]
# class PaperViewSet(CustomModelViewSet): class PapersecretViewSet(CustomModelViewSet):
# """list: 论文申密审批 """list: 论文申密审批
# 论文申密审批 论文申密审批
# """ """
# queryset = PaperOfm.objects.all() queryset = Papersecret.objects.all()
# serializer_class = PaperSerializer serializer_class = PaperSeSerializer
# filterset_fields = ["name", "author"] filterset_fields = ["paper_name", "author"]
# ordering = ["create_time", "name"] ordering = ["create_time", "paper_name"]
# class PlatformViewSet(CustomModelViewSet): # class PlatformViewSet(CustomModelViewSet):

View File

@ -30,7 +30,7 @@ myLogger = logging.getLogger('log')
def check_wpr_number(number: str): def check_wpr_number(number: str):
return (len(number) >= 5 and return (len(number) >= 5 and
number[-4:].isdigit() and (number[-4:].isdigit() or number[-2] == "-" or number[-3] == "-") and
not any(char.islower() for char in number)) not any(char.islower() for char in number))
def generate_new_batch(old_batch: str, mlog: Mlog): def generate_new_batch(old_batch: str, mlog: Mlog):