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. 100
      src/views/sensitivePerception/Model.vue
  5. 22
      src/views/sensitivePerception/RiskPersonnel.vue
  6. 101
      src/views/system/Police.vue
  7. 95
      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() { export function treeModel() {
return request.get({ return request.get({
url: '/models/tree' 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({ return request.post({
url: '/user', url: '/user',
body body
}); });
} }
export function updateUser(body) {
return request.put({
url: '/user',
body
});
}

3
src/components/negative/distribute.vue

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

100
src/views/sensitivePerception/Model.vue

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

22
src/views/sensitivePerception/RiskPersonnel.vue

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

101
src/views/system/Police.vue

@ -102,10 +102,7 @@
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
v-perms="['police:import']" v-perms="['police:import']"
> >
<el-button <el-button type="primary">
type="primary"
>
<template #icon> <template #icon>
<icon name="el-icon-Upload" /> <icon name="el-icon-Upload" />
</template> </template>
@ -260,13 +257,12 @@
<el-button <el-button
type="danger" type="danger"
link link
@click="handleDel(row)" @click="handleShowDel(row)"
v-perms="['police:del']" v-perms="['police:del']"
>删除</el-button >删除</el-button
> >
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
<div class="flex end mt-8"> <div class="flex end mt-8">
@ -481,17 +477,45 @@
</footer> </footer>
</el-dialog> </el-dialog>
<el-dialog title="删除" v-model="delDialog"> <el-dialog :title="delTitle" v-model="delDialog" width="500">
<el-form> <el-form :label-width="120" :model="delFormData" ref="delFormRef">
<el-form-item title="删除原因"> <el-form-item
<el-select> label="删除原因"
<el-option></el-option> 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-select>
</el-form-item> </el-form-item>
<el-form-item title="其他原因"> <el-form-item
<el-input /> 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-item>
</el-form> </el-form>
<footer class="flex end">
<el-button @click="show = false">取消</el-button>
<el-button type="primary" @click="handleDel">确定</el-button>
</footer>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
@ -630,22 +654,6 @@ function getWorkYear(employmentDate) {
return moment().diff(moment(employmentDate), "month") + "个月"; 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"; import { ElLoading } from "element-plus";
let importLoading; let importLoading;
function beforeUpload() { function beforeUpload() {
@ -656,21 +664,46 @@ function beforeUpload() {
}); });
} }
function handleSuccess(result) { function handleSuccess(result) {
console.log('handleSuccess', result) console.log("handleSuccess", result);
importLoading.close(); importLoading.close();
if (result.code !== 200) { if (result.code !== 200) {
feedback.msgError(result.message); feedback.msgError(result.message);
return return;
} }
getList() getList();
} }
function handleError(result) { function handleError(result) {
console.log(result) console.log(result);
importLoading.close(); importLoading.close();
feedback.msgError(result.message || "上传失败!"); 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> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

95
src/views/system/User.vue

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

4
src/views/work/Done.vue

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

4
src/views/work/Query.vue

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

4
src/views/work/Todo.vue

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

Loading…
Cancel
Save