From 5c163cdcbb5533ff1a1f4e951b2ca7faa0f78c15 Mon Sep 17 00:00:00 2001 From: zty Date: Tue, 2 Sep 2025 08:48:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E4=BF=AE=E6=94=B9=E8=83=BD?= =?UTF-8?q?=E7=AE=A1=E9=87=87=E9=9B=86=E7=9A=84=E7=82=B9=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/enm/tasks.py | 4 ++-- apps/enm/views.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/apps/enm/tasks.py b/apps/enm/tasks.py index 81de97a3..13d34021 100644 --- a/apps/enm/tasks.py +++ b/apps/enm/tasks.py @@ -86,10 +86,10 @@ def db_ins_mplogx(): if bill_date is None: raise Exception("bill_date is None") query = """ - SELECT id, de_real_quantity, CONCAT('x', inv_name) AS inv_name, bill_date + SELECT id, de_real_quantity, inv_code, bill_date FROM sa_weigh_view WHERE bill_date >= %s and de_real_quantity > 0 - AND inv_name IN %s + AND inv_code IN %s ORDER BY bill_date """ cursor.execute(query, (bill_date, tuple(batchs))) diff --git a/apps/enm/views.py b/apps/enm/views.py index 2411a9db..337ddebe 100644 --- a/apps/enm/views.py +++ b/apps/enm/views.py @@ -84,6 +84,34 @@ class MpointViewSet(CustomModelViewSet): king_sync(getattr(settings, "KING_PROJECTNAME", "")) return Response() + @action(methods=["post"], detail=False, perms_map={"post": "mpoint.create"}, serializer_class=Serializer) + def show_picture(self, request, *args, **kwargs): + import requests + import os + headers = { + "Content-Type": "application/json;charset=utf-8", + } + url = "http://localhost:8093/boxplot" + payload = { + "startTime1": request.data.get("startTime1"), + "endTime1": request.data.get("endTime1"), + "startTime2": request.data.get("startTime2"), + "endTime2": request.data.get("endTime2") + } + try: + response = requests.request("POST", url, json=payload, headers=headers) + except Exception as e: + myLogger.error(e) + pic_dir = os.path.join(settings.MEDIA_ROOT, "box_pic") + os.makedirs(pic_dir, exist_ok=True) + file_name= datetime.now().strftime('%Y%m%d_%H%M%S')+'.png' + pic_path = os.path.join(pic_dir, file_name) + with open(pic_path, 'wb') as f: + f.write(response.content) + rel_path = os.path.join('media/box_pic', file_name) + rel_path = rel_path.replace('\\', '/') + return Response({"rel_path": rel_path}) + class XscriptViewSet(CustomModelViewSet): """ From 6a6d46583b49e5cba9d8172c53f38021f6a79806 Mon Sep 17 00:00:00 2001 From: zty Date: Fri, 5 Sep 2025 11:10:15 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E8=A1=8C=E6=94=BF=E7=AE=A1?= =?UTF-8?q?=E7=90=86=20-=E5=8D=B0=E7=AB=A0=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/ichat/migrations/0001_initial.py | 48 ++++ apps/ofm/migrations/0002_lendingseal.py | 48 ++++ apps/ofm/models.py | 301 +++++++++++++++++++++++- apps/ofm/serializers.py | 127 +++++++++- apps/ofm/services.py | 30 +++ apps/ofm/urls.py | 20 +- apps/ofm/views.py | 179 +++++++++++++- 7 files changed, 744 insertions(+), 9 deletions(-) create mode 100644 apps/ichat/migrations/0001_initial.py create mode 100644 apps/ofm/migrations/0002_lendingseal.py create mode 100644 apps/ofm/services.py diff --git a/apps/ichat/migrations/0001_initial.py b/apps/ichat/migrations/0001_initial.py new file mode 100644 index 00000000..290c1cff --- /dev/null +++ b/apps/ichat/migrations/0001_initial.py @@ -0,0 +1,48 @@ +# Generated by Django 3.2.12 on 2025-05-21 05:59 + +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='Conversation', + 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='删除标记')), + ('title', models.CharField(default='新对话', max_length=200, verbose_name='对话标题')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='conversation_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='conversation_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='Message', + 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='删除标记')), + ('content', models.TextField(verbose_name='消息内容')), + ('role', models.CharField(default='user', help_text='system/user', max_length=10, verbose_name='角色')), + ('conversation', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='ichat.conversation', verbose_name='对话')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/ofm/migrations/0002_lendingseal.py b/apps/ofm/migrations/0002_lendingseal.py new file mode 100644 index 00000000..5c1a7837 --- /dev/null +++ b/apps/ofm/migrations/0002_lendingseal.py @@ -0,0 +1,48 @@ +# Generated by Django 3.2.12 on 2025-09-05 03:07 + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('wf', '0002_alter_state_filter_dept'), + ('system', '0006_auto_20241213_1249'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('ofm', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='LendingSeal', + 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='删除标记')), + ('seal', models.JSONField(default=list, help_text='{"seal_name": "印章名称"}', verbose_name='印章信息')), + ('filename', models.TextField(verbose_name='文件名称')), + ('file', models.TextField(verbose_name='文件内容')), + ('file_count', models.PositiveIntegerField(verbose_name='用印份数')), + ('is_lending', models.BooleanField(default=False, verbose_name='是否借出')), + ('contacts', models.CharField(blank=True, max_length=50, null=True, validators=[django.core.validators.RegexValidator('^1[3456789]\\d{9}$', '手机号码格式不正确')], verbose_name='联系方式')), + ('lending_date', models.DateField(blank=True, null=True, verbose_name='借出日期')), + ('return_date', models.DateField(blank=True, null=True, verbose_name='拟归还日期')), + ('actual_return_date', models.DateField(blank=True, null=True, verbose_name='实际归还日期')), + ('reason', models.CharField(blank=True, max_length=100, null=True, verbose_name='借用理由')), + ('note', models.TextField(blank=True, null=True, verbose_name='备注')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lendingseal_belong_dept', to='system.dept', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lendingseal_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('submit_user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='seal_submit_user', 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='seal_ticket', to='wf.ticket', verbose_name='关联工单')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='lendingseal_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/apps/ofm/models.py b/apps/ofm/models.py index 7cf1f869..fa5fa4a6 100644 --- a/apps/ofm/models.py +++ b/apps/ofm/models.py @@ -1,7 +1,23 @@ from django.db import models -from apps.utils.models import CommonADModel, BaseModel +from apps.utils.models import CommonADModel, BaseModel, CommonBDModel +from apps.system.models import User +from django.core.validators import RegexValidator # Create your models here. + +MTASK_CREATED = 10 +MTASK_ASSGINED = 20 +MTASK_STOP = 34 +MTASK_SUBMIT = 40 +MTASK_STATES = ( + (MTASK_CREATED, '创建中'), + (MTASK_ASSGINED, '已下达'), + (MTASK_STOP, '已停止'), + (MTASK_SUBMIT, '已提交') + ) +phone_validator = RegexValidator(r'^1[3456789]\d{9}$', '手机号码格式不正确') + + class Mroom(CommonADModel): """TN: 会议室基本信息""" name = models.CharField('会议室名称', max_length=50, unique=True) @@ -22,4 +38,285 @@ class MroomSlot(BaseModel): class Meta: unique_together = ('mroom', 'mdate', 'slot') - \ No newline at end of file + + +# class Seal(BaseModel): +# """TN: 印章类型""" +# name = models.CharField('印章名称', max_length=50, unique=True) + + +class LendingSeal(CommonBDModel): + """TN: 印章外出用印信息""" + + seal = models.JSONField('印章信息',default=list ,help_text='{"seal_name": "印章名称"}') + filename = models.TextField('文件名称') + file = models.TextField('文件内容') + file_count = models.PositiveIntegerField('用印份数') + is_lending= models.BooleanField('是否借出', default=False) + contacts = models.CharField('联系方式', max_length=50, validators=[phone_validator], blank=True, null=True) + lending_date = models.DateField('借出日期', blank=True, null=True) + return_date = models.DateField('拟归还日期', blank=True, null=True) + actual_return_date = models.DateField('实际归还日期', blank=True, null=True) + reason = models.CharField('借用理由', max_length=100, blank=True, null=True) + submit_user = models.ForeignKey( + User, verbose_name='提交人', on_delete=models.CASCADE, null=True, blank=True, related_name='seal_submit_user') + ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', + on_delete=models.SET_NULL, related_name='seal_ticket', null=True, blank=True, db_constraint=False) + note = models.TextField('备注', null=True, blank=True) + + +# class Vehicle(CommonADModel): +# """TN: 用车申请""" + +# submit_user = models.ForeignKey( +# User, verbose_name='用车人', on_delete=models.CASCADE, null=True, blank=True, related_name='vehicle_submit_user') +# approval_user = models.ForeignKey( +# User, verbose_name='审批人', on_delete=models.CASCADE, null=True, blank=True, related_name='vehicle_approval_user' +# ) +# start_time = models.DateTimeField('出车时间') +# end_time = models.DateTimeField('还车时间') +# location = models.CharField('出发地点', null=True, blank=True, max_length=100) +# destination = models.CharField('到达地点', null=True, blank=True, max_length=100) +# start_km = models.PositiveIntegerField('出发公里数') +# end_km = models.PositiveIntegerField('归还公里数') +# actual_km = models.PositiveIntegerField('实际行驶公里数', editable=False) +# is_city = models.BooleanField('是否市内用车', default=True) +# reason = models.CharField('用车事由', max_length=100) +# ticket = models.ForeignKey('wf.ticket', verbose_name='关联工单', +# on_delete=models.SET_NULL, related_name='vehicle_ticket', null=True, blank=True, db_constraint=False) +# state = models.PositiveIntegerField( +# '状态', choices=MTASK_STATES, default=MTASK_CREATED, help_text=str(MTASK_STATES)) + +# def save(self, *args, **kwargs): +# if self.end_km and self.start_km: +# self.actual_km = self.end_km - self.start_km +# return super().save(*args, **kwargs) + + +# class FileRecord(CommonBDModel): +# """TN: 档案台账""" +# name = models.CharField('资料名称', max_length=100) +# number = models.CharField('档案编号', max_length=50) +# files = models.CharField('文件份数', max_length=10) +# location = models.CharField('存放位置', max_length=100) +# contacts = models.CharField('存档人电话', max_length=50) +# location = models.CharField('存档位置', max_length=100) +# reciver = models.CharField('接收人(综合办)', max_length=50) +# remark = models.CharField('备注', max_length=100) + + +# class BorrowRecord(CommonBDModel): +# """TN: 借阅、复印、查阅记录""" +# files = models.ManyToManyField(FileRecord, related_name="borrow_records") +# borrow_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="borrow_user") +# borrow_date = models.DateField('借阅日期') +# return_date = models.DateField('归还日期') +# contacts = models.CharField('借阅人电话', max_length=50, validators=[phone_validator], null=True, blank=True) +# remark = models.CharField('用途', max_length=100) + + +# class Publicity(CommonBDModel): +# """TN: 公示栏""" +# CHANNEL_CHOICES = [ +# ('internet', '互联网'), +# ('platform', '信息平台'), +# ('official', '官微'), +# ('publication', '公开发行物'), +# ('other', '其它'), +# ] +# SECRET_LEVELS = ( +# (0, '重要'), +# (1, '一般'), +# (2, '非涉密'), +# ) +# CONTENT_CHOICES = [ +# ('device', '武器装备科研生产综合事项'), +# ('other', '其他'), +# ] +# number = models.CharField('记录编号', max_length=50) +# title = models.CharField('送审稿件标题', max_length=100) +# participants = models.CharField('所有撰稿人', max_length=50) +# level = models.PositiveBigIntegerField('涉密等级', choices=SECRET_LEVELS, default=2, help_text=str(SECRET_LEVELS)) +# content = models.CharField('稿件内容涉及', max_length=50, choices=CONTENT_CHOICES, default='device', blank=True) +# report_purpose = models.CharField('宣传报道目的', max_length=100, blank=True, null=True) +# channel = models.CharField('发布渠道', max_length=50, choices=CHANNEL_CHOICES, default='platform') +# other_channel = models.CharField('其它渠道', max_length=50, blank=True, null=True) +# review = models.CharField('第一撰稿人自审', max_length=100, blank=True, null=True) +# dept_opinion = models.CharField('部门负责人意见', max_length=100, blank=True, null=True) +# manager_opinion = models.CharField('总经理', max_length=100, blank=True, null=True) + + +# class PatentInfo(CommonBDModel): +# """TN: 专利申密审批表单样式""" +# PATENT_TYPE_CHOICES = ( +# ('invention', '发明专利'), +# ('utility', '实用新型专利'), +# ('design', '外观设计专利'), +# ) +# APPLY_AREAS = ( +# ('Domestic', '国内申请'), +# ('Foreign', '国外申请'), +# (' PCT', 'PCT申请'), +# ) +# name = models.CharField('拟申请专利名称', max_length=100) +# author = models.CharField('发明人(设计人)', max_length=100) +# type = models.CharField('专利类型', max_length=50, choices=PATENT_TYPE_CHOICES, default='invention') +# is_public = models.BooleanField('是否公开', default=False) +# area = models.CharField('拟申请地域', max_length=50, choices=APPLY_AREAS, default='Domestic') +# identified = models.BooleanField('是否进行过科技成果鉴定', default=False) +# published_article = models.BooleanField('是否发表过文章', default=False) +# exhibited = models.BooleanField('是否参与过展会展出', default=False) +# applied_to_production = models.BooleanField('是否参与应用于生产/销售', default=False) +# participated_in_exchange = models.BooleanField('是否参与过技术交流', default=False) +# tech_background_pages = models.PositiveIntegerField('技术背景材料页数', null=True, blank=True) +# tech_disclosure_pages = models.PositiveIntegerField('技术交底材料页数', null=True, blank=True) +# novelty_report_pages = models.PositiveIntegerField('查新检索报告页数', null=True, blank=True) +# diagrams_or_photos_pages = models.PositiveIntegerField('图/照片页数或张数', null=True, blank=True) + + +# class PaperOfm(CommonADModel): +# """TN: 论文申密审批表单""" +# PAPER_TYPE_CHOICES = ( +# ('research', '研究论文'), +# ('comprehensive', '综合'), +# ) +# name = models.CharField('拟申请专利名称', max_length=100) +# author = models.CharField('发明人(设计人)', max_length=100) +# paper_type = models.CharField('论文类型', max_length=50, choices=PAPER_TYPE_CHOICES, default='research') +# is_chinese_core = models.BooleanField('是否为中文核心', default=False) +# is_sci = models.BooleanField('是否被SCI/EI收录', default=False) +# has_appraisal = models.BooleanField('是否进行过科技成果鉴定', default=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): +# """TN: 专利台账登记""" +# volume_number = models.CharField(max_length=50, null=True, blank=True, verbose_name="卷号") +# application_number = models.CharField(max_length=50, verbose_name="申请号(交局后补登)") +# title = models.CharField(max_length=255, verbose_name="名称") + +# patent_type = models.CharField( +# max_length=20, +# choices=[ +# ("invention", "发明"), +# ("utility_model", "实用新型"), +# ("design", "外观设计") +# ], +# verbose_name="专利类型" +# ) +# organization = models.CharField(max_length=100, verbose_name="单位") +# inventors = models.CharField(max_length=255, verbose_name="发明人") +# agent = models.CharField(max_length=255, null=True, blank=True, verbose_name="代理人") +# affiliated_platforms = models.ManyToManyField('Platform', blank=True, verbose_name="归属平台") +# affiliated_projects = models.ManyToManyField('Project', blank=True, verbose_name="归属项目") +# application_date = models.DateField(null=True, blank=True, verbose_name="申请日") +# authorization_date = models.DateField(null=True, blank=True, verbose_name="授权日") +# validity_years = models.IntegerField(null=True, blank=True, verbose_name="有效年限(年)") +# annuity_paid = models.DecimalField(max_digits=10,decimal_places=2, null=True,blank=True,verbose_name="年费缴纳") + +# status = models.CharField( +# max_length=20, +# choices=[ +# ("not_disclosed", "未公开"), +# ("under_examination", "实审中"), +# ("first_office_action", "一通"), +# ("second_office_action", "二通"), +# ("rejected", "驳回"), +# ("reexamination", "复审"), +# ("authorized", "授权") +# ], +# 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 PaperRecord(models.Model): +# """TN: 论文台账登记""" +# index = models.PositiveIntegerField(verbose_name="序号") +# paper_code = models.CharField(max_length=100, blank=True, null=True, verbose_name="论文编号(投稿后补登)") +# title = models.CharField(max_length=255, verbose_name="名称") +# paper_type = models.CharField(max_length=100, verbose_name="论文类型") +# affiliation = models.CharField(max_length=255, verbose_name="单位") +# authors = models.CharField(max_length=255, verbose_name="作者") +# corresponding_author = models.CharField(max_length=255, blank=True, null=True, verbose_name="通讯作者") +# affiliated_platforms = models.ManyToManyField('Platform', blank=True, verbose_name="归属平台") +# affiliated_projects = models.ManyToManyField('Project', blank=True, verbose_name="归属项目") +# acceptance_date = models.DateField(blank=True, null=True, verbose_name="接受日期") +# publication_date = models.DateField(blank=True, null=True, verbose_name="发表日期") +# page_fee_paid = models.DecimalField( +# max_digits=10, +# decimal_places=2, +# blank=True, +# null=True, +# verbose_name="版面费缴纳" +# ) + +# status = models.CharField( +# max_length=50, +# choices=[ +# ("under_review", "审稿中"), +# ("revise_1", "一修"), +# ("revise_2", "二修"), +# ("accepted", "接收"), +# ("published", "发表") +# ], +# default="under_review", verbose_name="状态" +# ) +# award_status = models.CharField(max_length=255, blank=True, null=True, verbose_name="报奖情况") +# bonus_amount = models.DecimalField(max_digits=10,decimal_places=2,blank=True,null=True,verbose_name="奖金发放") + + +# class ProjectApproval(CommonBDModel): +# """TN: 立项审批表""" +# project_start_date = models.DateField("立项日期", null=True, blank=True) +# is_self_initiated = models.BooleanField("自立项目", default=False) +# is_city_level = models.BooleanField("市级项目", default=False) +# is_province_level = models.BooleanField("省级项目", default=False) +# construction_period = models.CharField("建设期", max_length=100, null=True, blank=True) +# project_members = models.TextField("项目组员", null=True, blank=True) +# project_budget = models.DecimalField("项目预算(万元)", max_digits=12, decimal_places=2, null=True, blank=True) +# project_description = models.TextField("项目基本情况", null=True, blank=True) +# project_performance = models.TextField("目标绩效", null=True, blank=True) + + +# class ProjectInfo(CommonBDModel): +# """TN: 项目信息表 + +# """ +# serial_number = models.CharField("序号", max_length=50, null=True, blank=True) +# red_head_doc_no = models.CharField("红头发文号/公示页", max_length=100, null=True, blank=True) +# name = models.CharField("名称", max_length=200, null=True, blank=True) +# project_type = models.CharField("项目类型", max_length=100, null=True, blank=True) +# platform = models.CharField("所属平台", max_length=100, null=True, blank=True) +# project_source = models.CharField("项目来源", max_length=100, null=True, blank=True) +# construction_period = models.CharField("建设期", max_length=100, null=True, blank=True) +# project_funding = models.DecimalField("项目资金(财政与自筹)", max_digits=15, decimal_places=2, null=True, blank=True) +# support_period = models.CharField("项目支持期", max_length=100, null=True, blank=True) +# undertaking_unit = models.CharField("承担单位", max_length=200, null=True, blank=True) +# responsible_person = models.CharField("负责人", max_length=50, null=True, blank=True) + +# project_members = models.TextField("项目人员", null=True, blank=True) +# milestone = models.TextField("里程碑节点", null=True, blank=True) +# mid_term_status = models.TextField("项目中期情况", null=True, blank=True) +# acceptance_status = models.TextField("项目验收情况", null=True, blank=True) +# sci_tech_achievements = models.TextField("科技成果", null=True, blank=True) + diff --git a/apps/ofm/serializers.py b/apps/ofm/serializers.py index 95cc65d5..fae4c315 100644 --- a/apps/ofm/serializers.py +++ b/apps/ofm/serializers.py @@ -1,4 +1,6 @@ -from .models import Mroom, MroomBooking, MroomSlot +from .models import (Mroom, MroomBooking, MroomSlot, LendingSeal) +# Vehicle, Publicity, +# FileRecord, BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) from apps.utils.serializers import CustomModelSerializer from rest_framework import serializers from django.db import transaction @@ -55,10 +57,131 @@ class MroomBookingSerializer(CustomModelSerializer): return booking - class MroomSlotSerializer(CustomModelSerializer): booking_title = serializers.CharField(source='booking.title', read_only=True) class Meta: model = MroomSlot fields = '__all__' + +# class SealSerializer(CustomModelSerializer): +# class Meta: +# model = Seal +# fields = '__all__' + + +# class SealManageSerializer(CustomModelSerializer): +# seal_name = serializers.CharField(source='seal.name', read_only=True) +# class Meta: +# model = SealManage +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +class LendingSealSerializer(CustomModelSerializer): + # seal_name = serializers.CharField(source='seal.name', read_only=True) + class Meta: + model = LendingSeal + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS + + +# class VehicleSerializer(CustomModelSerializer): +# class Meta: +# model = Vehicle +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + ['actual_km'] + + +# class FileRecordSerializer(CustomModelSerializer): +# class Meta: +# model = FileRecord +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class BorrowRecordSerializer(CustomModelSerializer): +# files = serializers.PrimaryKeyRelatedField(queryset=FileRecord.objects.all(), many=True, write_only=True, label="借阅文件") +# file_detail = FileRecordSerializer(source='file', many=True, read_only=True, label="借阅文件详情") +# class Meta: +# model = BorrowRecord +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class PublicitySerializer(CustomModelSerializer): +# class Meta: +# model = Publicity +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class PatentInfoSerializer(CustomModelSerializer): +# class Meta: +# model = PatentInfo +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class PaperSerializer(CustomModelSerializer): +# class Meta: +# model = PaperOfm +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class PlatformSerializer(serializers.ModelSerializer): +# class Meta: +# model = Platform +# fields = ['id', 'name'] + + +# class ProjectSerializer(serializers.ModelSerializer): +# class Meta: +# model = Project +# fields = ['id', 'name'] + + +# class ProjectMemberSerializer(CustomModelSerializer): +# affiliated_platforms = serializers.PrimaryKeyRelatedField( +# many=True, +# queryset=Platform.objects.all(), +# write_only=True +# ) +# affiliated_platforms_detail = PlatformSerializer( +# source='affiliated_platforms', many=True, read_only=True +# ) + +# affiliated_projects = serializers.PrimaryKeyRelatedField( +# many=True, +# queryset=Project.objects.all(), +# write_only=True +# ) +# affiliated_projects_detail = ProjectSerializer( +# source='affiliated_projects', many=True, read_only=True +# ) +# class Meta: +# model = PatentRecord +# fields = '__all__' + + +# class PaperRecordSerializer(CustomModelSerializer): +# class Meta: +# model = PaperRecord +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class ProjectApprovalSerializer(CustomModelSerializer): +# class Meta: +# model = ProjectApproval +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + + +# class ProjectInfoSerializer(CustomModelSerializer): +# class Meta: +# model = ProjectInfo +# fields = '__all__' +# read_only_fields = EXCLUDE_FIELDS + \ No newline at end of file diff --git a/apps/ofm/services.py b/apps/ofm/services.py new file mode 100644 index 00000000..405e30fd --- /dev/null +++ b/apps/ofm/services.py @@ -0,0 +1,30 @@ + +from apps.wf.models import Ticket +# TicketFlow, Transition, Workflow, CustomField, State, +from apps.ofm.models import SealManage, LendingSeal +from rest_framework.exceptions import ParseError + + +def seal_submit_validate(ins: LendingSeal): + if ins.submit_time: + raise ParseError('该日志已提交!') + if ins.mtask and ins.mtask.state == LendingSeal.MTASK_STOP: + raise ParseError('该任务已停止!') + +def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict): + ins = SealManage.objects.get(id=new_ticket_data['t_id']) + if ins.submit_time is not None: + raise ParseError('该印章申请不可提交审批') + seal_submit_validate(ins) + ticket_data = ticket.ticket_data + ticket_data.update({ + 't_model': 'LendingSeal', + '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() + diff --git a/apps/ofm/urls.py b/apps/ofm/urls.py index 3f0e8960..69c410ce 100644 --- a/apps/ofm/urls.py +++ b/apps/ofm/urls.py @@ -1,6 +1,9 @@ from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet) +from apps.ofm.views import (MroomViewSet, MroomBookingViewSet, MroomSlotViewSet,LendingSealViewSet) + # , VehicleViewSet, FilerecordViewSet, SealModelViewSet, + # FileborrowViewSet, PublicityViewSet, PatentInfoViewSet, PaperViewSet, PlatformViewSet, + # ProjectViewSet, PatentRecordViewSet, PaperRecordViewSet, ProjectApprovalViewSet, ProjectInfoViewSet) API_BASE_URL = 'api/ofm/' HTML_BASE_URL = 'dhtml/ofm/' @@ -9,6 +12,21 @@ router = DefaultRouter() router.register('mroom', MroomViewSet, basename='mroom') router.register('mroombooking', MroomBookingViewSet, basename='mroombooking') router.register('mroomslot', MroomSlotViewSet, basename='mroomslot') +# router.register('sealmanage', SealManageViewSet, basename='sealmanage') +router.register('lendingseal', LendingSealViewSet, basename='lendingseal') +# router.register('vehicle', VehicleViewSet, basename='vehicle') +# router.register('filerecord', FilerecordViewSet, basename='filerecord') +# router.register('fileborrow', FileborrowViewSet, basename='fileborrow') +# router.register('publicity', PublicityViewSet, basename='publicity') +# router.register('patentinfo', PatentInfoViewSet, basename='patentinfo') + +# router.register('paper', PaperViewSet, basename='paper') +# router.register('platform', PlatformViewSet, basename='platform') +# router.register('project', ProjectViewSet, basename='project') +# router.register('patentrecord', PatentRecordViewSet, basename='patentrecord') +# router.register('paperrecord', PaperRecordViewSet, basename='paperrecord') +# router.register('projectapproval', ProjectApprovalViewSet, basename='projectapproval') +# router.register('projectinfo', ProjectInfoViewSet, basename='projectinfo') urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/ofm/views.py b/apps/ofm/views.py index f9e21ed0..5e515439 100644 --- a/apps/ofm/views.py +++ b/apps/ofm/views.py @@ -1,7 +1,12 @@ from django.shortcuts import render from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet -from .models import Mroom, MroomBooking, MroomSlot -from .serializers import MroomSerializer, MroomBookingSerializer, MroomSlotSerializer +from .models import Mroom, MroomBooking, MroomSlot, LendingSeal + # Vehicle, FileRecord, Seal + # BorrowRecord, Publicity, PatentInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo) +from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer) + # ,SealSerializer, + # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, + # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer) from rest_framework.decorators import action from apps.utils.mixins import CustomListModelMixin from rest_framework.exceptions import ParseError @@ -88,10 +93,176 @@ class MroomBookingViewSet(CustomModelViewSet): class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet): - """list: 会议室预订时段 + """list: 会议室预订时段 """ queryset = MroomSlot.objects.all() serializer_class = MroomSlotSerializer - filterset_fields = ["mroom", "mdate", "booking"] \ No newline at end of file + filterset_fields = ["mroom", "mdate", "booking"] + + +# class SealModelViewSet(CustomModelViewSet): +# """list: 印章列表 + +# 印章列表 +# """ +# queryset = Seal.objects.all() +# serializer_class = SealSerializer +# filterset_fields = ["name"] +# ordering = ["name"] + + +# class SealManageViewSet(CustomModelViewSet): +# """list: 印章管理 + +# 印章管理 +# """ +# queryset = SealManage.objects.all() +# serializer_class = SealManageSerializer +# filterset_fields = ["seal"] + + +class LendingSealViewSet(CustomModelViewSet): + """list: 印章外出 + + 印章外出 + """ + perms_map = {'get': '*', 'post': 'seal.update', + 'put': 'seal.update', 'delete': 'seal.delete'} + queryset = LendingSeal.objects.all() + serializer_class = LendingSealSerializer + filterset_fields = ["seal"] + ordering = ["create_time"] + + +# class VehicleViewSet(CustomModelViewSet): +# """list: 车辆 + +# 车辆 +# """ +# queryset = Vehicle.objects.all() +# serializer_class = VehicleSerializer +# filterset_fields = ["submit_user"] +# ordering = ["create_time"] + + +# class FilerecordViewSet(CustomModelViewSet): +# """list: 文件 + +# 文件 +# """ +# queryset = FileRecord.objects.all() +# serializer_class = FileRecordSerializer +# filterset_fields = ["submit_user", "name", "number"] +# ordering = ["create_time", "number", "name"] + + +# class FileborrowViewSet(CustomModelViewSet): +# """list: 文件借阅 + +# 文件借阅 +# """ +# queryset = BorrowRecord.objects.all() +# serializer_class = BorrowRecordSerializer +# filterset_fields = ["files", "borrow_user"] +# ordering = ["create_time"] + + +# class PublicityViewSet(CustomModelViewSet): +# """list: 公告 + +# 公告 +# """ +# queryset = Publicity.objects.all() +# serializer_class = PublicitySerializer +# filterset_fields = ["title","number"] +# ordering = ["create_time", "number"] + + +# class PatentInfoViewSet(CustomModelViewSet): +# """list: 专利 + +# 专利 +# """ +# queryset = PatentInfo.objects.all() +# serializer_class = PatentInfoSerializer +# filterset_fields = ["name", "author", "type"] +# ordering = ["create_time", "name", "author", "type"] + + +# class PaperViewSet(CustomModelViewSet): +# """list: 论文申密审批 + +# 论文申密审批 +# """ +# queryset = PaperOfm.objects.all() +# serializer_class = PaperSerializer +# filterset_fields = ["name", "author"] +# ordering = ["create_time", "name"] + + +# class PlatformViewSet(CustomModelViewSet): +# """list: 平台 + +# 平台 +# """ +# queryset = Platform.objects.all() +# serializer_class = PlatformSerializer +# filterset_fields = ["name"] +# ordering = ["create_time", "name"] + + +# class ProjectViewSet(CustomModelViewSet): +# """list: 项目 + +# 项目 +# """ +# queryset = Project.objects.all() +# serializer_class = ProjectSerializer +# filterset_fields = ["name"] +# ordering = ["create_time", "name"] + + +# class PatentRecordViewSet(CustomModelViewSet): +# """list: 专利台账登记 + +# 专利台账登记 +# """ +# queryset = PatentRecord.objects.all() +# serializer_class = ProjectMemberSerializer +# filterset_fields = ["patent", "type"] +# ordering = ["create_time", "patent", "type"] + + +# class PaperRecordViewSet(CustomModelViewSet): +# """list: 论文台账登记 + +# 论文台账登记 +# """ +# queryset = PaperRecord.objects.all() +# serializer_class = ProjectMemberSerializer +# filterset_fields = ["index", "title", "paper_code","paper_type", "authors"] +# ordering = ["create_time", "paper", "type"] + + +# class ProjectApprovalViewSet(CustomModelViewSet): +# """list: 立项审批表 + +# 立项审批表 +# """ +# queryset = ProjectApproval.objects.all() +# serializer_class = ProjectApprovalSerializer +# filterset_fields = ["project_start_date"] +# ordering = ["project_start_date"] + + +# class ProjectInfoViewSet(CustomModelViewSet): +# """list: 项目信息 + +# 项目信息 +# """ +# queryset = ProjectInfo.objects.all() +# serializer_class = ProjectInfoSerializer +# filterset_fields = ["serial_number", "name", "platform", "project_source"] +# ordering = ["serial_number", "name"]