commit
This commit is contained in:
+492
-183
@@ -2,7 +2,251 @@
|
||||
layout("/layouts/platform_h5.html"){
|
||||
#-->
|
||||
|
||||
<style>
|
||||
<style id="style-proposal-write-h5">
|
||||
.proposal-write-page {
|
||||
--proposal-primary: #1677ee;
|
||||
--proposal-text: #263548;
|
||||
--proposal-muted: #8995a5;
|
||||
min-height: 100%;
|
||||
padding-bottom: calc(84px + env(safe-area-inset-bottom));
|
||||
box-sizing: border-box;
|
||||
background: #f3f7fc;
|
||||
color: var(--proposal-text);
|
||||
}
|
||||
|
||||
.proposal-hero {
|
||||
position: relative;
|
||||
height: 116px;
|
||||
padding: 18px 18px 0;
|
||||
box-sizing: border-box;
|
||||
overflow: hidden;
|
||||
background-color: #edf5ff;
|
||||
background-image: url("/assets/mobile/img/home/v4/hero-campus.png");
|
||||
background-position: 66% 46%;
|
||||
background-size: cover;
|
||||
}
|
||||
|
||||
.proposal-hero::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: rgba(242, 247, 255, 0.76);
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.proposal-hero__content {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.proposal-hero__title {
|
||||
margin: 0;
|
||||
color: var(--proposal-primary);
|
||||
font-size: 23px;
|
||||
line-height: 30px;
|
||||
font-weight: 700;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.proposal-hero__subtitle {
|
||||
margin-top: 2px;
|
||||
color: #718096;
|
||||
font-size: 11px;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.proposal-main {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
margin-top: -43px;
|
||||
padding: 0 15px;
|
||||
}
|
||||
|
||||
.proposal-notice {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
min-height: 62px;
|
||||
margin-bottom: 11px;
|
||||
padding: 12px 11px;
|
||||
box-sizing: border-box;
|
||||
border: 1px solid #dfeafb;
|
||||
border-radius: 9px;
|
||||
background: rgba(246, 250, 255, 0.97);
|
||||
box-shadow: 0 3px 10px rgba(53, 98, 154, 0.08);
|
||||
}
|
||||
|
||||
.proposal-notice__icon {
|
||||
flex: none;
|
||||
margin: 1px 9px 0 0;
|
||||
color: var(--proposal-primary);
|
||||
font-size: 19px;
|
||||
}
|
||||
|
||||
.proposal-notice__body {
|
||||
min-width: 0;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.proposal-notice__title {
|
||||
color: #3673bd;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.proposal-notice__text {
|
||||
margin-top: 2px;
|
||||
color: #8a97a8;
|
||||
font-size: 10px;
|
||||
line-height: 17px;
|
||||
}
|
||||
|
||||
.proposal-notice__link {
|
||||
align-self: center;
|
||||
flex: none;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-left: 8px;
|
||||
padding: 4px 0;
|
||||
border: 0;
|
||||
background: transparent;
|
||||
color: var(--proposal-primary);
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.proposal-card {
|
||||
margin-bottom: 11px;
|
||||
overflow: hidden;
|
||||
border: 1px solid #e9eff7;
|
||||
border-radius: 10px;
|
||||
background: #fff;
|
||||
box-shadow: 0 3px 11px rgba(51, 87, 126, 0.08);
|
||||
}
|
||||
|
||||
.proposal-card__title {
|
||||
position: relative;
|
||||
margin: 0;
|
||||
padding: 12px 14px 8px 21px;
|
||||
color: #354255;
|
||||
font-size: 13px;
|
||||
line-height: 20px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.proposal-card__title::before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 15px;
|
||||
bottom: 11px;
|
||||
left: 12px;
|
||||
width: 2px;
|
||||
border-radius: 2px;
|
||||
background: var(--proposal-primary);
|
||||
}
|
||||
|
||||
.proposal-card .van-cell-group {
|
||||
margin: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.proposal-card .van-cell {
|
||||
min-height: 44px;
|
||||
padding: 10px 14px;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.proposal-card .van-cell:not(:last-child)::after {
|
||||
right: 14px;
|
||||
left: 14px;
|
||||
border-color: #eef2f7;
|
||||
}
|
||||
|
||||
.proposal-card .van-field__label {
|
||||
width: 84px;
|
||||
color: #596779;
|
||||
font-size: 12px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.proposal-card .van-field__value,
|
||||
.proposal-card .van-field__control {
|
||||
color: #4f5d70;
|
||||
font-size: 12px;
|
||||
line-height: 24px;
|
||||
}
|
||||
|
||||
.proposal-card .van-field__control::placeholder {
|
||||
color: #b1bac6;
|
||||
}
|
||||
|
||||
.proposal-card .van-field__word-limit {
|
||||
margin-top: 2px;
|
||||
color: #b5bdc8;
|
||||
font-size: 9px;
|
||||
line-height: 14px;
|
||||
}
|
||||
|
||||
.proposal-card .van-cell--required::before {
|
||||
left: 6px;
|
||||
color: #f06464;
|
||||
}
|
||||
|
||||
.proposal-textarea-field {
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.proposal-textarea-field .van-field__label {
|
||||
padding-top: 1px;
|
||||
}
|
||||
|
||||
.proposal-textarea-field .van-field__control {
|
||||
min-height: 66px;
|
||||
line-height: 20px;
|
||||
}
|
||||
|
||||
.proposal-actions {
|
||||
position: fixed;
|
||||
z-index: 100;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
display: flex;
|
||||
gap: 9px;
|
||||
padding: 10px 18px calc(10px + env(safe-area-inset-bottom));
|
||||
border-top: 1px solid #edf1f6;
|
||||
background: rgba(255, 255, 255, 0.98);
|
||||
box-shadow: 0 -4px 14px rgba(50, 78, 112, 0.06);
|
||||
}
|
||||
|
||||
.proposal-actions .van-button {
|
||||
height: 40px;
|
||||
margin: 0;
|
||||
border-radius: 6px;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.proposal-actions .van-button:first-child {
|
||||
flex: 1;
|
||||
color: var(--proposal-primary);
|
||||
border-color: var(--proposal-primary);
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.proposal-actions .van-button:last-child {
|
||||
flex: 1.08;
|
||||
border-color: var(--proposal-primary);
|
||||
background: var(--proposal-primary);
|
||||
box-shadow: 0 4px 10px rgba(22, 119, 238, 0.18);
|
||||
}
|
||||
|
||||
.proposal-actions .van-icon {
|
||||
margin-right: 5px;
|
||||
font-size: 15px;
|
||||
vertical-align: -2px;
|
||||
}
|
||||
|
||||
.suggestion-unit-picker {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
@@ -85,16 +329,62 @@ layout("/layouts/platform_h5.html"){
|
||||
max-width: 100% !important;
|
||||
text-indent: 2em; /* 中文首行缩进更规范 */
|
||||
}
|
||||
|
||||
@media (min-width: 600px) {
|
||||
.proposal-hero__content,
|
||||
.proposal-main {
|
||||
max-width: 520px;
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.proposal-main {
|
||||
margin-top: -43px;
|
||||
}
|
||||
|
||||
.proposal-actions {
|
||||
right: 50%;
|
||||
left: auto;
|
||||
width: 520px;
|
||||
box-sizing: border-box;
|
||||
transform: translateX(50%);
|
||||
}
|
||||
}
|
||||
</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="基本信息">
|
||||
<div class="proposal-write-page">
|
||||
<header class="proposal-hero">
|
||||
<div class="proposal-hero__content">
|
||||
<div>
|
||||
<h1 class="proposal-hero__title">撰写提案</h1>
|
||||
<div class="proposal-hero__subtitle">情系职工 · 真诚服务</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<main class="proposal-main">
|
||||
<!-- 撰写须知保留原配置内容,通过轻量提示卡片进入详情。 -->
|
||||
<div class="proposal-notice">
|
||||
<van-icon class="proposal-notice__icon" name="info-o"></van-icon>
|
||||
<div class="proposal-notice__body">
|
||||
<div class="proposal-notice__title">提案撰写须知</div>
|
||||
<div class="proposal-notice__text">请围绕学校改革发展、内部管理、职工需求等方面,一事一案,提出可行性建议。</div>
|
||||
</div>
|
||||
<button type="button" class="proposal-notice__link" @click="setVisibleState('noticeDialogVisible', true)">
|
||||
查看详情
|
||||
<van-icon name="arrow"></van-icon>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<van-form ref="formRef">
|
||||
<!-- 基本信息:保留当前教代会、代表身份及联系方式等业务字段。 -->
|
||||
<section class="proposal-card">
|
||||
<h2 class="proposal-card__title">一、基本信息</h2>
|
||||
<van-cell-group :border="false">
|
||||
<van-field
|
||||
v-model="formData.createUserName"
|
||||
label="代表姓名"
|
||||
@@ -116,7 +406,7 @@ layout("/layouts/platform_h5.html"){
|
||||
name="sessionName"
|
||||
label="所属教代会"
|
||||
placeholder="请选择所属教代会"
|
||||
@click="showSessionPicker = true"
|
||||
@click="setVisibleState('showSessionPicker', true)"
|
||||
:rules="[{ required: true, message: '请选择所属教代会' }]"
|
||||
></van-field>
|
||||
<van-popup v-model="showSessionPicker" position="bottom">
|
||||
@@ -124,7 +414,7 @@ layout("/layouts/platform_h5.html"){
|
||||
show-toolbar
|
||||
:columns="sessionOptions.map(item => ({text: item.fullName, value: item.id}))"
|
||||
@confirm="onSessionConfirm"
|
||||
@cancel="showSessionPicker = false"
|
||||
@cancel="setVisibleState('showSessionPicker', false)"
|
||||
></van-picker>
|
||||
</van-popup>
|
||||
|
||||
@@ -143,7 +433,7 @@ layout("/layouts/platform_h5.html"){
|
||||
name="committeeName"
|
||||
label="所属委员会"
|
||||
placeholder="请选择所属委员会"
|
||||
@click="showCommitteePicker = true"
|
||||
@click="setVisibleState('showCommitteePicker', true)"
|
||||
:rules="[{ required: true, message: '请选择所属委员会' }]"
|
||||
></van-field>
|
||||
<van-popup v-model="showCommitteePicker" position="bottom">
|
||||
@@ -151,7 +441,7 @@ layout("/layouts/platform_h5.html"){
|
||||
show-toolbar
|
||||
:columns="committeeOptions.map(item => ({text: item.name, value: item.id}))"
|
||||
@confirm="onCommitteeConfirm"
|
||||
@cancel="showCommitteePicker = false"
|
||||
@cancel="setVisibleState('showCommitteePicker', false)"
|
||||
></van-picker>
|
||||
</van-popup>
|
||||
|
||||
@@ -170,10 +460,13 @@ layout("/layouts/platform_h5.html"){
|
||||
placeholder="请输入联系电话"
|
||||
:rules="[{ required: true, message: '请填写联系电话' }]"
|
||||
></van-field>
|
||||
</van-cell-group>
|
||||
</section>
|
||||
|
||||
</van-cell-group>
|
||||
|
||||
<van-cell-group title="提案信息" class="form-group">
|
||||
<!-- 提案内容:字段和校验继续以现有接口及实体定义为准。 -->
|
||||
<section class="proposal-card">
|
||||
<h2 class="proposal-card__title">二、提案内容</h2>
|
||||
<van-cell-group :border="false">
|
||||
<van-field
|
||||
v-model="formData.name"
|
||||
name="name"
|
||||
@@ -192,7 +485,7 @@ layout("/layouts/platform_h5.html"){
|
||||
name="提案方式"
|
||||
label="提案方式"
|
||||
placeholder="请选择提案方式"
|
||||
@click="showSourcePicker = true"
|
||||
@click="setVisibleState('showSourcePicker', true)"
|
||||
:rules="[{ required: true, message: '请选择提案方式' }]"
|
||||
required
|
||||
></van-field>
|
||||
@@ -201,7 +494,7 @@ layout("/layouts/platform_h5.html"){
|
||||
show-toolbar
|
||||
:columns="sourceOptions.map(item => ({text: item.name, value: item.code}))"
|
||||
@confirm="onSourceConfirm"
|
||||
@cancel="showSourcePicker = false"
|
||||
@cancel="setVisibleState('showSourcePicker', false)"
|
||||
></van-picker>
|
||||
</van-popup>
|
||||
|
||||
@@ -212,97 +505,20 @@ layout("/layouts/platform_h5.html"){
|
||||
name="typeName"
|
||||
label="提案类型"
|
||||
placeholder="请选择提案类型"
|
||||
@click="showTypePicker = true"
|
||||
@click="setVisibleState('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"
|
||||
rows="3"
|
||||
autosize
|
||||
placeholder="请输入案由"
|
||||
placeholder="请简要说明需要解决的问题和背景"
|
||||
:rules="[{ required: true, message: '请填写案由' }]"
|
||||
class="proposal-textarea-field"
|
||||
required
|
||||
></van-field>
|
||||
|
||||
@@ -310,17 +526,20 @@ layout("/layouts/platform_h5.html"){
|
||||
v-model="formData.measures"
|
||||
label="建议措施"
|
||||
type="textarea"
|
||||
rows="6"
|
||||
rows="3"
|
||||
autosize
|
||||
placeholder="请输入建议措施"
|
||||
placeholder="请提出具体、可行的建议措施"
|
||||
:rules="[{ required: true, message: '请填写建议措施' }]"
|
||||
class="proposal-textarea-field"
|
||||
required
|
||||
></van-field>
|
||||
</van-cell-group>
|
||||
</section>
|
||||
|
||||
</van-cell-group>
|
||||
|
||||
<!-- 附件上传 -->
|
||||
<van-cell-group title="附件上传" class="form-group">
|
||||
<!-- 附件材料仅使用卡片分组,上传控件保持项目原有样式和结果结构。 -->
|
||||
<section class="proposal-card">
|
||||
<h2 class="proposal-card__title">三、附件材料</h2>
|
||||
<van-cell-group :border="false">
|
||||
<van-field label="附件" name="files" class="direction-column-field">
|
||||
<h5-file-upload
|
||||
slot="input"
|
||||
@@ -332,15 +551,75 @@ layout("/layouts/platform_h5.html"){
|
||||
complete_result
|
||||
></h5-file-upload>
|
||||
</van-field>
|
||||
</van-cell-group>
|
||||
</van-cell-group>
|
||||
</section>
|
||||
|
||||
<!-- 按钮区域 -->
|
||||
<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>
|
||||
<!-- 各选择器沿用原始数据源与回显逻辑。 -->
|
||||
<van-popup v-model="showTypePicker" position="bottom">
|
||||
<van-picker
|
||||
show-toolbar
|
||||
:columns="typeOptions.map(item => ({text: item.name, value: item.id}))"
|
||||
@confirm="onTypeConfirm"
|
||||
@cancel="setVisibleState('showTypePicker', false)"
|
||||
></van-picker>
|
||||
</van-popup>
|
||||
|
||||
<van-popup v-model="showSuggestionUnitPicker" position="bottom" :style="{ height: '70%' }">
|
||||
<div class="suggestion-unit-picker">
|
||||
<div class="picker-toolbar">
|
||||
<button type="button" class="picker-cancel" @click="onSuggestionUnitCancel">取消</button>
|
||||
<div class="picker-title">选择建议承办单位</div>
|
||||
<button type="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
|
||||
></van-checkbox>
|
||||
<span class="option-text">{{ item.name }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</van-cell>
|
||||
</van-cell-group>
|
||||
</van-checkbox-group>
|
||||
</div>
|
||||
</div>
|
||||
</van-popup>
|
||||
</van-form>
|
||||
</main>
|
||||
|
||||
<!-- 保存、首次提交和重新提交继续共用原业务入口。 -->
|
||||
<div class="proposal-actions" v-if="isWriteTime">
|
||||
<van-button plain type="info" :loading="formLoading && loadingAction === 'save'" :disabled="formLoading" @click="onSave">
|
||||
<van-icon name="records"></van-icon>保存草稿
|
||||
</van-button>
|
||||
<van-button type="primary" :loading="formLoading && loadingAction === 'submit'" :disabled="formLoading" @click="onSubmit" v-if="!taskId">
|
||||
<van-icon name="guide-o"></van-icon>提交提案
|
||||
</van-button>
|
||||
<van-button type="primary" :loading="formLoading && loadingAction === 'submitAgain'" :disabled="formLoading" @click="onSubmitAgain" v-else>
|
||||
<van-icon name="guide-o"></van-icon>重新提交
|
||||
</van-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 提案撰写须知弹窗 -->
|
||||
@@ -383,6 +662,8 @@ layout("/layouts/platform_h5.html"){
|
||||
noticeDialogVisible: false,
|
||||
|
||||
isWriteTime: true,
|
||||
formLoading: false,
|
||||
loadingAction: '',
|
||||
|
||||
// 建议承办单位
|
||||
suggestUnitOptions: [],
|
||||
@@ -393,6 +674,16 @@ layout("/layouts/platform_h5.html"){
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 更新页面弹层显示状态,避免在模板事件中直接为 Vue 数据赋值。
|
||||
* @param {String} stateName showSessionPicker、showSourcePicker 等弹层状态字段名。
|
||||
* @param {Boolean} visible true 表示打开,false 表示关闭。
|
||||
* @return {void} 无返回值,仅更新当前页面状态。
|
||||
*/
|
||||
setVisibleState(stateName, visible) {
|
||||
this.$set(this, stateName, visible);
|
||||
},
|
||||
|
||||
// 选择器确认事件
|
||||
onSessionConfirm(value) {
|
||||
this.formData.sessionId = value.value;
|
||||
@@ -462,17 +753,20 @@ layout("/layouts/platform_h5.html"){
|
||||
this.showCommitteePicker = false;
|
||||
},
|
||||
|
||||
async onSave() {
|
||||
// 表单验证
|
||||
try {
|
||||
await this.$refs.formRef.validate();
|
||||
|
||||
// 保存草稿:校验当前表单后保存 ProposalInfo,接口成功时返回提案数据并回到我的提案。
|
||||
onSave() {
|
||||
if (this.formLoading) {
|
||||
return;
|
||||
}
|
||||
this.$refs.formRef.validate().then(() => {
|
||||
this.formLoading = true;
|
||||
this.loadingAction = 'save';
|
||||
this.$toast.loading({
|
||||
message: '保存中...',
|
||||
forbidClick: true,
|
||||
});
|
||||
|
||||
this.$axios.post("/platform/proposal/write/save", {info: JSON.stringify(this.formData)})
|
||||
return this.$axios.post("/platform/proposal/write/save", {info: JSON.stringify(this.formData)})
|
||||
.then((res) => {
|
||||
this.$toast.clear();
|
||||
if (res.code === 0) {
|
||||
@@ -485,29 +779,46 @@ layout("/layouts/platform_h5.html"){
|
||||
.catch(err => {
|
||||
this.$toast.clear();
|
||||
this.$toast.fail('网络错误,请稍后重试');
|
||||
})
|
||||
.finally(() => {
|
||||
this.formLoading = false;
|
||||
this.loadingAction = '';
|
||||
});
|
||||
} catch (error) {
|
||||
// 表单验证失败
|
||||
}).catch((error) => {
|
||||
console.log('表单验证失败', error);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 提交
|
||||
async onSubmit() {
|
||||
try {
|
||||
await this.$refs.formRef.validate();
|
||||
/**
|
||||
* 提交前补充业务校验。
|
||||
* @param {String} briefMessage 案由不足配置字数时展示的完整提示前缀。
|
||||
* @return {Boolean} true 表示可以继续提交,false 表示已经提示并终止提交。
|
||||
*/
|
||||
validateBeforeSubmit(briefMessage) {
|
||||
if (!this.formData.name || this.formData.name.trim().length < 1) {
|
||||
this.$toast("请填写提案名称");
|
||||
return false;
|
||||
}
|
||||
const briefMinLength = Number(this.proposalConfig.briefMinLength || 0);
|
||||
if ((this.formData.brief || '').length < briefMinLength) {
|
||||
this.$toast(briefMessage + briefMinLength + "字");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
},
|
||||
|
||||
if (!this.formData.name || this.formData.name.trim().length < 1) {
|
||||
this.$toast("请填写提案名称");
|
||||
// 首次提交:info 为完整提案 JSON,成功后进入提案流程并返回我的提案。
|
||||
onSubmit() {
|
||||
if (this.formLoading) {
|
||||
return;
|
||||
}
|
||||
this.$refs.formRef.validate().then(() => {
|
||||
if (!this.validateBeforeSubmit("案由最少为")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.formData.brief.length < this.proposalConfig.briefMinLength) {
|
||||
this.$toast("案由" + this.proposalConfig.briefMinLength + "字");
|
||||
return;
|
||||
}
|
||||
|
||||
this.$dialog.confirm({
|
||||
this.formLoading = true;
|
||||
this.loadingAction = 'submit';
|
||||
return this.$dialog.confirm({
|
||||
title: '提示',
|
||||
message: '您确定要提交吗?',
|
||||
}).then(() => {
|
||||
@@ -516,7 +827,7 @@ layout("/layouts/platform_h5.html"){
|
||||
forbidClick: true,
|
||||
});
|
||||
|
||||
this.$axios.post('/platform/proposal/write/submit', {info: JSON.stringify(this.formData)})
|
||||
return this.$axios.post('/platform/proposal/write/submit', {info: JSON.stringify(this.formData)})
|
||||
.then(res => {
|
||||
this.$toast.clear();
|
||||
if (res.code === 0) {
|
||||
@@ -532,29 +843,27 @@ layout("/layouts/platform_h5.html"){
|
||||
});
|
||||
}).catch(() => {
|
||||
// 取消提交
|
||||
}).finally(() => {
|
||||
this.formLoading = false;
|
||||
this.loadingAction = '';
|
||||
});
|
||||
} catch (error) {
|
||||
// 表单验证失败
|
||||
}).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("请填写提案名称");
|
||||
// 重新提交:除完整提案 JSON 外携带 taskId,用于继续当前退回任务。
|
||||
onSubmitAgain() {
|
||||
if (this.formLoading) {
|
||||
return;
|
||||
}
|
||||
this.$refs.formRef.validate().then(() => {
|
||||
if (!this.validateBeforeSubmit("提案内容和依据最少为")) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.formData.brief.length < this.proposalConfig.briefMinLength) {
|
||||
this.$toast("提案内容和依据最少为" + this.proposalConfig.briefMinLength + "字");
|
||||
return;
|
||||
}
|
||||
|
||||
this.$dialog.confirm({
|
||||
this.formLoading = true;
|
||||
this.loadingAction = 'submitAgain';
|
||||
return this.$dialog.confirm({
|
||||
title: '提示',
|
||||
message: '您确定要提交吗?',
|
||||
}).then(() => {
|
||||
@@ -563,7 +872,7 @@ layout("/layouts/platform_h5.html"){
|
||||
forbidClick: true,
|
||||
});
|
||||
|
||||
this.$axios.post('/platform/proposal/write/submitAgain', {
|
||||
return this.$axios.post('/platform/proposal/write/submitAgain', {
|
||||
info: JSON.stringify(this.formData),
|
||||
taskId: this.taskId
|
||||
}).then(res => {
|
||||
@@ -582,11 +891,13 @@ layout("/layouts/platform_h5.html"){
|
||||
});
|
||||
}).catch(() => {
|
||||
// 取消提交
|
||||
}).finally(() => {
|
||||
this.formLoading = false;
|
||||
this.loadingAction = '';
|
||||
});
|
||||
} catch (error) {
|
||||
// 表单验证失败
|
||||
}).catch((error) => {
|
||||
console.log('表单验证失败', error);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 根据当前教代会届次获取允许撰写的提案类型
|
||||
@@ -613,22 +924,20 @@ layout("/layouts/platform_h5.html"){
|
||||
});
|
||||
},
|
||||
|
||||
//教代会change
|
||||
async meetingChange(val) {
|
||||
// 切换届次后清空旧值,并加载新届次允许选择的提案类型
|
||||
// 切换教代会后清空跨届次数据,并按类型、代表团、提案方式、撰写时间的顺序重新加载。
|
||||
meetingChange(val) {
|
||||
this.$set(this.formData, "typeId", null);
|
||||
this.$set(this.formData, "typeName", "");
|
||||
this.typeOptions = [];
|
||||
this.listProposalType();
|
||||
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();
|
||||
this.$set(this.formData, "delegationId", null);
|
||||
this.$set(this.formData, "committeeId", null);
|
||||
this.$set(this.formData, "delegationName", '');
|
||||
this.$set(this.formData, "committeeName", '');
|
||||
return this.listProposalType()
|
||||
.then(() => this.listDelegation())
|
||||
.then(() => this.searchMineDelegation())
|
||||
.then(() => this.listSource())
|
||||
.then(() => this.checkWriteTime());
|
||||
},
|
||||
|
||||
// 获取代表团
|
||||
@@ -642,7 +951,7 @@ layout("/layouts/platform_h5.html"){
|
||||
|
||||
// 建议承办单位
|
||||
listSuggestUnit() {
|
||||
this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
|
||||
return this.$axios.post("/platform/proposal/common/listUnderTake").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.suggestUnitOptions = res.data
|
||||
}
|
||||
@@ -651,26 +960,26 @@ layout("/layouts/platform_h5.html"){
|
||||
|
||||
// 查询开启的教代会
|
||||
listOpenSession(isModify = false) {
|
||||
this.$axios.post("/platform/proposal/common/listOpenSession").then(async (res) => {
|
||||
return this.$axios.post("/platform/proposal/common/listOpenSession").then((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);
|
||||
this.listProposalType();
|
||||
await this.listDelegation();
|
||||
await this.listSource();
|
||||
// 获取代表团
|
||||
await this.searchMineDelegation();
|
||||
// 检查是否在撰写时间内
|
||||
this.checkWriteTime();
|
||||
} else {
|
||||
await this.listDelegation();
|
||||
await this.listSource();
|
||||
this.listProposalType().then(() => {
|
||||
this.echoPicker();
|
||||
});
|
||||
return this.listProposalType()
|
||||
.then(() => this.listDelegation())
|
||||
.then(() => this.listSource())
|
||||
.then(() => this.searchMineDelegation())
|
||||
.then(() => this.checkWriteTime());
|
||||
}
|
||||
// 没有开启的教代会时不继续请求依赖 sessionId 的接口。
|
||||
if (!this.formData.sessionId) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return this.listDelegation()
|
||||
.then(() => this.listSource())
|
||||
.then(() => this.listProposalType())
|
||||
.then(() => this.echoPicker());
|
||||
}
|
||||
});
|
||||
},
|
||||
@@ -700,7 +1009,7 @@ layout("/layouts/platform_h5.html"){
|
||||
|
||||
// 检查是否在撰写时间内
|
||||
checkWriteTime() {
|
||||
this.$axios.post("/platform/proposal/write/checkWriteTime", {sessionId: this.formData.sessionId}).then((res) => {
|
||||
return this.$axios.post("/platform/proposal/write/checkWriteTime", {sessionId: this.formData.sessionId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
if (!res.data) {
|
||||
this.$toast("当前时间不在撰写时间段内");
|
||||
@@ -735,7 +1044,7 @@ layout("/layouts/platform_h5.html"){
|
||||
if (res.code === 0) {
|
||||
res.data.brief=removeHTMLTag(res.data.brief)
|
||||
res.data.measures=removeHTMLTag(res.data.measures)
|
||||
this.formData = res.data;
|
||||
this.$set(this, "formData", res.data);
|
||||
this.listOpenSession(true);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user