This commit is contained in:
2026-05-26 16:39:30 +08:00
parent 194aa4ff0a
commit b2dd2681a2
34 changed files with 5058 additions and 785 deletions
@@ -13,6 +13,8 @@
<link rel="stylesheet" href="${base!}/assets/mobile/css/theme.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/main.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/universal-info.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/list-card.css">
<link rel="stylesheet" href="${base!}/assets/mobile/css/pdfh5.css">
@@ -0,0 +1,152 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="校领导审批" fixed placeholder :left-arrow="leftArrow" safe-area-inset-top
@click-left="pjaxReplace('/mobile/proposal/branchLeaderSuffixAudit')"></van-nav-bar>
<proposal-info :proposal_id="proposalId" title="校领导审批" :handle="handle" ref="info">
<template #handle>
<div class="info-section-title">分管校领导审批</div>
<van-form class="info-cell-form">
<div class="info-row" v-if="underTakeNames">
<span class="info-label">承办单位</span>
<span class="info-value is-long">{{underTakeNames}}</span>
</div>
<div class="info-row">
<span class="info-label">审核人</span>
<span class="info-value">{{formData.username}}</span>
</div>
<div class="info-row">
<span class="info-label">审核时间</span>
<span class="info-value">{{formData.auditTime}}</span>
</div>
<div class="info-textarea-field">
<div class="info-textarea-label info-required-label">审批意见</div>
<van-field
v-model="formData.opinion"
rows="4"
autosize
type="textarea"
maxlength="1000"
placeholder="请填写您的审批意见"
show-word-limit
></van-field>
</div>
<van-row class="info-footer-actions" type="flex" gutter="10">
<van-col span="12">
<van-button block class="info-ghost-button" :loading="formLoading"
@click="pjaxReplace('/mobile/proposal/branchLeaderSuffixAudit')">
取消
</van-button>
</van-col>
<van-col span="12">
<van-button :color="themeColor" block class="info-primary-button" :loading="formLoading"
@click="doAudit">
提交
</van-button>
</van-col>
</van-row>
</van-form>
</template>
</proposal-info>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
leftArrow: false,
handle: false,
proposalId: GetQueryString('proposal_id'),
pblsaId: GetQueryString('pblsaId'),
underTakeId: '',
underTakeNames: '',
formLoading: false,
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '同意办结',
sign: '',
proposalId: GetQueryString('proposal_id')
}
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/mobile/ProposalInfo.vue?v=' + new Date().getTime()),
},
methods: {
loadAuditInfo() {
$.get('/mobile/proposal/branchLeaderSuffixAudit/getAuditInfo', {
pblsaId: this.pblsaId
}).then((res) => {
const data = res.data || {}
this.$set(this, 'underTakeId', data.underTakeId || '')
this.$set(this, 'underTakeNames', data.underTakeNames || '')
this.handle = data.stateCode === 700 && data.isAudit !== true
})
},
validateForm() {
if (!this.pblsaId) {
vant.Toast('审批记录不存在')
return false
}
if (!this.formData.opinion) {
vant.Toast('请填写审批意见')
return false
}
return true
},
doAudit() {
if (!this.validateForm() || this.formLoading) {
return
}
vant.Dialog.confirm({
title: '提示',
message: '您确定要提交审批意见吗?',
}).then(() => {
this.formLoading = true
$.post('/mobile/proposal/branchLeaderSuffixAudit/doAudit', {
audit: JSON.stringify(this.formData),
pblsaId: this.pblsaId,
sign: this.formData.sign
}).then((res) => {
if (res.code === 0) {
this.$toast.success('提交成功')
this.handle = false
this.$refs.info.openView(this.proposalId)
} else {
this.$toast.fail(res.msg || '提交失败,请联系管理员')
}
}).always(() => {
this.formLoading = false
})
})
}
},
created() {
if (GetQueryString('mobile')) {
this.leftArrow = true
}
const proposalId = GetQueryString('proposal_id')
const bizKey = GetQueryString('biz_key')
if (proposalId === '' || bizKey === '') {
vant.Dialog.alert({
title: '提示',
message: '非法参数',
showConfirmButton: false
})
return
}
this.loadAuditInfo()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,196 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
title="校领导审批"
left-arrow
placeholder
fixed
@click-left="pjaxReplace('/mobile/index')"
></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="10"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalTypeId" :options="proposalTypeList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalResultCode" :options="resultList"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="全部" name=""></van-tab>
<van-tab title="已审批" name="true"></van-tab>
<van-tab title="待审批" name="false"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}"
@click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<span class="badge" :class="o.isAudit ? 'badge-blue' : 'badge-draft'">
{{o.isAudit ? '已审批' : '待审批'}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="card-item">
<span class="card-label">提案类型:</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案状态:</span>
<span class="card-value">{{o.stateName}}</span>
</div>
<div class="card-item">
<span class="card-label">承办单位:</span>
<span class="card-value">{{o.underTakeNames}}</span>
</div>
</div>
<div class="card-footer" v-if="o.resultName">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName}}</span>
</div>
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
pageForm: {
isAudit: 'false'
},
sessionList: [],
proposalTypeList: [],
resultList: [],
listLoading: false
}
},
methods: {
doSearch() {
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
}
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(row) {
window.location.href = '/mobile/proposal/branchLeaderSuffixAudit/view?biz_key=' + row.id
+ '&proposal_id=' + row.id
+ '&pblsaId=' + row.pblsaId
+ '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalDict'))
.then((res) => {
this.resultList = res.data
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, 'proposalResultCode', this.resultList[0].value)
}
this.onLoad()
})
}
},
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
}
})
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,511 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="提案工作组预立案" fixed placeholder :left-arrow="leftArrow" safe-area-inset-top
@click-left="pjaxReplace('/mobile/proposal/case')"></van-nav-bar>
<proposal-info :proposal_id="proposalId" title="提案工作组预立案" :handle="handle" ref="info">
<template #handle>
<div class="info-section-title">预立案审核</div>
<van-form class="info-cell-form">
<div class="info-row">
<span class="info-label">审核人</span>
<span class="info-value">{{formData.username}}</span>
</div>
<div class="info-row">
<span class="info-label">审核时间</span>
<span class="info-value">{{formData.auditTime}}</span>
</div>
<div class="info-picker-card">
<van-field
:value="resultCodeName"
clickable
input-align="right"
label="立案结果"
label-class="info-picker-label"
name="resultCode"
placeholder="请选择立案结果"
required
readonly
right-icon="arrow"
@click="showResultCodePicker = true"
></van-field>
</div>
<van-popup position="bottom" round v-model="showResultCodePicker">
<van-picker
:columns="resultPickerOptions"
@cancel="showResultCodePicker = false"
@confirm="onResultCodeConfirm"
show-toolbar
></van-picker>
</van-popup>
<div class="info-picker-card">
<van-field
:value="typeName"
clickable
input-align="right"
label="提案类型"
label-class="info-picker-label"
name="typeId"
placeholder="请选择提案类型"
required
readonly
right-icon="arrow"
@click="showTypePicker = true"
></van-field>
</div>
<van-popup position="bottom" round v-model="showTypePicker">
<van-picker
:columns="typePickerOptions"
@cancel="showTypePicker = false"
@confirm="onTypeConfirm"
show-toolbar
></van-picker>
</van-popup>
<div class="info-picker-card" v-if="formData.resultCode=='notGive'">
<van-field
:value="formData.noFilingReason"
clickable
input-align="right"
label="理由列表"
label-class="info-picker-label"
name="noFilingReason"
placeholder="请选择理由列表"
readonly
right-icon="arrow"
@click="showNoFilingReasonPicker = true"
></van-field>
</div>
<van-popup position="bottom" round v-model="showNoFilingReasonPicker">
<van-picker
:columns="noFilingReason"
@cancel="showNoFilingReasonPicker = false"
@confirm="onNoFilingReasonConfirm"
show-toolbar
></van-picker>
</van-popup>
<template v-if="formData.resultCode!='notGive'">
<div class="info-picker-card">
<van-field
:value="hostUnitName"
clickable
input-align="right"
label="主办单位"
label-class="info-picker-label"
name="hostUnit"
placeholder="请选择主办单位"
:required="formData.resultCode !== 'notGive'"
readonly
right-icon="arrow"
@click="openHostUnitPicker"
></van-field>
</div>
<van-popup position="bottom" round v-model="showHostUnitPicker">
<div class="unit-select-toolbar">
<button class="unit-select-cancel" type="button" @click="onHostUnitCancel">取消</button>
<div class="unit-select-title">主办单位</div>
<button class="unit-select-confirm" type="button" @click="onHostUnitConfirm">确定</button>
</div>
<van-search
placeholder="请输入单位名称搜索"
v-model="hostUnitSearchKey"
></van-search>
<van-picker
:columns="hostUnitPickerOptions"
@change="onHostUnitPickerChange"
></van-picker>
<van-empty description="暂无匹配单位" v-if="hostUnitPickerOptions.length === 0"></van-empty>
</van-popup>
<div class="info-row" v-if="formData.hostUnit">
<span class="info-label">主办领导</span>
<span class="info-value is-long">{{hostUnitLeader}}</span>
</div>
<div class="info-picker-card">
<van-field
class="info-multi-value-field"
clickable
input-align="right"
label="协办单位"
label-class="info-picker-label"
name="helpUnit"
placeholder="请选择协办单位"
readonly
right-icon="arrow"
@click="openHelpUnitPicker"
>
<template #input>
<div class="info-multi-value" v-if="helpUnitName">{{helpUnitName}}</div>
<div class="info-multi-value info-multi-placeholder" v-else>请选择协办单位</div>
</template>
</van-field>
</div>
<van-popup position="bottom" round v-model="showHelpUnitPicker">
<div class="unit-select-toolbar">
<button class="unit-select-cancel" type="button" @click="onHelpUnitCancel">取消</button>
<div class="unit-select-title">协办单位</div>
<button class="unit-select-confirm" type="button" @click="onHelpUnitConfirm">确定</button>
</div>
<van-search
placeholder="请输入单位名称搜索"
v-model="helpUnitSearchKey"
></van-search>
<div class="unit-select-list">
<van-checkbox-group v-model="checkedHelpUnit" direction="vertical">
<van-checkbox
v-for="item in filterHelpUnitOptions"
:key="item.id"
:name="item.id"
style="margin: 10px 0"
>
{{item.unitName}}
</van-checkbox>
</van-checkbox-group>
<van-empty description="暂无匹配单位" v-if="filterHelpUnitOptions.length === 0"></van-empty>
</div>
</van-popup>
<div class="info-row" v-if="formData.helpUnit && formData.helpUnit.length>0">
<span class="info-label">协办领导</span>
<span class="info-value is-long">{{helpUnitLeader}}</span>
</div>
</template>
<div class="info-textarea-field">
<div class="info-textarea-label info-required-label">审核意见</div>
<van-field
v-model="formData.opinion"
rows="4"
autosize
type="textarea"
maxlength="500"
placeholder="请填写您的审核意见"
show-word-limit
></van-field>
</div>
<van-row class="info-footer-actions" type="flex" gutter="10">
<van-col span="12">
<van-button block class="info-ghost-button" :loading="formLoading" @click="doAudit(2)">
退回修改
</van-button>
</van-col>
<van-col span="12">
<van-button :color="themeColor" block class="info-primary-button" :loading="formLoading"
@click="doAudit(1)">
提交
</van-button>
</van-col>
</van-row>
</van-form>
</template>
</proposal-info>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
leftArrow: false,
handle: false,
proposalId: GetQueryString('proposal_id'),
formLoading: false,
showResultCodePicker: false,
showTypePicker: false,
showNoFilingReasonPicker: false,
showHostUnitPicker: false,
showHelpUnitPicker: false,
hostUnitSearchKey: '',
helpUnitSearchKey: '',
checkedHostUnit: '',
checkedHelpUnit: [],
resultOptions: [],
typeOptions: [],
unitOptions: [],
noFilingReason: [],
proposalStateCode: null,
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
resultCode: '',
hostUnit: '',
helpUnit: [],
opinion: '经提案工作组审理,该提案返回修改。',
noFilingReason: '',
sign: '',
typeId: '',
determineTypeCode: '',
proposalId: GetQueryString('proposal_id')
}
}
},
computed: {
// 将接口返回的不同字段统一成 Picker 的 text/value 结构,text 用于展示,value 回写原表单提交字段。
resultPickerOptions() {
return this.resultOptions.map(v => {
return {
text: v.name,
value: v.code
}
})
},
typePickerOptions() {
return this.typeOptions.map(v => {
return {
text: v.typeName,
value: v.id
}
})
},
unitPickerOptions() {
return this.unitOptions.map(v => {
return {
text: v.unitName,
value: v.id
}
})
},
hostUnitPickerOptions() {
const key = this.hostUnitSearchKey ? this.hostUnitSearchKey.trim() : ''
return this.unitOptions.filter(v => {
return !key || v.unitName.includes(key)
}).map(v => {
return {
text: v.unitName,
value: v.id
}
})
},
filterHelpUnitOptions() {
const key = this.helpUnitSearchKey ? this.helpUnitSearchKey.trim() : ''
return this.unitOptions.filter(v => {
return !key || v.unitName.includes(key)
})
},
resultCodeName() {
const result = this.resultOptions.find(v => v.code === this.formData.resultCode)
return result ? result.name : ''
},
typeName() {
const type = this.typeOptions.find(v => v.id === this.formData.typeId)
return type ? type.typeName : ''
},
hostUnitName() {
const hostUnit = this.unitOptions.find(v => v.id === this.formData.hostUnit)
return hostUnit ? hostUnit.unitName : ''
},
helpUnitName() {
const helpUnits = this.unitOptions.filter(v => this.formData.helpUnit.includes(v.id)).map(v => v.unitName)
return helpUnits && helpUnits.length > 0 ? helpUnits.toString() : ''
},
hostUnitLeader() {
const hostUnit = this.unitOptions.find(v => v.id === this.formData.hostUnit)
return hostUnit && hostUnit.leader ? hostUnit.leader : '无'
},
helpUnitLeader() {
const helpUnits = this.unitOptions.filter(v => this.formData.helpUnit.includes(v.id)).map(v => {
return v.leader ? v.leader : '无'
})
return helpUnits && helpUnits.length > 0 ? helpUnits.toString() : '无'
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/mobile/ProposalInfo.vue?v=' + new Date().getTime()),
},
methods: {
initHandleState() {
$.post('/platform/proposal/common/getProposalStateCode', {
proposal_id: this.proposalId
}).then((res) => {
this.proposalStateCode = res.data
this.handle = this.proposalStateCode === 300
})
},
loadProposalInfo() {
getProposalInfo(this.proposalId).then((data) => {
if (data && data.typeId) {
this.$set(this.formData, 'typeId', data.typeId)
}
})
},
loadOptions() {
$.get('/platform/proposal/common/getDictByCode', {
code: 'proposal_result'
}).then((res) => {
this.resultOptions = res.data
}).then(() => $.get('/mobile/proposal/case/getUnderTakeAndLeader'))
.then((res) => {
this.unitOptions = res.data
})
.then(() => $.get('/platform/proposal/common/getProposalConfig'))
.then((res) => {
this.noFilingReason = res.data.noFilingReason
})
.then(() => $.get('/platform/proposal/common/getProposalType'))
.then((res) => {
this.typeOptions = res.data
})
},
// 选择立案结果后同步原 resultCode 字段,并复用原有联动逻辑清理承办单位和刷新审核意见。
onResultCodeConfirm(value) {
this.$set(this.formData, 'resultCode', value.value)
this.resultCodeChange(value.value)
this.showResultCodePicker = false
},
// 选择提案类型后只回写 typeId,提交时继续使用后端原有参数结构。
onTypeConfirm(value) {
this.$set(this.formData, 'typeId', value.value)
this.showTypePicker = false
},
onNoFilingReasonConfirm(value) {
this.$set(this.formData, 'noFilingReason', value)
this.$set(this.formData, 'opinion', '经提案工作组审理,该提案不予立案。' + value)
this.showNoFilingReasonPicker = false
},
// 打开主办单位弹框时先暂存当前值,搜索和滚动选择不会立即影响原表单。
openHostUnitPicker() {
this.hostUnitSearchKey = ''
this.checkedHostUnit = this.formData.hostUnit || (this.hostUnitPickerOptions[0] ? this.hostUnitPickerOptions[0].value : '')
this.showHostUnitPicker = true
},
onHostUnitCancel() {
this.showHostUnitPicker = false
},
onHostUnitPickerChange(picker, value) {
this.checkedHostUnit = value && value.value ? value.value : ''
},
// 确认主办单位后回写 hostUnit,主办领导展示通过 computed 自动从 unitOptions 中匹配。
onHostUnitConfirm() {
if (!this.checkedHostUnit) {
return
}
this.$set(this.formData, 'hostUnit', this.checkedHostUnit)
this.showHostUnitPicker = false
},
// 打开协办单位弹框时先复制当前值,取消选择时不会影响原表单,确定后再统一回写。
openHelpUnitPicker() {
this.checkedHelpUnit = this.formData.helpUnit.concat()
this.helpUnitSearchKey = ''
this.showHelpUnitPicker = true
},
onHelpUnitCancel() {
this.checkedHelpUnit = this.formData.helpUnit.concat()
this.showHelpUnitPicker = false
},
onHelpUnitConfirm() {
this.$set(this.formData, 'helpUnit', this.checkedHelpUnit.concat())
this.showHelpUnitPicker = false
},
resultCodeChange(code) {
this.$set(this.formData, 'hostUnit', '')
this.$set(this.formData, 'helpUnit', [])
this.$set(this.formData, 'noFilingReason', '')
this.checkedHelpUnit = []
if (code === 'opinion') {
this.$set(this.formData, 'opinion', '经提案工作组审理,该提案作为意见建议。')
} else if (code === 'notGive') {
this.$set(this.formData, 'opinion', '经提案工作组审理,该提案不予立案。')
} else if (code) {
this.$set(this.formData, 'opinion', '经提案工作组审理,该提案确定立案。')
} else {
this.$set(this.formData, 'opinion', '经提案工作组审理,该提案返回修改。')
}
},
validateForm(flag) {
if (!this.formData.typeId) {
vant.Toast('请选择提案类型')
return false
}
if (flag === 1 && !this.formData.resultCode) {
vant.Toast('请选择立案结果')
return false
}
if (flag === 1 && this.formData.resultCode !== 'notGive' && !this.formData.hostUnit) {
vant.Toast('请选择主办单位')
return false
}
if (this.formData.helpUnit.find(v => v === this.formData.hostUnit)) {
vant.Toast('协办单位中不能包含主办单位')
return false
}
if (!this.formData.opinion) {
vant.Toast('请填写审核意见')
return false
}
return true
},
doAudit(flag) {
if (!this.validateForm(flag) || this.formLoading) {
return
}
const msg = flag === 2 ? '请确认是否退回到团长?' : this.formData.resultCode === 'notGive' ? '该提案不予立案,提交后将完结,请确认!' : '请确认是否提交该提案?'
vant.Dialog.confirm({
title: '提示',
message: msg,
}).then(() => {
this.formLoading = true
$.post('/mobile/proposal/case/audit', {
audit: JSON.stringify(this.formData),
resultCode: this.formData.resultCode,
typeId: this.formData.typeId,
hostUnit: this.formData.hostUnit,
helpUnit: JSON.stringify(this.formData.helpUnit),
sign: this.formData.sign,
determineTypeCode: this.formData.determineTypeCode,
proposalIds: JSON.stringify([this.proposalId]),
auditType: 'one',
flag: flag
}).then((res) => {
if (res.code === 0) {
this.$toast.success('提交成功')
this.handle = false
this.$refs.info.openView(this.proposalId)
} else {
this.$toast.fail(res.msg || '提交失败,请联系管理员')
}
}).always(() => {
this.formLoading = false
})
})
}
},
watch: {
hostUnitPickerOptions(value) {
if (!this.showHostUnitPicker) {
return
}
if (!value.some(v => v.value === this.checkedHostUnit)) {
this.checkedHostUnit = value[0] ? value[0].value : ''
}
}
},
created() {
if (GetQueryString('mobile')) {
this.leftArrow = true
}
const proposalId = GetQueryString('proposal_id')
const bizKey = GetQueryString('biz_key')
if (proposalId === '' || bizKey === '') {
vant.Dialog.alert({
title: '提示',
message: '非法参数',
showConfirmButton: false
})
return
}
this.loadOptions()
this.loadProposalInfo()
this.initHandleState()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,193 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
title="提案工作组预立案"
left-arrow
placeholder
fixed
@click-left="pjaxReplace('/mobile/index')"
></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="10"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalTypeId" :options="proposalTypeList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalResultCode" :options="resultList"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="全部" name=""></van-tab>
<van-tab title="已审核" name="true"></van-tab>
<van-tab title="待审核" name="false"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}"
@click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<span class="badge" :class="o.stateCode === 300 ? 'badge-draft' : 'badge-blue'">
{{o.stateCode === 300 ? '待审核' : '已审核'}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="card-item">
<span class="card-label">提案类型:</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案状态:</span>
<span class="card-value">{{o.stateName}}</span>
</div>
<div class="card-item">
<span class="card-label">是否并案:</span>
<span class="card-value">{{o.stateCode === 300 ? '暂无' : o.isConjoin === 1 ? '是' : '否'}}</span>
</div>
</div>
<div class="card-footer" v-if="o.resultName">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName}}</span>
</div>
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
pageForm: {
isAudit: 'false'
},
sessionList: [],
proposalTypeList: [],
resultList: [],
listLoading: false
}
},
methods: {
doSearch() {
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
}
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(row) {
window.location.href = '/mobile/proposal/case/view?biz_key=' + row.id + '&proposal_id=' + row.id + '&stateCode=' + row.stateCode + '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalDict'))
.then((res) => {
this.resultList = res.data
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, 'proposalResultCode', this.resultList[0].value)
}
this.onLoad()
})
}
},
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
}
})
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,147 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="提案工作组意见" fixed placeholder :left-arrow="leftArrow" safe-area-inset-top
@click-left="pjaxReplace('/mobile/proposal/caseRead')"></van-nav-bar>
<proposal-info :proposal_id="proposalId" title="提案工作组意见" :handle="handle" ref="info">
<template #handle>
<div class="van-cell-group__title" style="padding: 5px 0 0 0 !important;">
<div class="van-sidebar-item van-sidebar-item--select">
成员意见
</div>
</div>
<van-form>
<van-cell-group class="info">
<van-cell title="审核人" :value="formData.username"></van-cell>
<van-cell title="审核时间" :value="formData.auditTime"></van-cell>
<van-field name="other" label="立案意见">
<template #input>
<van-radio-group v-model="formData.other" direction="vertical">
<van-radio v-for="item in resultOptions" :name="item.code" style="margin: 8px 0">
{{item.name}}
</van-radio>
</van-radio-group>
</template>
</van-field>
<van-field
input-align="right"
v-model="formData.opinion"
rows="3"
autosize
label="审核意见"
type="textarea"
maxlength="1000"
placeholder="请填写您的意见"
show-word-limit
></van-field>
</van-cell-group>
<van-row type="flex" style="padding: 20px 10px">
<van-button :color="themeColor" block size="large" :loading="formLoading" @click="doAudit">提交
</van-button>
</van-row>
</van-form>
</template>
</proposal-info>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
leftArrow: false,
handle: false,
proposalId: GetQueryString('proposal_id'),
formLoading: false,
resultOptions: [],
proposalStateCode: null,
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
other: 'determine',
determineTypeCode: 'ordinary',
proposalId: GetQueryString('proposal_id')
}
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/mobile/ProposalInfo.vue?v=' + new Date().getTime()),
},
methods: {
initHandleState() {
$.post('/platform/proposal/common/getProposalStateCode', {
proposal_id: this.proposalId
}).then((res) => {
const isOpinion = GetQueryString('isOpinion')
this.proposalStateCode = res.data
this.handle = this.proposalStateCode === 300 && isOpinion !== 'true' && isOpinion !== '1'
})
},
loadResultOptions() {
$.get('/platform/proposal/common/getDictByCode', {
code: 'proposal_result'
}).then((res) => {
this.resultOptions = res.data
})
},
doAudit() {
if (!this.formData.other) {
vant.Toast('请选择立案意见')
return
}
if (this.formLoading) {
return
}
vant.Dialog.confirm({
title: '提示',
message: '您确定提交该提案的成员意见吗?',
}).then(() => {
this.formLoading = true
$.post('/mobile/proposal/caseRead/putSuggestion', {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
proposalId: this.proposalId
}).then((res) => {
if (res.code === 0) {
this.$toast.success('提交成功')
this.handle = false
this.$refs.info.openView(this.proposalId)
} else {
this.$toast.fail(res.msg || '提交失败,请联系管理员')
}
}).always(() => {
this.formLoading = false
})
})
}
},
created() {
if (GetQueryString('mobile')) {
this.leftArrow = true
}
const proposalId = GetQueryString('proposal_id')
const bizKey = GetQueryString('biz_key')
if (proposalId === '' || bizKey === '') {
vant.Dialog.alert({
title: '提示',
message: '非法参数',
showConfirmButton: false
})
return
}
this.loadResultOptions()
this.initHandleState()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,184 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
title="提案工作组意见"
left-arrow
placeholder
fixed
@click-left="pjaxReplace('/mobile/index')"
></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="10"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalTypeId" :options="proposalTypeList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalResultCode" :options="resultList"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="全部" name=""></van-tab>
<van-tab title="已建议" name="true"></van-tab>
<van-tab title="未建议" name="false"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}" @click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<span class="badge badge-blue">
{{o.stateName}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="card-item">
<span class="card-label">提案类型:</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
</div>
<div class="card-footer" v-if="o.resultName">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName}}</span>
</div>
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
pageForm: {
isAudit: 'false'
},
sessionList: [],
proposalTypeList: [],
resultList: [],
listLoading: false
}
},
methods: {
doSearch() {
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
}
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(row) {
window.location.href = '/mobile/proposal/caseRead/view?biz_key=' + row.id + '&proposal_id=' + row.id + '&isOpinion=' + row.isOpinion + '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalDict'))
.then((res) => {
this.resultList = res.data
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, 'proposalResultCode', this.resultList[0].value)
}
this.onLoad()
})
}
},
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
}
})
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,515 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="提案工作组正式立案" fixed placeholder :left-arrow="leftArrow" safe-area-inset-top
@click-left="pjaxReplace('/mobile/proposal/caseUnit')"></van-nav-bar>
<proposal-info :proposal_id="proposalId" title="提案工作组正式立案" :handle="handle" ref="info">
<template #handle>
<div class="info-section-title">正式立案审核</div>
<van-form class="info-cell-form">
<div class="info-row">
<span class="info-label">审核人</span>
<span class="info-value">{{formData.username}}</span>
</div>
<div class="info-row">
<span class="info-label">审核时间</span>
<span class="info-value">{{formData.auditTime}}</span>
</div>
<div class="info-picker-card">
<van-field
:value="resultCodeName"
clickable
input-align="right"
label="立案结果"
label-class="info-picker-label"
name="resultCode"
placeholder="请选择立案结果"
required
readonly
right-icon="arrow"
@click="showResultCodePicker = true"
></van-field>
</div>
<van-popup position="bottom" round v-model="showResultCodePicker">
<van-picker
:columns="resultPickerOptions"
@cancel="showResultCodePicker = false"
@confirm="onResultCodeConfirm"
show-toolbar
></van-picker>
</van-popup>
<div class="info-picker-card">
<van-field
:value="typeName"
clickable
input-align="right"
label="提案类型"
label-class="info-picker-label"
name="typeId"
placeholder="请选择提案类型"
required
readonly
right-icon="arrow"
@click="showTypePicker = true"
></van-field>
</div>
<van-popup position="bottom" round v-model="showTypePicker">
<van-picker
:columns="typePickerOptions"
@cancel="showTypePicker = false"
@confirm="onTypeConfirm"
show-toolbar
></van-picker>
</van-popup>
<template v-if="formData.resultCode!='notGive'">
<div class="info-picker-card">
<van-field
:value="hostUnitName"
clickable
input-align="right"
label="主办单位"
label-class="info-picker-label"
name="hostUnit"
placeholder="请选择主办单位"
:required="formData.resultCode !== 'notGive'"
readonly
right-icon="arrow"
@click="openHostUnitPicker"
></van-field>
</div>
<van-popup position="bottom" round v-model="showHostUnitPicker">
<div class="unit-select-toolbar">
<button class="unit-select-cancel" type="button" @click="onHostUnitCancel">取消</button>
<div class="unit-select-title">主办单位</div>
<button class="unit-select-confirm" type="button" @click="onHostUnitConfirm">确定</button>
</div>
<van-search
placeholder="请输入单位名称搜索"
v-model="hostUnitSearchKey"
></van-search>
<van-picker
:columns="hostUnitPickerOptions"
@change="onHostUnitPickerChange"
></van-picker>
<van-empty description="暂无匹配单位" v-if="hostUnitPickerOptions.length === 0"></van-empty>
</van-popup>
<div class="info-row" v-if="formData.hostUnit">
<span class="info-label">主办领导</span>
<span class="info-value is-long">{{hostUnitLeader}}</span>
</div>
<div class="info-picker-card">
<van-field
class="info-multi-value-field"
clickable
input-align="right"
label="协办单位"
label-class="info-picker-label"
name="helpUnit"
placeholder="请选择协办单位"
readonly
right-icon="arrow"
@click="openHelpUnitPicker"
>
<template #input>
<div class="info-multi-value" v-if="helpUnitName">{{helpUnitName}}</div>
<div class="info-multi-value info-multi-placeholder" v-else>请选择协办单位</div>
</template>
</van-field>
</div>
<van-popup position="bottom" round v-model="showHelpUnitPicker">
<div class="unit-select-toolbar">
<button class="unit-select-cancel" type="button" @click="onHelpUnitCancel">取消</button>
<div class="unit-select-title">协办单位</div>
<button class="unit-select-confirm" type="button" @click="onHelpUnitConfirm">确定</button>
</div>
<van-search
placeholder="请输入单位名称搜索"
v-model="helpUnitSearchKey"
></van-search>
<div class="unit-select-list">
<van-checkbox-group v-model="checkedHelpUnit" direction="vertical">
<van-checkbox
v-for="item in filterHelpUnitOptions"
:key="item.id"
:name="item.id"
style="margin: 10px 0"
>
{{item.unitName}}
</van-checkbox>
</van-checkbox-group>
<van-empty description="暂无匹配单位" v-if="filterHelpUnitOptions.length === 0"></van-empty>
</div>
</van-popup>
<div class="info-row" v-if="formData.helpUnit && formData.helpUnit.length>0">
<span class="info-label">协办领导</span>
<span class="info-value is-long">{{helpUnitLeader}}</span>
</div>
</template>
<div class="info-textarea-field">
<div class="info-textarea-label info-required-label">审核意见</div>
<van-field
v-model="formData.opinion"
rows="4"
autosize
type="textarea"
maxlength="500"
placeholder="请填写工作会的审核意见"
show-word-limit
></van-field>
</div>
<van-row class="info-footer-actions" type="flex" gutter="10">
<van-col span="12">
<van-button block class="info-ghost-button" :loading="formLoading"
@click="pjaxReplace('/mobile/proposal/caseUnit')">
取消
</van-button>
</van-col>
<van-col span="12">
<van-button :color="themeColor" block class="info-primary-button" :loading="formLoading"
@click="doAudit">
提交
</van-button>
</van-col>
</van-row>
</van-form>
</template>
</proposal-info>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
leftArrow: false,
handle: false,
proposalId: GetQueryString('proposal_id'),
formLoading: false,
showResultCodePicker: false,
showTypePicker: false,
showHostUnitPicker: false,
showHelpUnitPicker: false,
hostUnitSearchKey: '',
helpUnitSearchKey: '',
checkedHostUnit: '',
checkedHelpUnit: [],
resultOptions: [],
typeOptions: [],
unitOptions: [],
proposalStateCode: null,
proposalIds: [GetQueryString('proposal_id')],
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
resultCode: 'determine',
hostUnit: '',
helpUnit: [],
opinion: '经提案委员会审理,该提案确定立案。',
sign: '',
typeId: '',
determineTypeCode: '',
proposalId: GetQueryString('proposal_id')
}
}
},
computed: {
// 将字典和实体列表统一成 Picker 的 text/value 结构,确认时回写原提交字段。
resultPickerOptions() {
return this.resultOptions.map(v => {
return {
text: v.name,
value: v.code
}
})
},
typePickerOptions() {
return this.typeOptions.map(v => {
return {
text: v.typeName,
value: v.id
}
})
},
hostUnitPickerOptions() {
const key = this.hostUnitSearchKey ? this.hostUnitSearchKey.trim() : ''
return this.unitOptions.filter(v => {
return !key || v.unitName.includes(key)
}).map(v => {
return {
text: v.unitName,
value: v.id
}
})
},
filterHelpUnitOptions() {
const key = this.helpUnitSearchKey ? this.helpUnitSearchKey.trim() : ''
return this.unitOptions.filter(v => {
return !key || v.unitName.includes(key)
})
},
resultCodeName() {
const result = this.resultOptions.find(v => v.code === this.formData.resultCode)
return result ? result.name : ''
},
typeName() {
const type = this.typeOptions.find(v => v.id === this.formData.typeId)
return type ? type.typeName : ''
},
hostUnitName() {
const hostUnit = this.unitOptions.find(v => v.id === this.formData.hostUnit)
return hostUnit ? hostUnit.unitName : ''
},
helpUnitName() {
const helpUnits = this.unitOptions.filter(v => this.formData.helpUnit.includes(v.id)).map(v => v.unitName)
return helpUnits && helpUnits.length > 0 ? helpUnits.toString() : ''
},
hostUnitLeader() {
const hostUnit = this.unitOptions.find(v => v.id === this.formData.hostUnit)
return hostUnit && hostUnit.leader ? hostUnit.leader : '无'
},
helpUnitLeader() {
const helpUnits = this.unitOptions.filter(v => this.formData.helpUnit.includes(v.id)).map(v => {
return v.leader ? v.leader : '无'
})
return helpUnits && helpUnits.length > 0 ? helpUnits.toString() : '无'
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/mobile/ProposalInfo.vue?v=' + new Date().getTime()),
},
methods: {
initHandleState() {
$.post('/platform/proposal/common/getProposalStateCode', {
proposal_id: this.proposalId
}).then((res) => {
this.proposalStateCode = res.data
this.handle = this.proposalStateCode === 400
})
},
loadProposalInfo() {
getProposalInfo(this.proposalId).then((data) => {
if (data && data.typeId) {
this.$set(this.formData, 'typeId', data.typeId)
}
if (data && data.resultCode) {
this.$set(this.formData, 'resultCode', data.resultCode)
this.setOpinionByResultCode(data.resultCode)
}
if (data && data.determineTypeCode) {
this.$set(this.formData, 'determineTypeCode', data.determineTypeCode)
}
})
},
loadUnderTake() {
$.get('/mobile/proposal/caseUnit/queryUnderTakeByProposalId', {
proposalId: this.proposalId
}).then((res) => {
const underTakes = res.data || []
const hostUnit = underTakes.find(v => v.undertakeType === 1)
if (hostUnit) {
this.$set(this.formData, 'hostUnit', hostUnit.replyUnitId)
}
this.$set(this.formData, 'helpUnit', underTakes.filter(v => v.undertakeType === 2).map(v => v.replyUnitId))
})
},
loadConjoinProposal() {
$.get('/platform/proposal/common/findConjoinProposal', {
proposalId: this.proposalId
}).then((res) => {
const proposals = res.data || []
if (proposals.length > 0) {
this.proposalIds = proposals.map(v => v.id)
}
})
},
loadOptions() {
$.get('/platform/proposal/common/getDictByCode', {
code: 'proposal_result'
}).then((res) => {
this.resultOptions = res.data
}).then(() => $.get('/mobile/proposal/caseUnit/getUnderTakeAndLeader'))
.then((res) => {
this.unitOptions = res.data
})
.then(() => $.get('/platform/proposal/common/getProposalType'))
.then((res) => {
this.typeOptions = res.data
})
.then(() => {
this.loadUnderTake()
})
},
onResultCodeConfirm(value) {
this.$set(this.formData, 'resultCode', value.value)
this.resultCodeChange(value.value)
this.showResultCodePicker = false
},
onTypeConfirm(value) {
this.$set(this.formData, 'typeId', value.value)
this.showTypePicker = false
},
openHostUnitPicker() {
this.hostUnitSearchKey = ''
this.checkedHostUnit = this.formData.hostUnit || (this.hostUnitPickerOptions[0] ? this.hostUnitPickerOptions[0].value : '')
this.showHostUnitPicker = true
},
onHostUnitCancel() {
this.showHostUnitPicker = false
},
onHostUnitPickerChange(picker, value) {
this.checkedHostUnit = value && value.value ? value.value : ''
},
onHostUnitConfirm() {
if (!this.checkedHostUnit) {
return
}
this.$set(this.formData, 'hostUnit', this.checkedHostUnit)
this.showHostUnitPicker = false
},
openHelpUnitPicker() {
this.checkedHelpUnit = this.formData.helpUnit.concat()
this.helpUnitSearchKey = ''
this.showHelpUnitPicker = true
},
onHelpUnitCancel() {
this.checkedHelpUnit = this.formData.helpUnit.concat()
this.showHelpUnitPicker = false
},
onHelpUnitConfirm() {
this.$set(this.formData, 'helpUnit', this.checkedHelpUnit.concat())
this.showHelpUnitPicker = false
},
resultCodeChange(code) {
this.$set(this.formData, 'hostUnit', '')
this.$set(this.formData, 'helpUnit', [])
this.checkedHelpUnit = []
this.setOpinionByResultCode(code)
},
setOpinionByResultCode(code) {
if (code === 'opinion') {
this.$set(this.formData, 'opinion', '经提案委员会审理,该提案作为意见建议。')
} else if (code === 'notGive') {
this.$set(this.formData, 'opinion', '经提案委员会审理,该提案不予立案。')
} else {
this.$set(this.formData, 'opinion', '经提案委员会审理,该提案确定立案。')
}
},
validateForm() {
if (!this.formData.typeId) {
vant.Toast('请选择提案类型')
return false
}
if (!this.formData.resultCode) {
vant.Toast('请选择立案结果')
return false
}
if (this.formData.resultCode !== 'notGive' && !this.formData.hostUnit) {
vant.Toast('请选择主办单位')
return false
}
if (this.formData.helpUnit.find(v => v === this.formData.hostUnit)) {
vant.Toast('协办单位中不能包含主办单位')
return false
}
if (!this.formData.opinion) {
vant.Toast('请填写审核意见')
return false
}
return true
},
doAudit() {
if (!this.validateForm() || this.formLoading) {
return
}
const submitAudit = () => {
vant.Dialog.confirm({
title: '提示',
message: '最终确定立案和承办单位,不可撤回请确认!',
}).then(() => {
this.formLoading = true
$.post('/mobile/proposal/caseUnit/audit', {
audit: JSON.stringify(this.formData),
resultCode: this.formData.resultCode,
typeId: this.formData.typeId,
hostUnit: this.formData.hostUnit,
helpUnit: JSON.stringify(this.formData.helpUnit),
sign: this.formData.sign,
determineTypeCode: this.formData.determineTypeCode,
proposalIds: JSON.stringify(this.proposalIds)
}).then((res) => {
if (res.code === 0) {
this.$toast.success('提交成功')
this.handle = false
this.$refs.info.openView(this.proposalId)
} else {
this.$toast.fail(res.msg || '提交失败,请联系管理员')
}
}).always(() => {
this.formLoading = false
})
})
}
if (this.formData.resultCode === 'notGive') {
submitAudit()
return
}
$.get('/mobile/proposal/caseUnit/checkUnderTakeUser', {
hostUnit: this.formData.hostUnit
}).then((res) => {
if (res.data) {
submitAudit()
} else {
vant.Dialog.alert({
title: '提示',
message: '请先设置主办单位分管校领导或答复人后再进行提交!'
})
}
})
}
},
watch: {
hostUnitPickerOptions(value) {
if (!this.showHostUnitPicker) {
return
}
if (!value.some(v => v.value === this.checkedHostUnit)) {
this.checkedHostUnit = value[0] ? value[0].value : ''
}
}
},
created() {
if (GetQueryString('mobile')) {
this.leftArrow = true
}
const proposalId = GetQueryString('proposal_id')
const bizKey = GetQueryString('biz_key')
if (proposalId === '' || bizKey === '') {
vant.Dialog.alert({
title: '提示',
message: '非法参数',
showConfirmButton: false
})
return
}
this.loadOptions()
this.loadProposalInfo()
this.loadConjoinProposal()
this.initHandleState()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,193 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
title="提案工作组正式立案"
left-arrow
placeholder
fixed
@click-left="pjaxReplace('/mobile/index')"
></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="10"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalTypeId" :options="proposalTypeList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalResultCode" :options="resultList"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="全部" name=""></van-tab>
<van-tab title="已审核" name="true"></van-tab>
<van-tab title="待审核" name="false"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}"
@click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<span class="badge" :class="o.stateCode === 400 ? 'badge-draft' : 'badge-blue'">
{{o.stateCode === 400 ? '待审核' : '已审核'}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="card-item">
<span class="card-label">提案类型:</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案状态:</span>
<span class="card-value">{{o.stateName}}</span>
</div>
<div class="card-item">
<span class="card-label">是否并案:</span>
<span class="card-value">{{o.isConjoin === 1 ? '是' : '否'}}</span>
</div>
</div>
<div class="card-footer" v-if="o.resultName">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName}}</span>
</div>
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
pageForm: {
isAudit: 'false'
},
sessionList: [],
proposalTypeList: [],
resultList: [],
listLoading: false
}
},
methods: {
doSearch() {
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
}
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(row) {
window.location.href = '/mobile/proposal/caseUnit/view?biz_key=' + row.id + '&proposal_id=' + row.id + '&stateCode=' + row.stateCode + '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalDict'))
.then((res) => {
this.resultList = res.data
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, 'proposalResultCode', this.resultList[0].value)
}
this.onLoad()
})
}
},
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
}
})
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
</script>
<!--#
}
#-->
@@ -1,47 +1,61 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="团长审核" fixed placeholder safe-area-inset-top @click-left="pjaxReplace('/mobile/index')"
<van-nav-bar title="团长审核" fixed placeholder safe-area-inset-top @click-left="pjaxReplace('/mobile/proposal/delegation')"
:left-arrow="leftArrow"></van-nav-bar>
<proposal-info :proposal_id="proposalId" title="团长审核" :handle="handle" ref="info">
<template #handle>
<div class="van-cell-group__title" style="padding: 5px 0 0 0 !important;">
<div class="van-sidebar-item van-sidebar-item--select">
团长审核
<div class="info-section-title">团长审核</div>
<van-form class="info-cell-form">
<div class="info-row">
<span class="info-label">审核人</span>
<span class="info-value">{{formData.username}}</span>
</div>
</div>
<van-form>
<van-cell-group class="info">
<van-cell title="审核时间" :value="formData.auditTime"></van-cell>
<div class="info-row">
<span class="info-label">审核时间</span>
<span class="info-value">{{formData.auditTime}}</span>
</div>
<div class="info-textarea-field">
<div class="info-textarea-label info-required-label">审核意见</div>
<van-field
input-align="right"
v-model="formData.opinion"
rows="2"
rows="4"
autosize
label="审核意见"
type="textarea"
maxlength="1000"
placeholder="请输入审核意见"
placeholder="请填写审核意见"
show-word-limit
></van-field>
</van-cell-group>
</div>
<van-row type="flex" :gutter="20" style="padding: 20px 0px">
<van-col span="12" style="padding: 0 10px">
<van-button plain size="large" @click="doAudit(0)">退回</van-button>
<div class="info-long-block" v-if="isSign">
<div class="info-long-title info-required-label">签字</div>
<mobile-sign ref="signature" :my_sign.sync="formData.sign"></mobile-sign>
</div>
<van-row class="info-footer-actions" type="flex" gutter="10">
<van-col span="8">
<van-button block class="info-ghost-button" :loading="formLoading" @click="doAudit(2)">
建议撤销
</van-button>
</van-col>
<van-col span="12" style="padding: 0 10px">
<van-button :color="themeColor" block size="large" @click="doAudit(1)">通过</van-button>
<van-col span="8">
<van-button block class="info-ghost-button" :loading="formLoading" @click="doAudit(0)">
返回修改
</van-button>
</van-col>
<van-col span="8">
<van-button :color="themeColor" block class="info-primary-button" :loading="formLoading"
@click="doAudit(1)">
通过
</van-button>
</van-col>
</van-row>
</van-form>
</template>
</proposal-info>
</div>
<script>
@@ -51,13 +65,16 @@ layout("/mobile/platform.html"){
data() {
return {
leftArrow: false,
handle: true,
handle: false,
proposalId: GetQueryString('proposal_id'),
formLoading: false,
isSign: false,
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
auditTime: moment().format('YYYY-MM-DD HH:mm:ss'),
opinion: '同意该提案!',
sign: '',
proposalId: GetQueryString('proposal_id')
}
}
@@ -66,72 +83,101 @@ layout("/mobile/platform.html"){
'proposal-info': httpVueLoader('/components/proposal/mobile/ProposalInfo.vue?v=' + new Date().getTime()),
},
methods: {
async doAudit(flag) {
if (this.formData.opinion === '') {
vant.Toast('请输入审核意见');
loadHandleState() {
$.post('/platform/proposal/common/getProposalStateCode', {
proposal_id: this.proposalId
}).then((res) => {
this.handle = res.data === 200
})
},
loadSignState() {
$.get('/platform/proposal/common/getProposalNeedSignStateCode')
.then((res) => {
const signStates = res.data || []
this.isSign = signStates.map(v => v.stateCode).includes(200)
})
},
validateForm() {
if (!this.proposalId) {
vant.Toast('提案信息不存在')
return false
}
if (!this.formData.opinion) {
vant.Toast('请输入审核意见')
return false
}
if (this.isSign && !this.formData.sign) {
vant.Toast('请签字')
return false
}
return true
},
setDefaultOpinion(flag) {
if (flag !== 1 && this.formData.opinion === '同意该提案!') {
if (flag === 2) {
this.$set(this.formData, 'opinion', '建议撤销该提案!')
} else {
this.$set(this.formData, 'opinion', '返回修改该提案!')
}
}
},
getConfirmMessage(flag) {
if (flag === 1) {
return '您是否要通过该提案?'
}
if (flag === 2) {
return '您确定要建议撤销该提案吗?'
}
return '该提案将返回至撰写人,修改后需重新邀请附议,请确认是否返回修改?'
},
doAudit(flag) {
if (!this.validateForm() || this.formLoading) {
return
}
const res = flag === 1 ? '通过' : '退回'
vant.Dialog.confirm({
title: '提示',
message: '您确定' + res + '该提案吗?',
}).then(async () => {
const loading = this.$toast({
duration: 0,
message: '提交中...',
forbidClick: true,
loadingType: 'spinner',
type: 'loading',
overlay: true
});
const resp = await $.post("/platform/proposal/transact/audit/doAudit", {
message: this.getConfirmMessage(flag),
}).then(() => {
this.setDefaultOpinion(flag)
this.formLoading = true
$.post('/platform/proposal/transact/audit/doAudit', {
audit: JSON.stringify(this.formData),
sign: this.formData.sign,
flag: flag
})
if (resp.code === 0) {
setTimeout(async () => {
loading.type = 'success'
loading.message = '提交成功'
loading.close()
this.handle = await mProposal.GetProposalStateCode(this.proposalId) === 200
}).then((res) => {
if (res.code === 0) {
this.$toast.success('提交成功')
this.handle = false
this.$refs.info.openView(this.proposalId)
}, 1200)
} else {
loading.type = 'fail'
loading.message = '提交失败,请联系管理员'
}
} else {
this.$toast.fail(res.msg || '提交失败,请联系管理员')
}
}).always(() => {
this.formLoading = false
})
})
}
},
async created() {
if (GetQueryString("mobile")) this.leftArrow = true
const proposal_id = GetQueryString("proposal_id")
const biz_key = GetQueryString("biz_key")
if (proposal_id === '' || biz_key === '') {
created() {
if (GetQueryString('mobile')) {
this.leftArrow = true
}
const proposalId = GetQueryString('proposal_id')
const bizKey = GetQueryString('biz_key')
if (proposalId === '' || bizKey === '') {
vant.Dialog.alert({
title: '提示',
message: '非法参数',
showConfirmButton: false
}).then(() => {
})
return
}
this.handle = await mProposal.GetProposalStateCode(this.proposalId) === 200
const lastIndex = window.location.href.lastIndexOf('&')
if (window.location.href.substr(lastIndex + 1, 6) === 'ticket') {
window.document.location.replace(window.location.href.substring(0, lastIndex))
}
this.loadHandleState()
this.loadSignState()
}
})
</script>
<!--#
}
#-->
@@ -1,45 +1,10 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
.van-doc-card {
margin: 14px;
padding: 12px 12px 12px 12px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 8px 12px #ebedf0;
line-height: 20px;
font-size: 12px;
position: relative;
}
.van-divider {
margin: 12px 0 12px 0px;
border-color: lightgray;
}
.van-button--small {
border-top-right-radius: 16px;
border-bottom-left-radius: 16px;
height: 26px;
}
.van-col {
line-height: 25px;
}
.title_span {
font-size: 16px;
font-weight: bold;
position: absolute;
left: -1px;
top: 11px;
}
</style>
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
title="团长审"
title="团长审"
left-arrow
placeholder
fixed
@@ -50,13 +15,10 @@ layout("/mobile/platform.html"){
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="10"
maxlength="20"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
>
</van-search>
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@@ -67,51 +29,61 @@ layout("/mobile/platform.html"){
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @click="doSearch">
<van-tab title="未审核" :name="false"></van-tab>
<van-tab title="已审核" :name="true"></van-tab>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="全部" name=""></van-tab>
<van-tab title="已审核" name="true"></van-tab>
<van-tab title="待审核" name="false"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="van-doc-card" @click="openView(o.id)">
<div @click="openView(o.id)">
<div>
<div class="van-ellipsis"
style="font-size: 13px;font-weight: bold;flex: 1;width:80%;overflow: hidden;white-space: nowrap">
<span class="title_span" :style="'color:'+o.stateColor">|</span>提案名称:{{o.proposalName}}
</div>
<div style="position: absolute; right: 14px;top: 12.3px;text-align: right">
<van-tag :style="'color:'+o.stateColor" size="medium" plain round type="primary">{{
o.stateName }}
</van-tag>
</div>
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}"
@click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<van-divider></van-divider>
<div>
<van-row>
<van-col span="12"><span style="color: grey">提案编号:</span>{{o.proposalCode}}</van-col>
<van-col span="12"><span style="color: grey">提案类型:</span>{{o.typeName}}</van-col>
</van-row>
<van-row>
<van-col span="12" style="overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
<span style="color: grey">&ensp;&ensp;团:</span>{{o.delegationName}}
</van-col>
<van-col span="12"><span style="color: grey">提案届次:</span>{{o.meetingName}}</van-col>
</van-row>
<van-divider></van-divider>
<span class="badge" :class="o.stateCode === 200 ? 'badge-draft' : 'badge-blue'">
{{o.stateCode === 200 ? '待审核' : '已审核'}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="train-title" style="margin-top: 11px">
<span style="color: grey">立案结果</span>{{o.resultName ? o.resultName : '暂无'}}
<div class="card-item">
<span class="card-label">提案类型</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案状态:</span>
<span class="card-value">{{o.stateName}}</span>
</div>
<div class="card-item">
<span class="card-label">审核状态:</span>
<span class="card-value">{{o.stateCode === 200 ? '待审核' : '已审核'}}</span>
</div>
</div>
<div class="card-footer" v-if="o.resultName">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName}}</span>
</div>
</div>
</van-list>
<van-empty
@@ -125,107 +97,94 @@ layout("/mobile/platform.html"){
</div>
<script>
let vue = new Vue({
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
pageForm: {
isAudit: false
isAudit: 'false'
},
list: [],
state: '0',
loading: false,
finished: false,
refreshing: false,
sessionList: [],
delegationList: [],
proposalTypeList: [],
resultList: []
resultList: [],
listLoading: false
}
},
methods: {
doSearch() {
this.pageForm.pageNumber = 1
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
async onLoad() {
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length === res.data.totalCount) {
this.finished = true
} else {
this.pageForm.pageNumber++
}
}
this.mLoading = false
})
},
openAudit(id) {
this.formData = {
proposalId: id,
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.state = '0'
this.show = true
},
validateForm(action, done) {
done(false)
},
async doHandle() {
this.$refs['handleForm'].validate().then(valid => {
$.post('/platform/proposal/transact/audit/doAudit', {
audit: JSON.stringify(this.formData),
flag: this.state === 0
}).then((res) => {
console.log(res)
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.show = false
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
this.tableData = []
this.onLoad()
vant.Toast.success('审核成功!')
} else {
vant.Toast.error('审核失败!')
}
})
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(id) {
window.location.href = '/mobile/proposal/delegation/view?biz_key=' + id + '&proposal_id=' + id + '&mobile=' + true
openView(row) {
window.location.href = '/mobile/proposal/delegation/view?biz_key=' + row.id
+ '&proposal_id=' + row.id
+ '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalDict'))
.then((res) => {
this.resultList = res.data
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, 'proposalResultCode', this.resultList[0].value)
}
this.onLoad()
})
}
},
async created() {
this.sessionList = await mProposal.getAllSession()
this.proposalTypeList = await mProposal.getProposalType()
this.resultList = await mProposal.getProposalDict()
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, "meetingId", this.sessionList[0].value)
}
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, "proposalTypeId", this.proposalTypeList[0].value)
}
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, "proposalResultCode", this.resultList[0].value)
}
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
}
})
window.addEventListener('pageshow', e => {
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.onLoad()
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
@@ -0,0 +1,189 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="反馈评价" fixed placeholder :left-arrow="leftArrow" safe-area-inset-top
@click-left="pjaxReplace('/mobile/proposal/feedback')"></van-nav-bar>
<proposal-info :proposal_id="proposalId" title="反馈评价" :handle="handle" ref="info">
<template #handle>
<div class="info-section-title">反馈评价</div>
<van-form class="info-cell-form">
<div class="info-row">
<span class="info-label">反馈人</span>
<span class="info-value">{{formData.username}}</span>
</div>
<div class="info-row">
<span class="info-label">反馈时间</span>
<span class="info-value">{{formData.feedbackTime}}</span>
</div>
<div class="info-long-block">
<div class="info-long-title info-required-label">办理结果评价</div>
<van-radio-group v-model="formData.feedbackCode" direction="vertical">
<van-radio
v-for="item in feedbackOptions"
:key="item.code"
:name="item.code"
style="margin: 12px 0">
{{item.name}}
</van-radio>
</van-radio-group>
<div class="info-long-content" style="color: #1989fa">
提示:如果您选择不满意则需要主办单位二次答复
</div>
</div>
<div class="info-textarea-field">
<div class="info-textarea-label info-required-label">反馈意见</div>
<van-field
v-model="formData.feedbackOpinion"
rows="4"
autosize
type="textarea"
maxlength="1000"
placeholder="请填写反馈意见"
show-word-limit
></van-field>
</div>
<div class="info-long-block" v-if="isSign">
<div class="info-long-title info-required-label">签字</div>
<mobile-sign ref="signature" :my_sign.sync="formData.scoreSign"></mobile-sign>
</div>
<van-row class="info-footer-actions" type="flex" gutter="10">
<van-col span="12">
<van-button block class="info-ghost-button" :loading="formLoading"
@click="pjaxReplace('/mobile/proposal/feedback')">
取消
</van-button>
</van-col>
<van-col span="12">
<van-button :color="themeColor" block class="info-primary-button" :loading="formLoading"
@click="doFeedback">
提交
</van-button>
</van-col>
</van-row>
</van-form>
</template>
</proposal-info>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
leftArrow: false,
handle: false,
proposalId: GetQueryString('proposal_id'),
formLoading: false,
feedbackOptions: [],
isSign: false,
formData: {
username: "${@shiro.getPrincipalProperty('username')}",
feedbackTime: moment().format('YYYY-MM-DD'),
feedbackCode: 'satisfied',
feedbackCodeByUnderTake: '很好',
feedbackOpinion: '同意办结',
scoreSign: '',
proposalId: GetQueryString('proposal_id')
}
}
},
components: {
'proposal-info': httpVueLoader('/components/proposal/mobile/ProposalInfo.vue?v=' + new Date().getTime()),
},
methods: {
loadFeedbackInfo() {
$.get('/mobile/proposal/feedback/getFeedbackInfo', {
proposalId: this.proposalId
}).then((res) => {
const data = res.data || {}
this.handle = data.handle === true
})
},
loadOptions() {
$.get('/platform/proposal/common/getDictByCode', {
code: 'proposal_feedback'
}).then((res) => {
this.feedbackOptions = res.data || []
if (this.feedbackOptions.length > 0 && !this.formData.feedbackCode) {
this.$set(this.formData, 'feedbackCode', this.feedbackOptions[0].code)
}
}).then(() => $.get('/platform/proposal/common/getProposalNeedSignStateCode'))
.then((res) => {
const signStates = res.data || []
this.isSign = signStates.map(v => v.stateCode).includes(700)
})
},
validateForm() {
if (!this.proposalId) {
vant.Toast('提案信息不存在')
return false
}
if (!this.formData.feedbackCode) {
vant.Toast('请选择办理结果评价')
return false
}
if (!this.formData.feedbackOpinion) {
vant.Toast('请填写反馈意见')
return false
}
if (this.isSign && !this.formData.scoreSign) {
vant.Toast('请签字')
return false
}
return true
},
doFeedback() {
if (!this.validateForm() || this.formLoading) {
return
}
vant.Dialog.confirm({
title: '提示',
message: '您确定要提交反馈评价吗?',
}).then(() => {
this.formLoading = true
$.post('/mobile/proposal/feedback/doFeedback', {
feedBack: JSON.stringify(this.formData),
scoreSign: this.formData.scoreSign
}).then((res) => {
if (res.code === 0) {
this.$toast.success('提交成功')
this.handle = false
this.$refs.info.openView(this.proposalId)
} else {
this.$toast.fail(res.msg || '提交失败,请联系管理员')
}
}).always(() => {
this.formLoading = false
})
})
}
},
created() {
if (GetQueryString('mobile')) {
this.leftArrow = true
}
const proposalId = GetQueryString('proposal_id')
const bizKey = GetQueryString('biz_key')
if (proposalId === '' || bizKey === '') {
vant.Dialog.alert({
title: '提示',
message: '非法参数',
showConfirmButton: false
})
return
}
this.loadOptions()
this.loadFeedbackInfo()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,195 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
title="反馈评价"
left-arrow
placeholder
fixed
@click-left="pjaxReplace('/mobile/index')"
></van-nav-bar>
<div class="search-fixed">
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="20"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalTypeId" :options="proposalTypeList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalResultCode" :options="resultList"
@change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="全部" name=""></van-tab>
<van-tab title="已反馈" name="true"></van-tab>
<van-tab title="待反馈" name="false"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}"
@click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<span class="badge" :class="o.isFeedback ? 'badge-blue' : 'badge-draft'">
{{o.isFeedback ? '已反馈' : '待反馈'}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="card-item">
<span class="card-label">提案类型:</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案状态:</span>
<span class="card-value">{{o.stateName}}</span>
</div>
<div class="card-item">
<span class="card-label">是否并案:</span>
<span class="card-value">{{o.isConjoin ? '是' : '否'}}</span>
</div>
</div>
<div class="card-footer" v-if="o.resultName">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName}}</span>
</div>
</div>
</van-list>
<van-empty
v-if="mLoading==false&&tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [mobileMixins],
data() {
return {
pageForm: {
isAudit: 'false'
},
sessionList: [],
proposalTypeList: [],
resultList: [],
listLoading: false
}
},
methods: {
doSearch() {
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
}
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(row) {
window.location.href = '/mobile/proposal/feedback/view?biz_key=' + row.id
+ '&proposal_id=' + row.id
+ '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalDict'))
.then((res) => {
this.resultList = res.data
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, 'proposalResultCode', this.resultList[0].value)
}
this.onLoad()
})
}
},
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
}
})
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
</script>
<!--#
}
#-->
@@ -1,22 +1,55 @@
<!--#
layout("/mobile/platform.html"){
#-->
<div id="app" v-cloak>
<style>
.seconded-audit-page {
padding-bottom: 86px;
}
.seconded-audit-page .seconded-audit-actions {
position: fixed;
right: 0;
bottom: 0;
left: 0;
z-index: 99;
display: flex;
gap: 10px;
box-sizing: border-box;
padding: 10px 16px calc(10px + env(safe-area-inset-bottom));
background: #ffffff;
box-shadow: 0 -4px 16px rgba(15, 23, 42, 0.08);
}
.seconded-audit-page .seconded-audit-actions .van-button {
flex: 1;
height: 44px;
border-radius: 8px;
font-size: 15px;
font-weight: 500;
}
.seconded-audit-page .seconded-audit-actions .info-ghost-button {
border: 1px solid #dcdfe6;
background: #ffffff;
color: #606266;
}
.seconded-audit-page .seconded-audit-actions .info-primary-button {
border: 1px solid #006d75;
background: #006d75;
color: #ffffff;
}
</style>
<div id="app" class="seconded-audit-page" v-cloak>
<van-nav-bar title="附议提案" fixed placeholder :left-arrow="leftArrow" safe-area-inset-top
@click-left="pjaxReplace('/mobile/proposal/seconded')"></van-nav-bar>
<proposal-info :proposal_id="proposalId" ref="pi"></proposal-info>
<van-row v-if="secondedInfo.isAgree==null">
<div class="van-cell-group__title" style="padding: 5px 0 0 0 !important;">
<div class="van-sidebar-item van-sidebar-item--select">
附议提案
</div>
</div>
<div style="display: flex;justify-content: space-around;padding: 5px 0 20px 0;">
<van-button :color="themeColor" plain style="flex: 1;margin: 0 10px 0 10px" @click="openDialog(false)">拒绝
</van-button>
<van-button :color="themeColor" style="flex: 1;margin: 0 10px 0 10px" @click="openDialog(true)">同意
</van-button>
<van-row v-if="secondedInfo.isAgree==null" class="info-section">
<div class="info-section-title">附议提案</div>
<div class="info-footer-actions seconded-audit-actions">
<van-button block class="info-ghost-button" :loading="formLoading" @click="openDialog(false)">拒绝</van-button>
<van-button block class="info-primary-button" :loading="formLoading" @click="openDialog(true)">同意</van-button>
</div>
</van-row>
@@ -31,6 +64,7 @@ layout("/mobile/platform.html"){
return {
leftArrow: false,
proposalId: GetQueryString('proposal_id'),
formLoading: false,
secondedInfo: {
isAgree: false
}
@@ -41,36 +75,28 @@ layout("/mobile/platform.html"){
},
methods: {
openDialog(flag) {
if (this.formLoading) return
const res = flag === true ? '通过' : '拒绝'
vant.Dialog.confirm({
title: '提示',
message: '您确定' + res + '附议该提案吗?',
}).then(async () => {
const loading = this.$toast({
duration: 0,
message: '提交中...',
forbidClick: true,
loadingType: 'spinner',
type: 'loading',
overlay: true
});
const resp = await $.post("/platform/proposal/transact/seconded/doAudit", {
}).then(() => {
this.formLoading = true
$.post("/platform/proposal/transact/seconded/doAudit", {
secondedId: this.secondedInfo.id,
proposalId: this.proposalId,
flag: flag
})
if (resp.code === 0) {
setTimeout(async () => {
loading.close()
}).then((resp) => {
if (resp.code === 0) {
this.$refs.pi.openView(this.proposalId)
this.getSecondedCount()
this.$toast.success("操作成功")
}, 1200)
} else {
loading.close()
this.$toast.fail("操作失败,请及时联系管理员")
}
} else {
this.$toast.fail(resp.msg || "操作失败,请及时联系管理员")
}
}).always(() => {
this.formLoading = false
})
})
},
getSecondedCount() {
@@ -78,12 +104,12 @@ layout("/mobile/platform.html"){
$.post("/mobile/proposal/seconded/getSecondedCount", {
proposalId: this.proposalId,
id: biz_key
}).then(res => {
}).then((res) => {
this.secondedInfo = res.data
})
}
},
async created() {
created() {
if (GetQueryString("mobile")) this.leftArrow = true
const proposal_id = GetQueryString("proposal_id")
const biz_key = GetQueryString("biz_key")
@@ -1,41 +1,6 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
.van-doc-card {
margin: 14px;
padding: 12px 12px 12px 12px;
background-color: #fff;
border-radius: 10px;
box-shadow: 0 8px 12px #ebedf0;
line-height: 20px;
font-size: 12px;
position: relative;
}
.van-divider {
margin: 12px 0 12px 0px;
border-color: lightgray;
}
.van-button--small {
border-top-right-radius: 16px;
border-bottom-left-radius: 16px;
height: 26px;
}
.van-col {
line-height: 25px;
}
.title_span {
font-size: 16px;
font-weight: bold;
position: absolute;
left: -1px;
top: 11px;
}
</style>
<div id="app" v-cloak>
<m-page-loading v-if="mLoading"></m-page-loading>
<van-nav-bar
@@ -50,79 +15,72 @@ layout("/mobile/platform.html"){
<van-search
v-model="pageForm.searchKeyWord"
shape="round"
maxlength="10"
maxlength="20"
@search="doSearch"
placeholder="请输入提案名称或者提案编号进行查询"
>
</van-search>
></van-search>
<van-dropdown-menu>
<van-dropdown-item v-model="pageForm.meetingId" :options="sessionList"
@change="doSearch"></van-dropdown-item>
<van-dropdown-item v-model="pageForm.proposalTypeId" :options="proposalTypeList"
@change="doSearch"></van-dropdown-item>
<!-- <van-dropdown-item v-model="pageForm.proposalResultCode" :options="resultList"
@change="doSearch"></van-dropdown-item>-->
</van-dropdown-menu>
<van-tabs v-model="pageForm.isAudit" @change="doSearch()">
<van-tab title="附议" :name="false"></van-tab>
<van-tab title="已附议" :name="true"></van-tab>
<van-tabs v-model="pageForm.isAudit" @change="doSearch">
<van-tab title="待附议" name="false"></van-tab>
<van-tab title="附议" name="true"></van-tab>
</van-tabs>
</div>
<div style="margin: 170px auto 0">
<van-list
v-model="mLoading" :immediate-check="false"
v-if="pageForm.meetingId"
v-model="mLoading"
:immediate-check="false"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<div v-for="o in tableData" class="van-doc-card">
<div @click="openView(o.id,o.secondedId)">
<div>
<div class="van-ellipsis"
style="font-size: 13px;font-weight: bold;flex: 1;width:80%;overflow: hidden;white-space: nowrap">
<span class="title_span" :style="'color:'+o.stateColor">|</span>提案名称:{{o.proposalName}}
</div>
<div style="position: absolute; right: 14px;top: 12.3px;text-align: right" v-if="!o.isAgree">
<van-tag :style="'color:'+o.stateColor" size="medium" plain round type="primary">附议
</van-tag>
</div>
<div v-for="o in tableData" class="list-card" :style="{'--card-accent': o.stateColor || '#2563eb'}"
@click="openView(o)">
<div class="card-header">
<div class="card-title">
{{o.proposalName}}
</div>
<van-divider></van-divider>
<div>
<van-row>
<van-col span="12"><span style="color: grey">提案编号:</span>{{o.proposalCode}}</van-col>
<van-col span="12"><span style="color: grey">提案类型:</span>{{o.typeName}}</van-col>
</van-row>
<van-row>
<van-col span="12" style="overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">
<span style="color: grey">&ensp;&ensp;团:</span>{{o.delegationName}}
</van-col>
<van-col span="12"><span style="color: grey">提案届次:</span>{{o.meetingName}}</van-col>
</van-row>
<van-divider></van-divider>
<span class="badge" :class="getAgreeBadgeClass(o)">
{{getAgreeText(o)}}
</span>
</div>
<div class="card-body">
<div class="card-item">
<span class="card-label">提案编号:</span>
<span class="card-value">{{o.proposalCode}}</span>
</div>
<div class="train-title" style="margin-top: 11px">
<span style="color: grey">立案结果</span>{{o.resultName ? o.resultName : '暂无'}}
<span style="color: grey;margin-left: 24%;">&ensp;&ensp;人:</span>{{o.secondedUserName}}
<div class="card-item">
<span class="card-label">提案类型</span>
<span class="card-value">{{o.typeName}}</span>
</div>
<div class="card-item">
<span class="card-label">代表团:</span>
<span class="card-value">{{o.delegationName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案届次:</span>
<span class="card-value">{{o.meetingName}}</span>
</div>
<div class="card-item">
<span class="card-label">提案状态:</span>
<span class="card-value">{{o.stateName}}</span>
</div>
<div class="card-item">
<span class="card-label">附议人:</span>
<span class="card-value">{{o.secondedUserName}}</span>
</div>
</div>
<!-- <van-cell-group inset>
<van-cell title="提案名称" :border="false">
<div style="display: flex;align-items: center">
<span :style="{color:themeColor}" style="font-size: 16px" class="van-ellipsis">{{o.proposalName}}</span>
</div>
</van-cell>
<van-cell :border="false" title="提案编号">{{o.proposalCode}}</van-cell>
<van-cell :border="false" title="附&emsp14;&emsp14;议&emsp14;&emsp14;人">{{o.secondedUserName}}</van-cell>
<van-cell :border="false" title="提案类型">{{o.typeName}}</van-cell>
<van-cell :border="false" title="提案状态">
<span :style="'color:'+o.stateColor">{{ o.stateName }}</span>
</van-cell>
</van-cell-group>-->
<div class="card-footer">
<span class="card-label">立案结果:</span>
<span class="card-value">{{o.resultName ? o.resultName : '暂无'}}</span>
</div>
</div>
</van-list>
<van-empty
@@ -142,95 +100,98 @@ layout("/mobile/platform.html"){
data() {
return {
pageForm: {
isAudit: false
isAudit: 'false'
},
list: [],
state: '0',
loading: false,
finished: false,
refreshing: false,
sessionList: [],
delegationList: [],
proposalTypeList: [],
resultList: [],
auditList: [
{text: '未附议', value: false},
{text: '已附议', value: true},
]
listLoading: false
}
},
methods: {
getAgreeText(row) {
if (row.isAgree === true || row.isAgree === 1) {
return '已同意'
}
if (row.isAgree === false || row.isAgree === 0) {
return '已拒绝'
}
return '待附议'
},
getAgreeBadgeClass(row) {
if (row.isAgree === true || row.isAgree === 1) {
return 'badge-green'
}
if (row.isAgree === false || row.isAgree === 0) {
return 'badge-red'
}
return 'badge-draft'
},
doSearch() {
this.pageForm.pageNumber = 1
this.$set(this.pageForm, 'pageNumber', 1)
this.tableData = []
this.finished = false
this.onLoad()
},
async onLoad() {
onLoad() {
if (this.listLoading || this.finished) {
return
}
this.listLoading = true
this.mLoading = true
$.post(loc() + '/pageData', this.pageForm).then(res => {
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.pageForm.pageNumber++
}
}
this.mLoading = false
})
},
doAudit(flag, row) {
const {id, secondedId} = row
let res = flag === true ? '通过' : '拒绝'
vant.Dialog.confirm({
title: '提示',
message: '您确定' + res + '吗?',
}).then(() => {
$.post('/platform/proposal/transact/seconded/doAudit', {
secondedId: secondedId,
proposalId: id,
flag: flag
}).then(res => {
$.post(loc() + '/pageData', this.pageForm)
.then((res) => {
if (res.code === 0) {
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length >= res.data.totalCount) {
this.finished = true
} else {
this.$set(this.pageForm, 'pageNumber', this.pageForm.pageNumber + 1)
}
this.tableData = []
this.onLoad()
vant.Toast.success('提交成功!')
}
})
}).catch(() => {
})
.always(() => {
this.listLoading = false
this.mLoading = false
})
},
openView(id, secondedId) {
window.location.href = '/mobile/proposal/seconded/view?biz_key=' + secondedId + '&proposal_id=' + id + '&mobile=' + true
openView(row) {
window.location.href = '/mobile/proposal/seconded/view?biz_key=' + row.secondedId
+ '&proposal_id=' + row.id
+ '&mobile=' + true
},
loadOptions() {
$.get('/mobile/proposal/common/getAllSession')
.then((res) => {
this.sessionList = res.data
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, 'meetingId', this.sessionList[0].value)
}
})
.then(() => $.get('/mobile/proposal/common/getProposalType'))
.then((res) => {
this.proposalTypeList = res.data
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, 'proposalTypeId', this.proposalTypeList[0].value)
}
this.onLoad()
})
}
},
async created() {
this.sessionList = await mProposal.getAllSession()
this.proposalTypeList = await mProposal.getProposalType()
this.resultList = await mProposal.getProposalDict()
if (this.sessionList && this.sessionList.length > 0) {
this.$set(this.pageForm, "meetingId", this.sessionList[0].value)
}
if (this.proposalTypeList && this.proposalTypeList.length > 0) {
this.$set(this.pageForm, "proposalTypeId", this.proposalTypeList[0].value)
}
if (this.resultList && this.resultList.length > 0) {
this.$set(this.pageForm, "proposalResultCode", this.resultList[0].value)
}
this.onLoad()
created() {
this.$set(this.pageForm, 'pageNumber', 1)
this.$set(this.pageForm, 'pageSize', 5)
this.$set(this.pageForm, 'totalCount', 0)
this.loadOptions()
},
})
window.addEventListener('pageshow', e => {
window.addEventListener('pageshow', (e) => {
if (e.persisted || (window.performance && window.performance.navigation.type === 2)) {
vue.onLoad()
vue.$set(vue.pageForm, 'pageNumber', 1)
vue.$set(vue.pageForm, 'meetingId', null)
vue.tableData = []
vue.finished = false
vue.loadOptions()
}
})
@@ -231,6 +231,20 @@ layout("/layouts/platform.html"){
v-loading="formLoading">
<vi-title title="福利项目信息"></vi-title>
<el-form-item label="沿用项目" v-if="!formData.id">
<el-select @change="reuseProjectChange"
clearable
filterable
placeholder="请选择需要沿用的历史福利项目"
style="width: 100%"
v-model="reuseProjectId">
<el-option :key="item.value"
:label="item.label"
:value="item.value"
v-for="item in reuseProjectOptions"></el-option>
</el-select>
</el-form-item>
<el-form-item label="项目名称" prop="name">
<el-input maxlength="100" placeholder="项目名称" v-model="formData.name"></el-input>
</el-form-item>
@@ -310,7 +324,8 @@ layout("/layouts/platform.html"){
</el-switch>
</el-form-item>
</el-col>-->
</el-row>
<el-row>
<el-col span="4" v-if="formData.isRoutine">
<el-form-item label="是否多选" prop="isCheckBox">
<el-switch
@@ -338,7 +353,6 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-col>
</template>
</el-row>
<el-form-item label="人员核对名单" prop="taskId" v-if="formData.isYearBirthday">
@@ -458,24 +472,24 @@ layout("/layouts/platform.html"){
>
<el-form :model="formData" label-width="80px" ref="sendForm">
<!-- <el-form-item
:rules="[{required: true, message: '请选择发送方式', trigger: ['blur', 'change']}]"
label="发送方式"
prop="sendTypes">
<el-checkbox-group size="medium" v-model="formData.sendTypes">
<el-checkbox border label="SMS">短信发送</el-checkbox>
<el-checkbox border label="WeChat">微信发送</el-checkbox>
</el-checkbox-group>
</el-form-item>
-->
<!-- <el-form-item
:rules="[{required: true, message: '请选择发送方式', trigger: ['blur', 'change']}]"
label="发送方式"
prop="sendTypes">
<el-checkbox-group size="medium" v-model="formData.sendTypes">
<el-checkbox border label="SMS">短信发送</el-checkbox>
<el-checkbox border label="WeChat">微信发送</el-checkbox>
</el-checkbox-group>
</el-form-item>
-->
<el-form-item
:rules="[{required: true, message: '请输入发送标题', trigger: ['blur', 'change']}]"
label="发送标题"
prop="title">
:rules="[{required: true, message: '请输入发送标题', trigger: ['blur', 'change']}]"
label="发送标题"
prop="title">
<el-input
:rows="6"
placeholder="请输入发送标题"
v-model="formData.title">
:rows="6"
placeholder="请输入发送标题"
v-model="formData.title">
</el-input>
</el-form-item>
@@ -563,6 +577,8 @@ layout("/layouts/platform.html"){
sendMsgDialogVisible: false,
memberCheckTaskOptions: [],
reuseProjectId: null,
reuseProjectOptions: [],
}
},
components: {
@@ -573,6 +589,95 @@ layout("/layouts/platform.html"){
'send-msg': httpVueLoader('/components/plugins/SendMsgByGroupId.vue'),
},
methods: {
getReuseProjectOptions(projectOptions) {
let options = []
projectOptions.forEach(yearItem => {
if (yearItem.children && yearItem.children.length > 0) {
yearItem.children.forEach(project => {
options.push({
label: yearItem.label + " - " + project.label,
value: project.value
})
})
}
})
return options
},
resetReuseProjectIds(project) {
if (project.welfareProjectSubjects && project.welfareProjectSubjects.length > 0) {
project.welfareProjectSubjects.forEach(subject => {
subject.id = null
subject.projectId = null
if (subject.options && subject.options.length > 0) {
subject.options.forEach(option => {
option.id = null
option.subjectId = null
option.selectCount = null
option.rank = null
if (!option.optionNameId) {
option.optionNameId = ""
}
})
}
})
}
},
resetReuseConditionStructure(project) {
project.conditionStructureId = null
if (project.conditionStructure) {
project.conditionStructure.id = null
if (project.conditionStructure.conditions && project.conditionStructure.conditions.length > 0) {
project.conditionStructure.conditions.forEach(condition => {
condition.id = null
condition.structureId = null
})
}
}
},
reuseProjectChange(projectId) {
if (!projectId) {
return
}
this.formLoading = true
$.get(loc() + "/findOne", {id: projectId})
.then((resp) => {
if (resp.code === 0) {
const data = clone(resp.data)
data.id = null
data.taskId = null
data.year = null
data.created = null
data.choiceTimeStart = ""
data.choiceTimeEnd = ""
data.provideTimeStart = ""
data.provideTimeEnd = ""
data.overdueChoiceTimeEnd = ""
data.choiceTime = []
data.provideTime = []
this.resetReuseConditionStructure(data)
data.flexibleGifts = data.flexibleGifts || [{}]
const idx = data.flexibleGifts.findIndex(v => v.isDefault)
data.defaultFlexibleGifts = idx < 0 ? 0 : idx
if (!data.welfareProjectSubjects || data.welfareProjectSubjects.length === 0) {
data.welfareProjectSubjects = []
} else {
this.resetReuseProjectIds(data)
}
this.formData = data
this.$nextTick(() => {
if (this.$refs.form) {
this.$refs.form.clearValidate()
}
})
this.$message.success("已沿用所选项目配置,请确认项目名称、时间和发放范围")
} else {
this.$message.warning(resp.msg)
}
})
.always(() => {
this.formLoading = false
})
},
async getMemberCheckTaskOptions() {
const resp = await $.get('/platform/welfareMember/check/task/getAllTask', {year: this.pageForm.year})
this.memberCheckTaskOptions = resp.data.filter(item => item.welfareCheckFilterMode === 2)
@@ -631,7 +736,7 @@ layout("/layouts/platform.html"){
},
isCheckBoxChange() {
if (this.formData.welfareProjectSubjects && this.formData.welfareProjectSubjects.length > 0) {
this.formData.welfareProjectSubjects.forEach(v=> {
this.formData.welfareProjectSubjects.forEach(v => {
v.subjectType = this.formData.isCheckBox ? this.formData.isCheckBox : 'radio'
})
} else {
@@ -772,6 +877,7 @@ layout("/layouts/platform.html"){
welfareProjectSubjects: [],
flexibleGifts: [{}]
}
this.reuseProjectId = null
this.$refs.guava.edit()
if (this.$refs.form)
this.$refs.form.resetFields();
@@ -946,6 +1052,9 @@ layout("/layouts/platform.html"){
const personType = await getDictOptions("PERSON_TYPE")
const userState = await getDictOptions("USER_STATE")
this.getMemberCheckTaskOptions();
getWelfareProjects().then((options) => {
this.reuseProjectOptions = this.getReuseProjectOptions(options)
})
this.fields = this.fields.concat([{
label: '人员类型',
value: 'personType',