first commit

This commit is contained in:
2026-01-08 14:58:16 +08:00
commit 556e5d64aa
9575 changed files with 1621095 additions and 0 deletions
@@ -0,0 +1,240 @@
const PROPOSAL_INFO = {
name: "ProposalInfo",
template: /*language=HTML*/ `
<van-action-sheet v-model="visible" title="查看详情">
<div class="detail-container">
<van-cell-group title="基本信息">
<van-cell title="提案名称">
<div style="font-weight:bold;">
{{ viewData.name }}
</div>
</van-cell>
<van-cell title="提案编号">{{ viewData.code }}</van-cell>
<van-cell title="提案人">{{ viewData.createUserName }}</van-cell>
<van-cell title="提案时间">{{ viewData.createTime }}</van-cell>
<van-cell title="教代会届次">{{ viewData.fullName }}</van-cell>
<van-cell title="提案人单位">{{ viewData.unitName }}</van-cell>
<van-cell :title="viewData.mannerCode!=='W03'?'代表团名称':'委员会名称'">
{{ viewData.mannerCode !== 'W03' ? viewData.delegationName : viewData.committeeName }}
</van-cell>
<van-cell title="提案类别">
{{viewData.typeName}}
</van-cell>
<van-cell title="建议承办单位">
{{viewData.suggestUnits}}
</van-cell>
<van-cell title="立案结果">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="viewData.caseFilingResult"></dict-tag>
</van-cell>
<!--<van-cell title="调研情况" class="direction-column-cell">
<div v-html="viewData.researchFindings"></div>
</van-cell>-->
<van-cell title="提案案由" class="direction-column-cell">
<div v-html="viewData.brief"></div>
</van-cell>
<van-cell title="建议措施" class="direction-column-cell">
<div v-html="viewData.measures"></div>
</van-cell>
<van-cell title="附件" class="direction-column-cell">
<file-preview :files="viewData.files" complete_result></file-preview>
</van-cell>
<!-- <van-cell title="签字">-->
<!-- <div slot="label">-->
<!-- <van-image :src="viewData.signature"-->
<!-- style="width: 100%;height: 150px;border: 1px dashed"></van-image>-->
<!-- </div>-->
<!-- </van-cell>-->
</van-cell-group>
<!--并案信息-->
<van-cell-group title="并案信息" v-if="viewData.merges && viewData.merges.length">
<van-cell v-for="(merge, index) in viewData.merges" :key="merge.id"
:title="(index + 1) + '. ' + merge.name"
:label="'提案编号:' + merge.code + ' | 提案人:' + merge.createUserName + ' | 类别:' + merge.typeName + ' | 代表团:' + merge.delegationName"
is-link
@click="openView(merge)">
</van-cell>
</van-cell-group>
<!--委员会成员意见-->
<template v-if="viewData.commissionerOpinions && viewData.commissionerOpinions.length">
<div class="process-title" style="margin-bottom: 0!important;">
委员会成员意见
</div>
<div v-for="(opinion, index) in viewData.commissionerOpinions" :key="index"
style="margin-bottom: 16px;">
<van-cell :title="opinion.commissionerName + '(' + opinion.commissionerLoginName + ')'"
class="direction-column-cell">
</van-cell>
<van-cell title="立案结果">
<div style="display: flex;justify-content: end;">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="opinion.caseFilingResult"></dict-tag>
<template v-if="opinion.caseFilingType">
(
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="opinion.caseFilingType"></dict-tag>
)
</template>
</div>
</van-cell>
<van-cell title="意见" v-if="opinion.opinionText">
<div>{{ opinion.opinionText }}</div>
</van-cell>
<van-cell title="时间" v-if="opinion.opinionTime">
{{ opinion.opinionTime }}
</van-cell>
</div>
</template>
<template v-for="task in doneTasks">
<van-cell-group :title="task.displayName" v-if="task.ext.isFirstTaskNode">
<van-cell title="申请用户">{{ task.ext.initiatorName }}({{task.ext.initiatorAccount}})
</van-cell>
<van-cell title="申请时间">{{ task.finishTime }}</van-cell>
<van-cell title="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</van-cell>
</van-cell-group>
<!--邀请附议人-->
<van-cell-group :title="task.displayName"
v-else-if="task.taskName === 'invite'">
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="附议人" v-if="task.taskName === 'invite'"
class="direction-column-cell">
<el-table :data="task?.taskFormData?.seconder">
<el-table-column label="姓名" prop="userName"></el-table-column>
<el-table-column label="工号" prop="loginName"></el-table-column>
<el-table-column label="性别" prop="sex"></el-table-column>
<el-table-column label="单位" prop="unitName" show-overflow-tooltip></el-table-column>
<el-table-column label="分工会" prop="unionName"
show-overflow-tooltip></el-table-column>
<el-table-column label="代表团" prop="delegationName"
show-overflow-tooltip></el-table-column>
</el-table>
</van-cell>
</van-cell-group>
<!--提案委员会立案-->
<van-cell-group :title="task.displayName"
v-else-if="task.taskName === 'committee'">
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="立案结果">
<div style="display: flex;justify-content: center">
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_RESULT"
:value="task.ext.tf_caseFilingResult"></dict-tag>
<template v-if="task.ext.tf_caseFilingType">
(
<dict-tag :options="dict.type.PROPOSAL_CASE_FILING_TYPE"
:value="task.ext.tf_caseFilingType"></dict-tag>
)
</template>
</div>
</van-cell>
<van-cell title="主办单位">{{ task.ext.tf_masterUnitName }}</van-cell>
<van-cell title="协办单位">{{ task?.ext?.tf_slaveUnitNameStr }}</van-cell>
</van-cell-group>
<van-cell-group :title="task.displayName" v-else>
<van-cell title="办理单位" v-if="['master_reply','slave_reply'].includes(task.taskName)">
{{task.ext.underTakeName}}
</van-cell>
<van-cell title="办理用户">{{ task.taskFormData.userName }}({{task.taskFormData.loginName}})
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="办理评价" v-if="['feedback'].includes(task.taskName)">
<dict-tag :options="dict.type.PROPOSAL_FEEDBACK"
:value="task.ext.tf_feedback"></dict-tag>
</van-cell>
<van-cell title="办理结果" v-else>
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</van-cell>
<van-cell title="办理意见" v-if="!task.ext.isFirstTaskNode" class="direction-column-cell">
<div v-html="task.taskFormData.tf_opinion"></div>
</van-cell>
</van-cell-group>
</template>
</div>
<slot></slot>
</van-action-sheet>
`,
dicts: ["PROPOSAL_TYPE", "PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE", "PROCESS_TASK_SUBMIT_TYPE", "PROPOSAL_FEEDBACK"],
data() {
return {
visible:false,
viewData: {},
doneTasks: [],
row: null,
originalRow: null, // 用于保存原始数据,支持返回功能
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.visible = true
this.getInfo()
this.getDoneTasks()
},
// 关闭
onClose(){
this.visible = false
},
// 获取申请信息
getInfo() {
this.$axios.post("/platform/proposal/common/proposalInfo", {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 查看提案
openView(row) {
// 如果传入的是并案对象,则打开新的详情页面
if (row && typeof row === 'object' && row.id) {
// 创建一个新的提案详情组件实例来显示并案详情
this.$nextTick(() => {
// 可以通过事件总线或者其他方式来打开新的详情页面
// 这里暂时使用简单的方式,直接在当前组件中显示
const currentRow = this.row;
this.row = row;
this.getInfo();
// 保存原来的数据,以便返回时恢复
this.originalRow = currentRow;
})
} else {
// 原有的逻辑,通过ID查看
this.$nextTick(() => {
if (this.$refs.infoDialogRef) {
this.$refs.infoDialogRef.onOpen(row)
}
})
}
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
}
};
@@ -0,0 +1,202 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="提案查询" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" @change="sessionChange"></van-dropdown-item>
<van-dropdown-item
v-if="pageForm.sessionId"
v-model="pageForm.delegationId"
:options="delegationOptions"
@change="doSearch"
></van-dropdown-item>
<!-- <van-dropdown-item-->
<!-- v-model="pageForm.unionId"-->
<!-- :options="unionOptions"-->
<!-- @change="pageForm.unitId=null;listUnit();doSearch()"-->
<!-- ></van-dropdown-item>-->
<!-- <van-dropdown-item v-model="pageForm.unitId" :options="unitOptions" @change="doSearch"></van-dropdown-item>-->
<!-- <van-dropdown-item v-model="pageForm.undertakeUnitId" :options="underTakeOptions" @change="doSearch"></van-dropdown-item>-->
<!-- <van-dropdown-item ref="moreDropItem" title="筛选" multiple :options="moreOptions" @change="doSearch"></van-dropdown-item>-->
</van-dropdown-menu>
</van-sticky>
<div>
<van-list v-if="tableData.length>0" v-model="tableLoading" :finished="tableFinished" finished-text="没有更多了" @load="pageData">
<div class="table-list">
<div class="table-card" v-for="row in tableData" :key="row.id+row.processTaskId">
<van-cell>
<template slot="title">
<div class="flex-align">
<span class="font-size3 bold">{{row.name}}</span>
</div>
</template>
</van-cell>
<van-cell title="提案编号" :value="row.code"></van-cell>
<van-cell title="提案人" :value="row.createUserName"></van-cell>
<van-cell title="提案类型" :value="row.typeId"></van-cell>
<van-cell title="届次" :value="row.sessionName"></van-cell>
<van-cell title="代表团" :value="row.delegationName"></van-cell>
<van-cell title="当前节点" :value="row.processInstanceNodeName"></van-cell>
<van-cell class="table-card-footer">
<van-button size="small" @click="openView(row)">查看</van-button>
</van-cell>
</div>
</div>
</van-list>
<van-empty v-else image="/assets/platform/plugins/vant-green/images/nodata/nodata.png" description="暂无数据"></van-empty>
</div>
<van-popup :style="{ height: '100%', width: '100%' }" position="right" safe-area-inset-bottom v-model="infoShow">
<van-sticky>
<van-nav-bar @click-left="infoShow=false" left-arrow left-text="返回" title="提案信息"></van-nav-bar>
</van-sticky>
<div style="height: calc(100vh - 44px); overflow-y: auto">
<info ref="infoRef"></info>
</div>
</van-popup>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
unionId: null,
unitId: null,
delegationId: null
},
tableData: [],
tableLoading: false,
tableFinished: false,
sessionOptions: [],
delegationOptions: [
{
text: "全部代表团",
value: null
}
],
underTakeOptions: [],
unionOptions: [],
unitOptions: [],
moreOptions: {},
id: "",
formValidSuccess: false,
infoShow: false
}
},
components: {
info: H5_PROPOSAL_INFO_COMPONENT
},
methods: {
historyBack,
sessionChange(val) {
this.pageForm.delegationId = null
if (this.pageForm.sessionId) {
this.listDelegation()
} else {
this.delegationOptions = [
{
text: "全部代表团",
value: null
}
]
}
this.doSearch()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({ text: v.fullName, value: v.id })))
}
})
},
listDelegation() {
this.$axios.post("/platform/proposal/common/listDelegation", { sessionId: this.pageForm.sessionId }).then((res) => {
if (res.code === 0) {
this.delegationOptions = [
{
text: "全部代表团",
value: null
}
].concat(res.data.map((v) => ({ text: v.name, value: v.id })))
}
})
},
listUnderTake() {
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
if (res.code === 0) {
this.underTakeOptions = res.data
}
})
},
listUnion() {
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
},
listUnit() {
this.$businessTool.listUnit(this.pageForm.unionId).then((res) => (this.unitOptions = res))
},
openView(row) {
this.infoShow = true
this.$nextTick(() => {
this.$refs.infoRef.onOpen(row.id)
})
},
pageData() {
this.tableLoading = true
this.$axios
.post("/platform/proposal/query/comprehensive/pageData", {
pageForm: JSON.stringify(this.pageForm)
})
.then((resp) => {
this.tableData = this.tableData.concat(resp.data.list)
this.pageForm.totalCount = resp.data.totalCount
if (this.tableData.length >= this.pageForm.totalCount) {
this.tableFinished = true
} else {
this.pageForm.pageNumber++
}
this.tableLoading = false
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.tableData = []
this.pageData()
}
},
created() {
this.pageData()
this.listSession()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,232 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="委员会成员意见" placeholder
fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已审核" name="1"></van-tab>
<van-tab title="未审核" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/commissioner/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.taskName}}</table-column>
<table-column label="委员意见">
<van-tag type="primary">立案:{{row.CONFIRM_FILING_COUNT}}</van-tag>
<van-tag type="warning">建议:{{row.SUGGESTION_COUNT}}</van-tag>
<van-tag>不予立案:{{row.NOT_COUNT}}</van-tag>
</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="!row.pcoId" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>审核</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">提案委员会成员意见</div>
<van-form ref="formRef">
<van-field
v-model="formData.caseFilingResultName"
name="caseFilingResultName"
label="立案结果"
placeholder="请选择立案结果"
:rules="[{ required: true, message: '请选择立案结果' }]"
required
is-link
@click="showCaseFilingResultPicker = true"
></van-field>
<van-popup v-model="showCaseFilingResultPicker" position="bottom">
<van-picker
show-toolbar
:columns="dict.type.PROPOSAL_CASE_FILING_RESULT.map(item => ({text: item.label, value: item.code}))"
@confirm="onCaseFilingResultConfirm"
@cancel="showCaseFilingResultPicker = false"
></van-picker>
</van-popup>
<template v-if="['CONFIRM_FILING'].includes(formData.caseFilingResult)">
<van-field
v-model="formData.caseFilingTypeName"
name="caseFilingTypeName"
label="立案结果"
placeholder="请选择立案类型"
:rules="[{ required: true, message: '请选择立案类型' }]"
required
is-link
@click="showCaseFilingTypePicker = true"
></van-field>
<van-popup v-model="showCaseFilingTypePicker" position="bottom">
<van-picker
show-toolbar
:columns="dict.type.PROPOSAL_CASE_FILING_TYPE.map(item => ({text: item.label, value: item.code}))"
@confirm="onCaseFilingTypeConfirm"
@cancel="showCaseFilingTypePicker = false"
></van-picker>
</van-popup>
</template>
<van-field
v-model="formData.opinion"
name="opinion"
label="审批意见"
placeholder="请输入审批意见"
:rules="[{ required: true, message: '请填写审批意见' }]"
required
maxlength="100"
show-word-limit
></van-field>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button block @click="$refs.proposalInfoRef.onClose()">取消</van-button>
<van-button type="primary" block @click="doSubmit">提交</van-button>
</div>
</div>
</proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
dicts: ["PROPOSAL_CASE_FILING_RESULT", "PROPOSAL_CASE_FILING_TYPE"],
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false,
showCaseFilingResultPicker: false,
showCaseFilingTypePicker: false
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
// 确定立案类型
onCaseFilingResultConfirm(value) {
this.$set(this.formData, "caseFilingResultName", value.text)
this.$set(this.formData, "caseFilingResult", value.value)
this.showCaseFilingResultPicker = false
},
// 确定立案类型
onCaseFilingTypeConfirm(value) {
this.$set(this.formData, "caseFilingTypeName", value.text)
this.$set(this.formData, "caseFilingType", value.value)
this.showCaseFilingTypePicker = false
},
onApproval(row) {
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
proposalId: row.id,
caseFilingResult: null,
caseFilingType: null,
opinion: null
}
},
async doSubmit() {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: '提示',
message: "您确定要提交吗?",
}).then(() => {
this.$axios.post('/platform/proposal/commissioner/doApproval', this.formData).then(res => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
} catch (error) {
}
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,190 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="团长审核" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已审核" name="1"></van-tab>
<van-tab title="未审核" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/delegation/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>审核</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-reply"></i>
<span>撤回</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">{{formData.taskName}}</div>
<van-form ref="formRef">
<van-field
v-model="formData.tf_opinion"
name="tf_opinion"
label="审批意见"
placeholder="请输入审批意见"
:rules="[{ required: true, message: '请填写审批意见' }]"
required
maxlength="100"
show-word-limit
></van-field>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button type="danger" block @click="handleTaskAction(6)">退回</van-button>
<van-button type="danger" block @click="handleTaskAction(2)">不同意</van-button>
<van-button type="primary" block @click="handleTaskAction(1)">同意</van-button>
</div>
</div>
</proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
onApproval(row) {
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
},
async handleTaskAction(val) {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
} catch (error) {
}
},
onRevoke(row){
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
}
})
})
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,267 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="反馈评价" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已评价" name="1"></van-tab>
<van-tab title="未评价" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/feedbackEvaluation/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>评价</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-reply"></i>
<span>撤回</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">{{formData.taskName}}</div>
<van-form ref="formRef">
<van-field
v-model="formData.tf_feedback_name"
name="tf_feedback_name"
label="满意度"
placeholder="请选择满意度"
:rules="[{ required: true, message: '请选择满意度' }]"
required
is-link
@click="showFeedBackPicker = true"
></van-field>
<van-popup v-model="showFeedBackPicker" position="bottom">
<van-picker
show-toolbar
:columns="dict.type.PROPOSAL_FEEDBACK.map(item => ({text: item.label, value: item.code}))"
@confirm="onFeedBackConfirm"
@cancel="showFeedBackPicker = false"
></van-picker>
</van-popup>
<van-field
v-model="formData.tf_opinion"
name="tf_opinion"
label="审批意见"
placeholder="请输入审批意见"
:rules="[{ required: true, message: '请填写审批意见' }]"
required
maxlength="100"
show-word-limit
></van-field>
<template v-if="['SATISFIED','FAIRLY_SATISFIED'].includes(formData.tf_feedback)">
<van-field
v-model="formData.tf_address"
name="tf_address"
label="通讯地址"
placeholder="请输入通讯地址"
:rules="[{ required: true, message: '请输入通讯地址' }]"
required
show-word-limit
></van-field>
<!--联系电话-->
<van-field
v-model="formData.tf_phone"
name="tf_phone"
label="联系电话"
placeholder="请输入联系电话"
:rules="[{ required: true, message: '请输入联系电话' }]"
required
show-word-limit
></van-field>
<!--邮政编码-->
<van-field
v-model="formData.tf_postcode"
name="tf_postcode"
label="邮政编码"
placeholder="请输入邮政编码"
:rules="[{ required: true, message: '请输入邮政编码' }]"
required
show-word-limit
></van-field>
</template>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button type="danger" block @click="$refs.proposalInfoRef.onClose()">取消</van-button>
<van-button type="primary" block @click="handleTaskAction(1)">提交</van-button>
</div>
</div>
</proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
dicts: ["PROPOSAL_FEEDBACK"],
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false,
showFeedBackPicker: false
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
onApproval(row) {
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName,
instanceId: row.instanceId
}
},
onFeedBackConfirm({value, text}) {
this.formData.tf_feedback_name = text
this.formData.tf_feedback = value
this.showFeedBackPicker = false
},
async handleTaskAction(val) {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(async () => {
debugger
const formData = {
...this.formData,
submitType: val
}
// 不满意
if (this.formData.tf_feedback === 'DISSATISFIED') {
const caseInfo = await this.getCaseInfo(this.formData.instanceId)
formData.tf_masterUnitId = caseInfo.tf_masterUnitId
}
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify(formData)
}).then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
} catch (error) {
}
},
// 获取立案信息
async getCaseInfo(instId) {
const {
data,
code
} = await this.$axios.post('/platform/proposal/feedbackEvaluation/caseInfo', {instId})
if (code === 0) {
return data
}
},
onRevoke(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
}
})
})
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,171 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="我的提案" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
:reverse-color="false"
:show-action="false"
@search="doSearch"
input-align="left"
placeholder="请输入提案名称搜索"
v-model="pageForm.name"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item :multiple="false" :options="sessionOptions" @change="doSearch"
v-model="pageForm.sessionId"></van-dropdown-item>
</van-dropdown-menu>
</van-sticky>
<table-list api="/platform/proposal/mine/pageData" :page_form.sync="pageForm" @ready="onReady" ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{ (row.startTaskId) ? row.taskName : '待提交' }}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskKey === 'startTask' || !row.instanceId"
@click="onEdit(row)">
<i class="fa fa-edit"></i>
<span>编辑</span>
</div>
<div class="action-btn"
v-if="row.taskKey === 'invite' || row.taskKey === 'second'"
@click="onInvite(row)">
<i class="fa fa-user-plus"></i>
<span>邀请附议人</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-undo"></i>
<span>撤回</span>
</div>
<div class="action-btn delete" v-if="row.taskKey === 'startTask' || !row.instanceId"
@click="onDelete(row)">
<i class="fa fa-trash"></i>
<span>删除</span>
</div>
</template>
</table-list>
<invite-seconder @refresh="doSearch" ref="inviteSeconderRef"></invite-seconder>
<proposal-info ref="proposalInfoRef"></proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
<!--#include("inviteSeconder.js"){}#-->
const vue = new Vue({
el: "#app",
store,
components: {
"invite-seconder": PROPOSAL_INVITE_SECONDER_COMPONENT,
"proposal-info": PROPOSAL_INFO
},
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
searchKeyword: "",
sessionId: null
},
sessionOptions: [],
infoShow: false
}
},
methods: {
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = res.data
.map((v) => ({
text: v.fullName,
value: v.id
}))
.concat([{text: "全部届次", value: null}])
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
onEdit(row) {
this.$pjaxReplace("/platform/proposal/write/h5?bizId=" + row.id + "&taskId=" + (row.startTaskId || ''))
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
onRevoke(row) {
this.$dialog
.confirm({
title: "提示",
message: "您确定要撤销申请吗?"
})
.then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if(res.code===0){
this.$toast.success(res.msg)
this.doSearch()
}
})
})
},
onDelete(id) {
this.$dialog
.confirm({
title: "提示",
message: "您确定要删除吗?"
})
.then(() => {
this.$axios.post("/platform/proposal/mine/delete", {id}).then((resp) => {
if (resp.code === 0) {
this.$toast.success(resp.msg)
this.doSearch()
}
})
})
},
onInvite(row) {
this.$axios.post("/platform/proposal/mine/inviteCheck", {id: row.id}).then((res) => {
if (res.code === 0) {
this.$refs.inviteSeconderRef.onOpen(row)
}
})
},
onReady() {
this.listSession()
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,158 @@
const PROPOSAL_INVITE_SECONDER_COMPONENT = {
template: `
<van-action-sheet v-model="visible" title="邀请附议人" class="height100">
<van-search
v-model="pageForm.searchKeyword"
:show-action="false"
placeholder="请输入工号或者姓名查询"
@search="doSearch"
></van-search>
<van-tabs v-model="isInvite" @click="isInviteClick">
<van-tab title="已邀请" name="1"></van-tab>
<van-tab title="可邀请" name="0"></van-tab>
</van-tabs>
<van-checkbox-group v-model="tableSelection" v-if="tableData && tableData.length>0">
<van-cell-group >
<van-cell
v-for="(item, index) in tableData"
clickable
:key="item.loginName"
@click="tableRowToggle(index)"
>
<span slot="title">
{{item.userName}}
({{item.loginName}})
</span>
<span slot="label" class="font-size0 van-color-text-assist">
{{item.unitName}}
</span>
<van-checkbox
:name="item"
:ref="'checkboxes'+item.loginName"
slot="right-icon"
v-if="!pageForm.isInvite"></van-checkbox>
</van-cell>
</van-cell-group>
<div class="p10">
<van-pagination
v-model="pageForm.pageNumber"
:total-items="pageForm.totalCount"
:items-per-page="pageForm.pageSize"
@change="pageData"
></van-pagination>
<van-button @click="invite" type="primary" block :disabled="pageForm.isInvite" class="mt10">邀请</van-button>
</div>
</van-checkbox-group>
<van-empty v-else :figure="2"></van-empty>
</van-action-sheet>
`,
data() {
return {
visible: false,
secondedNum: 0,
record: {},
tableData: [],
pageForm: {
pageNumber: 1,
pageSize: 5,
totalCount: 0,
isInvite: false,
searchKeyword: null
},
config: {},
isInvite: "0",
tableSelection: []
}
},
methods: {
async onOpen(record) {
this.visible = true
this.record = record
await this.getConfig()
this.pageData()
},
detail(id) {
},
invite() {
if (this.tableSelection.length === 0) {
this.$toast("请先选择附议人后在点击邀请")
return
}
const loginNames = [...new Set(this.tableSelection.map((s) => s.loginName))]
const userName = [...new Set(this.tableSelection.map((s) => s.userName))]
console.log(this.tableSelection)
this.$dialog.confirm({
title: '提示',
message: "您确定要邀请" + userName.join("、") + "代表附议吗?",
}).then(() => {
this.$axios.post("/platform/proposal/mine/inviteSeconder", {
proposalId: this.record.id,
seconders: JSON.stringify(loginNames)
}).then((res) => {
if (res.code === 0) {
this.pageData()
this.$toast.success(res.msg)
this.tableSelection = []
// this.visible = false
this.$emit("refresh", null)
}
})
}).catch(() => {
})
},
pageData() {
this.$axios.post("/platform/proposal/mine/listSeconder", {
...this.pageForm,
sessionId: this.record.sessionId,
proposalId: this.record.id
})
.then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
this.echoCheckBox()
}
})
},
// 翻页回显勾选
echoCheckBox() {
this.$nextTick(() => {
this.tableData.forEach((item) => {
const checkboxRef = this.$refs['checkboxes' + item.loginName]
if (checkboxRef && this.tableSelection.map((s) => s.loginName).includes(item.loginName)) {
checkboxRef[0].toggle()
}
})
})
},
doSearch() {
this.pageForm.pageNumber = 1
this.pageData()
},
isInviteClick(index, title) {
this.pageForm.isInvite = index === "1"
this.doSearch()
},
tableRowToggle(index) {
console.log(index)
},
async getConfig() {
const {code, data} = await this.$axios.post("/platform/proposal/common/config")
if (code === 0) {
this.config = data
}
}
}
}
@@ -0,0 +1,197 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="分管校领导审批" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已审核" name="1"></van-tab>
<van-tab title="未审核" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/schoolLeaderApproval/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>审核</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-reply"></i>
<span>撤回</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">{{formData.taskName}}</div>
<van-form ref="formRef">
<van-field
v-model="formData.tf_opinion"
name="tf_opinion"
label="审批意见"
placeholder="请输入审批意见"
:rules="[{ required: true, message: '请填写审批意见' }]"
required
maxlength="100"
show-word-limit
></van-field>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button type="danger" block @click="handleTaskAction('back')">退回答复</van-button>
<van-button type="primary" block @click="handleTaskAction('agree')">同意答复</van-button>
</div>
</div>
</proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
onApproval(row) {
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskKey: row.taskKey,
taskName: row.taskName,
proposalId: row.id
}
},
async handleTaskAction(val) {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
const formData = {
...this.formData,
tf_approval: val
}
delete formData.taskKey
delete formData.taskName
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify(formData)
}).then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
} catch (error) {
}
},
onRevoke(row){
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
}
})
})
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,182 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="附议提案" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已附议" name="1"></van-tab>
<van-tab title="未附议" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/seconded/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>附议</span>
</div>
<!-- <div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">-->
<!-- <i class="fa fa-reply"></i>-->
<!-- <span>撤回</span>-->
<!-- </div>-->
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">{{formData.taskName}}</div>
<van-form ref="formRef">
<van-field
v-model="formData.tf_opinion"
name="tf_opinion"
label="审批意见"
placeholder="请输入审批意见"
:rules="[{ required: true, message: '请填写审批意见' }]"
required
maxlength="100"
show-word-limit
></van-field>
<!-- <van-field label="签字" name="approvalSignature" v-model="formData.signature" required class="direction-column-field">-->
<!-- <h5-signature v-model="formData.approvalSignature" slot="input"></h5-signature>-->
<!-- </van-field>-->
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button type="danger" block @click="handleTaskAction(20)">不同意</van-button>
<van-button type="primary" block @click="handleTaskAction(1)">同意</van-button>
</div>
</div>
</proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false,
rules: {
approvalSignature: [{required: true, message: "请签字"}]
}
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
onApproval(row) {
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName,
tf_opinion: "同意该提案"
}
},
async handleTaskAction(val) {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
} catch (error) {
}
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,247 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style scoped>
.van-button--small {
height: 26px;
}
</style>
<div id="app">
<van-nav-bar title="承办单位意见" left-text="返回" left-arrow @click-left="historyBack" fixed placeholder></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已反馈" name="1"></van-tab>
<van-tab title="未反馈" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/suggestion/pageData" :page_form.sync="pageForm" ref="tableListRef" title="name" @ready="onReady">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="建议承办单位"> {{ JSON.parse(row.suggestUnits)?.map(item => item).join('') || '' }}</table-column>
<table-column label="意见数">{{row.count}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" @click="openSuggestion(row)" v-if="pageForm.approval === true">
<i class="fa fa-eye"></i>
<span>查看意见</span>
</div>
<div class="action-btn" @click="onAudit(row)">
<i class="fa fa-edit"></i>
<span>反馈意见</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">承办单位意见</div>
<van-form ref="formRef">
<van-field
v-model="formData.result"
name="result"
label="承办意向"
placeholder="请选择承办意向"
:rules="[{ required: true, message: '必填' }]"
required
is-link
@click="showPicker = true"
></van-field>
<van-popup v-model="showPicker" position="bottom">
<van-picker
show-toolbar
:columns="dict.type.UNDERTAKE_SUGGESTION.map(item => item.code)"
@confirm="(val) => {formData.result = val; showPicker = false}"
@cancel="showPicker = false"
></van-picker>
</van-popup>
<van-field
v-model="formData.opinion"
name="opinion"
label="反馈意见"
placeholder="请输入反馈意见"
:rules="[{ required: true, message: '必填' }]"
required
show-word-limit
></van-field>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button block @click="">取消</van-button>
<van-button type="primary" block @click="doSubmit">提交</van-button>
</div>
</div>
</proposal-info>
<van-action-sheet v-model="visible" title="意见信息">
<div class="detail-container">
<van-cell-group :key="index" v-for="item,index in suggestionList">
<template #title>
<div style="display: flex; justify-content: space-between; align-items: center">
<div>{{ '意见' + (index + 1) }}</div>
<div>
<van-button type="danger" @click="onDelete(item)" size="small">删除</van-button>
</div>
</div>
</template>
<van-cell title="反馈人">{{ item.userName }}</van-cell>
<van-cell title="所属单位">{{ item.unitName }}</van-cell>
<van-cell title="反馈时间">{{ item.time }}</van-cell>
<van-cell title="反馈结果">{{ item.result }}</van-cell>
<van-cell title="反馈意见" class="direction-column-cell">
<span v-html="item.opinion"></span>
</van-cell>
</van-cell-group>
</div>
</van-action-sheet>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
new Vue({
el: "#app",
store,
dicts: ["UNDERTAKE_SUGGESTION"],
components: {
"proposal-info": PROPOSAL_INFO
},
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false,
showPicker: false,
suggestionList: [],
visible: false,
}
},
methods: {
onDelete(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要删除吗?"
}).then(() => {
this.$axios.post('/platform/proposal/suggestion/delete', { id: row.id, })
.then(res => {
if(res.code === 0) {
this.$toast.success(res.msg)
this.visible = false
this.doSearch()
} else {
this.$message.fail(res.msg)
}
})
}).catch(() => {})
},
openSuggestion(row) {
this.$axios.post('/platform/proposal/suggestion/selectSuggestion', {
proposalId: row.id,
}).then(res => {
if(res.code === 0) {
this.suggestionList = res.data
if(this.suggestionList.length === 0) {
this.$toast('暂无意见数')
return
}
this.visible = true
} else {
this.$toast.fail(res.msg)
}
})
},
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onAudit(row) {
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
proposalId: row.id,
}
},
async doSubmit() {
try {
await this.$refs.formRef.validate()
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
this.$axios.post("/platform/proposal/suggestion/suggest", this.formData)
.then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {})
} catch (error) {}
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
}
},
})
</script>
<!--#
}
#-->
@@ -0,0 +1,289 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="承办单位答复" placeholder
fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">
<van-tab title="已审核" name="1"></van-tab>
<van-tab title="未审核" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/proposal/unitReply/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="承办单位">{{row.underTakeName}}{{row.underTakeIsMaster ? '主办' : '协办'}}
</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onApproval(row)">
<i class="fa fa-edit"></i>
<span>答复</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-reply"></i>
<span>撤回</span>
</div>
<!--承办单位领导、超级管理员才能转办-->
<div class="action-btn" v-if="!pageForm.approval && $auth.hasRoleOr('SYSADMIN,PROPOSAL_UNIT_LEADER')"
@click="openTransfer(row)">
<i class="fa fa-arrow-right"></i>
<span>转交</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef">
<div v-if="showApprovalForm">
<div class="process-title">{{formData.taskName}}</div>
<van-form ref="formRef">
<van-field :value="formData.underTakeName"
label="承办单位"
readonly></van-field>
<van-field
v-model="formData.tf_implementStateName"
name="tf_implementStateName"
label="落实情况"
placeholder="请选择落实情况"
:rules="[{ required: true, message: '请选择落实情况' }]"
required
is-link
@click="showImplementPicker = true"
></van-field>
<van-popup v-model="showImplementPicker" position="bottom">
<van-picker
show-toolbar
:columns="dict.type.PROPOSAL_REPLY_IMPLEMENT.map(item => ({text: item.label, value: item.code}))"
@confirm="onImplementConfirm"
@cancel="showImplementPicker = false"
></van-picker>
</van-popup>
<van-field
v-model="formData.tf_opinion"
name="tf_opinion"
label="答复内容"
placeholder="请输入答复内容"
:rules="[{ required: true, message: '请填写答复内容' }]"
required
maxlength="100"
show-word-limit
></van-field>
<van-field
v-if="supportCandidate && formData.underTakeIsMaster"
v-model="formData.tf_nextNodeOperatorName"
name="tf_nextNodeOperatorName"
label="校领导"
placeholder="校领导"
:rules="[{ required: true, message: '请选择校领导' }]"
required
is-link
@click="showCandidatesPicker = true"
></van-field>
<van-popup v-model="showCandidatesPicker" position="bottom">
<van-picker
show-toolbar
:columns="candidates.map(item => ({text: item.userName, value: item.userId}))"
@confirm="onCandidatesConfirm"
@cancel="showCandidatesPicker = false"
></van-picker>
</van-popup>
</van-form>
<div style="display: flex; justify-content: space-between; column-gap: 10px; padding: 10px">
<van-button block @click="$refs.proposalInfoRef.onClose()">取消</van-button>
<van-button type="primary" block @click="handleTaskAction(1)">提交</van-button>
</div>
</div>
</proposal-info>
<transfer ref="transferRef"></transfer>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
<!--#include("transfer.js"){}#-->
const vue = new Vue({
el: "#app",
store,
dicts: ['PROPOSAL_REPLY_IMPLEMENT'],
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false,
showImplementPicker: false,
supportCandidate: false,
candidates: [],
showCandidatesPicker: false,
}
},
components: {
"proposal-info": PROPOSAL_INFO,
"transfer": transfer
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
onApproval(row) {
this.loadCandidates(row.taskId)
this.showApprovalForm = true
this.$refs.proposalInfoRef.onOpen(row)
this.formData = {
processTaskId: row.taskId,
taskKey: row.taskKey,
taskName: row.taskName,
proposalId: row.id,
underTakeName: row.underTakeName,
underTakeIsMaster: row.underTakeIsMaster
}
},
// 加载候选人列表
loadCandidates(taskId) {
$.get("/flow/common/candidate", {taskId}).then((res) => {
if (res.code === 0) {
this.candidates = res.data.candidates
this.supportCandidate = res.data.support
}
})
},
onImplementConfirm(value) {
this.$set(this.formData, "tf_implementStateName", value.text)
this.$set(this.formData, "tf_implementState", value.value)
this.showImplementPicker = false
},
onCandidatesConfirm(value) {
this.$set(this.formData, "tf_nextNodeOperatorName", value.text)
this.$set(this.formData, "tf_nextNodeOperator", value.value)
this.showCandidatesPicker = false
},
async handleTaskAction(val) {
try {
await this.$refs.formRef.validate();
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
delete this.formData.underTakeIsMaster
delete this.formData.underTakeName
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.proposalInfoRef.onClose()
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
} catch (error) {
}
},
onRevoke(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
}
})
})
},
// 打开转办
openTransfer(row){
this.$refs.transferRef.openTransfer(row)
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,147 @@
const transfer = {
template: /*language=HTML*/ `
<van-action-sheet v-model="showTransferDialog" title="提案转办">
<div class="transfer-dialog">
<!-- 提案信息 -->
<div class="proposal-info-card">
<div class="info-item"><label>提案编号:</label><span>{{transferForm.code}}</span></div>
<div class="info-item"><label>提案名称:</label><span>{{transferForm.name}}</span></div>
<div class="info-item"><label>代表团:</label><span>{{transferForm.delegationName}}</span></div>
</div>
<!-- 用户选择 -->
<van-field v-model="searchKeyword" label="转交给" placeholder="搜索用户" required readonly @click="showUserList=true"></van-field>
<van-popup v-model="showUserList" position="bottom">
<van-search v-model="keyword" placeholder="搜索用户" @search="selectTransferUser(keyword)" @cancel="showUserList=false"></van-search>
<van-empty v-if="transferUserOptions.length === 0" class="empty-tip">请搜索需要转办的用户</van-empty>
<van-cell v-for="item in transferUserOptions" :key="item.id" :title="item.username" @click="selectUser(item)"></van-cell>
</van-popup>
<!-- 底部按钮 -->
<div class="button-group">
<van-button block plain @click="showTransferDialog = false" class="cancel-btn">取消</van-button>
<van-button block type="info" @click="handleTransfer" class="submit-btn">提交</van-button>
</div>
</div>
</van-action-sheet>
`,
data() {
return {
showTransferDialog: false,
transferForm: {},
transferUserOptions: [],
searchKeyword: '',
showUserList: false,
keyword: ''
}
},
methods: {
openTransfer(row) {
this.showTransferDialog = true
this.transferForm = { taskId: row.taskId, name: row.name, code: row.code, delegationName: row.delegationName }
this.searchKeyword = ''
},
selectUser(item) {
this.transferForm.userId = item.id
this.searchKeyword = item.username
this.showUserList = false
},
selectTransferUser(keyword) {
this.$axios.post("/platform/proposal/unitReply/selectViceUser", {keyword}).then(res => {
if (res.code === 0) this.transferUserOptions = res.data
})
},
// 转办
handleTransfer() {
if (!this.transferForm.userId) {
this.$toast('请选择转交用户')
return
}
const transferUserName = this.transferUserOptions.find(item => item.id === this.transferForm.userId)?.username
const name = this.transferForm.name
this.$dialog.confirm({
title: '提示',
message: `您确定要将` + name + `提案转交给` + transferUserName + `办理吗?`,
confirmButtonText: '确定',
cancelButtonText: '取消'
}).then(() => {
this.$axios.post('/platform/proposal/unitReply/transfer', this.transferForm).then(res => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.showTransferDialog = false
this.doSearch()
}
})
}).catch(() => {
// 取消操作
})
}
},
style: /*language=CSS*/ `
.transfer-dialog {
height: 100%;
background: #fff;
padding: 16px 16px 65px;
}
.proposal-info-card {
background: #f8f9fa;
border-radius: 8px;
padding: 16px;
margin-bottom: 16px;
}
.proposal-info-content {
display: flex;
flex-direction: column;
gap: 12px;
}
.info-item {
display: flex;
flex-direction: column;
gap: 4px;
}
.info-item label {
font-size: 12px;
color: #969799;
}
.info-item span {
font-size: 14px;
color: #323233;
font-weight: 500;
}
.button-group {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 16px;
background: #fff;
border-top: 1px solid #ebedf0;
z-index: 10;
display: flex;
justify-content: space-between;
column-gap: 10px;
padding: 10px
}
.cancel-btn,
.submit-btn {
}
.empty-tip {
text-align: center;
padding: 50px 16px;
color: #969799;
font-size: 14px;
}
`
}
@@ -0,0 +1,111 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="团长审核" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.name"
:show-action="false"
:reverse-color="false"
input-align="left"
placeholder="请输入提案名称搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.sessionId" :options="sessionOptions" :multiple="false"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<!-- <van-tabs v-model="pageForm.approvalText"-->
<!-- @change="(val)=>{this.pageForm.approval = val==='1';this.doSearch();}">-->
<!-- <van-tab title="已审核" name="1"></van-tab>-->
<!-- <van-tab title="未审核" name="0"></van-tab>-->
<!-- </van-tabs>-->
</van-sticky>
<table-list api="/platform/proposal/vice/delegation/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef"
title="name">
<template v-slot="{index,row}">
<table-column label="提案编号">{{row.code}}</table-column>
<table-column label="提案类别">{{row.typeName}}</table-column>
<table-column label="提案人">{{row.createUserName}}</table-column>
<table-column label="代表团">{{row.delegationName}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
</template>
</table-list>
<proposal-info ref="proposalInfoRef"></proposal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
name: null,
sessionId: null,
approvalText: "0",
approval: false
},
sessionOptions: [],
formData: {},
showApprovalForm: false
}
},
components: {
"proposal-info": PROPOSAL_INFO
},
methods: {
onReady() {
this.listSession()
},
listSession() {
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
if (res.code === 0) {
this.sessionOptions = [
{
text: "全部届次",
value: null
}
].concat(res.data.map((v) => ({text: v.fullName, value: v.id})))
if (this.sessionOptions.length > 0) {
this.pageForm.sessionId = this.sessionOptions[0].value
this.doSearch()
}
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.proposalInfoRef.onOpen(row)
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,769 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style>
.suggestion-unit-picker {
height: 100%;
display: flex;
flex-direction: column;
}
.picker-toolbar {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px;
background-color: #f8f8f8;
border-bottom: 1px solid #eee;
}
.picker-cancel, .picker-confirm {
background: none;
border: none;
font-size: 16px;
color: #1989fa;
cursor: pointer;
}
.picker-cancel {
color: #969799;
}
.picker-title {
font-size: 16px;
font-weight: 500;
color: #323233;
}
.search-container {
padding: 12px 16px;
background-color: #fff;
border-bottom: 1px solid #eee;
}
.options-container {
flex: 1;
overflow-y: auto;
background-color: #fff;
}
.option-item {
display: flex;
align-items: center;
width: 100%;
}
.option-text {
margin-left: 12px;
flex: 1;
font-size: 14px;
color: #323233;
}
.van-checkbox {
margin-right: 0;
}
.van-cell {
padding: 12px 16px;
}
.van-cell:active {
background-color: #f2f3f5;
}
.notice-dialog-content {
max-width: 100%;
width: 100%;
padding: 0 16px; /* 左右留白 */
box-sizing: border-box;
}
.notice-dialog-content p {
width: 100% !important;
max-width: 100% !important;
text-indent: 2em; /* 中文首行缩进更规范 */
}
</style>
<div id="app" v-cloak>
<van-nav-bar title="撰写提案" left-text="返回" left-arrow @click-left="historyBack" placeholder fixed z-index="999"
class="custom-nav"></van-nav-bar>
<div class="form-container">
<van-form ref="formRef">
<!-- 基本信息 -->
<van-cell-group title="基本信息">
<van-field
v-model="formData.createUserName"
label="代表姓名"
readonly
:rules="[{ required: true, message: '请填写提案人' }]"
></van-field>
<van-field
v-model="formData.createTime"
label="提案时间"
readonly
:rules="[{ required: true, message: '请填写提案时间' }]"
></van-field>
<van-field
v-model="formData.sessionName"
is-link
readonly
name="sessionName"
label="所属教代会"
placeholder="请选择所属教代会"
@click="showSessionPicker = true"
:rules="[{ required: true, message: '请选择所属教代会' }]"
></van-field>
<van-popup v-model="showSessionPicker" position="bottom">
<van-picker
show-toolbar
:columns="sessionOptions.map(item => ({text: item.fullName, value: item.id}))"
@confirm="onSessionConfirm"
@cancel="showSessionPicker = false"
></van-picker>
</van-popup>
<van-field
v-model="formData.delegationName"
label="所属代表团"
readonly
:rules="[{ required: true, message: '请选择所属代表团' }]"
></van-field>
<van-field
v-if="formData.mannerCode=='W03'"
v-model="formData.committeeName"
is-link
readonly
name="committeeName"
label="所属委员会"
placeholder="请选择所属委员会"
@click="showCommitteePicker = true"
:rules="[{ required: true, message: '请选择所属委员会' }]"
></van-field>
<van-popup v-model="showCommitteePicker" position="bottom">
<van-picker
show-toolbar
:columns="committeeOptions.map(item => ({text: item.name, value: item.id}))"
@confirm="onCommitteeConfirm"
@cancel="showCommitteePicker = false"
></van-picker>
</van-popup>
<van-field
v-model="formData.unitName"
name="mobile"
label="单位"
readonly
:rules="[{ required: true, message: '请填写单位' }]"
></van-field>
<van-field
v-model="formData.mobile"
label="联系电话"
type="tel"
placeholder="请输入联系电话"
:rules="[{ required: true, message: '请填写联系电话' }]"
></van-field>
</van-cell-group>
<van-cell-group title="提案信息" class="form-group">
<van-field
v-model="formData.name"
name="name"
label="提案名称"
placeholder="请输入提案名称"
:rules="[{ required: true, message: '请填写提案名称' }]"
required
maxlength="100"
show-word-limit
></van-field>
<van-field
v-model="formData.sourceName"
is-link
readonly
name="提案方式"
label="提案方式"
placeholder="请选择提案方式"
@click="showSourcePicker = true"
:rules="[{ required: true, message: '请选择提案方式' }]"
required
></van-field>
<van-popup v-model="showSourcePicker" position="bottom">
<van-picker
show-toolbar
:columns="sourceOptions.map(item => ({text: item.name, value: item.code}))"
@confirm="onSourceConfirm"
@cancel="showSourcePicker = false"
></van-picker>
</van-popup>
<van-field
v-model="formData.typeName"
is-link
readonly
name="typeName"
label="提案类别"
placeholder="请选择提案类别"
@click="showTypePicker = true"
:rules="[{ required: true, message: '请选择提案类别' }]"
required
></van-field>
<van-popup v-model="showTypePicker" position="bottom">
<van-picker
show-toolbar
:columns="typeOptions.map(item => ({text: item.name, value: item.id}))"
@confirm="onTypeConfirm"
@cancel="showTypePicker = false"
></van-picker>
</van-popup>
<van-field
:value="formData.suggestUnits.length > 0 ? formData.suggestUnits.join(', ') : ''"
is-link
readonly
name="suggestUnits"
label="建议承办单位"
placeholder="请选择建议承办单位"
@click="showSuggestionUnitPicker = true"
:rules="[{ required: true, message: '请选择建议承办单位' }]"
required
></van-field>
<van-popup v-model="showSuggestionUnitPicker" position="bottom" :style="{ height: '70%' }">
<div class="suggestion-unit-picker">
<!-- 头部工具栏 -->
<div class="picker-toolbar">
<button class="picker-cancel" @click="onSuggestionUnitCancel">取消</button>
<div class="picker-title">选择建议承办单位</div>
<button class="picker-confirm" @click="onSuggestionUnitConfirm">确认</button>
</div>
<!-- 搜索框 -->
<div class="search-container">
<van-search
v-model="suggestionUnitSearchText"
placeholder="搜索承办单位"
@input="onSuggestionUnitSearch"
></van-search>
</div>
<!-- 选项列表 -->
<div class="options-container">
<van-checkbox-group v-model="selectedSuggestionUnits">
<van-cell-group>
<van-cell
v-for="item in filteredSuggestionUnits"
:key="item.id"
clickable
@click="toggleSuggestionUnit(item)"
>
<template #title>
<div class="option-item">
<van-checkbox
:name="item.name"
:checked="selectedSuggestionUnits.includes(item.name)"
@click.stop
/>
<span class="option-text">{{ item.name }}</span>
</div>
</template>
</van-cell>
</van-cell-group>
</van-checkbox-group>
</div>
</div>
</van-popup>
</van-cell-group>
<van-cell-group title="提案内容" class="form-group">
<!--<van-field
v-model="formData.researchFindings"
name="researchFindings"
label="调研情况"
type="textarea"
rows="4"
autosize
placeholder="请输入调研情况"
:rules="[{ required: true, message: '请填写调研情况' }]"
required
></van-field>-->
<van-field
v-model="formData.brief"
label="提案案由"
type="textarea"
rows="6"
autosize
placeholder="请输入案由"
:rules="[{ required: true, message: '请填写案由' }]"
required
></van-field>
<van-field
v-model="formData.measures"
label="建议措施"
type="textarea"
rows="6"
autosize
placeholder="请输入建议措施"
:rules="[{ required: true, message: '请填写建议措施' }]"
required
></van-field>
</van-cell-group>
<!-- 附件上传 -->
<van-cell-group title="附件上传" class="form-group">
<van-field label="附件" name="files" class="direction-column-field">
<h5-file-upload
slot="input"
:value.sync="formData.files"
:upload_number="10"
upload_mode="file"
upload_result_category="array"
upload_result_type="url"
complete_result
></h5-file-upload>
</van-field>
</van-cell-group>
<!-- 按钮区域 -->
<div class="form-actions" v-if="isWriteTime">
<van-button plain type="info" @click="onSave">保存</van-button>
<van-button type="primary" @click="onSubmit" v-if="!taskId">提交</van-button>
<van-button type="primary" @click="onSubmitAgain" v-else>提交</van-button>
</div>
</van-form>
</div>
<!-- 提案撰写须知弹窗 -->
<van-action-sheet v-model="noticeDialogVisible"
title="提案撰写须知"
cancel-text="我已知晓"
close-on-click-action>
<div class="notice-dialog-content" v-html="proposalConfig.writeRemind"></div>
</van-action-sheet>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: '#app',
store,
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
formData: {
suggestUnits: []
},
sessionOptions: [],
sourceOptions: [],
delegationOptions: [],
committeeOptions: [],
typeOptions: [],
showSessionPicker: false,
showSourcePicker: false,
showTypePicker: false,
showCommitteePicker: false,
// 移除不必要的变量声明,这些值现在直接存储在formData对象中
fileList: [],
proposalConfig: {},
noticeDialogVisible: false,
isWriteTime: true,
// 建议承办单位
suggestUnitOptions: [],
showSuggestionUnitPicker: false,
selectedSuggestionUnits: [], // 当前选中的承办单位
suggestionUnitSearchText: '', // 搜索文本
filteredSuggestionUnits: [] // 过滤后的承办单位列表
}
},
methods: {
// 选择器确认事件
onSessionConfirm(value) {
this.formData.sessionId = value.value;
const selectedOption = this.sessionOptions.find(item => item.id === value.value);
if (selectedOption) {
this.$set(this.formData, 'sessionName', selectedOption.fullName);
}
this.showSessionPicker = false;
this.meetingChange(value.value);
},
onSourceConfirm(value) {
this.formData.source = value.value;
this.$set(this.formData, 'sourceName', value.text);
this.showSourcePicker = false;
},
onTypeConfirm(value) {
this.formData.typeId = value.value;
this.$set(this.formData, 'typeName', value.text);
this.showTypePicker = false;
},
onSuggestionUnitConfirm() {
// 将选中的承办单位保存到表单数据中
this.formData.suggestUnits = [...this.selectedSuggestionUnits];
this.showSuggestionUnitPicker = false;
},
onSuggestionUnitCancel() {
// 取消时恢复到之前的选择状态
this.selectedSuggestionUnits = [...this.formData.suggestUnits];
this.suggestionUnitSearchText = '';
this.showSuggestionUnitPicker = false;
},
// 切换承办单位选择状态
toggleSuggestionUnit(item) {
const index = this.selectedSuggestionUnits.indexOf(item.name);
if (index > -1) {
this.selectedSuggestionUnits.splice(index, 1);
} else {
this.selectedSuggestionUnits.push(item.name);
}
},
// 搜索承办单位
onSuggestionUnitSearch(value) {
this.suggestionUnitSearchText = value;
this.filterSuggestionUnits();
},
// 过滤承办单位列表
filterSuggestionUnits() {
if (!this.suggestionUnitSearchText) {
this.filteredSuggestionUnits = this.suggestUnitOptions;
} else {
this.filteredSuggestionUnits = this.suggestUnitOptions.filter(item =>
item.name.toLowerCase().includes(this.suggestionUnitSearchText.toLowerCase())
);
}
},
onCommitteeConfirm(value) {
this.formData.committeeId = value.value;
this.$set(this.formData, 'committeeName', value.text);
this.showCommitteePicker = false;
},
async onSave() {
// 表单验证
try {
await this.$refs.formRef.validate();
this.$toast.loading({
message: '保存中...',
forbidClick: true,
});
this.$axios.post("/platform/proposal/write/save", {info: JSON.stringify(this.formData)})
.then((res) => {
this.$toast.clear();
if (res.code === 0) {
this.$toast.success(res.msg);
pjaxReplace('/platform/proposal/mine/h5')
} else {
this.$toast.fail(res.msg || '保存失败');
}
})
.catch(err => {
this.$toast.clear();
this.$toast.fail('网络错误,请稍后重试');
});
} catch (error) {
// 表单验证失败
console.log('表单验证失败', error);
}
},
// 提交
async onSubmit() {
try {
await this.$refs.formRef.validate();
if (!this.formData.name || this.formData.name.trim().length < 1) {
this.$toast("请填写提案名称");
return;
}
if (this.formData.brief.length < this.proposalConfig.briefMinLength) {
this.$toast("案由" + this.proposalConfig.briefMinLength + "字");
return;
}
this.$dialog.confirm({
title: '提示',
message: '您确定要提交吗?',
}).then(() => {
this.$toast.loading({
message: '提交中...',
forbidClick: true,
});
this.$axios.post('/platform/proposal/write/submit', {info: JSON.stringify(this.formData)})
.then(res => {
this.$toast.clear();
if (res.code === 0) {
this.$toast.success("提交成功");
pjaxReplace('/platform/proposal/mine/h5')
} else {
this.$toast.fail(res.msg || '提交失败');
}
})
.catch(err => {
this.$toast.clear();
this.$toast.fail('网络错误,请稍后重试');
});
}).catch(() => {
// 取消提交
});
} catch (error) {
// 表单验证失败
console.log('表单验证失败', error);
}
},
// 重新提交
async onSubmitAgain() {
try {
await this.$refs.formRef.validate();
if (!this.formData.name || this.formData.name.trim().length < 1) {
this.$toast("请填写提案名称");
return;
}
if (this.formData.brief.length < this.proposalConfig.briefMinLength) {
this.$toast("提案内容和依据最少为" + this.proposalConfig.briefMinLength + "字");
return;
}
this.$dialog.confirm({
title: '提示',
message: '您确定要提交吗?',
}).then(() => {
this.$toast.loading({
message: '提交中...',
forbidClick: true,
});
this.$axios.post('/platform/proposal/write/submitAgain', {
info: JSON.stringify(this.formData),
taskId: this.taskId
}).then(res => {
this.$toast.clear();
if (res.code === 0) {
this.$toast.success("提交成功");
setTimeout(() => {
pjaxReplace('/platform/proposal/mine/h5')
}, 1500);
} else {
this.$toast.fail(res.msg || '提交失败');
}
}).catch(err => {
this.$toast.clear();
this.$toast.fail('网络错误,请稍后重试');
});
}).catch(() => {
// 取消提交
});
} catch (error) {
// 表单验证失败
console.log('表单验证失败', error);
}
},
// 获取提案类别
listProposalType() {
this.$axios.post("/platform/proposal/common/listProposalType").then((res) => {
if (res.code === 0) {
this.typeOptions = res.data;
}
});
},
// 获取配置
getProposalConfig() {
return this.$axios.post("/platform/proposal/common/config").then((res) => {
if (res.code === 0) {
this.proposalConfig = res.data;
}
});
},
//教代会change
async meetingChange(val) {
this.formData.delegationId = null;
this.formData.committeeId = null;
this.formData.delegationName = '';
this.formData.committeeName = '';
await this.listDelegation();
await this.searchMineDelegation();
await this.listSource();
// 检查是否在撰写时间内
this.checkWriteTime();
},
// 获取代表团
listDelegation() {
return this.$axios.post("/platform/proposal/common/listDelegation", {sessionId: this.formData.sessionId}).then((res) => {
if (res.code === 0) {
this.delegationOptions = res.data;
}
});
},
// 建议承办单位
listSuggestUnit() {
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
if (res.code === 0) {
this.suggestUnitOptions = res.data
}
})
},
// 查询开启的教代会
listOpenSession(isModify = false) {
this.$axios.post("/platform/proposal/common/listOpenSession").then(async (res) => {
if (res.code === 0) {
this.sessionOptions = res.data;
if (!isModify && this.sessionOptions && this.sessionOptions.length > 0) {
this.$set(this.formData, "sessionId", this.sessionOptions[0].id);
this.$set(this.formData, "sessionName", this.sessionOptions[0].fullName);
await this.listDelegation();
await this.listSource();
// 获取代表团
await this.searchMineDelegation();
// 检查是否在撰写时间内
this.checkWriteTime();
} else {
await this.listDelegation();
await this.listSource();
this.echoPicker()
}
}
});
},
//查询自己有权限的撰写方式
listSource() {
return this.$axios.post("/platform/proposal/write/listSource", {sessionId: this.formData.sessionId}).then((res) => {
if (res.code === 0) {
this.sourceOptions = res.data;
}
});
},
//查询自己有权限的代表团
searchMineDelegation() {
return this.$axios.post("/platform/proposal/write/searchMineDelegation", {sessionId: this.formData.sessionId}).then((res) => {
if (res.code === 0) {
this.$set(this.formData, "delegationId", res.data);
// 设置代表团名称
const delegation = this.delegationOptions.find(item => item.id === res.data);
if (delegation) {
this.formData.delegationName = delegation.name;
}
}
});
},
// 检查是否在撰写时间内
checkWriteTime() {
this.$axios.post("/platform/proposal/write/checkWriteTime", {sessionId: this.formData.sessionId}).then((res) => {
if (res.code === 0) {
if (!res.data) {
this.$toast("当前时间不在撰写时间段内");
this.isWriteTime = false;
} else {
this.isWriteTime = true;
}
}
});
},
// 回显
echoPicker() {
// 设置选择器显示值
this.$set(this.formData, "sessionName", this.sessionOptions.find(item => item.id === this.formData.sessionId)?.fullName)
const delegation = this.delegationOptions.find(item => item.id === this.formData.delegationId);
this.$set(this.formData, "delegationName", delegation?.name)
const source = this.sourceOptions.find(item => item.code === this.formData.source);
this.$set(this.formData, "sourceName", source?.name)
const type = this.typeOptions.find(item => item.id === this.formData.typeId);
this.$set(this.formData, "typeName", type?.name)
},
init() {
if (this.bizId) {
this.$axios.post("/platform/proposal/write/detail", {id: this.bizId}).then((res) => {
if (res.code === 0) {
this.formData = res.data;
this.listOpenSession(true);
}
});
} else {
this.noticeDialogVisible = true;
this.listOpenSession(false);
// 设置用户信息
this.$set(this.formData, "createUserId", this.$store.state.user.id);
this.$set(this.formData, "createUserName", this.$store.state.user.username);
this.$set(this.formData, "createUserLoginName", this.$store.state.user.loginname);
this.$set(this.formData, "createTime", this.$moment().format("YYYY-MM-DD"));
this.$set(this.formData, "mobile", this.$store.state.user.mobile);
this.$set(this.formData, "unitName", this.$store.state.user.unit?.name);
}
}
},
created() {
this.init();
this.listSuggestUnit();
this.listProposalType();
this.getProposalConfig();
},
watch: {
// 监听suggestUnitOptions变化,初始化过滤列表
suggestUnitOptions: {
handler(newVal) {
this.filteredSuggestionUnits = newVal;
},
immediate: true
},
// 监听选择器显示状态,重置搜索和选择状态
showSuggestionUnitPicker(newVal) {
if (newVal) {
// 打开选择器时,初始化选择状态
this.selectedSuggestionUnits = [...this.formData.suggestUnits];
this.suggestionUnitSearchText = '';
this.filterSuggestionUnits();
}
}
}
})
</script>
<!--#
}
#-->