first commit

This commit is contained in:
2026-09-09 09:14:28 +08:00
commit 5343198112
5199 changed files with 1052895 additions and 0 deletions
+102
View File
@@ -0,0 +1,102 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
.van-cell {
font-size: 12px !important;
}
</style>
<div id="app" v-cloak>
<van-nav-bar
title="提案详情"
left-arrow
placeholder
fixed
@click-left="history.back()"
></van-nav-bar>
<div style="padding-top: 20px">
<van-collapse v-model="activeNames">
<van-collapse-item title="提案基本信息" name="1">
<van-cell title="提案名称">
<div>
{{tableData.proposalName}}
</div>
</van-cell>
<van-cell title="提案人">
<div>
{{tableData.createUserName}}
</div>
</van-cell>
<van-cell title="所在部门">
<div>
{{tableData.unionName}}
</div>
</van-cell>
<van-cell title="提案类型">
<div>
{{tableData.typeName}}
</div>
</van-cell>
<van-cell title="立案结果">
<span>{{tableData.resultName ? tableData.resultName : '暂无'}}</span>
</van-cell>
<van-cell title="附议人">
<div>
<span v-if="!tableData.seconded">暂无</span>
<span v-else v-for="(item,index) in tableData.seconded">
{{ item.username }}
{{ index + 1 === tableData.seconded.length ? '' : '、' }}
</span>
</div>
</van-cell>
<van-collapse v-model="ayActiveNames" border="false">
<van-collapse-item title="案由" name="1">
<div v-html="tableData.brief"></div>
</van-collapse-item>
</van-collapse>
<van-collapse v-model="jyActiveNames" border="false">
<van-collapse-item title="建议或措施" name="1">
<div v-html="tableData.measures"></div>
</van-collapse-item>
</van-collapse>
</van-collapse-item>
</van-collapse>
</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
ayActiveNames: [],
jyActiveNames: [],
activeNames: ['1'],
tableData: {}
}
},
methods: {
checkParams() {
if (GetQueryString('id') === '') {
vant.Toast.fail('参数不合法');
return false
}
return true
}
},
created() {
if (this.checkParams()) {
$.post('/platform/mobile/proposal/compose/findOne', {id: GetQueryString('id')}).then(res => {
if (res.code === 0) {
this.tableData = res.data
}
})
}
}
})
</script>
<!--#
}
#-->
+176
View File
@@ -0,0 +1,176 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
#app {
height: 100%;
}
.cell-card {
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
width: 90%;
margin: 20px auto;
border-radius: 20px;
}
.text-overflow {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
.handleicon {
width: 50%;
text-align: center;
}
</style>
<div id="app" v-cloak>
<van-nav-bar
title="提案列表"
left-arrow
placeholder
fixed
@click-left="location.href='/mobile/index'"
></van-nav-bar>
<div>
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model="loading"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad"
>
<van-cell v-for="o in tableData" class="cell-card" @click="openView(o.id)">
<div style="display: flex">
<div style="width: 75%">
<div class="text-overflow" style="font-weight: bold;color: #409EFF">{{o.proposalName}}</div>
<div style="font-size: 12px">编号:{{o.proposalCode}}</div>
<div style="font-size: 12px">附议人:{{o.secondedUserName}}</div>
</div>
<div style="width: 25%;display: flex;align-items: center" v-if="o.isAgree == undefined">
<van-icon @click.stop="doAudit(false,o)" class="handleicon" name="close"
size="30px" color="gray"></van-icon>
<van-icon @click.stop="doAudit(true,o)" class="handleicon" name="passed"
size="30px" color="#07c160"></van-icon>
</div>
<div style="width: 25%;display: flex;align-items: center;" v-else>
<span style="color: #FF4949" v-if="!o.isAgree">不通过</span>
<span style="color: #13CE66" v-if="o.isAgree">通过</span>
</div>
</div>
<van-divider></van-divider>
<div style="display: flex;font-size: 12px">
<div style="width: 38%">
<div style="color: gray">教代会届次</div>
<div class="text-overflow">{{o.meetingName}}</div>
</div>
<div style="width: 38%">
<div style="color: gray">提案类型</div>
<div class="text-overflow">{{o.typeName}}</div>
</div>
<div style="width: 23%">
<div style="color: gray">提案状态</div>
<div class="text-overflow">{{o.stateName}}</div>
</div>
</div>
</van-cell>
</van-list>
</van-pull-refresh>
<van-empty
v-if="tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
list: [],
loading: false,
finished: false,
refreshing: false,
pageForm: {
pageNumber: 1,
pageSize: 5,
totalCount: 0
},
tableData: []
}
},
methods: {
async onRefresh() {
this.tableData = []
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
}
await this.onLoad()
setTimeout(() => {
this.refreshing = false
}, 1000)
},
async onLoad() {
this.loading = true
$.post('/platform/mobile/proposal/seconded/pageData', this.pageForm).then(res => {
this.loading = false
if (res.code === 0) {
this.tableData = this.tableData.concat(res.data.list)
if (this.tableData.length === res.data.totalCount) {
this.finished = true
} else {
this.finished = true
this.pageForm.pageNumber++
}
}
})
},
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 => {
if (res.code === 0) {
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
}
this.tableData = []
this.onLoad()
vant.Toast.success('提交成功!')
}
})
}).catch(() => {
})
},
openView(id) {
window.location.href = '/platform/mobile/proposal/compose/detail?id=' + id
}
}
})
</script>
<!--#
}
#-->
+172
View File
@@ -0,0 +1,172 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
#app {
height: 100%;
}
.cell-card {
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
width: 90%;
margin: 20px auto;
border-radius: 20px;
}
.text-overflow {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
</style>
<div id="app" v-cloak>
<van-nav-bar
title="个人提案"
left-arrow
placeholder
fixed
@click-left="history.back()"
></van-nav-bar>
<div>
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model="loading"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad">
<van-cell v-for="o in tableData" class="cell-card">
<div style="width: 100%;display: flex;flex-direction:row">
<div class="text-overflow" style="font-weight: bold;color: #409EFF;width: calc(100% - 50px)"
@click="openView(o.id)">
{{o.proposalName}}
</div>
<div v-if="o.stateCode==100&&!config.isAutoSubmit" @click="doSubmit(o)"
style="width: 50px;display: flex;flex-direction:column;align-items: center;justify-content: center;font-size: 20px;color: #409EFF">
<van-icon name="share"/>
<div style="font-size: 8px">提交</div>
</div>
</div>
<div style="font-size: 12px">编号:{{o.proposalCode}}</div>
<van-divider></van-divider>
<div style="display: flex;font-size: 12px">
<div style="width: 38%">
<div style="color: gray">教代会届次</div>
<div class="text-overflow">{{o.meetingName}}</div>
</div>
<div style="width: 38%">
<div style="color: gray">提案类型</div>
<div class="text-overflow">{{o.typeName}}</div>
</div>
<div style="width: 23%">
<div style="color: gray">提案状态</div>
<div class="text-overflow">{{o.stateName}}</div>
</div>
</div>
</van-cell>
</van-list>
</van-pull-refresh>
<van-empty
v-if="tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
</div>
<script>
new Vue({
el: '#app',
data() {
return {
list: [],
config: [],
loading: false,
finished: false,
refreshing: false,
pageForm: {
pageNumber: 1,
pageSize: 5,
totalCount: 0
},
tableData: []
}
},
methods: {
async doSubmit(row) {
vant.Dialog.confirm({
title: '提示',
message: '是否提交提案?',
})
.then(async () => {
const toast = vant.Toast.loading({
duration: 0,
forbidClick: true,
message: '正在提交...',
});
const {code, msg} = await $.post('/platform/proposal/transact/compose/doSubmit', {
id: row.id,
mannerCode: row.mannerCode
})
if (code === 0) {
toast.icon = 'success'
toast.message = '提交成功'
await this.onRefresh()
} else {
toast.icon = 'fail'
toast.message = msg
}
setTimeout(() => {
vant.Toast.clear();
}, 500)
});
},
async onRefresh() {
this.tableData = []
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
}
await this.onLoad()
setTimeout(() => {
this.refreshing = false
}, 1000)
},
async onLoad() {
this.loading = true
$.post('/platform/mobile/proposal/compose/pageData', this.pageForm).then(res => {
this.loading = false
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++
}
}
})
},
openView(id) {
window.location.href = '/platform/mobile/proposal/compose/detail?id=' + id
}
},
async created() {
this.config = await getProposalConfig()
console.log(this.config)
}
})
</script>
<!--#
}
#-->
+237
View File
@@ -0,0 +1,237 @@
<!--#
layout("/mobile/platform.html"){
#-->
<style>
#app {
height: 100%;
}
.cell-card {
padding: 20px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, .1);
width: 90%;
margin: 20px auto;
border-radius: 20px;
}
.text-overflow {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
}
</style>
<div id="app" v-cloak>
<van-nav-bar
title="团长审议"
left-arrow
placeholder
fixed
@click-left="location.href='/mobile/index'"
></van-nav-bar>
<div>
<van-pull-refresh v-model="refreshing" @refresh="onRefresh">
<van-list
v-model="loading"
:finished="finished"
:finished-text="tableData.length>0?'没有更多了':''"
@load="onLoad"
>
<van-cell v-for="o in tableData" class="cell-card" @click="openView(o.id)">
<div style="display: flex">
<div style="width: 85%">
<div class="text-overflow" style="font-weight: bold;color: #409EFF">{{o.proposalName}}</div>
<div style="font-size: 12px">编号:{{o.proposalCode}}</div>
</div>
<div style="width: 15%;display: flex;align-items: center">
<van-icon @click.stop="openAudit(o.id)">
<svg t="1598756637099" class="icon" viewBox="0 0 1024 1024" version="1.1"
xmlns="http://www.w3.org/2000/svg" p-id="2148" width="32" height="32">
<path d="M876.214237 0z" fill="#ED8A19" p-id="2149"></path>
<path d="M841.762712 121.491525h69.423729v69.423729h-69.423729z" fill="#E0E1E2"
p-id="2150"></path>
<path d="M856.949153 5.883661l0 0zM911.186441 0h-34.972204a34.538305 34.538305 0 0 0-19.265084 5.883661 34.434169 34.434169 0 0 0-15.186441 28.567864V121.491525h69.423729V0z"
fill="#D75A4A" p-id="2151"></path>
<path d="M911.186441 190.915254h69.423728v659.525424h-69.423728z" fill="#DB7B1B"
p-id="2152"></path>
<path d="M911.186441 121.491525h69.423728v69.423729h-69.423728z" fill="#C4C4C4"
p-id="2153"></path>
<path d="M980.610169 121.491525V34.451525A34.434169 34.434169 0 0 0 946.158644 0H911.186441v121.491525h69.423728z"
fill="#B74C44" p-id="2154"></path>
<path d="M373.152542 0h156.20339v86.779661h-156.20339z" fill="#303644"
p-id="2155"></path>
<path d="M841.762712 850.440678V34.711864h-312.40678v52.067797h-156.20339V34.711864h-329.762711v971.932204h815.728813v-125.830509z"
fill="#424A60" p-id="2156"></path>
<path d="M529.355932 34.711864v52.067797h-156.20339V34.711864h-121.491525v104.135594h399.186441V34.711864z"
fill="#7383BF" p-id="2157"></path>
<path d="M650.847458 121.491525v17.355933h-399.186441V121.491525h-121.491525v798.372882h642.169491V121.491525z"
fill="#EDEADA" p-id="2158"></path>
<path d="M251.661017 312.40678h156.20339a17.355932 17.355932 0 1 0 0-34.711865h-156.20339a17.355932 17.355932 0 1 0 0 34.711865zM251.661017 433.898305h86.779661a17.355932 17.355932 0 1 0 0-34.711864h-86.779661a17.355932 17.355932 0 1 0 0 34.711864zM598.779661 399.186441h-121.491525a17.355932 17.355932 0 1 0 0 34.711864h121.491525a17.355932 17.355932 0 1 0 0-34.711864zM395.541695 404.219661c-3.141424 3.280271-5.03322 7.792814-5.03322 12.322712 0 4.512542 1.891797 9.025085 5.03322 12.322712a17.182373 17.182373 0 0 0 12.322712 5.03322c4.512542 0 9.025085-1.909153 12.322712-5.03322 3.124068-3.297627 5.03322-7.810169 5.03322-12.322712 0-4.529898-1.909153-9.042441-5.03322-12.322712-6.595254-6.421695-18.050169-6.421695-24.645424 0zM680.526102 404.219661c-6.595254-6.421695-18.050169-6.421695-24.645424 0-3.141424 3.280271-5.03322 7.792814-5.03322 12.322712 0 4.512542 1.891797 9.025085 5.03322 12.322712a17.182373 17.182373 0 0 0 12.322712 5.03322c4.686102 0 9.025085-1.909153 12.322712-5.03322 3.124068-3.297627 5.03322-7.810169 5.03322-12.322712 0-4.529898-1.909153-9.042441-5.03322-12.322712zM442.576271 520.677966h-121.491525a17.355932 17.355932 0 1 0 0 34.711865h121.491525a17.355932 17.355932 0 1 0 0-34.711865zM239.338305 525.711186a17.112949 17.112949 0 0 0-5.03322 12.322712c0 4.512542 1.891797 9.025085 5.03322 12.322712 3.280271 3.124068 7.810169 5.03322 12.322712 5.033221s9.025085-1.909153 12.322712-5.033221a17.546847 17.546847 0 0 0 0-24.645424c-6.595254-6.421695-18.050169-6.421695-24.645424 0z"
fill="#CEC9AE" p-id="2159"></path>
<path d="M347.552542 627.191322c-38.026847 19.785763-50.818169 57.621695-55.469559 96.880814l-21.538712-18.05017c-17.026169-14.266576-41.723661 10.15322-24.541288 24.558644l48.700746 40.803797c11.489627 9.632542 29.088542 3.662102 29.626576-12.270644 1.266983-37.610305 3.072-82.319186 40.751729-101.93139 19.855186-10.361492 2.290983-40.317831-17.529492-29.991051zM509.639593 715.411525c-9.025085-16.141017-28.498441-24.142102-46.652746-19.004745-23.690847 6.69939-51.738034 35.440814-68.312949 1.839728-9.910237-20.080814-39.831864-2.481898-29.973695 17.512136 8.920949 18.084881 26.033898 31.205966 46.322983 33.531661 10.535051 1.197559 19.386576-0.225627 29.296814-3.922441 7.046508-2.638102 33.375458-23.118102 39.345898-12.444203 10.916881 19.54278 40.890576 2.048 29.973695-17.512136z"
fill="#7383BF" p-id="2160"></path>
<path d="M980.610169 850.440678h-138.847457l69.423729 121.491525z" fill="#EBD6BD"
p-id="2161"></path>
<path d="M893.830508 1006.644068a17.355932 17.355932 0 1 0 34.711865 0v-69.423729h-34.711865v69.423729z"
fill="#4C4C4C" p-id="2162"></path>
<path d="M841.762712 190.915254h69.423729v659.525424h-69.423729z" fill="#ED8A19"
p-id="2163"></path>
</svg>
</van-icon>
</div>
</div>
<van-divider></van-divider>
<div style="display: flex;font-size: 12px">
<div style="width: 38%">
<div style="color: gray">教代会届次</div>
<div class="text-overflow">{{o.meetingName}}</div>
</div>
<div style="width: 38%">
<div style="color: gray">提案类型</div>
<div class="text-overflow">{{o.typeName}}</div>
</div>
<div style="width: 23%">
<div style="color: gray">提案状态</div>
<div class="text-overflow">{{o.stateName}}</div>
</div>
</div>
</van-cell>
</van-list>
</van-pull-refresh>
<van-empty
v-if="tableData.length==0"
class="custom-image"
image="/none.svg"
description="暂无数据"
></van-empty>
</div>
<van-dialog v-model="show" title="团长审核" @confirm="doHandle" @cancel="show=!show" show-cancel-button
:before-close="validateForm">
<van-form ref="handleForm" @submit="doHandle">
<van-field
maxlength="50"
rows="5"
autosize
type="textarea"
show-word-limit
v-model="formData.opinion"
name="tzsyqk"
label="意见"
placeholder="请输入您的意见"
:rules="[{ required: true, message: '请输入审核意见' }]"
></van-field>
<van-field name="state" label="结果">
<template #input>
<van-radio-group v-model="state" direction="horizontal">
<van-radio name="0">通过</van-radio>
<van-radio name="2">退回</van-radio>
</van-radio-group>
</template>
</van-field>
</van-form>
</van-dialog>
</div>
<script>
let vue = new Vue({
el: '#app',
data() {
return {
list: [],
state: '0',
loading: false,
finished: false,
refreshing: false,
pageForm: {
pageNumber: 1,
pageSize: 5,
totalCount: 0
},
tableData: [],
show: false,
formData: {}
}
},
methods: {
async onRefresh() {
this.tableData = []
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
}
await this.onLoad()
setTimeout(() => {
this.refreshing = false
}, 1000)
},
async onLoad() {
this.loading = true
$.post('/platform/mobile/proposal/delegation/pageData', this.pageForm).then(res => {
this.loading = false
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++
}
}
})
},
openAudit(id) {
this.formData = {
proposalId: id,
username: "${@shiro.getPrincipalProperty('username')}",
loginName: "${@shiro.getPrincipalProperty('loginname')}",
auditTime: moment().format('YYYY-MM-DD'),
opinion: '',
sign: '',
}
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)
if (res.code === 0) {
this.show = false
this.pageForm = {
pageNumber: 1,
pageSize: 5,
totalCount: 0
}
this.tableData = []
this.onLoad()
vant.Toast.success('审核成功!')
} else {
vant.Toast.error('审核失败!')
}
})
})
},
openView(id) {
window.location.href = '/platform/mobile/proposal/compose/detail?id=' + id
}
},
created() {
}
})
</script>
<!--#
}
#-->