数字督察一体化平台-前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

307 lines
11 KiB

<template>
<el-dialog title="认定办结" top="5vh" width="900px" v-model="show">
<h3>问题赋分情况</h3>
<p>
基础风险值 + (基础风险值 * 问题严重等级系数 ) + (基础风险值 * 问题发生频次系数)
<a
class="link"
:href="`${BASE_PATH}/templates/长沙公安数字督察灵敏感知体系问题赋分及风险预警机制.pdf`"
target="__blank"
>
<span>查看文档</span>
</a>
</p>
<el-form :label-width="120" ref="formRef" :model="formData">
<div v-for="(item, index) in blames" :key="index">
<h5>涉及人员{{ index + 1 }}</h5>
<div class="row">
<div class="col col-6">
<label>姓名</label>
<span>{{ item.blameName }}</span>
</div>
<div class="col col-6">
<label>警号</label>
<span>{{ item.blameEmpNo }}</span>
</div>
</div>
<div class="row">
<div
class="col col-24"
v-for="problem in item.problems"
:key="problem"
>
<label>问题类型</label>
<span>
<span>{{ problem.oneLevelContent }}</span>
<span>{{
problem.twoLevelContent
? " / " + problem.twoLevelContent
: ""
}}</span>
<span>{{
problem.threeLevelContent
? " / " + problem.threeLevelContent
: ""
}}</span>
</span>
</div>
</div>
<el-form-item
label="严重等级"
:rules="{
required: true,
message: '请选择严重等级',
trigger: ['blur'],
}"
:prop="`blames.${index}.negativeLevel`"
>
<el-radio-group
v-model="formData.blames[index].negativeLevel"
>
<el-radio
v-for="item in dict.negativeLevel"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
<div class="mb-8" style="color: #333">问题赋分</div>
<el-row>
<el-col :span="12">
<div class="mb-4">问题严重等级系数</div>
<div>
<span class="text-primary">{{
getNegativeLevelScore(
formData.blames[index].negativeLevel
)
}}</span>
<span class="ml-8">{{
formData.blames[index].negativeLevel
? "(" +
getDictLable(
dict.negativeLevel,
formData.blames[index].negativeLevel
) +
")"
: ""
}}</span>
</div>
</el-col>
<el-col :span="12">
<div class="mb-4">问题发生频次系数(年)</div>
<div>
<span class="text-primary">{{ item.frequencyScore }}</span>
<span class="ml-8">(总计{{ item.frequency }}次)</span>
</div>
</el-col>
</el-row>
<div class="row mt-8">
<div class="col col-24">
<label style="--label-width: 60px"
><span>分值计算</span></label
>
<span
>{{ item.baseScore }} + (1 *
{{
getNegativeLevelScore(
formData.blames[index].negativeLevel
)
}}) + (1 * {{ item.frequencyScore }}) =
<span class="text-danger">{{
getScore(item, index)
}}</span>
分</span
>
</div>
</div>
</div>
<div class="mt-10 mb-20 text-small">
<p>
一般影响:当问题导致一般性投诉或轻微的内部管理问题时,分值为基础分值。
</p>
<p>
严重影响:当问题导致较大投诉或内部管理问题时,分值将在基础分值的基础上增加
20%。
</p>
<p>
重大影响:当问题导致重大法律责任或产生严重负面社会影响时,分值将在基础分值的基础上增加
50%。
</p>
</div>
<h3>认定办结情况</h3>
<el-row>
<el-col :span="12">
<el-form-item
label="核查办理情况"
prop="verifySituation"
:rules="{
required: true,
message: '请选择核查办理情况',
trigger: ['blur'],
}"
>
<el-radio-group v-model="formData.verifySituation">
<el-radio
v-for="item in dict.verifySituation"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="佐证材料情况"
prop="verifyFileSituation"
:rules="{
required: true,
message: '请选择佐证材料情况',
trigger: ['blur'],
}"
>
<el-radio-group v-model="formData.verifyFileSituation">
<el-radio
v-for="item in dict.verifyFileSituation"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{
item.remark ? `(${item.remark})` : ""
}}</el-radio
>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item
label="认定办结意见"
prop="completionComment"
:rules="{
required: true,
message: '请输入认定办结意见',
trigger: ['blur'],
}"
>
<el-input
type="textarea"
v-model="formData.completionComment"
placeholder="请输入"
:autosize="{ minRows: 4 }"
/>
</el-form-item>
</el-form>
<footer class="flex end">
<el-button size="large">取消</el-button>
<el-button type="primary" size="large" @click="submit"
>认定办结</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import { BASE_PATH } from "@/api/request";
import { getCompletionInfo } from "@/api/work/negative";
import { getDictLable } from "@/utils/util";
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"verifySituation",
"verifyFileSituation",
"negativeLevel",
]);
const formData = ref({
blames: [],
});
const formRef = ref(null);
const negative = inject("negative");
const loading = ref(false);
const blames = ref([]);
let negativeLevels = [];
watch(negative, () => {
init();
});
onMounted(() => {
init();
});
async function init() {
if (!negative.value.id) {
return;
}
loading.value = true;
formData.value = {
blames: [],
};
const data = await getCompletionInfo(negative.value.id);
formData.value.blames = data.blames.map((item) => {
return {
blameIdCode: item.blameIdCode,
baseScore: item.baseScore,
frequencyScore: item.frequencyScore,
incidenceRateScore: item.incidenceRateScore,
};
});
blames.value = data.blames;
blames.value = data.blames;
negativeLevels = data.negativeLevels;
loading.value = false;
}
function getNegativeLevelScore(val) {
const results = negativeLevels.filter((item) => item.value === val);
if (!results.length) {
return 0;
}
return results[0].score;
}
function getScore(item, index) {
return (
item.baseScore +
(1 *
getNegativeLevelScore(formData.value.blames[index].negativeLevel)) +
(1 * item.frequencyScore)
).toFixed(2);
}
const emit = defineEmits(["submit"]);
const show = ref(false);
async function submit() {
await formRef.value.validate();
show.value = false;
emit("submit", formData.value);
}
function open() {
show.value = true;
}
defineExpose({
open,
});
</script>
<style lang="scss" scoped>
h3 {
margin-top: 0;
margin-bottom: 10px;
}
h5 {
margin-bottom: 10px;
}
p {
margin: 0;
}
</style>