Browse Source

feat:所有信息到negative表

feature/tsjb-1.0
parent
commit
118cba3370
  1. 312
      src/components/data/complaintformdialog.vue
  2. 194
      src/views/data/ComplaintCollection.vue

312
src/components/data/complaintformdialog.vue

@ -9,7 +9,7 @@
<el-scrollbar max-height="76vh"> <el-scrollbar max-height="76vh">
<el-form <el-form
ref="formRef" ref="formRef"
:model="model" :model="formData"
:label-width="150" :label-width="150"
class="form-layout" class="form-layout"
style="min-height: 66vh" style="min-height: 66vh"
@ -23,7 +23,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="来源" prop="sourcePath"> <el-form-item label="来源" prop="sourcePath">
<el-cascader <el-cascader
v-model="model.sourcePath" v-model="formData.sourcePath"
:options="dict.sourceTableAndLevel" :options="dict.sourceTableAndLevel"
:props="{ emitPath: true, checkStrictly: false }" :props="{ emitPath: true, checkStrictly: false }"
clearable clearable
@ -38,7 +38,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="业务类别" prop="handleMethod"> <el-form-item label="业务类别" prop="handleMethod">
<el-select <el-select
v-model="model.businessTypeCode" v-model="formData.businessTypeCode"
placeholder="业务类别" placeholder="业务类别"
clearable clearable
> >
@ -59,14 +59,14 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="编号" prop="originId"> <el-form-item label="编号" prop="originId">
<el-input <el-input
v-model="model.originId" v-model="formData.originId"
:placeholder="model.originIdSkip ? '无' : '请输入编号'" :placeholder="formData.originIdSkip ? '无' : '请输入编号'"
:disabled="mode === 'edit' || model.originIdSkip" :disabled="mode === 'edit' || formData.originIdSkip"
> >
<template #append> <template #append>
<el-checkbox <el-checkbox
v-model="model.originIdSkip" v-model="formData.originIdSkip"
@change="(v) => v && (model.originId = '')" @change="(v) => v && (formData.originId = '')"
:disabled="mode=== 'edit'" :disabled="mode=== 'edit'"
> >
@ -79,7 +79,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="登记/受理时间" prop="discoveryTime"> <el-form-item label="登记/受理时间" prop="discoveryTime">
<el-date-picker <el-date-picker
v-model="model.discoveryTime" v-model="formData.discoveryTime"
type="datetime" type="datetime"
placeholder="请选择" placeholder="请选择"
value-format="YYYY-MM-DDTHH:mm:ss" value-format="YYYY-MM-DDTHH:mm:ss"
@ -95,15 +95,15 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="来件人姓名" prop="responderName"> <el-form-item label="来件人姓名" prop="responderName">
<el-input <el-input
v-model="model.responderName" v-model="formData.responderName"
:placeholder="model.responderNameSkip ? '无' : '请输入来件人姓名'" :placeholder="formData.responderNameSkip ? '无' : '请输入来件人姓名'"
:disabled="model.responderNameSkip" :disabled="formData.responderNameSkip"
@blur="onAutoCheckDuplicate" @blur="onAutoCheckDuplicate"
> >
<template #append> <template #append>
<el-checkbox <el-checkbox
v-model="model.responderNameSkip" v-model="formData.responderNameSkip"
@change="(v) => v && (model.responderName = '')" @change="(v) => v && (formData.responderName = '')"
> >
</el-checkbox> </el-checkbox>
@ -116,15 +116,15 @@
<div style="display: flex; align-items: flex-start; gap: 8px;"> <div style="display: flex; align-items: flex-start; gap: 8px;">
<el-form-item label="身份证号码" prop="responderIdCode" style="flex: 1; margin-bottom: 0;"> <el-form-item label="身份证号码" prop="responderIdCode" style="flex: 1; margin-bottom: 0;">
<el-input <el-input
v-model="model.responderIdCode" v-model="formData.responderIdCode"
:placeholder="model.responderIdCodeSkip ? '无' : '请输入身份证号码'" :placeholder="formData.responderIdCodeSkip ? '无' : '请输入身份证号码'"
:disabled="model.responderIdCodeSkip" :disabled="formData.responderIdCodeSkip"
@blur="onAutoCheckDuplicate" @blur="onAutoCheckDuplicate"
> >
<template #append> <template #append>
<el-checkbox <el-checkbox
v-model="model.responderIdCodeSkip" v-model="formData.responderIdCodeSkip"
@change="(v) => v && (model.responderIdCode = '')" @change="(v) => v && (formData.responderIdCode = '')"
> >
</el-checkbox> </el-checkbox>
@ -159,15 +159,15 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="联系电话" prop="responderPhone"> <el-form-item label="联系电话" prop="responderPhone">
<el-input <el-input
v-model="model.responderPhone" v-model="formData.responderPhone"
:placeholder="model.responderPhoneSkip ? '无' : '请输入联系电话'" :placeholder="formData.responderPhoneSkip ? '无' : '请输入联系电话'"
:disabled="model.responderPhoneSkip" :disabled="formData.responderPhoneSkip"
@blur="onAutoCheckDuplicate" @blur="onAutoCheckDuplicate"
> >
<template #append> <template #append>
<el-checkbox <el-checkbox
v-model="model.responderPhoneSkip" v-model="formData.responderPhoneSkip"
@change="(v) => v && (model.responderPhone = '')" @change="(v) => v && (formData.responderPhone = '')"
> >
</el-checkbox> </el-checkbox>
@ -179,9 +179,9 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="被投诉二级机构" prop="secondDepartId" > <el-form-item label="被投诉二级机构" prop="secondDepartId" >
<depart-tree-select <depart-tree-select
v-model="model.secondDepartId" v-model="formData.secondDepartId"
:check-strictly="true" :check-strictly="true"
@node-click="(row) => (model.secondDepartName = row.shortName)" @node-click="(row) => (formData.secondDepartName = row.shortName)"
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -191,7 +191,7 @@
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="来件内容" prop="thingDesc"> <el-form-item label="来件内容" prop="thingDesc">
<el-input v-model="model.thingDesc" type="textarea" :autosize="{ minRows: 4 }" /> <el-input v-model="formData.thingDesc" type="textarea" :autosize="{ minRows: 4 }" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
@ -200,7 +200,7 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="涉嫌问题" prop="involveProblemIdList"> <el-form-item label="涉嫌问题" prop="involveProblemIdList">
<el-select v-model="model.involveProblemIdList" multiple clearable style="width: 100%"> <el-select v-model="formData.involveProblemIdList" multiple clearable style="width: 100%">
<el-option <el-option
v-for="item in dict.suspectProblem" v-for="item in dict.suspectProblem"
:key="item.dictValue" :key="item.dictValue"
@ -208,7 +208,7 @@
:label="item.dictLabel" :label="item.dictLabel"
> >
<!-- 复选框展示 --> <!-- 复选框展示 -->
<el-checkbox :model-value="(model.involveProblemIdList || []).includes(item.dictValue)"> <el-checkbox :model-value="(formData.involveProblemIdList || []).includes(item.dictValue)">
{{ item.dictLabel }} {{ item.dictLabel }}
</el-checkbox> </el-checkbox>
</el-option> </el-option>
@ -218,7 +218,7 @@
<el-col :span="12"> <el-col :span="12">
<el-form-item label="是否重复件" prop="repeatt"> <el-form-item label="是否重复件" prop="repeatt">
<el-radio-group v-model="model.repeatt" clearable> <el-radio-group v-model="formData.repeatt" clearable>
<el-radio v-for="item in dict.yesNo" :key="item.id" :label="item.dictValue"> <el-radio v-for="item in dict.yesNo" :key="item.id" :label="item.dictValue">
{{ item.dictLabel }} {{ item.dictLabel }}
</el-radio> </el-radio>
@ -231,7 +231,7 @@
<el-row> <el-row>
<el-col :span="18"> <el-col :span="18">
<el-form-item label="标签" prop="tags"> <el-form-item label="标签" prop="tags">
<el-checkbox-group v-model="model.tags"> <el-checkbox-group v-model="formData.tags">
<el-checkbox v-for="item in dict.sfssTags" :key="item.id" :label="item.dictValue"> <el-checkbox v-for="item in dict.sfssTags" :key="item.id" :label="item.dictValue">
{{ item.dictLabel }} {{ item.dictLabel }}
</el-checkbox> </el-checkbox>
@ -244,7 +244,7 @@
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="办理方式" prop="handleMethod"> <el-form-item label="办理方式" prop="handleMethod">
<el-radio-group v-model="model.handleMethod" clearable> <el-radio-group v-model="formData.handleMethod" clearable>
<el-radio v-for="item in dict.handleMethodType" :key="item.id" :label="item.dictValue"> <el-radio v-for="item in dict.handleMethodType" :key="item.id" :label="item.dictValue">
{{ item.dictLabel }} {{ item.dictLabel }}
</el-radio> </el-radio>
@ -255,7 +255,7 @@
<el-form-item v-if="mode === 'add'" label="附件" prop="thingFiles"> <el-form-item v-if="mode === 'add'" label="附件" prop="thingFiles">
<file-upload <file-upload
v-model:files="model.thingFiles" v-model:files="formData.thingFiles"
tips="为便于“办理单位”更全面了解问题详情,请上传相关附件,如现场督察、数字督察等相关照片、视频及其他佐证材料。" tips="为便于“办理单位”更全面了解问题详情,请上传相关附件,如现场督察、数字督察等相关照片、视频及其他佐证材料。"
/> />
</el-form-item> </el-form-item>
@ -266,24 +266,24 @@
<h2 v-if="mode === 'add'">办理单位</h2> <h2 v-if="mode === 'add'">办理单位</h2>
<div v-if="mode === 'add'" class="add-negation-container"> <div v-if="mode === 'add'" class="add-negation-container">
<el-form-item label="主办层级" prop="hostLevel" :rules="{ required: true, message: '请选择主办层级', trigger: ['blur'] }"> <el-form-item label="主办层级" prop="hostLevel" :rules="{ required: true, message: '请选择主办层级', trigger: ['blur'] }">
<el-select style="width: 280px" v-model="model.hostLevel" @change="handleChangeHostLevel"> <el-select style="width: 280px" v-model="formData.hostLevel" @change="handleChangeHostLevel">
<el-option v-for="item in dict.hostLevel" :key="item.id" :label="item.dictLabel" :value="item.dictValue" /> <el-option v-for="item in dict.hostLevel" :key="item.id" :label="item.dictLabel" :value="item.dictValue" />
</el-select> </el-select>
<div class="tips mt-10"> <div class="tips mt-10">
<p>如主办层级 市局主办 则由<span :data-active="model.hostLevel === HostLevel.FIRST">督察支队</span>办理</p> <p>如主办层级 市局主办 则由<span :data-active="formData.hostLevel === HostLevel.FIRST">督察支队</span>办理</p>
<p>如主办层级为 二级机构主办则由<span :data-active="model.hostLevel === HostLevel.SECOND">督察部门</span>办理可进一步下发</p> <p>如主办层级为 二级机构主办则由<span :data-active="formData.hostLevel === HostLevel.SECOND">督察部门</span>办理可进一步下发</p>
<p>如主办层级为 三级机构主办则由<span :data-active="model.hostLevel === HostLevel.THREE">所队</span>办理</p> <p>如主办层级为 三级机构主办则由<span :data-active="formData.hostLevel === HostLevel.THREE">所队</span>办理</p>
</div> </div>
</el-form-item> </el-form-item>
<el-form-item label="指定办理单位" prop="departId" :rules="{ required: true, message: '请选择办理单位', trigger: ['blur'] }"> <el-form-item label="指定办理单位" prop="departId" :rules="{ required: true, message: '请选择办理单位', trigger: ['blur'] }">
<div class="flex gap"> <div class="flex gap">
<div style="width: 280px"> <div style="width: 280px">
<template v-if="model.hostLevel === HostLevel.THREE"> <template v-if="formData.hostLevel === HostLevel.THREE">
<depart-tree-select v-model="model.departId" v-loading="departLoading" /> <depart-tree-select v-model="formData.departId" v-loading="departLoading" />
</template> </template>
<el-tree-select v-else :data="departs" :props="{ label: 'shortName', value: 'id' }" node-key="id" clearable filterable v-model="model.departId" @node-click="handleSelectDepart" check-strictly style="width: 280px" v-loading="departLoading" /> <el-tree-select v-else :data="departs" :props="{ label: 'shortName', value: 'id' }" node-key="id" clearable filterable v-model="formData.departId" @node-click="handleSelectDepart" check-strictly style="width: 280px" v-loading="departLoading" />
</div> </div>
<el-button type="primary" @click="handleLinkDepart" text v-if="model.hostLevel !== HostLevel.FIRST">关联问题涉及单位</el-button> <el-button type="primary" @click="handleLinkDepart" text v-if="formData.hostLevel !== HostLevel.FIRST">关联问题涉及单位</el-button>
</div> </div>
<div class="tips mt-10"> <div class="tips mt-10">
<p>问题涉及单位 指与该问题相关的单位</p> <p>问题涉及单位 指与该问题相关的单位</p>
@ -302,7 +302,7 @@
<h2 v-if="mode === 'add'">办理时限</h2> <h2 v-if="mode === 'add'">办理时限</h2>
<div v-if="mode === 'add'" class="add-negation-container"> <div v-if="mode === 'add'" class="add-negation-container">
<el-form-item label="办理时限" prop="timeLimit" :rules="{ required: true, message: '请选择办理时限', trigger: ['blur'] }"> <el-form-item label="办理时限" prop="timeLimit" :rules="{ required: true, message: '请选择办理时限', trigger: ['blur'] }">
<time-limit-select v-model="model.timeLimit" v-model:maxSignDuration="model.maxSignDuration" v-model:maxHandleDuration="model.maxHandleDuration" v-model:maxExtensionDuration="model.maxExtensionDuration" /> <time-limit-select v-model="formData.timeLimit" v-model:maxSignDuration="formData.maxSignDuration" v-model:maxHandleDuration="formData.maxHandleDuration" v-model:maxExtensionDuration="formData.maxExtensionDuration" />
</el-form-item> </el-form-item>
</div> </div>
@ -310,10 +310,10 @@
<h2 v-if="mode === 'add'">审批流程</h2> <h2 v-if="mode === 'add'">审批流程</h2>
<div v-if="mode === 'add'" class="add-negation-container"> <div v-if="mode === 'add'" class="add-negation-container">
<el-form-item label="审批流程" prop="approvalFlow" :rules="{ required: true, message: '请选择审批流程', trigger: ['blur'] }"> <el-form-item label="审批流程" prop="approvalFlow" :rules="{ required: true, message: '请选择审批流程', trigger: ['blur'] }">
<el-radio-group v-model="model.approvalFlow" v-if="userStore.user.roleCodes.includes('admin_1')"> <el-radio-group v-model="formData.approvalFlow" v-if="userStore.user.roleCodes.includes('admin_1')">
<el-radio v-for="item in dict.approvalFlow" :key="item.dictCode" :value="item.dictValue">{{ item.dictLabel }}{{ item.remark ? `(${item.remark})` : "" }}</el-radio> <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> </el-radio-group>
<el-radio-group v-model="model.approvalFlow" v-else> <el-radio-group v-model="formData.approvalFlow" v-else>
<el-radio value="2">二级审批(所队一>二级机构)</el-radio> <el-radio value="2">二级审批(所队一>二级机构)</el-radio>
</el-radio-group> </el-radio-group>
<div class="tips mt-10"> <div class="tips mt-10">
@ -339,20 +339,19 @@
v-model="duplicateDrawerVisible" v-model="duplicateDrawerVisible"
:dict="dict" :dict="dict"
:query="{ :query="{
responderIdCode: model.responderIdCode, responderIdCode: formData.responderIdCode,
responderName: model.responderName, responderName: formData.responderName,
responderPhone: model.responderPhone responderPhone: formData.responderPhone
}" }"
:requestFn="maileRepeatt" :requestFn="maileRepeatt"
detailIdKey="complaintId" detailIdKey="complaintId"
/> />
</template> </template>
<script setup> <script setup>
import {computed, ref, watch} from "vue"; import {computed, ref, watch} from "vue";
import {maileRepeatt, getComplaintCollectionDetail, updateComplaintCollection} from "@/api/data/complaintCollection.ts"; import {maileRepeatt, getComplaintCollectionDetail, updateComplaintCollection, addComplaintCollection} from "@/api/data/complaintCollection.ts";
import dayjs from "dayjs"; import dayjs from "dayjs";
import feedback from "@/utils/feedback.ts"; import feedback from "@/utils/feedback.ts";
import DuplicateDrawerWithDetail from "@/views/data/DuplicateDrawerWithDetail.vue"; import DuplicateDrawerWithDetail from "@/views/data/DuplicateDrawerWithDetail.vue";
@ -361,6 +360,71 @@ import {secondList, listByFirstHost} from "@/api/system/depart";
import useCatchStore from "@/stores/modules/catch"; import useCatchStore from "@/stores/modules/catch";
const catchStore = useCatchStore(); const catchStore = useCatchStore();
//
const formData = ref(createEmptyForm());
function createEmptyForm() {
return {
//
sourcePath: [],
sourceTable: '',
sourceTableSubOne: '',
//
originId: '',
originIdSkip: false,
//
discoveryTime: '',
//
responderName: '',
responderNameSkip: false,
responderIdCode: '',
responderIdCodeSkip: false,
responderPhone: '',
responderPhoneSkip: false,
//
secondDepartId: '',
secondDepartName: '',
//
thingDesc: '',
involveProblemIdList: [],
repeatt: '',
handleMethod: '',
//
tags: [],
businessTypeCode: '',
businessTypeName: '',
//
thingFiles: [],
//
hostLevel: '3',
departId: '',
departName: '',
timeLimit: '',
maxSignDuration: null,
maxHandleDuration: null,
maxExtensionDuration: null,
approvalFlow: '',
// id
id: '',
negativeId: '',
};
}
//
const rules = {
sourcePath: [
{required: true, message: "请选择来源(一级/二级)", trigger: "change"},
],
discoveryTime: [{required: true, message: '请选择受理时间', trigger: 'change'}],
secondDepartId: [{required: true, message: '请选择被投诉二级机构', trigger: 'change'}],
thingDesc: [{required: true, message: '请输入来件内容', trigger: 'blur'}],
involveProblemIdList: [{required: true, message: '请选择涉嫌问题', trigger: 'change'}],
repeatt: [{required: true, message: '请选择是否重复件', trigger: 'change'}],
hostLevel: [{required: true, message: '请选择主办层级', trigger: 'change'}],
departId: [{required: true, message: '请选择办理单位', trigger: 'change'}],
timeLimit: [{required: true, message: '请选择办理时限', trigger: 'change'}],
approvalFlow: [{required: true, message: '请选择审批流程', trigger: 'change'}],
};
// 1. computed storeDict // 1. computed storeDict
const storeDict = computed(() => const storeDict = computed(() =>
@ -427,14 +491,12 @@ const userStore = useUserStore();
const props = defineProps({ const props = defineProps({
modelValue: Boolean, modelValue: Boolean,
mode: { type: String, default: "add" }, mode: { type: String, default: "add" },
model: { type: Object, required: true },
rules: { type: Object, required: true },
id: { type: String, default: "" }, id: { type: String, default: "" },
loading: { type: Boolean, default: false },
negativeId: { type: String, default: "" }, negativeId: { type: String, default: "" },
loading: { type: Boolean, default: false },
}); });
const emit = defineEmits(["update:modelValue", "submit", "updateSuccess"]); const emit = defineEmits(["update:modelValue", "updateSuccess"]);
const formRef = ref(); const formRef = ref();
const submitLoading = ref(false); const submitLoading = ref(false);
@ -448,10 +510,8 @@ watch(
() => visibleProxy.value, () => visibleProxy.value,
async (v) => { async (v) => {
if (v) { if (v) {
props.model.originIdSkip = false //
props.model.responderNameSkip = false formData.value = createEmptyForm();
props.model.responderIdCodeSkip = false
props.model.responderPhoneSkip = false
duplicateDrawerVisible.value = false duplicateDrawerVisible.value = false
duplicateLoading.value = false duplicateLoading.value = false
@ -468,35 +528,34 @@ watch(
const res = await getComplaintCollectionDetail({ id: props.id, negativeId: props.negativeId }); const res = await getComplaintCollectionDetail({ id: props.id, negativeId: props.negativeId });
const r = res?.data ?? res ?? {}; const r = res?.data ?? res ?? {};
props.model.id = r.id ?? ''; formData.value.id = r.id ?? '';
props.model.sourceTable = r.sourceTable ?? ''; formData.value.sourceTable = r.sourceTable ?? '';
props.model.sourceTableSubOne = r.sourceTableSubOne ?? ''; formData.value.sourceTableSubOne = r.sourceTableSubOne ?? '';
props.model.sourcePath = [r.sourceTable, r.sourceTableSubOne].filter(Boolean); formData.value.sourcePath = [r.sourceTable, r.sourceTableSubOne].filter(Boolean);
props.model.originId = r.originId ?? ''; formData.value.originId = r.originId ?? '';
props.model.discoveryTime = r.discoveryTime ?? ''; formData.value.discoveryTime = r.discoveryTime ?? '';
props.model.responderName = r.responderName ?? ''; formData.value.responderName = r.responderName ?? '';
props.model.responderIdCode = r.responderIdCode ?? ''; formData.value.responderIdCode = r.responderIdCode ?? '';
props.model.responderPhone = r.responderPhone ?? ''; formData.value.responderPhone = r.responderPhone ?? '';
props.model.secondDepartId = r.secondDepartId ?? ''; formData.value.secondDepartId = r.secondDepartId ?? '';
props.model.secondDepartName = r.secondDepartName ?? ''; formData.value.secondDepartName = r.secondDepartName ?? '';
props.model.thingDesc = r.thingDesc ?? ''; formData.value.thingDesc = r.thingDesc ?? '';
props.model.repeatt = r.repeatt ?? ''; formData.value.repeatt = r.repeatt ?? '';
props.model.leadApproval = r.leadApproval ?? ''; formData.value.handleMethod = r.handleMethod ?? '';
props.model.handleMethod = r.handleMethod ?? ''; formData.value.involveProblemIdList = splitToArray(r.involveProblemIdList ?? r.involveProblem);
props.model.involveProblemIdList = splitToArray(r.involveProblemIdList ?? r.involveProblem); formData.value.tags = splitToArray(r.tags ?? r.tag);
props.model.tags = splitToArray(r.tags ?? r.tag); formData.value.businessTypeName = r.businessTypeName ?? '';
props.model.businessTypeName = r.businessTypeName ?? ''; formData.value.businessTypeCode = r.businessTypeCode ?? '';
props.model.businessTypeCode = r.businessTypeCode ?? ''; formData.value.thingFiles = normalizeThingFiles(r.thingFiles);
props.model.thingFiles = normalizeThingFiles(r.thingFiles); formData.value.hostLevel = r.hostLevel ?? '3';
props.model.hostLevel = r.hostLevel ?? '3'; formData.value.departId = r.departId ?? '';
props.model.departId = r.departId ?? ''; formData.value.departName = r.departName ?? '';
props.model.departName = r.departName ?? ''; formData.value.timeLimit = r.timeLimit ?? '';
props.model.timeLimit = r.timeLimit ?? ''; formData.value.maxSignDuration = r.maxSignDuration ?? null;
props.model.maxSignDuration = r.maxSignDuration ?? null; formData.value.maxHandleDuration = r.maxHandleDuration ?? null;
props.model.maxHandleDuration = r.maxHandleDuration ?? null; formData.value.maxExtensionDuration = r.maxExtensionDuration ?? null;
props.model.maxExtensionDuration = r.maxExtensionDuration ?? null; formData.value.approvalFlow = r.approvalFlow ?? '';
props.model.approvalFlow = r.approvalFlow ?? ''; formData.value.negativeId = r.negativeId ?? '';
props.model.negativeId = r.negativeId ?? '';
} catch (e) { } catch (e) {
console.error("获取详情失败", e); console.error("获取详情失败", e);
feedback.notifyError("获取数据失败,请重试"); feedback.notifyError("获取数据失败,请重试");
@ -508,7 +567,7 @@ watch(
); );
watch( watch(
() => props.model.hostLevel, () => formData.value.hostLevel,
() => { () => {
getDeparts(); getDeparts();
} }
@ -517,12 +576,12 @@ watch(
const departs = ref([]); const departs = ref([]);
const departLoading = ref(false); const departLoading = ref(false);
async function getDeparts() { async function getDeparts() {
if (!props.model.hostLevel) return; if (!formData.value.hostLevel) return;
departLoading.value = true; departLoading.value = true;
try { try {
if (props.model.hostLevel === HostLevel.FIRST) { if (formData.value.hostLevel === HostLevel.FIRST) {
departs.value = await listByFirstHost(); departs.value = await listByFirstHost();
} else if (props.model.hostLevel === HostLevel.SECOND) { } else if (formData.value.hostLevel === HostLevel.SECOND) {
departs.value = await secondList(); departs.value = await secondList();
} else { } else {
departs.value = []; departs.value = [];
@ -535,44 +594,44 @@ async function getDeparts() {
} }
function handleSelectDepart(row) { function handleSelectDepart(row) {
props.model.departName = row.shortName; formData.value.departName = row.shortName;
} }
function handleLinkDepart() { function handleLinkDepart() {
if (props.model.hostLevel === HostLevel.SECOND) { if (formData.value.hostLevel === HostLevel.SECOND) {
feedback.msgWarning("当前选择二级机构主办,指定办理单位请选择二级机构!"); feedback.msgWarning("当前选择二级机构主办,指定办理单位请选择二级机构!");
return; return;
} }
props.model.departId = props.model.secondDepartId; formData.value.departId = formData.value.secondDepartId;
props.model.departName = props.model.secondDepartName; formData.value.departName = formData.value.secondDepartName;
} }
function handleChangeHostLevel(val) { function handleChangeHostLevel(val) {
if (val === HostLevel.FIRST) { if (val === HostLevel.FIRST) {
props.model.departId = ""; formData.value.departId = "";
} }
if (val === HostLevel.SECOND) { if (val === HostLevel.SECOND) {
props.model.approvalFlow = "3"; formData.value.approvalFlow = "3";
} }
} }
watch( watch(
() => props.model.sourcePath, () => formData.value.sourcePath,
(path) => { (path) => {
if (!path || path.length === 0) return; if (!path || path.length === 0) return;
props.model.sourceTable = (path && path[0]) || ""; formData.value.sourceTable = (path && path[0]) || "";
props.model.sourceTableSubOne = (path && path[1]) || ""; formData.value.sourceTableSubOne = (path && path[1]) || "";
}, },
{ deep: true } { deep: true }
); );
function fillFiledName() { function fillFiledName() {
const code = props.model.businessTypeCode; const code = formData.value.businessTypeCode;
const hit = dict.value?.businessType?.find( // const hit = dict.value?.businessType?.find(
(d) => String(d.dictValue) === String(code) (d) => String(d.dictValue) === String(code)
); );
props.model.businessTypeName = hit?.dictLabel || ""; formData.value.businessTypeName = hit?.dictLabel || "";
} }
function splitToArray(val) { function splitToArray(val) {
@ -606,41 +665,26 @@ function normalizeThingFiles(val) {
async function onSubmit() { async function onSubmit() {
fillFiledName(); fillFiledName();
// emit // API
if (props.mode === 'add') { if (props.mode === 'add') {
emit("submit"); submitLoading.value = true;
try {
await addComplaintCollection({...formData.value});
feedback.msgSuccess("添加成功");
visibleProxy.value = false;
emit("updateSuccess");
} catch (e) {
console.error("添加失败", e);
} finally {
submitLoading.value = false;
}
return; return;
} }
// API // API
submitLoading.value = true; submitLoading.value = true;
try { try {
const body = { await updateComplaintCollection({...formData.value});
id: props.model.id,
sourceTable: props.model.sourceTable,
sourceTableSubOne: props.model.sourceTableSubOne,
originId: props.model.originId,
originIdSkip: props.model.originIdSkip,
discoveryTime: props.model.discoveryTime,
responderName: props.model.responderName,
responderNameSkip: props.model.responderNameSkip,
responderIdCode: props.model.responderIdCode,
responderIdCodeSkip: props.model.responderIdCodeSkip,
responderPhone: props.model.responderPhone,
responderPhoneSkip: props.model.responderPhoneSkip,
secondDepartId: props.model.secondDepartId,
secondDepartName: props.model.secondDepartName,
thingDesc: props.model.thingDesc,
repeatt: props.model.repeatt,
handleMethod: props.model.handleMethod,
involveProblemIdList: props.model.involveProblemIdList || [],
tags: props.model.tags || [],
businessTypeCode: props.model.businessTypeCode,
businessTypeName: props.model.businessTypeName,
negativeId: props.model.negativeId
};
await updateComplaintCollection(body);
feedback.msgSuccess("修改成功"); feedback.msgSuccess("修改成功");
visibleProxy.value = false; visibleProxy.value = false;
emit("updateSuccess"); emit("updateSuccess");
@ -667,9 +711,9 @@ const duplicateHintVisible = ref(false)
const fetchDuplicate = async () => { const fetchDuplicate = async () => {
const body = { const body = {
responderIdCode: props.model.responderIdCode, responderIdCode: formData.value.responderIdCode,
responderName: props.model.responderName, responderName: formData.value.responderName,
responderPhone: props.model.responderPhone, responderPhone: formData.value.responderPhone,
} }
const res = await maileRepeatt(body) const res = await maileRepeatt(body)
@ -677,7 +721,7 @@ const fetchDuplicate = async () => {
} }
const onAutoCheckDuplicate = async () => { const onAutoCheckDuplicate = async () => {
const { responderIdCode, responderName, responderPhone } = props.model const { responderIdCode, responderName, responderPhone } = formData.value
if (!responderIdCode && !responderName && !responderPhone) { if (!responderIdCode && !responderName && !responderPhone) {
duplicateCount.value = 0 duplicateCount.value = 0

194
src/views/data/ComplaintCollection.vue

@ -77,13 +77,18 @@
<el-col :span="6"> <el-col :span="6">
<el-form-item label="办理状态"> <el-form-item label="办理状态">
<el-select <el-select
v-model="query.status" v-model="query.processingStatus"
clearable clearable
multiple
collapse-tags
placeholder="办理状态" placeholder="办理状态"
> >
<el-option value="0" label="未办结"/> <el-option
<el-option value="1" label="已办结"/> v-for="item in dict.processingStatus"
<el-option value="2" label="强制终结"/> :key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
@ -182,6 +187,7 @@
/> />
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- 局长信箱专属搜索框 - 注释 by Claude
<el-col :span="6" <el-col :span="6"
v-if=" query.sourceTableList?.length === 1 && String(query.sourceTableList[0]) === '23'"> v-if=" query.sourceTableList?.length === 1 && String(query.sourceTableList[0]) === '23'">
<el-form-item label="信件状态"> <el-form-item label="信件状态">
@ -198,6 +204,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
-->
</el-row> </el-row>
</el-form> </el-form>
<div class="mb-25 flex between"> <div class="mb-25 flex between">
@ -329,32 +336,31 @@
<el-table-column label="业务类别Code" width="100" prop="businessTypeCode" v-if="false"/> <el-table-column label="业务类别Code" width="100" prop="businessTypeCode" v-if="false"/>
<el-table-column label="核查结论" width="140" prop="checkStatus" show-overflow-tooltip> <el-table-column label="核查结论" width="140" prop="checkStatus" show-overflow-tooltip>
<template #default="{ row }"> <template #default="{ row }">
{{ getDictLabel(dict.checkStatus, row.checkStatus) }} {{ getDictLabel(dict.checkStatus, row.checkStatusCode) }}
</template>
</el-table-column>
<el-table-column label="状态" prop="status" width="100">
<template #default="{ row }">
<span :style="row.status === '0' ? 'color: red' : ''">
{{
row.status === '0' ? '未办结' :
row.status === '1' ? '已办结' :
row.status === '2' ? '强制终结' :
'-'
}}
</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="信件状态(局)" width="120" prop="processingStatus"> <el-table-column label="办理状态" prop="processingStatus" width="100">
<template #default="{ row }"> <template #default="{ row }">
{{ <el-tag
row.processingStatus === 'completion' ? '已办结' : :type="row.processingStatus === 'completed' ? 'success' : 'primary'"
row.processingStatus === 'processing' ? '办理中' : v-if="row.processingStatus"
row.processingStatus === 'delayed' ? '已延期' : >
row.processingStatus === 'terminated' ? '已终止' : {{ getDictLabel(dict.processingStatus, row.processingStatus) }}
'/' </el-tag>
}} <span v-else>-</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column label="信件状态(局)" width="120" prop="processingStatus">-->
<!-- <template #default="{ row }">-->
<!-- <el-tag-->
<!-- :type="row.processingStatus === 'completed' ? 'success' : 'primary'"-->
<!-- v-if="row.processingStatus"-->
<!-- >-->
<!-- {{ getDictLabel(dict.processingStatus, row.processingStatus) }}-->
<!-- </el-tag>-->
<!-- <span v-else>/</span>-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="操作" width="240" fixed="right"> <el-table-column label="操作" width="240" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<!-- <el-button type="primary" v-if="row.status === '0'" link @click="handleAction(row)">办理</el-button>--> <!-- <el-button type="primary" v-if="row.status === '0'" link @click="handleAction(row)">办理</el-button>-->
@ -364,8 +370,8 @@
@click="handleActionDetail(row)" @click="handleActionDetail(row)"
>办理详情</el-button >办理详情</el-button
> >
<el-button type="primary" v-if="row.status === '0'" link @click="handleUpdate(row)">修改</el-button> <el-button type="primary" v-if="row.processingStatus !== 'completed'" link @click="handleUpdate(row)">修改</el-button>
<el-button type="danger" v-if="row.status === '0'" link @click="handleDel(row)">删除</el-button> <el-button type="danger" v-if="row.processingStatus !== 'completed'" link @click="handleDel(row)">删除</el-button>
<!-- <el-button type="primary" v-if="row.status === '1' || row.status === '2'" link @click="handleWatchDetail(row)">查看详情</el-button>--> <!-- <el-button type="primary" v-if="row.status === '1' || row.status === '2'" link @click="handleWatchDetail(row)">查看详情</el-button>-->
</template> </template>
</el-table-column> </el-table-column>
@ -390,21 +396,17 @@
<data-complaintformdialog <data-complaintformdialog
v-model="addShow" v-model="addShow"
mode="add" mode="add"
:model="addForm" @updateSuccess="getList"
:rules="addRules"
:loading="submitting"
@submit="submitAdd"
/> />
<!-- 修改 --> <!-- 修改 -->
<data-complaintformdialog <data-complaintformdialog
v-model="updateShow" v-model="updateShow"
mode="edit" mode="edit"
:model="updateForm"
:rules="addRules"
:id="updateId" :id="updateId"
:negativeId="activeNegativeId"
:loading="updateLoading" :loading="updateLoading"
@submit="submitUpdate" @updateSuccess="getList"
/> />
<!-- 查看详情 --> <!-- 查看详情 -->
@ -520,135 +522,32 @@ onMounted(() => {
// endregion // endregion
// region // region
const addShow = ref(false);
const add = () => {
addShow.value = true;
};
// //
function hasPermission() { function hasPermission() {
console.log("=================userStore===================")
console.log(userStore.user)
const roles = userStore.user?.roleCodes || [] const roles = userStore.user?.roleCodes || []
const allow = new Set(['admin_1', 'admin_1_12337']) const allow = new Set(['admin_1', 'admin_1_12337'])
return roles.some(r => allow.has(r)) return roles.some(r => allow.has(r))
} }
const canAdd = computed(() => hasPermission()) const canAdd = computed(() => hasPermission())
const createEmptyAddForm = () => ({
//
sourcePath: [],
// watch
sourceTable: '',
sourceTableSubOne: '',
originId: '',
discoveryTime: '',
responderName: '',
responderIdCode: '',
responderPhone: '',
secondDepartId: '',
secondDepartName: '',
thingDesc: '',
involveProblemIdList: [],
repeatt: '',
leadApproval: '',
tags: [],
handleMethod: '',
thingFiles: [],
//
hostLevel: '3',
departId: '',
departName: '',
//
timeLimit: '',
maxSignDuration: null,
maxHandleDuration: null,
maxExtensionDuration: null,
//
approvalFlow: '',
});
const addShow = ref(false);
const submitting = ref(false); //
const addForm = ref(createEmptyAddForm());
//
const add = async () => {
addForm.value = createEmptyAddForm()
addShow.value = true
}
//
const submitAdd = async () => {
if (submitting.value) return //
submitting.value = true
try {
const body = {...addForm.value}
let res = await addComplaintCollection(body);
if (res === true) {
feedback.msgSuccess("操作成功");
} else {
feedback.notifyError("操作失败");
}
addShow.value = false;
addForm.value = createEmptyAddForm();
} catch (e) {
console.error(e);
feedback.notifyError("操作失败");
} finally {
submitting.value = false
getList()
}
}
//
const addRules = {
sourcePath: [
{required: true, message: "请选择来源(一级/二级)", trigger: "change"},
],
discoveryTime: [{required: true, message: '请选择受理时间', trigger: 'change'}],
secondDepartId: [{required: true, message: '请选择被投诉二级机构', trigger: 'change'}],
thingDesc: [{required: true, message: '请输入来件内容', trigger: 'blur'}],
involveProblemIdList: [{required: true, message: '请选择涉嫌问题', trigger: 'change'}],
repeatt: [{required: true, message: '请选择是否重复件', trigger: 'change'}],
hostLevel: [{required: true, message: '请选择主办层级', trigger: 'change'}],
departId: [{required: true, message: '请选择办理单位', trigger: 'change'}],
timeLimit: [{required: true, message: '请选择办理时限', trigger: 'change'}],
approvalFlow: [{required: true, message: '请选择审批流程', trigger: 'change'}],
}
watch(
() => addForm.value.sourcePath,
(path) => {
addForm.value.sourceTable = path?.[0] ?? "";
addForm.value.sourceTableSubOne = path?.[1] ?? "";
},
{deep: true}
);
// endregion // endregion
// region // region
const updateShow = ref(false); const updateShow = ref(false);
const updateId = ref(""); const updateId = ref("");
const updateLoading = ref(false); const updateLoading = ref(false);
const updateForm = ref({
id: "",
});
// //
const handleUpdate = (row) => { const handleUpdate = (row) => {
debugger updateId.value = row.id || '';
updateId.value = row.id; activeNegativeId.value = row.negativeId || '';
updateShow.value = true; updateShow.value = true;
} }
const submitUpdate = async () => {
const body = {
...updateForm.value,
}
let res = await updateComplaintCollection(body)
if (res === true) {
feedback.msgSuccess("操作成功");
updateShow.value = false
getList()
}
}
// endregion // endregion
@ -678,7 +577,10 @@ const storeDict = computed(() =>
"checkStatus", "checkStatus",
"sfssSourceTable", "sfssSourceTable",
"sfssTags", "sfssTags",
"accountabilityTarget" "accountabilityTarget",
"processingStatus",
"handleMethodType",
"yesNo"
]) || {} ]) || {}
); );

Loading…
Cancel
Save