Browse Source

fix:督察任务发布(合并改造 + 重点人员督察开发(非表单))

main
pengwei 7 months ago
parent
commit
fcc8356521
  1. 35
      src/api/mobileSupervision/Sampling.ts
  2. 10
      src/api/mobileSupervision/selfexamination.ts
  3. 71
      src/api/mobileSupervision/taskManagement.ts
  4. 9
      src/api/mobileSupervision/testingAlcohol.ts
  5. 116
      src/components/data/gab-replenish-lead.vue
  6. 13
      src/components/data/gab-replenish.vue
  7. 115
      src/components/data/gj-replenish-lead.vue
  8. 8
      src/components/data/gj-replenish.vue
  9. 7
      src/components/depart-tree-select.vue
  10. 7
      src/components/file/upload.vue
  11. 7
      src/components/police-picker.vue
  12. 3
      src/style/element.scss
  13. 11
      src/views/data/Gabxf.vue
  14. 12
      src/views/data/Gjxf.vue
  15. 6
      src/views/datav/subonedatav/SubOneSceneInsp.vue
  16. 4
      src/views/datav/subonedatav/SubOneVideoInsp.vue
  17. 2083
      src/views/mobileSupervise/Inspection.vue
  18. 454
      src/views/mobileSupervise/Inspection2.vue
  19. 783
      src/views/mobileSupervise/Sampling.vue
  20. 1
      src/views/mobileSupervise/Selfexamination.vue

35
src/api/mobileSupervision/Sampling.ts

@ -0,0 +1,35 @@
import request from "@/api/request";
/**
*
* */
export function selectListData(query){
return request.get({
url:'/sampling',
query
})
}
/**
*
* */
export function getSamplingPoliceData(body){
return request.post({
url:'/sampling/postSamplingPolice',
body
})
}
//提交抽检规则
export function addOrUpData(body){
return request.post({
url:'/sampling',
body
})
}
export function delSampling(id){
return request.del({
url: `/sampling/${id}`
})
}

10
src/api/mobileSupervision/selfexamination.ts

@ -20,3 +20,13 @@ export function addSelfexamination(body) {
body
});
}
/**
* -
* */
export function getSelfexaminationProblem(id,query){
return request.get({
url:`/task/selfexamination/${id}/problem`,
query
})
}

71
src/api/mobileSupervision/taskManagement.ts

@ -0,0 +1,71 @@
import request from "@/api/request";
/**
*
* */
export function getListFun(query){
return request.get({
url: '/task/management',
query
});
}
/**
*
* */
export function addTaskManagement(body) {
return request.post({
url: '/task/management/addTaskManagement',
body
});
}
/**
*
* */
export function delTaskManagement(id){
return request.del({
url:`/task/management/${id}`
})
}
/**
*
* */
export function getTaskManagementDetail(id){
return request.get({
url:`/task/management/${id}`
})
}
/**
*
* */
export function getDepartByIds(query){
return request.get({
url:'/depart/getDepartByIds',
query
})
}
/**
*
* */
export function importTemperancePolice(body){
return request.post({
url: '/task/management/import',
body
});
}
/**
*
* */
export function importSupRiskPersonal(body){
return request.post({
url:'/task/management/importSupRiskPersonal',
body
})
}

9
src/api/mobileSupervision/testingAlcohol.ts

@ -21,6 +21,15 @@ export function listTestingAlcohol(query) {
});
}
/**
*
* */
export function TestingAlcoholDetail(taskId) {
return request.get({
url: `/task/testingAlcohol/getDetail/${taskId}`,
});
}
export function listTestingAlcoholPeoples(taskId, query) {
return request.get({
url: `/task/testingAlcohol/${taskId}/people`,

116
src/components/data/gab-replenish-lead.vue

@ -0,0 +1,116 @@
<script setup>
import { BASE_PATH } from "@/api/request";
import {replenishExcelGab,replenishLedaoExcelGab} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
let fileList = ref([])
let loading =ref(false)
const dialogTitle = ref("公安部信访集访导入")
const {replenishType} = defineProps({
replenishType:{
type: String,
defalut: '1'
}
})
const emit=defineEmits(['success','close'])
//
watch(()=>replenishType,()=>{
fileList.value=[]
if (replenishType == 1){
dialogTitle.value='公安部信访集访导入'
}else{
dialogTitle.value='公安部信访领导接访导入'
}
console.log('replenishType',replenishType)
},{deep:true,immediate:true})
/**
* 上传文件
* */
const handleNext = async ()=>{
//body
const formData = new FormData();
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
if (replenishType == 1){
await replenishExcelGab(formData);
}else{
await replenishLedaoExcelGab(formData);
}
feedback.msgSuccess("操作成功");
emit("success")
} catch (e) {
loading.value = false;
throw e;
}
loading.value = false;
}
</script>
<template>
<!--公安部数据补充-->
<el-dialog :title="dialogTitle" width="80vw" ref="dialogRef" top="8vh">
<div v-loading="loading">
<el-upload
drag
:multiple="false"
:auto-upload="false"
:show-file-list="false"
v-model:file-list="fileList"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length === 0">
<el-icon class="el-icon--upload">
<upload-filled/>
</el-icon>
<div class="el-upload__text">
<p>点击或拖拽文件到此区域上传</p>
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"
><Select
/></el-icon>
<div class="el-upload__text">
已选择文件{{
fileList[fileList.length - 1].name
}}
</div>
</template>
</el-upload>
<div class="mt-20">
<span>文件模板</span>
<a
v-if="replenishType==1"
class="link"
:href="`${BASE_PATH}/templates/公安部信访集访导入模板.xlsx`"
target="__blank"
>公安部信访集访导入模板.xlsx 下载</a
>
<a
v-else
class="link"
:href="`${BASE_PATH}/templates/公安部信访领导接访导入模板.xlsx`"
target="__blank"
>公安部信访领导接访模板.xlsx 下载</a
>
</div>
<footer class="flex end mt-20 v-center">
<el-button type="primary"
size="large"
@click="handleNext"
:disabled="loading">
确认
</el-button>
</footer>
</div>
</el-dialog>
</template>
<style scoped lang="scss">
</style>

13
src/components/data/gab-replenish.vue

@ -9,19 +9,20 @@ const dialogTitle = ref("公安部信访集访导入")
const {replenishType} = defineProps({
replenishType:{
type: String,
defalut: 1
defalut: '1'
}
})
const emit=defineEmits(['success','close'])
//
watch(()=>replenishType,()=>{
fileList.value=[]
if (replenishType === 1){
if (replenishType == 1){
dialogTitle.value='公安部信访集访导入'
}else{
dialogTitle.value='公安部信访领导接访导入'
}
})
console.log('replenishType',replenishType)
},{deep:true,immediate:true})
/**
* 上传文件
@ -32,7 +33,7 @@ const handleNext = async ()=>{
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
if (replenishType === 1){
if (replenishType == 1){
await replenishExcelGab(formData);
}else{
await replenishLedaoExcelGab(formData);
@ -50,7 +51,7 @@ const handleNext = async ()=>{
<template>
<!--公安部数据补充-->
<el-dialog :title="dialogTitler" width="80vw" ref="dialogRef" top="8vh">
<el-dialog :title="dialogTitle" width="80vw" ref="dialogRef" top="8vh">
<div v-loading="loading">
<el-upload
drag
@ -84,7 +85,7 @@ const handleNext = async ()=>{
<span>文件模板</span>
<a
v-if="replenishType.value===1"
v-if="replenishType==1"
class="link"
:href="`${BASE_PATH}/templates/公安部信访集访导入模板.xlsx`"
target="__blank"

115
src/components/data/gj-replenish-lead.vue

@ -0,0 +1,115 @@
<script setup>
import { BASE_PATH } from "@/api/request";
import {replenishExcelGab,replenishLedaoExcelGab} from "@/api/data/petitionComplaint";
import feedback from "@/utils/feedback";
let fileList = ref([])
let loading =ref(false)
const dialogTitle = ref("国家信访集访导入")
const {replenishType} = defineProps({
replenishType:{
type: String,
defalut: 1
}
})
const emit=defineEmits(['success','close'])
//
watch(()=>replenishType,()=>{
fileList.value=[]
if (replenishType == 1){
dialogTitle.value='国家信访集访导入'
}else{
dialogTitle.value='国家信访领导接访导入'
}
})
/**
* 上传文件
* */
const handleNext = async ()=>{
//body
const formData = new FormData();
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
if (replenishType == 1){
await replenishExcelGab(formData);
}else{
await replenishLedaoExcelGab(formData);
}
feedback.msgSuccess("操作成功");
emit("success")
} catch (e) {
loading.value = false;
throw e;
}
loading.value = false;
}
</script>
<template>
<!--公安部数据补充-->
<el-dialog :title="dialogTitler" width="80vw" ref="dialogRef" top="8vh">
<div v-loading="loading">
<el-upload
drag
:multiple="false"
:auto-upload="false"
:show-file-list="false"
v-model:file-list="fileList"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length == 0">
<el-icon class="el-icon--upload">
<upload-filled/>
</el-icon>
<div class="el-upload__text">
<p>点击或拖拽文件到此区域上传</p>
</div>
</template>
<template v-else>
<el-icon class="el-icon--upload"
><Select
/></el-icon>
<div class="el-upload__text">
已选择文件{{
fileList[fileList.length - 1].name
}}
</div>
</template>
</el-upload>
<div class="mt-20">
<span>文件模板</span>
<a
v-if="replenishType==1"
class="link"
:href="`${BASE_PATH}/templates/国家信访集访导入模板.xlsx`"
target="__blank"
>国家信访集访导入模板.xlsx 下载</a
>
<a
v-else
class="link"
:href="`${BASE_PATH}/templates/国家信访领导接访导入模板.xlsx`"
target="__blank"
>国家信访领导接访导入模板.xlsx 下载</a
>
</div>
<footer class="flex end mt-20 v-center">
<el-button type="primary"
size="large"
@click="handleNext"
:disabled="loading">
确认
</el-button>
</footer>
</div>
</el-dialog>
</template>
<style scoped lang="scss">
</style>

8
src/components/data/gj-replenish.vue

@ -16,7 +16,7 @@ const emit=defineEmits(['success','close'])
//
watch(()=>replenishType,()=>{
fileList.value=[]
if (replenishType === 1){
if (replenishType == 1){
dialogTitle.value='国家信访集访导入'
}else{
dialogTitle.value='国家信访领导接访导入'
@ -32,7 +32,7 @@ const handleNext = async ()=>{
formData.append("file", fileList.value[fileList.value.length - 1].raw);
loading.value = true;
try {
if (replenishType === 1){
if (replenishType == 1){
await replenishExcelGab(formData);
}else{
await replenishLedaoExcelGab(formData);
@ -62,7 +62,7 @@ const handleNext = async ()=>{
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
class="mt-20"
>
<template v-if="fileList.length === 0">
<template v-if="fileList.length == 0">
<el-icon class="el-icon--upload">
<upload-filled/>
</el-icon>
@ -84,7 +84,7 @@ const handleNext = async ()=>{
<div class="mt-20">
<span>文件模板</span>
<a
v-if="replenishType.value===1"
v-if="replenishType==1"
class="link"
:href="`${BASE_PATH}/templates/国家信访集访导入模板.xlsx`"
target="__blank"

7
src/components/depart-tree-select.vue

@ -1,5 +1,5 @@
<template>
<el-tree-select :data="data" :props="{label: 'shortName', value: 'id'}" node-key="id" :default-expanded-keys="['12630']" clearable filterable check-strictly />
<el-tree-select :size="size" :data="data" :props="{label: 'shortName', value: 'id'}" node-key="id" :default-expanded-keys="['12630']" clearable filterable check-strictly />
</template>
<script setup>
import useCatchStore from '@/stores/modules/catch'
@ -15,6 +15,10 @@ const props = defineProps({
auth: {
type: Boolean,
default: true
},
size:{
type: String,
default: 'small'
}
})
@ -27,7 +31,6 @@ onMounted(() => {
watch(departs, () => {
getData()
})
function getData() {
if (!props.showRoot && departs.length && departs[0].id === ROOT_DEPART_ID) {
data.value = departs[0].children

7
src/components/file/upload.vue

@ -4,6 +4,7 @@
:action="`${BASE_PATH}/file/upload`"
:headers="{ Authorization: getToken() }"
multiple
:drag="uploadDrag"
:before-upload="beforeUpload"
@progress="uploadProgress"
@success="handleSuccess"
@ -45,7 +46,11 @@ const props = defineProps({
accept: {
type: String,
default: '*'
}
},
uploadDrag:{
type:Boolean,
default:false
}
});
const emit = defineEmits(["update:files"]);

7
src/components/police-picker.vue

@ -7,7 +7,7 @@
</template>
</el-button>
</div>
<el-dialog title="选择警员" v-model="show" width="50vw" top="5vh">
<el-dialog title="选择警员" v-model="show" width="60vw" top="5vh">
<div style="min-height: 70vh">
<el-row :gutter="20">
<el-col :span="6">
@ -102,8 +102,8 @@
</template>
</el-table-column>
<el-table-column
label="身份证"
prop="idCode"
label="机构名称"
prop="departShortName"
width="200"
/>
</el-table>
@ -177,6 +177,7 @@ function getList() {
loading.value = true
listPolice(query.value).then((data) => {
polices.value = data.records;
console.log('polices',polices)
total.value = data.total;
loading.value = false
});

3
src/style/element.scss

@ -80,5 +80,6 @@ div.el-card {
}
.el-popper {
max-width: 500px;
max-width: 100%;
}

11
src/views/data/Gabxf.vue

@ -265,7 +265,9 @@
<data-gab-replenish v-model="replenishShow"
:replenishType="replenishType"
@close="replenishShow = false" @success="successFun"/>
<data-gab-replenish-lead v-model="replenishShow2"
:replenishType="replenishType2"
@close="replenishShow2 = false" @success="successFun"/>
<data-distrbute
v-model:show="distributeShow"
v-model:data="distributeList"
@ -398,9 +400,11 @@ const query = ref({
problemSourcesCode: ProblemSources.GABXF,
});
const replenishType =ref("1")
const replenishType2 =ref("2")
const list = ref([]);
const total = ref(0);
const replenishShow = ref(false)
const replenishShow2= ref(false)
function getList() {
listPetitionComplaint(query.value).then((data) => {
@ -468,11 +472,12 @@ function handleShowImport() {
function handleShowImportReplenish(){
replenishType.value="1"
console.log('replenishType',replenishType.value)
replenishShow.value=true
}
function handleShowldjfReplenish(){
replenishType.value='2'
replenishShow.value=true
replenishType2.value='2'
replenishShow2.value=true
}
/**
* 补充成功的事件

12
src/views/data/Gjxf.vue

@ -251,7 +251,11 @@
<data-gj-replenish v-model="replenishShow"
:replenishType="replenishType"
@close="replenishShow = false" @success="successFun"/>
<data-gj-replenish-lead
v-model="replenishShow2"
:replenishType="replenishType2"
@close="replenishShow2 = false" @success="successFun"
/>
<data-distrbute
@ -367,7 +371,9 @@ import {BASE_PATH} from "@/api/request";
const catchStore = useCatchStore();
const replenishShow = ref(false)
const replenishShow2 =ref(false)
const replenishType =ref("1")
const replenishType2 =ref("2")
const dict = catchStore.getDicts(["distributionState", "initialPetition"]);
const route = useRoute()
const query = ref({
@ -399,8 +405,8 @@ function handleShowImportReplenish(){
* 领导接访数据导入
* */
function handleShowldjfReplenish(){
replenishType.value='2'
replenishShow.value=true
replenishType2.value='2'
replenishShow2.value=true
}
/**
* 导出数据

6
src/views/datav/subonedatav/SubOneSceneInsp.vue

@ -1142,10 +1142,10 @@ const getSubOneProblemTypeRateData = async (departId, times) => {
const getSubOneSupervisionNotifyCountData = async (departId, times) => {
const res = await getSubOneSupervisionNotifyCount(departId, times)
Object.assign(overview.value, {
correctionRate: Number(res.overview.rectifyRate),
correctionRate: Number(res.overview.completedRate),
supervisionNotifyPreTotal: Number(res.overview.personNumber),
supervisionNotifyChangingTotal: Number(res.overview.rectifingNumber),
supervisionNotifyChangedTotal: Number(res.overview.rectifedNumber),
supervisionNotifyChangingTotal: Number(res.overview.processingNumber),
supervisionNotifyChangedTotal: Number(res.overview.completedNumber),
supervisionNotifyTotal: Number(res.overview.problemNumber),
supervisionNotifyOrgTotal: Number(res.overview.departNumber),
});

4
src/views/datav/subonedatav/SubOneVideoInsp.vue

@ -53,7 +53,7 @@
ref="subOneVideoProRank"
>
<datav-tab-item label="派出所" name="1">
<el-scrollbar height="280px">
<el-scrollbar height="380px">
<datav-chart-bar
:data="fxsjRankList"
size="large"
@ -62,7 +62,7 @@
</el-scrollbar>
</datav-tab-item>
<datav-tab-item label="大队" name="2">
<el-scrollbar height="280px">
<el-scrollbar height="380px">
<datav-chart-bar
:data="jsdwRankList"
size="large"

2083
src/views/mobileSupervise/Inspection.vue

File diff suppressed because it is too large Load Diff

454
src/views/mobileSupervise/Inspection2.vue

@ -0,0 +1,454 @@
<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="督察单位">
<depart-tree-select v-model="query.departId" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="任务名称">
<el-input
placeholder="请输入任务名称"
v-model="query.nickName"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="督察类型">
<el-select v-model="form.supervisionType" clearable>
<el-option
v-for="item in dict.supervisionType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
</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>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<div class="table-container">
<el-table :data="list">
<el-table-column label="任务名称" prop="taskName" />
<el-table-column
label="督察单位"
prop="supDepartName"
width="120"
/>
<el-table-column
label="参与人员"
prop="persons"
show-overflow-tooltip
/>
<el-table-column
label="任务类型"
prop="supervisionType"
width="100"
align="center"
/>
<el-table-column
label="任务内容"
prop="taskContent"
show-overflow-tooltip
/>
<el-table-column label="督察时间" prop="updateTime" width="280">
<template #default="{ row }">
<span>{{ row.beginTime }}</span>
<span>-</span>
<span>{{ row.endTime }}</span>
</template>
</el-table-column>
<el-table-column label="任务状态">
<template #default="{ row }">
<span v-if="row.taskStatus === 'todo'">执行中</span>
<span v-if="row.taskStatus === 'done'">已完成</span>
</template>
</el-table-column>
<el-table-column label="被督察单位数" prop="departNumber" align="center" />
<el-table-column label="发现问题数" prop="problemNumber" align="center" />
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowDetail(row)"
>查看详情</el-button
>
<el-button
type="primary"
link
@click="handleProblemsShow(row)"
>督察详情</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</div>
<el-dialog
title="发布任务"
v-model="show"
width="1076px"
top="5vh"
style="margin-bottom: 0"
>
<el-scrollbar max-height="76vh">
<el-form
:label-width="150"
ref="formRef"
:model="form"
style="min-height: 66vh"
>
<el-form-item
label="任务名称"
:rules="{
required: true,
message: '请输入任务名称',
trigger: ['blur'],
}"
prop="taskName"
>
<el-input
v-model="form.taskName"
placeholder="请输入任务名称"
/>
</el-form-item>
<el-form-item
label="督察单位"
:rules="{
required: true,
message: '请选择',
}"
prop="supDepartId"
>
<div style="width: 300px">
<depart-tree-select v-model="form.supDepartId" />
</div>
</el-form-item>
<el-form-item
label="督察人员"
:rules="{
required: true,
message: '请选择',
}"
prop="persons"
>
<police-picker v-model="form.persons" />
</el-form-item>
<el-form-item
label="督察类型"
:rules="{
required: true,
message: '请选择',
}"
prop="supervisionType"
>
<el-select
v-model="form.supervisionType"
clearable
style="width: 300px"
>
<el-option
v-for="item in dict.supervisionType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
label="督察时间"
prop="times"
:rules="{
required: true,
message: '请选择',
}"
>
<div style="width: 800px">
<el-date-picker
v-model="form.times"
type="datetimerange"
range-separator="-"
start-placeholder="开始时间"
end-placeholder="结束时间"
/>
</div>
</el-form-item>
<el-form-item
prop="taskContentHtml"
:rules="{
required: true,
message: '请输入任务内容'
}"
label-position="top"
>
<div style="width: 100%">
<quill-editor
ref="quillRef"
v-model="form.taskContentHtml"
style="
min-height: 200px;
max-height: 360px;
overflow: auto;
"
/>
</div>
</el-form-item>
</el-form>
</el-scrollbar>
<footer class="flex end mt-20">
<el-button type="primary" @click="submit" size="large"
>发布</el-button>
</footer>
</el-dialog>
<el-dialog title="任务详情" v-model="detailShow" width="40vw">
<div class="row mb-40">
<div class="col col-24">
<label>任务名称</label>
<span>{{ activeRow.taskName }}</span>
</div>
<div class="col col-24">
<label>督察单位</label>
<span>{{ activeRow.supDepartName }}</span>
</div>
<div class="col col-24">
<label>参与人员</label>
<span>{{ activeRow.persons }}</span>
</div>
<div class="col col-24">
<label>任务类型</label>
<span>{{ activeRow.supervisionType }}</span>
</div>
<div class="col col-24">
<label>督察时间</label>
<span
><span>{{ activeRow.beginTime }}</span>
<span>-</span>
<span>{{ activeRow.endTime }}</span></span
>
</div>
<div class="col col-24">
<label>任务内容</label>
<span>{{ activeRow.taskContent }}</span>
</div>
</div>
<footer class="flex end mt-20">
<el-button size="large" @click="detailShow = false">关闭</el-button>
</footer>
</el-dialog>
<el-dialog
title="问题清单"
v-model="problemsShow"
width="60vw"
style="margin-bottom: 0"
>
<header class="mb-20">
<el-form :label-width="94">
<el-row>
<el-col :span="6">
<el-form-item label="具体情况">
<el-input
v-model="problemQuery.detail"
clearable
placeholder="请输入具体情况"
/>
</el-form-item>
</el-col>
</el-row>
<div class="flex end">
<el-button type="primary" @click="getProblems">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="problemReset">重置</el-button>
</div>
</el-form>
</header>
<div style="min-height: 400px">
<div class="table-container">
<el-table :data="problems" :max-height="640" min-height="300">
<el-table-column
label="是否存在督察问题"
prop="hasProblem"
width="120"
align="center"
>
<template #default="{ row }">
<span v-if="row.hasProblem"></span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column
label="单位"
prop="departName"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="问题类型"
prop="problemType"
width="140"
show-overflow-tooltip
/>
<el-table-column label="具体情况" prop="detail" />
<el-table-column
label="创建时间"
prop="createTime"
width="160"
/>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowPeople(row)"
>详情</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getProblems"
@current-change="getProblems"
:page-sizes="[10, 20, 50]"
v-model:page-size="problemQuery.size"
v-model:current-page="problemQuery.current"
layout="total, sizes, prev, pager, next"
:total="problemTotal"
>
</el-pagination>
</div>
</div>
</el-dialog>
</template>
<script setup>
import {
listInspection,
addInspection,
listInspectionProblems,
} from "@/api/mobileSupervision/inspection";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["supervisionType"]);
const list = ref([]);
const query = ref({
current: 1,
size: 10,
});
const total = ref(0);
function getList() {
listInspection(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
});
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
getList();
const show = ref(false);
const form = ref({});
const formRef = ref(null);
const quillRef = ref()
async function submit() {
await formRef.value.validate();
form.value.taskContent = quillRef.value.getText()
await addInspection(form.value);
feedback.msgSuccess("发布成功");
show.value = false;
getList();
form.value = {};
}
function handleShowAdd() {
show.value = true;
}
const detailShow = ref(false);
const activeRow = ref({});
function handleShowDetail(row) {
activeRow.value = row;
detailShow.value = true;
}
const problemsShow = ref(false);
const problems = ref([]);
const problemQuery = ref({});
const problemTotal = ref(0);
function handleProblemsShow(row) {
activeRow.value = row;
problemsShow.value = true;
getProblems();
}
function getProblems() {
listInspectionProblems(activeRow.value.id).then((data) => {
problems.value = data.records;
});
}
function problemReset() {
problemQuery.value = {};
}
</script>
<style lang="scss" scoped>
h5 {
margin-bottom: 10px;
}
.pepole-container > * {
margin-bottom: 8px;
}
</style>

783
src/views/mobileSupervise/Sampling.vue

@ -0,0 +1,783 @@
<script setup>
import useCatchStore from "@/stores/modules/catch";
import {selectListData,getSamplingPoliceData,addOrUpData} from '@/api/mobileSupervision/Sampling'
import feedback from "@/utils/feedback";
import {timeFormat,getDictLable} from "@/utils/util";
import {getDepartProfile} from "@/api/sensitivePerception/profileDepart";
import {BASE_PATH} from "@/api/request";
const loading = ref(false)
const policeLoading =ref(false)
const total =ref(10)
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["inspectorType","personType"]);
let genderDict = ref([
{
dictValue:'1',
dictLabel:'男'
},
{
dictValue:'2',
dictLabel:'女'
}
])
const shortcuts = [
{
text: '近一周',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
return [start, end]
},
},
{
text: '近一个月',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
return [start, end]
},
},
{
text: '近三个月',
value: () => {
const end = new Date()
const start = new Date()
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
return [start, end]
},
},
]
let list =ref([])
let query = ref({
current: 1,
size: 10,
departBranch:false,
confinementTime: []
})
//
let editShow = ref(false)
let detailShow =ref(false)
let editData = ref({
samplingObjectList:null
})
const reset =()=>{
query.value={
current: 1,
size: 10,
departBranch:false,
confinementTime: []
}
getList()
}
//
const getList = ()=>{
loading.value = true
selectListData(query.value).then((res) => {
list.value = res.records;
total.value = res.total;
loading.value = false
})
}
//
const editFun = ()=>{
editShow.value =!editShow.value
}
//
const getDataDetail =(row)=>{
editData.value=row
editData.value.samplingObjectList.forEach(async (x) => {
x.departName = await getDepartShortNameFun(x.deptId)
})
detailShow.value=true
}
/**
* 添加抽检对象
* */
const addSamplingObjectFun = ()=>{
if(editData.value.samplingObjectList){
editData.value.samplingObjectList.push(
{
deptId:null,
value:null
}
)
}else{
editData.value.samplingObjectList=[
{
deptId:null,
value:null
}
]
}
}
/**
* 删除抽检对象
* @param key 抽检对象下标
* */
const delSamplingObjectFun =(key) =>{
if(editData.value != null){
editData.value.samplingObjectList.splice(key,1);
}
}
/**
* 重新生成抽检对象名单
* */
const getSamplingPolices =async ()=>{
policeLoading.value=true
if(computedData(editData.value) < 0 || computedData(editData.value) > 0){
feedback.msgWarning("【被抽检对象抽检总人数】 和 【抽检人数】不吻合")
}else{
const res = await getSamplingPoliceData(editData.value)
editData.value.samplingPolices = res;
}
policeLoading.value=false
}
/**
* 删除标签
* @param index 下标
* */
const handleTagClose = (index) => {
editData.value.samplingPolices.splice(index,1)
}
const computedData = (data)=>{
console.log(data.samplingObjectList)
let one = data.samplingObjectList.reduce((accumulator, currentValue) => {
return accumulator + ( currentValue.value?currentValue.value:0);
},0)
return (data.samplingNum?data.samplingNum:0) - one;
}
//
const getDepartShortNameFun = async(val)=>{
const res = await getDepartProfile(val)
if(res){
console.log('res',res.departInfo?.shortName)
return res.departInfo?.shortName;
}
}
/**
* 提交表单
* */
const handleSumbit =async ()=>{
if(computedData(editData.value) < 0 || computedData(editData.value) > 0){
feedback.msgWarning("【被抽检对象抽检总人数】 和 【抽检人数】不吻合")
}else{
const res = await addOrUpData(editData.value)
editShow.value=false
feedback.msgSuccess("操作成功");
getList()
}
}
/**
* 数据导出
* */
const handleExport = async ()=>{
let data = Object.assign({},editData.value)
delete data.samplingPolices
delete data.startTime
delete data.endTime
if(!data.samplingTime){
delete data.samplingTime
}
if(data.samplingObjectList){
data.orgStr =
data.samplingObjectList.map(s=>s.deptId).join(",")
delete data.samplingObjectList
}else{
}
window.open(`${BASE_PATH}/sampling/export/samplingPoling?` + new URLSearchParams(data).toString())
}
onMounted(()=>{
getList()
})
</script>
<template>
<div class="container">
<header>
<el-form>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="抽检名称">
<el-input v-model="query.samplingName" placeholder="请输入抽检名称"/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="督察类型">
<el-select v-model="query.inspectorType" clearable>
<el-option v-for="(item,key) in dict.inspectorType"
:value="item.dictValue"
:label="item.dictLabel"
:key="key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="年龄范围">
<el-row :gutter="20">
<el-col :span="12">
<el-input-number placeholder="最小年龄" v-model="query.ageMin" :controls="false"></el-input-number>
</el-col>
<el-col :span="12">
<el-input-number placeholder="最大年龄" v-model="query.ageMax" :controls="false"></el-input-number>
</el-col>
</el-row>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="性别">
<el-select v-model="query.gender" clearable>
<el-option v-for="(item,key) in genderDict"
:value="item.dictValue"
:label="item.dictLabel"
:key="key"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="人员属性">
<el-select v-model="query.personnelType" clearable >
<el-option v-for="(item,key) in dict.personType"
:value="item.dictValue"
:label="item.dictLabel"
:key="key"
></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否操作违反六项规定情节">
<el-select v-model="query.drinkAlcohol">
<el-option value="1" label="是"></el-option>
<el-option value="2" label="否"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="领导人数">
<el-input-number v-model="query.leadersNumber" style="width: 100%" placeholder="请输入领导人数" :controls="false" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="民警比率">
<el-input-number v-model="query.policeRatio" style="width: 100%" placeholder="请输入民警比率" :controls="false" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="辅警比率">
<el-input-number v-model="query.assistRatio" style="width: 100%" placeholder="请输入辅警比率" :controls="false" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="时间范围">
<el-date-picker
value-format="YYYY-MM-DD"
type="daterange"
unlink-panels
format="YYYY-MM-DD"
range-separator="~"
start-placeholder="开始时间"
end-placeholder="结束时间"
:shortcuts="shortcuts"
v-model="query.samplingTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="被抽检次数">
<el-input-number style="width: 100%;" v-model="query.samplingNumber" :controls="false" placeholder="请输入被抽检次数"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="是否值班人员">
<el-select v-model="query.beDuty">
<el-option value="1" label="是"></el-option>
<el-option value="2" label="否"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between mt-20 mb-26">
<div>
<el-button type="primary" @click="editFun">创建人员抽检</el-button>
</div>
<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>
<main>
<div class="table-container" v-loading="loading" >
<el-table
:data="list"
ref="tableRef"
style="width: 100%"
>
<el-table-column prop="samplingName" label="抽检名称" width="120"></el-table-column>
<el-table-column prop="inspectorType" label="督察类型" width="120"></el-table-column>
<el-table-column prop="samplingInspection" show-overflow-tooltip label="抽检规则" width="300"></el-table-column>
<el-table-column prop="samplingNum" label="抽检人数" width="100"></el-table-column>
<el-table-column prop="crtName" label="创建人" width="100"></el-table-column>
<el-table-column prop="crtTime" label="创建时间" width="160">
<template #default="{row}">
{{ timeFormat(row.crtTime) }}
</template>
</el-table-column>
<el-table-column prop="state" label="状态" width="120"></el-table-column>
<el-table-column label="操作" fixed="right" min-width="180">
<template #default="{ row }">
<div class="flex v-center">
<el-button type="primary" link @click="getDataDetail(row)">查看详情</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getList"
@current-change="getList"
:page-sizes="[10, 20, 50]"
v-model:page-size="query.size"
v-model:current-page="query.current"
layout="total, sizes, prev, pager, next"
:total="total"
/>
</div>
</main>
<el-dialog v-model="editShow" title="创建人员抽检" width="900px">
<el-form ref="editForm">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="抽检名称">
<el-input v-model="editData.samplingName" style="width: 100%"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="督察类型">
<el-select v-model="editData.inspectorType">
<el-option v-for="(item,key) in dict.inspectorType"
:value="item.dictValue"
:label="item.dictLabel"
:key="key"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<hr style="color: #abaaaa;opacity: 0.2"/>
<div>
<!-- 基础信息-->
<div class="flex v-center" style="height:20px;">
<h4>抽检规则</h4>
</div>
<div class="flex v-center" style="height:30px;">
<h5>基础信息</h5>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="年龄范围">
<el-row :gutter="20">
<el-col :span="11">
<el-input-number v-model="editData.ageMin" controls-position="right" placeholder="开始年龄"></el-input-number>
</el-col>
<el-col :span="2"></el-col>
<el-col :span="11">
<el-input-number v-model="editData.ageMax" controls-position="right" placeholder="结束年龄"></el-input-number>
</el-col>
</el-row>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
<el-radio-group v-model="editData.gender">
<el-radio value="1" label="男"></el-radio>
<el-radio value="2" label="女"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="人员属性">
<el-checkbox-group v-model="editData.personnelTypeArray">
<el-checkbox v-for="(item,key) in dict.personType"
:value="item.dictValue"
:label="item.dictLabel"
:key="key"></el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否存在违反六项规定情节">
<el-radio-group v-model="editData.drinkAlcohol">
<el-radio value="1" label="是"></el-radio>
<el-radio value="2" label="否"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<hr style="color: #abaaaa;opacity: 0.2"/>
<!-- 人员比率-->
<div class="flex v-center" style="height:30px;">
<h5>人员比率</h5>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="抽检人数">
<el-input-number v-model="editData.samplingNum" style="width: 70%" placeholder="请输入抽检人数" :controls-position="'right'"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="领导人数">
<el-input-number v-model="editData.leadersNumber" style="width: 70%" placeholder="请输入领导人数" :controls-position="'right'"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="民警比率">
<el-input-number v-model="editData.policeRatio" style="width: 70%" placeholder="请输入民警比率" :controls-position="'right'"></el-input-number>%
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="辅警比率">
<el-input-number v-model="editData.assistRatio" style="width: 70%" placeholder="请输入辅警比率" :controls-position="'right'"></el-input-number>%
</el-form-item>
</el-col>
</el-row>
<!-- 抽检规则-->
<div class="flex v-center" style="height:30px;">
<h5>抽检规则</h5>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="时间范围">
<el-date-picker
value-format="YYYY-MM-DD"
type="daterange"
unlink-panels
format="YYYY-MM-DD"
range-separator="~"
start-placeholder="开始时间"
end-placeholder="结束时间"
:shortcuts="shortcuts"
v-model="editData.samplingTime"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="被抽检次数">
<el-input-number v-model="editData.samplingNumber" style="width:70%" :controls-position="'right'"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="距最后一次检测时间">
<el-input-number v-model="editData.distanceDay" style="width: 70%;" :controls-position="'right'"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否值班人员">
<el-radio-group v-model="editData.beDuty">
<el-radio value="1" label="是"></el-radio>
<el-radio value="2" label="否"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<hr style="color: #abaaaa;opacity: 0.2"/>
<!-- 被抽检对象-->
<div class="flex between" style="height:30px; align-items: center">
<div>
<h5>被抽检对象</h5>
</div>
<div>
<el-button @click="addSamplingObjectFun">添加对象</el-button>
</div>
</div>
<el-card shadow="never" style="background-color: #F9FAFF">
<el-row :gutter="20" style="margin-bottom: 10px" v-for="(item,key) in editData.samplingObjectList" :key="key">
<el-col :span="14">
<depart-tree-select
:size="'large'"
placeholder="请选择案件管辖单位"
v-model="item.deptId"
/>
</el-col>
<el-col :span="6">
<div class="flex " style="align-items: center">
<div style="padding-right: 10px">人数</div>
<div>
<el-input-number v-model="item.value" size="large" :controls="false" placeholder="请输入人数" />
</div>
</div>
</el-col>
<el-col :span="4">
<el-button
type="danger"
plain
size="large"
style="width: 80%"
@click="delSamplingObjectFun(key)"
>删除
</el-button>
</el-col>
</el-row>
</el-card>
<!-- 抽检对象名单-->
<hr style="color: #abaaaa;opacity: 0.2"/>
<div class="flex between" style="height:30px; align-items: center">
<div>
<h5>抽检对象名单<span></span></h5>
</div>
<div>
<el-button @click="getSamplingPolices">重新生成抽检对象</el-button>
</div>
</div>
<el-card shadow="never" style="background-color: #F9FAFF;min-height: 50px" v-loading="policeLoading">
<div class="flex flex-wrap" style="width: 100%">
<el-tag
closable
:disable-transitions="false"
style="padding: 5px 10px;margin-right: 10px;margin-bottom: 5px"
v-for="(polices,index) in editData.samplingPolices"
:key="polices.empNo"
@close="handleTagClose(index)"
>
<span>{{polices.name}}</span> {{polices.empNo}}
</el-tag>
</div>
<div style="display: flex;justify-content: flex-end">
<el-button type="primary" @click="handleExport">导出Excel表</el-button>
</div>
</el-card>
</div>
</el-form>
<footer class="flex end" style="margin-top: 10px">
<el-button @click="editShow = false" size="large">取消</el-button>
<el-button type="primary" @click="handleSumbit" size="large"
>确定
</el-button
>
</footer>
</el-dialog>
<el-dialog v-model="detailShow" title="人员抽检详情" width="900px">
<el-form ref="editForm">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="抽检名称">
{{editData.samplingName}}
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="督察类型">
{{ getDictLable(
dict.inspectorType,
editData.inspectorType
) }}
</el-form-item>
</el-col>
</el-row>
<hr style="color: #abaaaa;opacity: 0.2"/>
<div>
<!-- 基础信息-->
<div class="flex v-center" style="height:20px;">
<h4>抽检规则</h4>
</div>
<div class="flex v-center" style="height:30px;">
<h5>基础信息</h5>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="年龄范围">
<span v-if="editData.ageMin"> {{editData.ageMin}} {{editData.ageMax}}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别">
{{editData.gender === '1'?'男':'女'}}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="人员属性">
<span v-for="(type,key) in editData.personnelTypeArray" :key="key" style="margin-left: 10px">
{{ getDictLable(
dict.personType,
type
) }}
</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否存在违反六项规定情节">
{{editData.drinkAlcohol === '1'?'是':'否'}}
</el-form-item>
</el-col>
</el-row>
<hr style="color: #abaaaa;opacity: 0.2"/>
<!-- 人员比率-->
<div class="flex v-center" style="height:30px;">
<h5>人员比率</h5>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="抽检人数">
{{editData.samplingNum}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="领导人数">
{{editData.leadersNumber}}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="民警比率">
{{editData.policeRatio}}%
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="辅警比率">
{{editData.assistRatio}}%
</el-form-item>
</el-col>
</el-row>
<!-- 抽检规则-->
<div class="flex v-center" style="height:30px;">
<h5>抽检规则</h5>
</div>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="时间范围">
<span v-if="editData.samplingTime">{{ `${timeFormat(editData.samplingTime[0]) } ${timeFormat(editData.samplingTime[1]) }` }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="被抽检次数">
{{editData.samplingNumber}}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="距最后一次检测时间">
{{editData.distanceDay}}
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否值班人员">
{{editData.beDuty === '1'?'是':'否'}}
</el-form-item>
</el-col>
</el-row>
<hr style="color: #abaaaa;opacity: 0.2"/>
<!-- 被抽检对象-->
<div class="flex between" style="height:30px; align-items: center">
<div>
<h5>被抽检对象</h5>
</div>
</div>
<el-card shadow="never" style="background-color: #F9FAFF">
<el-row :gutter="20" style="margin-bottom: 10px;align-items: center" v-for="(item,key) in editData.samplingObjectList" :key="key">
<el-col :span="14">
<el-form-item label="抽检单位">
{{item.departName}}
</el-form-item>
</el-col>
<el-col :span="6" >
<el-form-item label="人数">
{{item.value}}
</el-form-item>
</el-col>
<el-col :span="4">
</el-col>
</el-row>
</el-card>
<!-- 抽检对象名单-->
<hr style="color: #abaaaa;opacity: 0.2"/>
<div class="flex between" style="height:30px; align-items: center">
<div>
<h5>抽检对象名单<span></span></h5>
</div>
<div>
<!-- <el-button @click="getSamplingPolices">重新生成抽检对象</el-button>-->
</div>
</div>
<el-card shadow="never" style="background-color: #F9FAFF;min-height: 50px" v-loading="policeLoading">
<div class="flex flex-wrap" style="width: 100%">
<el-tag
:disable-transitions="false"
style="padding: 5px 10px;margin-right: 10px;margin-bottom: 5px"
v-for="(polices,index) in editData.samplingPolices"
:key="polices.empNo"
>
<span>{{polices.name}}</span> {{polices.empNo}}
</el-tag>
</div>
<div style="display: flex;justify-content: flex-end">
<el-button type="primary" @click="handleExport">导出Excel表</el-button>
</div>
</el-card>
</div>
</el-form>
</el-dialog>
</div>
</template>
<style scoped lang="scss">
.el-popper{
max-width: 100% !important;
}
</style>

1
src/views/mobileSupervise/Selfexamination.vue

@ -366,6 +366,7 @@ import {
} from "@/api/mobileSupervision/selfexamination";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import {listInspectionProblems} from "@/api/mobileSupervision/inspection";
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["supervisionType"]);

Loading…
Cancel
Save