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

2766 lines
92 KiB

<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="任务名称">
<el-input
placeholder="请输入任务名称"
v-model="query.taskName"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="督察类型">
<el-select v-model="query.taskType" clearable>
<el-option
v-for="(item,key) in supervisionDict"
:key="key"
: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" v-loading="loading">
<el-table-column label="任务名称" prop="taskName" show-overflow-tooltip/>
<el-table-column
label="参与人员"
prop="persons"
show-overflow-tooltip
/>
<el-table-column
label="任务类型"
prop="taskType"
width="120"
align="center"
>
<template #default="{row}">
{{ getTaskType(row.taskType) }}
</template>
</el-table-column>
<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="任务状态" width="100" align="center">
<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="操作" fixed="right" min-width="120px">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowDetail(row)"
>查看详情
</el-button
>
<el-button
v-if="row.taskType === 'inspection'"
type="primary"
link
@click="handleProblemsShow(row)"
>督察详情
</el-button
>
<el-button
v-if="row.taskType === 'testing_alcohol'"
type="primary"
link
@click="handleTestingDetailShow(row)"
>检测情况
</el-button>
<el-button
v-if="row.taskType === 'selfexamination'"
type="primary"
link
@click="handleSelfProblemShow(row)"
>
自查情况
</el-button>
<el-button v-if="row.taskType === 'risk_personal'"
type="primary" link @click="showSupervise(row)"
>督察情况
</el-button>
<el-button type="primary" link @click="editTable(row)">
编辑
</el-button>
<el-button
type="danger"
link
@click="delTaskManagementFun(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="发布任务" @close="addColse" v-model="show" width="80vw" top="5vh"
style="margin-bottom: 0"
>
<el-scrollbar max-height="76vh" v-loading="editLoading">
<el-form
:label-width="120"
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="supervisionType"
>
<el-radio-group v-model="form.supervisionType" clearable style="width: 300px">
<el-radio v-for="item in dict.supervisionType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="form.supervisionType === '专项督察'" label="专项督察"
:rules="{
required: true,
message: '请选择',
}"
prop="specialType"
>
<el-radio-group v-model="form.specialType" clearable style="width: 300px">
<el-radio v-for="(item,key) in specialType"
:key="key"
:label="item.dictLabel"
:value="item.dictValue"
></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="督察时间" prop="times"
:rules="{
required: true,
message: '请选择',
}"
>
<div style="width: 800px">
<el-date-picker
@change="changEndDateTime"
v-model="form.times"
type="datetimerange"
start-placeholder="开始时间"
end-placeholder="结束时间"
value-format="YYYY-MM-DD HH:mm:ss"
:unlink-panels="true"
/>
</div>
</el-form-item>
<!--专项督察展示-->
<div class="content-main" v-if="form.supervisionType !== '日常督察'">
<div id="jjdc" v-if="form.specialType === '六项规定督察'">
<hr style="color: #abaaaa;opacity: 0.2"/>
<el-form-item label="督察人员" v-if="form.specialType === '六项规定督察'"
:rules="{
required: true,
message: '请选择',
}"
prop="persons"
>
<police-picker v-model="form.persons" :dataDepartId = 'userStore.user.departId'/>
</el-form-item>
<el-form-item label="督察要求" :rules="{
required: true,
message: '请选择',
}"
prop="superviseRequire">
<div style="width: 100%">
<quill-editor
ref="quillRef"
v-model="form.superviseRequire"
style="
min-height: 100px;
max-height: 200px;
overflow: auto;
"
/>
</div>
</el-form-item>
<el-form-item label="抽检对象">
<el-radio-group v-model="form.samplingTarget">
<el-radio value="Excel导入人员" label="Excel导入人员"></el-radio>
<el-radio value="自定义人员" label="自定义人员"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item prop="userList" v-if="form.samplingTarget === 'Excel导入人员'">
<el-row style="width: 100%">
<el-upload
style="width: 100%"
drag
:action="`${BASE_PATH}/task/management/import`"
:headers="{ Authorization: getToken() }"
:multiple="false"
:auto-upload="true"
:show-file-list="false"
v-model:file-list="fileListData"
:on-success="managementSuccess"
:on-progress="managementProgress"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
>
<template v-if="fileListData.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">
已选择文件:{{
fileListData[fileListData.length - 1].name
}}
</div>
</template>
</el-upload>
<div class="mt-20">
<span>文件模板</span>
<a
class="link"
:href="`${BASE_PATH}/templates/测酒任务被测人员模板.xlsx`"
target="__blank"
>测酒任务被测人员模板.xlsx 下载</a
>
</div>
</el-row>
<div class="flex gap wrap pepole-container mt-20">
<el-tag v-for="item in form.userList" :key="item">
{{ item.name }}-{{ item.empNo }}
</el-tag>
</div>
</el-form-item>
<el-form-item prop="userList" v-if=" form.samplingTarget === '自定义人员'">
<el-row :gutter="10" style="width: 100%;margin-bottom: 10px">
<el-col :span="3">
<el-input v-model="samplingQuery.samplingName" placeholder="抽检名称"></el-input>
</el-col>
<el-col :span="7">
<el-row>
<el-col :span="11">
<el-input-number placeholder="最小年龄" v-model="samplingQuery.ageMin"
:controls="false"></el-input-number>
</el-col>
<el-col :span="11">
<el-input-number placeholder="最大年龄" v-model="samplingQuery.ageMax"
:controls="false"></el-input-number>
</el-col>
</el-row>
</el-col>
<el-col :span="3">
<el-select placeholder="请选择督察类型" v-model="samplingQuery.inspectorType">
<el-option v-for="(item,index) in dict.inspectorType"
:label="item.dictLabel" :value="item.dictValue" :key="index"
></el-option>
</el-select>
</el-col>
<el-col :span="3">
<el-select placeholder="请选择性别" v-model="samplingQuery.gender">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-col>
<el-col :span="3">
<el-select clearable placeholder="请选择人员属性">
<el-option v-for="(item,keys) in dict.personType"
:value="item.dictValue"
:label="item.dictLabel"
:key="keys"
></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-button type="primary">查询</el-button>
</el-col>
</el-row>
<div v-loading="samplingloading">
<el-table
:data="samplingList"
ref="tableRef"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="55"/>
<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 show-overflow-tooltip prop="samplingInspection" label="抽检规则"
min-width="300"></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="handleSamplingDetail(row)">查看详情</el-button>
</div>
</template>
</el-table-column>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getSamplingList"
@current-change="getSamplingList"
:page-sizes="[10, 20, 50]"
v-model:page-size="samplingQuery.size"
v-model:current-page="samplingQuery.current"
layout="total, sizes, prev, pager, next"
:total="samplingTotal"
/>
</div>
</div>
</el-form-item>
</div>
<div id="sdzc" v-if="form.specialType === '所队自查'">
<hr style="color: #abaaaa;opacity: 0.2"/>
<el-form-item label="自选单位">
<el-tree-select v-model="form.selfOrgs" multiple show-checkbox :data="dictData"
:props="{label: 'shortName', value: 'id'}" node-key="id"
:default-expanded-keys="['12630']" clearable filterable check-strictly/>
</el-form-item>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>任务要求</h5>
</div>
<!-- 任务要求-->
<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>
<div class="flex between" style="width: 100%;height:30px;line-height: 30px; align-items: center">
<h5>自查内容</h5>
<div>
<el-button type="primary" @click="addSelfArray">添加自查内容</el-button>
</div>
</div>
<div class="card_content">
<div class="zcCard"
v-for="(item,index) in form.selfContents"
>
<div style="display: flex;justify-content: space-between;margin-bottom: 5px">
<div>自查内容{{ index + 1 }}</div>
<div>
<el-button type="danger" link @click="delCardFun(index)">删除</el-button>
</div>
</div>
<div class="card_title">
<el-input v-model="item.title" placeholder="请输入自查项目"></el-input>
</div>
<div class="card_main">
<el-input v-model="item.content" type="textarea" :rows="5"></el-input>
</div>
</div>
</div>
</div>
<div id="zdrygk" v-if="form.specialType === '重点人员管控'">
<el-form-item label="督察要求" :rules="{
required: true,
message: '请选择',
}"
prop="superviseRequire">
<div style="width: 100%">
<quill-editor
ref="quillRef"
v-model="form.superviseRequire"
style="
min-height: 100px;
max-height: 200px;
overflow: auto;
"
/>
</div>
</el-form-item>
<el-form-item label="管控对象导入">
<div>
<a
class="link"
:href="`${BASE_PATH}/templates/重点人员管控导入模板.xlsx`"
target="__blank"
>重点人员管控模板下载</a
>
</div>
<div style="width: 100%" v-show="!uploadShow">
<el-upload
style="width: 100%"
drag
v-loading="fileDataLoading"
:action="`${BASE_PATH}/task/management/importSupRiskPersonal`"
:headers="{ Authorization: getToken() }"
:multiple="false"
:auto-upload="true"
:show-file-list="false"
v-model:file-list="fileData"
:on-progress="SupRiskProgress"
:on-success="SupRiskSuccess"
accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
>
<template v-if="fileData.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">
已选择文件:{{
fileData[fileData.length - 1].name
}}
</div>
</template>
</el-upload>
</div>
<div v-show="uploadShow"
style="width: 100%;margin: 5px 0;display: flex;justify-content: space-between;background-color: #F8F9FE">
<div>
{{ fileData[fileData.length - 1]?.name }}
</div>
<div>
<el-button type="primary" link @click="showUploadFun">重新上传</el-button>
</div>
</div>
<div style="width: 100%" v-if="showRiskDataTable">
<el-row style="width: 100%" :gutter="20">
<el-col :span="4">
<el-select placeholder="管控级别" v-model="riskDataQuery.controlLevel">
<el-option v-for="(item,index) in dict.controlLevel"
:key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-input v-model="riskDataQuery.keyword" placeholder="姓名或手机号或身份证"></el-input>
</el-col>
<el-col :span="4">
<el-select v-model="riskDataQuery.personalType" placeholder="人员类别">
<el-option v-for="(item,index) in dict.controlType"
:key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-input v-model="riskDataQuery.responsibleName" placeholder="责任民警"></el-input>
</el-col>
<el-col :span="4">
<el-input v-model="riskDataQuery.controlName" placeholder="包保督察人员"></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="getRiskDataTableSubmit">查询</el-button>
</el-col>
</el-row>
<el-table
ref="singleTableRef"
:data="riskDataTable"
highlight-current-row
style="width: 100%;margin-top: 10px"
>
<el-table-column type="index" width="50" label="序号"/>
<el-table-column property="name" label="项目" width="60"/>
<el-table-column property="gender" label="性别" width="60"/>
<el-table-column property="idCode" label="身份证号" width="100"/>
<el-table-column property="mobile" label="联系方式" width="100"/>
<el-table-column property="personalType" label="人员类别" width="80"/>
<el-table-column property="controlLevel" label="管控级别" width="80"/>
<el-table-column property="controlTimeInterval" label="管控间隔" width="60"/>
<el-table-column property="responsibleDepartName" label="责任单位" width="70"/>
<el-table-column property="responsibleName" label="责任民警" width="60"/>
<el-table-column property="controlEmpNo" label="包保督察人员警号" width="120"/>
<el-table-column property="controlName" label="包保督察人员姓名" width="120"/>
<el-table-column fixed="right" label="操作" min-width="120">
<template #default="{row}">
<el-button link type="danger" size="small" @click="delriskData(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getRiskDataTableList"
@current-change="getRiskDataTableList"
:page-sizes="[10]"
v-model:page-size="riskDataQuery.size"
v-model:current-page="riskDataQuery.current"
layout="total, sizes, prev, pager, next"
:total="riskDataTotal"
/>
</div>
</div>
</el-form-item>
</div>
</div>
<!--日常督察-->
<div id="rcdc" v-if="form.supervisionType ==='日常督察'">
<hr style="color: #abaaaa;opacity: 0.2"/>
<el-form-item
v-if="form.supervisionType === '日常督察'"
label="督察人员"
:rules="{
required: true,
message: '请选择',
}"
prop="persons"
>
<police-picker v-model="form.persons"/>
</el-form-item>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>任务内容</h5>
</div>
<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>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>任务附件</h5>
</div>
<file-upload
style="width: 100%"
:uploadDrag="true"
v-model:files="form.fileList"></file-upload>
</div>
</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 v-model="detailShow" title="发布任务详情" width="1076px"
top="5vh"
style="margin-bottom: 0">
<el-scrollbar max-height="76vh" v-loading="detailLoading">
<el-form
:label-width="150"
ref="formRef"
:model="form"
style="min-height: 66vh"
>
<el-form-item
label="任务名称"
>
{{ activeRow.taskName }}
</el-form-item>
<el-form-item label="督察类型"
>
{{
getDictLable(
dict.supervisionType,
activeRow.supervisionType
)
}}
</el-form-item>
<el-form-item v-if="activeRow.supervisionType === '专项督察'" label="专项督察"
>
{{ activeRow.specialType }}
</el-form-item>
<el-form-item label="督察时间"
>
<div style="width: 800px" v-if="activeRow.times">
{{ `${timeFormat(activeRow.times[0])} - ${timeFormat(activeRow.times[1])}` }}
</div>
<div v-else>
</div>
</el-form-item>
<!--专项督察展示-->
<div class="content-main" v-if="activeRow.supervisionType !== '日常督察'">
<div id="jjdc" v-if="activeRow.specialType === '六项规定督察'">
<hr style="color: #abaaaa;opacity: 0.2"/>
<el-form-item label="督察人员"
>
<!-- <police-picker v-model="activeRow.persons" />-->
<div class="flex gap wrap pepole-container mt-20">
<el-tag v-for="item in activeRow.persons" :key="item">{{ item.name }}-{{ item.empNo }}</el-tag>
</div>
</el-form-item>
<el-form-item label="督察要求">
<div style="width: 100%" v-html="activeRow.superviseRequire">
</div>
</el-form-item>
<el-form-item label="抽检对象">
{{ activeRow.samplingTarget }}
</el-form-item>
<el-form-item prop="userList" v-if="activeRow.samplingTarget === 'Excel导入人员'">
<div class="flex gap wrap pepole-container mt-20">
<el-tag v-for="item in activeRow.userList" :key="item"
>{{ item.name }}-{{ item.empNo }}
</el-tag
>
</div>
</el-form-item>
<el-form-item prop="userList" v-if=" activeRow.samplingTarget === '自定义人员'">
<div v-loading="samplingloading">
<el-table
:data="samplingList"
ref="tableRef"
style="width: 100%"
@selection-change="handleSelectionChange"
>
<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 show-overflow-tooltip prop="samplingInspection" label="抽检规则"
min-width="300"></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="handleSamplingDetail(row)">查看详情</el-button>
</div>
</template>
</el-table-column>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getSamplingList"
@current-change="getSamplingList"
:page-sizes="[10, 20, 50]"
v-model:page-size="samplingQuery.size"
v-model:current-page="samplingQuery.current"
layout="total, sizes, prev, pager, next"
:total="samplingTotal"
/>
</div>
</div>
</el-form-item>
</div>
<div id="sdzc" v-if="activeRow.specialType === '所队自查'">
<hr style="color: #abaaaa;opacity: 0.2"/>
<el-form-item label="自选单位">
<div class="flex gap wrap pepole-container mt-7">
<el-tag v-for="item in slofOrgList" :key="item"
>{{ item.shortName }}
</el-tag
>
</div>
</el-form-item>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>任务要求</h5>
</div>
<!-- 任务要求-->
<el-form-item
label-position="top"
>
<div style="width: 100%">
<div v-html="activeRow.taskContentHtml"></div>
</div>
</el-form-item>
<div class="flex between" style="width: 100%;height:30px;line-height: 30px; align-items: center">
<h5>自查内容</h5>
<div>
<!-- <el-button type="primary" @click="addSelfArray">添加自查内容</el-button>-->
</div>
</div>
<div class="card_content">
<div class="zcCard"
v-for="(item,index) in activeRow.selfContents"
>
<div style="display: flex;justify-content: space-between;margin-bottom: 5px">
<div>自查内容{{ index + 1 }}</div>
<!-- <div ><el-button type="danger" link @click="delCardFun(index)" >删除</el-button></div>-->
</div>
<div class="card_title">
{{ item.title }}
</div>
<div class="card_main">
{{ item.content }}
</div>
</div>
</div>
</div>
<div id="zdrygk" v-if="activeRow.specialType === '重点人员管控'">
<el-form-item label="督察要求"
prop="superviseRequire">
<div style="width: 100%" v-html="activeRow.superviseRequire">
</div>
</el-form-item>
<el-form-item label="管控对象">
<div style="width: 100%">
<el-row style="width: 100%" :gutter="20">
<el-col :span="4">
<el-select placeholder="管控级别" v-model="riskDataQuery.controlLevel">
<el-option v-for="(item,index) in dict.controlLevel"
:key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-input v-model="riskDataQuery.keyword" placeholder="姓名或手机号或身份证"></el-input>
</el-col>
<el-col :span="4">
<el-select v-model="riskDataQuery.personalType" placeholder="人员类别">
<el-option v-for="(item,index) in dict.controlType"
:key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-input v-model="riskDataQuery.responsibleName" placeholder="责任民警"></el-input>
</el-col>
<el-col :span="4">
<el-input v-model="riskDataQuery.controlName" placeholder="包保督察人员"></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="getRiskDataTableSubmit">查询</el-button>
</el-col>
</el-row>
<el-table
ref="singleTableRef"
:data="riskDataTable"
highlight-current-row
style="width: 100%;margin-top: 10px"
>
<el-table-column type="index" width="50" label="序号"/>
<el-table-column property="name" label="项目" width="60"/>
<el-table-column property="gender" label="性别" width="60"/>
<el-table-column property="idCode" label="身份证号" width="100"/>
<el-table-column property="mobile" label="联系方式" width="100"/>
<el-table-column property="personalType" label="人员类别" width="80"/>
<el-table-column property="controlLevel" label="管控级别" width="80"/>
<el-table-column property="controlTimeInterval" label="管控间隔" width="60"/>
<el-table-column property="responsibleDepartName" label="责任单位" width="70"/>
<el-table-column property="responsibleName" label="责任民警" width="60"/>
<el-table-column property="controlEmpNo" label="包保督察人员警号" width="70"/>
<el-table-column property="controlName" label="包保督察人员姓名" width="70"/>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getRiskDataTableList"
@current-change="getRiskDataTableList"
:page-sizes="[10]"
v-model:page-size="riskDataQuery.size"
v-model:current-page="riskDataQuery.current"
layout="total, sizes, prev, pager, next"
:total="riskDataTotal"
/>
</div>
</div>
</el-form-item>
</div>
</div>
<!--日常督察-->
<div id="rcdc" v-if="activeRow.supervisionType ==='日常督察'">
<hr style="color: #abaaaa;opacity: 0.2"/>
<el-form-item
label="督察人员"
:rules="{
required: true,
message: '请选择',
}"
prop="persons"
>
<!-- <police-picker v-model="activeRow.persons" />-->
<div class="flex gap wrap pepole-container mt-7">
<el-tag v-for="item in activeRow.persons" :key="item"
>{{ item.name }}-{{ item.empNo }}
</el-tag
>
</div>
</el-form-item>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>任务内容</h5>
</div>
<el-form-item
prop="taskContentHtml"
:rules="{
required: true,
message: '请输入任务内容'
}"
label-position="top"
>
<div style="width: 100%">
<div v-html="activeRow.taskContentHtml"></div>
</div>
</el-form-item>
<div class="flex v-center" style="height:30px;margin-bottom: 10px">
<h5>任务附件</h5>
</div>
<file-list v-model:files="activeRow.files" :removeEnable="false" />
</div>
</el-form>
</el-scrollbar>
</el-dialog>
<!-- 人员抽检详情-->
<el-dialog v-model="samplingDetailShow" 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>
<!-- 日常督察详情-->
<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 v-loading="problemsLoading" :data="problems" :max-height="640" min-height="300">
<el-table-column
label="是否发现督察问题"
prop="hasProblem"
width="80"
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="80"
show-overflow-tooltip
/>
<el-table-column
prop="createName"
label="录入人"
width="80"
/>
<el-table-column label="下发状态" >
<template #default="{row}">
<el-tag type="info" v-if=" row.hasProblem && row.distributionState == '0' ">未下发</el-tag>
<el-tag type="primary" v-if="row.hasProblem && row.distributionState == '1' ">已分发</el-tag>
<el-tag type="primary" v-if="row.hasProblem && row.distributionState == '2' ">已处置</el-tag>
</template>
</el-table-column>
<el-table-column
label="问题类型"
prop="problemType"
width="140"
show-overflow-tooltip
/>
<el-table-column label="具体情况" prop="thingDesc"/>
<el-table-column
label="创建时间"
prop="createTime"
width="160"
/>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
link
@click="showDeatil(row)"
>详情
</el-button>
<el-button
type="primary"
link
v-if="row.hasProblem && row.distributionState == '0'"
@click="issueMatterFun(row,'inspection')"
>
下发
</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>
<!-- 所队自查详情-->
<el-dialog title="自查详情" v-model="selfProblemsShow" 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="selfPeopleQuery.detail"
clearable
placeholder="请输入具体情况"
/>
</el-form-item>
</el-col>
</el-row>
<div class="flex end">
<el-button type="primary" @click="getSelfexaminationProblemFun">
<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 v-loading="problemLoading" :data="selfProblemList" :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
prop="createName"
label="问题录入人"
width="80"
/>
<el-table-column
label="问题类型"
prop="problemType"
width="140"
show-overflow-tooltip
/>
<el-table-column label="具体情况" prop="thingDesc"/>
<el-table-column label="下发状态" >
<template #default="{row}">
<el-tag type="info" v-if=" row.hasProblem && row.distributionState == '0' ">未下发</el-tag>
<el-tag type="primary" v-if="row.hasProblem && row.distributionState == '1' ">已分发</el-tag>
<el-tag type="primary" v-if="row.hasProblem && row.distributionState == '2' ">已处置</el-tag>
</template>
</el-table-column>
<el-table-column
label="创建时间"
prop="createTime"
width="160"
/>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
link
@click="showDeatil(row)"
>详情
</el-button
>
<el-button
type="primary"
link
v-if="row.hasProblem && row.distributionState == '0'"
@click="issueMatterFun(row,'selfexamination')"
>
下发
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getSelfexaminationProblemFun"
@current-change="getSelfexaminationProblemFun"
:page-sizes="[10, 20, 50]"
v-model:page-size="selfPeopleQuery.size"
v-model:current-page="selfPeopleQuery.current"
layout="total, sizes, prev, pager, next"
:total="selfProblemTotal"
>
</el-pagination>
</div>
</div>
</el-dialog>
<!-- 六项规定督察详情-->
<el-dialog v-model="testingDetailShow" title="检测情况" width="60vw"
top="2vh"
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="peopleQuery.name"
clearable
placeholder="请输入警员姓名"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="警号">
<el-input
v-model="peopleQuery.empNo"
clearable
placeholder="请输入警号"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="检测情况">
<el-select
clearable
v-model="peopleQuery.testingResult"
>
<el-option value="已检测">已检测</el-option>
<el-option value="未检测">未检测</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col
:span="6"
v-if="peopleQuery.testingResult === '已检测'"
>
<el-form-item label="饮酒结果">
<el-select
clearable
v-model="peopleQuery.drinkResult"
>
<el-option value="饮酒">饮酒</el-option>
<el-option value="未饮酒">未饮酒</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<div class="flex end">
<el-button type="primary" @click="getTestingAlcoholPeople">
<template #icon>
<icon name="el-icon-Search"/>
</template>
查询
</el-button
>
<el-button @click="peopleReset">重置</el-button>
</div>
</el-form>
</header>
<div class="table-container">
<el-table v-loading="testingLoading" :data="peoples" :max-height="640">
<el-table-column width="60" align="center">
<template #default="{ row }">
<img
class="avatar"
:src="`${BASE_PATH}/file/stream/${row.avatarUrl}`"
v-if="row.avatarUrl"
/>
<img class="avatar" src="/imgs/police.png" v-else/>
</template>
</el-table-column>
<el-table-column label="姓名" prop="name" width="80"/>
<el-table-column label="警号" prop="empNo" width="80"/>
<el-table-column
label="单位"
prop="departName"
width="140"
show-overflow-tooltip
/>
<el-table-column
label="检测情况"
prop="testingResult"
width="90"
/>
<el-table-column
label="问题录入人"
prop="createName"
width="80"
/>
<el-table-column
label="测酒时间"
prop="testingTime"
width="160"
/>
<el-table-column label="饮酒情况/未检测原因" show-overflow-tooltip align="center">
<template #default="{ row }">
<el-tag type="success" v-if="row.drinkResult === '未饮酒'">未饮酒</el-tag>
<el-tag type="error" v-if="row.drinkResult === '饮酒'">饮酒</el-tag>
<span v-if="row.drinkResult === '饮酒'" class="ml-10">(酒精含量:{{ row.alcoholContent }} mg/100ml)</span>
<span>{{ row.unTestingDesc }}</span>
</template>
</el-table-column>
<el-table-column label="下发状态" align="center">
<template #default="{row}">
<el-tag type="info" v-if=" row.drinkResult === '饮酒' && row.distributionState == '0' ">未下发</el-tag>
<el-tag type="primary" v-if="row.drinkResult === '饮酒' && row.distributionState == '1' ">已分发</el-tag>
<el-tag type="primary" v-if="row.drinkResult === '饮酒' && row.distributionState == '2' ">已处置</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleShowPeople(row)"
>详情
</el-button>
<el-button v-if="row.drinkResult === '饮酒' && (!row.distributionState || row.distributionState == '0')" type="primary" link @click="issueMatterFun(row,'testing_alcohol')">下发</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getTestingAlcoholPeople"
@current-change="getTestingAlcoholPeople"
:page-sizes="[10, 20, 50]"
v-model:page-size="peopleQuery.size"
v-model:current-page="peopleQuery.current"
layout="total, sizes, prev, pager, next"
:total="peopleTotal"
>
</el-pagination>
</div>
</el-dialog>
<!--六项规定督察 - 人员检测情况-->
<el-dialog title="人员检测情况" v-model="peopleDetailShow" width="40vw">
<div style="width: 600px; margin: auto">
<el-row>
<el-col :span="6">
<img
style="height: 100px"
:src="`${BASE_PATH}/file/stream/${activePeople.avatarUrl}`"
v-if="activePeople.avatarUrl"
/>
<img style="height: 100px" src="/imgs/police.png" v-else/>
</el-col>
<el-col :span="18">
<div class="row">
<div class="col col-12">
<label>姓名</label>
<span>{{ activePeople.name }}</span>
</div>
<div class="col col-12">
<label>警号</label>
<span>{{ activePeople.empNo }}</span>
</div>
<div class="col col-24">
<label>身份证</label>
<span>{{ activePeople.idCode || '/' }}</span>
</div>
<div class="col col-24">
<label>单位</label>
<span>{{ activePeople.departName }}</span>
</div>
</div>
</el-col>
</el-row>
<el-divider style="width: 90%"/>
<div class="row">
<div class="col col-24" v-if="activePeople.testingResult">
<label>检测情况</label>
<span>{{ activePeople.testingResult }}</span>
</div>
<div class="col col-12" v-if="activePeople.drinkResult">
<label>饮酒结果</label>
<span>{{ activePeople.drinkResult }}</span>
</div>
<div class="col col-12" v-if="activePeople.drinkResult === '饮酒'">
<label>酒精含量</label>
<span>{{ activePeople.alcoholContent }} mg/100ml</span>
</div>
<div class="col col-24" v-if="activePeople.unTestingDesc">
<label>未检测原因</label>
<span>{{ activePeople.unTestingDesc }}</span>
</div>
</div>
<div v-if="activePeople.testingFileList.length">
<div class="mb-8">测酒现场照片</div>
<file-list v-model:files="activePeople.testingFileList"/>
</div>
</div>
<footer class="flex end mt-20">
<el-button size="large" @click="peopleDetailShow = false">关闭</el-button>
</footer>
</el-dialog>
<!--问题详情-->
<el-dialog title="问题详情" v-model="problemShow">
<div>
<div class="row">
<div class="col col-12">
<label>发现时间</label>
<span>{{ activeRowData.createTime }}</span>
</div>
<div class="col col-12">
<label>问题来源</label>
<span>{{ getDictLable(dict.taskType, activeRowData.taskType) }}</span>
</div>
<div class="col col-12">
<label>涉及单位</label>
<span>{{ activeRowData.departName }}</span>
</div>
<div class="col col-12">
<label>涉及人员</label>
<span v-if="activeRowData.peoples">
<el-tag v-for="(item,index) in JSON.parse(activeRowData.peoples)" :key="index">
{{item.name}}
</el-tag>
</span>
</div>
<div class="col col-24">
<label>问题类型</label>
<span>{{ activeRowData.problemType || '/' }}</span>
</div>
<div class="col col-24">
<label>问题描述</label>
<span>{{ activeRowData.thingDesc }}</span>
</div>
<div class="col col-24">
<label>分发状态</label>
<span>{{ getDictLable(dict.distributionState, activeRowData.distributionState) }}</span>
</div>
</div>
<div>
<file-list :files="activeRowData.files? JSON.parse(activeRowData.files) : []"/>
</div>
</div>
</el-dialog>
<!-- 重点人员督察情况-->
<el-dialog title="重点人员督察情况" v-model="superviseRiskShow" width="80vw" style="min-height:80vh" >
<div v-loading="riskPersonalLoading">
<el-form >
<el-row :gutter="20">
<el-col :span="6">
<el-input v-model="riskPersonalQuery.name" placeholder="请输入姓名或身份证、手机号" clearable />
</el-col>
<el-col :span="6">
<el-select v-model="riskPersonalQuery.personalType" placeholder="请选择人员类别" clearable>
<el-option v-for="(item,index) in dict.controlType"
:key="index"
:label="item.dictLabel"
:value="item.dictValue"/>
</el-select>
</el-col>
<el-col :span="6">
<el-select placeholder="管控级别" clearable v-model="riskPersonalQuery.controlLevel">
<el-option v-for="(item,index) in dict.controlLevel"
:key="index"
:label="item.dictLabel"
:value="item.dictValue"
></el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-input size="default" placeholder="管控间隔" v-model="riskPersonalQuery.controlTimeInterval" />
</el-col>
</el-row>
<el-row style="margin-top:20px" :gutter="20">
<el-col :span="6" >
<depart-tree-select :size="'default'" placeholder="责任单位" v-model="riskPersonalQuery.responsibleDepartId" clearable/>
</el-col>
<el-col :span="6">
<el-input placeholder="责任民警" clearable v-model="riskPersonalQuery.responsibleName"></el-input>
</el-col>
<el-col :span="6">
<el-select placeholder="督察状态" v-model="riskPersonalQuery.supStatus" clearable>
<el-option label="在控" value="在控"></el-option>
<el-option label="失控" value="失控"></el-option>
<el-option label="无法确认" value="无法确认"></el-option>
</el-select>
</el-col>
</el-row>
</el-form>
<div class="flex end" style="margin: 10px 0">
<el-button type="primary" @click="getSuperviseTable" >
<template #icon>
<icon name="el-icon-Search"/>
</template>
查询
</el-button
>
</div>
<el-row>
<el-table :data="riskDataCards" @row-click="row=>handSupRiskCard(row)">
<el-table-column label="姓名" prop="name" width="120">
<template #default="{row}">
<div style="display:flex;align-items: center;justify-content: space-around">
<el-avatar style="height: 60px;width: 60px " shape="square" :size="100" :fit="`fit`"
:src="row.imgBase64"/>
<div >{{row.name}}</div>
</div>
</template>
</el-table-column>
<el-table-column label="性别" prop="gender" width="40"></el-table-column>
<el-table-column label="身份证号" prop="idCode" width="120"></el-table-column>
<el-table-column label="联系方式" prop="mobile"></el-table-column>
<el-table-column label="人员类别" prop="personalType"></el-table-column>
<el-table-column label="管控级别" prop="controlLevel"></el-table-column>
<el-table-column label="管控间隔" prop="controlTimeInterval"></el-table-column>
<el-table-column label="责任单位" prop="responsibleDepartName"></el-table-column>
<el-table-column label="责任民警" prop="responsibleName"></el-table-column>
<el-table-column label="督察状态" prop="supStatus">
<template #default="{row}">
<el-tag type="danger" v-if="row.supStatus == '失控'">{{row.supStatus}}</el-tag>
<el-tag type="primary" v-if="row.supStatus == '在控'">{{row.supStatus}}</el-tag>
<el-tag type="info" v-if="row.supStatus == '无法确认'">{{row.supStatus}}</el-tag>
</template>
</el-table-column>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getSuperviseTable"
@current-change="getSuperviseTable"
:page-sizes="[10, 20, 50]"
v-model:page-size="riskPersonalQuery.size"
v-model:current-page="riskPersonalQuery.current"
layout="total, sizes, prev, pager, next"
:total="riskPersonalTotal"
>
</el-pagination>
</div>
</el-row>
<el-row>
<el-table ref="taskSupDataTable" :preserve-expanded-content="preserveExpanded" :data="taskSupData" v-loading="taskLoading">
<el-table-column type="expand">
<template #default="props">
<div >
<p >督察时间: {{ props.row.supTime }}</p>
<p>督察状态: {{ props.row.supStatus }}</p>
<p >督察方式: {{ props.row.supType }}</p>
<p>督察情况: {{props.row.supDesc}}</p>
<p>录入人:{{props.row.createName}}</p>
<p>附件:</p>
<file-list v-model:files="props.row.fileVoList" :removeEnable="false" />
</div>
</template>
</el-table-column>
<el-table-column label="督察时间" prop="supTime"></el-table-column>
<el-table-column label="督察状态" prop="supStatus">
<template #default="{row}">
<el-tag type="danger" v-if="row.supStatus == '失控'">{{row.supStatus}}</el-tag>
<el-tag type="primary" v-if="row.supStatus == '在控'">{{row.supStatus}}</el-tag>
<el-tag type="info" v-if="row.supStatus == '无法确认'">{{row.supStatus}}</el-tag>
</template>
</el-table-column>
<el-table-column label="督察方式" prop="supType"></el-table-column>
<el-table-column label="督察情况" prop="supDesc"></el-table-column>
<el-table-column label="问题录入人" prop="createName"></el-table-column>
<el-table-column label="操作">
<template #default="{row}">
<el-button v-if="row.supStatus != '在控'" @click="issueMatterFun(row,'risk_personal')" type="primary" link>下发</el-button>
</template>
</el-table-column>
</el-table>
<div class="flex end mt-8">
<el-pagination
@size-change="getTaskSupDataFun"
@current-change="getTaskSupDataFun"
:page-sizes="[10, 20, 50]"
v-model:page-size="taskSupQuery.size"
v-model:current-page="taskSupQuery.current"
layout="total, sizes, prev, pager, next"
:total="taskSupTotal"
>
</el-pagination>
</div>
</el-row>
</div>
</el-dialog>
<el-dialog title="任务分发" v-model="distributeShow" width="50vw" top="2vh" style="margin-bottom: 0">
<el-form :label-width="120" ref="formRefs" :model="issueForm" v-loading="issueLoading">
<el-form-item
label="任务名称"
prop="taskName"
:rules="{
required: true,
message: '请输入任务名称',
}"
>
<el-input
v-model="issueForm.taskName"
style="width: 280px"
placeholder="请输入"
/>
</el-form-item>
<el-form-item label="指定办理单位" prop="handleDepartId">
<div class="flex gap">
<div style="width: 280px">
<depart-tree-select v-model="issueForm.handleDepartId" />
</div>
<div class="tips mt-10">
<p>指定具体办理单位 指将问题分派给哪个单位办理。</p>
</div>
</div>
</el-form-item>
<el-form-item
label="业务类别"
prop="businessTypeCode"
:rules="{
required: true,
message: '请选择业务类别',
trigger: ['blur'],
}"
>
<el-select v-model="issueForm.businessTypeCode" 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="issueForm.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="issueForm.policeType"
clearable
filterable
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
label="办理时限"
prop="timeLimit"
:rules="{
required: true,
message: '请选择办理时限',
}"
>
<time-limit-select
v-model="issueForm.timeLimit"
v-model:maxSignDuration="issueForm.maxSignDuration"
v-model:maxHandleDuration="issueForm.maxHandleDuration"
v-model:maxExtensionDuration="issueForm.maxExtensionDuration"
/>
</el-form-item>
<el-form-item
label="下发流程"
prop="distributionFlow"
:rules="{
required: true,
message: '请选择下发流程',
}"
>
<el-radio-group v-model="issueForm.distributionFlow" class="block">
<el-radio
v-for="item in dict.distributionFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}</el-radio
>
</el-radio-group>
</el-form-item>
<el-form-item
label="审核流程"
prop="approvalFlow"
:rules="{
required: true,
message: '请选择审核流程',
}"
>
<el-radio-group v-model="issueForm.approvalFlow">
<el-radio
v-for="item in dict.approvalFlow"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel
}}{{ item.remark ? `(${item.remark})` : "" }}</el-radio
>
</el-radio-group>
<div class="tips mt-10">
<p>
三级审核 在问题提交办结时,需经过“所队—>二级机构—>市局”三级审核,通过后方可办结;
</p>
<p>
二级审核 在问题提交办结时,仅需经过“所队—>二级机构”两级审核,通过后即可办结;
</p>
</div>
</el-form-item>
<el-form-item label="附件说明" prop="thingFiles">
<file-upload v-model:files="issueForm.thingFiles" />
</el-form-item>
</el-form>
<footer class="flex end mt-20">
<el-button
type="primary"
size="large"
@click="handleSubmitTask"
v-loading="issueLoading"
>确认下发</el-button
>
</footer>
</el-dialog>
</template>
<script setup>
import {
listInspection,
addInspection,
listInspectionProblems
} from "@/api/mobileSupervision/inspection";
import {TestingAlcoholIssueMatterFun} from '@/api/mobileSupervision/testingAlcohol';
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import {selectListData} from "@/api/mobileSupervision/Sampling";
import {getDictLable, timeFormat} from "@/utils/util";
import {getDepartProfile} from "@/api/sensitivePerception/profileDepart";
import {ROOT_DEPART_ID} from '@/enums/appEnums';
import {BASE_PATH} from "@/api/request";
import {getTaskSuprt} from '@/api/mobileSupervision/supRiskPerson';
import {
addTaskManagement,
getTaskManagementDetail,
getRiskPersonalPage,
getDepartByIds,
delTaskManagement,
importTemperancePolice,
importSupRiskPersonal,
getListFun
} from "@/api/mobileSupervision/taskManagement";
import {listTestingAlcoholPeoples, TestingAlcoholDetail} from "@/api/mobileSupervision/testingAlcohol";
import {getSelfexaminationProblem} from "@/api/mobileSupervision/selfexamination";
import {getTaskProblem} from "@/api/mobileSupervision/taskProblem";
import {getToken} from "@/utils/token";
import {disabledDate} from "@/utils/util";
import useUserStore from "@/stores/modules/user";
const userStore = useUserStore();
let cardContent = ref()
const catchStore = useCatchStore();
const dict = catchStore.getDicts(["supervisionType","policeType","suspectProblem", "approvalFlow","distributionFlow","personnelTypeArray", "inspectorType", "personType","businessType", "controlLevel","distributionState", "controlType"]);
const fileListData = ref([]);
const list = ref([]);
const samplingList = ref([]);
const samplingTotal = ref(10)
const samplingloading = ref(false)
const samplingDetailShow = ref(false)
const editData = ref(false)
const policeLoading = ref(false)
const peopleDetailShow = ref(false)
const show = ref(false);
const samplingQuery = ref({
current: 1,
size: 10,
departBranch: false,
confinementTime: []
})
const supervisionDict = ref([
{
dictValue: 'inspection',
dictLabel: '日常督察'
},
{
dictValue: 'testing_alcohol',
dictLabel: '六项规定督察'
},
{
dictValue: 'selfexamination',
dictLabel: '所队自查'
},
{
dictValue: 'risk_personal',
dictLabel: '重点人员管控'
}
])
const query = ref({
current: 1,
size: 10,
});
const total = ref(0);
const specialType = ref([
{
dictLabel: '六项规定督察',
dictValue: '六项规定督察'
},
{
dictLabel: '所队自查',
dictValue: '所队自查'
},
{
dictLabel: '重点人员管控',
dictValue: '重点人员管控'
}
])
const dictData = ref([])
const loading = ref(false)
//督察任务列表
function getList() {
loading.value = true
getListFun(query.value).then((data) => {
list.value = data.records;
total.value = data.total;
loading.value = false
})
}
/**
* 删除督察任务
* */
async function delTaskManagementFun(row) {
await feedback.confirm("确定要删除该数据?");
delTaskManagement(row.id).then(res=>{
getList()
})
feedback.msgSuccess("删除成功");
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getList();
}
getList();
const form = ref({
files: [],
supRiskDtoList: []
});
const formRef = ref(null);
const quillRef = ref()
//发布任务
async function submit() {
await formRef.value.validate();
if (quillRef.value) {
form.value.taskContent = quillRef.value.getText()
}
if(form.value.files ){
delete form.value.files
}
await addTaskManagement(form.value)
feedback.msgSuccess("发布成功");
show.value = false;
getList();
}
//关闭弹窗的回调函数(清空)
const addColse =()=>{
form.value = {
files: [],
supervisionType: '日常督察',
supRiskDtoList: []
};
}
//任务类型转换函数
const getTaskType = (val) => {
if (val === 'inspection') {
return "日常督察";
} else if (val === 'testing_alcohol') {
return "六项规定督察";
} else if (val === 'selfexamination') {
return "所队自查";
} else {
return "重点人员督察"
}
}
const changEndDateTime =()=>{
if(form.value.times[1]){
form.value.times[1]= timeFormat(new Date(form.value.times[1]))+" 23:59:59";
}
}
function handleShowAdd() {
show.value = true;
form.value = {
files: [],
supervisionType: '日常督察',
supRiskDtoList: [],
times:[]
};
fileData.value=[]
filterDataTable.value=[]
riskDataTable.value=[]
}
const detailShow = ref(false);
const detailLoading = ref(false);
const activeRow = ref({
supRiskDtoList: []
});
const editLoading = ref(false)
const editTable =async (row)=>{
show.value = true;
editLoading.value = true;
try {
const res = await getTaskManagementDetail(row.id);
form.value = res;
if(res.files){
form.value.files = JSON.parse(res.files)
}
if (res.samplingTarget == '自定义人员' && res.samplingIds) {
getSamplingList()
delete samplingQuery.value.ids
}
if (res.selfOrgs) {
getDepartByIdsFun(res.selfOrgs)
} else {
slofOrgList.value = []
}
showRiskDataTable.value=true
editLoading.value = false;
} catch (e) {
editLoading.value = false;
}
}
const tableRef =ref()
function setCheck() {
if( form.value.samplingIds && form.value.samplingIds.length > 0){
let idList = form.value.samplingIds;
samplingList.value.forEach(item => {
if (form.value.samplingIds && idList.indexOf(item.id) >= 0) {
nextTick(() => {
tableRef.value.toggleRowSelection(item, true);
})
}
})
}
}
/**
* 显示督察任务详情
* */
async function handleShowDetail(row) {
detailShow.value = true;
detailLoading.value = true;
try {
const res = await getTaskManagementDetail(row.id);
activeRow.value = res;
if(res.files){
activeRow.value.files = JSON.parse(res.files)
}
if (res.samplingTarget == '自定义人员' && res.samplingIds) {
samplingQuery.value.ids = res.samplingIds;
getSamplingList()
delete samplingQuery.value.ids
}
if (res.selfOrgs) {
getDepartByIdsFun(res.selfOrgs)
} else {
slofOrgList.value = []
}
detailLoading.value = false;
} catch (e) {
detailLoading.value = false;
}
}
const slofOrgList = ref([])
/**
* 获取自选单位名称
* */
function getDepartByIdsFun(data) {
getDepartByIds({'ids': data}).then((res) => {
slofOrgList.value = res
})
}
//问题详情
const problemShow = ref(false);
const activeRowData = ref({})
async function showDeatil(row) {
problemShow.value = true
activeRowData.value = await getTaskProblem(row.id)
}
const preserveExpanded = ref(false)
//重点督察人员导入
const fileData = ref([])
const fileDataLoading = ref(false)
const showRiskDataTable = ref(false);
/*
*获取重点督察人员
* **/
async function SupRiskSuccess(val) {
form.value.supRiskDtoList = val.data
fileDataLoading.value = false;
showRiskDataTable.value = true;
showUploadFun();
}
const SupRiskProgress = () => {
fileDataLoading.value = true;
}
const superviseRiskShow = ref(false);
const superviseRiskLoading =ref(false);
const taskSupQuery = ref({
current: 1,
size: 10,
})
const taskSupTotal = ref(0)
const taskSupData = ref([])
const taskLoading = ref(false)
const riskDataCards = ref(null)
const riskPersonalQuery = ref({
current: 1,
size: 10,
})
const riskPersonalTotal =ref(0);
const riskPersonalLoading = ref(false);
const getSuperviseTable = async ()=>{
const res = await getRiskPersonalPage(riskPersonalQuery.value);
const riskData = res.records;
riskPersonalTotal.value = res.total;
riskDataCards.value = riskData;
if (res.records?.length > 0) {
taskSupQuery.value.idCode = riskData[0].idCode;
taskSupQuery.value.taskId = row.id;
const taskSupert = await getTaskSuprt(taskSupQuery.value);
taskSupTotal.value = taskSupert.total;
taskSupData.value = taskSupert.records;
}else{
taskSupData.value = null
}
}
const showSupervise = async (row) => {
superviseRiskShow.value = true;
riskPersonalLoading.value=true;
riskPersonalQuery.value.id = row.id;
const res = await getRiskPersonalPage(riskPersonalQuery.value);
//获取重点人员列表
const riskData = res.records;
riskPersonalTotal.value = res.total;
riskDataCards.value = riskData;
if (res.records?.length > 0) {
taskSupQuery.value.idCode = riskData[0].idCode;
taskSupQuery.value.taskId = row.id;
const taskSupert = await getTaskSuprt(taskSupQuery.value);
taskSupTotal.value = taskSupert.total;
taskSupData.value = taskSupert.records;
}else{
taskSupData.value = null;
}
riskPersonalLoading.value=false;
}
/**
* 获取重点人员督察记录列表
* */
const getTaskSupDataFun = async () => {
taskLoading.value = true;
try {
const taskSupert = await getTaskSuprt(taskSupQuery.value);
taskSupTotal.value = taskSupert.total;
taskSupData.value = taskSupert.records;
taskLoading.value = false;
} catch (e) {
taskLoading.value = false;
}
}
/**
* 点击重点人员
* */
const handSupRiskCard = async (row)=>{
taskLoading.value = true;
try {
taskSupQuery.value.idCode = row.idCode;
const taskSupert = await getTaskSuprt(taskSupQuery.value);
taskSupTotal.value = taskSupert.total;
taskSupData.value = taskSupert.records;
taskLoading.value = false;
} catch (e) {
taskLoading.value = false;
}
}
/**
* 重点督察人员前端列表
* */
const getRiskDataTableSubmit = () => {
filterDataTable.value = (form.value.supRiskDtoList && form.value.supRiskDtoList.length > 0) ? form.value.supRiskDtoList : activeRow.value.supRiskDtoList
//管控级别
if (riskDataQuery.value.controlLevel) {
filterDataTable.value = filterDataTable.value.filter(s => s.controlLevel.includes(riskDataQuery.value.controlLevel));
}
if (riskDataQuery.value.keyword) {
filterDataTable.value = filterDataTable.value.filter(s => s.name.includes(riskDataQuery.value.keyword) || s.idCode.includes(riskDataQuery.value.keyword) || s.mobile.includes(riskDataQuery.value.keyword));
}
if (riskDataQuery.value.personalType) {
filterDataTable.value = filterDataTable.value.filter(s => s.personalType.includes(riskDataQuery.value.personalType));
}
if (riskDataQuery.value.responsibleName) {
filterDataTable.value = filterDataTable.value.filter(s => s.responsibleName.includes(riskDataQuery.value.responsibleName));
}
if (riskDataQuery.value.controlName) {
filterDataTable.value = filterDataTable.value.filter(s => s.controlName.includes(riskDataQuery.value.controlName));
}
nextTick(()=>{
riskDataTotal.value = filterDataTable.value.length;
riskDataTable.value = filterDataTable.value.slice(startValue.value, endValue.value);
})
}
/**
* 删除重点督察人员数据
* */
const delriskData = async (row) => {
await feedback.confirm(`确认删除数据 ?`)
nextTick(() => {
form.value.supRiskDtoList = form.value.supRiskDtoList.filter(s => s.idCode !== row.idCode);
})
}
//检测情况(六项规定督察)---------
const testingDetailShow = ref(false);
const testingLoading = ref(false);
const peopleQuery = ref({
size: 10,
current: 1,
})
/**
* 数据导出
* */
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())
}
// 获取六项规定督察详情
async function handleTestingDetailShow(row) {
testingDetailShow.value = true;
activeRow.value = await TestingAlcoholDetail(row.id)
await getTestingAlcoholPeople()
}
// 获取酒精检测人员
async function getTestingAlcoholPeople() {
testingLoading.value = true;
try {
const data = await listTestingAlcoholPeoples(activeRow.value.id, peopleQuery.value)
peoples.value = data.records;
peopleTotal.value = data.total;
} catch (e) {
testingLoading.value = false;
}
testingLoading.value = false;
}
// 重置酒精检测人员
function peopleReset() {
peopleQuery.value = {
size: 10,
current: 1,
};
getTestingAlcoholPeople()
}
// 获取酒精检测人员详情
function handleShowPeople(row) {
activePeople.value = row;
peopleDetailShow.value = true;
}
//-----获取所队自查-督察问题-----
const selfProblemList = ref([]);
const problemLoading = ref(false);
const selfProblemsShow = ref(false);
const selfPeopleQuery = ref({})
const selfProblemTotal = ref(0);
//打开所队自查详情界面
const handleSelfProblemShow = (row) => {
selfProblemsShow.value = true;
selfPeopleQuery.value.id = row.id;
getSelfexaminationProblemFun();
}
//获取所队自查-问题内容
async function getSelfexaminationProblemFun() {
problemLoading.value = true;
try {
const res = await getSelfexaminationProblem(selfPeopleQuery.value.id, selfPeopleQuery.value);
selfProblemList.value = res.records;
selfProblemTotal.value = res.total;
} catch (e) {
problemLoading.value = false;
}
problemLoading.value = false;
}
const problemsShow = ref(false);
const problems = ref([]);
const problemQuery = ref({
size: 10,
current: 1,
});
const problemTotal = ref(0);
const activePeople = ref()
const peoples = ref()
const peopleTotal = ref(0);
const problemsLoading = ref(false)
// ---- 打开督察详情界面(日常督察)
async function handleProblemsShow(row) {
activeRow.value = row;
problemsLoading.value = true
problemsShow.value = true;
try {
problemQuery.value.id = activeRow.value.id;
const res = await listInspectionProblems(problemQuery.value.id,problemQuery.value);
problems.value = res.records;
problemTotal.value = res.total;
} catch (e) {
problemsLoading.value = false;
}
problemsLoading.value = false;
}
// ---- 获取督察详情界面(日常督察)
function getProblems() {
listInspectionProblems(activeRow.value.id).then((data) => {
problems.value = data.records;
problemTotal.value=data.total;
});
}
function problemReset() {
problemQuery.value = {
size: 10,
current: 1,
};
}
/**
* 查询抽检人员
* */
function getSamplingList() {
samplingloading.value = true
selectListData(samplingQuery.value).then((res) => {
samplingList.value = res.records;
setCheck();
samplingTotal.value = res.total;
samplingloading.value = false
})
}
/**
* 数据处理(抽检规则-抽检对象)
* */
function handleSamplingDetail(row) {
editData.value = null
editData.value = row
editData.value.samplingObjectList.forEach(async (x) => {
x.departName = await getDepartShortNameFun(x.deptId)
})
samplingDetailShow.value = true
}
/**
* 获取被选择的数据
* */
function handleSelectionChange(val) {
let arr = []
form.value.samplingIds = [];
val.forEach((s) => {
s.samplingPolices.map((val) => {
arr.push({
empNo: val.empNo,
departId: val.deptId,
name: val.name
})
})
form.value.samplingIds.push(s.id)
})
form.value.userList = arr;
}
//获取单位为简称
const getDepartShortNameFun = async (val) => {
const res = await getDepartProfile(val)
if (res) {
return res.departInfo?.shortName;
}
}
/**
* 删除自查内容
* */
const delCardFun = (index) => {
if (form.value.selfContents) {
form.value.selfContents.splice(index, 1)
}
}
/**
* 添加自查内容
* */
const addSelfArray = () => {
if (form.value.selfContents) {
form.value.selfContents.push(
{
title: null,
content: null
}
)
} else {
form.value.selfContents = [
{
title: null,
content: null
}
]
}
}
const temperancLoading = ref(false);
//上传成功
const managementSuccess = async (val) => {
form.value.userList = val.data;
temperancLoading.value = false;
}
//上传开始回调
const managementProgress = async (val) => {
temperancLoading.value = true;
}
//getDeparts
const departs = catchStore.getDepartsAll();
//任务分发
const distributeShow = ref(false)
const issueForm = ref({})
const issueLoading = ref(false)
const formRefs =ref();
//六项规定督察下发问题
const issueMatterFun =async (row,key)=>{
switch (key){
case "selfexamination":
issueForm.value.taskId = selfPeopleQuery.value.id;
issueForm.value.problemVo = row
break;
case "inspection":
issueForm.value.taskId = problemQuery.value.id;
issueForm.value.problemVo = await getTaskProblem(row.id)
// issueForm.value.problemVo = row
break;
case "testing_alcohol":
issueForm.value.taskId = row.taskId;
issueForm.value.empNo =row.empNo;
break;
case "risk_personal":
issueForm.value.taskId = riskPersonalQuery.value.id;
issueForm.value.supRecordId =row.id
break;
}
issueForm.value.tableKey = key
console.log('actrow',row)
distributeShow.value=true;
}
//下发问题
const handleSubmitTask =async ()=>{
await formRefs.value.validate();
issueLoading.value = true
console.log('activeRow----------',activeRow.value)
try {
await TestingAlcoholIssueMatterFun(issueForm.value)
} catch(e) {
issueLoading.value = false
return
}
issueLoading.value = false
feedback.msgSuccess("下发成功");
distributeShow.value = false;
switch (issueForm.value.tableKey){
case "selfexamination":
getSelfexaminationProblemFun();
break;
case "inspection":
getProblems();
break;
case "testing_alcohol":
getTestingAlcoholPeople();
break;
case "risk_personal":
getTaskSupDataFun();
break;
}
}
function getData() {
if (departs.length && departs[0].id === ROOT_DEPART_ID) {
dictData.value = departs[0].children
} else {
dictData.value = departs
}
}
onMounted(() => {
getData()
})
const riskDataTable = ref([]);
const riskDataQuery = ref({})
const riskDataTotal = ref(0);
const filterDataTable = ref([])
const uploadShow = ref(false)
const showUploadFun = () => {
uploadShow.value = !uploadShow.value
}
const startValue = ref(0);
const endValue = ref(11);
/**
* 获取表单数据
* */
const getRiskDataTableList = (val) => {
endValue.value = (10 * val) + 1;
startValue.value = (10 * (val - 1));
if (riskDataTotal.value < (10 * val)) {
endValue.value = riskDataTotal.value;
}
riskDataTable.value = filterDataTable.value.slice(startValue.value, endValue.value);
}
/**
* 获取重点督察人员表单
* */
watch(() => form.value.supRiskDtoList, (newVal) => {
if (form.value.supRiskDtoList && form.value.supRiskDtoList.length > 0) {
getRiskDataTableSubmit();
}
if(!activeRow.value.supRiskDtoList || activeRow.value.supRiskDtoList.length == 0){
riskDataTotal.value = 0;
riskDataTable.value =[];
}
}, {immediate: true, deep: true})
/**
* 获取重点督察人员表单
* */
watch(() => activeRow.value.supRiskDtoList, (newVal) => {
if (activeRow.value.supRiskDtoList && activeRow.value.supRiskDtoList.length > 0) {
getRiskDataTableSubmit();
}
}, {immediate: true, deep: true})
watch(departs, () => {
getData()
})
watch(() => form.value.specialType, (newVal) => {
console.log('newVal',newVal)
if (newVal === '六项规定督察') {
form.value.samplingTarget = '自定义人员'
}
}, {immediate: true})
watch(() => form.value.samplingTarget, (newVal) => {
if (newVal === '自定义人员') {
getSamplingList()
}
}, {immediate: true})
watch(() => form.value.supervisionType, (newVal) => {
if (newVal === '日常督察') {
form.value.taskContentHtml = '<p>任务要求</p>'
} else {
delete form.value.taskContentHtml
}
}, {immediate: true})
</script>
<style lang="scss" scoped>
h5 {
margin-bottom: 10px;
}
.pepole-container > * {
margin-bottom: 8px;
}
.card_content {
height: 100px;
width: 100%;
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: row;
flex-wrap: wrap;
margin-top: 10px;
}
.zcCard {
width: 47%;
padding: 15px 10px;
margin-bottom: 10px;
margin-left: 5px;
background-color: #f1f6ff
}
.card_title {
margin-bottom: 10px
}
.superviseRiskCards {
width: 100%;
height: 70vh;
display: flex;
justify-content: space-around;
}
.risk_left {
width: 30%;
height: 70vh;
overflow-x: visible;
overflow-y: auto;
margin-right:10px;
}
.risk_right {
width: 70%;
height: 70vh;
overflow: auto;
}
.user_card {
width: 99%;
display: flex;
justify-content: space-around;
border: 1px solid #ECEEFB;
border-radius: 10px;
margin-top: 5px;
margin-bottom: 10px;
overflow: hidden;
}
.user_card_change{
background-color: #eaeaf1;
}
.user_card_img {
width: 40%;
}
.user_card_info {
width: 60%;
color: #afaeae;
padding: 10px;
.user_card_info_text {
color: #0d0e1b;
}
}
</style>