新增申诉管理模块: 新增角色(申诉处理委员会成员);
This commit is contained in:
@@ -420,7 +420,7 @@ layout("/layouts/v4/baseLayout.html"){
|
||||
this.$message.warning("当前流程没有配置地址")
|
||||
return
|
||||
}
|
||||
window.open(formKey + "?taskId=" + taskId + "bizId=" + businessNo + "taskKey=" + taskKey)
|
||||
window.open(formKey + "?taskId=" + taskId + "&bizId=" + businessNo + "&taskKey=" + taskKey)
|
||||
},
|
||||
|
||||
// 获取空状态文本
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" style="width: 100%" placeholder="请选择年度"></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="申诉类型">
|
||||
<el-select v-model="pageForm.appealTypeId" filterable clearable style="width: 100%" placeholder="请选择申诉类型">
|
||||
<el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="申诉标题">
|
||||
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入申诉标题" @keyup.enter.native="doSearch"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool :app="this" label="审批列表">
|
||||
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.approval">
|
||||
<el-radio-button :label="true">已审核</el-radio-button>
|
||||
<el-radio-button :label="false">未审核</el-radio-button>
|
||||
</el-radio-group>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="taskId" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="60" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="title" label="申诉标题" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="userName" label="申诉人" width="100"></el-table-column>
|
||||
<el-table-column prop="appealTypeName" label="申诉类型" width="140"></el-table-column>
|
||||
<el-table-column prop="defendantUnitName" label="被申诉单位" width="180" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="applyDate" label="申请日期" width="120"></el-table-column>
|
||||
<el-table-column prop="curTaskName" label="当前节点" width="120"></el-table-column>
|
||||
<el-table-column prop="instanceState" label="流程状态" width="120">
|
||||
<template slot-scope="{row}">
|
||||
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="200">
|
||||
<template slot-scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="onOpen(row)">查看</el-button>
|
||||
<el-button size="mini" type="primary" v-if="row.taskState === 10" @click="onDeal(row)">审核</el-button>
|
||||
<el-button size="mini" type="danger" v-if="row.canRevoke" @click="onRevoke(row)">撤回</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<appeal-info ref="infoRef"></appeal-info>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog title="受理申诉" :visible.sync="dialogVisible" width="900px" :close-on-click-modal="false">
|
||||
<el-form :model="formData" ref="formRef" label-width="130px">
|
||||
<el-form-item label="申诉标题">
|
||||
<el-input v-model="formData.title" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="处理决定" prop="decisionType" :rules="[{required:true,message:'请选择处理决定',trigger:'change'}]">
|
||||
<el-select v-model="formData.decisionType" style="width: 100%">
|
||||
<el-option label="维持原处理决定" value="MAINTAIN"></el-option>
|
||||
<el-option label="责令重新处理" value="REPROCESS"></el-option>
|
||||
<el-option label="责令部分重新处理" value="REPROCESS_PART"></el-option>
|
||||
<el-option label="其他" value="OTHER"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="作出决定日期" prop="decisionDate" :rules="[{required:true,message:'请选择决定日期',trigger:'change'}]">
|
||||
<el-date-picker v-model="formData.decisionDate" value-format="yyyy-MM-dd" type="date" style="width: 100%"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form-item label="处理决定内容" prop="decisionContent" :rules="[{required:true,message:'请输入处理决定内容',trigger:'blur'}]">
|
||||
<text-editor v-model="formData.decisionContent"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="事实理由及依据" prop="legalBasis" :rules="[{required:true,message:'请输入事实理由及依据',trigger:'blur'}]">
|
||||
<text-editor v-model="formData.legalBasis"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="决定书附件" prop="decisionFiles">
|
||||
<file-upload :value.sync="formData.decisionFiles" :upload_number="5" upload_mode="drag" upload_result_category="array" complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer">
|
||||
<el-button @click="dialogVisible=false">取消</el-button>
|
||||
<el-button type="warning" @click="doAccept(6)">退回修改</el-button>
|
||||
<el-button type="danger" @click="doAccept(2)">不予受理</el-button>
|
||||
<el-button type="primary" @click="doAccept(1)">受理并转执行</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
<!--#include("../common/info.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"appeal-info": APPEAL_INFO
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
approval: false
|
||||
},
|
||||
typeOptions: [],
|
||||
dialogVisible: false,
|
||||
formData: {},
|
||||
currentTaskId: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoRef.onOpen(row)
|
||||
})
|
||||
},
|
||||
onDeal(row) {
|
||||
this.currentTaskId = row.taskId
|
||||
this.$axios.post("/platform/appeal/accept/queryTask", {taskId: row.taskId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.formData = res.data || row
|
||||
this.dialogVisible = true
|
||||
}
|
||||
})
|
||||
},
|
||||
doAccept(submitType) {
|
||||
const submit = () => {
|
||||
this.$axios.post("/platform/appeal/accept/accept", {
|
||||
data: JSON.stringify(this.formData),
|
||||
taskId: this.currentTaskId,
|
||||
submitType
|
||||
}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.dialogVisible = false
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
}
|
||||
if (submitType === 1) {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (valid) submit()
|
||||
})
|
||||
} else {
|
||||
submit()
|
||||
}
|
||||
},
|
||||
onRevoke(row) {
|
||||
this.$confirm("您确定要撤回吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
loadTypeOptions() {
|
||||
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
|
||||
if (res.code === 0) this.typeOptions = res.data || []
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadTypeOptions()
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,123 @@
|
||||
const APPEAL_INFO = {
|
||||
name: "AppealInfo",
|
||||
/*language=HTML*/
|
||||
template: `
|
||||
<div class="appeal-info">
|
||||
<div class="process-title">申诉基础信息</div>
|
||||
<h3 style="text-align: center;font-weight: 600" class="pt10 pb10">{{ viewData.title }}</h3>
|
||||
<el-descriptions :column="3" border>
|
||||
<el-descriptions-item label="申诉人">{{ viewData.userName }}({{ viewData.loginName }})</el-descriptions-item>
|
||||
<el-descriptions-item label="所在单位">{{ viewData.unitName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="联系电话">{{ viewData.mobile }}</el-descriptions-item>
|
||||
<el-descriptions-item label="性别">{{ viewData.sex }}</el-descriptions-item>
|
||||
<el-descriptions-item label="出生年月">{{ viewData.birthday }}</el-descriptions-item>
|
||||
<el-descriptions-item label="政治面貌">{{ viewData.political }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申诉类型">{{ viewData.appealTypeName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="被申诉单位">{{ viewData.defendantUnitName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申请日期">{{ viewData.applyDate }}</el-descriptions-item>
|
||||
<el-descriptions-item label="业务状态">
|
||||
<el-tag size="mini">{{ viewData.state || '草稿' }}</el-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="岗位">{{ viewData.positionName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="住址">{{ viewData.address }}</el-descriptions-item>
|
||||
<el-descriptions-item label="申诉事项" :span="3">
|
||||
<div class="text-left" v-html="viewData.appealMatter"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="申诉理由" :span="3">
|
||||
<div class="text-left" v-html="viewData.reason"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="申诉要求" :span="3">
|
||||
<div class="text-left" v-html="viewData.request"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="附件" :span="3">
|
||||
<file-preview :files="viewData.files" complete_result></file-preview>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="申诉人签名" :span="3">
|
||||
<el-image v-if="viewData.signature" :src="viewData.signature" class="signature-image"></el-image>
|
||||
<span v-else>暂无</span>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<div class="process-title mt10" v-if="viewData.acceptTime || viewData.decisionContent">受理与处理决定</div>
|
||||
<el-descriptions :column="3" border v-if="viewData.acceptTime || viewData.decisionContent">
|
||||
<el-descriptions-item label="受理人">{{ viewData.acceptUserName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="受理时间">{{ viewData.acceptTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="处理决定">{{ decisionTypeText(viewData.decisionType) }}</el-descriptions-item>
|
||||
<el-descriptions-item label="决定日期">{{ viewData.decisionDate }}</el-descriptions-item>
|
||||
<el-descriptions-item label="决定内容" :span="3">
|
||||
<div class="text-left" v-html="viewData.decisionContent"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="事实理由及依据" :span="3">
|
||||
<div class="text-left" v-html="viewData.legalBasis"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="决定书附件" :span="3">
|
||||
<file-preview :files="viewData.decisionFiles" complete_result></file-preview>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<div class="process-title mt10" v-if="viewData.executeTime || viewData.executeContent">执行情况</div>
|
||||
<el-descriptions :column="3" border v-if="viewData.executeTime || viewData.executeContent">
|
||||
<el-descriptions-item label="执行人">{{ viewData.executeUserName }}</el-descriptions-item>
|
||||
<el-descriptions-item label="执行时间">{{ viewData.executeTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="执行状态">{{ viewData.state }}</el-descriptions-item>
|
||||
<el-descriptions-item label="执行情况" :span="3">
|
||||
<div class="text-left" v-html="viewData.executeContent"></div>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="执行附件" :span="3">
|
||||
<file-preview :files="viewData.executeFiles" complete_result></file-preview>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
|
||||
<template v-for="task in doneTasks">
|
||||
<div class="mt10" :key="task.id">
|
||||
<div class="process-title">{{ task.displayName }}</div>
|
||||
<el-descriptions border class="flow-task-form" :column="3">
|
||||
<el-descriptions-item label="办理用户">
|
||||
{{ task.taskFormData && task.taskFormData.userName ? task.taskFormData.userName : task.ext.initiatorName }}
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
|
||||
<el-descriptions-item label="办理结果">
|
||||
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="办理意见" :span="3" v-if="task.taskFormData && task.taskFormData.tf_opinion">
|
||||
<div v-html="task.taskFormData.tf_opinion"></div>
|
||||
</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
</div>
|
||||
</template>
|
||||
</div>
|
||||
`,
|
||||
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
|
||||
data() {
|
||||
return {
|
||||
viewData: {},
|
||||
doneTasks: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(row) {
|
||||
this.viewData = {...row}
|
||||
this.getDoneTasks()
|
||||
},
|
||||
getDoneTasks() {
|
||||
if (!this.viewData.id) {
|
||||
this.doneTasks = []
|
||||
return
|
||||
}
|
||||
this.$axios.post("/flow/common/doneTasks", {bizId: this.viewData.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.doneTasks = res.data || []
|
||||
}
|
||||
})
|
||||
},
|
||||
decisionTypeText(value) {
|
||||
const map = {
|
||||
MAINTAIN: "维持原处理决定",
|
||||
REPROCESS: "责令重新处理",
|
||||
REPROCESS_PART: "责令部分重新处理",
|
||||
OTHER: "其他"
|
||||
}
|
||||
return map[value] || value || ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" style="width: 100%" placeholder="请选择年度"></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="申诉类型">
|
||||
<el-select v-model="pageForm.appealTypeId" filterable clearable style="width: 100%" placeholder="请选择申诉类型">
|
||||
<el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="申诉标题">
|
||||
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入申诉标题" @keyup.enter.native="doSearch"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool :app="this" label="审批列表">
|
||||
<el-radio-group @change="doSearch" class="mr5" size="small" v-model="pageForm.approval">
|
||||
<el-radio-button :label="true">已审核</el-radio-button>
|
||||
<el-radio-button :label="false">未审核</el-radio-button>
|
||||
</el-radio-group>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" :size="tableSize" @sort-change="pageOrder" ref="table" row-key="taskId" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="60" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="title" label="申诉标题" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="userName" label="申诉人" width="100"></el-table-column>
|
||||
<el-table-column prop="appealTypeName" label="申诉类型" width="140"></el-table-column>
|
||||
<el-table-column prop="defendantUnitName" label="被申诉单位" width="180" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="applyDate" label="申请日期" width="120"></el-table-column>
|
||||
<el-table-column prop="curTaskName" label="当前节点" width="120"></el-table-column>
|
||||
<el-table-column prop="instanceState" label="流程状态" width="120">
|
||||
<template slot-scope="{row}">
|
||||
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="200">
|
||||
<template slot-scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="onOpen(row)">查看</el-button>
|
||||
<el-button size="mini" type="primary" v-if="row.taskState === 10" @click="onDeal(row)">审核</el-button>
|
||||
<el-button size="mini" type="danger" v-if="row.canRevoke" @click="onRevoke(row)">撤回</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<appeal-info ref="infoRef"></appeal-info>
|
||||
</template>
|
||||
</guava>
|
||||
|
||||
<el-dialog title="执行反馈" :visible.sync="dialogVisible" width="900px" :close-on-click-modal="false">
|
||||
<el-form :model="formData" ref="formRef" label-width="120px">
|
||||
<el-form-item label="申诉标题">
|
||||
<el-input v-model="formData.title" disabled></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="执行情况" prop="executeContent" :rules="[{required:true,message:'请输入执行情况',trigger:'blur'}]">
|
||||
<text-editor v-model="formData.executeContent"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="执行附件" prop="executeFiles">
|
||||
<file-upload :value.sync="formData.executeFiles" :upload_number="5" upload_mode="drag" upload_result_category="array" complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer">
|
||||
<el-button @click="dialogVisible=false">取消</el-button>
|
||||
<el-button type="primary" @click="doExecute">提交</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
<!--#include("../common/info.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"appeal-info": APPEAL_INFO
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
approval: false
|
||||
},
|
||||
typeOptions: [],
|
||||
dialogVisible: false,
|
||||
formData: {},
|
||||
currentTaskId: null
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onOpen(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoRef.onOpen(row)
|
||||
})
|
||||
},
|
||||
onDeal(row) {
|
||||
this.currentTaskId = row.taskId
|
||||
this.$axios.post("/platform/appeal/execute/queryTask", {taskId: row.taskId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.formData = res.data || row
|
||||
this.dialogVisible = true
|
||||
}
|
||||
})
|
||||
},
|
||||
doExecute() {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (!valid) return
|
||||
this.$axios.post("/platform/appeal/execute/execute", {
|
||||
data: JSON.stringify(this.formData),
|
||||
taskId: this.currentTaskId
|
||||
}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.dialogVisible = false
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
onRevoke(row) {
|
||||
this.$confirm("您确定要撤回吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "info"
|
||||
}).then(() => {
|
||||
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
loadTypeOptions() {
|
||||
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
|
||||
if (res.code === 0) this.typeOptions = res.data || []
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadTypeOptions()
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,128 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" style="width: 100%" placeholder="请选择年度"></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="申诉类型">
|
||||
<el-select v-model="pageForm.appealTypeId" filterable clearable style="width: 100%" placeholder="请选择申诉类型">
|
||||
<el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="申诉标题">
|
||||
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入申诉标题" @keyup.enter.native="doSearch"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never">
|
||||
<table-tool>
|
||||
<el-button type="primary" size="small" icon="el-icon-plus" @click="onWrite">提交申诉</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="60" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="title" label="申诉标题" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="appealTypeName" label="申诉类型" width="140"></el-table-column>
|
||||
<el-table-column prop="defendantUnitName" label="被申诉单位" width="180" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="applyDate" label="申请日期" width="120"></el-table-column>
|
||||
<el-table-column prop="state" label="业务状态" width="110">
|
||||
<template slot-scope="{row}">
|
||||
<el-tag size="mini">{{ row.state || '草稿' }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="taskName" label="当前节点" width="120"></el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="260">
|
||||
<template slot-scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="onOpen(row)">查看</el-button>
|
||||
<el-button size="mini" type="primary" v-if="canEdit(row)" @click="onEdit(row)">修改</el-button>
|
||||
<el-button size="mini" type="warning" v-if="row.canRevoke" @click="onRevoke(row)">撤回</el-button>
|
||||
<el-button size="mini" type="danger" v-if="!row.instanceId || row.state === '草稿'" @click="onDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<appeal-info ref="infoRef"></appeal-info>
|
||||
</template>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
<!--#include("../common/info.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"appeal-info": APPEAL_INFO
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString()
|
||||
},
|
||||
typeOptions: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onWrite() {
|
||||
window.location.href = "/platform/appeal/write"
|
||||
},
|
||||
onOpen(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoRef.onOpen(row)
|
||||
})
|
||||
},
|
||||
canEdit(row) {
|
||||
return !row.instanceId || row.state === '草稿' || row.state === '退回修改'
|
||||
},
|
||||
onEdit(row) {
|
||||
let url = "/platform/appeal/write?id=" + row.id
|
||||
if (row.startTaskId) {
|
||||
url += "&taskId=" + row.startTaskId
|
||||
}
|
||||
window.location.href = url
|
||||
},
|
||||
onDelete(row) {
|
||||
this.$confirm("您确定删除该申诉吗?", "提示", {type: "warning"}).then(() => {
|
||||
this.$axios.post("/platform/appeal/mine/delete", {id: row.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
onRevoke(row) {
|
||||
this.$confirm("您确定撤回当前申诉吗?", "提示", {type: "warning"}).then(() => {
|
||||
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
loadTypeOptions() {
|
||||
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
|
||||
if (res.code === 0) this.typeOptions = res.data || []
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadTypeOptions()
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,285 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
.appeal-query-page .stat-row {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-row .el-col {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-card {
|
||||
border: 1px solid #ebeef5;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-card .el-card__body {
|
||||
padding: 14px 16px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-card-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
min-height: 72px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-title {
|
||||
color: #606266;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-value {
|
||||
margin-top: 8px;
|
||||
color: #303133;
|
||||
font-size: 28px;
|
||||
font-weight: 600;
|
||||
line-height: 32px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-tip {
|
||||
margin-top: 4px;
|
||||
color: #909399;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-icon {
|
||||
width: 42px;
|
||||
height: 42px;
|
||||
border-radius: 6px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-total .stat-icon {
|
||||
color: #409eff;
|
||||
background: #ecf5ff;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-wait .stat-icon {
|
||||
color: #e6a23c;
|
||||
background: #fdf6ec;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-execute .stat-icon {
|
||||
color: #13c2c2;
|
||||
background: #e6fffb;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-finish .stat-icon {
|
||||
color: #67c23a;
|
||||
background: #f0f9eb;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-maintain .stat-icon {
|
||||
color: #3a8ee6;
|
||||
background: #edf6ff;
|
||||
}
|
||||
|
||||
.appeal-query-page .stat-reprocess .stat-icon {
|
||||
color: #f56c6c;
|
||||
background: #fef0f0;
|
||||
}
|
||||
|
||||
.appeal-query-page .table-card {
|
||||
border-radius: 6px;
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava ref="guava" class="appeal-query-page">
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="年度">
|
||||
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" style="width: 100%" placeholder="请选择年度"></el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="申诉类型">
|
||||
<el-select v-model="pageForm.appealTypeId" filterable clearable style="width: 100%" placeholder="请选择申诉类型">
|
||||
<el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="申诉标题">
|
||||
<el-input v-model="pageForm.searchKeyword" clearable placeholder="请输入申诉标题" @keyup.enter.native="doSearch"></el-input>
|
||||
</search-item>
|
||||
<search-item label="业务状态">
|
||||
<el-select v-model="pageForm.state" clearable style="width: 100%" placeholder="请选择业务状态">
|
||||
<el-option label="待受理" value="待受理"></el-option>
|
||||
<el-option label="退回修改" value="退回修改"></el-option>
|
||||
<el-option label="待执行" value="待执行"></el-option>
|
||||
<el-option label="已办结" value="已办结"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="申诉单位">
|
||||
<el-select v-model="pageForm.unitId" filterable clearable style="width: 100%" placeholder="请选择申诉单位">
|
||||
<el-option v-for="item in unitOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="被申诉单位">
|
||||
<el-select v-model="pageForm.defendantUnitId" filterable clearable style="width: 100%" placeholder="请选择被申诉单位">
|
||||
<el-option v-for="item in unitOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-row :gutter="12" class="stat-row">
|
||||
<el-col v-for="item in statCards" :key="item.prop" :xs="24" :sm="12" :md="8" :lg="4">
|
||||
<el-card shadow="never" class="stat-card" :class="item.className">
|
||||
<div class="stat-card-content">
|
||||
<div>
|
||||
<div class="stat-title">{{ item.title }}</div>
|
||||
<div class="stat-value">{{ statisticValue(item.prop) }}</div>
|
||||
<div class="stat-tip">{{ item.tip }}</div>
|
||||
</div>
|
||||
<div class="stat-icon">
|
||||
<i :class="item.icon"></i>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-card shadow="never" class="table-card">
|
||||
<table-tool label="申诉列表"></table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="60" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="title" label="申诉标题" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="userName" label="申诉人" width="100"></el-table-column>
|
||||
<el-table-column prop="unitName" label="申诉单位" width="170" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="appealTypeName" label="申诉类型" width="140"></el-table-column>
|
||||
<el-table-column prop="defendantUnitName" label="被申诉单位" width="180" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="applyDate" label="申请日期" width="120"></el-table-column>
|
||||
<el-table-column prop="decisionType" label="处理决定" width="130">
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ decisionTypeText(row.decisionType) || '-' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="state" label="业务状态" width="100">
|
||||
<template slot-scope="{row}">
|
||||
<el-tag :type="stateTagType(row.state)" size="mini">{{ row.state || '草稿' }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="instanceState" label="流程状态" width="110">
|
||||
<template slot-scope="{row}">
|
||||
<enum-tag v-if="row.instanceState" :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
|
||||
<span v-else>-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="150">
|
||||
<template slot-scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="onOpen(row)">查看</el-button>
|
||||
<el-button size="mini" type="danger" @click="onDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
|
||||
<template #view>
|
||||
<appeal-info ref="infoRef"></appeal-info>
|
||||
</template>
|
||||
</guava>
|
||||
</div>
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
<!--#include("../common/info.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
components: {
|
||||
"appeal-info": APPEAL_INFO
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
pageForm: {
|
||||
year: new Date().getFullYear().toString()
|
||||
},
|
||||
typeOptions: [],
|
||||
unitOptions: [],
|
||||
statCards: [
|
||||
{title: "申诉总数", prop: "totalCount", tip: "当前筛选范围", icon: "el-icon-document", className: "stat-total"},
|
||||
{title: "待受理", prop: "waitAcceptCount", tip: "委员会待审核", icon: "el-icon-time", className: "stat-wait"},
|
||||
{title: "待执行", prop: "waitExecuteCount", tip: "单位待反馈", icon: "el-icon-s-operation", className: "stat-execute"},
|
||||
{title: "已办结", prop: "finishCount", tip: "流程已结束", icon: "el-icon-finished", className: "stat-finish"},
|
||||
{title: "维持决定", prop: "maintainCount", tip: "维持原处理", icon: "el-icon-circle-check", className: "stat-maintain"},
|
||||
{title: "重新处理", prop: "reprocessCount", tip: "需重新处理", icon: "el-icon-refresh", className: "stat-reprocess"}
|
||||
],
|
||||
statistics: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
statisticValue(prop) {
|
||||
return (this.statistics && this.statistics[prop]) || 0
|
||||
},
|
||||
stateTagType(state) {
|
||||
const map = {
|
||||
"待受理": "warning",
|
||||
"退回修改": "danger",
|
||||
"待执行": "",
|
||||
"已办结": "success"
|
||||
}
|
||||
return map[state] || "info"
|
||||
},
|
||||
decisionTypeText(value) {
|
||||
const map = {
|
||||
"MAINTAIN": "维持原处理",
|
||||
"REPROCESS": "重新处理",
|
||||
"REPROCESS_PART": "部分重新处理",
|
||||
"OTHER": "其他决定"
|
||||
}
|
||||
return map[value] || ""
|
||||
},
|
||||
onOpen(row) {
|
||||
this.$refs.guava.view(() => {
|
||||
this.$refs.infoRef.onOpen(row)
|
||||
})
|
||||
},
|
||||
doSearch() {
|
||||
this.pageNumber = 1
|
||||
this.pageData()
|
||||
this.loadStatistics()
|
||||
},
|
||||
onDelete(row) {
|
||||
this.$confirm("您确定删除该申诉吗?", "提示", {type: "warning"}).then(() => {
|
||||
this.$axios.post("/platform/appeal/query/delete", {id: row.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.pageData()
|
||||
this.loadStatistics()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
loadOptions() {
|
||||
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
|
||||
if (res.code === 0) this.typeOptions = res.data || []
|
||||
})
|
||||
this.$businessTool.listUnit().then((res) => {
|
||||
this.unitOptions = res || []
|
||||
})
|
||||
},
|
||||
loadStatistics() {
|
||||
this.$axios.post("/platform/appeal/query/statistics", this.pageForm).then((res) => {
|
||||
if (res.code === 0) this.statistics = res.data || {}
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.loadOptions()
|
||||
this.pageData()
|
||||
this.loadStatistics()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,111 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<guava>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch">
|
||||
<search-item label="类型名称">
|
||||
<el-input v-model="pageForm.name" clearable placeholder="请输入类型名称" @keyup.enter.native="doSearch"></el-input>
|
||||
</search-item>
|
||||
</search>
|
||||
</el-card>
|
||||
|
||||
<el-card shadow="never">
|
||||
<table-tool>
|
||||
<el-button type="primary" size="small" icon="el-icon-plus" @click="onAdd">新增</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
|
||||
<el-table-column type="index" label="序号" width="60" :index="indexMethod"></el-table-column>
|
||||
<el-table-column prop="name" label="类型名称" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="sort" label="排序" width="100"></el-table-column>
|
||||
<el-table-column prop="enabled" label="是否启用" width="120">
|
||||
<template slot-scope="{row}">
|
||||
<el-tag size="mini" v-if="row.enabled" type="success">是</el-tag>
|
||||
<el-tag size="mini" v-else type="info">否</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" fixed="right" width="160">
|
||||
<template slot-scope="{row}">
|
||||
<el-button size="mini" type="primary" @click="onEdit(row)">编辑</el-button>
|
||||
<el-button size="mini" type="danger" @click="onDelete(row)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</guava>
|
||||
|
||||
<el-dialog :title="formData.id ? '编辑申诉类型' : '新增申诉类型'" :visible.sync="dialogVisible" width="500px" :close-on-click-modal="false">
|
||||
<el-form :model="formData" ref="formRef" label-width="100px">
|
||||
<el-form-item label="类型名称" prop="name" :rules="[{required:true,message:'请输入类型名称',trigger:'blur'}]">
|
||||
<el-input v-model="formData.name" maxlength="100" clearable placeholder="请输入类型名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="排序" prop="sort">
|
||||
<el-input-number v-model="formData.sort" :min="0" controls-position="right" style="width: 100%"></el-input-number>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否启用" prop="enabled">
|
||||
<el-switch v-model="formData.enabled"></el-switch>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<span slot="footer">
|
||||
<el-button @click="dialogVisible=false">取消</el-button>
|
||||
<el-button type="primary" @click="onSubmit">确定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
dialogVisible: false,
|
||||
pageForm: {},
|
||||
formData: {}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
onAdd() {
|
||||
this.formData = {enabled: true, sort: 0}
|
||||
this.dialogVisible = true
|
||||
},
|
||||
onEdit(row) {
|
||||
this.formData = {...row}
|
||||
this.dialogVisible = true
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (!valid) return
|
||||
this.$axios.post("/platform/appeal/type/save", {data: JSON.stringify(this.formData)}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.dialogVisible = false
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
onDelete(row) {
|
||||
this.$confirm("您确定删除该申诉类型吗?", "提示", {type: "warning"}).then(() => {
|
||||
this.$axios.post("/platform/appeal/type/delete", {id: row.id}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
@@ -0,0 +1,215 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<custom-card>
|
||||
<snaker-start slot="header" label="提交申诉" define_key="SSGL"></snaker-start>
|
||||
<el-form :model="formData" :rules="formRules" ref="formRef" label-width="130px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="申诉人" prop="userName">
|
||||
<el-input v-model="formData.userName" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="工号" prop="loginName">
|
||||
<el-input v-model="formData.loginName" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="申请日期" prop="applyDate">
|
||||
<el-date-picker v-model="formData.applyDate" value-format="yyyy-MM-dd" type="date" style="width: 100%" placeholder="请选择申请日期"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="所在单位" prop="unitName">
|
||||
<el-input v-model="formData.unitName" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="岗位" prop="positionName">
|
||||
<el-input v-model="formData.positionName" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="联系电话" prop="mobile">
|
||||
<el-input v-model="formData.mobile" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-form-item label="性别" prop="sex">
|
||||
<el-input v-model="formData.sex" clearable></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="出生年月" prop="birthday">
|
||||
<el-date-picker v-model="formData.birthday" value-format="yyyy-MM-dd" type="date" style="width: 100%" placeholder="请选择出生年月"></el-date-picker>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="政治面貌" prop="political">
|
||||
<el-input v-model="formData.political" clearable maxlength="100"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form-item label="住址" prop="address">
|
||||
<el-input v-model="formData.address" clearable maxlength="300"></el-input>
|
||||
</el-form-item>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="申诉类型" prop="appealTypeId">
|
||||
<el-select v-model="formData.appealTypeId" filterable clearable style="width: 100%" @change="onTypeChange">
|
||||
<el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="被申诉单位" prop="defendantUnitId">
|
||||
<el-select v-model="formData.defendantUnitId" filterable clearable style="width: 100%" @change="onUnitChange">
|
||||
<el-option v-for="item in unitOptions" :key="item.id" :label="item.name" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="被申诉单位地址" prop="defendantAddress">
|
||||
<el-input v-model="formData.defendantAddress" clearable maxlength="300"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="被申诉单位电话" prop="defendantContact">
|
||||
<el-input v-model="formData.defendantContact" clearable maxlength="100"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form-item label="申诉标题" prop="title">
|
||||
<el-input v-model="formData.title" clearable maxlength="200" placeholder="请输入申诉标题"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="申诉事项" prop="appealMatter">
|
||||
<text-editor v-model="formData.appealMatter"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="申诉理由" prop="reason">
|
||||
<text-editor v-model="formData.reason"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="申诉要求" prop="request">
|
||||
<text-editor v-model="formData.request"></text-editor>
|
||||
</el-form-item>
|
||||
<el-form-item label="申诉人签名" prop="signature">
|
||||
<pc-signature v-model="formData.signature"></pc-signature>
|
||||
</el-form-item>
|
||||
<el-form-item label="附件" prop="files">
|
||||
<file-upload :value.sync="formData.files" :upload_number="5" upload_mode="drag" upload_result_category="array" complete_result></file-upload>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template slot="footer">
|
||||
<el-button type="primary" @click="onSave">保存</el-button>
|
||||
<el-button type="primary" @click="onSubmit">{{ hasTaskId() ? '提交' : '提交申诉' }}</el-button>
|
||||
</template>
|
||||
</custom-card>
|
||||
</div>
|
||||
|
||||
<script nonce="${cspNonce!}">
|
||||
new Vue({
|
||||
el: "#app",
|
||||
store,
|
||||
data() {
|
||||
return {
|
||||
typeOptions: [],
|
||||
unitOptions: [],
|
||||
taskId: null,
|
||||
formData: {},
|
||||
formRules: {
|
||||
appealTypeId: [{required: true, message: "请选择申诉类型", trigger: "change"}],
|
||||
defendantUnitId: [{required: true, message: "请选择被申诉单位", trigger: "change"}],
|
||||
title: [{required: true, message: "请输入申诉标题", trigger: "blur"}],
|
||||
appealMatter: [{required: true, message: "请输入申诉事项", trigger: "blur"}],
|
||||
reason: [{required: true, message: "请输入申诉理由", trigger: "blur"}],
|
||||
request: [{required: true, message: "请输入申诉要求", trigger: "blur"}],
|
||||
signature: [{required: true, message: "请完成申诉人签名", trigger: ["blur", "change"]}]
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
queryParam(name) {
|
||||
return new URLSearchParams(window.location.search).get(name)
|
||||
},
|
||||
loadOptions() {
|
||||
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
|
||||
if (res.code === 0) this.typeOptions = res.data || []
|
||||
})
|
||||
this.$businessTool.listUnit().then((res) => {
|
||||
this.unitOptions = res || []
|
||||
})
|
||||
},
|
||||
loadCurrentUser() {
|
||||
this.$axios.post("/platform/appeal/write/currentUserInfo").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.formData = Object.assign({}, res.data, this.formData)
|
||||
}
|
||||
})
|
||||
},
|
||||
loadInfo(id) {
|
||||
this.$axios.post("/platform/appeal/write/info", {id}).then((res) => {
|
||||
if (res.code === 0 && res.data) {
|
||||
this.formData = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
onTypeChange(val) {
|
||||
const item = this.typeOptions.find((type) => type.id === val)
|
||||
this.$set(this.formData, "appealTypeName", item ? item.name : "")
|
||||
},
|
||||
onUnitChange(val) {
|
||||
const item = this.unitOptions.find((unit) => unit.id === val)
|
||||
this.$set(this.formData, "defendantUnitName", item ? item.name : "")
|
||||
this.$set(this.formData, "defendantAddress", item ? item.address : this.formData.defendantAddress)
|
||||
this.$set(this.formData, "defendantContact", item ? item.telephone : this.formData.defendantContact)
|
||||
},
|
||||
onSave() {
|
||||
this.$axios.post("/platform/appeal/write/save", {data: JSON.stringify(this.formData)}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
this.formData = res.data
|
||||
}
|
||||
})
|
||||
},
|
||||
onSubmit() {
|
||||
this.$refs.formRef.validate((valid) => {
|
||||
if (!valid) return
|
||||
const url = this.hasTaskId() ? "/platform/appeal/write/submitAgain" : "/platform/appeal/write/submit"
|
||||
this.$confirm("您确定提交该申诉吗?", "提示", {type: "warning"}).then(() => {
|
||||
this.$axios.post(url, {data: JSON.stringify(this.formData), taskId: this.taskId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.$message.success(res.msg)
|
||||
window.location.href = "/platform/appeal/mine"
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
},
|
||||
hasTaskId() {
|
||||
return !!this.taskId && this.taskId !== "undefined" && this.taskId !== "null"
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.taskId = this.queryParam("taskId")
|
||||
const id = this.queryParam("id")
|
||||
this.loadOptions()
|
||||
if (id) {
|
||||
this.loadInfo(id)
|
||||
} else {
|
||||
this.loadCurrentUser()
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
Reference in New Issue
Block a user