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