|
|
<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> |