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) 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) id = models.AutoField(primary_key=True)
riskact = models.ForeignKey( riskact = models.ForeignKey(
RiskAct, on_delete=models.CASCADE, null=True, blank=True) RiskAct, on_delete=models.CASCADE, null=True, blank=True)
@ -1053,38 +1067,11 @@ class RiskActTask(models.Model): # 风险点排查清单(任务)
taskexpire = models.DateTimeField(null=True, blank=True) taskexpire = models.DateTimeField(null=True, blank=True)
usable = models.IntegerField(default=1) # 1是可用,2是变更计划,0是不可用 usable = models.IntegerField(default=1) # 1是可用,2是变更计划,0是不可用
type = models.IntegerField(default=1) # 1是计划内,2是计划外 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是正常 state = models.IntegerField(default=1) # 1是正常
istask = models.IntegerField(default=0) # 是否是任务 istask = models.IntegerField(default=0) # 是否是任务
tasknote = models.TextField('任务备注', null=True, blank=True)
class GridTaskSet(models.Model): taskset = models.ForeignKey(GridTaskSet, null=True, blank=True, verbose_name='由哪个设置派发', on_delete=models.SET_NULL)
"""
网格化管理任务制定
"""
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')
class Risktask(models.Model): # 风险排查任务清单 class Risktask(models.Model): # 风险排查任务清单
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)

View File

@ -1,5 +1,5 @@
<div class="easyui-layout" style="width:100%;height:100%;"> <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 id="riskactbar" style="padding:5px;height:auto">
<div> <div>
{% load myfilter %} {% load myfilter %}
@ -25,22 +25,22 @@
</div> </div>
<div data-options="region:'center',title:'网格化任务制定',split:true,border:false,collapsible:false" style="width:50%;height:100%;"> <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"> <div id="gridtasksetbar" style="padding:5px;height:auto">
{% if request|has_permission:'b_risk_add' %} {% if request|has_permission:'b_gridtaskset_add' %}
<a onclick="addrisk()" class="easyui-linkbutton" <a onclick="addgridtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-plus',plain:true">新增</a> data-options="iconCls:'fa-plus',plain:true">新增</a>
{% endif %} {% endif %}
{% if request|has_permission:'b_risk_change' %} {% if request|has_permission:'b_gridtaskset_change' %}
<a onclick="editrisk()" class="easyui-linkbutton" <a onclick="editgridtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-pencil',plain:true">编辑</a> data-options="iconCls:'fa-pencil',plain:true">编辑</a>
{% endif %} {% endif %}
{% if request|has_permission:'b_risk_del' %} {% if request|has_permission:'b_gridtaskset_del' %}
<a onclick="delrisk()" class="easyui-linkbutton" <a onclick="delgirdtaskset()" class="easyui-linkbutton"
data-options="iconCls:'fa-trash',plain:true">删除</a> data-options="iconCls:'fa-trash',plain:true">删除</a>
{% endif %} {% endif %}
</div> </div>
<table id="risktable" style="height:100%;width:auto"></table> <table id="girdtasksettable" style="height:100%;width:auto"></table>
</div> </div>
</div> </div>
@ -84,25 +84,24 @@
//{ field: 'group__groupname', title: '岗位', width: 100 }, //{ field: 'group__groupname', title: '岗位', width: 100 },
]], ]],
onSelect: function (index, data) { 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({ $('#girdtasksettable').datagrid({
url: 'api/risk?a=listall', url: 'api/gridtaskset/?a=listall',
rownumbers: true, rownumbers: true,
singleSelect: true, singleSelect: true,
striped: true, striped: true,
method: 'get', method: 'get',
toolbar: '#riskbar', toolbar: '#gridtasksetbar',
pagination: 'true', pagination: 'true',
pageSize: 20, pageSize: 20,
columns: [[ columns: [[
{ field: 'id', title: 'ID', hidden: true }, { field: 'id', title: 'ID', hidden: true },
{ field: 'step', title: '项目/步骤', width: 100 }, { field: 'gridlevel', title: '网格层级', width: 100 },
{ field: 'hazard', title: '危害因素', width: 100 }, { field: 'user__name', title: '执行人', width: 100 },
{ field: 'result', title: '可能后果', width: 100 }, { field: 'task_schedule', title: '任务周期', width: 80 , styler: function (value, row, index) {
{ field: 'level', title: '风险等级', width: 80 , styler: function (value, row, index) {
switch (value) { switch (value) {
case '低风险': return 'background-color:blue;color:white'; break; case '低风险': return 'background-color:blue;color:white'; break;
case '一般风险': return 'background-color:yellow;'; break; case '一般风险': return 'background-color:yellow;'; break;
@ -110,18 +109,23 @@
case '重大风险': return 'background-color:red;color:white'; break; case '重大风险': return 'background-color:red;color:white'; break;
} }
}}, }},
{ field: 'measure1', title: '工程技术', width: 100 }, { field: 'start_send', title: '初次派发时间', width: 100 },
{ field: 'measure2', title: '管理措施', width: 100 }, { field: 'last_send', title: '最后派发时间', width: 100 },
{ field: 'measure3', title: '培训教育', width: 100 }, { field: 'is_paused', title: '当前状态', width: 100 },
{ field: 'measure4', title: '个体防护', width: 100 }, { field: 'count', 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 },
]], ]],
}); });
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> </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/inspect/detail/<int:id>', views.inspectdetail),
path('html/inspectitem/detail/<int:id>', views.inspectitemdetail), path('html/inspectitem/detail/<int:id>', views.inspectitemdetail),
path('html/risk/<int:kind>/',views.risk), 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/add/<int:kind>/',views.riskactadd),
path('html/riskact/edit/<int:id>/',views.riskactedit), path('html/riskact/edit/<int:id>/',views.riskactedit),
path('html/risk/add/<int:id>/',views.riskadd), path('html/risk/add/<int:id>/',views.riskadd),
@ -195,6 +197,7 @@ urlpatterns = [
path('api/equipmentfig',views.equipmentfig),#设备统计图 path('api/equipmentfig',views.equipmentfig),#设备统计图
path('api/equipmentcheckform/<int:pk>',viewsdrf.EquipmentCheckFormDetailView.as_view()), path('api/equipmentcheckform/<int:pk>',viewsdrf.EquipmentCheckFormDetailView.as_view()),
path('api/equipmentcheckform',viewsdrf.EquipmentCheckFormAPIView.as_view()), path('api/equipmentcheckform',viewsdrf.EquipmentCheckFormAPIView.as_view()),
path('api/gridtaskset/',views.apigridtaskset),
path('api/examtestrate',views.apiexamtestrate), path('api/examtestrate',views.apiexamtestrate),

View File

@ -3,7 +3,7 @@ from captcha.helpers import captcha_image_url
from captcha.models import CaptchaStore from captcha.models import CaptchaStore
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse 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.template import RequestContext
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.core import serializers from django.core import serializers
@ -207,9 +207,15 @@ def riskadd(req, id):
def risk(req, kind): def risk(req, kind):
return render(req, 'risk.html', {'kind': kind}) return render(req, 'risk.html', {'kind': kind})
def gridmanage(req): def gridtaskset(req):
return render(req, 'gridmanage.html') 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): def inspect(req):
return render(req, 'inspect.html') return render(req, 'inspect.html')
@ -7053,6 +7059,19 @@ def apiriskact(req):
riskact=obj, taskadd=tasktime, taskexpire=tasktime + timedelta(days=7), istask=1) riskact=obj, taskadd=tasktime, taskexpire=tasktime + timedelta(days=7), istask=1)
return JsonResponse({"code": 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): def apirisk(req):
a = req.GET.get('a') a = req.GET.get('a')

View File

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