gridtaskset

This commit is contained in:
caoqianming 2020-09-06 09:42:38 +08:00
parent 79361a5a8e
commit d28b8c8ce7
9 changed files with 273 additions and 65 deletions

View File

@ -0,0 +1,44 @@
# Generated by Django 2.2.8 on 2020-09-05 17:56
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('safesite', '0345_auto_20200830_2243'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.AddField(
model_name='riskacttask',
name='tasknote',
field=models.TextField(blank=True, null=True, verbose_name='任务备注'),
),
migrations.CreateModel(
name='GridTaskSet',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('task_schedule', django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True, verbose_name='定时配置')),
('note', models.TextField(null=True, verbose_name='检查备注')),
('start_run', models.DateTimeField(blank=True, null=True, verbose_name='开始执行时间')),
('last_run', models.DateTimeField(blank=True, null=True, verbose_name='最后执行时间')),
('is_paused', models.BooleanField(default=True, verbose_name='是否暂停派发')),
('count', models.IntegerField(default=0, verbose_name='任务派发次数')),
('gridlevel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.Dickey', verbose_name='网格化层级')),
('riskact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='gridtaskset_riskact', to='safesite.RiskAct')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='safesite.User', verbose_name='执行人')),
],
),
migrations.AddField(
model_name='riskacttask',
name='taskset',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='safesite.GridTaskSet', verbose_name='由哪个设置派发'),
),
]

View File

@ -0,0 +1,35 @@
# Generated by Django 2.2.8 on 2020-09-05 18:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('safesite', '0346_auto_20200905_1756'),
]
operations = [
# migrations.RemoveField(
# model_name='companyinfo',
# name='liaison_fax',
# ),
migrations.RemoveField(
model_name='gridtaskset',
name='last_run',
),
migrations.RemoveField(
model_name='gridtaskset',
name='start_run',
),
migrations.AddField(
model_name='gridtaskset',
name='last_send',
field=models.DateTimeField(blank=True, null=True, verbose_name='最后派发时间'),
),
migrations.AddField(
model_name='gridtaskset',
name='start_send',
field=models.DateTimeField(blank=True, null=True, verbose_name='开始派发时间'),
),
]

View File

@ -1042,7 +1042,21 @@ class EdulessonWatch(models.Model): # 在线视频观看情况表
submittime = models.DateTimeField(default=timezone.now)
class RiskActTask(models.Model): # 风险点排查清单(任务)
class GridTaskSet(models.Model):
"""
网格化管理任务制定
"""
riskact = models.ForeignKey(RiskAct, on_delete=models.CASCADE, related_name='gridtaskset_riskact')
gridlevel = models.ForeignKey(Dickey, on_delete=models.CASCADE, verbose_name='网格化层级')
user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='执行人')
task_schedule = JSONField('定时配置',null=True, blank=True)
note = models.TextField('检查备注', null=True)
start_send = models.DateTimeField('开始派发时间', null=True, blank=True)
last_send = models.DateTimeField('最后派发时间', null=True, blank=True)
is_paused = models.BooleanField(default=True, verbose_name='是否暂停派发')
count = models.IntegerField('任务派发次数', default=0)
class RiskActTask(models.Model): # 风险点排查执行记录
id = models.AutoField(primary_key=True)
riskact = models.ForeignKey(
RiskAct, on_delete=models.CASCADE, null=True, blank=True)
@ -1053,38 +1067,11 @@ class RiskActTask(models.Model): # 风险点排查清单(任务)
taskexpire = models.DateTimeField(null=True, blank=True)
usable = models.IntegerField(default=1) # 1是可用,2是变更计划,0是不可用
type = models.IntegerField(default=1) # 1是计划内,2是计划外
note = models.TextField(null=True, blank=True) # 备注
note = models.TextField(null=True, blank=True) # 检查备注
state = models.IntegerField(default=1) # 1是正常
istask = models.IntegerField(default=0) # 是否是任务
class GridTaskSet(models.Model):
"""
网格化管理任务制定
"""
tasktype_choices = (
(1, '8h'),
(2, '24h'),
(3, '7day'),
(4, '1month'),
(5, '1year')
)
riskact = models.ForeignKey(RiskAct, on_delete=models.CASCADE, related_name='gridtaskset_riskact')
gridlevel = models.ForeignKey(Dickey, on_delete=models.CASCADE, verbose_name='网格化层级')
user = models.ForeignKey(User,on_delete=models.CASCADE,verbose_name='执行人')
tasktype = models.IntegerField(default=1, choices=tasktype_choices)
note = models.TextField('检查备注', null=True)
is_paused = models.BooleanField(default=True, verbose_name='是否暂停派发')
class GridCheckRecord(models.Model):
"""
网格化排查记录
"""
riskact = models.ForeignKey(RiskAct, on_delete=models.CASCADE, related_name='gridcheckrecord_riskact')
tasknote = models.TextField('任务备注', null=True, blank=True)
taskset = models.ForeignKey(GridTaskSet, null=True, blank=True, verbose_name='由哪个设置派发', on_delete=models.SET_NULL)
class Risktask(models.Model): # 风险排查任务清单
id = models.AutoField(primary_key=True)

View File

@ -1,5 +1,5 @@
<div class="easyui-layout" style="width:100%;height:100%;">
<div data-options="region:'west',split:true,border:false,collapsible:false" style="width:50%;height:100%;" title="风险点">
<div data-options="region:'west',split:true,border:false,collapsible:false" style="width:40%;height:100%;" title="风险点">
<div id="riskactbar" style="padding:5px;height:auto">
<div>
{% load myfilter %}
@ -25,22 +25,22 @@
</div>
<div data-options="region:'center',title:'网格化任务制定',split:true,border:false,collapsible:false" style="width:50%;height:100%;">
<div id="riskbar" style="padding:5px;height:auto">
{% if request|has_permission:'b_risk_add' %}
<a onclick="addrisk()" class="easyui-linkbutton"
<div id="gridtasksetbar" style="padding:5px;height:auto">
{% if request|has_permission:'b_gridtaskset_add' %}
<a onclick="addgridtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-plus',plain:true">新增</a>
{% endif %}
{% if request|has_permission:'b_risk_change' %}
<a onclick="editrisk()" class="easyui-linkbutton"
{% if request|has_permission:'b_gridtaskset_change' %}
<a onclick="editgridtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-pencil',plain:true">编辑</a>
{% endif %}
{% if request|has_permission:'b_risk_del' %}
<a onclick="delrisk()" class="easyui-linkbutton"
{% if request|has_permission:'b_gridtaskset_del' %}
<a onclick="delgirdtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-trash',plain:true">删除</a>
{% endif %}
</div>
<table id="risktable" style="height:100%;width:auto"></table>
<table id="girdtasksettable" style="height:100%;width:auto"></table>
</div>
</div>
@ -84,25 +84,24 @@
//{ field: 'group__groupname', title: '岗位', width: 100 },
]],
onSelect: function (index, data) {
$('#risktable').datagrid({url:'api/risk?a=listall&riskact='+data.id})
$('#girdtasksettable').datagrid({url:'api/gridtaskset/?a=listall&riskact='+data.id})
}
})
$('#risktable').datagrid({
url: 'api/risk?a=listall',
$('#girdtasksettable').datagrid({
url: 'api/gridtaskset/?a=listall',
rownumbers: true,
singleSelect: true,
striped: true,
method: 'get',
toolbar: '#riskbar',
toolbar: '#gridtasksetbar',
pagination: 'true',
pageSize: 20,
columns: [[
{ field: 'id', title: 'ID', hidden: true },
{ field: 'step', title: '项目/步骤', width: 100 },
{ field: 'hazard', title: '危害因素', width: 100 },
{ field: 'result', title: '可能后果', width: 100 },
{ field: 'level', title: '风险等级', width: 80 , styler: function (value, row, index) {
{ field: 'gridlevel', title: '网格层级', width: 100 },
{ field: 'user__name', title: '执行人', width: 100 },
{ field: 'task_schedule', title: '任务周期', width: 80 , styler: function (value, row, index) {
switch (value) {
case '低风险': return 'background-color:blue;color:white'; break;
case '一般风险': return 'background-color:yellow;'; break;
@ -110,18 +109,23 @@
case '重大风险': return 'background-color:red;color:white'; break;
}
}},
{ field: 'measure1', title: '工程技术', width: 100 },
{ field: 'measure2', title: '管理措施', width: 100 },
{ field: 'measure3', title: '培训教育', width: 100 },
{ field: 'measure4', title: '个体防护', width: 100 },
{ field: 'measure5', title: '应急处理', width: 100 },
{ field: 'riskl', title: 'L', width: 50 },
{ field: 'riske', title: 'E', width: 50 },
{ field: 'riskc', title: 'C', width: 50 },
{ field: 'riskd', title: 'D', width: 50 },
{ field: 'start_send', title: '初次派发时间', width: 100 },
{ field: 'last_send', title: '最后派发时间', width: 100 },
{ field: 'is_paused', title: '当前状态', width: 100 },
{ field: 'count', title: '已派发次数', width: 100 },
]],
});
function addgridtaskset(){
opendg('新增','html/gridtaskset/add/')
}
function editgridtaskset(){
var row = $('#girdtasksettable').datagrid('getSelected');
if (row) {
opendg('编辑','html/gridtaskset/edit/' + row.id)
}
else {
$.messager.alert('提示', '请先选择一个任务配置!');
}
}
</script>

View File

@ -0,0 +1,58 @@
<div class="easyui-layout" style="width:100%;height:100%">
<div id='southdiv' data-options="region:'south'" style="width:100%;height:50px;padding:5px">
<div style="text-align:center;padding:2px">
<a id="submitb" class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="submitform()">保存</a>
<a class="easyui-linkbutton" iconCls="fa-close" onclick="javascript:$('#dd').dialog('close')">取消</a>
</div>
</div>
<div data-options="region:'center'" style="width:100%;height:100%;padding:5px 15px;">
<form method="post" id="gridtasksetff">
<div style="margin-bottom:10px">
<input id="qyname" name="name" style="width:90%;"
data-options="label:'区域名',required:true" class="easyui-textbox"></input>
</div>
<div style="margin-bottom:10px">
<select id="qymap" name="map" style="width:90%" data-options="label:'所属地图'"
editable="false" class="easyui-combotree">
</select>
</div>
<div style="margin-bottom:10px">
<input id="qyorder" name="order" style="width:90%" data-options="label:'排序'" class="easyui-numberbox">
</input>
</div>
</form>
</div>
<script>
$('#qymap').combotree({
url: 'api/map?a=tree',
loadFilter: function (rows) {
return convert(rows);
},
});
function submitform() {
$.ajax({
type: "POST",
url: 'api/area?a=add',
data: JSON.stringify($('#gridtasksetff').serializeJSON()),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
var bo = $('#gridtasksetff').form('validate')
if (bo == false) {
return bo
} else {
$('#submitb').linkbutton('disable');
}
},
success: function (data) {
if (data.code == 1) {
$("#qylblist").datagrid('reload');
$("#dd").dialog("close");
} else { $.messager.alert('提示', '失败,区域名重复!'); }
$('#submitb').linkbutton('enable');
},
});
}
</script>
</div>

View File

@ -0,0 +1,58 @@
<div class="easyui-layout" style="width:100%;height:100%">
<div id='southdiv' data-options="region:'south'" style="width:100%;height:50px;padding:5px">
<div style="text-align:center;padding:2px">
<a id="submitb" class="easyui-linkbutton" iconCls="fa-floppy-o" onclick="submitform()">保存</a>
<a class="easyui-linkbutton" iconCls="fa-close" onclick="javascript:$('#dd').dialog('close')">取消</a>
</div>
</div>
<div data-options="region:'center'" style="width:100%;height:100%;padding:5px 15px;">
<form method="post" id="qyff">
<div style="margin-bottom:10px">
<input id="qyname" name="name" style="width:90%;"
data-options="label:'区域名',required:true" class="easyui-textbox"></input>
</div>
<div style="margin-bottom:10px">
<select id="qymap" name="map" style="width:90%" data-options="label:'所属地图'"
editable="false" class="easyui-combotree">
</select>
</div>
<div style="margin-bottom:10px">
<input id="qyorder" name="order" style="width:90%" data-options="label:'排序'" class="easyui-numberbox">
</input>
</div>
</form>
</div>
<script>
$('#qymap').combotree({
url: 'api/map?a=tree',
loadFilter: function (rows) {
return convert(rows);
},
});
function submitform() {
$.ajax({
type: "POST",
url: 'api/area?a=add',
data: JSON.stringify($('#qyff').serializeJSON()),
datatype: "json",
processData: false,
contentType: "application/json;charset=utf-8",
beforeSend: function () {
var bo = $('#qyff').form('validate')
if (bo == false) {
return bo
} else {
$('#submitb').linkbutton('disable');
}
},
success: function (data) {
if (data.code == 1) {
$("#qylblist").datagrid('reload');
$("#dd").dialog("close");
} else { $.messager.alert('提示', '失败,区域名重复!'); }
$('#submitb').linkbutton('enable');
},
});
}
</script>
</div>

View File

@ -82,7 +82,9 @@ urlpatterns = [
path('html/inspect/detail/<int:id>', views.inspectdetail),
path('html/inspectitem/detail/<int:id>', views.inspectitemdetail),
path('html/risk/<int:kind>/',views.risk),
path('html/gridmanage/', views.gridmanage),
path('html/gridtaskset/', views.gridtaskset),
path('html/gridtaskset/add/', views.gridtasksetadd),
path('html/gridtaskset/edit/<int:id>/',views.gridtasksetedit),
path('html/riskact/add/<int:kind>/',views.riskactadd),
path('html/riskact/edit/<int:id>/',views.riskactedit),
path('html/risk/add/<int:id>/',views.riskadd),
@ -195,6 +197,7 @@ urlpatterns = [
path('api/equipmentfig',views.equipmentfig),#设备统计图
path('api/equipmentcheckform/<int:pk>',viewsdrf.EquipmentCheckFormDetailView.as_view()),
path('api/equipmentcheckform',viewsdrf.EquipmentCheckFormAPIView.as_view()),
path('api/gridtaskset/',views.apigridtaskset),
path('api/examtestrate',views.apiexamtestrate),

View File

@ -3,7 +3,7 @@ from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore
from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from .models import User, Trouble, Dickey, Partment, Dicclass, Train, Drill, TroubleAccess, Group, Yjyc,Checktable, Trainuser, Drilluser, Yjsetup, Menu, Observe, Observeto, Unsafes, Miss, Socertificate, Userprofile, Suggest, Notice, Noticeto, Operation, Operzyry, Fxcs, Operationspjd, Operspxq, Question, ExamPaper, ExamTest, ExamPaperDetail, ExamTestDetail, Questioncat, Safecert, Map, Area, Missto, Suggestflow, Equipment, Inspect, Risk, RiskAct, Risktask, Riskcheck, Report, RiskActTask, Riskcheck2,Resbility,Operproce,Readerblility,ReaderOperproce,Role,EquipmentCheckForm,EquipmentCheckItem,Checkproject,Checktask,Checkjob,InspectItem
from .models import *
from django.template import RequestContext
from django.views.decorators.csrf import csrf_exempt
from django.core import serializers
@ -207,8 +207,14 @@ def riskadd(req, id):
def risk(req, kind):
return render(req, 'risk.html', {'kind': kind})
def gridmanage(req):
return render(req, 'gridmanage.html')
def gridtaskset(req):
return render(req, 'gridtaskset.html')
def gridtasksetadd(req):
return render(req, 'gridtasksetadd.html')
def gridtasksetedit(req, id):
return render(req, 'gridtasksetedit.html', {'id': id})
def inspect(req):
return render(req, 'inspect.html')
@ -7053,6 +7059,19 @@ def apiriskact(req):
riskact=obj, taskadd=tasktime, taskexpire=tasktime + timedelta(days=7), istask=1)
return JsonResponse({"code": 1})
def apigridtaskset(req):
a = req.GET.get('a')
userid = req.session['userid']
companyid = getcompany(userid)
if a == 'listall':
objs = GridTaskSet.objects.filter(riskact__usecomp__partid=companyid)
if req.GET.get('riskact', None):
objs = objs.filter(riskact__id=req.GET.get('riskact'))
total = objs.count()
startnum, endnum = fenye(req)
objs = objs.order_by('-pk')[startnum:endnum].values('id', 'gridlevel', 'user__name',
'task_schedule', 'note', 'start_send', 'last_send', 'is_paused', 'count')
return HttpResponse(transjson(total, objs), content_type="application/json")
def apirisk(req):
a = req.GET.get('a')

View File

@ -1,6 +1,7 @@
from .models import *
from .serializers import *
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework import generics
@ -65,4 +66,3 @@ class EquipmentCheckFormAPIView(APIView):
class EquipmentCheckFormDetailView(generics.RetrieveUpdateDestroyAPIView):
queryset = EquipmentCheckForm.objects.all()
serializer_class = EquipmentCheckFormSerializers