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

1081 lines
43 KiB

<template>
<div class="container">
<header class="mb-20">
<el-form :label-width="114">
<el-row>
<el-col :span="6">
<el-form-item label="申请时间">
<date-time-range-picker-ext
v-model="query.applyDate"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="事发时间">
<date-time-range-picker-ext
v-model="query.happenTime"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="姓名">
<el-input
placeholder="请输入姓名"
v-model="query.applicantEmpName"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="申请人单位">
<depart-tree-select v-model="query.departId" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="flex between">
<el-button type="primary" @click="handleShowAdd">
<template #icon>
<icon name="el-icon-Plus" />
</template>
申请抚慰</el-button
>
<div>
<el-button type="primary" @click="search">
<template #icon>
<icon name="el-icon-Search" />
</template>
查询</el-button
>
<el-button @click="reset">重置</el-button>
</div>
</div>
</header>
<el-tabs>
<el-tab-pane label="我的待办">
<div class="table-container">
<el-table :data="todos">
<el-table-column
label="抚慰编号"
prop="number"
show-overflow-tooltip
/>
<el-table-column
label="申请时间"
prop="applyDate"
width="160"
/>
<el-table-column
label="事发时间"
prop="happenTime"
width="160"
/>
<el-table-column
label="申请人姓名"
prop="applicantEmpName"
width="100"
/>
<el-table-column label="申请人单位" prop="departName" />
<el-table-column label="开户行">
<template #default="{ row }">
<span>{{ row.bankCard }}</span>
<span>{{ row.bankBranch }}</span>
</template>
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag
:type="
row.rpcStatus !== 'returned'
? 'primary'
: 'danger'
"
v-if="row.rpcStatus"
>{{
getDictLable(
dict.comfortStatus,
row.rpcStatus
)
}}</el-tag
>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button
link
type="primary"
@click="handleShow(row, false)"
v-if="row.rpcStatus !== 'returned'"
>立即处理</el-button
>
<template v-else>
<el-button
link
type="primary"
@click="handleShow(row, true)"
>查看</el-button
>
<el-button
link
type="primary"
@click="handleReSubmit(row)"
>重新提交</el-button
>
<el-button
link
type="danger"
v-if="row.rpcStatus === 'returned'"
@click="handleDelete(row)"
>删除</el-button
>
</template>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getTodos"
@current-change="getTodos"
:page-sizes="[10, 20, 50]"
v-model:page-size="todoPage.size"
v-model:current-page="todoPage.current"
layout="total, sizes, prev, pager, next"
:total="todoPage.total"
>
</el-pagination>
</div>
</el-tab-pane>
<el-tab-pane label="我的已办">
<div class="table-container">
<el-table :data="dones">
<el-table-column
label="抚慰编号"
prop="number"
show-overflow-tooltip
/>
<el-table-column
label="申请时间"
prop="applyDate"
width="160"
/>
<el-table-column
label="事发时间"
prop="happenTime"
width="160"
/>
<el-table-column
label="申请人姓名"
prop="applicantEmpName"
width="100"
/>
<el-table-column label="申请人单位" prop="departName" />
<el-table-column label="当前审批人" prop="approver">
</el-table-column>
<el-table-column label="状态" width="100">
<template #default="{ row }">
<el-tag type="primary">{{
getDictLable(
dict.comfortStatus,
row.rpcStatus
)
}}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="200">
<template #default="{ row }">
<el-button
link
type="primary"
@click="handleShow(row, true)"
>查看</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<div class="flex end mt-8">
<el-pagination
@size-change="getDones"
@current-change="getDones"
:page-sizes="[10, 20, 50]"
v-model:page-size="donePage.size"
v-model:current-page="donePage.current"
layout="total, sizes, prev, pager, next"
:total="donePage.total"
>
</el-pagination>
</div>
</el-tab-pane>
</el-tabs>
说明:我的抚慰,用于展示当前需本人待办的抚慰申请;同时可在此界面申请提交抚慰。
</div>
<el-dialog
title="申请抚慰"
v-model="show"
width="60vw"
top="2vh"
style="margin-bottom: 0"
>
<el-scrollbar height="calc(96vh - 130px)">
<el-form
:label-width="140"
ref="formRef"
:model="formData"
v-if="step === 0"
>
<h5>办理信息</h5>
<el-row>
<el-col :span="12">
<el-form-item
label="申请时间"
:rules="{
required: true,
trigger: ['blur'],
}"
prop=""
>
<el-date-picker
v-model="formData.applyDate"
type="date"
placeholder="请选择"
value-format="YYYY-MM-DD"
style="width: 300px"
:disabled-date="disabledDate"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="主办单位"
:rules="{
required: true,
message: '请选择',
}"
prop="handleDepartId"
>
<div style="width: 300px">
<el-tree-select
v-model="formData.handleDepartId"
:data="departs"
:props="{ label: 'shortName', value: 'id' }"
node-key="id"
:default-expanded-keys="['12630']"
clearable
filterable
@node-click="
(node) =>
(formData.handleDepartName =
node.shortName)
"
/>
</div>
</el-form-item>
</el-col>
</el-row>
<el-divider />
<el-row>
<el-col :span="12">
<el-form-item
label="是否为本人申请"
:rules="{
required: true,
trigger: ['blur'],
}"
prop=""
>
<el-radio-group
v-model="formData.isSelf"
@change="handleSelectIsSelf"
>
<el-radio value="1">是</el-radio>
<el-radio value="0">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.isSelf === 0">
<el-form-item
label="关系"
:rules="{
required: true,
trigger: ['blur'],
message: '请选择',
}"
prop="relation"
>
<el-radio-group v-model="formData.relation">
<el-radio :value="1">同事</el-radio>
<el-radio :value="2">亲属</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12" v-if="formData.isSelf === '0'">
<el-form-item
label="代理人姓名"
:rules="{
required: true,
message: '请输入代理人姓名',
}"
prop="agentName"
>
<el-input
style="width: 300px"
v-model="formData.agentName"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<h5>申请人信息</h5>
<el-row>
<el-col :span="12">
<el-form-item
label="申请人姓名"
:rules="{
required: true,
message: '请输入',
}"
prop="applicantEmpName"
>
<el-autocomplete
v-model="formData.applicantEmpName"
:fetch-suggestions="querySearch"
:trigger-on-focus="false"
value-key="name"
clearable
placeholder="请输入姓名搜索"
@select="handleSelect"
style="width: 300px"
>
<template #default="{ item }">
<span class="mr-10">{{ item.name }}</span>
<span class="text-primary">{{
item.empNo
}}</span>
<span class="text-primary">
&nbsp; {{item.parentDepartShortName}} &nbsp; {{item.departShortName}}
</span>
</template>
</el-autocomplete>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="性别"
:rules="{
required: true,
message: '请选择性别',
}"
prop="sex"
>
<el-radio-group v-model="formData.sex">
<el-radio :value="0">男</el-radio>
<el-radio :value="1">女</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="出生年月"
:rules="{
required: true,
message: '请选择出生年月',
}"
prop="birthday"
>
<el-date-picker
v-model="formData.birthday"
type="date"
placeholder="请选择"
value-format="YYYY-MM-DD"
style="width: 300px"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="身份证号码"
:rules="{
required: true,
message: '请输入',
}"
prop="idCode"
>
<el-input
v-model="formData.idCode"
clearable
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="单位"
:rules="{
required: true,
message: '请选择',
}"
prop="departId"
>
<div style="width: 300px">
<depart-tree-select
v-model="formData.departId"
:check-strictly="true"
@node-click="
(node) =>
(formData.departName =
node.shortName)
"
/>
</div>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="警号"
:rules="{
required: true,
message: '请输入',
}"
prop="empNo"
>
<el-input
v-model="formData.empNo"
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职务" prop="job">
<el-input
v-model="formData.job"
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="警衔" prop="policeRank">
<el-input
v-model="formData.policeRank"
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="文化程度"
:rules="{
required: true,
message: '请选择',
}"
prop="levelEducation"
>
<el-select
clearable
style="width: 300px"
v-model="formData.levelEducation"
>
<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-col>
<el-col :span="12">
<el-form-item
label="政治面貌"
:rules="{
required: true,
message: '请选择',
}"
prop="politicCountenance"
>
<el-select
clearable
style="width: 300px"
v-model="formData.politicCountenance"
>
<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-col>
<el-col :span="12">
<el-form-item-ext
label="联系电话"
:rules="{
required: true,
message: '请输入',
}"
prop="mobile"
content="银行预留电话"
>
<el-input
v-model="formData.mobile"
style="width: 300px"
placeholder="请输入银行预留电话"
/>
</el-form-item-ext>
</el-col>
<el-col :span="12">
<el-form-item
label="开户行"
prop="bankCard"
:rules="{
required: true,
message: '请选择',
}"
>
<el-select
v-model="formData.bankCard"
clearable
style="width: 300px"
>
<el-option
v-for="item in dict.bank"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="所属支行"
prop="bankBranch"
:rules="{
required: true,
message: '请输入',
}"
>
<el-input
v-model="formData.bankBranch"
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="银行账号"
prop="bankCardAccount"
:rules="{
required: true,
message: '请输入',
}"
>
<el-input
v-model="formData.bankCardAccount"
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
</el-row>
<el-divider />
<h5>案发情况</h5>
<el-row>
<el-col :span="12">
<el-form-item
label="事发时间"
prop="happenTime"
:rules="{
required: true,
message: '请选择',
}"
>
<el-date-picker
v-model="formData.happenTime"
type="datetime"
placeholder="请选择"
value-format="YYYY-MM-DD HH:mm"
time-format="HH:mm"
style="width: 300px"
:disabled-date="disabledDate"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item
label="事实及理由"
prop="factReason"
:rules="{
required: true,
message: '请输入',
}"
>
<el-input
v-model="formData.factReason"
type="textarea"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="案发环节"
prop="incidentLink"
:rules="{
required: true,
message: '请选择',
}"
>
<el-select
v-model="formData.incidentLink"
style="width: 300px"
clearable
@change="
(val) =>
(formData.incidentLinkName =
dict.incidentLink.find(
(item) => item.dictValue === val
)?.dictLabel)
"
>
<el-option
v-for="item in dict.incidentLink"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="受伤程度"
prop="injurySeverity"
:rules="{
required: true,
message: '请选择',
}"
>
<el-select
v-model="formData.injurySeverity"
style="width: 300px"
clearable
@change="
(val) =>
(formData.injurySeverityName =
dict.injurySeverity.find(
(item) => item.dictValue === val
)?.dictLabel)
"
>
<el-option
v-for="item in dict.injurySeverity"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="侵权形式"
prop="formsOfTort"
:rules="{
required: true,
message: '请选择',
}"
>
<el-select
v-model="formData.formsOfTort"
style="width: 300px"
clearable
@change="
(val) =>
(formData.formsOfTortName =
dict.formsOfTort.find(
(item) => item.dictValue === val
)?.dictLabel)
"
>
<el-option
v-for="item in dict.formsOfTort"
:key="item.id"
:label="item.dictLabel"
:value="item.dictValue"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="侵权人姓名"
prop="infringerName"
:rules="{
required: true,
message: '请输入',
}"
>
<el-input
v-model="formData.infringerName"
style="width: 300px"
placeholder="请输入"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
label="处理方式"
prop="infringerHandle"
:rules="{
required: true,
message: '请输入',
}"
>
<!-- <el-input-->
<!-- v-model="formData.infringerHandle"-->
<!-- style="width: 300px"-->
<!-- placeholder="请输入"-->
<!-- />-->
<el-select style="width: 300px" v-model="formData.infringerHandle" clearable>
<el-option v-for="(item,index) in infringerHandleDict" :key="index" :value="item" :label="item"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<div style="margin-left: 100px;">备注:经济抚慰 精神伤害1000元、一般性损伤2000元、轻微伤3000元、轻伤5000元、重伤10000元填报,并出具伤情法医鉴定书及其它相关材料。</div>
<el-divider />
<h5>佐证材料</h5>
<el-form-item label="附件" prop="documentFile">
<file-upload
v-model:files="formData.documentFile"
>
<template #tips>
<div>
<a class="link" :href="`${BASE_PATH}/templates/5、民警维权抚慰申请表.doc`" target="__blank">1、抚慰申请表</a>(盖章)
2、事情经过(盖章)。3、受伤照片。4、伤情鉴定。5、受立案登记表。6、其他</div>
</template>
</file-upload>
</el-form-item>
<el-divider />
<h5>呈报审批</h5>
<el-row>
<el-col :span="12">
<el-form-item
label="审批人"
:rules="{
required: true,
message:
'未选择主办单位或当前主办单位的未配置维权专干(请联系系统管理员)',
}"
prop="approverEmpNo"
>
<el-input disabled v-model="formData.approver" />
</el-form-item>
</el-col>
</el-row>
<el-row>
审批人为主办单位的维权专干,若无审批人员请联系市局专班新增。
</el-row>
</el-form>
<div v-else style="height: 60vh" class="flex center">
<el-result
icon="success"
title="申请成功"
sub-title="请在我的已办查看进度"
>
</el-result>
</div>
</el-scrollbar>
<footer class="flex end" v-if="step === 0">
<el-button @click="show = false" size="large">取消</el-button>
<el-button
type="primary"
@click="submit"
size="large"
:disabled="btDisabled"
>确定</el-button
>
</footer>
</el-dialog>
<comfort-dialog
v-model:show="actionShow"
:id="activeRpcId"
:disabled="dialogDisabled"
@update="search()"
/>
</template>
<script setup>
import { BASE_PATH } from "@/api/request";
import moment from "moment";
import {
listComfortTodos,
listDone,
applyComfort,
updateComfort,
delComfort,
getDetail,
} from "@/api/rightsComfort/comfort";
import { listPolice } from "@/api/system/police";
import { listRightPersonByDepartId } from "@/api/system/rightPerson";
import { secondList } from "@/api/system/depart";
import { getDictLable, getGenderFromIdCode,extractInfoFromID } from "@/utils/util";
import feedback from "@/utils/feedback";
import useCatchStore from "@/stores/modules/catch";
import useUserStore from "@/stores/modules/user";
const catchStore = useCatchStore();
const dict = catchStore.getDicts([
"formsOfTort",
"injurySeverity",
"incidentLink",
"comfortStatus",
"bank",
]);
const infringerHandleDict = ref([
"刑事追究","立案侦查","行政处罚","其他"
])
const query = ref({});
const todos = ref([]);
const todoPage = reactive({
total: 0,
current: 1,
size: 10,
});
const dones = ref([]);
const donePage = reactive({
total: 0,
current: 1,
size: 10,
});
function getTodos() {
const queryParam = { ...query.value };
queryParam.current = todoPage.current;
queryParam.size = todoPage.size;
listComfortTodos(queryParam).then((data) => {
todos.value = data.records;
todoPage.total = data.total;
});
}
function getDones() {
const queryParam = { ...query.value };
queryParam.current = donePage.current;
queryParam.size = donePage.size;
listDone(queryParam).then((data) => {
dones.value = data.records;
donePage.total = data.total;
});
}
function reset() {
query.value = {
current: 1,
size: 10,
};
getTodos();
getDones();
}
console.log('dict.bank',dict.bank)
function search() {
getTodos();
getDones();
}
const departs = ref([]);
onMounted(() => {
getTodos();
getDones();
secondList().then((data) => {
departs.value = data;
});
});
const show = ref(false);
const formData = ref({
bankCard:'长沙银行',
applyDate: moment().format("YYYY-MM-DD"),
});
const formRef = ref(null);
const btDisabled = ref(false);
const step = ref(0);
async function submit() {
try {
await formRef.value.validate();
} catch (e) {
feedback.msgWarning("请检查输入项");
return;
}
btDisabled.value = true;
if (mode.value === "add") {
await applyComfort(formData.value);
} else {
updateComfort(formData.value);
getTodos();
}
step.value = 1;
show.value = false;
formData.value = {
applyDate: moment().format("YYYY-MM-DD"),
};
getDones();
btDisabled.value = false;
formRef.value.resetFields();
}
const mode = ref("add");
function handleShowAdd() {
step.value = 0;
mode.value = "add";
show.value = true;
}
async function handleReSubmit(row) {
const data = await getDetail(row.rpcId);
formData.value = {
rpcId: data.apply.rpcId,
applyDate: data.apply.applyDate,
happenTime: data.apply.happenTime,
applicantEmpName: data.apply.applicantEmpName,
handleDepartId: data.apply.handleDepartId,
handleDepartName: data.apply.handleDepartName,
isSelf: data.apply.isSelf,
relation: data.apply.relation,
agentName: data.apply.agentName,
departId: data.apply.departId,
departName: data.apply.departName,
happenTime: data.apply.happenTime,
factReason: data.apply.factReason,
incidentLink: data.apply.incidentLink,
incidentLinkName: data.apply.incidentLinkName,
formsOfTort: data.apply.formsOfTort,
formsOfTortName: data.apply.formsOfTortName,
infringerName: data.apply.infringerName,
infringerHandle: data.apply.infringerHandle,
documentFile: data.apply.documentFile
? JSON.parse(data.apply.documentFile)
: [],
sex: data.person.sex,
birthday: data.person.birthday,
idCode: data.person.idCode,
empNo: data.person.empNo,
job: data.person.job,
policeRank: data.person.policeRank,
politicCountenance: data.person.politicCountenance,
mobile: data.person.mobile,
bankCard: data.person.bankCard,
bankBranch: data.person.bankBranch,
bankCardAccount: data.person.bankCardAccount,
levelEducation: data.person.levelEducation,
injurySeverity: data.applyPerson.injurySeverity,
injurySeverityName: data.applyPerson.injurySeverityName,
};
mode.value = "edit";
show.value = true;
}
async function querySearch(queryString, cb) {
if (!queryString) {
cb([]);
}
const data = await listPolice({
size: 20,
current: 1,
name: queryString,
});
cb(data.records);
}
function handleSelect(item) {
formData.value.empNo = item.empNo;
formData.value.idCode = item.idCode;
formData.value.mobile = item.mobile;
formData.value.departId=item.orgId;
if(formData.value?.idCode){
console.log('formData.value.idCode,',formData.value.idCode )
let res= extractInfoFromID('430902199509098737');
console.log('res',res)
// formData.value.sex=gender;
// formData.value.birthday = birthDate;
}
}
watch(
() => formData.value.handleDepartId,
(val) => {
listRightPersonByDepartId(val).then((data) => {
if (data.length) {
formData.value.approverEmpNo = data.map((item) => item.empNo);
formData.value.approver = data
.map((item) => item.empName)
.join("、");
} else {
delete formData.value.approverEmpNo;
delete formData.value.approver;
}
});
}
);
const actionShow = ref(false);
const activeRpcId = ref(false);
const dialogDisabled = ref(true);
function handleShow(row, disabled) {
actionShow.value = true;
activeRpcId.value = row.rpcId;
dialogDisabled.value = disabled;
}
const handleDelete = async (row) => {
await feedback.confirm(`确定要删除 ${row.number}`);
await delComfort(row.rpcId);
feedback.msgSuccess("删除成功");
getTodos();
};
const userStore = useUserStore();
function handleSelectIsSelf() {
if (formData.value.isSelf === "1") {
formData.value.applicantEmpName = userStore.user.nickName;
formData.value.idCode = userStore.user.userName;
formData.value.empNo = userStore.user.empNo;
formData.value.mobile = userStore.user.mobile;
formData.value.departId = userStore.user.departId;
const sex = getGenderFromIdCode(formData.value.idCode);
if (sex) {
formData.value.sex = sex === "男" ? 0 : 1;
}
if (formData.value.idCode && formData.value.idCode.length === 18) {
formData.value.birthday = moment(
formData.value.idCode.substring(6, 14),
"YYYYMMDD"
).format("YYYY-MM-DD");
}
}
}
const resultShow = ref(true);
</script>
<style lang="scss" scoped>
h5 {
margin: 10px 0;
}
</style>