diff --git a/client/.env.development b/client/.env.development
index e00224e..f6c64bf 100644
--- a/client/.env.development
+++ b/client/.env.development
@@ -3,8 +3,8 @@ ENV = 'development'
# base api
#VUE_APP_BASE_API = 'http://10.0.11.127:8000/api'
-# VUE_APP_BASE_API = 'http://127.0.0.1:2222/api'
-VUE_APP_BASE_API = 'https://testsearch.ctc.ac.cn/api'
+VUE_APP_BASE_API = 'http://127.0.0.1:2222/api'
+# VUE_APP_BASE_API = 'https://testsearch.ctc.ac.cn/api'
#VUE_APP_BASE_API = 'http://47.95.0.242:9101/api'
diff --git a/client/package.json b/client/package.json
index 74a5bc8..37ee37a 100644
--- a/client/package.json
+++ b/client/package.json
@@ -26,7 +26,7 @@
"normalize.css": "7.0.0",
"nprogress": "0.2.0",
"path-to-regexp": "2.4.0",
- "pdfobject": "^2.2.12",
+ "pdfobject": "^2.3.0",
"vod-js-sdk-v6": "^1.4.12",
"vue": "2.6.10",
"vue-pdf": "^4.2.0",
diff --git a/client/src/api/record.js b/client/src/api/record.js
index abf1667..d6b231f 100644
--- a/client/src/api/record.js
+++ b/client/src/api/record.js
@@ -85,3 +85,11 @@ export function deptconfirm(id) {
})
}
+export function deptconfirm_top(id) {
+ return request({
+ url: `/supervision/record/${id}/deptconfirm_top/`,
+ method: 'put',
+ })
+}
+
+
diff --git a/client/src/router/index.js b/client/src/router/index.js
index f9a435c..5d92762 100644
--- a/client/src/router/index.js
+++ b/client/src/router/index.js
@@ -254,7 +254,7 @@ export const asyncRoutes = [
path: 'other',
name: 'other',
component: () => import('@/views/supervision/task.vue'),
- meta: { title: '其他任务'}
+ meta: { title: '其他任务', perms: ['task2']}
},
]
},
@@ -289,7 +289,7 @@ export const asyncRoutes = [
path: 'taskdo/:id',
name: 'Taskdo',
component: () => import('@/views/supervision/taskdo.vue'),
- meta: { title: '报送任务执行', perms: ['task_view'] },
+ meta: { title: '报送任务执行', perms: ['task2'] },
hidden: true
},
{
diff --git a/client/src/views/supervision/mytaskrecord.vue b/client/src/views/supervision/mytaskrecord.vue
index d8f7e17..0692b05 100644
--- a/client/src/views/supervision/mytaskrecord.vue
+++ b/client/src/views/supervision/mytaskrecord.vue
@@ -50,6 +50,12 @@
未确认
+
+
+ 已确认
+ 未确认
+
+
{{
@@ -108,6 +114,16 @@
@click="handleRecord({ action: 'deptconfirm', record: scope.row })"
>二级单位确认
+ 事业部确认
已确认
未确认
+
+
+
+ 已确认
+ 未确认
+
diff --git a/client/src/views/supervision/recorddo.vue b/client/src/views/supervision/recorddo.vue
index 437472b..61575f3 100644
--- a/client/src/views/supervision/recorddo.vue
+++ b/client/src/views/supervision/recorddo.vue
@@ -142,7 +142,9 @@ import {
rejectRecord,
confirmRecord,
deleteRecord,
- deptconfirm
+ deptconfirm,
+ deptconfirm_top
+
} from "@/api/record";
export default {
name: "recorddo",
@@ -230,9 +232,12 @@ export default {
this.$message.success("二级单位确认成功");
this.$emit("handleDo",true);
});
-
- }
- else if (this.data.action == "reject") {
+ } else if (this.data.action == "deptconfirm_top") {
+ deptconfirm_top(this.record.id).then((res) => {
+ this.$message.success("事业部确认成功");
+ this.$emit("handleDo",true);
+ });
+ } else if (this.data.action == "reject") {
rejectRecord(this.record.id, this.record).then((res) => {
this.$message.success("成功");
this.$emit("handleDo",true);
diff --git a/client/src/views/supervision/taskdo.vue b/client/src/views/supervision/taskdo.vue
index 024f86e..c675edc 100644
--- a/client/src/views/supervision/taskdo.vue
+++ b/client/src/views/supervision/taskdo.vue
@@ -257,6 +257,12 @@
已确认
未确认
+
+
+
+ 已确认
+ 未确认
+
{{ scope.row.note }}
diff --git a/client/src/views/supervisionNew/mytask.vue b/client/src/views/supervisionNew/mytask.vue
index cf9b91e..60956b3 100644
--- a/client/src/views/supervisionNew/mytask.vue
+++ b/client/src/views/supervisionNew/mytask.vue
@@ -1036,7 +1036,7 @@
},
getPtList(){
let that = this;
- getPtList({task2do:that.task2do,page:0}).then((res) => {
+ getPtList({task2do__task2__year:that.task2Item.task2_.year,page:0}).then((res) => {
if (res.code >= 200) {
that.ptList=res.data;
}
@@ -1060,7 +1060,7 @@
},
getOinspectList(){
let that = this;
- getOinspectList({task2do:that.task2do,page:0}).then((res) => {
+ getOinspectList({task2do__task2__year:that.task2Item.task2_.year,page:0}).then((res) => {
if (res.code >= 200) {
that.oinspectList=res.data;
}
diff --git a/server/apps/information/__init__.py b/server/apps/information/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/information/admin.py b/server/apps/information/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/server/apps/information/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/server/apps/information/apps.py b/server/apps/information/apps.py
new file mode 100644
index 0000000..339005f
--- /dev/null
+++ b/server/apps/information/apps.py
@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class InformationConfig(AppConfig):
+ name = 'information'
diff --git a/server/apps/information/migrations/0001_initial.py b/server/apps/information/migrations/0001_initial.py
new file mode 100644
index 0000000..97f2e21
--- /dev/null
+++ b/server/apps/information/migrations/0001_initial.py
@@ -0,0 +1,105 @@
+# Generated by Django 3.2.12 on 2024-03-19 08:23
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='AbilityReview',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20, unique=True, verbose_name='公司名称')),
+ ('qualification_name', models.CharField(max_length=20, verbose_name='资质名称')),
+ ('judging_method', models.CharField(choices=[('文审', '文审'), ('现场', '现场')], max_length=20, verbose_name='评审方法')),
+ ('judging_type', models.CharField(choices=[('初次', '初次'), ('扩项', '扩项'), ('变更', '变更'), ('复评', '复评'), ('迁址', '迁址')], max_length=20, verbose_name='评审类型')),
+ ('add_param', models.IntegerField(default=0, verbose_name='新增参数')),
+ ('review_date', models.DateField(null=True, verbose_name='评审日期')),
+ ('now_count', models.IntegerField(default=0, verbose_name='现有场所数量')),
+ ('add_count', models.IntegerField(default=0, verbose_name='新增场所数量')),
+ ],
+ options={
+ 'verbose_name': '评审情况',
+ 'db_table': 'ability_review',
+ },
+ ),
+ migrations.CreateModel(
+ name='Contact',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20, unique=True, verbose_name='姓名')),
+ ('address', models.CharField(max_length=100, verbose_name='地址')),
+ ('header', models.CharField(max_length=20, verbose_name='负责人')),
+ ('tel', models.CharField(max_length=20, verbose_name='负责人电话')),
+ ('email', models.CharField(max_length=50, null=True, verbose_name='负责人邮箱')),
+ ('head_technology', models.CharField(max_length=50, verbose_name='技术负责人')),
+ ('tel_technology', models.CharField(max_length=20, verbose_name='技术负责人电话')),
+ ('email_technology', models.CharField(max_length=50, null=True, verbose_name='技术负责人邮箱')),
+ ('head_quality', models.CharField(max_length=50, verbose_name='质量负责人')),
+ ('tel_quality', models.CharField(max_length=20, verbose_name='质量负责人电话')),
+ ('email_quality', models.CharField(max_length=50, null=True, verbose_name='质量负责人邮箱')),
+ ],
+ options={
+ 'verbose_name': '实验室联系方式',
+ 'db_table': 'contact',
+ },
+ ),
+ migrations.CreateModel(
+ name='ExternalAuditors',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name_company', models.CharField(max_length=20, unique=True, verbose_name='公司名称')),
+ ('name', models.CharField(max_length=20, verbose_name='姓名')),
+ ('review_type', models.CharField(max_length=20, verbose_name='评审类型')),
+ ('certificate_expiration', models.DateField(verbose_name='证书有效期')),
+ ('contact', models.CharField(max_length=20, verbose_name='联系方式')),
+ ('judging_areas', models.CharField(max_length=20, verbose_name='评审领域')),
+ ('remark', models.CharField(max_length=20, null=True, verbose_name='备注')),
+ ],
+ options={
+ 'verbose_name': '外审员情况',
+ 'db_table': 'externalauditors',
+ },
+ ),
+ migrations.CreateModel(
+ name='QualityActivities',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20, unique=True, verbose_name='活动名称')),
+ ('roles', models.CharField(choices=[('组织方', '组织方'), ('活动方', '活动方')], max_length=20, verbose_name='参与角色')),
+ ('collaborators', models.CharField(max_length=20, verbose_name='合作方')),
+ ('organizational_units', models.CharField(max_length=20, verbose_name='组织单位')),
+ ('place', models.CharField(max_length=50, verbose_name='活动地点')),
+ ('time', models.DateField(null=True, verbose_name='活动时间')),
+ ('participations', models.IntegerField(verbose_name='活动参与单位数量')),
+ ('function', models.CharField(max_length=100, verbose_name='活动中发挥的作用')),
+ ('earnings', models.IntegerField(verbose_name='活动收益')),
+ ],
+ options={
+ 'verbose_name': '质量活动',
+ 'db_table': 'quality_activities',
+ },
+ ),
+ migrations.CreateModel(
+ name='QualityCommendation',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20, unique=True, verbose_name='项目名称')),
+ ('commendation_name', models.CharField(max_length=20, verbose_name='表彰名称')),
+ ('Awards_level', models.CharField(max_length=20, verbose_name='获奖等级')),
+ ('awardee_company', models.CharField(max_length=20, verbose_name='获奖单位')),
+ ('awarded_by', models.CharField(max_length=20, verbose_name='颁奖单位')),
+ ('awarded_date', models.DateField(null=True, verbose_name='获奖日期')),
+ ],
+ options={
+ 'verbose_name': '质量表彰',
+ 'db_table': 'quality_commendation',
+ },
+ ),
+ ]
diff --git a/server/apps/information/migrations/__init__.py b/server/apps/information/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/server/apps/information/models.py b/server/apps/information/models.py
new file mode 100644
index 0000000..4b00d12
--- /dev/null
+++ b/server/apps/information/models.py
@@ -0,0 +1,106 @@
+from django.db import models
+
+# Create your models here.
+
+class AbilityReview(models.Model):
+ type_method = (
+ ('文审', '文审'),
+ ('现场', '现场'))
+
+ juge_type = ( ('初次', '初次'),
+ ('扩项', '扩项'),
+ ('变更', '变更'),
+ ('复评', '复评'),
+ ('迁址', '迁址'))
+ name = models.CharField(max_length=20, unique=True, verbose_name='公司名称')
+ qualification_name = models.CharField(max_length=20, verbose_name='资质名称')
+ judging_method = models.CharField(max_length=20, choices=type_method, verbose_name='评审方法')
+ judging_type = models.CharField(max_length=20, choices=juge_type, verbose_name='评审类型')
+ add_param = models.IntegerField(default=0, verbose_name='新增参数')
+ review_date = models.DateField(verbose_name='评审日期', null=True)
+ now_count = models.IntegerField(default=0, verbose_name='现有场所数量')
+ add_count = models.IntegerField(default=0, verbose_name='新增场所数量')
+
+ class Meta:
+ verbose_name = '评审情况'
+ db_table = 'ability_review'
+
+ def __str__(self):
+ return self.name
+
+
+class QualityCommendation(models.Model):
+ name = models.CharField(max_length=20, unique=True, verbose_name='项目名称')
+ commendation_name = models.CharField(max_length=20, verbose_name='表彰名称')
+ Awards_level = models.CharField(max_length=20, verbose_name='获奖等级')
+ awardee_company = models.CharField(max_length=20, verbose_name='获奖单位')
+ awarded_by = models.CharField(max_length=20, verbose_name='颁奖单位')
+ awarded_date = models.DateField(verbose_name='获奖日期', null=True)
+
+ class Meta:
+ verbose_name = '质量表彰'
+ db_table = 'quality_commendation'
+
+ def __str__(self):
+ return self.name
+
+
+class QualityActivities(models.Model):
+ role = (('组织方','组织方'),('活动方','活动方'))
+ name = models.CharField(max_length=20, unique=True, verbose_name='活动名称')
+ roles = models.CharField(max_length=20, choices=role, verbose_name='参与角色')
+ collaborators = models.CharField(max_length=20, verbose_name='合作方')
+ organizational_units = models.CharField(max_length=20, verbose_name='组织单位')
+ place = models.CharField(max_length=50, verbose_name='活动地点')
+ time = models.DateField(verbose_name='活动时间', null=True)
+ participations = models.IntegerField(verbose_name='活动参与单位数量')
+ function = models.CharField(max_length=100, verbose_name='活动中发挥的作用')
+ earnings = models.IntegerField(verbose_name='活动收益')
+
+ class Meta:
+ verbose_name = '质量活动'
+ db_table = 'quality_activities'
+
+ def __str__(self):
+ return self.name
+
+
+class Contact(models.Model):
+ name = models.CharField(max_length=20, unique=True, verbose_name='姓名')
+ address = models.CharField(max_length=100, verbose_name='地址')
+ header = models.CharField(max_length=20, verbose_name='负责人')
+ tel = models.CharField(max_length=20, verbose_name='负责人电话')
+ email = models.CharField(max_length=50, verbose_name='负责人邮箱', null=True)
+ head_technology = models.CharField(max_length=50, verbose_name='技术负责人')
+ tel_technology = models.CharField(max_length=20, verbose_name='技术负责人电话')
+ email_technology = models.CharField(max_length=50, verbose_name='技术负责人邮箱', null=True)
+ head_quality = models.CharField(max_length=50, verbose_name='质量负责人')
+ tel_quality = models.CharField(max_length=20, verbose_name='质量负责人电话')
+ email_quality = models.CharField(max_length=50, verbose_name='质量负责人邮箱', null=True)
+
+ class Meta:
+ verbose_name = '实验室联系方式'
+ db_table = 'contact'
+
+ def __str__(self):
+ return self.name
+
+
+class ExternalAuditors(models.Model):
+ review_type = ( ('CNAS', 'CNAS'),
+ ('CMA', 'CMA'),
+ ('DICA', 'DICA'))
+ name_company = models.CharField(max_length=20, unique=True, verbose_name='公司名称')
+ name = models.CharField(max_length=20, verbose_name='姓名')
+ review_type = models.CharField(max_length=20, verbose_name='评审类型')
+ certificate_expiration = models.DateField(verbose_name='证书有效期')
+ contact = models.CharField(max_length=20, verbose_name='联系方式')
+ judging_areas = models.CharField(max_length=20, verbose_name='评审领域')
+ remark = models.CharField(max_length=20, verbose_name='备注', null=True)
+
+ class Meta:
+ verbose_name = '外审员情况'
+ db_table = 'externalauditors'
+
+ def __str__(self):
+ return self.name
\ No newline at end of file
diff --git a/server/apps/information/serializers.py b/server/apps/information/serializers.py
new file mode 100644
index 0000000..44bec81
--- /dev/null
+++ b/server/apps/information/serializers.py
@@ -0,0 +1,28 @@
+from rest_framework import serializers
+from apps.information.models import AbilityReview, QualityCommendation, QualityActivities, Contact, ExternalAuditors
+
+class AbilityReviewSerializer(serializers.ModelSerializer):
+ model = AbilityReview
+ fields = '__all__'
+
+
+class QualityCommendationSerializer(serializers.ModelSerializer):
+ model = QualityCommendation
+ fields = '__all__'
+
+
+class QualityActivitiesSerializer(serializers.ModelSerializer):
+ model = QualityActivities
+ fields = '__all __'
+
+
+class ContactSerializer(serializers.ModelSerializer):
+ model = Contact
+ fields = '__all__'
+
+
+class ExternalAuditorsSerializer(serializers.ModelSerializer):
+ model = ExternalAuditors
+ fields = '__all__'
+
+
diff --git a/server/apps/information/tests.py b/server/apps/information/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/server/apps/information/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/server/apps/information/url.py b/server/apps/information/url.py
new file mode 100644
index 0000000..a6f5a1a
--- /dev/null
+++ b/server/apps/information/url.py
@@ -0,0 +1,19 @@
+from django.urls import path, include
+from rest_framework.routers import DefaultRouter
+from .views import AbilityReviewViewSet, \
+ QualityCommendationBViewSet, \
+ QualityActivitiesViewSet,\
+ ContactViewSet, \
+ ExternalAuditorsViewSet
+
+API_BASE_URL = 'api/information/'
+
+router = DefaultRouter()
+router.register(r'abilityreviews', AbilityReviewViewSet, basename='评审情况')
+router.register(r'qualitycommendation', QualityCommendationBViewSet, basename='质量表彰')
+router.register(r'qualityactivities', QualityActivitiesViewSet, basename='质量活动')
+router.register(r'contact', ContactViewSet, basename='实验室联系方式')
+router.register(r'externalauditors', ExternalAuditorsViewSet, basename='外审员情况')
+
+
+urlpatterns = [path(API_BASE_URL, include(router.urls)),]
\ No newline at end of file
diff --git a/server/apps/information/views.py b/server/apps/information/views.py
new file mode 100644
index 0000000..be88fe2
--- /dev/null
+++ b/server/apps/information/views.py
@@ -0,0 +1,58 @@
+from rest_framework import viewsets, mixins
+from .models import AbilityReview, QualityCommendation, QualityActivities, Contact, ExternalAuditors
+from .serializers import AbilityReviewSerializer, \
+ QualityCommendationSerializer, \
+ QualityActivitiesSerializer,\
+ ContactSerializer, \
+ ExternalAuditorsSerializer
+
+
+class AbilityReviewViewSet( mixins.CreateModelMixin,
+ mixins.ListModelMixin,
+ mixins.DestroyModelMixin,
+ mixins.UpdateModelMixin,
+ viewsets.GenericViewSet):
+ queryset = AbilityReview.objects.all()
+ serializer_class = AbilityReviewSerializer
+
+ #自定义查询
+ def get_queryset(self):
+ pass
+
+
+class QualityCommendationBViewSet(mixins.CreateModelMixin,
+ mixins.ListModelMixin,
+ mixins.DestroyModelMixin,
+ mixins.UpdateModelMixin,
+ viewsets.GenericViewSet):
+ queryset = QualityCommendation.objects.all()
+ serializer_class = QualityCommendationSerializer
+
+
+class QualityActivitiesViewSet(mixins.CreateModelMixin,
+ mixins.ListModelMixin,
+ mixins.DestroyModelMixin,
+ mixins.UpdateModelMixin,
+ viewsets.GenericViewSet):
+ queryset = QualityActivities.objects.all()
+ serializer_class = QualityActivitiesSerializer
+
+
+class ContactViewSet(mixins.CreateModelMixin,
+ mixins.ListModelMixin,
+ mixins.DestroyModelMixin,
+ mixins.UpdateModelMixin,
+ viewsets.GenericViewSet):
+ queryset = Contact.objects.all()
+ serializer_class = ContactSerializer
+
+
+class ExternalAuditorsViewSet(mixins.CreateModelMixin,
+ mixins.ListModelMixin,
+ mixins.DestroyModelMixin,
+ mixins.UpdateModelMixin,
+ viewsets.GenericViewSet):
+ queryset = ExternalAuditors.objects.all()
+ serializer_class = ExternalAuditorsSerializer
+
+
diff --git a/server/apps/supervision/migrations/0053_record_dept_top_yes.py b/server/apps/supervision/migrations/0053_record_dept_top_yes.py
new file mode 100644
index 0000000..c3d1e74
--- /dev/null
+++ b/server/apps/supervision/migrations/0053_record_dept_top_yes.py
@@ -0,0 +1,18 @@
+# Generated by Django 3.2.12 on 2024-03-22 02:55
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('supervision', '0052_task_cate'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='record',
+ name='dept_top_yes',
+ field=models.BooleanField(default=True, verbose_name='事业部是否确认'),
+ ),
+ ]
diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py
index 8ebb62c..ab8b1a7 100644
--- a/server/apps/supervision/models.py
+++ b/server/apps/supervision/models.py
@@ -85,6 +85,7 @@ class Record(CommonBModel):
noteb = models.TextField('报送说明', null=True, blank=True)
files = models.ManyToManyField(File, verbose_name="关联文件")
dept_yes = models.BooleanField('二级单位是否确认', default=True)
+ dept_top_yes = models.BooleanField('事业部是否确认', default=True)
class Meta:
verbose_name = '报送记录'
verbose_name_plural = verbose_name
diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py
index 0f69e87..69e7e21 100644
--- a/server/apps/supervision/views.py
+++ b/server/apps/supervision/views.py
@@ -315,6 +315,8 @@ class RecordViewSet(RbacFilterSet, PageOrNot, CreateUpdateCustomMixin, ModelView
obj.state = '已报送'
if obj.belong_dept.type.name=='2级公司':
obj.dept_yes = True
+ if obj.belong_dept.type.name=='事业部':
+ obj.dept_yes_top = True
obj.up_user = request.user
obj.up_date = timezone.now()
obj.save()
@@ -351,6 +353,17 @@ class RecordViewSet(RbacFilterSet, PageOrNot, CreateUpdateCustomMixin, ModelView
obj.save()
return Response(status=status.HTTP_200_OK)
return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
+ @action(methods=['put'], detail=True, perms_map = {'put':'record_detconfirm_top'})
+ def deptconfirm_top(self, request, *args, **kwargs):
+ """
+ 事业部确认
+ """
+ obj = self.get_object()
+ if obj.state in ['已报送']:
+ obj.dept_top_yes = True
+ obj.save()
+ return Response(status=status.HTTP_200_OK)
+ return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
@action(methods=['put'], detail=True, perms_map = {'put':'record_confirm'})
def confirm(self, request, *args, **kwargs):
"""
@@ -583,6 +596,11 @@ class Domixin:
instance = serializer.save()
self.countup_task2do(instance.task2do)
+ @transaction.atomic
+ def perform_update(self, serializer):
+ instance = serializer.save()
+ self.countup_task2do(instance.task2do)
+
@transaction.atomic
def perform_destroy(self, instance):
task2do = instance.task2do
@@ -603,6 +621,13 @@ class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
self.countup_task2do(instance.task2do)
class ImpMixin:
+ def get_queryset(self):
+ mydept = self.request.user.dept
+ qs = super().get_queryset()
+ if has_permission('task2', self.request.user):
+ return qs
+ return qs.filter(belong_dept=mydept)
+
def format_date(self, ind, val):
new_val = val
if isinstance(val, datetime.datetime):
@@ -626,10 +651,10 @@ class ImpMixin:
return i[0]
raise ParseError('第{}: 请选择固定选项值'.format(ind))
- def make_data(self, data, sheet, i, etype):
+ def F(self, data, sheet, i, etype):
raise NotImplementedError()
- def gen_imp_view(self, request, start: int, mySerializer, etype=0):
+ def gen_imp_view(self, request, start: int, mySerializer, etype=0, mymodel=None, repalce=None, types=None):
sr = ImpSerializer(data=request.data)
sr.is_valid(raise_exception=True)
vdata = sr.validated_data
@@ -646,6 +671,18 @@ class ImpMixin:
data = {}
data['task2do'] = task2do.id
data = self.make_data(data, sheet, i, etype)
+ # 对于能力验证和监督检查进行有则跳过无则更新操作。
+ if repalce:
+ if types.lower()== 'pt':
+ model_info = mymodel.objects.filter(name=data.get('name'), number=data.get('number'))
+ if model_info:
+ i = i + 1
+ continue
+ elif types.lower() == 'oinspect':
+ model_info = mymodel.objects.filter(checker=data.get('checker'), date_inspect=data.get('date_inspect'))
+ if model_info:
+ i = i + 1
+ continue
datalist.append(data)
i = i + 1
sr = mySerializer(data=datalist, many=True, context={'request': request})
@@ -744,6 +781,7 @@ class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
}
filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year', 'task2do__task2']
+
def make_data(self, data, sheet, i, etype):
data['name'] = sheet['b'+str(i)].value
data['number'] = sheet['c'+str(i)].value
@@ -760,7 +798,7 @@ class PtViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
导入表格
"""
- return self.gen_imp_view(request, 5, PtSerializer)
+ return self.gen_imp_view(request, 5, PtSerializer, 0, Pt, repalce=True, types='pt')
class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
@@ -810,4 +848,4 @@ class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
导入表格
"""
- return self.gen_imp_view(request, 5, OinspectSerializer)
\ No newline at end of file
+ return self.gen_imp_view(request, 5, OinspectSerializer, 0, Oinspect, repalce=True, types="oinspect")
\ No newline at end of file
diff --git a/server/server/settings.py b/server/server/settings.py
index aa87013..75a22ea 100644
--- a/server/server/settings.py
+++ b/server/server/settings.py
@@ -11,11 +11,13 @@ https://docs.djangoproject.com/en/3.0/ref/settings/
"""
from datetime import datetime, timedelta
-import os
+import os, sys
+
+
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
-
+sys.path.insert(0, os.path.join(BASE_DIR, 'apps'))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
@@ -23,6 +25,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'ez9z3a4m*$%srn9ve_t71yd!v+&xn9@0k(e(+l6#g1h=e5i4da'
+
# SECURITY WARNING: don't run with debug turned on in production!
@@ -51,8 +54,8 @@ INSTALLED_APPS = [
'apps.consulting',
'apps.exam',
'apps.ops',
- 'apps.edu'
-
+ 'apps.edu',
+ 'apps.information'
]
MIDDLEWARE = [
diff --git a/server/server/settings_dev.py b/server/server/settings_dev.py
index 28f1715..2de3278 100644
--- a/server/server/settings_dev.py
+++ b/server/server/settings_dev.py
@@ -9,12 +9,21 @@ DATABASES = {
# 'HOST': '47.95.0.242',
# 'PORT': '5432',
# },
- 'default': {
+# 'default': {
+# 'ENGINE': 'django.db.backends.postgresql',
+# 'NAME': 'cma',
+# 'USER': 'cma',
+# 'PASSWORD': 'cma123',
+# 'HOST': '172.16.80.102',
+# # 'HOST': '1.203.161.102',
+# 'PORT': '5432',
+# }
+ 'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'cma',
- 'USER': 'cma',
- 'PASSWORD': 'cma123',
- 'HOST': '172.16.80.102',
+ 'USER': 'postgres',
+ 'PASSWORD': 'zcDsj2021',
+ 'HOST': '49.232.14.174',
# 'HOST': '1.203.161.102',
'PORT': '5432',
}