feat: 风险管控表精简

This commit is contained in:
caoqianming 2024-06-11 16:01:00 +08:00
parent 6851dd3f94
commit b913928ac6
5 changed files with 36 additions and 41 deletions

View File

@ -28,7 +28,6 @@ class Migration(migrations.Migration):
('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')),
('note', models.TextField(blank=True, null=True, verbose_name='派发备注')), ('note', models.TextField(blank=True, null=True, verbose_name='派发备注')),
('expire', models.PositiveSmallIntegerField(default=0, help_text='0代表不设限制直到下个任务派发', verbose_name='执行有效期(h)')), ('expire', models.PositiveSmallIntegerField(default=0, help_text='0代表不设限制直到下个任务派发', verbose_name='执行有效期(h)')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checktaskset_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checktaskset_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checktaskset_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('myschedule', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.myschedule', verbose_name='周期')), ('myschedule', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.myschedule', verbose_name='周期')),
('periodictask', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checktask_periodictask', to='django_celery_beat.periodictask', verbose_name='关联定时任务')), ('periodictask', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checktask_periodictask', to='django_celery_beat.periodictask', verbose_name='关联定时任务')),
@ -51,7 +50,6 @@ class Migration(migrations.Migration):
('time_end', models.DateTimeField(verbose_name='关闭时间')), ('time_end', models.DateTimeField(verbose_name='关闭时间')),
('note', models.TextField(blank=True, null=True, verbose_name='检查备注')), ('note', models.TextField(blank=True, null=True, verbose_name='检查备注')),
('time_check', models.DateTimeField(blank=True, null=True, verbose_name='开始检查时间')), ('time_check', models.DateTimeField(blank=True, null=True, verbose_name='开始检查时间')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkwork_belong_dept', to='system.dept', verbose_name='所属部门')),
('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.dictionary', verbose_name='工作分类')), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.dictionary', verbose_name='工作分类')),
('checktaskset', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dpm.checktaskset', verbose_name='关联派发策略')), ('checktaskset', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dpm.checktaskset', verbose_name='关联派发策略')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkwork_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkwork_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
@ -73,7 +71,6 @@ class Migration(migrations.Migration):
('type', models.PositiveSmallIntegerField(choices=[(10, '作业活动类'), (20, '设备设施类')], default=10, verbose_name='风险点类型')), ('type', models.PositiveSmallIntegerField(choices=[(10, '作业活动类'), (20, '设备设施类')], default=10, verbose_name='风险点类型')),
('manage_level', models.PositiveSmallIntegerField(choices=[(10, '岗位级'), (20, '班组级'), (30, '部门级'), (40, '公司级')], default=10, verbose_name='管控层级')), ('manage_level', models.PositiveSmallIntegerField(choices=[(10, '岗位级'), (20, '班组级'), (30, '部门级'), (40, '公司级')], default=10, verbose_name='管控层级')),
('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='riskpoint_area', to='am.area', verbose_name='所在区域')), ('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='riskpoint_area', to='am.area', verbose_name='所在区域')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riskpoint_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riskpoint_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riskpoint_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('dept_res', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riskpoint_dept_res', to='system.dept', verbose_name='责任部门')), ('dept_res', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riskpoint_dept_res', to='system.dept', verbose_name='责任部门')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='riskpoint_update_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='riskpoint_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
@ -104,7 +101,6 @@ class Migration(migrations.Migration):
('riske', models.DecimalField(blank=True, decimal_places=1, max_digits=6, null=True)), ('riske', models.DecimalField(blank=True, decimal_places=1, max_digits=6, null=True)),
('riskc', models.DecimalField(blank=True, decimal_places=1, max_digits=6, null=True)), ('riskc', models.DecimalField(blank=True, decimal_places=1, max_digits=6, null=True)),
('riskd', models.DecimalField(blank=True, decimal_places=1, max_digits=6, null=True)), ('riskd', models.DecimalField(blank=True, decimal_places=1, max_digits=6, null=True)),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='risk_belong_dept', to='system.dept', verbose_name='所属部门')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='risk_create_by', to=settings.AUTH_USER_MODEL, 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='创建人')),
('results', models.ManyToManyField(blank=True, related_name='risk_results', to='system.Dictionary', verbose_name='可能后果')), ('results', models.ManyToManyField(blank=True, related_name='risk_results', to='system.Dictionary', verbose_name='可能后果')),
('riskpoint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dpm.riskpoint', verbose_name='所属风险点')), ('riskpoint', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='dpm.riskpoint', verbose_name='所属风险点')),
@ -134,7 +130,6 @@ class Migration(migrations.Migration):
('correct_description', models.TextField(blank=True, null=True, verbose_name='整改描述')), ('correct_description', models.TextField(blank=True, null=True, verbose_name='整改描述')),
('correct_time', models.DateTimeField(blank=True, null=True, verbose_name='整改完成时间')), ('correct_time', models.DateTimeField(blank=True, null=True, verbose_name='整改完成时间')),
('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='am.area', verbose_name='所在区域')), ('area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='am.area', verbose_name='所在区域')),
('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='hazard_belong_dept', to='system.dept', verbose_name='所属部门')),
('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.dictionary', verbose_name='隐患类别')), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='system.dictionary', verbose_name='隐患类别')),
('checkwork', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dpm.checkwork', verbose_name='关联检查工作')), ('checkwork', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='dpm.checkwork', verbose_name='关联检查工作')),
('correct_solution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.file', verbose_name='整改方案')), ('correct_solution', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.file', verbose_name='整改方案')),
@ -192,10 +187,8 @@ class Migration(migrations.Migration):
('result', models.PositiveSmallIntegerField(default=10, verbose_name='检查结果')), ('result', models.PositiveSmallIntegerField(default=10, verbose_name='检查结果')),
('note', models.TextField(blank=True, null=True, verbose_name='备注')), ('note', models.TextField(blank=True, null=True, verbose_name='备注')),
('checkwork', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='citem_checkwork', to='dpm.checkwork', verbose_name='关联检查工作')), ('checkwork', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='citem_checkwork', to='dpm.checkwork', verbose_name='关联检查工作')),
('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkitem_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')),
('hazard', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_hazard', to='dpm.hazard', verbose_name='关联隐患')), ('hazard', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_hazard', to='dpm.hazard', verbose_name='关联隐患')),
('risk', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_risk', to='dpm.risk', verbose_name='关联风险')), ('risk', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='citem_risk', to='dpm.risk', verbose_name='关联风险')),
('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='checkitem_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')),
], ],
options={ options={
'abstract': False, 'abstract': False,

View File

@ -1,9 +1,9 @@
from django.db import models from django.db import models
from apps.utils.models import CommonBModel, CommonAModel from apps.utils.models import BaseModel, CommonAModel, CommonADModel
from django_celery_beat.models import PeriodicTask from django_celery_beat.models import PeriodicTask
# Create your models here. # Create your models here.
class RiskPoint(CommonBModel): class RiskPoint(CommonAModel):
""" """
风险点表 风险点表
""" """
@ -32,7 +32,7 @@ class RiskPoint(CommonBModel):
dept_res = models.ForeignKey('system.dept', on_delete=models.SET_NULL, verbose_name='责任部门', related_name='riskpoint_dept_res', null=True, blank=True) dept_res = models.ForeignKey('system.dept', on_delete=models.SET_NULL, verbose_name='责任部门', related_name='riskpoint_dept_res', null=True, blank=True)
user_res = models.ForeignKey('system.user', on_delete=models.CASCADE, verbose_name='责任人', related_name='riskpoint_user_res', null=True, blank=True) user_res = models.ForeignKey('system.user', on_delete=models.CASCADE, verbose_name='责任人', related_name='riskpoint_user_res', null=True, blank=True)
class Risk(CommonBModel): class Risk(CommonAModel):
""" """
风险表 风险表
""" """
@ -54,7 +54,7 @@ class Risk(CommonBModel):
riskpoint = models.ForeignKey(RiskPoint, on_delete=models.CASCADE, verbose_name='所属风险点') riskpoint = models.ForeignKey(RiskPoint, on_delete=models.CASCADE, verbose_name='所属风险点')
class CheckTaskSet(CommonBModel): class CheckTaskSet(CommonADModel):
""" """
检查任务派发设置 检查任务派发设置
""" """
@ -66,7 +66,7 @@ class CheckTaskSet(CommonBModel):
periodictask = models.ForeignKey(PeriodicTask, verbose_name='关联定时任务', on_delete=models.CASCADE, related_name='checktask_periodictask') periodictask = models.ForeignKey(PeriodicTask, verbose_name='关联定时任务', on_delete=models.CASCADE, related_name='checktask_periodictask')
class CheckWork(CommonBModel): class CheckWork(CommonAModel):
""" """
检查工作 检查工作
""" """
@ -87,7 +87,7 @@ class CheckWork(CommonBModel):
checktaskset = models.ForeignKey(CheckTaskSet, verbose_name='关联派发策略', on_delete=models.CASCADE, null=True, blank=True) checktaskset = models.ForeignKey(CheckTaskSet, verbose_name='关联派发策略', on_delete=models.CASCADE, null=True, blank=True)
class Hazard(CommonBModel): class Hazard(CommonAModel):
""" """
事故隐患表 事故隐患表
""" """
@ -139,7 +139,7 @@ class Hazard(CommonBModel):
ticket = models.ForeignKey('wf.ticket', on_delete=models.SET_NULL, verbose_name='关联工单', related_name='hazard_ticket', null=True, blank=True) ticket = models.ForeignKey('wf.ticket', on_delete=models.SET_NULL, verbose_name='关联工单', related_name='hazard_ticket', null=True, blank=True)
class CheckItem(CommonAModel): class CheckItem(BaseModel):
""" """
检查工作-隐患关联表 检查工作-隐患关联表
""" """

View File

@ -6,6 +6,7 @@ from apps.utils.constants import EXCLUDE_FIELDS
from apps.system.models import Dictionary from apps.system.models import Dictionary
from django_celery_beat.models import PeriodicTask from django_celery_beat.models import PeriodicTask
import time import time
from django.db import transaction
class RiskPointCreateUpdateSerializer(CustomModelSerializer): class RiskPointCreateUpdateSerializer(CustomModelSerializer):
@ -73,32 +74,32 @@ class RiskSerializer(CustomModelSerializer):
fields = '__all__' fields = '__all__'
class CheckTaskSetCreateUpdateSerializer(CustomModelSerializer): class CheckTaskSetCreateSerializer(CustomModelSerializer):
class Meta: class Meta:
model = CheckTaskSet model = CheckTaskSet
exclude = EXCLUDE_FIELDS + ['periodictask'] exclude = EXCLUDE_FIELDS + ['periodictask']
def save(self, **kwargs): def create(self, validated_data):
ins = super().save(**kwargs) with transaction.atomic():
if ins.periodictask: sch = validated_data["myschedule"]
pobj = ins.periodictask
pobj.name = 'checktask_' + time.strftime('%Y%m%d%H%M%S')
pobj.task = 'apps.dpm.dispath_checkwork_task'
pobj.kwargs = json.dumps({'checktaskset': ins.id})
else:
pobj = PeriodicTask() pobj = PeriodicTask()
sch = ins.myschedule if sch.crontab:
if sch.crontab: pobj.crontab = sch.crontab
pobj.crontab = sch.crontab elif sch.interval:
elif sch.interval: pobj.interval = sch.interval
pobj.interval = sch.interval pobj.save()
pobj.save() validated_data["periodictask"] = pobj
ins.periodictask = pobj return super().create(validated_data)
ins.save()
return ins class CheckTaskSetUpdateSerializer(CustomModelSerializer):
class Meta:
model = CheckTaskSet
fields = ["expire", "note"]
class CheckTaskSetSerializer(CustomModelSerializer): class CheckTaskSetSerializer(CustomModelSerializer):
user_duty_name = serializers.CharField(source="user_duty.name", read_only=True)
myschedule_name = serializers.CharField(source="myschedule.name", read_only=True)
enabled = serializers.BooleanField(source='periodictask.enabled', read_only=True) enabled = serializers.BooleanField(source='periodictask.enabled', read_only=True)
last_run_at = serializers.DateTimeField(source='periodictask.last_run_at', read_only=True) last_run_at = serializers.DateTimeField(source='periodictask.last_run_at', read_only=True)
total_run_count = serializers.IntegerField(source='periodictask.total_run_count', read_only=True) total_run_count = serializers.IntegerField(source='periodictask.total_run_count', read_only=True)

View File

@ -1,4 +1,4 @@
from apps.dpm.views import RiskPointViewSet, RiskViewSet from apps.dpm.views import RiskPointViewSet, RiskViewSet, CheckTaskSetViewSet
from django.urls import path, include from django.urls import path, include
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
@ -8,6 +8,7 @@ HTML_BASE_URL = 'dpm/'
router = DefaultRouter() router = DefaultRouter()
router.register('riskpoint', RiskPointViewSet, basename='riskpoint') router.register('riskpoint', RiskPointViewSet, basename='riskpoint')
router.register('risk', RiskViewSet, basename='risk') router.register('risk', RiskViewSet, basename='risk')
router.register('checktaskset', CheckTaskSetViewSet, basename='checktaskset')
urlpatterns = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),
] ]

View File

@ -1,5 +1,6 @@
from apps.dpm.serializers import RiskPointCreateUpdateSerializer, RiskPointSerializer, RiskCreateUpdateSerializer, RiskSerializer, CheckTaskSetCreateUpdateSerializer, CheckTaskSetSerializer, CheckWork_10_CreateUpdateSerializer, CheckWorkSerializer from apps.dpm.serializers import RiskPointCreateUpdateSerializer, RiskPointSerializer, RiskCreateUpdateSerializer, RiskSerializer, CheckTaskSetCreateSerializer, CheckTaskSetUpdateSerializer, CheckTaskSetSerializer, CheckWork_10_CreateUpdateSerializer, CheckWorkSerializer
from apps.utils.viewsets import CustomModelViewSet from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
from apps.utils.mixins import CustomListModelMixin, BulkDestroyModelMixin, BulkCreateModelMixin
from apps.dpm.models import CheckTaskSet, CheckWork, RiskPoint, Risk from apps.dpm.models import CheckTaskSet, CheckWork, RiskPoint, Risk
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.response import Response from rest_framework.response import Response
@ -29,12 +30,12 @@ class RiskViewSet(CustomModelViewSet):
filterset_fields = ['results'] filterset_fields = ['results']
class CheckTaskSetViewSet(CustomModelViewSet): class CheckTaskSetViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet):
queryset = CheckTaskSet.objects.all() queryset = CheckTaskSet.objects.all()
create_serializer_class = CheckTaskSetCreateUpdateSerializer create_serializer_class = CheckTaskSetCreateSerializer
update_serializer_class = CheckTaskSetCreateUpdateSerializer update_serializer_class = CheckTaskSetUpdateSerializer
serializer_class = CheckTaskSetSerializer serializer_class = CheckTaskSetSerializer
select_related_fields = ['periodictask'] select_related_fields = ['periodictask', "myschedule", "user_duty"]
search_fields = ['note'] search_fields = ['note']
filterset_fields = ['periodictask__enabled'] filterset_fields = ['periodictask__enabled']
@ -54,8 +55,7 @@ class CheckTaskSetViewSet(CustomModelViewSet):
with transaction.atomic(): with transaction.atomic():
periodictask = instance.periodictask periodictask = instance.periodictask
instance.delete() instance.delete()
periodictask.enabled = False periodictask.delete()
periodictask.save()
class CheckWorkViewSet(CustomModelViewSet): class CheckWorkViewSet(CustomModelViewSet):