55 changed files with 2561 additions and 862 deletions
|
After Width: | Height: | Size: 3.2 KiB |
@ -0,0 +1,22 @@ |
|||||||
|
import request from "@/api/request"; |
||||||
|
|
||||||
|
|
||||||
|
export function listSelfexamination(query) { |
||||||
|
return request.get({ |
||||||
|
url: '/task/selfexamination', |
||||||
|
query |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
export function getSelfexaminationDetail(id) { |
||||||
|
return request.get({ |
||||||
|
url: '/task/selfexamination/' + id |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
export function addSelfexamination(body) { |
||||||
|
return request.post({ |
||||||
|
url: '/task/selfexamination', |
||||||
|
body |
||||||
|
}); |
||||||
|
} |
||||||
@ -0,0 +1,9 @@ |
|||||||
|
import request from "@/api/request"; |
||||||
|
|
||||||
|
|
||||||
|
export function listTaskProblem(query) { |
||||||
|
return request.get({ |
||||||
|
url: '/task/problem', |
||||||
|
query |
||||||
|
}); |
||||||
|
} |
||||||
@ -0,0 +1,190 @@ |
|||||||
|
<template> |
||||||
|
<QuillEditor |
||||||
|
ref="quillRef" |
||||||
|
v-model:content="content" |
||||||
|
:options="options" |
||||||
|
contentType="html" |
||||||
|
@update:content="setValue()" |
||||||
|
/> |
||||||
|
</template> |
||||||
|
<script setup> |
||||||
|
import { QuillEditor, Quill } from "@vueup/vue-quill"; |
||||||
|
import "@vueup/vue-quill/dist/vue-quill.snow.css"; |
||||||
|
|
||||||
|
const props = defineProps({ |
||||||
|
modelValue: { |
||||||
|
type: String |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
const emit = defineEmits(["update:modelValue"]); |
||||||
|
|
||||||
|
const content = ref(props.modelValue); |
||||||
|
const quillRef = ref(null); |
||||||
|
|
||||||
|
const toolbarOptions = [ |
||||||
|
[{ header: [1, 2, 3, 4, 5, 6, false] }], |
||||||
|
["bold", "italic", "underline", "strike"], // toggled buttons |
||||||
|
[{ list: "ordered" }, { list: "bullet" }], |
||||||
|
["blockquote", "code-block"], |
||||||
|
[{ indent: "-1" }, { indent: "+1" }], // outdent/indent |
||||||
|
[{ color: [] }, { background: [] }], // dropdown with defaults from theme |
||||||
|
[{ align: [] }], |
||||||
|
]; |
||||||
|
|
||||||
|
const options = reactive({ |
||||||
|
modules: { |
||||||
|
toolbar: toolbarOptions, |
||||||
|
}, |
||||||
|
placeholder: "请输入", |
||||||
|
}); |
||||||
|
|
||||||
|
const setValue = () => { |
||||||
|
//用于设置双向绑定值 |
||||||
|
const text = toRaw(quillRef.value).getHTML(); |
||||||
|
emit("update:modelValue", text); |
||||||
|
}; |
||||||
|
|
||||||
|
watch( |
||||||
|
() => props.modelValue, |
||||||
|
(val) => { |
||||||
|
if (val) { |
||||||
|
content.value = val; //用于监听绑定值进行数据回填 |
||||||
|
} else { |
||||||
|
toRaw(quillRef.value).setContents(""); //可用于弹窗使用富文本框关闭弹窗清除值 |
||||||
|
} |
||||||
|
} |
||||||
|
); |
||||||
|
|
||||||
|
function getText() { |
||||||
|
return toRaw(quillRef.value).getText() |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
defineExpose({ |
||||||
|
getText |
||||||
|
}); |
||||||
|
</script> |
||||||
|
|
||||||
|
<style lang="scss" > |
||||||
|
.ql-container.ql-snow { |
||||||
|
font-size: 14px; |
||||||
|
} |
||||||
|
.ql-snow { |
||||||
|
.ql-tooltip[data-mode="link"]::before { |
||||||
|
content: "请输入链接地址:"; |
||||||
|
} |
||||||
|
.ql-tooltip.ql-editing a.ql-action::after { |
||||||
|
border-right: 0px; |
||||||
|
content: "保存"; |
||||||
|
padding-right: 0px; |
||||||
|
} |
||||||
|
.ql-tooltip[data-mode="video"]::before { |
||||||
|
content: "请输入视频地址:"; |
||||||
|
} |
||||||
|
.ql-picker.ql-size { |
||||||
|
.ql-picker-label[data-value="12px"]::before, |
||||||
|
.ql-picker-item[data-value="12px"]::before { |
||||||
|
content: "12px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="14px"]::before, |
||||||
|
.ql-picker-item[data-value="14px"]::before { |
||||||
|
content: "14px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="16px"]::before, |
||||||
|
.ql-picker-item[data-value="16px"]::before { |
||||||
|
content: "16px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="18px"]::before, |
||||||
|
.ql-picker-item[data-value="18px"]::before { |
||||||
|
content: "18px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="20px"]::before, |
||||||
|
.ql-picker-item[data-value="20px"]::before { |
||||||
|
content: "20px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="24px"]::before, |
||||||
|
.ql-picker-item[data-value="24px"]::before { |
||||||
|
content: "24px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="28px"]::before, |
||||||
|
.ql-picker-item[data-value="28px"]::before { |
||||||
|
content: "28px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="32px"]::before, |
||||||
|
.ql-picker-item[data-value="32px"]::before { |
||||||
|
content: "32px"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="36px"]::before, |
||||||
|
.ql-picker-item[data-value="36px"]::before { |
||||||
|
content: "36px"; |
||||||
|
} |
||||||
|
} |
||||||
|
.ql-picker.ql-header { |
||||||
|
.ql-picker-label::before, |
||||||
|
.ql-picker-item::before { |
||||||
|
content: "文本"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="1"]::before, |
||||||
|
.ql-picker-item[data-value="1"]::before { |
||||||
|
content: "标题1"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="2"]::before, |
||||||
|
.ql-picker-item[data-value="2"]::before { |
||||||
|
content: "标题2"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="3"]::before, |
||||||
|
.ql-picker-item[data-value="3"]::before { |
||||||
|
content: "标题3"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="4"]::before, |
||||||
|
.ql-picker-item[data-value="4"]::before { |
||||||
|
content: "标题4"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="5"]::before, |
||||||
|
.ql-picker-item[data-value="5"]::before { |
||||||
|
content: "标题5"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="6"]::before, |
||||||
|
.ql-picker-item[data-value="6"]::before { |
||||||
|
content: "标题6"; |
||||||
|
} |
||||||
|
} |
||||||
|
.ql-picker.ql-font { |
||||||
|
.ql-picker-label[data-value="SimSun"]::before, |
||||||
|
.ql-picker-item[data-value="SimSun"]::before { |
||||||
|
content: "宋体"; |
||||||
|
font-family: "SimSun" !important; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="SimHei"]::before, |
||||||
|
.ql-picker-item[data-value="SimHei"]::before { |
||||||
|
content: "黑体"; |
||||||
|
font-family: "SimHei"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="Microsoft-YaHei"]::before, |
||||||
|
.ql-picker-item[data-value="Microsoft-YaHei"]::before { |
||||||
|
content: "微软雅黑"; |
||||||
|
font-family: "Microsoft YaHei"; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="KaiTi"]::before, |
||||||
|
.ql-picker-item[data-value="KaiTi"]::before { |
||||||
|
content: "楷体"; |
||||||
|
font-family: "KaiTi" !important; |
||||||
|
} |
||||||
|
.ql-picker-label[data-value="FangSong"]::before, |
||||||
|
.ql-picker-item[data-value="FangSong"]::before { |
||||||
|
content: "仿宋"; |
||||||
|
font-family: "FangSong"; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
.ql-align-center { |
||||||
|
text-align: center; |
||||||
|
} |
||||||
|
.ql-align-right { |
||||||
|
text-align: right; |
||||||
|
} |
||||||
|
.ql-align-left { |
||||||
|
text-align: left; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,393 @@ |
|||||||
|
<template> |
||||||
|
<div class="container"> |
||||||
|
<header> |
||||||
|
<el-form :label-width="114"> |
||||||
|
<el-row> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="登记时间"> |
||||||
|
<date-time-range-picker-ext |
||||||
|
v-model="query.discoveryTime" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="录入时间"> |
||||||
|
<date-time-range-picker-ext |
||||||
|
v-model="query.createTime" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="信件编号"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.originId" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="信访人"> |
||||||
|
<div class="flex gap"> |
||||||
|
<el-select |
||||||
|
v-model="query.responderKey" |
||||||
|
style="width: 160px" |
||||||
|
@change="delete query.responderValue" |
||||||
|
> |
||||||
|
<el-option value="name" label="姓名" /> |
||||||
|
<el-option value="phone" label="电话" /> |
||||||
|
</el-select> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.responderValue" |
||||||
|
clearable |
||||||
|
/> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="具体内容"> |
||||||
|
<el-input |
||||||
|
placeholder="请输入" |
||||||
|
v-model="query.thingDesc" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<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-select |
||||||
|
clearable |
||||||
|
v-model="query.initialPetition" |
||||||
|
> |
||||||
|
<el-option |
||||||
|
v-for="item in dict.initialPetition" |
||||||
|
:key="item.id" |
||||||
|
:label="item.dictLabel" |
||||||
|
:value="item.dictValue" |
||||||
|
/> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="状态"> |
||||||
|
<el-select |
||||||
|
v-model="query.distributionState" |
||||||
|
clearable |
||||||
|
> |
||||||
|
<el-option label="未分发" value="0"></el-option> |
||||||
|
<el-option label="已分发" value="1"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="信访来源"> |
||||||
|
<el-select |
||||||
|
v-model="query.problemSourcesCode" |
||||||
|
clearable |
||||||
|
> |
||||||
|
<el-option label="国家信访" value="21"></el-option> |
||||||
|
<el-option label="公安部信访" value="22"></el-option> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
</el-form> |
||||||
|
<div class="mb-25 flex end"> |
||||||
|
<div> |
||||||
|
<el-button type="primary" @click="getList"> |
||||||
|
<template #icon> |
||||||
|
<icon name="el-icon-Search" /> |
||||||
|
</template> |
||||||
|
查询</el-button |
||||||
|
> |
||||||
|
<el-button @click="reset">重置</el-button> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</header> |
||||||
|
<div class="table-container"> |
||||||
|
<el-table :data="list"> |
||||||
|
<el-table-column |
||||||
|
label="信件编号" |
||||||
|
prop="originId" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="投诉渠道" |
||||||
|
prop="channelForFilingComplaints" |
||||||
|
width="90" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="信访方式" |
||||||
|
prop="petitionType" |
||||||
|
width="90" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="登记时间" |
||||||
|
prop="discoveryTime" |
||||||
|
width="150" |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="信访人" |
||||||
|
prop="responderName" |
||||||
|
width="90" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column label="电话" prop="responderPhone" width="116" /> |
||||||
|
<el-table-column label="身份证号码" prop="responderIdCode" width="180" /> |
||||||
|
<el-table-column label="初重信访" align="center" width="60"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<span>{{ |
||||||
|
getDictLable( |
||||||
|
dict.initialPetition, |
||||||
|
row.initialPetition |
||||||
|
) |
||||||
|
}}</span> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column label="群众集访" width="60" align="center"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<span v-if="row.massVisits === true">是</span> |
||||||
|
<span v-if="row.massVisits === false">否</span> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column |
||||||
|
label="被投诉机构" |
||||||
|
show-overflow-tooltip |
||||||
|
> |
||||||
|
<template #default="{ row }"> |
||||||
|
<span>{{ row.secondDepartName }}</span> |
||||||
|
<span>{{ row.thirdDepartName}}</span> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column |
||||||
|
label="具体内容" |
||||||
|
prop="thingDesc" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column label="状态" width="90"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-tag>{{ |
||||||
|
getDictLable( |
||||||
|
dict.distributionState, |
||||||
|
row.distributionState |
||||||
|
) |
||||||
|
}}</el-tag> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column |
||||||
|
label="办理情况" |
||||||
|
prop="petitionProcessingStatus" |
||||||
|
width="100" |
||||||
|
/> |
||||||
|
<el-table-column label="操作" width="160"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button |
||||||
|
v-if="row.negativeId && row.distributionState === '1'" |
||||||
|
type="primary" |
||||||
|
link |
||||||
|
@click="handleAction(row)" |
||||||
|
>问题详情 |
||||||
|
</el-button> |
||||||
|
<el-button |
||||||
|
type="primary" |
||||||
|
link |
||||||
|
@click="handleDetail(row)" |
||||||
|
>详情</el-button |
||||||
|
> |
||||||
|
<el-button type="danger" link @click="handleDel(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> |
||||||
|
|
||||||
|
<data-distrbute |
||||||
|
v-model:show="distributeShow" |
||||||
|
v-model:data="distributeList" |
||||||
|
@update="getList" |
||||||
|
/> |
||||||
|
|
||||||
|
<negative-dialog |
||||||
|
v-model="negativeShow" |
||||||
|
:id="activeNegativeId" |
||||||
|
@close="negativeShow = false" |
||||||
|
/> |
||||||
|
|
||||||
|
<el-dialog title="详情" v-model="detailShow" width="60vw"> |
||||||
|
<div style="min-height: 50vh"> |
||||||
|
<div class="row" style="margin: 0 60px"> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>信件编号</label> |
||||||
|
<span>{{ activeRow.originId }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>投诉渠道</label> |
||||||
|
<span>{{ |
||||||
|
activeRow.channelForFilingComplaints || "/" |
||||||
|
}}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>信访方式</label> |
||||||
|
<span>{{ |
||||||
|
activeRow.petitionType || "/" |
||||||
|
}}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>登记时间</label> |
||||||
|
<span>{{ activeRow.discoveryTime }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>信访人</label> |
||||||
|
<span>{{ activeRow.responderName }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>信访人联系方式</label> |
||||||
|
<span>{{ activeRow.responderPhone }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>信访人身份证</label> |
||||||
|
<span>{{ activeRow.responderIdCode || '/' }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>初重信访</label> |
||||||
|
<span>{{ |
||||||
|
getDictLable( |
||||||
|
dict.initialPetition, |
||||||
|
activeRow.initialPetition |
||||||
|
) || "/" |
||||||
|
}}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>群众集访</label> |
||||||
|
<span |
||||||
|
><span v-if="activeRow.massVisits === true">是</span> |
||||||
|
<span v-else-if="activeRow.massVisits === false" |
||||||
|
>否</span |
||||||
|
> |
||||||
|
<span v-else |
||||||
|
>/</span |
||||||
|
> |
||||||
|
</span |
||||||
|
> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>被投诉机构</label> |
||||||
|
<span |
||||||
|
><span>{{ activeRow.secondDepartName }}</span> |
||||||
|
<span>{{ activeRow.thirdDepartName }}</span></span |
||||||
|
> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>办理情况</label> |
||||||
|
<span>{{ activeRow.petitionProcessingStatus || '/' }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>接访领导</label> |
||||||
|
<span>{{ '/' }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>化解情况</label> |
||||||
|
<span>{{ '/' }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-12"> |
||||||
|
<label>当前状态</label> |
||||||
|
<span>{{ '/' }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-24"> |
||||||
|
<label>具体内容</label> |
||||||
|
<span class="content">{{ activeRow.thingDesc }}</span> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
<script setup> |
||||||
|
import { |
||||||
|
listPetitionComplaint, |
||||||
|
delPetitionComplaint, |
||||||
|
} from "@/api/data/petitionComplaint"; |
||||||
|
import feedback from "@/utils/feedback"; |
||||||
|
|
||||||
|
import { getDictLable } from "@/utils/util"; |
||||||
|
|
||||||
|
import useCatchStore from "@/stores/modules/catch"; |
||||||
|
|
||||||
|
const catchStore = useCatchStore(); |
||||||
|
const dict = catchStore.getDicts([ |
||||||
|
"distributionState", |
||||||
|
"initialPetition" |
||||||
|
]); |
||||||
|
|
||||||
|
const query = ref({ |
||||||
|
size: 10, |
||||||
|
current: 1, |
||||||
|
responderKey: "name" |
||||||
|
}); |
||||||
|
|
||||||
|
const list = ref([]); |
||||||
|
const total = ref(0); |
||||||
|
function getList() { |
||||||
|
listPetitionComplaint(query.value).then((data) => { |
||||||
|
list.value = data.records; |
||||||
|
total.value = data.total; |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
function reset() { |
||||||
|
query.value = { |
||||||
|
size: 10, |
||||||
|
current: 1, |
||||||
|
responderKey: "name" |
||||||
|
}; |
||||||
|
getList(); |
||||||
|
} |
||||||
|
|
||||||
|
getList(); |
||||||
|
|
||||||
|
async function handleDel(row) { |
||||||
|
await feedback.confirm("确定要删除该数据?"); |
||||||
|
await delPetitionComplaint(row.originId); |
||||||
|
getList(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const activeNegativeId = ref(""); |
||||||
|
const negativeShow = ref(false); |
||||||
|
function handleAction(row) { |
||||||
|
negativeShow.value = true; |
||||||
|
activeNegativeId.value = row.negativeId; |
||||||
|
} |
||||||
|
|
||||||
|
const detailShow = ref(false); |
||||||
|
const activeRow = ref({}); |
||||||
|
|
||||||
|
function handleDetail(row) { |
||||||
|
activeRow.value = row; |
||||||
|
detailShow.value = true; |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
</style> |
||||||
@ -0,0 +1,464 @@ |
|||||||
|
<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="type" |
||||||
|
width="100" |
||||||
|
align="center" |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="任务要求" |
||||||
|
prop="requirement" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="自查内容" |
||||||
|
prop="requirement" |
||||||
|
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="任务状态" 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="发现问题数" |
||||||
|
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="2vh" |
||||||
|
style="margin-bottom: 0" |
||||||
|
> |
||||||
|
<el-scrollbar max-height="80vh"> |
||||||
|
<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" :check-strictly="false" /> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item |
||||||
|
label="自查类型" |
||||||
|
:rules="{ |
||||||
|
required: true, |
||||||
|
message: '请选择', |
||||||
|
}" |
||||||
|
prop="type" |
||||||
|
> |
||||||
|
<el-select |
||||||
|
v-model="form.type" |
||||||
|
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-divider /> |
||||||
|
|
||||||
|
<el-form-item |
||||||
|
prop="requirementHtml" |
||||||
|
:rules="{ |
||||||
|
required: true, |
||||||
|
message: '请输入任务内容', |
||||||
|
}" |
||||||
|
label-position="top" |
||||||
|
> |
||||||
|
<template #label> |
||||||
|
<span |
||||||
|
class="text-primary" |
||||||
|
style="font-size: 16px; font-weight: 500" |
||||||
|
>任务要求</span |
||||||
|
> |
||||||
|
</template> |
||||||
|
<div style="width: 100%"> |
||||||
|
<quill-editor |
||||||
|
ref="quillRef" |
||||||
|
v-model="form.requirementHtml" |
||||||
|
style="min-height: 120px; overflow: auto" |
||||||
|
/> |
||||||
|
</div> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item |
||||||
|
prop="contents" |
||||||
|
:rules="{ |
||||||
|
validator: validateContents, |
||||||
|
}" |
||||||
|
label-position="top" |
||||||
|
> |
||||||
|
<template #label> |
||||||
|
<div class="flex between"> |
||||||
|
<h5 style="margin-top: 0">自查内容</h5> |
||||||
|
<el-button |
||||||
|
size="small" |
||||||
|
type="primary" |
||||||
|
plain |
||||||
|
@click="form.contents.push({})" |
||||||
|
> |
||||||
|
<template #icon> |
||||||
|
<icon name="el-icon-Plus" /> |
||||||
|
</template> |
||||||
|
添加自查内容</el-button |
||||||
|
> |
||||||
|
</div> |
||||||
|
</template> |
||||||
|
|
||||||
|
<div |
||||||
|
style="min-height: 80px; overflow: hidden; width: 100%" |
||||||
|
> |
||||||
|
<el-row :gutter="20"> |
||||||
|
<el-col |
||||||
|
:span="12" |
||||||
|
v-for="(item, index) in form.contents" |
||||||
|
:key="index" |
||||||
|
> |
||||||
|
<div class="flex between mb-8"> |
||||||
|
<span>自查内容{{ index + 1 }}</span> |
||||||
|
<el-button |
||||||
|
size="small" |
||||||
|
type="danger" |
||||||
|
plain |
||||||
|
@click="form.contents.push({})" |
||||||
|
> |
||||||
|
<template #icon> |
||||||
|
<icon name="el-icon-Delete" /> |
||||||
|
</template> |
||||||
|
删除</el-button |
||||||
|
> |
||||||
|
</div> |
||||||
|
<el-form-item |
||||||
|
:prop="`contents.${index}.title`" |
||||||
|
:rules="{ |
||||||
|
required: true, |
||||||
|
message: '请输入自查项目', |
||||||
|
}" |
||||||
|
label-position="top" |
||||||
|
> |
||||||
|
<el-input |
||||||
|
placeholder="请输入自查项目" |
||||||
|
v-model="item.title" |
||||||
|
class="mb-18" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
<el-form-item |
||||||
|
:prop="`contents.${index}.content`" |
||||||
|
:rules="{ |
||||||
|
required: true, |
||||||
|
message: '请输入任务内容', |
||||||
|
}" |
||||||
|
label-position="top" |
||||||
|
style="margin-bottom: 32px" |
||||||
|
> |
||||||
|
<el-input |
||||||
|
type="textarea" |
||||||
|
placeholder="请输入工作要求" |
||||||
|
v-model="item.content" |
||||||
|
/> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
</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 style="padding: 0 40px"> |
||||||
|
<div class="row"> |
||||||
|
<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.type }}</span> |
||||||
|
</div> |
||||||
|
<div class="col col-24"> |
||||||
|
<label>任务时间</label> |
||||||
|
<span |
||||||
|
><span>{{ activeRow.beginTime }}</span> |
||||||
|
<span>-</span> |
||||||
|
<span>{{ activeRow.endTime }}</span></span |
||||||
|
> |
||||||
|
</div> |
||||||
|
</div> |
||||||
|
<h5 style="margin-top: 10px">任务要求</h5> |
||||||
|
<div v-html="activeRow.requirementHtml"></div> |
||||||
|
<h5>自查内容</h5> |
||||||
|
<el-row> |
||||||
|
<el-col |
||||||
|
:span="12" |
||||||
|
v-for="(item, index) in activeRow.contents" |
||||||
|
:key="index" |
||||||
|
> |
||||||
|
<div style="font-size: 16px" class="mb-8">{{ index + 1}} {{ item.title }}</div> |
||||||
|
<div>{{ item.content }}</div> |
||||||
|
</el-col> |
||||||
|
</el-row> |
||||||
|
</div> |
||||||
|
<footer class="flex end mt-20"> |
||||||
|
<el-button size="large" @click="detailShow = false">关闭</el-button> |
||||||
|
</footer> |
||||||
|
</el-dialog> |
||||||
|
</template> |
||||||
|
<script setup> |
||||||
|
import { |
||||||
|
listSelfexamination, |
||||||
|
addSelfexamination, |
||||||
|
getSelfexaminationDetail, |
||||||
|
} from "@/api/mobileSupervision/selfexamination"; |
||||||
|
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() { |
||||||
|
listSelfexamination(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({ |
||||||
|
contents: [], |
||||||
|
}); |
||||||
|
const formRef = ref(null); |
||||||
|
|
||||||
|
const quillRef = ref(); |
||||||
|
async function submit() { |
||||||
|
await formRef.value.validate(); |
||||||
|
form.value.requirement = quillRef.value.getText(); |
||||||
|
await addSelfexamination(form.value); |
||||||
|
feedback.msgSuccess("发布成功"); |
||||||
|
show.value = false; |
||||||
|
getList(); |
||||||
|
form.value = { |
||||||
|
contents: [], |
||||||
|
}; |
||||||
|
} |
||||||
|
|
||||||
|
function handleShowAdd() { |
||||||
|
show.value = true; |
||||||
|
} |
||||||
|
|
||||||
|
const detailShow = ref(false); |
||||||
|
const activeRow = ref({}); |
||||||
|
|
||||||
|
async function handleShowDetail(row) { |
||||||
|
detailShow.value = true; |
||||||
|
const data = await getSelfexaminationDetail(row.id); |
||||||
|
activeRow.value = data; |
||||||
|
} |
||||||
|
|
||||||
|
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 = {}; |
||||||
|
} |
||||||
|
|
||||||
|
function validateContents(rule, value, cb) { |
||||||
|
if (value.length === 0) { |
||||||
|
cb(new Error("请添加自查内容")); |
||||||
|
} else { |
||||||
|
cb(); |
||||||
|
} |
||||||
|
} |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
h5 { |
||||||
|
margin-bottom: 10px; |
||||||
|
} |
||||||
|
.pepole-container > * { |
||||||
|
margin-bottom: 8px; |
||||||
|
} |
||||||
|
</style> |
||||||
@ -0,0 +1,175 @@ |
|||||||
|
<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-select |
||||||
|
clearable |
||||||
|
v-model="query.taskType" |
||||||
|
> |
||||||
|
<el-option |
||||||
|
v-for="item in dict.taskType" |
||||||
|
:key="item.id" |
||||||
|
:label="item.dictLabel" |
||||||
|
:value="item.dictValue" |
||||||
|
/> |
||||||
|
</el-select> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="问题描述"> |
||||||
|
<el-input placeholder="请输入" /> |
||||||
|
</el-form-item> |
||||||
|
</el-col> |
||||||
|
<el-col :span="6"> |
||||||
|
<el-form-item label="分发状态"> |
||||||
|
<el-select |
||||||
|
v-model="query.distributionState" |
||||||
|
clearable |
||||||
|
> |
||||||
|
<el-option |
||||||
|
v-for="item in dict.distributionState" |
||||||
|
: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=""> |
||||||
|
生成督察通报</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="createTime" /> |
||||||
|
<el-table-column label="问题来源" > |
||||||
|
<template #default="{ row }"> |
||||||
|
<span>{{ getDictLable(dict.taskType, row.taskType) }}</span> |
||||||
|
</template> |
||||||
|
</el-table-column> |
||||||
|
<el-table-column |
||||||
|
label="涉及单位" |
||||||
|
prop="departName" |
||||||
|
width="120" |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="涉及人员" |
||||||
|
prop="peoples" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="问题类型" |
||||||
|
prop="problemType" |
||||||
|
width="100" |
||||||
|
align="center" |
||||||
|
/> |
||||||
|
<el-table-column |
||||||
|
label="问题描述" |
||||||
|
prop="thingDesc" |
||||||
|
show-overflow-tooltip |
||||||
|
/> |
||||||
|
<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="操作" width="240"> |
||||||
|
<template #default="{ row }"> |
||||||
|
<el-button |
||||||
|
type="primary" |
||||||
|
link |
||||||
|
@click="handleShowDetail(row)" |
||||||
|
>问题详情</el-button |
||||||
|
> |
||||||
|
<el-button |
||||||
|
type="primary" |
||||||
|
link |
||||||
|
@click="handleProblemsShow(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> |
||||||
|
</template> |
||||||
|
<script setup> |
||||||
|
import { getDictLable } from "@/utils/util"; |
||||||
|
import { listTaskProblem } from '@/api/mobileSupervision/taskProblem' |
||||||
|
import useCatchStore from "@/stores/modules/catch"; |
||||||
|
|
||||||
|
const catchStore = useCatchStore(); |
||||||
|
const dict = catchStore.getDicts(["taskType", "distributionState"]); |
||||||
|
|
||||||
|
const taskTypes = [ |
||||||
|
{ |
||||||
|
dictLabel: '测酒任务', |
||||||
|
dictValue: '' |
||||||
|
}, |
||||||
|
{ |
||||||
|
dictLabel: '督察任务', |
||||||
|
dictValue: '' |
||||||
|
}, |
||||||
|
{ |
||||||
|
dictLabel: '所队自查', |
||||||
|
dictValue: '' |
||||||
|
} |
||||||
|
]; |
||||||
|
|
||||||
|
|
||||||
|
const query = ref({}) |
||||||
|
const list = ref([]) |
||||||
|
const total = ref(0) |
||||||
|
|
||||||
|
function getList() { |
||||||
|
listTaskProblem(query.value).then(data => { |
||||||
|
list.value = data.records |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
onMounted(() => { |
||||||
|
getList() |
||||||
|
}) |
||||||
|
</script> |
||||||
|
<style lang="scss" scoped> |
||||||
|
|
||||||
|
</style> |
||||||
Loading…
Reference in new issue