feat: 风险管理页面完成

This commit is contained in:
caoqianming 2024-06-11 16:42:08 +08:00
parent 90036784db
commit 34835be268
7 changed files with 479 additions and 72 deletions

View File

@ -86,6 +86,39 @@ export default {
}
},
},
checktaskset: {
list: {
name: "列表",
req: async function(data){
return await http.get(
`${config.API_URL}/dpm/checktaskset/`,
data
);
}
},
create: {
name: "创建",
req: async function(data){
return await http.post(
`${config.API_URL}/dpm/checktaskset/`,
data);
}
},
delete: {
name: "删除",
req: async function(id){
return await http.delete(
`${config.API_URL}/dpm/checktaskset/${id}/`);
}
},
toggle: {
name: "变更",
req: async function(id){
return await http.put(
`${config.API_URL}/dpm/checktaskset/${id}/toggle/`);
}
},
},
checkwork: {
list: {
name: "列表",

View File

@ -184,4 +184,4 @@ export const schedulePeriodEnum = new EnumFactory({
'minutes': '分钟',
'hours': '小时',
'days': '天',
}, parseInt)
})

View File

@ -20,15 +20,21 @@
width="80"
></el-table-column>
<el-table-column
label="限(h)"
label="(h)"
prop="expire"
width="80"
></el-table-column>
<el-table-column
label="启用"
prop="enabled"
width="50"
></el-table-column>
><template #default="scope">
<el-icon v-if="scope.row.enabled" color="green"
><CircleCheckFilled
/></el-icon>
<el-icon v-else color="red"
><CircleCloseFilled
/></el-icon>
</template></el-table-column>
<el-table-column
label="派发次数"
prop="total_run_count"
@ -38,6 +44,40 @@
label="最近派发"
prop="last_run_at"
></el-table-column>
<el-table-column label="操作" fixed="right" align="center" width="80">
<template #default="scope">
<el-popconfirm
title="确定停用/启用吗?"
@confirm="table_toggle(scope.row, scope.$index)"
>
<template #reference>
<el-button
link
size="small"
v-auth="'checktaskset.update'"
type="warning"
icon="el-icon-opportunity"
></el-button
>
</template>
</el-popconfirm>
<el-popconfirm
title="确定删除吗?"
@confirm="table_del(scope.row, scope.$index)"
>
<template #reference>
<el-button
link
size="small"
v-auth="'checktaskset.delete'"
type="danger"
icon="el-icon-delete"
></el-button
>
</template>
</el-popconfirm>
</template>
</el-table-column>
</scTable>
</template>
<script>
@ -52,18 +92,27 @@ export default {
riskLevelEnum,
manageLevelEnum,
riskTypeEnum,
apiObj: this.$API.dpm.risk.list,
apiObj: this.$API.dpm.checktaskset.list,
params: { riskpoint: this.rpId },
query: {
search: "",
},
};
},
methods: {},
created() {},
mounted() {},
computed: {},
watch: {},
components: {},
methods: {
handleQuery() {
this.$refs.table.queryData(this.query);
},
table_del(row) {
this.$API.dpm.checktaskset.delete.req(row.id).then(() => {
this.handleQuery();
});
},
table_toggle(row) {
this.$API.dpm.checktaskset.toggle.req(row.id).then(res=>{
this.handleQuery();
})
}
},
};
</script>

View File

@ -9,11 +9,61 @@
hideDo
style="height: 400px"
>
<el-table-column
label="排序"
prop="sort"
width="50"
></el-table-column>
<el-table-column
label="名称"
prop="name"
min-width="100"
></el-table-column>
<el-table-column
label="等级"
prop="level"
width="100"
><template #default="scope"
><el-tag
:type="riskLevelEnum[scope.row.level]?.type"
>{{
riskLevelEnum[scope.row.level]?.text
}}</el-tag
>
</template></el-table-column>
<el-table-column
label="LECD值"
>
<template #default="scope">
{{scope.row.riskl}}*{{scope.row.riske}}*{{scope.row.riskc}}={{scope.row.riskd}}
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="80">
<template #default="scope">
<el-button
link
size="small"
@click="table_edit(scope.row)"
type="primary"
icon="el-icon-edit"
></el-button>
<el-popconfirm
title="确定删除吗?"
@confirm="
table_del(scope.row, scope.$index)
"
>
<template #reference>
<el-button
link
size="small"
type="danger"
icon="el-icon-delete"
></el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</scTable>
</template>
<script>
@ -33,11 +83,19 @@ export default {
},
};
},
methods: {},
created() {},
mounted() {},
computed: {},
watch: {},
components: {},
methods: {
handleQuery() {
this.$refs.table.queryData(this.query);
},
table_edit(row) {
this.$emit("updateRisk", row);
},
table_del(row) {
this.$API.dpm.risk.delete.req(row.id).then(() => {
this.handleQuery();
this.$message.success("删除成功");
});
}
},
};
</script>

112
src/views/dpm/risk_form.vue Normal file
View File

@ -0,0 +1,112 @@
<template>
<el-form>
<el-form :model="saveForm" label-width="120px" ref="saveForm">
<el-row>
<el-col :span="12">
<el-form-item label="项目/步骤" required>
<el-input v-model="saveForm.name" type="textarea" :rows="1"></el-input>
</el-form-item>
<el-form-item label="检查标准">
<el-input v-model="saveForm.standard" type="textarea" :rows="2"></el-input>
</el-form-item>
<el-form-item label="危害因素">
<el-input v-model="saveForm.hazard_factors" type="textarea" :rows="2"></el-input>
</el-form-item>
<el-form-item label="可能后果">
<el-select v-model="saveForm.results" multiple>
<el-option v-for="item in resultOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="lecd判定" required>
<el-input-number :min="0" :precision="1" :step="0.1" controls-position="right" v-model="saveForm.riskl" placeholder="L值"/>
<el-input-number :min="0" :precision="1" :step="0.1" controls-position="right" v-model="saveForm.riske" placeholder="E值" style="margin-left: 2px"/>
<el-input-number :min="0" :precision="1" :step="0.1" controls-position="right" v-model="saveForm.riskc" placeholder="C值" style="margin-left: 2px"/>
<span style="margin-left: 6px">D值: <span v-if="saveForm.riskl*saveForm.riske*saveForm.riskc">{{saveForm.riskl*saveForm.riske*saveForm.riskc}}</span></span>
</el-form-item>
<el-form-item label="排序" required>
<el-input-number :min="0" controls-position="right" v-model="saveForm.sort"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工程技术措施" required>
<el-input v-model="saveForm.measure_tech" type="textarea" :rows="2"></el-input>
</el-form-item>
<el-form-item label="管理措施" required>
<el-input v-model="saveForm.measure_manage" type="textarea" :rows="2"></el-input>
</el-form-item>
<el-form-item label="培训教育措施" required>
<el-input v-model="saveForm.measure_edu" type="textarea" :rows="2"></el-input>
</el-form-item>
<el-form-item label="个体防护措施" required>
<el-input v-model="saveForm.measure_protect" type="textarea" :rows="2"></el-input>
</el-form-item>
<el-form-item label="应急处置措施" required>
<el-input v-model="saveForm.measure_emer" type="textarea" :rows="2"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div style="display: flex; justify-content: flex-end; margin-top: 10px">
<el-button
type="primary"
:loading="formSaving"
@click="formSubmit()"
> </el-button
>
</div>
</el-form>
</template>
<script>
const defaultForm = {};
export default {
props:{
riskpoint: {type: String, default: ""}
},
data() {
return {
saveForm: Object.assign({"riskpoint": this.riskpoint}, defaultForm),
formSaving: false,
resultOptions:[],
}
},
mounted() {
this.getResultOptions();
},
methods:{
setData(data){
this.saveForm = data;
},
getResultOptions() {
this.$API.system.dict.list.req({page: 0, type__code: "accident_result"}).then(res=>{
this.resultOptions = res;
})
},
formSubmit(){
this.formSaving = true;
if (this.saveForm.id) {
this.$API.dpm.risk.update
.req(this.saveForm.id, this.saveForm)
.then((res) => {
this.formSaving = false;
this.$message.success("更新成功");
this.$emit("riskConfirm");
})
.catch((e) => {
this.formSaving = false;
});
} else {
this.$API.dpm.risk.create
.req(this.saveForm)
.then((res) => {
this.formSaving = false;
this.$message.success("创建成功");
this.$emit("riskConfirm");
})
.catch((err) => {
this.formSaving = false;
});
}
}
}
}
</script>

View File

@ -174,11 +174,14 @@
</el-header>
<el-main class="nopadding">
<Risk
ref="riskTable"
:rpId="rowData.id"
v-if="defaultX == '风险列表' && rowData.id"
style="height: 100%"
@updateRisk="updateRisk"
></Risk>
<CheckTaskSet
ref="checktasksetTable"
:rpId="rowData.id"
v-if="defaultX == '排查任务配置' && rowData.id"
style="height: 100%"
@ -330,7 +333,10 @@
/>
</span>
</el-form-item>
<el-form-item label="排查备注" prop="note" required>
<el-form-item label="有效期(h)" prop="expire">
<el-input-number :min="0" controls-position="right" v-model="saveForm2.expire"/>
</el-form-item>
<el-form-item label="排查备注" prop="note">
<el-input
v-model="saveForm2.note"
clearable
@ -348,7 +354,10 @@
</template>
</el-dialog>
<el-dialog v-model="choseMyScheduleDialog" title="选择策略">
<MySchedule></MySchedule>
<MySchedule @scheduleChose="scheduleChose"></MySchedule>
</el-dialog>
<el-dialog v-model="riskDialog" title="新增/编辑" width="90%">
<RiskForm ref="riskForm" :riskpoint="rowData.id" @riskConfirm="riskConfirm"></RiskForm>
</el-dialog>
</el-container>
</template>
@ -357,9 +366,10 @@ import { riskLevelEnum, manageLevelEnum, riskTypeEnum } from "@/utils/enum.js";
import Risk from "./risk.vue";
import CheckTaskSet from "./checktaskset.vue";
import MySchedule from "@/views/sys/myschedule.vue";
import RiskForm from "./risk_form.vue";
const defaultForm = {};
export default {
components: { Risk, CheckTaskSet, MySchedule},
components: { Risk, CheckTaskSet, MySchedule, RiskForm},
data() {
return {
riskTypeEnum,
@ -368,13 +378,14 @@ export default {
formSaving: false,
saveDialog: false,
saveDialog2: false,
riskDialog: false,
choseMyScheduleDialog: false,
query: {
search: "",
},
apiObj: this.$API.dpm.riskpoint.list,
saveForm: Object.assign({}, defaultForm),
saveForm2: {},
saveForm2: {"expire": 0},
deptOptions: [],
rowData: {},
xoptions: ["风险列表", "排查任务配置"],
@ -386,8 +397,27 @@ export default {
this.getAreaOptions();
},
methods: {
updateRisk(row) {
this.riskDialog = true;
this.$nextTick(() => {
this.$refs.riskForm.setData(row);
});
},
riskConfirm(){
this.riskDialog = false;
this.$refs.riskTable.handleQuery();
},
risk_add() {
this.riskDialog = true;
},
scheduleChose(item){
this.saveForm2.myschedule = item.id;
this.saveForm2.myschedule_name = item.name;
this.choseMyScheduleDialog = false;
},
checktaskset_add() {
this.saveDialog2 = true;
this.saveForm2 = {"expire": 0};
},
rowClick(row) {
this.rowData = row;
@ -426,7 +456,27 @@ export default {
this.handleQuery();
});
},
formSubmit2() {
this.$refs.saveForm2.validate((valid)=>{
if(valid){
this.formSaving = true;
this.$API.dpm.checktaskset.create
.req(this.saveForm2)
.then((res) => {
this.formSaving = false;
this.$message.success("创建成功");
this.$refs.checktasksetTable.handleQuery();
})
.catch((err) => {
this.formSaving = false;
});
}
})
},
formSubmit() {
this.$refs.saveForm.validate((valid) => {
if (valid) {
this.formSaving = true;
if (this.saveForm.id) {
this.$API.dpm.riskpoint.update
@ -452,7 +502,8 @@ export default {
.catch((err) => {
this.formSaving = false;
});
}
}}
});
},
},
};

View File

@ -1,9 +1,9 @@
<template>
<el-button
type="primary"
icon="el-icon-plus"
@click="table_add"
></el-button>
<el-button
type="primary"
icon="el-icon-plus"
@click="table_add"
></el-button>
<el-divider></el-divider>
<scTable
ref="table"
@ -14,72 +14,176 @@
hidePagination
hideDo
style="height: 400px"
@row-click="rowClick"
>
<el-table-column label="类型" prop="name" width="80"></el-table-column>
<el-table-column label="类型" prop="name" width="80">
<template #default="scope"
>{{ scheduleTypeEnum[scope.row.type]?.text }}
</template>
</el-table-column>
<el-table-column
label="名称"
prop="name"
min-width="100"
></el-table-column>
<el-table-column label="操作" fixed="right" align="center" width="80">
<template #default="scope">
<el-popconfirm
title="确定删除吗?"
@confirm="table_del(scope.row, scope.$index)"
>
<template #reference>
<el-button
link
size="small"
v-auth="'myschedule.delete'"
type="danger"
icon="el-icon-delete"
></el-button
>
</template>
</el-popconfirm>
</template>
</el-table-column>
</scTable>
<el-dialog title="创建/编辑" v-model="dialogVisible" width="80%">
<el-form-item label="策略类型" prop="note" required>
<el-select
v-model="saveForm.type"
>
</el-select>
</el-form-item>
<el-form-item label="策略式" required>
每隔
<el-input-number
v-model="saveForm.interval_.every"
:min="1"
style="margin-left: 4px"
></el-input-number>
<el-select
v-model="saveForm.interval_.period"
>
<el-option
v-for="e in schedulePeriodEnum.values"
:key="e.key"
:value="e.key"
:label="e.text"
></el-option>
</el-select>
</el-form-item>
</el-dialog>
<el-dialog title="创建/编辑" v-model="dialogVisible" width="80%">
<el-form :model="saveForm" label-width="100px" ref="saveForm">
<el-form-item label="策略类型" required>
<el-select v-model="saveForm.type">
<el-option
v-for="e in scheduleTypeEnum.values"
:key="e.key"
:value="e.key"
:label="e.text"
></el-option>
</el-select>
</el-form-item>
<el-divider />
<el-form-item label="策略式" required v-if="saveForm.type == 10">
<div style="display: flex">
每隔
<el-input-number
v-model="saveForm.interval_.every"
:min="1"
style="margin-left: 4px"
></el-input-number>
<el-select
v-model="saveForm.interval_.period"
style="width: 200px; margin-left: 4px"
placeholder="间隔"
>
<el-option
v-for="e in schedulePeriodEnum.values"
:key="e.key"
:value="e.key"
:label="e.text"
></el-option>
</el-select>
</div>
</el-form-item>
<el-form-item label="策略式" required v-if="saveForm.type == 20">
<div style="width: 100%">
<div style="display: flex">
<span style="margin-right: 4px; width: 100px">分钟</span
><el-input
v-model="saveForm.crontab_.minute"
></el-input>
</div>
<div style="display: flex; margin-top: 4px">
<span style="margin-right: 4px; width: 100px">小时</span
><el-input v-model="saveForm.crontab_.hour"></el-input>
</div>
<div style="display: flex; margin-top: 4px">
<span style="margin-right: 4px; width: 100px"
>每周的天</span
><el-input
v-model="saveForm.crontab_.day_of_week"
></el-input>
</div>
<div style="display: flex; margin-top: 4px">
<span style="margin-right: 4px; width: 100px"
>每月的天</span
><el-input
v-model="saveForm.crontab_.day_of_month"
></el-input>
</div>
<div style="display: flex; margin-top: 4px">
<span style="margin-right: 4px; width: 100px"
>每年的月</span
><el-input
v-model="saveForm.crontab_.month_of_year"
></el-input>
</div>
</div>
</el-form-item>
</el-form>
<template #footer>
<el-button
type="primary"
:loading="formSaving"
@click="formSubmit()"
> </el-button
>
</template>
</el-dialog>
</template>
<script>
import { scheduleTypeEnum, schedulePeriodEnum } from "@/utils/enum.js";
const defaultForm = {
interval_: {},
crontab_: {}
}
interval_: {},
crontab_: {},
};
export default {
name: "myschedule",
data() {
return {
schedulePeriodEnum, scheduleTypeEnum,
dialogVisible: false,
schedulePeriodEnum,
scheduleTypeEnum,
formSaving: false,
dialogVisible: false,
apiObj: this.$API.system.myschedule.list,
query: {
search: "",
},
saveForm: Object.assign({}, defaultForm)
params: {},
saveForm: Object.assign({}, defaultForm),
};
},
methods: {
table_add(){
this.dialogVisible = true;
this.$nextTick(() => {
this.saveForm = Object.assign({}, defaultForm)
});
}
},
created() {},
mounted() {},
computed: {},
watch: {},
components: {},
rowClick(item) {
console.log(item)
this.$emit("scheduleChose", item);
},
handleQuery() {
this.$refs.table.queryData(this.query);
},
table_add() {
this.dialogVisible = true;
this.$nextTick(() => {
this.saveForm = Object.assign({}, defaultForm);
});
},
table_del(row) {
this.$API.system.myschedule.delete.req(row.id).then(() => {
this.$message.success("操作成功");
this.handleQuery();
});
},
formSubmit() {
this.formSaving = true;
this.$refs.saveForm.validate((valid) => {
if (valid) {
this.$API.system.myschedule.create
.req(this.saveForm)
.then(() => {
this.handleQuery();
this.dialogVisible = false;
this.$message.success("操作成功");
});
}
this.formSaving = false;
});
},
},
};
</script>