This commit is contained in:
@jyuhsin
2026-03-26 14:03:21 +08:00
parent c5fbf8576c
commit dc71dc22d8
21 changed files with 585 additions and 509 deletions
@@ -5,6 +5,7 @@ const PROPOSAL_INFO = {
<div class="proposal-info">
<div class="process-title">
提案基础信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<h3 style="text-align: center;font-weight: 600" class="pt10 pb10">
{{ viewData.name }}
@@ -197,6 +198,7 @@ const PROPOSAL_INFO = {
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
@@ -246,6 +248,9 @@ const PROPOSAL_INFO = {
})
},
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId, this.row.instanceId)
}
},
style:
/*language=CSS*/
@@ -68,9 +68,9 @@ layout("/layouts/platform.html"){
v-if="column.visible !== false"
>
<template v-if="column.prop === 'caseFilingResult'" scope="{row}">
<dict-tag v-if="row.taskState!==10"
<dict-tag
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="row.caseFilingResult"></dict-tag>
:value="JSON.parse(row.taskVariable)?.tf_caseFilingResult"></dict-tag>
</template>
<template v-else-if="column.prop === 'merge'" scope="{row}">
<el-tag v-if="row.merge" size="small">是</el-tag>
@@ -148,9 +148,9 @@ layout("/layouts/platform.html"){
></el-option>
</el-select>
</el-form-item>
<el-form-item label="审核意见" prop="approvalOpinion"
<el-form-item label="审核意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.approvalOpinion"></user-opinion-textarea>
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
@@ -44,7 +44,7 @@ layout("/layouts/platform.html"){
<!-- </search-item>-->
</search>
</el-card>
<el-card shadow="never">
<table-tool :columns.sync="tableColumns">
<!-- <el-button type="primary" icon="el-icon-plus" size="small" @click="openMerge">并案审核</el-button>-->
@@ -69,9 +69,9 @@ layout("/layouts/platform.html"){
v-if="column.visible !== false"
>
<template v-if="column.prop === 'caseFilingResult'" scope="{row}">
<dict-tag v-if="row.taskState!==10"
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="row.caseFilingResult"></dict-tag>
<dict-tag
:options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="JSON.parse(row.taskVariable)?.tf_caseFilingResult"></dict-tag>
</template>
<template v-else-if="column.prop === 'merge'" scope="{row}">
<el-tag v-if="row.merge" size="small">是</el-tag>
@@ -93,7 +93,7 @@ layout("/layouts/platform.html"){
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<proposal-info ref="proposalInfoRef" @done-tasks="doneTasks">
<div v-if="showApprovalForm">
@@ -162,7 +162,7 @@ layout("/layouts/platform.html"){
</div>
</proposal-info>
</template>
<template #public>
<merge ref="mergeRef" @close="$refs.guava.index()"></merge>
</template>
@@ -172,7 +172,7 @@ layout("/layouts/platform.html"){
<script nonce="${cspNonce!}">
<!--#include('../../common/info.js'){}#-->
<!--#include('../committeeFiling/merge.js'){}#-->
new Vue({
el: "#app",
store,
@@ -237,7 +237,7 @@ layout("/layouts/platform.html"){
this.$refs.proposalInfoRef.onOpen(row)
})
},
handleTaskAction(val) {
this.$refs.formRef.validate(valid => {
if (!valid) return
@@ -253,7 +253,7 @@ layout("/layouts/platform.html"){
} else {
tf_helpunitreply = 'NO_HELP_UNIT'
}
const loading = createLoading('提交中')
this.$axios.post("/platform/proposal/committeeFilingUnit/executeTask", {
data: JSON.stringify({
@@ -276,7 +276,7 @@ layout("/layouts/platform.html"){
})
})
},
// 打开并案审核
openMerge() {
const selection = this.$refs.tableRef.selection
@@ -293,7 +293,7 @@ layout("/layouts/platform.html"){
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
@@ -311,12 +311,12 @@ layout("/layouts/platform.html"){
})
})
},
// 教代会
async meetingChange(val) {
this.doSearch()
},
// 查询开启的教代会
listOpenSession() {
this.$axios.post("/platform/proposal/common/listOpenSession").then((res) => {
@@ -329,7 +329,7 @@ layout("/layouts/platform.html"){
}
})
},
// 查询承办单位
listUnderTake() {
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
@@ -23,7 +23,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never">
<table-tool :columns.sync="tableColumns">
<el-button class="ml5" icon="el-icon-upload2" plain type="primary"
<el-button class="ml5" icon="el-icon-upload2" type="primary" size="small"
@click="openImport">导入提案
</el-button>
</table-tool>
@@ -21,7 +21,7 @@ layout("/layouts/platform.html"){
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool :columns.sync="tableColumns">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
@@ -58,7 +58,7 @@ layout("/layouts/platform.html"){
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
@@ -74,7 +74,8 @@ layout("/layouts/platform.html"){
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到提案人</el-button>
<el-button @click="handleTaskAction(4)" size="small" type="info">退回到提案人(不审核)</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到提案人(审核)</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">不同意</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意</el-button>
</el-row>
@@ -85,7 +86,7 @@ layout("/layouts/platform.html"){
</div>
<script nonce="${cspNonce!}">
<!--#include('../../common/info.js'){}#-->
new Vue({
el: "#app",
store,
@@ -122,18 +123,19 @@ layout("/layouts/platform.html"){
this.$refs.proposalInfoRef.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
taskName: row.curTaskName,
taskKey: row.taskKey
}
this.$refs.proposalInfoRef.onOpen(row)
})
},
// 查询开启的教代会
listOpenSession() {
this.$axios.post("/platform/proposal/common/listOpenSession").then((res) => {
@@ -142,12 +144,11 @@ layout("/layouts/platform.html"){
if (this.sessionOptions) {
this.$set(this.pageForm, "sessionId", this.sessionOptions[0].id)
this.pageData()
this.listDelegation()
}
}
})
},
handleTaskAction(val) {
this.$refs.formRef.validate(valid => {
if (!valid) return
@@ -156,11 +157,17 @@ layout("/layouts/platform.html"){
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const params = {
...this.formData,
submitType: val,
taskName: 'startTask'
}
if(val === 4) {
params.tf_sourceTaskKey = this.formData.taskKey
params.tf_audit = false
}
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
data: JSON.stringify(params)
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
@@ -170,7 +177,22 @@ layout("/layouts/platform.html"){
})
})
})
}
},
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()
}
})
})
},
}
})
</script>
@@ -108,9 +108,8 @@ layout("/layouts/platform.html"){
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction('back')" size="small" type="danger">退回重新答复
</el-button>
<el-button @click="handleTaskAction('agree')" size="small" type="primary">同意答复</el-button>
<el-button @click="handleTaskAction('back')" size="small" type="danger">退回提委会立案</el-button>
<el-button @click="handleTaskAction('agree')" size="small" type="primary">同意</el-button>
</el-row>
</div>
</proposal-info>
@@ -161,14 +161,14 @@ layout("/layouts/platform.html"){
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
this.updateSecond(val)
this.updateSecond(val, false)
}
})
})
})
},
updateSecond(submitType) {
updateSecond(submitType, flag = true) {
this.$axios.post("/platform/proposal/seconded/updateInfo", {
proposalId: this.row.id,
taskActorUserId: this.row.taskActorUserId,
@@ -177,8 +177,8 @@ layout("/layouts/platform.html"){
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
if(flag) this.$message.success(res.msg)
this.doSearch()
}
})
},
@@ -13,9 +13,9 @@ layout("/layouts/platform.html"){
v-for="item in sessionOptions"></el-option>
</el-select>
</search-item>
<search-item>
<search-item label="名称/编号">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 90%" v-model="pageForm.searchKeyword">
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 110px;"
v-model="pageForm.searchName">
<el-option label="提案名称" value="proposalName"></el-option>
@@ -23,10 +23,10 @@ layout("/layouts/platform.html"){
</el-select>
</el-input>
</search-item>
<search-item>
<search-item label="提案人">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
style="width: 90%" v-model="pageForm.searchKeyword2">
<el-select placeholder="查询类型" slot="prepend" style="width: 100px;"
v-model="pageForm.searchKeyword2">
<el-select placeholder="查询类型" slot="prepend" style="width: 110px;"
v-model="pageForm.searchName2">
<el-option label="提案人" value="su.username"></el-option>
<!-- <el-option label="附议人" value="seconded.username"></el-option>-->
@@ -36,6 +36,7 @@ layout("/layouts/platform.html"){
</search>
</el-card>
<el-card shadow="never">
<table-tool label="提案列表" :columns.sync="tableColumns"></table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column label="序号" width="50" type="index" :index="indexMethod" fixed="left"></el-table-column>
<el-table-column
@@ -60,7 +61,7 @@ layout("/layouts/platform.html"){
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<el-table-column label="操作" fixed="right" width="120px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
</template>
@@ -95,7 +96,7 @@ layout("/layouts/platform.html"){
<script nonce="${cspNonce!}">
<!--#include('../../common/info.js'){}#-->
new Vue({
el: "#app",
store,
@@ -119,8 +120,10 @@ layout("/layouts/platform.html"){
{label: "团长审核", prop: "delegationAudit"},
],
pageForm: {
approval: false
},
approval: false,
searchName: "proposalName",
searchName2: "su.username",
},
showApprovalForm: false,
sessionOptions: []
}
@@ -149,9 +152,6 @@ layout("/layouts/platform.html"){
},
created() {
this.pageData()
// 加载教代会信息
this.listOpenSession()
}
})
</script>
@@ -9,9 +9,7 @@ layout("/layouts/platform.html"){
<el-card shadow="never">
<snaker-start slot="header" label="撰写提案" define_key="JDHTA">
<template slot="header-right-label">
<span style="margin-right: 15px" v-if="!formData.id">
<el-link type="success" @click="openImport">导入</el-link>
</span>
<el-link type="primary" @click="openImport" v-if="!formData.id" style="margin-right: 15px">导入提案</el-link>
</template>
</snaker-start>
<template>
@@ -186,49 +184,52 @@ layout("/layouts/platform.html"){
:close-on-click-modal="false"
width="50%"
>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-row :gutter="24">
<el-col :span="24">
<el-radio-group v-model="importTemplateType">
<el-radio :label="1">excel</el-radio>
<el-radio :label="2">word</el-radio>
</el-radio-group>
</el-col>
</el-row>
<el-row :gutter="24" style="margin-top: 20px;">
<el-col :span="24">
<el-button size="medium" type="" style="width: 200px"
@click="downloadTemplate"
icon="el-icon-download">下载模板
</el-button>
</el-col>
</el-row>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
<el-timeline>
<el-timeline-item timestamp="下载模板" placement="top">
<el-card>
<el-row :gutter="24">
<el-col :span="24">
<el-radio-group v-model="importTemplateType">
<el-radio :label="1">excel</el-radio>
<el-radio :label="2">word</el-radio>
</el-radio-group>
</el-col>
</el-row>
<el-row :gutter="24" style="margin-top: 20px;">
<el-col :span="24">
<el-button size="medium" type="" style="width: 200px"
@click="downloadTemplate"
icon="el-icon-download">下载模板
</el-button>
</el-col>
</el-row>
</el-card>
</el-timeline-item>
<el-timeline-item timestamp="上传文件" placement="top">
<el-card>
<el-upload
name="file"
ref="upload"
:on-remove="(file, fileList) => {
importData.fileList = fileHandleRemove(file, fileList)
}"
:on-change="(file, fileList) => {
:on-change="(file, fileList) => {
if(this.importTemplateType === 2) {
importData.fileList = fileHandleChange(file, fileList,{type:['docx']})
} else {
importData.fileList = fileHandleChange(file, fileList,{type:['xlsx']})
}
}"
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload" style="width: 200px">选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
:auto-upload="false"
:limit="1"
:file-list="importData.fileList">
<el-button size="medium" type="" icon="el-icon-upload" style="width: 200px">选择文件
</el-button>
</el-upload>
</el-card>
</el-timeline-item>
</el-timeline>
<span slot="footer" class="dialog-footer">
<el-button @click="importVisible = false" :disabled="importLoading">取 消</el-button>
<el-button type="primary" @click="doImport" :loading="importLoading">确定</el-button>
@@ -245,14 +246,14 @@ layout("/layouts/platform.html"){
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
// 将 window.location 的引用存储在响应式数据中
location: window.location,
importTemplateType: 1,
importData: {},
importVisible: false,
importLoading: false,
formData: {},
sessionOptions: [],
sourceOptions: [],
@@ -356,7 +357,7 @@ layout("/layouts/platform.html"){
})
}
},
// 打开导入窗口
async openImport() {
this.importData = {
@@ -364,7 +365,7 @@ layout("/layouts/platform.html"){
}
this.importVisible = true;
},
// 下载导入模板
async downloadTemplate() {
let templateType = '.xlsx'
@@ -373,7 +374,7 @@ layout("/layouts/platform.html"){
}
this.location.href='/platform/basics/downloadTemplate?filePath=proposal/proposal' + templateType + '&fileName=教职工代表大会提案表' + templateType
},
// 开始导入数据
async doImport() {
if (!this.importData.fileList.length) {
@@ -517,7 +518,7 @@ layout("/layouts/platform.html"){
}
})
},
// 查询字典 撰写方式
async getDictByCode(code) {
const res = await $.get("/platform/proposal/write/listSourceByCode", {code: code})
@@ -567,7 +568,7 @@ layout("/layouts/platform.html"){
this.$set(this.formData, "mobile", this.$store.state.user.mobile)
this.$set(this.formData, "unitName", this.$store.state.user.unit?.name)
}
// 撰写方式
this.allSourceOptions = await this.getDictByCode("PROPOSAL_SOURCE")
this.sourceOptions = this.allSourceOptions