feat: 完成大部门新日常监督接口
This commit is contained in:
parent
69f0f2f157
commit
c6fd6b93ab
|
|
@ -0,0 +1,216 @@
|
||||||
|
# Generated by Django 3.0.5 on 2023-05-15 06:53
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('system', '0022_delete_historicaldict'),
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('supervision', '0034_auto_20230308_1204'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Task2',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('year', models.PositiveSmallIntegerField(default=2023, verbose_name='年份')),
|
||||||
|
('cycle', models.PositiveSmallIntegerField(default=0, help_text='1-6个周期', verbose_name='所属周期')),
|
||||||
|
('type', models.PositiveSmallIntegerField(choices=[(10, '目标制定'), (20, '日常监督')], default=20, verbose_name='任务类型')),
|
||||||
|
('state', models.PositiveSmallIntegerField(choices=[(10, '创建中'), (20, '进行中'), (30, '已关闭')], default=20, verbose_name='任务状态')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='task2_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='task2_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Task2Do',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('count_up', models.PositiveSmallIntegerField(default=0, verbose_name='完成上报内容数')),
|
||||||
|
('count_all', models.PositiveSmallIntegerField(default=8, verbose_name='需上报内容数')),
|
||||||
|
('num_issue', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='已发放报告数量')),
|
||||||
|
('num_expect', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='应发报告数')),
|
||||||
|
('num_error', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='不准确报告数')),
|
||||||
|
('num_overdue', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='超期报告数')),
|
||||||
|
('num_complaint', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='客户投诉数')),
|
||||||
|
('num_pt', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='能力验证数')),
|
||||||
|
('num_risk', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='风险识别数')),
|
||||||
|
('num_ocheck', models.PositiveSmallIntegerField(blank=True, null=True, verbose_name='外部检查数')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='task2do_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='task2do_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('task2', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='task2dept_task2', to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='task2do_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Risk',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='内容')),
|
||||||
|
('level', models.PositiveSmallIntegerField(choices=[(10, '主要风险'), (20, '严重风险'), (30, '重大风险')], default=10, verbose_name='风险等级')),
|
||||||
|
('code', models.CharField(max_length=100, verbose_name='风险代码')),
|
||||||
|
('state', models.PositiveSmallIntegerField(choices=[(10, '未整改'), (20, '整改中'), (30, '整改完成')], default=10, verbose_name='整改状态')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='risk_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='risk_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('task2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='risk_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Rc',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('number', models.CharField(max_length=100, verbose_name='报告证书编号')),
|
||||||
|
('etype', models.PositiveSmallIntegerField(choices=[(10, '出错'), (20, '超期')], default=0, verbose_name='异常情况')),
|
||||||
|
('number_correct', models.CharField(blank=True, default='', max_length=100, verbose_name='更改后报告证书编号')),
|
||||||
|
('reason_error', models.CharField(blank=True, default='', max_length=100, verbose_name='出错原因')),
|
||||||
|
('date_accept', models.DateField(blank=True, null=True, verbose_name='业务受理日期')),
|
||||||
|
('date_expect', models.DateField(blank=True, null=True, verbose_name='预计发放日期')),
|
||||||
|
('date_issue', models.DateField(blank=True, null=True, verbose_name='实际发放日期')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rc_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rc_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('task2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rc_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Pt',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('name', models.CharField(max_length=100, verbose_name='名称')),
|
||||||
|
('number', models.CharField(max_length=100, verbose_name='编号')),
|
||||||
|
('organizer', models.CharField(max_length=100, verbose_name='组织方')),
|
||||||
|
('params', models.TextField(verbose_name='参加参数名称')),
|
||||||
|
('result', models.PositiveSmallIntegerField(choices=[(10, '满意'), (20, '有问题'), (30, '不满意')], default=10, verbose_name='结果')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pt_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pt_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('task2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pt_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='PgoalDept',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('year', models.PositiveSmallIntegerField(default=2023, verbose_name='年份')),
|
||||||
|
('goal_name', models.CharField(max_length=100, verbose_name='目标名称')),
|
||||||
|
('goal_key', models.CharField(blank=True, default='other', max_length=100, verbose_name='目标key值')),
|
||||||
|
('goal_value_a', models.FloatField(blank=True, default=0, verbose_name='基础值')),
|
||||||
|
('goal_value_b', models.FloatField(default=0, verbose_name='设定值')),
|
||||||
|
('goal_value_c', models.FloatField(blank=True, default=0, verbose_name='实际值')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoaldept_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoaldept_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('goal_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='goal_file', to='system.File', verbose_name='当前文件ID')),
|
||||||
|
('goal_files', models.ManyToManyField(blank=True, related_name='goal_files', to='system.File', verbose_name='历史文件')),
|
||||||
|
('task2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoaldept_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Pgoal',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('year', models.PositiveSmallIntegerField(default=2023, unique=True, verbose_name='年份')),
|
||||||
|
('pgoal_1', models.FloatField(default=0, verbose_name='重大质量事故-基础值')),
|
||||||
|
('pgoal_2', models.FloatField(default=0, verbose_name='报告/证书合格率-基础值')),
|
||||||
|
('pgoal_3', models.FloatField(default=0, verbose_name='报告/证书及时率-基础值')),
|
||||||
|
('pgoal_4', models.FloatField(default=0, verbose_name='能力验证满意率-基础值')),
|
||||||
|
('pgoal_5', models.FloatField(default=0, verbose_name='客户投诉处理满意率-基础值')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('pgoal_1_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_1_file', to='system.File')),
|
||||||
|
('pgoal_2_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_2_file', to='system.File')),
|
||||||
|
('pgoal_3_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_3_file', to='system.File')),
|
||||||
|
('pgoal_4_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_4_file', to='system.File')),
|
||||||
|
('pgoal_5_file', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_5_file', to='system.File')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='pgoal_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Oinspect',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('cate', models.PositiveSmallIntegerField(choices=[(10, '市场监管部门检查'), (20, '行业主管部门检查'), (30, '其他检查')], default=30, verbose_name='检查分类')),
|
||||||
|
('checker', models.CharField(max_length=100, verbose_name='检查方')),
|
||||||
|
('date_inspect', models.DateField(verbose_name='检查日期')),
|
||||||
|
('result', models.TextField(verbose_name='检查结果')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='oinspect_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='oinspect_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('task2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='oinspect_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Complaint',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, 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='删除标记')),
|
||||||
|
('complainant', models.CharField(max_length=100, verbose_name='投诉人')),
|
||||||
|
('content', models.TextField(verbose_name='投诉内容')),
|
||||||
|
('date_occurrence', models.DateField(verbose_name='投诉日期')),
|
||||||
|
('date_feedback', models.DateField(verbose_name='反馈日期')),
|
||||||
|
('is_satisfied', models.BooleanField(default=True, verbose_name='是否满意')),
|
||||||
|
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_belong_dept', to='system.Organization', verbose_name='所属部门')),
|
||||||
|
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
|
||||||
|
('task2', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2', verbose_name='关联任务')),
|
||||||
|
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complaint_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Generated by Django 3.0.5 on 2023-05-15 09:18
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('system', '0022_delete_historicaldict'),
|
||||||
|
('supervision', '0035_complaint_oinspect_pgoal_pgoaldept_pt_rc_risk_task2_task2do'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='goal_o_file',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='goal_o_file', to='system.File', verbose_name='原文件ID'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='task2',
|
||||||
|
name='depts',
|
||||||
|
field=models.ManyToManyField(blank=True, through='supervision.Task2Do', to='system.Organization', verbose_name='执行公司'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Generated by Django 3.0.5 on 2023-05-17 01:44
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('supervision', '0036_auto_20230515_1718'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='goal_value_a',
|
||||||
|
field=models.FloatField(verbose_name='基础值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='goal_value_b',
|
||||||
|
field=models.FloatField(verbose_name='设定值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='goal_value_c',
|
||||||
|
field=models.FloatField(blank=True, null=True, verbose_name='实际值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='year',
|
||||||
|
field=models.PositiveSmallIntegerField(verbose_name='年份'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,43 @@
|
||||||
|
# Generated by Django 3.0.5 on 2023-05-17 01:51
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('supervision', '0037_auto_20230517_0944'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoal',
|
||||||
|
name='pgoal_1',
|
||||||
|
field=models.FloatField(verbose_name='重大质量事故-基础值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoal',
|
||||||
|
name='pgoal_2',
|
||||||
|
field=models.FloatField(verbose_name='报告/证书合格率-基础值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoal',
|
||||||
|
name='pgoal_3',
|
||||||
|
field=models.FloatField(verbose_name='报告/证书及时率-基础值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoal',
|
||||||
|
name='pgoal_4',
|
||||||
|
field=models.FloatField(verbose_name='能力验证满意率-基础值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoal',
|
||||||
|
name='pgoal_5',
|
||||||
|
field=models.FloatField(verbose_name='客户投诉处理满意率-基础值'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='pgoal',
|
||||||
|
name='year',
|
||||||
|
field=models.PositiveSmallIntegerField(unique=True, verbose_name='年份'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,68 @@
|
||||||
|
# Generated by Django 3.0.5 on 2023-05-17 06:19
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('supervision', '0038_auto_20230517_0951'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='complaint',
|
||||||
|
name='task2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='oinspect',
|
||||||
|
name='task2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='task2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='pt',
|
||||||
|
name='task2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='rc',
|
||||||
|
name='task2',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='risk',
|
||||||
|
name='task2',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='complaint',
|
||||||
|
name='task2do',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2Do', verbose_name='关联任务执行'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='oinspect',
|
||||||
|
name='task2do',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2Do', verbose_name='关联任务执行'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='pgoaldept',
|
||||||
|
name='task2do',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2Do', verbose_name='关联任务执行'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='pt',
|
||||||
|
name='task2do',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2Do', verbose_name='关联任务执行'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='rc',
|
||||||
|
name='task2do',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2Do', verbose_name='关联任务执行'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='risk',
|
||||||
|
name='task2do',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='supervision.Task2Do', verbose_name='关联任务执行'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -113,3 +113,163 @@ class TAction(CommonAModel):
|
||||||
reason_2 = models.ForeignKey(Dict, verbose_name='变更次要原因', related_name='taction_r2', on_delete= models.SET_NULL, null=True, blank=True)
|
reason_2 = models.ForeignKey(Dict, verbose_name='变更次要原因', related_name='taction_r2', on_delete= models.SET_NULL, null=True, blank=True)
|
||||||
value_old = JSONField('原值', null=True, blank=True, default=dict)
|
value_old = JSONField('原值', null=True, blank=True, default=dict)
|
||||||
value_new = JSONField('新值', null=True, blank=True, default=dict)
|
value_new = JSONField('新值', null=True, blank=True, default=dict)
|
||||||
|
|
||||||
|
class Pgoal(CommonAModel):
|
||||||
|
"""
|
||||||
|
基础目标
|
||||||
|
"""
|
||||||
|
basedict = {
|
||||||
|
"pgoal_1": "重大质量事故",
|
||||||
|
"pgoal_2": "报告/证书合格率",
|
||||||
|
"pgoal_3": "报告/证书及时率",
|
||||||
|
"pgoal_4": "能力验证满意率",
|
||||||
|
"pgoal_5": "客户投诉处理满意率"
|
||||||
|
}
|
||||||
|
year = models.PositiveSmallIntegerField('年份', unique=True)
|
||||||
|
pgoal_1 = models.FloatField('重大质量事故-基础值')
|
||||||
|
pgoal_2 = models.FloatField('报告/证书合格率-基础值')
|
||||||
|
pgoal_3 = models.FloatField('报告/证书及时率-基础值')
|
||||||
|
pgoal_4 = models.FloatField('能力验证满意率-基础值')
|
||||||
|
pgoal_5 = models.FloatField('客户投诉处理满意率-基础值')
|
||||||
|
pgoal_1_file = models.ForeignKey(File, related_name='pgoal_1_file', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
pgoal_2_file = models.ForeignKey(File, related_name='pgoal_2_file', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
pgoal_3_file = models.ForeignKey(File, related_name='pgoal_3_file', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
pgoal_4_file = models.ForeignKey(File, related_name='pgoal_4_file', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
pgoal_5_file = models.ForeignKey(File, related_name='pgoal_5_file', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
class Task2(CommonAModel):
|
||||||
|
"""
|
||||||
|
报送任务2
|
||||||
|
"""
|
||||||
|
TASK2_CREATE = 10
|
||||||
|
TASK2_DOING = 20
|
||||||
|
TASK2_CLOSE = 30
|
||||||
|
TASK2_STATES = (
|
||||||
|
(TASK2_CREATE, '创建中'),
|
||||||
|
(TASK2_DOING, '进行中'),
|
||||||
|
(TASK2_CLOSE, '已关闭'),
|
||||||
|
)
|
||||||
|
TASK2_F = 10
|
||||||
|
TASK2_S = 20
|
||||||
|
TASK2_TYPES = (
|
||||||
|
(TASK2_F, '目标制定'),
|
||||||
|
(TASK2_S, '日常监督')
|
||||||
|
)
|
||||||
|
|
||||||
|
year = models.PositiveSmallIntegerField('年份', default=2023)
|
||||||
|
cycle = models.PositiveSmallIntegerField('所属周期', default=0, help_text='1-6个周期')
|
||||||
|
type = models.PositiveSmallIntegerField('任务类型', choices=TASK2_TYPES, default=20)
|
||||||
|
state = models.PositiveSmallIntegerField('任务状态', choices=TASK2_STATES, default=20)
|
||||||
|
depts = models.ManyToManyField(Organization, verbose_name='执行公司', through='supervision.task2do', blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Task2Do(CommonBModel):
|
||||||
|
"""任务执行情况
|
||||||
|
"""
|
||||||
|
task2 = models.ForeignKey(Task2, verbose_name='关联任务', on_delete=models.CASCADE, related_name='task2dept_task2')
|
||||||
|
count_up = models.PositiveSmallIntegerField('完成上报内容数', default=0)
|
||||||
|
count_all = models.PositiveSmallIntegerField('需上报内容数', default=8)
|
||||||
|
|
||||||
|
num_issue = models.PositiveSmallIntegerField('已发放报告数量', null=True, blank=True)
|
||||||
|
num_expect = models.PositiveSmallIntegerField('应发报告数', null=True, blank=True)
|
||||||
|
|
||||||
|
num_error = models.PositiveSmallIntegerField('不准确报告数', null=True, blank=True)
|
||||||
|
num_overdue = models.PositiveSmallIntegerField('超期报告数', null=True, blank=True)
|
||||||
|
num_complaint = models.PositiveSmallIntegerField('客户投诉数', null=True, blank=True)
|
||||||
|
num_pt = models.PositiveSmallIntegerField('能力验证数', null=True, blank=True)
|
||||||
|
num_risk = models.PositiveSmallIntegerField('风险识别数', null=True, blank=True)
|
||||||
|
num_ocheck = models.PositiveSmallIntegerField('外部检查数', null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class PgoalDept(CommonBModel):
|
||||||
|
"""企业年度目标值
|
||||||
|
"""
|
||||||
|
year = models.PositiveSmallIntegerField('年份')
|
||||||
|
goal_name = models.CharField('目标名称', max_length=100)
|
||||||
|
goal_key = models.CharField('目标key值', max_length=100, default='other', blank=True)
|
||||||
|
goal_value_a = models.FloatField('基础值')
|
||||||
|
goal_o_file = models.ForeignKey(File, related_name='goal_o_file', verbose_name='原文件ID', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
goal_value_b = models.FloatField('设定值')
|
||||||
|
goal_value_c = models.FloatField('实际值', null=True, blank=True)
|
||||||
|
goal_file = models.ForeignKey(File, related_name='goal_file', verbose_name='当前文件ID', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
goal_files = models.ManyToManyField(File, related_name='goal_files', verbose_name='历史文件', blank=True)
|
||||||
|
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Rc(CommonBModel):
|
||||||
|
"""报告或证书
|
||||||
|
"""
|
||||||
|
etype_choices = (
|
||||||
|
(10, '出错'),
|
||||||
|
(20, '超期')
|
||||||
|
)
|
||||||
|
number = models.CharField('报告证书编号', max_length=100)
|
||||||
|
etype = models.PositiveSmallIntegerField('异常情况', default=0, choices=etype_choices)
|
||||||
|
number_correct = models.CharField('更改后报告证书编号', max_length=100, default='', blank=True)
|
||||||
|
reason_error = models.CharField('出错原因', max_length=100, default='', blank=True)
|
||||||
|
date_accept = models.DateField('业务受理日期', null=True, blank=True)
|
||||||
|
date_expect = models.DateField('预计发放日期', null=True, blank=True)
|
||||||
|
date_issue = models.DateField('实际发放日期', null=True, blank=True)
|
||||||
|
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Complaint(CommonBModel):
|
||||||
|
"""客户投诉
|
||||||
|
"""
|
||||||
|
complainant = models.CharField('投诉人', max_length=100)
|
||||||
|
content = models.TextField('投诉内容')
|
||||||
|
date_occurrence = models.DateField('投诉日期')
|
||||||
|
date_feedback = models.DateField('反馈日期')
|
||||||
|
is_satisfied = models.BooleanField('是否满意', default=True)
|
||||||
|
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Pt(CommonBModel):
|
||||||
|
"""能力验证
|
||||||
|
"""
|
||||||
|
pt_result_choices = (
|
||||||
|
(10, '满意'),
|
||||||
|
(20, '有问题'),
|
||||||
|
(30, '不满意')
|
||||||
|
)
|
||||||
|
name = models.CharField('名称', max_length=100)
|
||||||
|
number = models.CharField('编号', max_length=100)
|
||||||
|
organizer = models.CharField('组织方', max_length=100)
|
||||||
|
params = models.TextField('参加参数名称')
|
||||||
|
result = models.PositiveSmallIntegerField('结果', choices=pt_result_choices, default=10)
|
||||||
|
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Risk(CommonBModel):
|
||||||
|
"""风险识别
|
||||||
|
"""
|
||||||
|
risk_level_choices = (
|
||||||
|
(10, '主要风险'),
|
||||||
|
(20, '严重风险'),
|
||||||
|
(30, '重大风险')
|
||||||
|
)
|
||||||
|
risk_state_choices = (
|
||||||
|
(10, '未整改'),
|
||||||
|
(20, '整改中'),
|
||||||
|
(30, '整改完成')
|
||||||
|
)
|
||||||
|
content = models.TextField('内容')
|
||||||
|
level = models.PositiveSmallIntegerField('风险等级', choices=risk_level_choices, default=10)
|
||||||
|
code = models.CharField('风险代码', max_length=100)
|
||||||
|
state = models.PositiveSmallIntegerField('整改状态', choices=risk_state_choices, default=10)
|
||||||
|
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class Oinspect(CommonBModel):
|
||||||
|
"""外部检查
|
||||||
|
"""
|
||||||
|
oinspect_cate_choices = (
|
||||||
|
(10, '市场监管部门检查'),
|
||||||
|
(20, '行业主管部门检查'),
|
||||||
|
(30, '其他检查')
|
||||||
|
)
|
||||||
|
cate = models.PositiveSmallIntegerField('检查分类', choices=oinspect_cate_choices, default=30)
|
||||||
|
checker = models.CharField('检查方', max_length=100)
|
||||||
|
date_inspect = models.DateField('检查日期')
|
||||||
|
result = models.TextField('检查结果')
|
||||||
|
task2do = models.ForeignKey('supervision.task2do', verbose_name= '关联任务执行', on_delete=models.SET_NULL, null=True, blank=True)
|
||||||
|
|
@ -2,6 +2,7 @@ from django.db.models.base import Model
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import *
|
from .models import *
|
||||||
from apps.system.serializers import OrganizationSerializer,FileListSerializer,UserSimpleSerializer,OrganizationSimpleSerializer, FileSimpleSerializer
|
from apps.system.serializers import OrganizationSerializer,FileListSerializer,UserSimpleSerializer,OrganizationSimpleSerializer, FileSimpleSerializer
|
||||||
|
from rest_framework.exceptions import ParseError
|
||||||
|
|
||||||
|
|
||||||
class ContentSerializer(serializers.ModelSerializer):
|
class ContentSerializer(serializers.ModelSerializer):
|
||||||
|
|
@ -78,3 +79,101 @@ class TaskDeptSerializer(serializers.ModelSerializer):
|
||||||
def setup_eager_loading(queryset):
|
def setup_eager_loading(queryset):
|
||||||
queryset = queryset.select_related('task', 'dept')
|
queryset = queryset.select_related('task', 'dept')
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
|
class PgoalCreateUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = Pgoal
|
||||||
|
fields = ['year', 'pgoal_1', 'pgoal_2', 'pgoal_3', 'pgoal_4', 'pgoal_5', 'pgoal_1_file', 'pgoal_2_file', 'pgoal_3_file', 'pgoal_4_file', 'pgoal_5_file']
|
||||||
|
|
||||||
|
|
||||||
|
class PgoalSerializer(serializers.ModelSerializer):
|
||||||
|
pgoal_1_file_ = FileSimpleSerializer(source='pgoal_1_file', read_only=True)
|
||||||
|
pgoal_2_file_ = FileSimpleSerializer(source='pgoal_2_file', read_only=True)
|
||||||
|
pgoal_3_file_ = FileSimpleSerializer(source='pgoal_3_file', read_only=True)
|
||||||
|
pgoal_4_file_ = FileSimpleSerializer(source='pgoal_4_file', read_only=True)
|
||||||
|
pgoal_5_file_ = FileSimpleSerializer(source='pgoal_5_file', read_only=True)
|
||||||
|
class Meta:
|
||||||
|
model = Pgoal
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
|
||||||
|
# class Task2CreateUpdateSerializer(serializers.ModelSerializer):
|
||||||
|
# class Meta:
|
||||||
|
# model = Task2
|
||||||
|
# fields = ['year', 'cycle', 'type']
|
||||||
|
|
||||||
|
|
||||||
|
class Task2Serializer(serializers.ModelSerializer):
|
||||||
|
create_by_name = serializers.CharField(source='create_by.name', read_only=True)
|
||||||
|
class Meta:
|
||||||
|
model = Task2
|
||||||
|
fields = '__all__'
|
||||||
|
read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'belong_dept', 'state', 'is_deleted', 'depts']
|
||||||
|
|
||||||
|
def update(self, instance, validated_data):
|
||||||
|
validated_data.pop('type') # type不可编辑
|
||||||
|
if instance.state != Task2.TASK2_CLOSE:
|
||||||
|
raise ParseError('非创建状态不可编辑')
|
||||||
|
return super().update(instance, validated_data)
|
||||||
|
|
||||||
|
class Task2DeptsSerializer(serializers.Serializer):
|
||||||
|
ids = serializers.PrimaryKeyRelatedField(label="部门ID列表", many=True, queryset=Organization.objects.all())
|
||||||
|
|
||||||
|
|
||||||
|
class Task2DoSerializer(serializers.ModelSerializer):
|
||||||
|
belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True)
|
||||||
|
task2_ = Task2Serializer(source='task2', read_only=True)
|
||||||
|
class Meta:
|
||||||
|
model = Task2Do
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
class ValidateMixin:
|
||||||
|
def validate(self, attrs):
|
||||||
|
task2do = attrs.get('task2do', None)
|
||||||
|
if task2do:
|
||||||
|
if task2do.task2.state == Task2.TASK2_CLOSE:
|
||||||
|
raise ParseError('任务已关闭不可处理')
|
||||||
|
attrs['year'] = task2do.task2.year
|
||||||
|
attrs['belong_dept'] = task2do.task2.belong_dept
|
||||||
|
return attrs
|
||||||
|
|
||||||
|
class BaseMeta:
|
||||||
|
fields = '__all__'
|
||||||
|
read_only_fields = ['create_time', 'update_time', 'create_by', 'update_by', 'is_deleted']
|
||||||
|
|
||||||
|
class PgoalDeptSerializer(ValidateMixin, serializers.ModelSerializer):
|
||||||
|
goal_file_ = FileSimpleSerializer(source='goal_file', read_only=True)
|
||||||
|
class Meta(BaseMeta):
|
||||||
|
model = PgoalDept
|
||||||
|
read_only_fields = BaseMeta.read_only_fields + ['goal_value_a', 'goal_value_c', 'goal_files', 'goal_key']
|
||||||
|
|
||||||
|
|
||||||
|
class RcSerializer(ValidateMixin, serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta(BaseMeta):
|
||||||
|
model = Rc
|
||||||
|
|
||||||
|
class ComplaintSerializer(ValidateMixin, serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta(BaseMeta):
|
||||||
|
model = Complaint
|
||||||
|
|
||||||
|
class PtSerializer(ValidateMixin, serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta(BaseMeta):
|
||||||
|
model = Pt
|
||||||
|
|
||||||
|
class RiskSerializer(ValidateMixin, serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta(BaseMeta):
|
||||||
|
model = Risk
|
||||||
|
|
||||||
|
class OinspectSerializer(ValidateMixin, serializers.ModelSerializer):
|
||||||
|
|
||||||
|
class Meta(BaseMeta):
|
||||||
|
model = Oinspect
|
||||||
|
|
||||||
|
|
||||||
|
class NoRecordSerializer(serializers.Serializer):
|
||||||
|
key = serializers.ChoiceField(label='字段key', choices=['num_error', 'num_overdue', 'num_complaint', 'num_pt', 'num_risk', 'num_oinspect'])
|
||||||
|
|
@ -1,13 +1,23 @@
|
||||||
from apps.supervision.serializers import TaskDeptSerializer
|
from apps.supervision.serializers import TaskDeptSerializer
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
from .views import ContentViewSet, TaskViewSet,RecordViewSet, TaskDeptViewSet
|
from .views import (ContentViewSet, TaskViewSet,RecordViewSet, TaskDeptViewSet, PogalViewSet, Task2ViewSet, Task2DoViewSet, PgoalDeptViewSet,
|
||||||
|
RcViewSet, ComplaintViewSet, PtViewSet, RiskViewSet, OinspectViewSet)
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register('content', ContentViewSet, basename="content")
|
router.register('content', ContentViewSet, basename="content")
|
||||||
router.register('task', TaskViewSet, basename="task")
|
router.register('task', TaskViewSet, basename="task")
|
||||||
router.register('record', RecordViewSet, basename="record")
|
router.register('record', RecordViewSet, basename="record")
|
||||||
router.register('taskdept', TaskDeptViewSet, basename="taskdept")
|
router.register('taskdept', TaskDeptViewSet, basename="taskdept")
|
||||||
|
router.register('pgoal', PogalViewSet, basename='pgoal')
|
||||||
|
router.register('task2', Task2ViewSet, basename='task2')
|
||||||
|
router.register('task2do', Task2DoViewSet, basename='task2do')
|
||||||
|
router.register('pgoaldept', PgoalDeptViewSet, basename='pgoaldept')
|
||||||
|
router.register('rc', RcViewSet, basename='rc')
|
||||||
|
router.register('complaint', ComplaintViewSet, basename='complaint')
|
||||||
|
router.register('pt', PtViewSet, basename='pt')
|
||||||
|
router.register('risk', RiskViewSet, basename='risk')
|
||||||
|
router.register('oinspect', OinspectViewSet, basename='oinspect')
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include(router.urls))
|
path('', include(router.urls))
|
||||||
]
|
]
|
||||||
|
|
@ -7,7 +7,7 @@ from django.shortcuts import render
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import action, permission_classes
|
from rest_framework.decorators import action, permission_classes
|
||||||
from rest_framework.mixins import ListModelMixin
|
from rest_framework.mixins import ListModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelMixin
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
from rest_framework.viewsets import GenericViewSet, ModelViewSet
|
||||||
from utils.pagination import PageOrNot
|
from utils.pagination import PageOrNot
|
||||||
|
|
@ -16,6 +16,7 @@ from apps.system.mixins import CreateUpdateCustomMixin
|
||||||
from apps.system.models import Organization
|
from apps.system.models import Organization
|
||||||
from apps.system.permission import get_permission_list, has_permission
|
from apps.system.permission import get_permission_list, has_permission
|
||||||
from apps.system.permission_data import RbacFilterSet
|
from apps.system.permission_data import RbacFilterSet
|
||||||
|
from django.db import transaction
|
||||||
|
|
||||||
from .filters import RecordFilter
|
from .filters import RecordFilter
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
@ -395,3 +396,216 @@ class TaskDeptViewSet(ModelViewSet):
|
||||||
obj.delete()
|
obj.delete()
|
||||||
return Response()
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
|
class PogalViewSet(CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
perms_map = {'get': '*', 'post': 'pgoal',
|
||||||
|
'put': 'pgoal', 'delete': 'pgoal'}
|
||||||
|
queryset = Pgoal.objects.all()
|
||||||
|
serializer_class = PgoalSerializer
|
||||||
|
filterset_fields = ['year']
|
||||||
|
ordering = ['-year']
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action in ['create', 'update']:
|
||||||
|
return PgoalCreateUpdateSerializer
|
||||||
|
return super().get_serializer_class()
|
||||||
|
|
||||||
|
class Task2ViewSet(CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
perms_map = {'get': '*', 'post': 'task2',
|
||||||
|
'put': 'task2', 'delete': 'task2'}
|
||||||
|
queryset = Task2.objects.all()
|
||||||
|
serializer_class = Task2Serializer
|
||||||
|
filterset_fields = ['year', 'cycle', 'type', 'state']
|
||||||
|
ordering = ['-create_time']
|
||||||
|
|
||||||
|
@action(methods=['put'], detail=True, perms_map = {'put':'task2'})
|
||||||
|
def close(self, request, *args, **kwargs):
|
||||||
|
"""关闭任务
|
||||||
|
|
||||||
|
关闭任务
|
||||||
|
"""
|
||||||
|
obj = self.get_object()
|
||||||
|
if obj.state == Task2.TASK2_DOING:
|
||||||
|
for i in Task2Do.objects.filter(task2=obj):
|
||||||
|
if i.count_up < i.count_all:
|
||||||
|
raise ParseError('存在公司未完成报送')
|
||||||
|
obj.state = Task2.TASK2_CLOSE
|
||||||
|
obj.save()
|
||||||
|
return Response()
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
@action(methods=['put'], detail=True, perms_map = {'put':'task2'})
|
||||||
|
def start(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
开始执行
|
||||||
|
"""
|
||||||
|
obj = self.get_object()
|
||||||
|
if obj.state == Task2.TASK2_CREATE:
|
||||||
|
tds = Task2Do.objects.filter(task2=obj)
|
||||||
|
if not tds.exists():
|
||||||
|
raise ParseError('未添加执行公司')
|
||||||
|
if obj.type == Task2.TASK2_F:
|
||||||
|
try:
|
||||||
|
pg = Pgoal.objects.get(year=obj.year)
|
||||||
|
except:
|
||||||
|
raise ParseError('未配置年度基础目标')
|
||||||
|
for i in tds:
|
||||||
|
for k, v in enumerate(Pgoal.basedict):
|
||||||
|
pds = PgoalDept.objects.filter(year=i.year, task2do=i, goal_key=k)
|
||||||
|
if pds.exists():
|
||||||
|
pds.update(**{'goal_name': v, 'goal_value_a': getattr(pg, k), 'goal_o_file': getattr(pg, k+'_file')})
|
||||||
|
else:
|
||||||
|
PgoalDept.objects.create(**{'year': i.year, 'task2do': i, 'belong_dept': i.belong_dept,
|
||||||
|
'goal_name': v, 'goal_key': k, 'goal_value_a': getattr(pg, k), 'goal_o_file': getattr(pg, k+'_file')})
|
||||||
|
obj.state = Task2.TASK2_DOING
|
||||||
|
obj.save()
|
||||||
|
return Response()
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=True, perms_map = {'post':'task2'}, serializer_class=Task2DeptsSerializer)
|
||||||
|
def add_depts(self, request, *args, **kwargs):
|
||||||
|
"""添加执行部门
|
||||||
|
"""
|
||||||
|
task2 = self.get_object()
|
||||||
|
if task2.state == Task2.TASK2_CLOSE:
|
||||||
|
raise ParseError('任务已关闭,不可操作')
|
||||||
|
sr = Task2DeptsSerializer(data=request.data)
|
||||||
|
sr.is_valid(raise_exception=True)
|
||||||
|
vdata = sr.validated_data
|
||||||
|
count_all = 8
|
||||||
|
if task2.type == Task2.TASK2_F:
|
||||||
|
count_all = 5
|
||||||
|
for i in vdata['ids']:
|
||||||
|
Task2Do.objects.get_or_create(task2=task2, belong_dept=i, defaults={'task2': task2, 'belong_dept': i, 'count_all': count_all})
|
||||||
|
return Response()
|
||||||
|
|
||||||
|
|
||||||
|
class Task2DoViewSet(ListModelMixin, GenericViewSet):
|
||||||
|
perms_map = {'get': '*'}
|
||||||
|
queryset = Task2Do.objects.select_related('belong_dept', 'task2').all()
|
||||||
|
serializer_class = Task2DoSerializer
|
||||||
|
ordering = ['belong_dept__sort']
|
||||||
|
|
||||||
|
cfields = ['num_issue', 'num_expect', 'num_error', 'num_overdue', 'num_complaint', 'num_pt', 'num_risk', 'num_oinspect']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def countup_task2do(cls, instance):
|
||||||
|
"""计算并更新某部门日常监督任务完成数量
|
||||||
|
"""
|
||||||
|
count_up = 0
|
||||||
|
for i in cls.cfields:
|
||||||
|
if getattr(instance, i) is not None:
|
||||||
|
count_up = count_up + 1
|
||||||
|
instance.count_up = count_up
|
||||||
|
instance.save()
|
||||||
|
|
||||||
|
@action(methods=['put'], detail=True, perms_map = {'post':'task2do'}, serializer_class=NoRecordSerializer)
|
||||||
|
def no_record(self, request, *args, **kwargs):
|
||||||
|
"""没有记录
|
||||||
|
|
||||||
|
没有记录
|
||||||
|
"""
|
||||||
|
obj = self.get_object()
|
||||||
|
setattr(obj, request.data.get('key'), 0)
|
||||||
|
obj.save()
|
||||||
|
self.countup_task2do(obj)
|
||||||
|
return Response()
|
||||||
|
|
||||||
|
@action(methods=['get'], detail=False, perms_map = {'post':'task2do'})
|
||||||
|
def my(self, request, *args, **kwargs):
|
||||||
|
"""我的任务
|
||||||
|
|
||||||
|
我的任务
|
||||||
|
"""
|
||||||
|
queryset = Task2Do.objects.exclude(task2__state=10).order_by('-create_time')
|
||||||
|
belong_dept = self.request.query_params.get('belong_dept', None)
|
||||||
|
if belong_dept:
|
||||||
|
queryset = queryset.filter(belong_dept=belong_dept)
|
||||||
|
else:
|
||||||
|
mydept = request.user.dept
|
||||||
|
belong_depts = get_child_queryset2(mydept)
|
||||||
|
queryset = queryset.filter(belong_dept = belong_depts)
|
||||||
|
serializer = Task2DoSerializer(queryset, many=True)
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
|
class Domixin:
|
||||||
|
perms_map = {'get': '*', 'put': 'task2do', 'post': 'task2do', 'delete': 'task2do'}
|
||||||
|
ordering = ['create_time']
|
||||||
|
ordering_fields = ['create_time', 'belong_dept__sort']
|
||||||
|
|
||||||
|
def countnum_task2do_field(self, task2do):
|
||||||
|
for k, v in self.count_dict:
|
||||||
|
setattr(task2do, k, self.queryset.model.objects.filter({**{'task2do': task2do}, **v}).count())
|
||||||
|
task2do.save()
|
||||||
|
# 更新count_up字段
|
||||||
|
Task2DoViewSet.countup_task2do(task2do)
|
||||||
|
|
||||||
|
def countup_task2do(self, task2do):
|
||||||
|
if task2do.task2.type == Task2.TASK2_F:
|
||||||
|
task2do.count_up = PgoalDept.objects.filter(task2do=task2do).count()
|
||||||
|
task2do.save()
|
||||||
|
elif task2do.task2.type == Task2.TASK2_S:
|
||||||
|
self.countnum_task2do_field(task2do)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
instance = super().perform_create(serializer)
|
||||||
|
self.countup_task2do(instance.task2do)
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def perform_destroy(self, instance):
|
||||||
|
task2do = instance.task2do
|
||||||
|
instance.delete(soft=False)
|
||||||
|
self.countup_task2do(task2do)
|
||||||
|
|
||||||
|
|
||||||
|
class PgoalDeptViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
queryset = PgoalDept.objects.all()
|
||||||
|
serializer_class = PgoalDeptSerializer
|
||||||
|
|
||||||
|
def perform_update(self, serializer):
|
||||||
|
instance = super().perform_update(serializer)
|
||||||
|
goal_file = instance.goal_file
|
||||||
|
if goal_file:
|
||||||
|
instance.goal_files.add(goal_file)
|
||||||
|
|
||||||
|
|
||||||
|
class RcViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
queryset = Rc.objects.all()
|
||||||
|
serializer_class = RcSerializer
|
||||||
|
count_dict = {
|
||||||
|
"num_error": {'etype': 10},
|
||||||
|
"num_overdue": {'etype': 20}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class ComplaintViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
queryset = Complaint.objects.all()
|
||||||
|
serializer_class = ComplaintSerializer
|
||||||
|
count_dict = {
|
||||||
|
"num_complaint": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class PtViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
queryset = Pt.objects.all()
|
||||||
|
serializer_class = PtSerializer
|
||||||
|
count_dict = {
|
||||||
|
"num_pt": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class RiskViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
queryset = Risk.objects.all()
|
||||||
|
serializer_class = RiskSerializer
|
||||||
|
count_dict = {
|
||||||
|
"num_risk": {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class OinspectViewSet(Domixin, CreateUpdateCustomMixin, ModelViewSet):
|
||||||
|
queryset = Oinspect.objects.all()
|
||||||
|
serializer_class = OinspectSerializer
|
||||||
|
count_dict = {
|
||||||
|
"num_oinspect": {}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,8 @@ class CreateUpdateModelBMixin:
|
||||||
业务用基本表B用
|
业务用基本表B用
|
||||||
"""
|
"""
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
|
belong_dept = serializer.validated_data.get('belong_dept', self.request.user.dept)
|
||||||
|
serializer.save(create_by = self.request.user, belong_dept=belong_dept)
|
||||||
|
|
||||||
def perform_update(self, serializer):
|
def perform_update(self, serializer):
|
||||||
serializer.save(update_by = self.request.user)
|
serializer.save(update_by = self.request.user)
|
||||||
|
|
@ -25,7 +26,8 @@ class CreateUpdateCustomMixin:
|
||||||
"""
|
"""
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
if hasattr(self.queryset.model, 'belong_dept'):
|
if hasattr(self.queryset.model, 'belong_dept'):
|
||||||
serializer.save(create_by = self.request.user, belong_dept=self.request.user.dept)
|
belong_dept = serializer.validated_data.get('belong_dept', self.request.user.dept)
|
||||||
|
serializer.save(create_by = self.request.user, belong_dept=belong_dept)
|
||||||
else:
|
else:
|
||||||
serializer.save(create_by = self.request.user)
|
serializer.save(create_by = self.request.user)
|
||||||
def perform_update(self, serializer):
|
def perform_update(self, serializer):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue