Browse Source

perf: 风险人员库优化详情界面

fix: 优化无投诉人信息及联系方式的不展示该字段
fix: 修复模型超市分页时切换到其他类型,无数据展示的BUG
fit: 风险问题录入时调用重新计算分值的接口
fit: 用户管理-新增用户功能
main
wxc 1 year ago
parent
commit
2f5ed4824f
  1. 6
      src/api/sensitivePerception/model.ts
  2. 9
      src/api/system/user.ts
  3. 3
      src/components/negative/distribute.vue
  4. 46
      src/views/sensitivePerception/Model.vue
  5. 22
      src/views/sensitivePerception/RiskPersonnel.vue
  6. 101
      src/views/system/Police.vue
  7. 79
      src/views/system/User.vue
  8. 4
      src/views/work/Done.vue
  9. 4
      src/views/work/Query.vue
  10. 4
      src/views/work/Todo.vue

6
src/api/sensitivePerception/model.ts

@ -7,6 +7,12 @@ export function listModel(query) {
});
}
export function getModel(id) {
return request.get({
url: '/models/' + id
});
}
export function treeModel() {
return request.get({
url: '/models/tree'

9
src/api/system/user.ts

@ -7,9 +7,16 @@ export function listUser(query) {
});
}
export function updateUser(body) {
export function addUser(body) {
return request.post({
url: '/user',
body
});
}
export function updateUser(body) {
return request.put({
url: '/user',
body
});
}

3
src/components/negative/distribute.vue

@ -32,7 +32,6 @@
filterable
v-model="form.departId"
@change="handleSelectDepart"
@node-click="(node) => form.departName = node.shortName"
/>
<div class="tips mt-10">
<p>请根据问题信息的内容再次确认涉及单位是否正确</p>
@ -155,7 +154,7 @@ const rules = {
function handleSelectDepart(val: string) {
form.value.departName = departs.value.filter(
(item) => item.id === val
)[0].name;
)[0].shortName;
}
async function validate() {

46
src/views/sensitivePerception/Model.vue

@ -630,7 +630,7 @@
</footer>
</el-dialog>
<el-dialog title="模型详情" v-model="detailShow" top="5vh" width="70vw">
<el-dialog title="模型详情" v-model="detailShow" top="5vh" width="70vw" style="margin-bottom: 2vh">
<header class="model-info-header" style="">
<el-row :gutter="40">
<el-col :span="2">
@ -674,16 +674,14 @@
<label>创建单位</label>
<span>{{ activeModel.createDepartName || "/" }}</span>
</div>
<div class="col col-6" v-if="form.modelDataType">
<div class="col col-6">
<label>预警类型</label>
<span>{{
modelDataType === '1'? form.modelType === "2" ? "预警处置" : "预警问题" : '提醒通知'
}}</span>
</div>
<span>{{ form.modelDataType === "1"
? form.modelType === "1"
? "预警问题"
: "预警处置"
: "提醒通知" }}</span>
</div>
<el-divider />
<div class="row">
<div class="col col-6">
<label>分发方式</label>
<span>{{
@ -693,7 +691,11 @@
)
}}</span>
</div>
<div class="col col-6" v-if="activeModel.distributionCycle">
</div>
<div v-if="activeModel.distributionCycle">
<el-divider />
<div class="row">
<div class="col col-6">
<label>分发周期</label>
<span>
<span>{{
@ -725,10 +727,15 @@
<div class="col col-6" v-if="activeModel.approvalFlow">
<label>审核流程</label>
<span>{{
getDictLable(dict.approvalFlow, activeModel.approvalFlow)
getDictLable(
dict.approvalFlow,
activeModel.approvalFlow
)
}}</span>
</div>
</div>
</div>
<el-divider />
<div class="flex end mb-20">
<el-button type="primary" plain @click="goClue">{{
@ -749,7 +756,7 @@
</div>
<div class="mb-10">
<h4 style="margin: 10px 0" class="text-primary">预警记录</h4>
<div style="min-height: 300px">
<div style="min-height: 200px">
<div class="table-container">
<el-table :data="tableData" size="small">
<template
@ -849,7 +856,7 @@ import {
addModel,
updateModel,
delModel,
listModel,
listModel
} from "@/api/sensitivePerception/model";
import { listModelClue } from "@/api/sensitivePerception/modelClue";
import { listTopModelClueRecords } from "@/api/sensitivePerception/modelClue";
@ -914,9 +921,13 @@ onMounted(() => {
function handleChangeClass(id) {
query.value.classId = id;
getList();
}
watch(() => query.value.classId, () => {
query.value.current = 1
getList();
})
const show = ref(false);
const mode = ref("add");
const form = ref({
@ -949,7 +960,12 @@ function handleEdit() {
show.value = true;
mode.value = "edit";
form.value = { ...activeModel.value };
form.value.problems = [];
if (activeModel.value.involveProblem) {
form.value.involveProblem = activeModel.value.involveProblem.split(',')
} else {
form.value.involveProblem = [];
}
}
function handleAddProblem() {

22
src/views/sensitivePerception/RiskPersonnel.vue

@ -98,6 +98,7 @@
label="管控单位"
prop="controlDepartName"
width="120"
show-overflow-tooltip
/>
<el-table-column label="人员标签" width="240">
<template #default="{ row }">
@ -283,7 +284,7 @@
}}
</div>
<span style="font-size: 24px" class="mt-10"
>风险指数</span
>{{ getRiskTitle(personal.riskPersonal?.riskScore) }}</span
>
</div>
</el-col>
@ -293,6 +294,7 @@
<div
v-for="(item, index) in personal.riskClues"
:key="index"
class="mb-20"
>
<h4>{{ item.riskName }}</h4>
<div v-for="risk in item.riskIndexs" :key="risk">
@ -926,6 +928,22 @@ function getScoreType(score) {
}
return "green";
}
function getRiskTitle(score) {
if (score >= 80) {
return "极高风险";
}
if (score >= 60) {
return "较高风险";
}
if (score >= 40) {
return "中级风险";
}
if (score >= 20) {
return "较低风险";
}
return "极低风险";
}
</script>
<style lang="scss" scoped>
.socre-box {
@ -985,6 +1003,7 @@ function getScoreType(score) {
line-height: 60px;
padding: 0 20px;
color: #222;
font-weight: 700;
}
.risk-anchor {
height: 40px;
@ -1028,6 +1047,7 @@ function getScoreType(score) {
.second-title {
color: var(--color);
padding-left: 8px;
font-size: 16px;
}
:deep() {
.el-table {

101
src/views/system/Police.vue

@ -102,10 +102,7 @@
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
v-perms="['police:import']"
>
<el-button
type="primary"
>
<el-button type="primary">
<template #icon>
<icon name="el-icon-Upload" />
</template>
@ -260,13 +257,12 @@
<el-button
type="danger"
link
@click="handleDel(row)"
@click="handleShowDel(row)"
v-perms="['police:del']"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
@ -481,17 +477,45 @@
</footer>
</el-dialog>
<el-dialog title="删除" v-model="delDialog">
<el-form>
<el-form-item title="删除原因">
<el-select>
<el-option></el-option>
<el-dialog :title="delTitle" v-model="delDialog" width="500">
<el-form :label-width="120" :model="delFormData" ref="delFormRef">
<el-form-item
label="删除原因"
prop="option"
:rules="{
required: true,
message: '请输入姓名',
}"
>
<el-select v-model="delFormData.option" clearable>
<el-option :value="`调离`">调离</el-option>
<el-option :value="`退休`">退休</el-option>
<el-option :value="`离职`">离职</el-option>
<el-option :value="`其他`">其他</el-option>
</el-select>
</el-form-item>
<el-form-item title="其他原因">
<el-input />
<el-form-item
label="其他原因"
prop="delReason"
:rules="{
required: true,
message: '请输入姓名',
}"
v-if="delFormData.option === `其他`"
>
<el-input
v-model="delFormData.delReason"
type="textarea"
placeholder="其他原因请详细描述"
clearable
:autosize="{ minRows: 3 }"
/>
</el-form-item>
</el-form>
<footer class="flex end">
<el-button @click="show = false">取消</el-button>
<el-button type="primary" @click="handleDel">确定</el-button>
</footer>
</el-dialog>
</template>
<script setup>
@ -630,22 +654,6 @@ function getWorkYear(employmentDate) {
return moment().diff(moment(employmentDate), "month") + "个月";
}
async function handleDel(row) {
const result = await feedback.prompt(`删除原因`, `确定要删除 ${row.name}`, {
inputType: 'textarea',
inputPlaceholder: '请输入',
inputErrorMessage: '请输入删除原因',
inputValidator: (val) => {
return val ? true: false;
}
})
await delPolice(row.id, {
reason: result.value
});
feedback.msgSuccess("操作成功");
getList();
}
import { ElLoading } from "element-plus";
let importLoading;
function beforeUpload() {
@ -656,21 +664,46 @@ function beforeUpload() {
});
}
function handleSuccess(result) {
console.log('handleSuccess', result)
console.log("handleSuccess", result);
importLoading.close();
if (result.code !== 200) {
feedback.msgError(result.message);
return
return;
}
getList()
getList();
}
function handleError(result) {
console.log(result)
console.log(result);
importLoading.close();
feedback.msgError(result.message || "上传失败!");
}
const delDialog = ref(false)
const delDialog = ref(false);
const delFormData = ref({});
const delTitle = ref("");
function handleShowDel(row) {
delDialog.value = true;
delTitle.value = `确定要删除 ${row.name}`;
delFormData.value.id = row.id;
}
const delFormRef = ref();
async function handleDel(row) {
await delFormRef.value.validate();
let reason = delFormData.value.option
if (delFormData.value.option === '其他') {
reason = delFormData.value.delReason
}
await delPolice(delFormData.value.id, {
reason: delFormData.value.delReason,
});
feedback.msgSuccess("操作成功");
delDialog.value = false;
delFormData.value = {}
getList();
}
</script>
<style lang="scss" scoped>
</style>

79
src/views/system/User.vue

@ -36,8 +36,15 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<div class="flex end">
</el-row>
</el-form>
<div class="flex between">
<el-button type="primary" @click="handleShowAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
新增用戶</el-button
>
<div>
<el-button type="primary" @click="getList">
<template #icon>
@ -48,9 +55,6 @@
<el-button @click="reset">重置</el-button>
</div>
</div>
</el-col>
</el-row>
</el-form>
</header>
<div class="table-container">
<el-table :data="users">
@ -127,14 +131,22 @@
width="600"
>
<el-form :label-width="120" ref="formRef" :model="form">
<el-form-item label="登录名">
<el-form-item label="登录名" :rules="{
required: true,
message: '请輸入登录名',
trigger: ['blur'],
}" prop="userName">
<el-input
v-model="form.userName"
placeholder="请输入登录名"
:disabled="mode === 'edit'"
/>
</el-form-item>
<el-form-item label="姓名">
<el-form-item label="姓名" :rules="{
required: true,
message: '请輸入姓名',
trigger: ['blur'],
}" prop="nickName">
<el-input v-model="form.nickName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item label="邮箱">
@ -143,7 +155,11 @@
<el-form-item label="手机号">
<el-input v-model="form.mobile" placeholder="请输入手机号" />
</el-form-item>
<el-form-item label="管理员类型">
<el-form-item label="管理员类型" :rules="{
required: true,
message: '请选择管理员类型',
trigger: ['blur'],
}" prop="userType">
<el-select
v-model="form.userType"
placeholder="请选择管理员类型"
@ -152,7 +168,11 @@
<el-option value="admin" label="普通管理员" />
</el-select>
</el-form-item>
<el-form-item label="角色">
<el-form-item label="角色" :rules="{
required: true,
message: '请选择角色',
trigger: ['blur'],
}" prop="roleIds">
<el-select
v-model="form.roleIds"
placeholder="请选择角色"
@ -174,6 +194,18 @@
placeholder="请输入用户描述"
/>
</el-form-item>
<el-form-item label="用戶密码" v-if="mode === 'add'" :rules="{
required: true,
message: '请输入用户密码',
trigger: ['blur'],
}" prop="password">
<el-input
type="password"
v-model="form.password"
placeholder="请输入用戶密码"
/>
<p>用户密码默认为123456</p>
</el-form-item>
</el-form>
<footer class="flex end">
<el-button @click="show = false">取消</el-button>
@ -182,7 +214,7 @@
</el-dialog>
</template>
<script setup>
import { listUser, updateUser } from "@/api/system/user";
import { listUser, addUser, updateUser } from "@/api/system/user";
import { listRole } from "@/api/system/role";
import feedback from "@/utils/feedback";
@ -211,7 +243,9 @@ getList();
const show = ref(false);
const mode = ref("add");
const form = ref({});
const form = ref({
password: '123456'
});
const formRef = ref(null);
function handleEdit(row) {
show.value = true;
@ -233,10 +267,33 @@ function submit() {
getList();
feedback.msgSuccess("操作成功");
});
} else {
addUser(form.value).then(() => {
show.value = false;
form.value = {}
getList();
feedback.msgSuccess("操作成功");
});
}
}
});
}
watch(mode, (val) => {
if (val === 'add') {
form.value = {
password: '123456'
}
}
})
function handleShowAdd() {
mode.value = "add";
show.value = true;
}
</script>
<style lang="scss" scoped>
</style>

4
src/views/work/Done.vue

@ -283,11 +283,11 @@
</div>
</div>
<div class="row mt-10">
<div class="col col-6">
<div class="col col-6" v-if="row.responderName">
<label>投诉反映人</label>
<span>{{ row.responderName }}</span>
</div>
<div class="col col-6">
<div class="col col-6" v-if="row.contactPhone">
<label>联系电话</label>
<span>{{ row.contactPhone }}</span>
</div>

4
src/views/work/Query.vue

@ -279,11 +279,11 @@
</div>
</div>
<div class="row mt-10">
<div class="col col-6">
<div class="col col-6" v-if="row.responderName">
<label>投诉反映人</label>
<span>{{ row.responderName }}</span>
</div>
<div class="col col-6">
<div class="col col-6" v-if="row.contactPhone">
<label>联系电话</label>
<span>{{ row.contactPhone }}</span>
</div>

4
src/views/work/Todo.vue

@ -274,11 +274,11 @@
</div>
</div>
<div class="row mt-10">
<div class="col col-6">
<div class="col col-6" v-if="row.responderName">
<label>投诉反映人</label>
<span>{{ row.responderName }}</span>
</div>
<div class="col col-6">
<div class="col col-6" v-if="row.contactPhone">
<label>联系电话</label>
<span>{{ row.contactPhone }}</span>
</div>

Loading…
Cancel
Save