Browse Source

1、国家信访投诉,数据批量导入(根据国家信访模板)以及问题批量下发功能完善;

2、公安局信访投诉,数据批量导入(根据公安信访模板)以及问题批量下发功能完善;

3、组织机构管理新增照片上传功能,在单位问题详情照片展示;
main
wxc 1 year ago
parent
commit
57d7a28ec9
  1. 1
      public/imgs/personal.svg
  2. BIN
      src/assets/images/defaultPhoto.jpg
  3. BIN
      src/assets/images/defaultPhoto.png
  4. 87
      src/components/data/distrbute.vue
  5. 92
      src/views/Home.vue
  6. 31
      src/views/data/Gabxf.vue
  7. 38
      src/views/data/Gjxf.vue
  8. 65
      src/views/sensitivePerception/DepartNegative.vue
  9. 2
      src/views/sensitivePerception/RiskPersonnel.vue
  10. 166
      src/views/system/Depart.vue

1
public/imgs/personal.svg

@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1734424076808" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1867" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M512 265.6m-265.6 0a265.6 265.6 0 1 0 531.2 0 265.6 265.6 0 1 0-531.2 0Z" fill="#e6e6e6" p-id="1868"></path><path d="M953.6 924.8c0 54.4-108.8 99.2-163.2 99.2h-556.8c-54.4 0-163.2-44.8-163.2-99.2 0-179.2 147.2-326.4 326.4-326.4h230.4c179.2 0 326.4 147.2 326.4 326.4z" fill="#e6e6e6" p-id="1869"></path></svg>

After

Width:  |  Height:  |  Size: 641 B

BIN
src/assets/images/defaultPhoto.jpg

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

BIN
src/assets/images/defaultPhoto.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

87
src/components/data/distrbute.vue

@ -54,7 +54,7 @@
prop="thingDesc" prop="thingDesc"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column label="操作" width="140"> <el-table-column label="操作" width="140">
<template #default="{ row }"> <template #default="{ row }">
<el-button <el-button
@ -80,7 +80,76 @@
</el-dialog> </el-dialog>
<el-dialog title="任务分发" v-model="distributeShow" width="50vw" top="5vh"> <el-dialog title="任务分发" v-model="distributeShow" width="50vw" top="5vh">
<el-form :label-width="120" ref="formRef" :model="form" v-loading="loading"> <el-form
:label-width="120"
ref="formRef"
:model="form"
v-loading="loading"
>
<el-form-item
label="业务类别"
prop="businessTypeCode"
:rules="{
required: true,
message: '请选择业务类别',
trigger: ['blur'],
}"
>
<el-select
v-model="form.businessTypeCode"
@change="
(val) =>
(form.businessTypeName = dict.businessType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
style="width: 280px"
>
<el-option
v-for="item in dict.businessType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label="涉嫌问题"
prop="involveProblem"
:rules="{
required: true,
message: '请选择涉嫌问题',
trigger: ['blur'],
}"
>
<el-select
v-model="form.involveProblem"
multiple
clearable
style="width: 280px"
>
<el-option
v-for="item in dict.suspectProblem"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item label="涉及警种" prop="policeType">
<el-select
v-model="form.policeType"
clearable
style="width: 280px"
>
<el-option
v-for="item in dict.policeType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item <el-form-item
label="办理时限" label="办理时限"
prop="timeLimit" prop="timeLimit"
@ -124,7 +193,11 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<footer class="flex end mt-20"> <footer class="flex end mt-20">
<el-button type="primary" size="large" @click="handleSubmit" v-loading="loading" <el-button
type="primary"
size="large"
@click="handleSubmit"
v-loading="loading"
>确认下发</el-button >确认下发</el-button
> >
</footer> </footer>
@ -135,7 +208,7 @@ import useCatchStore from "@/stores/modules/catch";
import { distributePetitionComplaint } from "@/api/data/petitionComplaint"; import { distributePetitionComplaint } from "@/api/data/petitionComplaint";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
const dict = catchStore.getDicts(["timeLimit", "approvalFlow"]); const dict = catchStore.getDicts(["businessType", "suspectProblem", "policeType", "timeLimit", "approvalFlow"]);
const props = defineProps({ const props = defineProps({
show: { show: {
@ -173,13 +246,13 @@ function handleShowDistributeDialog() {
distributeShow.value = true; distributeShow.value = true;
} }
const loading = ref(false) const loading = ref(false);
async function handleSubmit() { async function handleSubmit() {
await formRef.value.validate(); await formRef.value.validate();
loading.value = true loading.value = true;
form.value.data = props.data; form.value.data = props.data;
await distributePetitionComplaint(form.value); await distributePetitionComplaint(form.value);
loading.value = false loading.value = false;
form.value = {}; form.value = {};
distributeShow.value = false; distributeShow.value = false;
show.value = false; show.value = false;

92
src/views/Home.vue

@ -9,7 +9,9 @@
:key="index" :key="index"
@click="goQuery(item)" @click="goQuery(item)"
> >
<section class="flex column v-center overall-item pointer"> <section
class="flex column v-center overall-item pointer"
>
<div> <div>
<icon <icon
:name="`local-icon-${item.icon}`" :name="`local-icon-${item.icon}`"
@ -27,7 +29,12 @@
<h2 class="text-bold">今日统计</h2> <h2 class="text-bold">今日统计</h2>
</div> </div>
<div class="flex wrap box"> <div class="flex wrap box">
<section class="flex column v-center daily-item pointer" v-for="item in todayNumber" :key="item.name" @click="goQuery2(item)"> <section
class="flex column v-center daily-item pointer"
v-for="item in todayNumber"
:key="item.name"
@click="goQuery2(item)"
>
<div class="number">{{ item.total }}</div> <div class="number">{{ item.total }}</div>
<span>{{ item.name }}</span> <span>{{ item.name }}</span>
</section> </section>
@ -42,51 +49,76 @@
<div class="mt-16"> <div class="mt-16">
<h2 class="text-bold">系统链接</h2> <h2 class="text-bold">系统链接</h2>
</div> </div>
<div class="external-links-item text-center text-bold mt-18 pointer" v-for="item in links" :key="item">{{ item }}</div> <div
class="external-links-item text-center text-bold mt-18 pointer"
v-for="item in links"
:key="item"
@click="goLink(item.url)"
>
{{ item.title }}
</div>
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
</template> </template>
<script setup> <script setup>
import { flowNumberAndTodayNumber } from '@/api/statistics' import { flowNumberAndTodayNumber } from "@/api/statistics";
const flowNumber = ref([]) const flowNumber = ref([]);
const todayNumber = ref([]) const todayNumber = ref([]);
flowNumberAndTodayNumber().then(data => { flowNumberAndTodayNumber().then((data) => {
flowNumber.value = data.flowNumber; flowNumber.value = data.flowNumber;
todayNumber.value = data.todayNumber; todayNumber.value = data.todayNumber;
}) });
const links = ['民意感知', '视频督察', '情指行', '执法办案'] const links = [
{
title: "民意感知",
url: 'http://65.47.6.114:8001'
},
{
title: '视频督察',
url: 'http://65.47.26.34'
},
{
title: '情指行',
url: 'http://65.32.34.30/home/ui/#/'
},
{
title: '执法办案',
url: 'http://65.47.4.100:8080'
}
];
const router = useRouter() function goLink(url) {
window.open(url)
}
const router = useRouter();
function goQuery(item) { function goQuery(item) {
if (item.icon === 'sign') { if (item.icon === "sign") {
router.push('/query?processingStatus=signing') router.push("/query?processingStatus=signing");
} }
if (item.icon === 'verify') { if (item.icon === "verify") {
router.push('/query?processingStatus=processing') router.push("/query?processingStatus=processing");
} }
if (item.icon === 'delay') { if (item.icon === "delay") {
router.push('/query?extensionFlag=true') router.push("/query?extensionFlag=true");
} }
if (item.icon === 'completedApprove') { if (item.icon === "completedApprove") {
router.push('/query?processingStatus=approval') router.push("/query?processingStatus=approval");
} }
} }
function goQuery2(item) { function goQuery2(item) {
if (item.name === '今日问题') { if (item.name === "今日问题") {
router.push('/query?crtTime=today') router.push("/query?crtTime=today");
} }
if (item.name === '今日办结') { if (item.name === "今日办结") {
} }
if (item.name === '累计问题') { if (item.name === "累计问题") {
router.push('/query') router.push("/query");
} }
if (item.name === '累计办结') { if (item.name === "累计办结") {
router.push('/query?processingStatus=completed') router.push("/query?processingStatus=completed");
} }
} }
</script> </script>
@ -136,8 +168,8 @@ function goQuery2(item) {
height: 90px; height: 90px;
line-height: 90px; line-height: 90px;
font-size: 24px; font-size: 24px;
background: linear-gradient( 180deg, #E9EBFD 0%, #EBEDFF 100%); background: linear-gradient(180deg, #e9ebfd 0%, #ebedff 100%);
border: 1px solid #19257D; border: 1px solid #19257d;
color: var(--primary-color); color: var(--primary-color);
} }
</style> </style>

31
src/views/data/Gabxf.vue

@ -45,6 +45,17 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="状态">
<el-select
v-model="query.distributionState"
clearable
>
<el-option label="未分发" value="0"></el-option>
<el-option label="已分发" value="1"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
@ -165,6 +176,13 @@
>移除</el-button >移除</el-button
> >
</template> </template>
<el-button
v-if="row.negativeId && row.distributionState === '1'"
type="primary"
link
@click="handleAction(row)"
>处理详情
</el-button>
<el-button type="danger" link @click="handleDel(row)" <el-button type="danger" link @click="handleDel(row)"
>删除</el-button >删除</el-button
> >
@ -200,6 +218,12 @@
v-model:data="distributeList" v-model:data="distributeList"
@update="getList" @update="getList"
/> />
<negative-dialog
v-model="negativeShow"
:id="activeNegativeId"
@close="negativeShow = false"
/>
</template> </template>
<script setup> <script setup>
import { BASE_PATH } from "@/api/request"; import { BASE_PATH } from "@/api/request";
@ -276,6 +300,13 @@ function handleRemoveDistribute(row) {
1 1
); );
} }
const activeNegativeId = ref("");
const negativeShow = ref(false);
function handleAction(row) {
negativeShow.value = true;
activeNegativeId.value = row.negativeId;
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

38
src/views/data/Gjxf.vue

@ -45,6 +45,17 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6">
<el-form-item label="状态">
<el-select
v-model="query.distributionState"
clearable
>
<el-option label="未分发" value="0"></el-option>
<el-option label="已分发" value="1"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
@ -118,13 +129,10 @@
<span v-if="row.massVisits === false"></span> <span v-if="row.massVisits === false"></span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column label="被投诉机构" show-overflow-tooltip>
label="被投诉机构"
show-overflow-tooltip
>
<template #default="{ row }"> <template #default="{ row }">
<span>{{ row.secondDepartName }}</span> <span>{{ row.secondDepartName }}</span>
<span>{{ row.thirdDepartName}}</span> <span>{{ row.thirdDepartName }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -169,6 +177,13 @@
>移除</el-button >移除</el-button
> >
</template> </template>
<el-button
v-if="row.negativeId && row.distributionState === '1'"
type="primary"
link
@click="handleAction(row)"
>处理详情
</el-button>
<el-button type="danger" link @click="handleDel(row)" <el-button type="danger" link @click="handleDel(row)"
>删除</el-button >删除</el-button
> >
@ -204,6 +219,12 @@
v-model:data="distributeList" v-model:data="distributeList"
@update="getList" @update="getList"
/> />
<negative-dialog
v-model="negativeShow"
:id="activeNegativeId"
@close="negativeShow = false"
/>
</template> </template>
<script setup> <script setup>
import { import {
@ -268,6 +289,13 @@ function handleRemoveDistribute(row) {
1 1
); );
} }
const activeNegativeId = ref("");
const negativeShow = ref(false);
function handleAction(row) {
negativeShow.value = true;
activeNegativeId.value = row.negativeId;
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
</style> </style>

65
src/views/sensitivePerception/DepartNegative.vue

@ -178,27 +178,37 @@
<el-row class="mb-20"> <el-row class="mb-20">
<el-col :span="8"> <el-col :span="8">
<h5>单位情况</h5> <h5>单位情况</h5>
<div class="row"> <el-row>
<div class="col col-24"> <el-col :span="12">
<label>单位名称</label> <div class="row">
<span>{{ departInfo.name }}</span> <div class="col col-24">
</div> <label>单位名称</label>
<div class="col col-24"> <span>{{ departInfo.name }}</span>
<label>所长</label> </div>
<span>{{ departInfo.mainRole }}</span> <div class="col col-24">
</div> <label>所长</label>
<div class="col col-24"> <span>{{ departInfo.mainRole }}</span>
<label>副所长</label> </div>
<span> <div class="col col-24">
<span <label>副所长</label>
v-for="item in departInfo.deputyRole" <span>
:key="item" <span
class="mr-10" v-for="item in departInfo.deputyRole"
>{{ item }}</span :key="item"
> class="mr-10"
</span> >{{ item }}</span
</div> >
</div> </span>
</div>
</div>
</el-col>
<el-col :span="12" v-if="departInfo.departImg">
<img
:src="`${BASE_PATH}/file/stream/${departInfo.departImg}`"
style="max-height: 96px;"
/>
</el-col>
</el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<description-pair <description-pair
@ -438,7 +448,11 @@
</el-scrollbar> </el-scrollbar>
</el-dialog> </el-dialog>
<alarm-dialog v-model="showNotification" :departId="activeDepartId" @close="showNotification = false" /> <alarm-dialog
v-model="showNotification"
:departId="activeDepartId"
@close="showNotification = false"
/>
<negative-dialog <negative-dialog
v-model="negativeShow" v-model="negativeShow"
@ -447,6 +461,7 @@
/> />
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { BASE_PATH } from "@/api/request";
import vCharts from "vue-echarts"; import vCharts from "vue-echarts";
import { import {
listDepartNegative, listDepartNegative,
@ -485,7 +500,6 @@ function getList() {
}); });
} }
function reset() { function reset() {
query.value = { query.value = {
current: 1, current: 1,
@ -500,13 +514,12 @@ function reset() {
} }
let showNotification = ref(false); let showNotification = ref(false);
const activeDepartId = ref('') const activeDepartId = ref("");
const handleShowNotification = (row) => { const handleShowNotification = (row) => {
showNotification.value = true; showNotification.value = true;
activeDepartId.value = row.departId activeDepartId.value = row.departId;
}; };
onMounted(() => { onMounted(() => {
getList(); getList();
}); });

2
src/views/sensitivePerception/RiskPersonnel.vue

@ -230,7 +230,7 @@
style="height: 180px; width: 140px" style="height: 180px; width: 140px"
/> />
<img <img
src="@/assets/images/defaultPhoto.png" src="/imgs/personal.svg"
v-else v-else
style="height: 180px; width: 140px" style="height: 180px; width: 140px"
/> />

166
src/views/system/Depart.vue

@ -111,7 +111,9 @@
@click="getList" @click="getList"
>查询</el-button >查询</el-button
> >
<el-button @click="reset">重置</el-button> <el-button @click="reset"
>重置</el-button
>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
@ -193,62 +195,95 @@
<el-dialog <el-dialog
:title="mode === 'add' ? '新增机构' : '编辑机构'" :title="mode === 'add' ? '新增机构' : '编辑机构'"
v-model="show" v-model="show"
width="600" width="700"
> >
<el-form :model="form" :label-width="120" ref="fomrRef"> <el-form :model="form" :label-width="120" ref="fomrRef">
<el-form-item <el-row :gutter="20">
label="上级机构" <el-col :span="15">
prop="pid" <el-form-item
:rules="{ label="上级机构"
required: true, prop="pid"
message: '请选择上级机构', :rules="{
trigger: ['change'], required: true,
}" message: '请选择上级机构',
v-if="form.id !== '12630'" trigger: ['change'],
> }"
<depart-tree-select v-model="form.pid" /> v-if="form.id !== '12630'"
</el-form-item> >
<el-form-item <depart-tree-select v-model="form.pid" />
label="机构全称" </el-form-item>
prop="name" <el-form-item
:rules="{ label="机构全称"
required: true, prop="name"
message: '请输入机构全称', :rules="{
trigger: ['blur'], required: true,
}" message: '请输入机构全称',
> trigger: ['blur'],
<el-input placeholder="请输入" v-model="form.name" /> }"
</el-form-item> >
<el-form-item <el-input placeholder="请输入" v-model="form.name" />
label="机构简称" </el-form-item>
prop="shortName" <el-form-item
:rules="{ label="机构简称"
required: true, prop="shortName"
message: '请输入机构简称', :rules="{
trigger: ['blur'], required: true,
}" message: '请输入机构简称',
> trigger: ['blur'],
<el-input placeholder="请输入" v-model="form.shortName" /> }"
</el-form-item> >
<el-form-item <el-input
label="机构编码" placeholder="请输入"
prop="code" v-model="form.shortName"
:rules="{ />
required: true, </el-form-item>
message: '请输入机构编码', </el-col>
trigger: ['blur'], <el-col :span="9">
}" <el-upload
> :action="`${BASE_PATH}/file/upload`"
<el-input placeholder="机构编码 430" v-model="form.code" /> :headers="{ Authorization: getToken() }"
</el-form-item> :show-file-list="false"
<el-form-item label="排序" prop="orderNo"> @success="handleSuccess"
<el-input
placeholder="机构排序号,数字越小越靠前" accept="image/*"
v-model="form.orderNo" >
type="number" <img v-if="form.img" :src="`${BASE_PATH}/file/stream/${form.img}`" class="depart-img" />
/> <div class="flex v-center center column upload-action" v-else>
<p>机构排序号数字越小越靠前</p> <icon :size="16" name="el-icon-Plus" />
</el-form-item> <span>上传照片</span>
</div>
</el-upload>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="机构编码"
prop="code"
:rules="{
required: true,
message: '请输入机构编码',
trigger: ['blur'],
}"
>
<el-input
placeholder="机构编码 430"
v-model="form.code"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="排序" prop="orderNo">
<el-input
placeholder="机构排序号,数字越小越靠前"
v-model="form.orderNo"
type="number"
/>
<p>机构排序号数字越小越靠前</p>
</el-form-item>
</el-col>
</el-row>
<el-form-item <el-form-item
label="状态" label="状态"
prop="status" prop="status"
@ -275,6 +310,8 @@
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import { getToken } from "@/utils/token";
import { BASE_PATH } from "@/api/request";
import { Status } from "@/enums/appEnums"; import { Status } from "@/enums/appEnums";
import { import {
departTreeList, departTreeList,
@ -373,6 +410,25 @@ async function submit() {
getList(); getList();
feedback.msgSuccess("操作成功"); feedback.msgSuccess("操作成功");
} }
function handleSuccess(result, file) {
if (result.code !== 200) {
feedback.msgError('上传失败')
return
}
form.value.img = result.data.filePath
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.upload-action {
width: 230px;
height: 130px;
background: rgba(0, 0, 0, 0.04);
border-radius: 8px;
border: 1px solid rgba(0, 0, 0, 0.15);
}
.depart-img {
width: 230px;
height: 130px;
}
</style> </style>
Loading…
Cancel
Save