Merge branch 'master' of https://e.coding.net/ctcdevteam/cma_search
This commit is contained in:
commit
bb5bbb7fb7
|
@ -3,8 +3,8 @@ ENV = 'development'
|
||||||
|
|
||||||
# base api
|
# base api
|
||||||
#VUE_APP_BASE_API = 'http://10.0.11.127:8000/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 = 'http://127.0.0.1:2222/api'
|
||||||
VUE_APP_BASE_API = 'https://testsearch.ctc.ac.cn/api'
|
# VUE_APP_BASE_API = 'https://testsearch.ctc.ac.cn/api'
|
||||||
|
|
||||||
#VUE_APP_BASE_API = 'http://47.95.0.242:9101/api'
|
#VUE_APP_BASE_API = 'http://47.95.0.242:9101/api'
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
"normalize.css": "7.0.0",
|
"normalize.css": "7.0.0",
|
||||||
"nprogress": "0.2.0",
|
"nprogress": "0.2.0",
|
||||||
"path-to-regexp": "2.4.0",
|
"path-to-regexp": "2.4.0",
|
||||||
"pdfobject": "^2.2.12",
|
"pdfobject": "^2.3.0",
|
||||||
"vod-js-sdk-v6": "^1.4.12",
|
"vod-js-sdk-v6": "^1.4.12",
|
||||||
"vue": "2.6.10",
|
"vue": "2.6.10",
|
||||||
"vue-pdf": "^4.2.0",
|
"vue-pdf": "^4.2.0",
|
||||||
|
|
|
@ -85,3 +85,11 @@ export function deptconfirm(id) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function deptconfirm_top(id) {
|
||||||
|
return request({
|
||||||
|
url: `/supervision/record/${id}/deptconfirm_top/`,
|
||||||
|
method: 'put',
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,7 @@ export const asyncRoutes = [
|
||||||
path: 'other',
|
path: 'other',
|
||||||
name: 'other',
|
name: 'other',
|
||||||
component: () => import('@/views/supervision/task.vue'),
|
component: () => import('@/views/supervision/task.vue'),
|
||||||
meta: { title: '其他任务'}
|
meta: { title: '其他任务', perms: ['task2']}
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -289,7 +289,7 @@ export const asyncRoutes = [
|
||||||
path: 'taskdo/:id',
|
path: 'taskdo/:id',
|
||||||
name: 'Taskdo',
|
name: 'Taskdo',
|
||||||
component: () => import('@/views/supervision/taskdo.vue'),
|
component: () => import('@/views/supervision/taskdo.vue'),
|
||||||
meta: { title: '报送任务执行', perms: ['task_view'] },
|
meta: { title: '报送任务执行', perms: ['task2'] },
|
||||||
hidden: true
|
hidden: true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,6 +50,12 @@
|
||||||
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
<el-table-column label="事业部确认">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag v-if="scope.row.dept_top_yes" effect="plain">已确认</el-tag>
|
||||||
|
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="记录状态">
|
<el-table-column label="记录状态">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
<el-tag type="danger" v-if="scope.row.state == '待报送'">{{
|
<el-tag type="danger" v-if="scope.row.state == '待报送'">{{
|
||||||
|
@ -108,6 +114,16 @@
|
||||||
@click="handleRecord({ action: 'deptconfirm', record: scope.row })"
|
@click="handleRecord({ action: 'deptconfirm', record: scope.row })"
|
||||||
>二级单位确认</el-link
|
>二级单位确认</el-link
|
||||||
>
|
>
|
||||||
|
<el-link
|
||||||
|
v-if="
|
||||||
|
scope.row.dept_top_yes == false && scope.row.state == '已报送' &&
|
||||||
|
checkPermission(['record_detconfirm_top'])
|
||||||
|
"
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
@click="handleRecord({ action: 'deptconfirm_top', record: scope.row })"
|
||||||
|
>事业部确认</el-link
|
||||||
|
>
|
||||||
<el-link
|
<el-link
|
||||||
v-if="
|
v-if="
|
||||||
(scope.row.state == '已报送' || scope.row.state == '待整改') &&
|
(scope.row.state == '已报送' || scope.row.state == '待整改') &&
|
||||||
|
|
|
@ -162,6 +162,12 @@
|
||||||
<el-tag v-if="scope.row.dept_yes" effect="plain">已确认</el-tag>
|
<el-tag v-if="scope.row.dept_yes" effect="plain">已确认</el-tag>
|
||||||
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="事业部确认">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag v-if="scope.row.dept_yes_top" effect="plain">已确认</el-tag>
|
||||||
|
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
||||||
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="记录状态">
|
<el-table-column label="记录状态">
|
||||||
<template slot-scope="scope">
|
<template slot-scope="scope">
|
||||||
|
|
|
@ -142,7 +142,9 @@ import {
|
||||||
rejectRecord,
|
rejectRecord,
|
||||||
confirmRecord,
|
confirmRecord,
|
||||||
deleteRecord,
|
deleteRecord,
|
||||||
deptconfirm
|
deptconfirm,
|
||||||
|
deptconfirm_top
|
||||||
|
|
||||||
} from "@/api/record";
|
} from "@/api/record";
|
||||||
export default {
|
export default {
|
||||||
name: "recorddo",
|
name: "recorddo",
|
||||||
|
@ -230,9 +232,12 @@ export default {
|
||||||
this.$message.success("二级单位确认成功");
|
this.$message.success("二级单位确认成功");
|
||||||
this.$emit("handleDo",true);
|
this.$emit("handleDo",true);
|
||||||
});
|
});
|
||||||
|
} else if (this.data.action == "deptconfirm_top") {
|
||||||
}
|
deptconfirm_top(this.record.id).then((res) => {
|
||||||
else if (this.data.action == "reject") {
|
this.$message.success("事业部确认成功");
|
||||||
|
this.$emit("handleDo",true);
|
||||||
|
});
|
||||||
|
} else if (this.data.action == "reject") {
|
||||||
rejectRecord(this.record.id, this.record).then((res) => {
|
rejectRecord(this.record.id, this.record).then((res) => {
|
||||||
this.$message.success("成功");
|
this.$message.success("成功");
|
||||||
this.$emit("handleDo",true);
|
this.$emit("handleDo",true);
|
||||||
|
|
|
@ -257,6 +257,12 @@
|
||||||
<el-tag v-if="scope.row.dept_yes" effect="plain">已确认</el-tag>
|
<el-tag v-if="scope.row.dept_yes" effect="plain">已确认</el-tag>
|
||||||
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
||||||
</template>
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="事业部确认">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-tag v-if="scope.row.dept_yes_top" effect="plain">已确认</el-tag>
|
||||||
|
<el-tag type="danger" effect="plain" v-else>未确认</el-tag>
|
||||||
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="报送要求/备注">
|
<el-table-column label="报送要求/备注">
|
||||||
<template slot-scope="scope">{{ scope.row.note }}</template>
|
<template slot-scope="scope">{{ scope.row.note }}</template>
|
||||||
|
|
|
@ -1036,7 +1036,7 @@
|
||||||
},
|
},
|
||||||
getPtList(){
|
getPtList(){
|
||||||
let that = this;
|
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) {
|
if (res.code >= 200) {
|
||||||
that.ptList=res.data;
|
that.ptList=res.data;
|
||||||
}
|
}
|
||||||
|
@ -1060,7 +1060,7 @@
|
||||||
},
|
},
|
||||||
getOinspectList(){
|
getOinspectList(){
|
||||||
let that = this;
|
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) {
|
if (res.code >= 200) {
|
||||||
that.oinspectList=res.data;
|
that.oinspectList=res.data;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
# Register your models here.
|
|
@ -0,0 +1,5 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class InformationConfig(AppConfig):
|
||||||
|
name = 'information'
|
|
@ -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',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
|
@ -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
|
|
@ -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__'
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
|
@ -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)),]
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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='事业部是否确认'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -85,6 +85,7 @@ class Record(CommonBModel):
|
||||||
noteb = models.TextField('报送说明', null=True, blank=True)
|
noteb = models.TextField('报送说明', null=True, blank=True)
|
||||||
files = models.ManyToManyField(File, verbose_name="关联文件")
|
files = models.ManyToManyField(File, verbose_name="关联文件")
|
||||||
dept_yes = models.BooleanField('二级单位是否确认', default=True)
|
dept_yes = models.BooleanField('二级单位是否确认', default=True)
|
||||||
|
dept_top_yes = models.BooleanField('事业部是否确认', default=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = '报送记录'
|
verbose_name = '报送记录'
|
||||||
verbose_name_plural = verbose_name
|
verbose_name_plural = verbose_name
|
||||||
|
|
|
@ -315,6 +315,8 @@ class RecordViewSet(RbacFilterSet, PageOrNot, CreateUpdateCustomMixin, ModelView
|
||||||
obj.state = '已报送'
|
obj.state = '已报送'
|
||||||
if obj.belong_dept.type.name=='2级公司':
|
if obj.belong_dept.type.name=='2级公司':
|
||||||
obj.dept_yes = True
|
obj.dept_yes = True
|
||||||
|
if obj.belong_dept.type.name=='事业部':
|
||||||
|
obj.dept_yes_top = True
|
||||||
obj.up_user = request.user
|
obj.up_user = request.user
|
||||||
obj.up_date = timezone.now()
|
obj.up_date = timezone.now()
|
||||||
obj.save()
|
obj.save()
|
||||||
|
@ -351,6 +353,17 @@ class RecordViewSet(RbacFilterSet, PageOrNot, CreateUpdateCustomMixin, ModelView
|
||||||
obj.save()
|
obj.save()
|
||||||
return Response(status=status.HTTP_200_OK)
|
return Response(status=status.HTTP_200_OK)
|
||||||
return Response('记录状态错误', status=status.HTTP_400_BAD_REQUEST)
|
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'})
|
@action(methods=['put'], detail=True, perms_map = {'put':'record_confirm'})
|
||||||
def confirm(self, request, *args, **kwargs):
|
def confirm(self, request, *args, **kwargs):
|
||||||
"""
|
"""
|
||||||
|
@ -583,6 +596,11 @@ class Domixin:
|
||||||
instance = serializer.save()
|
instance = serializer.save()
|
||||||
self.countup_task2do(instance.task2do)
|
self.countup_task2do(instance.task2do)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def perform_update(self, serializer):
|
||||||
|
instance = serializer.save()
|
||||||
|
self.countup_task2do(instance.task2do)
|
||||||
|
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def perform_destroy(self, instance):
|
def perform_destroy(self, instance):
|
||||||
task2do = instance.task2do
|
task2do = instance.task2do
|
||||||
|
@ -603,6 +621,13 @@ class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
self.countup_task2do(instance.task2do)
|
self.countup_task2do(instance.task2do)
|
||||||
|
|
||||||
class ImpMixin:
|
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):
|
def format_date(self, ind, val):
|
||||||
new_val = val
|
new_val = val
|
||||||
if isinstance(val, datetime.datetime):
|
if isinstance(val, datetime.datetime):
|
||||||
|
@ -626,10 +651,10 @@ class ImpMixin:
|
||||||
return i[0]
|
return i[0]
|
||||||
raise ParseError('第{}: 请选择固定选项值'.format(ind))
|
raise ParseError('第{}: 请选择固定选项值'.format(ind))
|
||||||
|
|
||||||
def make_data(self, data, sheet, i, etype):
|
def F(self, data, sheet, i, etype):
|
||||||
raise NotImplementedError()
|
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 = ImpSerializer(data=request.data)
|
||||||
sr.is_valid(raise_exception=True)
|
sr.is_valid(raise_exception=True)
|
||||||
vdata = sr.validated_data
|
vdata = sr.validated_data
|
||||||
|
@ -646,6 +671,18 @@ class ImpMixin:
|
||||||
data = {}
|
data = {}
|
||||||
data['task2do'] = task2do.id
|
data['task2do'] = task2do.id
|
||||||
data = self.make_data(data, sheet, i, etype)
|
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)
|
datalist.append(data)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
sr = mySerializer(data=datalist, many=True, context={'request': request})
|
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']
|
filterset_fields = ['task2do', 'task2do__belong_dept', 'task2do__task2__year', 'task2do__task2']
|
||||||
|
|
||||||
|
|
||||||
def make_data(self, data, sheet, i, etype):
|
def make_data(self, data, sheet, i, etype):
|
||||||
data['name'] = sheet['b'+str(i)].value
|
data['name'] = sheet['b'+str(i)].value
|
||||||
data['number'] = sheet['c'+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):
|
class RiskViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
@ -810,4 +848,4 @@ class OinspectViewSet(ImpMixin, Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
|
||||||
导入表格
|
导入表格
|
||||||
"""
|
"""
|
||||||
return self.gen_imp_view(request, 5, OinspectSerializer)
|
return self.gen_imp_view(request, 5, OinspectSerializer, 0, Oinspect, repalce=True, types="oinspect")
|
|
@ -11,11 +11,13 @@ https://docs.djangoproject.com/en/3.0/ref/settings/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
import os
|
import os, sys
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
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
|
# Quick-start development settings - unsuitable for production
|
||||||
# See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/
|
# 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!
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
SECRET_KEY = 'ez9z3a4m*$%srn9ve_t71yd!v+&xn9@0k(e(+l6#g1h=e5i4da'
|
SECRET_KEY = 'ez9z3a4m*$%srn9ve_t71yd!v+&xn9@0k(e(+l6#g1h=e5i4da'
|
||||||
|
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,8 +54,8 @@ INSTALLED_APPS = [
|
||||||
'apps.consulting',
|
'apps.consulting',
|
||||||
'apps.exam',
|
'apps.exam',
|
||||||
'apps.ops',
|
'apps.ops',
|
||||||
'apps.edu'
|
'apps.edu',
|
||||||
|
'apps.information'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|
|
@ -9,12 +9,21 @@ DATABASES = {
|
||||||
# 'HOST': '47.95.0.242',
|
# 'HOST': '47.95.0.242',
|
||||||
# 'PORT': '5432',
|
# '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',
|
'ENGINE': 'django.db.backends.postgresql',
|
||||||
'NAME': 'cma',
|
'NAME': 'cma',
|
||||||
'USER': 'cma',
|
'USER': 'postgres',
|
||||||
'PASSWORD': 'cma123',
|
'PASSWORD': 'zcDsj2021',
|
||||||
'HOST': '172.16.80.102',
|
'HOST': '49.232.14.174',
|
||||||
# 'HOST': '1.203.161.102',
|
# 'HOST': '1.203.161.102',
|
||||||
'PORT': '5432',
|
'PORT': '5432',
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue