数字督察一体化平台-前端
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.
 
 
 
 

575 lines
24 KiB

<template>
<el-dialog title="问题录入" width="54vw" :lock-scroll="false" top="5vh">
<el-scrollbar
height="75vh"
v-loading="loading"
element-loading-text="问题下发中..."
>
<el-form
label-width="148"
:model="form"
ref="formRef"
style="padding: 0 16px"
>
<h2>问题信息</h2>
<div class="add-negation-container">
<el-row>
<el-col :span="12">
<el-form-item
label="问题来源"
prop="problemSourcesCode"
:rules="{
required: true,
message: '请选择问题来源',
trigger: ['blur'],
}"
>
<dict-select
name="problemSources"
v-model="form.problemSourcesCode"
@change="
(nodeData) =>
(form.problemSources =
nodeData.label)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="业务类别"
prop="businessTypeCode"
:rules="{
required: true,
message: '请选择业务类别',
trigger: ['blur'],
}"
>
<el-select
v-model="form.businessTypeCode"
@change="
(val) =>
(form.businessTypeName =
dict.businessType.filter(
(item) =>
item.dictValue === val
)[0].dictLabel)
"
>
<el-option
v-for="item in dict.businessType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col
:span="12"
v-if="
form.problemSourcesCode === ProblemSources.ZXDC
"
>
<el-form-item
label="专项督察"
prop="specialSupervision"
:rules="{
required: true,
message: '请选择专项督察',
trigger: ['blur'],
}"
>
<el-select
v-model="form.specialSupervision"
clearable
>
<el-option
v-for="item in dict.specialSupervision"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col
:span="12"
v-if="
form.problemSourcesCode ===
ProblemSources.ZXDC ||
form.problemSourcesCode === ProblemSources.XCDC
"
>
<el-form-item
label="通报期数"
prop="reportNumber"
:rules="{
required: true,
message: '请选择通报期数',
trigger: ['blur'],
}"
>
<el-input
placeholder="请输入"
v-model="form.reportNumber"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="涉及案件/警情编号"
prop="caseNumber"
>
<el-input
v-model="form.caseNumber"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="涉嫌问题"
prop="involveProblem"
:rules="{
required: true,
message: '请选择涉嫌问题',
trigger: ['blur'],
}"
>
<el-select
v-model="form.involveProblem"
multiple
clearable
>
<el-option
v-for="item in dict.suspectProblem"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="问题涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择问题涉及单位',
trigger: ['blur'],
}"
>
<depart-tree-select
v-model="form.involveDepartId"
:check-strictly="true"
@node-click="
(row) =>
(form.involveDepartName =
row.shortName)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item-ext
label="涉及警种"
content="囊括了市局除分县市局以外的所有业务警种,便于后期统计分析业务条线的问题。"
prop="policeType"
>
<el-select
v-model="form.policeType"
@change="
(val) =>
(form.policeTypeName =
dict.policeType.filter(
(item) =>
item.dictValue === val
)[0].dictLabel)
"
clearable
>
<el-option
v-for="item in dict.policeType"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item-ext>
</el-col>
</el-row>
<el-row
v-if="
ProblemSources_XFTS.includes(
form.problemSourcesCode
)
"
>
<el-col :span="12">
<el-form-item
label="投诉反映人"
prop="responderName"
>
<el-input
placeholder="请输入"
v-model="form.responderName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系电话" prop="contactPhone">
<el-input
v-model="form.contactPhone"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="问题发现时间"
prop="discoveryTime"
:rules="{
required: true,
message: '请选择问题发现时间',
trigger: ['blur'],
}"
>
<el-date-picker
v-model="form.discoveryTime"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm"
time-format="HH:mm"
style="width: 100%"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="问题发生时间"
prop="happenTime"
>
<el-date-picker
v-model="form.happenTime"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm"
time-format="HH:mm"
style="width: 100%"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item
label="事情简要描述"
prop="thingDesc"
:rules="{
required: true,
message: '请输入事情简要描述',
trigger: ['blur'],
}"
>
<el-input
type="textarea"
placeholder="请输入"
v-model="form.thingDesc"
:autosize="{ minRows: 4 }"
/>
</el-form-item>
<el-form-item label="问题附件" prop="thingFiles">
<file-upload
v-model:files="form.thingFiles"
tips="为便于“办理单位”更全面了解问题详情,请上传相关附件,如现场督察、数字督察等相关照片、视频及其他佐证材料。"
/>
</el-form-item>
</div>
<h2>办理单位</h2>
<div class="add-negation-container">
<el-form-item
label="主办层级"
prop="hostLevel"
:rules="{
required: true,
message: '请选择主办层级',
trigger: ['blur'],
}"
>
<el-select
style="width: 280px"
v-model="form.hostLevel"
@change="handleChangeHostLevel"
>
<el-option
v-for="item in dict.hostLevel"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
<div class="tips mt-10">
<p>
如主办层级 为 市局主办, 则由市局直属支队办理;
</p>
<p>
如主办层级 为
二级机构主办时,则由涉及单位的二级机构办理;
</p>
<p>
如主办层级 为 三级机构主办时,
则由涉及单位办理。
</p>
</div>
</el-form-item>
<el-form-item
label="指定具体办理单位"
prop="departId"
:rules="{
required: true,
message: '请选择办理单位',
trigger: ['blur'],
}"
>
<div class="flex gap">
<div style="width: 280px">
<template
v-if="form.hostLevel === HostLevel.THREE"
>
<depart-tree-select
v-model="form.departId"
v-loading="departLoading"
/>
</template>
<el-tree-select
v-else
:data="departs"
:props="{ label: 'shortName', value: 'id' }"
node-key="id"
clearable
filterable
v-model="form.departId"
@node-click="handleSelectDepart"
check-strictly
style="width: 280px"
v-loading="departLoading"
/>
</div>
<el-button
type="primary"
@click="handleLinkDepart"
text
v-if="form.hostLevel !== HostLevel.FIRST"
>关联问题涉及单位</el-button
>
</div>
<div class="tips mt-10">
<p>问题涉及单位 指与该问题相关的单位;</p>
<p>指定具体办理单位 指将问题分派给哪个单位办理。</p>
</div>
</el-form-item>
</div>
<h2>办理时限</h2>
<div class="add-negation-container">
<el-form-item
label="办理时限"
prop="timeLimit"
:rules="{
required: true,
message: '请选择办理时限',
trigger: ['blur'],
}"
>
<time-limit-select
v-model="form.timeLimit"
v-model:maxSignDuration="form.maxSignDuration"
v-model:maxHandleDuration="form.maxHandleDuration"
v-model:maxExtensionDuration="
form.maxExtensionDuration
"
/>
</el-form-item>
</div>
<div>
<h2>审批流程</h2>
<div class="add-negation-container">
<el-form-item
label="审批流程"
prop="approvalFlow"
:rules="{
required: true,
message: '请选择审批流程',
trigger: ['blur'],
}"
>
<el-radio-group v-model="form.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>
</div>
</div>
</el-form>
</el-scrollbar>
<footer class="flex end">
<el-button @click="emit('close')" size="large">取消</el-button>
<el-button
type="primary"
@click="handleAddNegative"
size="large"
:loading="loading"
>下发问题</el-button
>
</footer>
</el-dialog>
</template>
<script lang="ts" setup>
import {
HostLevel,
TimeLimit,
ApprovalFlow,
ProblemSources,
ProblemSources_XFTS,
} from "@/enums/dictEnums";
import feedback from "@/utils/feedback";
import { addNegative, generateOriginId } from "@/api/work/negative";
import { secondList, listByFirstHost } from "@/api/system/depart";
import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"businessType",
"suspectProblem",
"policeType",
"hostLevel",
"timeLimit",
"approvalFlow",
"specialSupervision",
]);
const props = defineProps({
modeType: {
type: String,
default: "add",
},
});
const emit = defineEmits(["close"]);
const form = ref({
thingFiles: [],
hostLevel: HostLevel.THREE,
timeLimit: TimeLimit.WORK_137,
approvalFlow: ApprovalFlow.SECOND,
});
watch(
() => form.value.hostLevel,
() => {
getDeparts();
}
);
onMounted(() => {
getDeparts();
});
const formRef = ref(null);
const loading = ref(false);
async function handleAddNegative() {
try {
await formRef.value.validate();
} catch (e) {
feedback.msgWarning("请检查输入项");
throw e;
}
form.value.thingFiles = form.value.thingFiles.filter(
(item) => item.filePath
);
loading.value = true;
try {
await addNegative(form.value);
} catch (e) {
loading.value = false;
return;
}
loading.value = false;
form.value = {
thingFiles: [],
hostLevel: HostLevel.THREE,
timeLimit: TimeLimit.WORK_137,
approvalFlow: ApprovalFlow.SECOND,
};
feedback.msgSuccess("下发成功");
emit("close");
}
const departs = ref<any[]>([]);
const departLoading = ref(false);
async function getDeparts() {
departLoading.value = true;
if (form.value.hostLevel === HostLevel.FIRST) {
departs.value = await listByFirstHost();
} else if (form.value.hostLevel === HostLevel.SECOND) {
departs.value = await secondList();
}
departLoading.value = false;
}
function handleSelectDepart(row, node) {
form.value.departName = row.shortName;
}
function handleLinkDepart() {
form.value.departId = form.value.involveDepartId;
form.value.departName = form.value.involveDepartName;
}
function handleChangeHostLevel(val) {
if (val === HostLevel.FIRST) {
form.value.departId = "";
}
if (val === HostLevel.SECOND) {
form.value.approvalFlow = "3";
}
}
</script>
<style lang="scss" scoped>
.add-negation-container {
padding: 0 60px;
}
:deep() {
.el-form-item__content {
flex-direction: column;
align-items: flex-start;
}
.block.el-radio-group {
display: block;
.el-radio {
display: block;
}
}
}
</style>