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

2045 lines
72 KiB

<template>
<!-- 新增问题信息展示 -->
<div class="info-container">
<h3>问题信息</h3>
<div class="row">
<div class="col col-12" v-if="false">
<label>id</label>
<span>{{ currentRow.id || '/' }}</span>
</div>
<div class="col col-12">
<label>来源</label>
<span>{{ currentRow.sourceTablePath }}</span>
</div>
<div class="col col-12">
<label>业务类型</label>
<span>{{ getDictLabel(dict.businessType, currentRow.businessTypeCode) }}</span>
</div>
<div class="col col-12">
<label>编号</label>
<span>{{ currentRow.originId || '/' }}</span>
</div>
<div class="col col-12">
<label>受理时间</label>
<span>{{ formatLocalDateTime(currentRow.discoveryTime) }}</span>
</div>
<div class="col col-12">
<label>来件人姓名</label>
<span>{{ currentRow.responderName || '/' }}</span>
</div>
<div class="col col-12">
<label>身份证号码</label>
<span>{{ currentRow.responderIdCode || '/' }}</span>
</div>
<div class="col col-12">
<label>联系电话</label>
<span>{{ currentRow.responderPhone || '/' }}</span>
</div>
<div class="col col-12">
<label>涉及二级机构</label>
<span>{{ currentRow.secondDepartName || '/' }}</span>
</div>
<div class="col col-24">
<label>来件内容</label>
<span>{{ currentRow.thingDesc || '/' }}</span>
</div>
<div class="col col-12">
<label>涉嫌问题</label>
<span>{{ currentRow.involveProblemStr || '/' }}</span>
</div>
<div class="col col-12">
<label>是否重复件</label>
<span>{{ getDictLabel(dict.yesNo, currentRow.repeatt) }}</span>
</div>
<div class="col col-12">
<label>标签</label>
<span>
{{
currentRow.tag
? currentRow.tag
.split(',')
.map(v => getDictLabel(dict.sfssTags, v))
.join(',')
: '/'
}}
</span>
</div>
<div class="col col-24">
<label>办理方式</label>
<span>{{ getDictLabel(dict.handleMethodType, currentRow.handleMethod) }}</span>
</div>
</div>
<div v-if="currentRow.reportFile?.length">
<div class="text-primary mt-10 mb-10">督察报告附件</div>
<file-list :files="currentRow.reportFile"/>
</div>
<div v-if="currentRow.thingFiles?.length">
<div class="text-primary mt-10 mb-10">附件</div>
<file-list :files="currentRow.thingFiles"/>
</div>
</div>
<h5>核查办理</h5>
<el-form :label-width="146" :model="form" ref="formRef">
<el-row>
<el-col :span="12">
<el-form-item label="涉及案件/警情编号" prop="caseNumber">
<el-input
v-model="form.caseNumber"
placeholder="请输入"
style="width: 280px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="涉及举报对象"
prop="accountabilityTarget"
:rules="{
required: true,
message: '请选择追责对象',
trigger: ['blur'],
}"
>
<el-radio-group v-model="form.accountabilityTarget">
<el-radio
v-for="item in dict.accountabilityTarget"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="核查结论"
prop="checkStatusCode"
:rules="{
required: true,
message: '请选择核查结论',
trigger: ['blur'],
}"
>
<el-select v-model="form.checkStatusCode" @change="handleChangeCheckStatus" clearable
style="width: 280px">
<el-option v-for="item in dict.checkStatus" :value="item.dictValue" :label="item.dictLabel"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="涉及单位"
prop="involveDepartId"
:rules="{
required: true,
message: '请选择涉及单位',
trigger: ['blur'],
}"
>
<div style="width: 280px">
<depart-tree-select
v-model="form.involveDepartId"
@node-click="(row) => (form.involveDepartName = row.shortName)"
:auth="false"
/>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="办结情况"
prop="completionStatus"
:rules="[{ required: true, message: '请选择办结情况', trigger: 'change' }]"
>
<el-radio-group v-model="form.completionStatus">
<el-radio :label="'1'">程序办结</el-radio>
<el-radio :label="'2'">已解决合理诉求</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="群众认可"
prop="publicRecognition"
:rules="[{ required: true, message: '请选择群众认可情况', trigger: 'change' }]"
>
<el-radio-group v-model="form.publicRecognition">
<el-radio :label="'1'">认可</el-radio>
<el-radio :label="'2'">不认可</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<!-- <el-col :span="12" v-if="problemIsTrue">-->
<!-- <el-form-item-->
<!-- label="是否整改"-->
<!-- prop="isRectifyCode"-->
<!-- :rules="{-->
<!-- required: true,-->
<!-- message: '请选择是否整改',-->
<!-- trigger: ['blur'],-->
<!-- }"-->
<!-- >-->
<!-- <el-radio-group-->
<!-- v-model="form.isRectifyCode"-->
<!-- @change="-->
<!-- (val) =>-->
<!-- (form.isRectifyName = dict.isRectify.filter(-->
<!-- (item) => item.dictValue === val-->
<!-- )[0].dictLabel)-->
<!-- "-->
<!-- >-->
<!-- <el-radio-->
<!-- v-for="item in dict.isRectify"-->
<!-- :key="item.dictCode"-->
<!-- :value="item.dictValue"-->
<!-- >{{ item.dictLabel }}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col-->
<!-- :span="12"-->
<!-- v-if="-->
<!-- problemIsTrue &&-->
<!-- form.isRectifyCode === IsRectify.NOT &&-->
<!-- (form.checkStatusCode === '1' || form.checkStatusCode === '2' || form.checkStatusCode === '3')-->
<!-- "-->
<!-- >-->
<!-- <el-form-item-->
<!-- label="整改限制"-->
<!-- prop="rectifyRestrictionDays"-->
<!-- :rules="{-->
<!-- required: true,-->
<!-- message: '请选择整改限制',-->
<!-- trigger: ['blur'],-->
<!-- }"-->
<!-- >-->
<!-- <el-input-number v-model="form.rectifyRestrictionDays"/>-->
<!-- <span class="ml-8">天</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
</el-row>
<el-form-item
label="问题核查情况"
prop="checkStatusDesc"
:rules="{
required: true,
message: '请输入问题核查情况',
trigger: ['blur'],
}"
>
<el-input
type="textarea"
placeholder="请输入问题核查情况"
v-model="form.checkStatusDesc"
:autosize="{ minRows: 4 }"
/>
</el-form-item>
<template
v-if="
negative.problemSourcesCode === ProblemSources.GJXFPT ||
negative.problemSourcesCode === ProblemSources.GABXF ||
negative.problemSourcesCode === ProblemSources.JZXX ||
negative.problemSourcesCode === ProblemSources.XF12337
"
>
<h5>信访办理</h5>
<template v-if="negative.problemSourcesCode === ProblemSources.XF12337">
<el-form-item
prop="verifiedIsLeader"
:rules="{
required: true,
message: '请选择涉及人员是否属于领导班子成员',
trigger: ['blur'],
}"
>
<template #label>
<div style="line-height: 1">涉及人员是否属于领导班子成员</div>
</template>
<el-select
v-model="form.verifiedIsLeader"
clearable
style="width: 280px"
>
<el-option value="非领导班子成员">非领导班子成员</el-option>
<el-option value="县级单位班子成员">县级单位班子成员</el-option>
<el-option value="市级单位班子成员">市级单位班子成员</el-option>
<el-option value="省级单位班子成员">省级单位班子成员</el-option>
<el-option value="中央单位班子成员">中央单位班子成员</el-option>
</el-select>
</el-form-item>
<el-form-item
prop="processResult"
label="办理结果"
:rules="{
required: true,
message: '请选择办理结果',
trigger: ['blur'],
}"
>
<el-select
v-model="form.processResult"
clearable
style="width: 280px"
>
<el-option value="具有违纪违法情况">具有违纪违法情况</el-option>
<el-option value="无违纪违法情况">无违纪违法情况</el-option>
<el-option value="其他">其他</el-option>
</el-select>
</el-form-item>
<el-form-item
label="处理结论结果"
prop="handleResult12337"
:rules="{
required: true,
message: '请选择12337处理结论结果',
trigger: ['blur'],
}"
v-if="form.processResult === '具有违纪违法情况'"
>
<handle-result12337-select
v-model="form.handleResult12337"
style="width: 280px"
@select="handleResult12337"
/>
<span class="ml-20">{{ form.handleResult12337Group }}</span>
</el-form-item>
<el-form-item label="处分处理情况" prop="disciplinaryActionDesc" :rules="{
required: true,
message: '请输入处分处理情况',
trigger: ['blur']
}"
v-if="form.processResult === '具有违纪违法情况' && form.handleResult12337 !== '免予处分' && form.handleResult12337 !== '不予处分'">
<el-input
type="textarea"
placeholder="请输入处分处理情况"
v-model="form.disciplinaryActionDesc"
:autosize="{ minRows: 4 }"
/>
</el-form-item>
</template>
<el-form-item
prop="handlePolices"
label="经办人"
:rules="{
required: true,
validator: validateHandlePolices,
}"
>
<div
class="mb-8 flex gap v-center"
v-for="(item, index) in form.handlePolices"
:key="index"
style="width: 100%"
>
<police-select
:depart-id="negative.handleSecondDepartId"
v-model="item.empNo"
@change="
(police) => {
item.name = police.name;
item.idCode = police.idCode;
item.mobile = police.mobile;
}
"
/>
<span class="ml-20 text-right" style="width: 80px">联系电话:</span>
<el-input
placeholder="联系方式"
v-model="item.mobile"
style="width: 240px"
/>
<el-button
plain
type="primary"
v-if="index === 0"
@click="form.handlePolices.push({})"
>
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加经办人
</el-button>
<el-button
plain
type="danger"
v-else
@click="form.handlePolices.splice(index, 1)"
>
<template #icon>
<icon name="el-icon-Delete"/>
</template>
删除经办人
</el-button>
</div>
</el-form-item>
<el-form-item>
<p class="tips" style="font-size: 13px; color: #666">经办人不能是涉及人员</p>
</el-form-item>
<el-form-item
prop="visitingLeaderName"
label="接访领导"
:rules="{
required: true,
message: '请选择接访领导',
trigger: ['blur'],
}"
v-if="
negative.problemSourcesCode === ProblemSources.GJXFPT ||
negative.problemSourcesCode === ProblemSources.GABXF
"
>
<div class="flex gap" style="width: 100%">
<police-select
:host-level="negative.hostLevel"
:depart-id="
negative.hostLevel === HostLevel.SECOND
? negative.handleSecondDepartId
: negative.handleThreeDepartId
"
v-model="form.visitingLeaderEmpNo"
@change="(police) => (form.visitingLeaderName = police.name)"
:isLeader="true"
/>
<span class="ml-20 text-right" style="width: 80px">警号:</span>
<el-input
v-model="form.visitingLeaderEmpNo"
placeholder="接访领导警号"
style="width: 240px"
/>
</div>
</el-form-item>
<el-form-item
label="化解情况"
prop="resolveSituation"
v-if="
negative.problemSourcesCode === ProblemSources.GJXFPT ||
negative.problemSourcesCode === ProblemSources.GABXF
"
:rules="{
required: true,
message: '请选择信访化解情况',
trigger: ['blur'],
}"
>
<el-select
v-model="form.resolveSituation"
clearable
style="width: 240px"
placeholder="请选择信访化解情况"
>
<el-option
v-for="item in dict.resolveSituation"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-form-item
prop="resolveStatus"
label="当前状态"
:rules="{
required: true,
message: '请选择信访当前状态',
trigger: ['blur'],
}"
v-if="
negative.problemSourcesCode === ProblemSources.GJXFPT ||
negative.problemSourcesCode === ProblemSources.GABXF
"
>
<el-select
v-model="form.resolveStatus"
clearable
style="width: 240px"
placeholder="请选择信访化当前状态"
>
<el-option
v-for="item in dict.resolveStatus"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
<el-divider/>
</template>
<div v-if="form.accountabilityTarget !== AccountabilityTarget.DEPARTMENT">
<el-form-item
label-position="top"
prop="blames"
:rules="{
required: true,
message: '请添加涉及人员',
trigger: ['change'],
}"
>
<div
v-for="(item, index) in form.blames.filter(
(obj) => obj.type === BlameType.PERSONAL
)"
:key="index"
>
<div class="flex v-center">
<h5>
涉及人员{{
form.blames
.filter(
(blame) => blame.type === BlameType.PERSONAL
)
.indexOf(item) + 1
}}
</h5>
<el-button
type="danger"
plain
size="small"
@click="handleRemoveBlame(item)"
text
class="ml-10"
>删除
</el-button>
</div>
<el-row>
<el-col :span="12">
<el-form-item
label="涉及人员姓名"
:prop="`blames.${index}.blameEmpNo`"
:rules="{
required: true,
message: '请选择涉及人员',
trigger: ['blur'],
}"
>
<police-select
:host-level="negative.hostLevel"
:depart-id="form.involveDepartId"
v-model="item.blameEmpNo"
:disabldKeys="
form.blames
.filter((obj) => obj.blameEmpNo)
.map((obj) => obj.blameEmpNo)
"
@change="
(police) => handleChangePolice(police, item)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="警号"
:prop="`blames.${index}.blameEmpNo`"
:rules="{
required: true,
message: '请输入警号',
trigger: ['blur'],
}"
>
<el-input
:disabled="true"
placeholder="请输入警号"
v-model="item.blameEmpNo"
style="width: 240px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="身份证号码"
:prop="`blames.${index}.blameIdCode`"
:rules="{
required: true,
message: '请输入身份证号码',
trigger: ['blur'],
}"
>
<el-input
placeholder="请输入身份证号码"
v-model="item.blameIdCode"
:disabled="true"
style="width: 240px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="人员属性"
:prop="`blames.${index}.ivPersonTypeCode`"
:rules="{
required: true,
message: '请选择人员属性',
trigger: ['blur'],
}"
>
<el-radio-group
:disabled="true"
v-model="item.ivPersonTypeCode"
@change="
(val) =>
(item.ivPersonType = dict.personType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-radio
v-for="item in dict.personType"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item
:prop="`blames.${index}.problems`"
:rules="{
required: true,
message: '请添加问题类型',
trigger: ['blur'],
}"
v-if="problemIsTrue"
style="margin-bottom: 0"
>
<div
v-for="(problem, j) in item.problems"
:key="j"
style="width: 98%"
>
<el-form-item
:label="`查实问题类型${j + 1}`"
:prop="`blames.${index}.problems.${j}.threeLevelCode`"
:rules="{
required: true,
message: '请选择问题类型',
trigger: ['blur'],
}"
>
<div class="flex between" style="width: 100%">
<div class="flex gap">
<problem-type-select
v-model="problem.threeLevelCode"
@change="
(node) =>
handleChangeProblem(node, problem)
"
/>
<div style="width: 140px">
<el-form-item
label-position="top"
:prop="`blames.${index}.problems.${j}.threeLevelContentOther`"
:rules="{
required: true,
message: '请输入',
trigger: ['blur'],
}"
style="margin-bottom: 0"
v-if="
problem.threeLevelContent ===
'其他'
"
>
<el-input
placeholder="其他类型详细描述"
v-model="
problem.threeLevelContentOther
"
/>
</el-form-item>
</div>
<div>
<span>{{
problem.oneLevelContent
? problem.oneLevelContent + " / "
: ""
}}</span>
<span>{{
problem.twoLevelContent
? problem.twoLevelContent + " / "
: ""
}}</span>
<span>{{
problem.threeLevelContent
}}</span>
</div>
</div>
<div class="flex center v-center">
<el-button
type="danger"
plain
@click="item.problems.splice(j, 1)"
v-if="j !== 0"
size="small"
>
<template #icon>
<icon name="el-icon-Delete"/>
</template>
删除问题
</el-button>
<el-button
@click="handleAddProblem(item)"
plain
type="primary"
v-if="j === 0"
size="small"
>
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加问题
</el-button>
</div>
</div>
</el-form-item>
</div>
<div
class="flex center"
style="width: 100%"
v-if="!item.problems || item.problems.length === 0"
>
<el-button
@click="handleAddProblem(item)"
plain
type="primary"
size="small"
>
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加问题
</el-button>
</div>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item
label="责任归属"
:prop="`blames.${index}.responsibilityTypeCode`"
:rules="{
required: true,
message: '请选择责任归属',
trigger: ['blur'],
}"
v-if="problemIsTrue"
>
<el-radio-group
v-model="item.responsibilityTypeCode"
@change="
(val) =>
(item.responsibilityTypeName = dict.responsibilityType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-radio
v-for="item in dict.responsibilityType"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="problemIsTrue">
<el-form-item
label="主观方面"
:prop="`blames.${index}.subjectiveAspectCode`"
:rules="{
required: true,
message: '请选择主观方面',
trigger: ['blur'],
}"
>
<div class="flex gap v-center">
<el-radio-group
v-model="item.subjectiveAspectCode"
@change="
(val) =>
handleChangeSubjectiveAspect(
val,
item
)
"
>
<el-radio
v-for="item in dict.subjectiveAspect"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
<el-form-item
:prop="`blames.${index}.subjectiveAspectName`"
:rules="{
required: true,
message: '其他主观方面不能为空',
trigger: ['blur'],
}"
v-if="
item.subjectiveAspectCode ===
SubjectiveAspect.OTHER
"
style="margin-bottom: 0"
class="ml-20"
>
<el-input
v-model="item.subjectiveAspectName"
placeholder="请输入其他主观方面"
style="width: 160px"
/>
</el-form-item>
</div>
</el-form-item>
</el-col>
<el-col :span="12" v-if="problemIsTrue">
<el-form-item
label="处理结果"
:prop="`blames.${index}.handleResultCode`"
:rules="{
required: true,
message: '请选择处理结果',
trigger: ['blur'],
}"
>
<el-select
v-model="item.handleResultCode"
style="width: 240px"
multiple
@change="
(val) => handleChangeResultCode(item, val)
"
clearable
>
<el-option
v-for="dictItem in dict.handleResult"
:key="dictItem.dictCode"
:value="dictItem.dictValue"
:label="dictItem.dictLabel"
/>
</el-select>
</el-form-item>
</el-col>
<el-col
:span="12"
v-if="item.handleResultCode?.includes('11')"
>
<el-form-item
label="其他处理结果"
:prop="`blames.${index}.handleResultCode`"
:rules="{
required: true,
message: '请选择处理结果',
trigger: ['blur'],
}"
>
<el-input
v-model="item.handleResultNameOther"
placeholder="其他类型详细描述"
/>
</el-form-item>
</el-col>
<template v-if="problemIsTrue">
<!-- <el-col :span="12">-->
<!-- <el-form-item-->
<!-- label="维权容错"-->
<!-- :prop="`blames.${index}.protectRightsCode`"-->
<!-- v-if="-->
<!-- negative.problemSourcesCode !==-->
<!-- ProblemSources.JWDC-->
<!-- "-->
<!-- >-->
<!-- <el-radio-group-->
<!-- v-model="item.protectRightsCode"-->
<!-- @change="-->
<!-- (val) =>-->
<!-- (item.protectRightsName = dict.protectRights.filter(-->
<!-- (item) => item.dictValue === val-->
<!-- )[0].dictLabel)-->
<!-- "-->
<!-- >-->
<!-- <el-radio-->
<!-- v-for="item in dict.protectRights"-->
<!-- :key="item.dictCode"-->
<!-- :value="item.dictValue"-->
<!-- >{{ item.dictLabel }}-->
<!-- </el-radio>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<el-col :span="12">
<el-form-item
label="督察措施"
:prop="`blames[${index}].superviseMeasuresCode`"
>
<el-radio-group
v-model="item.superviseMeasuresCode"
>
<el-radio
v-for="dictItem in dict.superviseMeasures"
:key="dictItem.dictCode"
:value="dictItem.dictValue"
@click.native.prevent="
() => {
if (
item.superviseMeasuresCode ===
dictItem.dictValue
) {
item.superviseMeasuresCode =
'';
item.superviseMeasuresName =
'';
item.confinementId = null;
} else {
item.superviseMeasuresCode =
dictItem.dictValue;
item.superviseMeasuresName =
dictItem.dictLabel;
if (dictItem.dictValue != 1) {
item.confinementId = null;
}
}
}
"
>{{ dictItem.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</template>
</el-row>
<el-row v-if="item.superviseMeasuresCode == 1">
<el-col>
<el-form-item label="禁闭关联">
<!-- {{item.superviseMeasuresCode}}-->
<el-select
v-model="item.confinementId"
filterable
remote
clearable
:remote-method="fileConfinement"
popper-class="widthClass"
>
<template #header>
<el-row>
<el-col :span="2">姓名</el-col>
<el-col :span="2">警号</el-col>
<el-col :span="3">部门</el-col>
<el-col :span="8">事由</el-col>
<el-col :span="4">禁闭时间</el-col>
</el-row>
</template>
<el-option
v-for="(val, key) in confinementOpens"
:key="key"
:label="val.matter"
:value="val.id"
>
<el-row>
<el-col :span="2">{{ val.name }}</el-col>
<el-col :span="2">{{ val.empNo }}</el-col>
<el-col :span="3">
<div class="flex gap-4">
<span>{{
val.departShortName || "/"
}}</span>
</div>
</el-col>
<el-col :span="8">
<el-tooltip
:content="val.matter"
placement="top"
>
<el-text truncated>
{{ val.matter }}
</el-text
>
</el-tooltip>
</el-col>
<el-col :span="4">
{{
val.startTime + "-" + val.endTime
}}
</el-col>
</el-row>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</div>
<div class="flex center" style="width: 100%">
<el-button type="primary" plain @click="handleAddPersonalBlame">
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加涉及人员
</el-button>
</div>
</el-form-item>
<el-divider/>
<el-form-item
label-position="top"
prop="blameLeaders"
:rules="{
required: true,
message: '请添加涉及领导',
}"
>
<div v-for="(item, index) in form.blameLeaders" :key="index">
<div class="flex v-center">
<h5>涉及领导{{ index + 1 }}</h5>
<el-button
type="danger"
plain
size="small"
@click="handleRemoveBlameLeader(index)"
text
class="ml-10"
>删除
</el-button>
</div>
<el-row style="background: #f9faff">
<el-col :span="24">
<el-form-item
label="关联涉及人员"
:prop="`blameLeaders.${index}.blameIdCodes`"
:rules="{
required: true,
message: '请选择涉及领导关联的涉及人员',
trigger: ['blur'],
}"
>
<el-checkbox
border
v-for="(obj, j) in form.blames.filter(
(obj) =>
obj.type === BlameType.PERSONAL &&
obj.blameIdCode
)"
:key="obj.blameIdCode"
:label="obj.blameName"
:value="obj.blameIdCode"
:checked="
item.blameIdCodes.includes(obj.blameIdCode)
"
@change="
(bool) =>
handleCheckboxChange(
item,
bool,
obj.blameIdCode
)
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="涉及领导姓名"
:prop="`blameLeaders.${index}.leadName`"
:rules="{
required: true,
message: '请选择涉及领导',
trigger: ['blur'],
}"
>
<police-select
:host-level="negative.hostLevel"
:depart-id="form.involveDepartId"
v-model="item.leadEmpNo"
@change="
(police) => {
item.leadName = police.name;
item.leadIdCode = police.idCode;
}
"
:isLeader="true"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="警号"
:prop="`blameLeaders.${index}.leadEmpNo`"
:rules="{
required: true,
message: '请输入警号',
trigger: ['blur'],
}"
>
<el-input
placeholder="请输入警号"
v-model="item.leadEmpNo"
style="width: 240px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="身份证号码"
:prop="`blameLeaders.${index}.leadIdCode`"
:rules="{
required: true,
message: '请输入身份证号码',
trigger: ['blur'],
}"
>
<el-input
placeholder="请输入身份证号码"
style="width: 240px"
v-model="item.leadIdCode"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="责任归属"
:prop="`blameLeaders.${index}.leadResponsibilityTypeCode`"
:rules="{
required: true,
message: '请选择责任归属',
trigger: ['blur'],
}"
v-if="problemIsTrue"
>
<el-radio-group
v-model="item.leadResponsibilityTypeCode"
@change="
(val) =>
(item.leadResponsibilityTypeName = dict.leadResponsibilityType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-radio
v-for="item in dict.leadResponsibilityType"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="处理结果"
:prop="`blameLeaders.${index}.leadHandleResultCode`"
:rules="{
required: true,
message: '请选择处理结果',
trigger: ['blur'],
}"
v-if="problemIsTrue"
>
<el-select
v-model="item.leadHandleResultCode"
style="width: 240px"
@change="
(val) => handleChangeLeadResultCode(item, val)
"
clearable
multiple
>
<el-option
v-for="item in dict.handleResult"
:key="item.dictCode"
:value="item.dictValue"
:label="item.dictLabel"
/>
</el-select>
</el-form-item>
</el-col>
<el-col
:span="12"
v-if="item.leadHandleResultCode?.includes('11')"
>
<el-form-item
label="其他处理结果"
:prop="`blames.${index}.leadHandleResultNameOther`"
:rules="{
required: true,
message: '请选择处理结果',
trigger: ['blur'],
}"
>
<el-input
v-model="item.leadHandleResultNameOther"
placeholder="其他类型详细描述"
/>
</el-form-item>
</el-col>
</el-row>
</div>
<div
class="flex center"
style="width: 100%"
v-if="
form.accountabilityTarget !== AccountabilityTarget.DEPARTMENT
"
>
<el-button type="primary" plain @click="handleAddBlameLeader">
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加涉及领导
</el-button>
</div>
</el-form-item>
</div>
<el-form-item
label-position="top"
v-if="form.accountabilityTarget !== AccountabilityTarget.PERSONAL"
>
<div v-for="(item, index) in form.blames" :key="index">
<template v-if="item.type === BlameType.DEPARTMENT">
<div class="flex between v-center">
<h5>涉及单位</h5>
</div>
<el-row>
<el-col :span="12">
<el-form-item
label="涉及班子成员"
:prop="`blames.${index}.blameEmpNo`"
:rules="{
required: true,
message: '请选择涉及班子成员',
trigger: ['blur'],
}"
>
<police-select
:host-level="negative.hostLevel"
:depart-id="form.involveDepartId"
v-model="item.blameEmpNo"
@change="
(police) => {
item.blameName = police.name;
item.blameIdCode = police.idCode;
}
"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="身份证号码"
:prop="`blames.${index}.blameIdCode`"
:rules="{
required: true,
message: '请输入身份证号码',
trigger: ['blur'],
}"
>
<el-input
placeholder="请输入身份证号码"
v-model="item.blameIdCode"
style="width: 240px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="人员属性"
:prop="`blames.${index}.ivPersonTypeCode`"
:rules="{
required: true,
message: '请选择人员属性',
trigger: ['blur'],
}"
>
<el-radio-group
v-model="item.ivPersonTypeCode"
@change="(val) => {
const hit = dict.personType?.find(d => String(d.dictValue) === String(val))
const label = hit?.dictLabel || '民警'
item.ivPersonType = label
item.ivPersonTypeName = label
}"
>
<el-radio :value="PersonType.POLICE">民警</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="problemIsTrue">
<el-form-item
label="督察措施"
:prop="`blames.${index}.superviseMeasuresCode`"
>
<el-radio-group
v-model="item.superviseMeasuresCode"
@change="
(val) =>
(item.superviseMeasuresName = dict.superviseMeasures.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-radio
v-for="dictItem in dict.superviseMeasures"
:key="dictItem.dictCode"
:value="dictItem.dictValue"
@click.native.prevent="
() => {
if (
item.superviseMeasuresCode ===
dictItem.dictValue
) {
item.superviseMeasuresCode = '';
item.superviseMeasuresName = '';
} else {
item.superviseMeasuresCode =
dictItem.dictValue;
item.superviseMeasuresName =
dictItem.dictLabel;
}
}
"
>{{ dictItem.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-form-item
:prop="`blames.${index}.problems`"
:rules="{
required: true,
message: '请添加问题类型',
trigger: ['blur'],
}"
v-if="problemIsTrue"
style="margin-bottom: 0"
>
<div
v-for="(problem, j) in item.problems"
:key="j"
style="width: 98%"
>
<el-form-item
:label="`查实问题类型${j + 1}`"
:prop="`blames.${index}.problems.${j}.threeLevelCode`"
:rules="{
required: true,
message: '请选择问题类型',
trigger: ['blur'],
}"
>
<div class="flex between" style="width: 100%">
<div class="flex gap">
<problem-type-select
v-model="problem.threeLevelCode"
@change="
(node) =>
handleChangeProblem(node, problem)
"
/>
<div style="width: 140px">
<el-form-item
label-position="top"
:prop="`blames.${index}.problems.${j}.threeLevelContentOther`"
:rules="{
required: true,
message: '请输入',
trigger: ['blur'],
}"
style="margin-bottom: 0"
v-if="
problem.threeLevelContent ===
'其他'
"
>
<el-input
placeholder="其他类型详细描述"
v-model="
problem.threeLevelContentOther
"
/>
</el-form-item>
</div>
<div>
<span>{{
problem.oneLevelContent
? problem.oneLevelContent + " / "
: ""
}}</span>
<span>{{
problem.twoLevelContent
? problem.twoLevelContent + " / "
: ""
}}</span>
<span>{{
problem.threeLevelContent
}}</span>
</div>
</div>
<div class="flex center v-center">
<el-button
type="danger"
plain
@click="item.problems.splice(j, 1)"
v-if="j !== 0"
size="small"
>
<template #icon>
<icon name="el-icon-Delete"/>
</template>
删除问题
</el-button>
<el-button
@click="handleAddProblem(item)"
plain
type="primary"
v-if="j === 0"
size="small"
>
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加问题
</el-button>
</div>
</div>
<div
class="flex center"
style="width: 100%"
v-if="
!item.problems || item.problems.length === 0
"
>
<el-button
@click="handleAddProblem(item)"
plain
type="primary"
size="small"
>
<template #icon>
<icon name="el-icon-Plus"/>
</template>
添加问题
</el-button>
</div>
</el-form-item>
</div>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item
label="主观方面"
:prop="`blames.${index}.subjectiveAspectCode`"
:rules="{
required: true,
message: '请选择主观方面',
trigger: ['blur'],
}"
>
<el-radio-group
v-model="item.subjectiveAspectCode"
@change="
(val) =>
(item.subjectiveAspectName = dict.subjectiveAspect.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-radio
v-for="item in dict.subjectiveAspect"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="责任归属"
:prop="`blames.${index}.responsibilityTypeCode`"
:rules="{
required: true,
message: '请选择责任归属',
trigger: ['blur'],
}"
v-if="problemIsTrue"
>
<el-radio-group
v-model="item.responsibilityTypeCode"
@change="
(val) =>
(item.responsibilityTypeName = dict.responsibilityType.filter(
(item) => item.dictValue === val
)[0].dictLabel)
"
>
<el-radio
v-for="item in dict.responsibilityType"
:key="item.dictCode"
:value="item.dictValue"
>{{ item.dictLabel }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="处理结果"
:prop="`blames.${index}.handleResultCode`"
:rules="{
required: true,
message: '请选择处理结果',
trigger: ['blur'],
}"
v-if="problemIsTrue"
>
<el-select
v-model="item.handleResultCode"
style="width: 240px"
@change="
(val) =>
handleChangeDepartResultCode(item, val)
"
clearable
multiple
>
<el-option
v-for="item in dict.departHandleResult"
:key="item.dictCode"
:value="item.dictValue"
:label="item.dictLabel"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
</template>
</div>
</el-form-item>
</el-form>
</template>
<script lang="ts" setup>
import {BASE_PATH} from "@/api/request";
import {
InspectCase,
IsRectify,
AccountabilityTarget,
BlameType,
ProblemSources,
PersonType,
HostLevel,
SubjectiveAspect,
} from "@/enums/dictEnums";
import useCatchStore from "@/stores/modules/catch";
import {getConfinementListAll} from "@/api/work/confinement";
import {timeFormat} from "@/utils/util";
//获取数据
const catchSotre = useCatchStore();
const props = defineProps<{
extraDict?: Record<string, any[]>
}>()
const dict = reactive<Record<string, any[]>>({})
watchEffect(() => {
const base = catchSotre.getDicts([
"isRectify",
"personType",
"superviseMeasures",
"subjectiveAspect",
"responsibilityType",
"handleResult",
"departHandleResult",
"protectRights",
"accountabilityTarget",
"leadResponsibilityType",
"resolveSituation",
"resolveStatus",
"checkStatus",
"sfssSourceTable",
"sfssTags",
"businessType",
// 你缺哪个就补哪个,比如 yesNo、handleMethodType
"yesNo",
"handleMethodType",
]) || {}
// ✅ props 传入的字典覆盖/补充 base
Object.assign(dict, base, props.extraDict || {})
})
const negative = inject("negative");
const form = ref({
handlePolices: [{}],
});
//禁闭信息数组
let confinementOpens = ref([]);
/**
* 禁闭信息入参
* */
let confinementQuery = ref({
current: 1,
size: 100,
departBranch: false,
});
/**
* 下拉搜索过滤数据(姓名,警号)
* @param query 输入参数
*
* */
const fileConfinement = async (query, type = "All") => {
confinementQuery.value = {
current: 1,
size: 100,
departBranch: false,
};
if (query && type == "All") {
confinementQuery.value.id = query;
confinementQuery.value.name = query;
confinementQuery.value.empNo = query;
}
if (query && type == "Id") {
confinementQuery.value.id = query;
}
const data = await getConfinementListAll(confinementQuery.value);
confinementOpens.value = data.records;
};
const problemIsTrue = computed(() => {
return form.value.checkStatusCode === '1' || form.value.checkStatusCode === '2' || form.value.checkStatusCode === '3';
});
getFormData();
watch(negative, () => {
getFormData();
});
async function getFormData() {
const row = negative.value?.currentRow ?? {}
form.value = {
...row,
complaintId: row?.id,
involveProblem: row.involveProblem ? String(row.involveProblem).split(/[,,]/).filter(Boolean) : [],
involveDepartId: negative.value.involveDepartId,
caseNumber: negative.value.caseNumber,
checkStatus: negative.value.checkStatus,
checkStatusCode: negative.value.checkStatusCode,
checkStatusName: negative.value.checkStatusName,
isRectifyName: negative.value.isRectifyName,
isRectifyCode: negative.value.isRectifyCode,
checkStatusDesc: negative.value.checkStatusDesc,
rectifyDesc: negative.value.rectifyDesc,
rectifyRestrictionDays: negative.value.rectifyRestrictionDays,
accountabilityTarget: negative.value.accountabilityTarget,
unrectifyReason: negative.value.unrectifyReason,
blames: negative.value.blames,
blameLeaders: negative.value.blameLeaders,
files: negative.value.files || [],
handlePolices:
!negative.value.handlePolices || negative.value.handlePolices.length === 0
? [{}]
: negative.value.handlePolices,
// 化解情况
resolveSituation: negative.value.resolveSituation,
resolveStatus: negative.value.resolveStatus,
visitingLeaderName: negative.value.visitingLeaderName,
visitingLeaderEmpNo: negative.value.visitingLeaderEmpNo,
processResult: negative.value.processResult,
handleResult12337: negative.value.handleResult12337,
handleResult12337Group: negative.value.handleResult12337Group,
verifiedIsLeader: negative.value.verifiedIsLeader,
};
if (negative.value.blames) {
negative.value.blames.forEach((item) => {
fileConfinement(item.confinementId, "Id");
});
}
if (negative.value.blameLeaders) {
negative.value.blameLeaders.forEach((item) => {
fileConfinement(item.leadConfinementId, "Id");
});
}
if (negative.value.accountabilityTarget != undefined) {
form.value.accountabilityTarget = negative.value.accountabilityTarget;
return;
}
if (negative.value.problemSourcesCode === ProblemSources.JWDC) {
form.value.accountabilityTarget = AccountabilityTarget.PERSONAL;
}
console.log("传入之后解析的form的数据=======================")
console.log(form.value);
}
function handleSupervise(val, index) {
console.log("chang事件触发");
console.log(`val${index}`, val);
}
function handleAddBlame(type) {
if (!Array.isArray(form.value.blames)) form.value.blames = [];
const problems = Array.isArray(negative.value?.problems) ? negative.value.problems : [];
form.value.blames.push({
type,
problems: problems.length === 0 ? [{}] : JSON.parse(JSON.stringify(problems)),
});
}
function handleAddDepartBlame() {
handleAddBlame(BlameType.DEPARTMENT);
}
function handleAddPersonalBlame() {
handleAddBlame(BlameType.PERSONAL);
if (form.value.blameLeaders.length == 0) {
handleAddBlameLeader();
}
}
function handleRemoveBlame(item) {
form.value.blames.splice(form.value.blames.indexOf(item), 1);
}
function handleAddProblem(blame) {
if (!blame.problems) {
blame.problems = [];
}
blame.problems.push({});
}
function handleAddBlameLeader() {
form.value.blameLeaders.push({
blameIdCodes: [],
});
}
function handleRemoveBlameLeader(index) {
form.value.blameLeaders.splice(index, 1);
}
// 更改追责对象
watch(
() => form.value.accountabilityTarget,
(val) => {
if (val === AccountabilityTarget.PERSONAL) {
if (
form.value.blames.filter((item) => item.type === BlameType.PERSONAL)
.length === 0
) {
handleAddPersonalBlame();
}
form.value.blames.forEach((item) => {
if (item.type === BlameType.DEPARTMENT) {
handleRemoveBlame(item);
}
});
}
if (val === AccountabilityTarget.DEPARTMENT) {
form.value.blames.forEach((item) => {
if (item.type === BlameType.PERSONAL) {
handleRemoveBlame(item);
}
});
if (
form.value.blames.filter((item) => item.type === BlameType.DEPARTMENT)
.length === 0
) {
handleAddDepartBlame();
}
form.value.blameLeaders = [];
}
if (val === AccountabilityTarget.PERSONAL_AND_DEPARTMENT) {
if (
form.value.blames.filter((item) => item.type === BlameType.PERSONAL)
.length === 0
) {
handleAddPersonalBlame();
}
if (
form.value.blames.filter((item) => item.type === BlameType.DEPARTMENT)
.length === 0
) {
handleAddDepartBlame();
}
}
}
);
function handleChangeCheckStatus(val) {
// 兜底
if (!val) {
form.value.checkStatusCode = ''
form.value.checkStatus = ''
form.value.checkStatusName = ''
return
}
// 1 设置中文名
const hit = dict.checkStatus?.find(
(item) => String(item.dictValue) === String(val)
)
form.value.checkStatusName = hit?.dictLabel || ''
// 2 设置后端需要的 checkStatus(你原来的业务规则)
if (val === '1') {
form.value.checkStatus = '1'
} else if (val === '2' || val === '3') {
form.value.checkStatus = '2'
} else if (val === '4' || val === '5') {
form.value.checkStatus = '3'
}
}
function handleChangePolice(police, item) {
item.blameName = police.name;
item.blameIdCode = police.idCode;
item.ivPersonTypeCode = police.personType;
const hit = dict.personType?.find(
d => String(d.dictValue) === String(police.personType)
);
item.ivPersonTypeName = hit?.dictLabel || '';
}
function handleChangeSubjectiveAspect(val, item) {
if (val === SubjectiveAspect.OTHER) {
item.subjectiveAspectName = "";
return;
}
item.subjectiveAspectName = dict.subjectiveAspect.filter(
(item) => item.dictValue === val
)[0].dictLabel;
}
function handleChangeProblem(node, problem) {
if (node.level === 3) {
problem.threeLevelContent = node.label;
problem.oneLevelCode = node.parent.parent.key;
problem.oneLevelContent = node.parent.parent.label;
problem.twoLevelCode = node.parent.key;
problem.twoLevelContent = node.parent.label;
}
}
function handleCheckboxChange(blameLeader, bool, val) {
if (bool) {
blameLeader.blameIdCodes.push(val);
} else {
blameLeader.blameIdCodes.splice(blameLeader.blameIdCodes.indexOf(val), 1);
}
}
function handleChangeResultCode(item) {
if (item.handleResultCode && item.handleResultCode.length > 0) {
item.handleResultName = dict.handleResult
.filter((obj) => item.handleResultCode.includes(obj.dictValue))
.map((obj) => obj.dictLabel)
.join("、");
} else {
item.handleResultName = "";
}
}
function handleChangeLeadResultCode(item) {
if (item.leadHandleResultCode && item.leadHandleResultCode.length > 0) {
item.leadHandleResultName = dict.handleResult
.filter((obj) => item.leadHandleResultCode.includes(obj.dictValue))
.map((obj) => obj.dictLabel)
.join("、");
} else {
item.leadHandleResultName = "";
}
}
function handleChangeDepartResultCode(item) {
if (item.handleResultCode && item.handleResultCode.length > 0) {
item.handleResultName = dict.departHandleResult
.filter((obj) => item.handleResultCode.includes(obj.dictValue))
.map((obj) => obj.dictLabel)
.join("、");
} else {
item.handleResultName = "";
}
}
function validateHandlePolices(rule, value, cb) {
console.log(value);
if (value.length === 0) {
cb(new Error("请选择经办人"));
} else if (!value[0].name) {
cb(new Error("请选择经办人"));
} else if (!value[0].mobile) {
cb(new Error("请输入经办人联系方式"));
} else {
cb();
}
}
function handleResult12337(item) {
form.value.handleResult12337Group = item.group;
}
const formRef = ref(null);
async function validate() {
// 解决核查办理 当涉及对象是涉及个人时,有一条涉及单位的数据,导致问题无法提交的问题。
if (form.value.accountabilityTarget === AccountabilityTarget.PERSONAL) {
form.value.blames = form.value.blames.filter(
(item) => item.type === BlameType.PERSONAL
);
}
await formRef.value.validate();
if (form.value.accountabilityTarget !== AccountabilityTarget.DEPARTMENT) {
let arr = [];
form.value.blameLeaders.forEach((item) => {
arr = arr.concat(item.blameIdCodes);
});
const blame = form.value.blames.filter(
(item) => item.type === BlameType.PERSONAL && !arr.includes(item.blameIdCode)
);
if (blame.length) {
throw new Error(
`涉及人员【${blame.map((item) => item.blameName).join("、")}】未关联领导`
);
}
}
return form.value;
}
// ✅ 展示用:直接把 negative 当 currentRow
const currentRow = computed(() => negative?.value?.currentRow ?? {})
function getDictLabel(list: any[] = [], value: any) {
if (value === undefined || value === null || value === '') return '/';
const hit = list?.find((x) => String(x.dictValue) === String(value));
return hit?.dictLabel ?? '/';
}
function getData() {
return form.value;
}
const formatLocalDateTime = (val) => {
if (!val) return '/'
// LocalDateTime: 2024-09-01T14:23:45
const timestamp = new Date(val).getTime()
if (isNaN(timestamp)) return val
return timeFormat(timestamp, 'yyyy-mm-dd hh:MM:ss')
}
defineExpose({
validate,
getData,
});
</script>
<style>
.widthClass {
min-width: 50% !important;
}
</style>
<style lang="scss" scoped>
.el-form-item .el-form-item {
margin-bottom: 18px;
}
:deep() {
.el-form-item--label-right .el-form-item__label {
text-align: right;
line-height: 32px;
margin-bottom: 0;
}
}
p {
margin: 0;
line-height: 1.4;
}
.info-container {
border: 1px solid #eee;
background: #fafcff;
padding: 12px 16px;
border-radius: 6px;
margin-bottom: 12px;
}
.row {
display: flex;
flex-wrap: wrap;
gap: 10px 0;
}
.col {
display: flex;
gap: 8px;
line-height: 22px;
}
.col-12 {
width: 50%;
}
.col-24 {
width: 100%;
}
label {
width: 120px;
color: #666;
flex: 0 0 auto;
}
span {
color: #222;
flex: 1 1 auto;
word-break: break-word;
}
</style>