759d9885 by 杨炀

no message

1 parent 8e4243b3
Showing 58 changed files with 4194 additions and 456 deletions
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}
import request from './request'
import * as api from '@/common/api.js'
let appId = ''
// #ifdef MP
const accountInfo = uni.getAccountInfoSync()
appId = accountInfo.miniProgram.appId
// #endif
function wxLogin() {
return new Promise((resolve, reject) => {
uni.login({
provider: 'weixin',
success: (res) => {
// console.log(res.code);
resolve(res)
},
fail: (res) => {
reject(res)
}
})
})
}
function pcLogin(data) {
return request({
url: '/login',
method: 'post',
params: data
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
return request({
url: '/login',
method: 'post',
params: data
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
}
function h5Login(userName) {
return request({
url: `/h5Login`,
method: 'post',
params: {
username: userName
}
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
return request({
url: `/h5Login`,
method: 'post',
params: {
username: userName
}
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
}
function h5LoginAuto() {
const userName = uni.getStorageSync('userName')
if (userName) {
return h5Login(userName)
} else {
uni.redirectTo({
url: '/pages/index/login'
})
}
const userName = uni.getStorageSync('userName')
if (userName) {
return h5Login(userName)
} else {
uni.redirectTo({
url: '/pages/index/login'
})
}
}
function getCurrUser(isAuto) {
return request({
url: '/system/wx/getUserInfo',
method: 'GET',
opts: {
isAuto: isAuto
}
}).then((res) => {
const user = res.data
uni.setStorageSync('currUser', user)
return user
})
}
function getWxUser() {
return new Promise((resolve, reject) => {
const currUser = uni.getStorageSync('currUser')
// getNowOpenId()
const nowOpenId = uni.getStorageSync('nowOpenId')
uni.getUserProfile({
desc: '用于完善用户信息',
success: function(infoRes) {
console.log(infoRes)
request({
url: `/system/wx/updateWxUser?openId=${nowOpenId}`,
method: 'POST',
params: {
appId: appId,
openId: nowOpenId,
userId: currUser.id,
encryptedData: infoRes.encryptedData,
errMsg: infoRes.errMsg,
iv: infoRes.iv,
rawData: infoRes.rawData,
signature: infoRes.signature
}
}).then((res) => {
const user = res.data
uni.setStorageSync('currUser', user)
resolve(user)
}).catch(() => {
reject()
})
},
fail: (res) => {
reject(res)
}
})
})
}
function getWxUserPhone(phoneRes) {
// console.log(phoneRes)
const currUser = uni.getStorageSync('currUser')
// getNowOpenId()
const nowOpenId = uni.getStorageSync('nowOpenId')
return request({
url: `/system/wx/updateMobile?openId=${nowOpenId}`,
method: 'POST',
params: {
appId: appId,
userId: currUser.id,
encryptedData: phoneRes.encryptedData,
errMsg: phoneRes.errMsg,
iv: phoneRes.iv,
rawData: phoneRes.rawData,
signature: phoneRes.signature
}
}).then((res) => {
const user = res.data
// uni.setStorageSync('token', 'Bearer '+ user.token);
uni.setStorageSync('token', user.token)
uni.setStorageSync('currUser', user)
return user
})
}
function checkUserAuth(path) {
const currUser = uni.getStorageSync('currUser')
if (currUser.phonenumber) {
// if (currUser.nickName) {
return true
} else {
uni.navigateTo({
url: '/pages/index/start?path=' + encodeURIComponent(path)
})
return false
}
}
function getNowOpenId() {
console.log('getNowOpenId')
return request({
url: `/system/user/getMyOpenId/${appId}`,
method: 'get'
}).then((res) => {
uni.setStorageSync('nowOpenId', res.msg)
})
}
function initData() {
console.log('initData')
// const currUser = uni.getStorageSync('currUser')
// console.log(currUser)
return Promise.all([api.getVenue(), api.getOwnMemberInfo()]).then(res => {
const ven = res[0].data
const men = res[1]?.data
const app = getApp()
if (ven.venuePic) {
ven.venuePicArr = ven.venuePic.split(',')
}
if (ven.businessPeriod) {
ven.startBus = ven.businessPeriod.split(',')[0]
ven.endBus = ven.businessPeriod.split(',')[1]
}
ven.latitude = ven.lal.split(',')[0]
ven.longitude = ven.lal.split(',')[1]
app.globalData.venue = ven
app.globalData.isVip = men?.isVip
// app.globalData.relateProjectId = men.info.relateProjectId;
app.globalData.relateProjectIdList = men?.info?.relateProjectIdList
app.globalData.relateVenueProjectIdList = men?.info?.relateVenueProjectIdList
app.globalData.venueConfig = {
normalOverDay: ven.resSiteConfig?.normalOrderNum,
normalPeriodStart: ven.resSiteConfig?.normalOrderPeriod.split(',')[0],
normalPeriodEnd: ven.resSiteConfig?.normalOrderPeriod.split(',')[1]
}
if (men?.isVip) {
app.globalData.venueConfig.memberOverDay = ven.resSiteConfig?.memberOrderNum
app.globalData.venueConfig.memberPeriodStart = ven.resSiteConfig?.memberOrderPeriod.split(',')[0]
app.globalData.venueConfig.memberPeriodEnd = ven.resSiteConfig?.memberOrderPeriod.split(',')[1]
}
})
}
function getCodeImg() {
return request({
url: '/captchaImage',
method: 'get'
})
return request({
url: '/captchaImage',
method: 'get'
})
}
// 代退图形认证的获取手机验证码
function getSmsCode(data) {
return request({
url: '/captchaSmsWithCaptchaImage',
method: 'post',
params: data
})
return request({
url: '/captchaSmsWithCaptchaImage',
method: 'post',
params: data
})
}
function loginByPhone(phonenumber, code) {
const data = {
phonenumber,
code
}
return request({
url: '/userLoginByPhone',
method: 'post',
params: data
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
const data = {
phonenumber,
code
}
return request({
url: '/userLoginByPhone',
method: 'post',
params: data
}).then((res) => {
uni.setStorageSync('token', 'Bearer ' + res.data.token)
}).then(getInfo)
}
// 获取用户详细信息
function getInfo() {
return request({
url: '/getInfo',
method: 'get'
}).then(res => {
const app = getApp()
const user = res.data.user
uni.setStorageSync('userName', user.userName)
switch (user.dept.deptType) {
case '1': // 中跆协
app.globalData.userType = '1'
break
case '2': // 省
case '3':
app.globalData.userType = '2'
break
case '6': // 道馆
app.globalData.userType = '4'
break
default: // 市、区
app.globalData.userType = '3'
break
}
return request({
url: '/getInfo',
method: 'get'
}).then(res => {
const app = getApp()
const user = res.data.user
uni.setStorageSync('userName', user.userName)
app.globalData.deptType = user.dept.deptType
switch (user.dept.deptType) {
case '1': // 中跆协
app.globalData.userType = '1'
break
case '2': // 省
case '3':
app.globalData.userType = '2'
break
case '6': // 道馆
app.globalData.userType = '4'
break
default: // 市、区
app.globalData.userType = '3'
break
}
app.globalData.userInfo = user
})
}
app.globalData.userInfo = user
})
// 团队会员用户注册接口
function groupMemberRegister(data) {
return request({
url: '/groupMemberRegister',
method: 'post',
params: data
})
}
// 团队会员用户注册接口
function groupMemberRegister(data) {
return request({
url: '/groupMemberRegister',
method: 'post',
params: data
})
// 获取道馆信息
function getMyOwnMemberInfo() {
return request({
url: '/member/info/getMyOwnMemberInfo',
method: 'get'
}).then(res => {
const app = getApp()
app.globalData.authenticationStatus = res.data.authenticationStatus
app.globalData.memberInfo = res.data.memberInfo
app.globalData.isExam = res.data?.dept?.isExam
})
}
export {
getNowOpenId,
wxLogin,
pcLogin,
getCurrUser,
getWxUser,
getWxUserPhone,
checkUserAuth,
initData,
getCodeImg,
getSmsCode,
h5Login,
h5LoginAuto,
loginByPhone,
groupMemberRegister
}
pcLogin,
getCodeImg,
getSmsCode,
h5Login,
h5LoginAuto,
loginByPhone,
groupMemberRegister,
getMyOwnMemberInfo
}
\ No newline at end of file
......
......@@ -3,10 +3,12 @@ page {
overflow: auto;
background: #f5f7f9;
}
.esp{text-overflow: ellipsis;overflow: hidden;white-space: nowrap;}
.flexbox{display: flex;}
.mt40{margin-top: 40rpx;}
.mt50{margin-top: 50rpx;}
.align-forms-item-placeHolder{color: #999;line-height: 2.6;}
.align-forms-item{line-height: 2.6;}
.more{color: #929AA0;font-size: 24rpx;}
.msglist{
.msgitem{background: #FFFFFF;border-radius: 10rpx;margin-bottom: 25rpx;padding: 30rpx 20rpx 30rpx 50rpx;
......@@ -26,6 +28,15 @@ font-size: 24rpx;}
}
}
.vipData{
font-size: 24rpx;padding: 10px 20px;
display: flex;background: #F7E7E8;
view{margin-right: 20rpx;
text{
font-weight: bold;
color: #AD1920;}
}
}
.nodata{padding:10vh 0; box-sizing: border-box; text-align: center;}
......@@ -42,13 +53,16 @@ font-size: 24rpx;}
.tar { text-align: right;}
.whitebg {background: #fff;
}
.btn-red-kx{background-color: #fff;
border: 1px solid #AD181F;
color: #AD181F;}
/* 底部固定按钮 */
.fixedBottom {background: #fff;height: 150rpx;
box-shadow: 0px -2rpx 10rpx 0px #e8e8e8; padding: 30rpx 0 0;
position: fixed; display: flex;justify-content: center;
width: 100%; bottom: 0;left: 0;z-index: 3;
.btn-red{line-height: 70rpx;height: 70rpx;border-radius: 35rpx;width: 500rpx;font-size: 32rpx;}
.btn-red-kx{line-height: 70rpx;height: 70rpx;border-radius: 35rpx;font-size: 32rpx;}
}
.nolineform{margin: 24rpx;background-color: #fff;padding: 30rpx;border-radius: 15rpx;
.uni-data-checklist .checklist-group .checklist-box .checklist-content .checklist-text{
......@@ -61,7 +75,7 @@ font-size: 30rpx!important;}
.uni-input-input{text-align: right;direction: rtl;font-size: 30rpx!important;}
.uni-forms-item__inner{}
.uni-select{border: transparent!important;border-bottom: transparent!important;text-align: right;font-size: 30rpx!important;}
.uni-data-checklist .checklist-group{justify-content: end;}
.uni-data-checklist .checklist-group{justify-content: flex-end;}
.uni-data-checklist .checklist-group .checklist-box{margin-right: 0!important;margin-left: 25px!important;}
.uni-data-checklist .checklist-group .checklist-box.is--default.is-checked .radio__inner .radio__inner-icon{
background-color: #C40F18!important;
......@@ -83,4 +97,231 @@ font-size: 30rpx!important;}
.hasfixedbottom{padding-bottom:170rpx;}
.btn-red{background: #AD181F;color: #fff;}
.invertedbtn-red{color: #AD181F;border:1px solid #AD181F;}
.text-red{color: #AD181F;}
\ No newline at end of file
.text-red{color: #AD181F;}
.pd30{padding: 30rpx;}
.appList{width: 700rpx;margin:30rpx auto;
.appItem{background: #FFFFFF;padding: 30rpx;margin-bottom: 30rpx;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196,203,214,0.1);
border-radius: 15rpx;position: relative;
.pp{font-size: 28rpx;color: #666;margin-bottom: 10rpx;}
.date{
font-size: 28rpx;
color: #7D8592;}
.name{margin: 30rpx 0 20rpx;color: #0A1629;font-size: 30rpx;}
.flexbox{justify-content: space-between;padding: 0 0 25rpx;
font-size: 28rpx;color: #91929E;
view{font-size: 26rpx;
view{color: #0A1629;font-size: 28rpx;}
}
}
}
.func{display: flex;justify-content: flex-end;
border-top: 1px dashed #e5e5e5;padding-top: 20rpx;
button{border: 1px solid #AD181F;
border-radius: 30rpx;height: 60rpx;line-height: 60rpx;
font-size: 30rpx;color: #AD181F;background: #fff;
margin: 0 0 0 30rpx;padding: 0 60rpx;
}
text{font-size: 30rpx;padding:30rpx 0 0;}
}
.status{position: absolute;font-size: 30rpx;right: 30rpx;}
}
.text-primary{color: #1561CB;}
.text-success{color: #13B5B1;}
.text-danger{color: #d51515;}
.text-warning{color: #e6a23c;}
.h3-padding{
padding:50rpx 30rpx 0;font-size: 36rpx;
font-weight: 500;color: #0A1629;
}
.mt30{margin-top: 30rpx;}
.userlist {
.colorful {
width: 100rpx;
margin-right: 14rpx;
height: 100rpx;
line-height: 100rpx;
font-size: 44rpx;
color: #fff;
text-align: center;
border-radius: 50%;
}
.w100{width: 100%;}
.item {
display: flex;width: 100%;
background: #FFFFFF;
align-items: center;
border-radius: 15rpx;
margin: 0 0 26rpx;
padding:20rpx;position: relative;
.date{color: #999;font-size: 24rpx;}
.status{font-size: 28rpx;position: absolute;right: 30rpx;}
.name{font-size: 30rpx;margin-bottom: 10rpx;
text{font-size: 28rpx;color: #666;}
}
.icon {
width: 50rpx;
height: 50rpx;
margin-right: 20rpx;
}
&:nth-child(5n) .colorful {
background: #014A9F;
}
&:nth-child(5n+1) .colorful {
background: #AD181F;
}
&:nth-child(5n+2) .colorful {
background: #D3B267;
}
&:nth-child(5n+3) .colorful {
background: #3195F5;
}
&:nth-child(5n+4) .colorful {
background: #E79222;
}
}
.photobox{}
.photo{width: 100rpx;margin-right: 14rpx;
height: 100rpx;border-radius: 50%;}
.colorful {
width: 100rpx;
margin-right: 14rpx;
height: 100rpx;
line-height: 100rpx;
font-size: 44rpx;
color: #fff;
text-align: center;
border-radius: 50%;
}
.flexbox{justify-content: space-between;
font-size: 28rpx;color: #91929E;
view{font-size: 26rpx;
text{color: #0A1629;font-size: 28rpx;display: block;}
.text-primary{color: #1561CB;}
.text-success{color: #13B5B1;}
.text-danger{color: #d51515;}
.text-warning{color: #e6a23c;}
}
}
}
.stepItem{position: relative;
padding: 0 0 30rpx 30rpx;
border-left: 1px dashed #e5e5e5;
.time{font-size: 24rpx;color: #929AA0;
margin-bottom: 20rpx;
&::before{content: '';
width: 15rpx;position: absolute;left: -9rpx;top: 12rpx;
height: 15rpx;
background: #DCDCDC;
border-radius: 50%;}
}
.content{background: #F4F9FD;position: relative;overflow: hidden;
font-size: 28rpx;border-radius: 15rpx;padding: 16rpx 36rpx;
.status{position: absolute;right: 0;top: 0;font-size: 28rpx;
text{color: #fff;padding: 0rpx 16rpx;border-radius: 0 0 0 10rpx;}
.text-primary{background: #1561CB;}
.text-success{background: #13B5B1;}
.text-danger{background: #d51515;}
.text-warning{background: #e6a23c;}
}
.name{color: #4C5359;}
.deptName{color: #4C5359;margin: 10rpx 0;
color: #030303;
font-size: 30rpx;}
}
}
.personitem {
background: #fff;
box-sizing: border-box;
margin-bottom: 30rpx;
.content-box {
display: flex;
align-items: center;
padding: 16rpx 30rpx;
border-radius: 15rpx;
justify-content: space-between;
.photobox {
position: relative;
}
.photo {
width: 100rpx;
object-fit: cover;
margin-right: 14rpx;
height: 100rpx;
border-radius: 50%;
}
.noborder {
border: none;
:deep(.uni-select) {
border: none;
text-align: right;
}
}
}
.flexbox {
align-items: center;
}
.date{font-size: 28rpx;color: #666;margin-top: 10rpx;}
&:nth-child(3n) .colorful {
background: #AD181F;
}
&:nth-child(3n+1) .colorful {
background: #014A9F;
}
&:nth-child(3n+2) .colorful {
background: #D3B267;
}
}
.colorful {
width: 100rpx;
margin-right: 14rpx;
height: 100rpx;
line-height: 100rpx;
font-size: 44rpx;
color: #fff;
text-align: center;
border-radius: 50%;
}
.slot-button {
display: flex;
align-items: center;
text-align: center;
.danger-button {
background-color: #E60012;
padding: 15px 20px;
height: 100%;
}
.edit-button {
background-color: #13B5B1;
padding: 15px 20px;
height: 100%;
}
}
.slot-button-text {
color: #ffffff;
display: block;
font-size: 14px;
}
......
......@@ -56,9 +56,11 @@ const request = function(req) {
switch (res.statusCode) {
case 200:
const data = res.data || {}
if (data.code === 200) {
if (data.code === 200||data.pageData?.code === 200) {
resolve(data)
} else {
} else if (req.url.indexOf('getMemberCountInfo')>-1){
resolve(data)
} else {
if (!excludeUrls.includes(req.url)) {
uni.showToast({
title: data.msg,
......
......@@ -3,8 +3,9 @@
// staging
const baseUrl_api = "http://192.168.1.96:8787";
const baseUrl_api = "http://192.168.1.96:8787";
const fileUrl_api = "http://192.168.1.11:8787";
export default {
baseUrl_api
};
\ No newline at end of file
baseUrl_api,fileUrl_api
}
\ No newline at end of file
......
......@@ -166,5 +166,18 @@
.formBox{ background: #fff;
padding: 50rpx 40rpx;
margin: 0 30rpx;
border-radius: 20rpx;}
border-radius: 20rpx;}
.popBody {
font-size: 28rpx;
line-height: 1.5;
font-family: 华文仿宋;
height: 80vh;
overflow: auto;
padding: 30rpx;
.btn-red {
margin: 50rpx 0 30rpx;
}
}
</style>
......
<template>
<view>
<!-- 会员调动 -->
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.auditStatus == 0">审核中</text>
<text v-if="item.auditStatus == 1" class="text-success">审核通过</text>
<text v-if="item.auditStatus == 2" class="text-danger">审核拒绝</text>
<text v-if="item.auditStatus == 3" class="text-warning">审核退回</text>
</view>
<view class="date">提交日期:{{item.content.commitTime}}</view>
<view class="date" v-if="item.content.validityTime">原有效期:{{item.content.validityTime}}</view>
<view class="name" @click="goDetail(item)">{{item.content.certName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
缴费单位
<view>{{ item.content.memberName }}</view>
</view>
<view>
会员合计
<view>{{item.content.allCount}}</view>
</view>
<view>
新会员合计
<view>{{item.content.renewYear}}</view>
</view>
<view>
费用合计
<view> {{ (item?.content?.allFee*1).toFixed(2) }}</view>
</view>
</view>
<view class="func" v-if="(deptType == 1&&item.ztxRes == 0)||((deptType == 2 || deptType == 3)&&item.shenRes == 0)">
<button @click="audit(item.recordId,'0')">拒绝</button>
<button @click="audit(item.recordId,'1')">同意</button>
</view>
<view class="func" v-if="(deptType == 6&&(item.status == 0 || item.status == 2))">
<button>提交审核</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
auditStatus:'0'
})
const navs = ref(['审核中', '审核通过', '审核拒绝', '退回'])
const current = ref()
const list = ref([])
const total = ref(0)
const deptType = ref('')
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getList()
}
function onClickItem(e) {
console.log(e)
queryParams.value.auditStatus = e.currentIndex
getList()
}
function getList() {
uni.showLoading({
title:'加载中'
})
if(deptType.value==2||deptType.value==3){
// 省
queryParams.value.mergeFlag = 0
}else if(deptType.value==1){
queryParams.value.noEmpty = 1
}else if( deptType.value==4||deptType.value==5){
queryParams.value.noEmpty=1
}
api.getGroupList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value.forEach(item => {
item.content = JSON.parse(item.content)
// item.doc = JSON.parse(item.doc)
})
total.value = res.total
})
}
function audit(recordId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(recordId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(recordId, flag)
}
}
})
}
}
function doApproval(recordId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
recordIds: []
}
obj.recordIds.push(recordId)
console.log(obj)
api.audit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
const auditLog = encodeURIComponent(JSON.stringify(item.auditLog))
const form = encodeURIComponent(JSON.stringify(item))
let path = `/pages/personalVip/mobilizeDetail?rangeId=${item.id}&auditLog=${auditLog}&form=${form}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped>
.mt0{margin-top: 0!important;}
.appList .appItem .name{width: 80%;word-break: break-all;}
</style>
\ No newline at end of file
<template>
<view>
<!-- 机构会员 -->
<view class="wBox">
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view class="photobox">
<view class="colorful">{{n.name?.slice(0,1)}}</view>
</view>
<view>
<view class="name">{{n.name}}
<text v-if="n.sex == 1">(女)</text>
<text v-else>(男)</text>
</view>
<!-- <view class="date">{{n.ancestorNameList[0]}} {{ n.ancestorNameList[1] }}
{{n.ancestorNameList[2]}}</view> -->
<view class="date">
注册时间 {{n.createTime }}
</view>
</view>
<view class="nian">
<text v-if="n.perType==1"> 个人</text>
<text v-if="n.perType==2"> 教练</text>
<text v-if="n.perType==3"> 考官</text>
<text v-if="n.perType==4"> 裁判</text>
<text v-if="n.perType==5">临时</text>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无会员</text>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const query = ref({
sonDeptId: 1,
perType: '1'
})
const list = ref([])
const forms = ref({})
const total = ref(0)
const current = ref(0)
const currentTabName = ref('道馆')
const userType = ref('')
const deptType = ref('')
onLoad((option) => {
query.value.sonDeptId = option.deptId
getList()
})
function getList() {
uni.showLoading({
title:"加载中"
})
api.selectPageList(query.value).then(res => {
uni.hideLoading()
list.value = res.rows
total.value = res.total
})
}
</script>
<style lang="scss" scoped>
.nian {
position: absolute;
right: 20rpx;
font-size: 26rpx;
color: #999;
}
</style>
\ No newline at end of file
<template>
<view>
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem" styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.name" placeholder="搜索团队会员名称" @blur="getList" @clear="getList">
</uni-easyinput>
</view>
<view class="vipData">
<view><text>{{ forms?.total }}</text></view>
<view>有效会员 <text>{{ forms?.effective }}</text></view>
<view>过期会员 <text>{{ forms?.expired }}</text></view>
<view>即将过期会员 <text>{{ forms?.soon }}</text></view>
</view>
<view class="indexboxre">
<view class="userlist mt30">
<view class="item" v-for="n in infoList" @click="handleInfo(n)">
<view @click="handleInfo(n)">
<view class="name">{{n.name}}<text v-if="n.memCode"> ({{n.memCode}}) </text></view>
<view class="date">到期时间:{{n.validityDate?.slice(0,10)||'--'}}</view>
</view>
<view class="status">
会员 <text class="text-success">{{n.validityMemberCount}}</text>/{{n.allMemberCount}}
</view>
</view>
</view>
<view class="nodata" v-if="infoList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const query = ref({
fromList: 1,
dType: 4,
})
const navs = ref(['道馆','三级协会','二级协会','一级协会'])
const list = ref([])
const forms = ref({})
const infoList = ref([])
const total = ref(0)
const current = ref(0)
const currentTabName = ref('道馆')
const userType = ref('')
const deptType = ref('')
onLoad(() => {
userType.value = app.globalData.userType
deptType.value = app.globalData.deptType
// 部门类型 1:中跆协 2:省 3:直属 4:市 5:区 6: 团体
if(deptType.value==2||deptType.value==3){
navs.value = ['道馆','三级协会','二级协会']
} else if(deptType.value==4){
navs.value = ['道馆','三级协会']
}
getList()
getGroupInfo()
})
function getList() {
console.log(current.value,currentTabName.value,query.value.dType)
api.getGroupVipList(query.value).then(res => {
infoList.value = res.rows
total.value = res.total
})
}
function getGroupInfo(){
api.getMemberCountInfo({dType: query.value.dType, fromList: 1}).then(res=>{
forms.value = res
})
}
function onClickItem(e){
current.value = e.currentIndex
currentTabName.value = navs.value[e.currentIndex]
if(currentTabName.value == '道馆'){
query.value.dType = 4
} else if(currentTabName.value == '三级协会'){
query.value.dType = 3
} else if(currentTabName.value == '二级协会'){
query.value.dType = 2
} else if(currentTabName.value == '一级协会'){
query.value.dType = 1
}
getList()
getGroupInfo()
}
function handleInfo(n) {
uni.navigateTo({
url: `/pages/group/detail?deptId=${n.deptId}`
})
}
</script>
<style scoped lang="scss">
.indexboxre {
padding: 0 30rpx;
.tt {
font-size: 30rpx;
margin: 0 0 30rpx;
color: #4C5359;
}
position: relative;
height: calc(100vh - 300rpx);
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
</style>
\ No newline at end of file
......@@ -3,24 +3,30 @@
<view>
<view class="welcome">您好!<br />欢迎使用中跆协会员管理系统</view>
<view class="flexbox">
<view @click="goAddVip">添加会员</view>
<view @click="goRenew">会员缴费</view>
<view>缴费审核</view>
<!-- userType 1:中跆协 2:省 3:市区 4:道馆-->
<!-- 4 -->
<view v-if="userType=='4'" @click="goAddVip">添加会员</view>
<view v-if="userType=='4'" @click="goPath('/pages/personalVip/payment')">会员缴费</view>
<view v-if="userType=='2'" @click="goPath('/pages/personalVip/feeBill')">会员缴费单</view>
<!-- 3 2 1-->
<view v-if="userType!='4'" @click="goPath('/pages/personalVip/audit')">缴费审核</view>
<!-- 都有 -->
<view @click="goPath('/pages/personalVip/list')">会员查询</view>
</view>
</view>
<view>
<uni-grid :column="4" :show-border="false" :square="false">
<uni-grid-item v-for="(item ,index) in list" :index="index" :key="index">
<view class="grid-item-box">
<image class="image" :src="item.url" mode="aspectFill" />
<text class="text">{{item.text}}</text>
<view v-if="item.badge" class="grid-dot">
<uni-badge :text="item.badge" :type="item.type" />
</view>
</view>
</uni-grid-item>
</uni-grid>
<view>
<view v-if="userType!='3'" @click="goPath('/pages/personalVip/mobilize')">
会员调动
</view>
<view v-if="userType!='4'" @click="goPath('/pages/group/list')">团体会员查询</view>
<view v-if="userType!='4'" @click="goPath('/pages/group/applyList')">团体会员审核</view>
<view v-if="userType=='2'" @click="goPath('/pages/group/pay')">团体会员认证</view>
<view v-if="userType=='4'" @click="goPath('/pages/level/apply')">级位考试申请</view>
<view v-if="userType!='4'" @click="goPath('/pages/level/approval')">级位考试审核</view>
</view>
<uni-section title="待办提醒" padding>
<template v-slot:right>
......@@ -31,6 +37,10 @@
<text class="dot" :class="n.readFlag=='1'?'done':''"></text>
<view class="tt esp">{{n.name}}</view>
<view class="date">{{n.createTime}}</view>
</view>
<view class="nodata" v-if="messageList.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</uni-section>
......@@ -41,15 +51,9 @@
import * as api from '@/common/api.js';
import * as loginServer from '@/common/login.js';
import {
getWxUser,
getWxUserPhone
} from '@/common/login.js';
import {
onLoad,
onShow,
onReady,
onShareAppMessage,
onShareTimeline,
onPullDownRefresh
} from '@dcloudio/uni-app';
import {
......@@ -62,35 +66,11 @@
proxy
} = getCurrentInstance()
const app = getApp();
const userType = ref('1')
let proId;
let goPath;
const svId = ref(null);
const list = ref([{
url: '',
text: '会员调动',
badge: '0',
type: "primary"
},
{
url: '',
text: '调动审核',
badge: '1',
type: "success"
},
{
url: '',
text: '级位考试申请',
badge: '99',
type: "warning"
},
{
url: '',
text: '级位考试审核',
badge: '2',
type: "error"
},
const list = ref([
{
url: '',
text: '段位考试申请'
......@@ -111,15 +91,16 @@
const messageList = ref([])
onShow(() => {
if (app.globalData.isLogin) {
init();
init()
} else {
app.firstLoadCallback = () => {
init();
init()
};
}
})
onLoad(option => {
if (option.scene) {
proId = decodeURIComponent(option.scene);
} else {
......@@ -128,6 +109,12 @@
});
function goPath(path) {
uni.navigateTo({
url: path
});
}
function gologin() {
let path = '/pages/index/login';
uni.navigateTo({
......@@ -157,66 +144,86 @@
});
}
function init() {
api.getMessage({
pageNum: 1,
pageSize: 10
}).then(res => {
for (var d of res.rows) {
switch (d.type) {
case 30001:
d.name = '你有一条会员缴费等待审批,点击去处理!'
d.path = '/member/audit'
break
case 30002:
d.name = '你有一条级位考试等待审批,点击去处理!'
d.path = '/level/approval'
break
case 30003:
d.name = '你有一条段位考试等待审批,点击去处理!'
d.path = '/rank/approval'
break
case 30004:
d.name = '你有一条会员调动等待审批,点击去处理!'
d.path = '/member/mobillize'
break
case 30005:
d.name = '你有一条团体会员认证等待审批,点击去处理!'
d.path = '/group/authentication'
break
case 30006:
d.name = '你有一条段位成绩等待审批,点击去处理!'
d.path = '/rank/score/approval'
break
case 40001:
d.name = '你有一条级位申请待提交,点击去处理!'
d.path = '/level/apply/modify/' + d.eventId
break
case 40002:
d.name = '你有一条段位申请待提交,点击去处理!'
d.path = '/rank/apply/modify/' + d.eventId
break
case 40003:
d.name = '你有一条成绩维护的数据待提交,点击去处理!'
d.path = '/rank/score/modify/' + d.eventId
break
case 50001:
d.name = '你有一条新的个人会员申请,点击去处理!'
d.path = '/member/list'
break
}
}
messageList.value = res.rows
function init() {
uni.showLoading({
title: '加载中'
});
loginServer.getMyOwnMemberInfo().then(res=>{
userType.value = app.globalData.userType
if (userType.value!='1' && app.globalData.authenticationStatus != '2' && app.globalData.authenticationStatus != '4'){
// 注册引导
uni.navigateTo({
url: '/pages/index/perfect'
});
} else {
getMes()
}
uni.hideLoading();
})
}
}
function getMes(){
api.getMessage({
pageNum: 1,
pageSize: 10
}).then(res => {
if (res.rows && res.rows.length > 0)
for (var d of res.rows) {
switch (d.type) {
case 30001:
d.name = '你有一条会员缴费等待审批,点击去处理!'
d.path = '/personalVip/audit'
break
case 30002:
d.name = '你有一条级位考试等待审批,点击去处理!'
d.path = '/level/approval'
break
case 30003:
d.name = '你有一条段位考试等待审批,点击去处理!'
d.path = '/rank/approval'
break
case 30004:
d.name = '你有一条会员调动等待审批,点击去处理!'
d.path = '/personalVip/mobillize'
break
case 30005:
d.name = '你有一条团体会员认证等待审批,点击去处理!'
d.path = '/group/authentication'
break
case 30006:
d.name = '你有一条段位成绩等待审批,点击去处理!'
d.path = '/rank/scoreApproval'
break
case 40001:
d.name = '你有一条级位申请待提交,点击去处理!'
d.path = `/level/apply/modify?id=${d.eventId}`
break
case 40002:
d.name = '你有一条段位申请待提交,点击去处理!'
d.path = `/rank/apply/modify?id=${d.eventId}`
break
case 40003:
d.name = '你有一条成绩维护的数据待提交,点击去处理!'
d.path = `/rank/score/modify?id=${d.eventId}`
break
case 50001:
d.name = '你有一条新的个人会员申请,点击去处理!'
d.path = '/personalVip/approvalList'
break
}
}
messageList.value = res.rows
})
}
function readMessage(item) {
uni.navigateTo({
url: item.path
});
api.reader({id: item.id}).then(res=>{
item.readFlag = '1'
api.reader({
id: item.id
}).then(res => {
item.readFlag = '1'
})
}
......
......@@ -14,15 +14,15 @@
<form v-if="isActive==0">
<view class="round-input-item">
<image class="icon" src="@/static/login/tag01@2x.png"></image>
<uni-easyinput placeholder="账号" v-model="form.username" />
<uni-easyinput :styles="inputstyle" placeholder="账号" v-model="form.username" />
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag02@2x.png"></image>
<uni-easyinput placeholder="密码" v-model="form.password" type="password" />
<uni-easyinput :styles="inputstyle" placeholder="密码" v-model="form.password" type="password" />
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag03@2x.png"></image>
<uni-easyinput placeholder="图形验证码" v-model="form.code" />
<uni-easyinput :styles="inputstyle" placeholder="图形验证码" v-model="form.code" />
<image :src="codeUrl" @click="getCode" />
</view>
......@@ -31,16 +31,16 @@
<form v-if="isActive==1">
<view class="round-input-item">
<image class="icon" src="@/static/login/tag01@2x.png"></image>
<uni-easyinput placeholder="请输入手机号" v-model="form2.telNo" />
<uni-easyinput :styles="inputstyle" placeholder="请输入手机号" v-model="form2.telNo" />
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag02@2x.png"></image>
<uni-easyinput placeholder="图形验证码" v-model="form2.captcha" />
<uni-easyinput :styles="inputstyle" placeholder="图形验证码" v-model="form2.captcha" />
<image :src="codeUrl" @click="getCode" />
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag04@2x.png"></image>
<uni-easyinput placeholder="短信验证码" v-model="form2.code" />
<uni-easyinput :styles="inputstyle" placeholder="短信验证码" v-model="form2.code" />
<text v-if="!countDown.start" @click="getCaptchaSms">获取验证码</text>
<uni-countdown v-if="countDown.start" color="#014A9F" :show-day="false" :show-hour="false"
:show-min="false" @timeup="timeup" :start="countDown.start"
......@@ -94,7 +94,11 @@ import {
const isActive = ref(0)
const agree = ref(false)
const isRember = ref(true)
const codeUrl = ref(null)
const codeUrl = ref(null)
const inputstyle = ref({
borderColor: 'transparent',
fontSize: '30rpx'
})
const form = ref({
username: null,
password: null,
......@@ -420,8 +424,9 @@ function timeup() {
text {
font-size: 28rpx;
color: #014A9F;
}
color: #014A9F; padding: 0 20rpx;
}
}
.fixedagree {
......
<template>
<view>
<view class="pd30">
<uni-steps :options="list1" :active="active" />
<view>
<uni-forms ref="baseForm" :modelValue="baseFormData" label-width="100">
<uni-forms-item label="所属协会" required><uni-easyinput v-model="baseFormData.name"
:disabled="!editIng" placeholder="所属协会" /></uni-forms-item>
<uni-forms-item label="机构名称" required><uni-easyinput v-model="baseFormData.name"
:disabled="!editIng" placeholder="机构名称" /></uni-forms-item>
<uni-forms-item label="单位类型" required>
<uni-data-select :disabled="!editIng" v-model="baseFormData.type"
:localdata="typeList"></uni-data-select>
</uni-forms-item>
<uni-forms-item label="联系人" required>
<uni-easyinput v-model="baseFormData.contactPerson" :disabled="!editIng"
placeholder="请输入联系人姓名" />
</uni-forms-item>
<uni-forms-item label="联系方式" required>
<uni-easyinput v-model="baseFormData.contactTelno" :disabled="!editIng" placeholder="请输入联系方式" />
</uni-forms-item>
<uni-forms-item label="所在地区" required>
<uni-data-picker v-if="editIng" class="fixUniFormItemStyle" :clear-icon="!editIng"
v-model="regionArr" @change="onchangeRegionId" :localdata="regionsList"
popup-title="请选择所在地区"></uni-data-picker>
<uni-easyinput v-model="baseFormData.regionStr" v-else disabled />
</uni-forms-item>
<uni-forms-item label="详细地址" required><uni-easyinput v-model="baseFormData.address"
:disabled="!editIng" placeholder="请输入详细地址" /></uni-forms-item>
</uni-forms>
<view class="fixedBottom">
<button class="btn-red" @click="saveMyteam()">下一步</button>
</view>
</view>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue';
import * as api from '@/common/api.js';
import {
onLoad,
onShow
} from '@dcloudio/uni-app';
import {
tagList,
typeList,
comList
} from '@/static/js/data';
import config from '@/config.js'
const app = getApp();
const baseFormData = ref({
});
const dataList = ref([]);
const memberList = ref([]);
const regionArr = ref();
const regionsList = ref([]);
const ranksList = ref([]);
const current = ref(0);
const groupId = ref(0);
const currIndex = ref(null);
const cptId = ref();
const signType = ref();
const editIng = ref(true);
const isSign = ref(false);
const query = ref({
type: 0
});
const active = ref(0)
const list1 = ref([{
title: '完善信息'
}, {
title: '会员认证'
}])
onLoad(option => {
console.log(option)
getRegionsList();
getDetail()
});
function getDetail(){
api.getMyOwnMemberInfo().then(res=>{
if (!res.data.memberInfo) res.data.memberInfo = {}
baseFormData.value = res.data.memberInfo
baseFormData.value.coordinates1 = []
authenticationStatusa.value = res.data.authenticationStatus
if (baseFormData.value.siteProvinceId)baseFormData.value.coordinates1.push(baseFormData.value.siteProvinceId)
if (baseFormData.value.siteCityId) baseFormData.value.coordinates1.push(baseFormData.value.siteCityId)
if (baseFormData.value.siteRegionId) baseFormData.value.coordinates1.push(baseFormData.value.siteRegionId)
})
}
function getRegionsList() {
api.regionsList().then(res => {
regionsList.value = res.data;
});
}
function onchangeRegionId(e) {
console.log(e.detail.value)
baseFormData.value.regionId = regionArr.value
}
function saveMyteam() {
// 验证必填项
if (baseFormData.value.imgUrl == '') {
uni.showToast({
title: '请上传logo',
duration: 2000,
icon: 'none'
})
return
}
if (baseFormData.value.name == '') {
uni.showToast({
title: '请填写团体名称',
duration: 2000,
icon: 'none'
})
return
}
if (baseFormData.value.abreviations == '') {
uni.showToast({
title: '请填写简称',
duration: 2000,
icon: 'none'
})
return
}
if (baseFormData.value.type == '') {
uni.showToast({
title: '请选择参赛队类型',
duration: 2000,
icon: 'none'
})
return
}
// if(baseFormData.value.type=='3'&&!baseFormData.value.ctype){
// uni.showToast({
// title: '请选择企业性质',
// duration: 2000,
// icon:'none'
// })
// return
// }
if (baseFormData.value.contactPerson == '') {
uni.showToast({
title: '请填写联系人',
duration: 2000,
icon: 'none'
})
return
}
if (baseFormData.value.contactTelno == '') {
uni.showToast({
title: '请填写联系方式',
duration: 2000,
icon: 'none'
})
return
}
var pattern = /^1[3456789]\d{9}$/;
if (!pattern.test(baseFormData.value.contactTelno)) {
uni.showToast({
title: '请输入正确的手机号',
duration: 2000,
icon: 'none'
})
return
}
if (baseFormData.value.regionId == '') {
uni.showToast({
title: '选择所在地区',
duration: 2000,
icon: 'none'
})
return
}
if (baseFormData.value.address == '') {
uni.showToast({
title: '请填写详细地址',
duration: 2000,
icon: 'none'
})
return
}
for (let n in participantsInfoArr.value) {
if (participantsInfoArr.value[n].status == 0 && (!participantsInfoArr.value[n].value)) {
uni.showToast({
title: '请完善必填字段',
duration: 2000,
icon: 'none'
})
return
}
}
match.saveMyGroup(baseFormData.value).then(res => {
groupId.value = res.data
if (participantsInfoArr.value && participantsInfoArr.value.length > 0) {
// 保存补充信息
const obj = {
cptId: cptId.value,
groupId: groupId.value,
groupInfo: JSON.stringify(participantsInfoArr.value)
}
match.saveMyGroupExtraInfo(obj).then(res => {
})
}
if (!signType.value) {
uni.showToast({
title: '保存成功',
icon: 'none',
duration: 2000
});
editIng.value = false;
} else if (signType.value == 1) {
// 团队
if (coachOrLeaderFlag.value == "1") {
uni.navigateTo({
url: `/pages_match/match/choose_coach?matchId=${cptId.value}&groupId=${groupId.value}&signType=${signType.value}`
});
} else {
// 选运动员
uni.navigateTo({
url: `/pages_match/match/choose_sportman?matchId=${cptId.value}&groupId=${groupId.value}&signType=${signType.value}`
});
}
} else if (signType.value == 2) {
// 队伍
uni.navigateTo({
url: `/pages_match/match/add_rank?matchId=${cptId.value}&groupId=${groupId.value}&signType=${signType.value}`
});
}
});
}
</script>
<style lang="scss">
</style>
\ No newline at end of file
......@@ -12,24 +12,24 @@
<form>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag01@2x.png"></image>
<uni-easyinput v-model="registerForm.telNo" placeholder="请输入手机号" />
<uni-easyinput :styles="inputstyle" v-model="registerForm.telNo" placeholder="请输入手机号" />
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag02@2x.png"></image>
<uni-easyinput v-model="registerForm.password" placeholder="密码" />
<uni-easyinput :styles="inputstyle" v-model="registerForm.password" placeholder="密码" type="password"/>
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag02@2x.png"></image>
<uni-easyinput v-model="registerForm.password2" placeholder="确认密码" />
<uni-easyinput :styles="inputstyle" v-model="registerForm.password2" placeholder="确认密码" type="password"/>
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag02@2x.png"></image>
<uni-easyinput placeholder="图形验证码" v-model="registerForm.captcha" />
<image class="icon" src="@/static/login/tag03@2x.png"></image>
<uni-easyinput :styles="inputstyle" placeholder="图形验证码" v-model="registerForm.captcha" />
<image :src="codeUrl" @click="getCode" />
</view>
<view class="round-input-item">
<image class="icon" src="@/static/login/tag04@2x.png"></image>
<uni-easyinput placeholder="短信验证码" v-model="registerForm.code" />
<uni-easyinput :styles="inputstyle" placeholder="短信验证码" v-model="registerForm.code" />
<text v-if="!countDown.start" @click="getCaptchaSms">获取验证码</text>
<uni-countdown v-if="countDown.start" color="#014A9F" :show-day="false"
:show-hour="false" :show-min="false" @timeup="timeup" :start="countDown.start"
......@@ -86,7 +86,10 @@ const countDown = ref({
start: false,
second: 60
})
const inputstyle = ref({
borderColor: 'transparent',
fontSize: '30rpx'
})
onMounted(() => {
getCode()
})
......@@ -117,7 +120,7 @@ function register() {
})
return
}
if (!form.value.code) {
if (!registerForm.value.code) {
uni.showToast({
title: '验证码不能为空',
icon: 'none'
......@@ -222,65 +225,29 @@ function timeup() {
position: relative;
}
.loginbox {
.loginNav {
width: 700rpx;
margin: 0 auto -53rpx;
height: 133rpx;
overflow: hidden;
position: relative;
view {
text-align: center;
height: 133rpx;
box-sizing: border-box;
padding: 26rpx 0 0;
}
.n1 {
background: url('@/static/login/tab1.png') no-repeat top left;
background-size: contain;
opacity: 0.7;
width: 407rpx;
position: absolute;
left: 0;
}
.n2 {
background: url('@/static/login/tab2.png') no-repeat top right;
background-size: contain;
opacity: 0.7;
width: 399rpx;
position: absolute;
right: 0;
}
.active {
color: #AD181F;
opacity: 1;
&::after {
content: '';
position: absolute;
width: 25rpx;
height: 4rpx;
background: #AD181F;
border-radius: 2rpx;
left: 0;
right: 0;
margin: auto;
bottom: 50rpx;
}
}
}
}
.formbox {
background: #fff;
width: 700rpx;
padding: 50rpx;
padding: 30rpx 50rpx;
margin: auto;
border-radius: 20rpx;
border-radius: 20rpx;
.nav{text-align: center;position: relative;padding: 0 0 30rpx;
}
.nav.active{font-size: 30rpx;color: #AD181F;
&::after {
content: '';
position: absolute;
width: 25rpx;
height: 4rpx;
background: #AD181F;
border-radius: 2rpx;
left: 0;
right: 0;
margin: auto;
bottom: 20rpx;
}
}
}
.flex-item {
......@@ -367,7 +334,8 @@ function timeup() {
}
text {
font-size: 28rpx;
font-size: 28rpx;
padding: 0 20rpx;
color: #014A9F;
}
}
......
<template>
<view>
<view class="pd30">
<uni-steps :options="list1" :active="active" />
<view class="hasfixedbottom">
<view class="wBox" v-if="active == 0">
<uni-forms ref="baseForm" :modelValue="form" label-width="100">
<uni-forms-item label="考试名称">
<view v-if="form.name">{{form.name}}</view>
<view v-else class="align-forms-item-placeHolder">自动生成</view>
</uni-forms-item>
<uni-forms-item label="申请单位" required>
<view class="align-forms-item">{{form.memberName}}</view>
</uni-forms-item>
<uni-forms-item label="申请日期" required>
<uni-datetime-picker type="date" v-model="form.applyTime"></uni-datetime-picker>
</uni-forms-item>
<uni-forms-item label="考试开始时间" required>
<uni-datetime-picker type="datetime" v-model="form.startTime"></uni-datetime-picker>
</uni-forms-item>
<uni-forms-item label="考试结束时间" required>
<uni-datetime-picker type="datetime" v-model="form.endTime"></uni-datetime-picker>
</uni-forms-item>
<uni-forms-item label="考级地点" required>
<uni-easyinput v-model="form.examLocation" placeholder="考级地点" />
</uni-forms-item>
<uni-forms-item @updateData="updateData" :label="`考官${ec}`" v-for="ec in examinerForChoose" :key="ec">
<view @click="selectFN(ec)" class="mask">
<uni-easyinput v-model="form[`examiner_${ec}`]" clearable placeholder="点击选择考官" />
</view>
</uni-forms-item>
</uni-forms>
</view>
<view class="wBox" v-if="active == 1">
<!-- 添加考生 -->
<button class="btn-red-kx">在线选择</button>
<view class="vipData">
<view><text>{{total}}</text></view>
</view>
<view class="userlist">
<view class="item" v-for="n in list" style="background-color: #fffafa;">
<view class="w100">
<view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.name.slice(0,1)}}</view>
</view>
<view class="name">{{n.realName}} <text>{{n.code}}</text></view>
<view class="date">{{n.idcTypeStr}}{{n.idcCode}}</view>
<view class="flexbox">
<view>
原有级别
<text>{{n}}</text>
</view>
<view>
考试级别
<uni-data-select
v-model="value"
:localdata="range"
@change="change"
></uni-data-select>
</view>
<view>
是否通过
<uni-data-select
v-model="value"
:localdata="range"
@change="change"
></uni-data-select>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="fixedBottom">
<button class="btn-red-kx" style="width: 40%;" @click="submitForm(0)">保存</button>
<button class="btn-red" style="width: 40%;" @click="submitForm(1)">下一步</button>
</view>
</view>
</template>
<script setup>
import {
ref
} from 'vue';
import * as api from '@/common/api.js';
import {
onLoad,
onShow
} from '@dcloudio/uni-app';
import {
tagList,
typeList,
comList
} from '@/static/js/data';
import config from '@/config.js'
import dayjs from 'dayjs'
import _ from 'lodash'
const app = getApp();
const memberInfo = app.globalData.memberInfo
const form = ref({
});
const dataList = ref([]);
const examinerForChoose = ['A', 'B', 'C']
const examinerArr = []
const active = ref(0)
const total = ref(0)
const list1 = ref([{
title: '考级基本信息'
}, {
title: '添加考生'
}])
let examId
onLoad(option => {
console.log(option)
if (app.globalData.isLogin) {
form.value.memberName = app.globalData.memberInfo.name
form.value.applyTime = dayjs().format('YYYY-MM-DD')
_.each(examinerForChoose, ec => {
form.value[`examiner_${ec}`] = null
})
if (option.examId) {
examId = option.examId
getDetail()
}
} else {
app.firstLoadCallback = () => {
form.value.memberName = app.globalData.memberInfo.name
form.value.applyTime = dayjs().format('YYYY-MM-DD')
_.each(examinerForChoose, ec => {
form.value[`examiner_${ec}`] = null
})
if (option.examId) {
examId = option.examId
getDetail()
}
};
}
});
onShow(option => {
// if(!!option){
// console.log(option)
// }
uni.$on('chosen', updateData)
})
function updateData(e) {
// console.log(e)
examinerArr.push(e.obj)
form.value[`examiner_${e.ec}`] = e.obj.name
}
function getDetail() {
api.getLevelApplyInfo(examId).then(res => {
const data = res.data
if (data.examiner) {
_.each(data.examiner.split(','), (id) => {
examinerArr.push({
perId: id
})
})
_.each(data.examinerNames.split(','), (name, i) => {
data[`examiner_${examinerForChoose[i]}`] = name
examinerArr[i].name = name
})
}
form.value = data
})
}
function selectFN(ec) {
const chosen = []
const type = form.value.type
_.each(examinerForChoose, ec => {
const key = `examiner_${ec}`
if (form.value[key]) {
const examiner = _.find(examinerArr, (e) => {
return e.name == form.value[key]
})
if (examiner) {
chosen.push(examiner)
}
}
})
console.log(ec, chosen, type)
let path = `/pages/level/chooseExaminer?type=${type}&chosen=${chosen}&ec=${ec}`
uni.navigateTo({
url: path
});
}
function submitForm(flag) {
form.value.status = '0'
const examinerIds = []
const examinerNames = []
_.each(examinerForChoose, ec => {
const key = `examiner_${ec}`
if (form.value[key]) {
const examiner = _.find(examinerArr, (e) => {
return e.name == form.value[key]
})
if (examiner) {
examinerIds.push(examiner.perId)
examinerNames.push(examiner.name)
}
}
})
if (examinerIds.length > 0) {
form.value.examiner = examinerIds.join(',')
form.value.examinerNames = examinerNames.join(',')
} else {
form.value.examiner = null
form.value.examinerNames = null
}
form.value.draftFlag = flag === 0 ? '1' : '0'
if (flag === 0) {
save()
} else {
if (dayjs(form.value.startTime).valueOf() < dayjs(form.value.applyTime).valueOf()) {
uni.showToast({
title: `考试开始时间应大于申请日期`,
icon: 'error'
})
return
}
if (dayjs(form.value.endTime).valueOf() <= dayjs(form.value.startTime).valueOf()) {
uni.showToast({
title: `考试结束时间应大于考试开始时间`,
icon: 'error'
})
return
}
if (examinerIds.length % 2 === 0) {
uni.showToast({
title: `录入的考官人数必须为单数`,
icon: 'error'
})
return
}
save().then(() => {
// form.value.examId 下一步
active.value == 1
})
}
}
function save() {
if (form.value.examId) {
return updateLevelInfo(form.value).then(() => {
uni.showToast({
title: `保存成功`,
icon: 'none'
})
})
} else {
return addInfo(form.value).then((res) => {
form.value.examId = res.data.examId
form.value.name = res.data.name
uni.showToast({
title: `保存成功`,
icon: 'none'
})
})
}
}
</script>
<style lang="scss" scoped>
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
}
:deep(.uni-forms-item__inner) {
padding-bottom: 20rpx;
}
:deep(.uni-forms-item__label .label-text) {
font-size: 28rpx !important;
}
:deep(.uni-input-input) {
font-size: 30rpx !important;
}
</style>
\ No newline at end of file
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索考级名称" @blur="getList" @clear="getList">
</uni-easyinput>
<view class="invertedbtn-red" @click="goAdd">+ 添加级位考试</view>
</view>
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text :class="{
'text-success':item.status=='2',
'text-danger':item.status=='3',
'text-warning':item.status=='4'
}">{{ item.statusStr }}</text>
</view>
<view class="date" v-if="item.status!='0'&&item.submitTime">提交时间:{{item.submitTime}}</view>
<view class="name mt0" @click="goDetail(item)">{{item.name}}</view>
<view class="pp esp">考级日期:{{item.startTime.substring(0,16)}}{{item.endTime.substring(0,16)}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
申请日期
<view>{{item.applyTime.substring(0, 10)}}</view>
</view>
<view>
申请单位
<view>{{item.memberName}}</view>
</view>
<view>
通过人数
<view>{{item.pass}}</view>
</view>
</view>
<view class="func" v-if="item.status=='0'||item.status=='3'||item.status=='4'">
<button @click="editThis(item)">编辑</button>
<button @click="handleSubmit(item)">提交审核</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
type: '1',
rankStatus: '0'
})
const navs = ref(['未提交', '审核中', '审核通过', '审核拒绝'])
const current = ref()
const list = ref([])
const total = ref(0)
const deptType = ref('')
onLoad(() => {
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getList()
}
function getList() {
api.getLevelList(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
total.value = res.total
})
}
function goAdd() {
let path = `/pages/level/addApply`
uni.navigateTo({
url: path
});
}
function editThis(item) {
let path = `/pages/level/addApply?examId=${item.examId}`
uni.navigateTo({
url: path
});
}
function handleSubmit(item){
uni.showModal({
title: '提示',
content: `确定提交${item.name}进行审核吗`,
success: function(res) {
if (res.confirm) {
uni.showLoading({
title:`提交中`
})
upApply(item.examId)
}
}
})
}
function upApply(id){
api.submitVerity(id).then(res=>{
uni.hideLoading()
getList()
uni.showToast({
title:`提交成功`
})
})
}
function goDetail(item) {
if(item.status!='0'){
let path = `/pages/level/applyDetail?examId=${item.examId}`
uni.navigateTo({
url: path
});
} else {
return
}
}
</script>
<style scoped>
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
.invertedbtn-red {
border-radius: 50px;
background-color: #fff;
font-size: 30rpx;
padding: 10rpx 20rpx;
}
}
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
</style>
<template>
<view>
<view class="wBox">
<view class="tt">考级基本信息</view>
<view class="ddd">
<text class="lab">考级名称:</text>{{ form.name }}
</view>
<view class="ddd">
<text class="lab">申请日期:</text>{{form.applyTime}}
</view>
<view class="ddd">
<text class="lab">申请单位:</text>{{ form.memberName }}
</view>
<view class="ddd">
<text class="lab">考官:</text>{{form.examinerNames?.split(',').join('/')}}
</view>
<view class="ddd">
<text class="lab">考试开始时间:</text>{{form.startTime}}
</view>
<view class="ddd">
<text class="lab">考试结束时间:</text>{{form.endTime}}
</view>
<view class="ddd">
<text class="lab">考级地点:</text>{{form.address}}
</view>
<view class="ddd" v-if="app.globalData.showPrice">
<text class="lab">总金额:</text>{{(form.totalAmount*1).toFixed(2) }}
</view>
</view>
<view class="wBox">
<view class="tt">
考生信息
</view>
<view class="vipData">
<view><text>{{ tablePersonInfo.total }}</text></view>
<view v-for="l in tablePersonInfo.levelArr" :key="l.level">
{{ szToHz(l.level) }}级: <text>{{ l.num }} </text>
</view>
</view>
<view class="userlist">
<view class="item" v-for="n in list" style="background-color: #fffafa;">
<view class="w100">
<view class="name">{{n.realName}} <text>{{n.memName}}</text></view>
<!-- <view class="date">{{n.idcTypeStr}}{{n.idcCode}}</view> -->
<view class="flexbox">
<view>
原有级别
<text v-if="n.levelOld">{{ szToHz(n.levelOld) }}</text>
<text v-else>十级</text>
</view>
<view>
考试级别
<text>
{{ szToHz(n.levelNew) }}
</text>
</view>
<view v-if="app.globalData.showPrice">
金额
<text>
{{ (n.examFee * 1).toFixed(2) }}
</text>
</view>
<view>
是否通过
<text v-if="n.isPass=='1'" class="text-success">通过</text>
<text v-else class="text-danger">未通过</text>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="wBox">
<view class="tt">
审核信息
</view>
<view>
<view class="stepItem" v-for="(n,index) in recordList">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text :class="{
'text-success':n.auditStatus=='1',
'text-danger':n.auditStatus=='2',
'text-warning':n.auditStatus=='3'
}">{{ n.auditStatusStr }}</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.deptName}}</view>
<view v-if="n.auditStatus==2">
备注:{{n.reason||'/' }}
</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import _ from 'lodash'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const deptType = ref('')
const form = ref({})
const tablePersonInfo = ref({})
const recordList = ref([])
const list = ref([])
let examId = ''
onLoad((option) => {
examId = option.examId
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
getForm()
getRecordList()
getTablePersonInfo()
}
function getForm() {
api.getLevelApplyInfo(examId).then(res => {
uni.hideLoading()
form.value = res.data
})
}
function getRecordList() {
api.getApprovalRecord(examId).then(res => {
recordList.value = res.data.levelSteps
})
}
function getTablePersonInfo() {
api.getStudentList({
examId: examId
}).then(res=>{
list.value = res.rows
const total = list.value.length
const levelArr = []
_.each(list.value, (d) => {
const temp = _.find(levelArr, (l) => {
return l.level == d.levelNew
})
if (temp) {
temp.num++
} else {
levelArr.push({
level: d.levelNew,
num: 1
})
}
})
tablePersonInfo.value = {
total: total,
levelArr: _.sortBy(levelArr, (l) => {
return l.level
})
}
})
}
function szToHz(num) {
const hzArr = ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
return hzArr[parseInt(num)]
}
</script>
<style scoped>
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;margin: 0 0 30rpx;
font-size: 30rpx;
}
.ddd{font-size: 28rpx;color: #333;
.lab{color: #999;display: inline-block;text-align: justify;}
}
}
</style>
\ No newline at end of file
<template>
<view>
</view>
</template>
<script setup>
</script>
<style lang="scss">
</style>
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.idcCode" placeholder="证件号码" @blur="getList">
</uni-easyinput>
</view>
<view class="indexboxre">
<view class="userlist">
<view class="item" v-for="n in list">
<view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.name.slice(1,2)}}</view>
</view>
<view>
<view class="name">{{n.name}}</view>
<view class="date">会员号:{{n.perCode}}</view>
</view>
<view class="status">
<text v-if="checkChosen(n)">选择</text>
<text v-else class="text-primary" @click="handleChoose(n)">选择</text>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>请输入证件号查找</text>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import {
ref,
getCurrentInstance
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import _ from 'lodash'
const {
proxy
} = getCurrentInstance()
const app = getApp();
const query = ref({
})
const list = ref([])
const total = ref(0)
const userType = ref('')
let chosen = []
let ec = null
onLoad((options) => {
console.log(options)
query.value.type = options.type
chosen = options.chosen || []
ec = options.ec
})
function getList() {
if (!query.value.idcCode) {
return
}
uni.showLoading({
title: `查找中`
})
api.getCoachList(query.value).then(res => {
uni.hideLoading()
if (res.data.length == 0) {
uni.showToast({
title: '未查询到考官信息',
icon: "error"
})
return
}
list.value = res.data
})
}
function checkChosen(n) {
return _.some(chosen, (c) => {
return c.perId == n.perId
})
}
function handleChoose(row) {
var pages = getCurrentPages()
var prevPage = pages[pages.length - 2]
var obj = {
perId: row.perId,
name: row.name,
}
// prevPage.onShow(obj)
uni.$emit('chosen',{
obj:obj,
ec
})
uni.navigateBack({delta:1})
}
function handleInfo(n) {
uni.navigateTo({
url: `/pages/personalVip/detail?perId=${n.perId}`
})
}
</script>
<style scoped lang="scss">
.indexboxre {
padding: 0 30rpx;
.tt {
font-size: 30rpx;
margin: 0 0 30rpx;
color: #4C5359;
}
position: relative;
height: calc(100vh - 300rpx);
}
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
</style>
\ No newline at end of file
<template>
<view class="hasfixedbottom">
<view class="nolineform">
<uni-forms :border="true" :modelValue="baseFormData" label-width="120">
<uni-forms-item label="姓名" required name="name">
<uni-easyinput :styles="inputstyle" :clearable='false' :placeholderStyle="placeholderStyle"
v-model="baseFormData.name" placeholder="请输入姓名" />
</uni-forms-item>
<uni-forms-item label="证件类型" required name="idcType">
<uni-data-select v-model="baseFormData.idcType" :localdata="idcTypeList"
:clear="false"></uni-data-select>
</uni-forms-item>
<uni-forms-item label="证件号码" required name="idcCode">
<uni-easyinput :styles="inputstyle" :clearable='false' :placeholderStyle="placeholderStyle"
v-model="baseFormData.idcCode" placeholder="请输入证件号码" />
</uni-forms-item>
</uni-forms>
<view class="button-group">
<button type="primary" size="mini" @click="selectMember">查询</button>
<button type="primary" size="mini" :disabled="flag" @click="submitForm">添加</button>
</view>
</view>
<view class="wBox">
<view class="info">
<view>人数合计 <text class="text-danger"> {{ total}} </text></view>
</view>
<uni-swipe-action>
<uni-swipe-action-item class="personitem" v-for="n in list">
<view class="content-box" @click="handleInfo(n)">
<view class="flexbox">
<view class="photobox">
<view class="colorful">{{n.perName?.slice(0,1)}}</view>
</view>
<view>
{{n.perName}}
<view class="date">
{{idcTypeList[n.perIdcType].text}}: {{n.perIdcCode}}
</view>
</view>
</view>
</view>
<template v-slot:right>
<view class="slot-button">
<view class="danger-button" @click="handleDelete(n)">
<uni-icons type="trash" color="#fff" size="20"></uni-icons>
<text class="slot-button-text">删除</text>
</view>
</view>
</template>
</uni-swipe-action-item>
</uni-swipe-action>
</view>
</view>
<view class="fixedBottom">
<button class="btn-red" :disabled="list?.length <= 0" @click="commitFN">保存并提交</button>
</view>
</template>
<script setup>
import {
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
import * as api from '@/common/api.js'
const inputstyle = ref({
borderColor: '#fff',
fontSize: '30rpx'
})
const placeholderStyle = ref('text-align: right;font-size:30rpx')
const idcTypeList = ref([{
value: '0',
text: "身份证"
},
{
value: '1',
text: "港澳台通信身份证"
},
{
value: '2',
text: "中国护照"
},
{
value: '3',
text: "外国护照"
}
])
const baseFormData = ref({
idcType: '0'
})
const list = ref([])
const total = ref(0)
const flag = ref(true)
const queryParams = ref({
rangeId: -1
})
onLoad((option) => {
if (option.rangId) {
baseFormData.value.rangeId = option.rangId
queryParams.value.rangeId = option.rangId
getList()
}
})
// 查询会员
function selectMember() {
if (!baseFormData.value.name) {
uni.showToast({
title: '请输入姓名',
icon: 'none'
})
return
}
if (!baseFormData.value.idcCode) {
uni.showToast({
title: '请输入证件号',
icon: 'none'
})
return
}
api.pickUp(baseFormData.value).then(res => {
baseFormData.value.perId = res.data.perId
baseFormData.value.ancestorNameList = res.data.ancestorNameList
baseFormData.value.memName = res.data.memName
baseFormData.value.personIdArray = res.data.perId
flag.value = false
uni.showToast({
title: '查询成功!'
})
})
}
function submitForm() {
if (!baseFormData.value.name) {
uni.showToast({
title: '请输入姓名',
icon: 'none'
})
return
}
if (!baseFormData.value.idcCode) {
uni.showToast({
title: '请输入证件号',
icon: 'none'
})
return
}
api.addTransferToRange({
rangeId: baseFormData.value.rangeId || -1,
personIdArray: baseFormData.value.personIdArray
}).then(res => {
baseFormData.value.rangeId = res.data
queryParams.value.rangeId = res.data
flag.value = true
baseFormData.value.idcType = '0'
baseFormData.value.idcCode = ''
baseFormData.value.name = ''
getList()
})
}
function getList() {
api.getTransferList(queryParams.value).then(res => {
list.value = res.rows
total.value = res.total
})
}
function commitFN() {
if (baseFormData.value.rangeId == -1) return
api.commit([baseFormData.value.rangeId] || [queryParams.value.rangeId]).then(res=>{
uni.showToast({
title: '提交成功!'
})
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.button-group {
text-align: right;
button {
margin-left: 30rpx;
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
</style>
\ No newline at end of file
......@@ -119,9 +119,9 @@
const regionsList = ref([])
const baseFormData = ref({
sex: '0',
idcType: '0'
idcType: '0',
perType: '1', // (1:个人会员;2:教练;3:考官;4:裁判;5:临时会员;)
})
const baseFormData2 = ref({})
const items = ref(['手动录入', '自动录入'])
const idcTypeList = ref([{
value: '0',
......@@ -185,26 +185,21 @@
}
function changeAgree(item) {
if (agree.value) {
agree.value = false
} else {
agree.value = true
}
// item = !item
agree.value = !item
}
//身份证识别
function upIdCardImgFront(e) {
baseFormData.value.card = e.tempFiles;
console.log(e.tempFiles[0].file)
const formData = new FormData()
formData.append('pic', e.tempFiles[0].file)
api.carUrl(formData, baseFormData.value.idcType).then(res => {
// console.log(e)
// const formData = new FormData()
// formData.append('pic', e.tempFiles[0].file)
api.carUrl(e.tempFilePaths[0], baseFormData.value.idcType).then(res => {
baseFormData.value.idcUrl = res.data.url
baseFormData.value.sex = res.data.sex
baseFormData.value.birth = res.data.birth
baseFormData.value.idcCode = res.data.code
baseFormDatabaseFormData.value.cityId = res.data.cityId
baseFormData.value.cityId = res.data.cityId
baseFormData.value.address = res.data.address
baseFormData.value.photo = res.data.photo
baseFormData.value.name = res.data.name
......@@ -216,9 +211,9 @@
}
function upPhoto(e) {
// api.uploadImg(e).then(data => {
// baseFormData.value.photo = data.data;
// });
api.uploadImg(e).then(data => {
baseFormData.value.photo = data.data;
});
}
function delimgFont(n) {
......@@ -292,8 +287,9 @@
uni.showModal({
content: '确认信息正确',
success: function(res) {
if (res.confirm) {
api.addPersonToMyDept().then(res => {
if (res.confirm) {
delete baseFormData.value
api.addPersonToMyDept(baseFormData.value).then(res => {
if (res.data == 0) {
let msg = '该成员,实名认证未通过,注册失败!'
resultDialog.value = true
......@@ -399,6 +395,6 @@
}
:deep(.selected-list) {
justify-content: end;
justify-content: flex-end;
}
</style>
\ No newline at end of file
......
<template>
<view>
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem" styleType="text" activeColor="#AD181F"></uni-segmented-control>
<!-- 缴费审核 -->
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.auditStatus==0" class="text-primary">审核中</text>
<text v-if="item.auditStatus==1" class="text-success"> 审核通过</text>
<text v-if="item.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="item.auditStatus==3" class="text-warning">已退回</text>
</view>
<view class="date" @click="goDetail(item)">
<uni-icons type="calendar" size="16" color="#7D8592"></uni-icons>
{{item.content.commitTime}} 提交
</view>
<view class="name" @click="goDetail(item)">{{item.content.name}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
人数合计
<view>{{item.content.personCount}}</view>
</view>
<view>
年限合计
<view>{{item.content.totalYear}}</view>
</view>
<view>
提交单位
<view>{{item.content.memberName}}</view>
</view>
</view>
<view class="func" v-if="item.auditStatus==0">
<button @click="audit(item.recordId,'0')">拒绝</button>
<button @click="audit(item.recordId,'1')">同意</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
auditStatus: '0'
})
const navs = ref(['待审核','审核通过','审核拒绝','退回'])
const list = ref([])
const total = ref(0)
const deptType = ref('')
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init(){
deptType.value = app.globalData.deptType
getList()
}
function onClickItem(e){
console.log(e)
queryParams.value.auditStatus = e.currentIndex
getList()
}
function getList() {
if(deptType.value==2||deptType.value==3){
queryParams.value.mergeFlag = 0
}
api.getVerifyList(queryParams.value).then(res => {
list.value = res.rows
list.value.forEach(item => {
item.content = JSON.parse(item.content)
})
total.value = res.total
})
}
function audit(recordId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(recordId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(recordId, flag)
}
}
})
}
}
function doApproval(recordId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
recordIds: []
}
obj.recordIds.push(recordId)
console.log(obj)
api.audit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
let path = `/pages/personalVip/auditDetail?wfId=${item.wfId}&auditStatus=${queryParams.value.auditStatus}`
uni.navigateTo({
url: path
});
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<view class="hasfixedbottom">
<view class="wBox">
<view class="tt">{{form.content?.name}}</view>
<view class="info">
<view><text class="text-danger"> {{ form.content?.personCount }} </text></view>
<view>合计缴费年限 <text class="text-primary"> {{totalYear }} </text></view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.personName?.slice(0,1)}}</view>
</view>
<view>
<view class="name">{{n.personName}}<text>({{n.memberInfoName}})</text></view>
<view class="date">原有效期至 {{n.originValidityDate||'--'}}</view>
</view>
<view class="nian">
{{n.payYear}}
</view>
</view>
</view>
</view>
<view class="h3-padding">审核流程</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in feelList">
<view class="time">{{n.handleDate||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditStatus==1" class="text-success">审核通过</text>
<text v-if="n.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditStatus==0||n.auditStatus==100" class="text-primary"> 审核中</text>
<text v-if="n.auditStatus==3" class="text-warning"> 已退回</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.handlerDeptName||n.auditBy}}</view>
<view v-if="n.auditStatus==2" >
备注:{{n.reason||'/' }}
</view>
</view>
</view>
</view>
<view class="fixedBottom" v-if="form.auditStatus == 0">
<button class="btn-red-kx" @click="audit(form.recordId,'0')">拒绝</button>
<button class="btn-red" @click="audit(form.recordId,'1')">同意</button>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
// mergeFlag: 0,
auditStatus: ''
})
const wfId = ref('')
const form = ref([])
const list = ref([])
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
onLoad((option) => {
wfId.value = option.wfId
queryParams.value.auditStatus = option.auditStatus
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init(){
deptType.value = app.globalData.deptType
getForm()
}
function getForm() {
uni.showLoading({
title: '加载中'
})
totalYear.value = 0
if(deptType.value==2||deptType.value==3){
queryParams.value.mergeFlag = 0
}
api.getVerifyList(queryParams.value).then(res => {
uni.hideLoading()
if(res.rows)
for (var n of res.rows) {
if (n.wfId == wfId.value) {
form.value = n
}
}
if(form.value.content){
form.value.content = JSON.parse(form.value.content)
list.value = form.value.content.personList
for (var n of list.value) {
totalYear.value += n.payYear
}
}
getFillList(list.value[0]?.rangeId)
})
}
function getFillList(id) {
if(id)
api.getHistoryByRelateId(id).then(res => {
feelList.value = res.data
uni.hideLoading()
})
}
function audit(recordId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(recordId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(recordId, flag)
}
}
})
}
}
function doApproval(recordId, flag, reason) {
var obj = {
flag: flag,
reason: reason||'',
recordIds: []
}
obj.recordIds.push(recordId)
console.log(obj)
api.audit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.wBox{
width: 700rpx;padding: 30rpx;margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196,203,214,0.1);
border-radius: 15rpx;
.tt{
color: #0A1629;
font-size: 30rpx;}
}
.userlist{
.item{border-bottom: 1px dashed #e5e5e5;position: relative;
.date{margin-top: 10rpx;}
.name{
text{margin-left: 1em;
color: #4C5359;
font-size: 26rpx;}
}
.nian{position: absolute;right: 0;
font-size: 30rpx;
color: #AD181F;}
}
}
.info{display: flex;margin: 30rpx 0 20rpx;
font-size: 28rpx;
view{color: #7D8592;margin-right: 20rpx;
}
}
.fixedBottom{justify-content: center;
button{margin: 0 20rpx;width: 286rpx;}
.btn-red{width: 286rpx;}
}
</style>
\ No newline at end of file
<template>
<view class="mainbox">
<view class="photobox">
<image class="photo" v-if="form.photo" :src="config.fileUrl_api + form.photo" mode='widthFix'></image>
<view class="colorful" v-else>{{form.name?.slice(0,1)}}</view>
</view>
<uni-list>
<uni-list-item title="姓名" :rightText="form.name"/>
<uni-list-item title="证件类型" :rightText="cardType?.[form?.idcType]?.label" />
<uni-list-item title="证件号" :rightText="form.idcCode"/>
<uni-list-item title="性别" :rightText="form.sex==0?'男':'女'"/>
<uni-list-item title="会员编号" :rightText="form.perCode"/>
<uni-list-item title="所属一级协会" :rightText="form.topAssName"/>
<uni-list-item title="所属地区协会" :rightText="form.areaAssName"/>
<uni-list-item title="注册团体会员" :rightText="form.memName"/>
<uni-list-item title="缴费日期" :rightText="form.payDate"/>
<uni-list-item title="出生日期" :rightText="form.birth?.slice(0,10)"/>
<uni-list-item title="手机号码" :rightText="form.phone"/>
<uni-list-item title="所在地区" :rightText="form.cityId"/>
<uni-list-item title="详细地址" :rightText="form.address"/>
</uni-list>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onLoad,onShow
} from '@dcloudio/uni-app';
import {ref } from 'vue'
const cardType = ref([
{ label: '身份证', value: '0' },
{ label: '港澳台通信身份证 ', value: '1' },
{ label: '中国护照', value: '2' },
{ label: '外国护照', value: '3' }
])
const form = ref({})
onLoad((option)=>{
console.log(option)
api.getInfo(option.perId).then(res=>{
form.value = res.data
form.value.topAssName = form.value?.ancestorNameList?.[0]
form.value.areaAssName = form.value?.ancestorNameList?.[1]
form.value.memName = res.data.memName
})
})
</script>
<style scoped lang="scss">
.mainbox{margin: 30rpx 25rpx;padding: 1px;
background: #FFFFFF;
border-radius: 15rpx;
:deep(.uni-list-item__content-title){color: #4C5359;font-size: 30rpx;
font-weight: 300;}
:deep(.uni-list-item__extra-text){color: #000;
font-size: 30rpx;}
}
.photobox{position: relative;margin: 30rpx auto;
.photo{width: 210rpx;height: 280rpx;background-color: #f4f4f4;display: block;margin: auto;}
}
.colorful {background-color: #007BDA;
width: 200rpx;
margin: auto;
height: 200rpx;
line-height: 200rpx;
font-size: 44rpx;
color: #fff;
text-align: center;
border-radius: 50%;
}
</style>
\ No newline at end of file
<template>
<view>
<view class="hasfixedbottom">
<view>
<uni-forms ref="baseForm" :border="true" :modelValue="baseFormData" label-width="80">
<view class="nolineform">
<uni-forms-item label="姓名" disabled required name="name">
<uni-easyinput :styles="inputstyle" :clearable='false' :placeholderStyle="placeholderStyle"
v-model="baseFormData.name" placeholder="请输入姓名" />
</uni-forms-item>
<uni-forms-item label="证件类型" disabled required name="idcType">
<uni-data-select v-model="baseFormData.idcType" :localdata="idcTypeList"></uni-data-select>
</uni-forms-item>
<uni-forms-item label="证件号码" disabled required name="idcCode">
<uni-easyinput :styles="inputstyle" :clearable='false' :placeholderStyle="placeholderStyle"
v-model="baseFormData.idcCode" @blur="giveBirthDay" placeholder="请输入证件号码" />
</uni-forms-item>
<uni-forms-item label="性别" disabled required name="sex">
<uni-data-checkbox v-model="baseFormData.sex" @change="changeSex" :localdata="sexs" />
</uni-forms-item>
<uni-forms-item label="出生日期" disabled required name="birth">
<uni-datetime-picker type="date" placeholder="YYYY-MM-DD" :border='false'
:clear-icon="false" v-model="baseFormData.birth" />
</uni-forms-item>
<uni-forms-item label="联系方式" name="phone">
<uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle"
v-model="baseFormData.phone" placeholder="请输入联系方式" />
</uni-forms-item>
<uni-forms-item label="所在地区">
<uni-data-picker class="fixUniFormItemStyle" v-model="baseFormData.cityId"
:localdata="regionsList" popup-title="请选择所在地区"></uni-data-picker>
</uni-forms-item>
<uni-forms-item label="详细地址"><uni-easyinput :styles="inputstyle"
:placeholderStyle="placeholderStyle" v-model="baseFormData.address"
placeholder="请输入详细地址" /></uni-forms-item>
<uni-forms-item label="头像" required name="photo">
<uni-file-picker v-model="baseFormData.photoObj" @delete="delPhoto" return-type="object"
limit="1" @select="upPhoto" :image-styles="imageStylesTx"></uni-file-picker>
</uni-forms-item>
</view>
</uni-forms>
</view>
</view>
<view class="fixedBottom"><button class="btn-red" @click="goSubmit">确 定</button></view>
</view>
</template>
<script setup>
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app';
import * as api from '@/common/api.js'
const perId = ref()
const regionsList = ref([])
const baseFormData = ref({
sex: '0',
idcType: '0'
})
const idcTypeList = ref([{
value: '0',
text: "身份证"
},
{
value: '1',
text: "港澳台通信身份证"
},
{
value: '2',
text: "中国护照"
},
{
value: '3',
text: "外国护照"
}
])
const sexs = ref([{
text: '女',
value: '0'
}, {
text: '男',
value: '1'
}])
const placeholderStyle = ref('text-align: right;font-size:30rpx')
const inputstyle = ref({
borderColor: '#fff',
fontSize: '30rpx'
})
const imageStylesTx = ref({
width: '210rpx',
height: '280rpx',
background: {
color: '#F4F6FA'
},
border: {
radius: '2px'
}
});
onLoad((option)=>{
})
onMounted(() => {
getRegionsList()
})
function getRegionsList() {
api.regionsList().then(res => {
regionsList.value = res.data
})
}
function upPhoto(e) {
// api.uploadImg(e).then(data => {
// baseFormData.value.photo = data.data;
// });
}
function delimgFont(n) {
baseFormData.value.card = '';
}
function delPhoto(n) {
baseFormData.value.photo = '';
}
function goSubmit() {
}
function getUserInfo() {
api.getInfo(perId.value).then(res=>{
forms.value = res.data
if (forms.areaAssName)forms.ancestorNameList = forms.value.ancestorNameList.join(',').replaceAll(',', '/')
})
}
</script>
<style lang="scss" scoped>
:deep(.segmented-control) {
height: 100rpx;
}
:deep(.segmented-control__text) {
line-height: 2;
font-size: 30rpx;
}
.tt {
text-align: center;
font-size: 30rpx;
padding: 40rpx 0 0;
}
.popBody {
font-size: 28rpx;
line-height: 1.5;
font-family: 华文仿宋;
height: 80vh;
overflow: auto;
padding: 30rpx;
.btn-red {
margin: 50rpx 0 30rpx;
}
}
.agreeline {
padding: 20rpx 40rpx;
box-sizing: border-box;
display: flex;
font-size: 30rpx;
text {
color: #014A9F;
}
image {
width: 40rpx;
height: 40rpx;
margin-right: 20rpx;
}
}
.upCard {
position: relative;
width: 500rpx;
height: 316rpx;
.uni-file-picker {
position: absolute;
z-index: 1;
}
.sfz {
width: 500rpx;
height: 316rpx;
}
}
.op0 {
opacity: 0;
}
:deep(.item-text-overflow) {
text-align: left;
}
:deep(.selected-list) {
justify-content: flex-end;
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 查看缴费单+上传凭证 -->
<!-- 缴费审核 -->
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<text v-if="item.record.auditStatus==0" class="text-primary">审核中</text>
<text v-if="item.record.auditStatus==1" class="text-success"> 审核通过</text>
<text v-if="item.record.auditStatus==2" class="text-danger"> 审核拒绝</text>
<text v-if="item.record.auditStatus==3" class="text-warning">已退回</text>
</view>
<view class="date" @click="goDetail(item)">
<uni-icons type="calendar" size="16" color="#7D8592"></uni-icons>
<text v-if="item.payTime">{{item.payTime}} 缴费</text>
<text v-else>{{item.payNoticeSendTime}} 下发</text>
</view>
<view class="name" @click="goDetail(item)">{{item.finalDocName}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
人数合计
<view>{{item.personCount}}</view>
</view>
<view>
年限合计
<view>{{item.yearCount}}</view>
</view>
<view>
费用合计
<view>¥{{item.allPrice}}</view>
</view>
</view>
<view class="func">
<button
v-if="(deptType == 2 || deptType == 3)&&item?.record?.auditStatus != 2 && item?.record?.auditStatus != 3"
@click="handleUpdate(item)">上传凭证</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
<!-- 上传凭证 -->
<uni-popup ref="UpPop" type="bottom" background-color="#fff" animation>
<view class="popBody">
<uni-forms v-model="form">
<uni-forms-item label="缴费日期" required>
<uni-datetime-picker v-model="form.payTime"></uni-datetime-picker>
</uni-forms-item>
<uni-forms-item label="缴费凭证" required>
<uni-file-picker limit="1" file-mediatype="all" file-extname="png,jpg,jpeg,pdf,zip"
@select="selectFile"
@progress="fileProgress" @delete="delSupplementFile(index)"></uni-file-picker>
</uni-forms-item>
<uni-forms-item label="备注">
<uni-easyinput v-model="form.remark" type="textarea"></uni-easyinput>
</uni-forms-item>
</uni-forms>
<button class="btn-red" @click="uploadSure">确定</button>
</view>
</uni-popup>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const list = ref([])
const deptType = ref('')
const UpPop = ref(null)
const form = ref({
docId:'',
payTime:'',
url:'',
remark:''
})
onLoad(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getList()
}
function getList() {
api.getFeeBillList().then(res => {
list.value = res.rows
})
}
function handleUpdate(item) {
form.value.docId = item.docId
UpPop.value.open()
}
let selectFileValue = {}
function selectFile(e) {
let file = e.tempFiles[0]
api.uploadFile(e).then(data => {
selectFileValue = {
url: data.msg,
name: file.name,
extname: file.extname
}
form.value.url=JSON.stringify([selectFileValue])
});
}
function fileProgress(e) {
console.log('progress:'+ e)
}
function delSupplementFile(index) {
selectFileValue = {}
}
function uploadSure(){
console.log(form.value)
api.commitPaymentVoucher(form.value).then(res=>{
UpPop.value.close()
form.value = {}
uni.showToast({
icon:'none',
title:'操作成功'
})
getList()
})
}
function goDetail(item) {
//详情
console.log(item.docId)
let path = `/pages/personalVip/feeBillDetail?docId=${item.docId}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped lang="scss">
.popBody {
font-size: 28rpx;
line-height: 1.5;
overflow: auto;
padding: 30rpx;
.btn-red {
margin: 50rpx 0 30rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<view class="wBox">
<view class="tt">{{form.finalDocName}}</view>
<view class="subtt" v-if="form.payTime">提交日期:<text>{{ form.payTime }}</text></view>
<view class="subtt" v-if="form.payDeptName">提交单位:<text>{{ form.payDeptName }}</text></view>
<view class="info">
<view><text class="text-danger"> {{ form.allPersonCount}} </text></view>
<view>缴费合计人数 <text class="text-danger"> {{ form.oldPersonCount}} </text></view>
<view>费用合计 <text class="text-primary"> ¥{{ form.allPrice }} </text> </view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view class="photobox">
<view class="colorful">{{n.personName?.slice(0,1)}}</view>
</view>
<view>
<view class="name">{{n.personName}}<text>({{n.memberInfoName}})</text></view>
<view class="date">原有效期至{{n.originValidityDate||'--'}}</view>
</view>
<view class="nian">
总价 ¥{{n.payYear}}
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
// mergeFlag: 0,
auditStatus: ''
})
const docId = ref('')
const form = ref([])
const list = ref([])
const deptType = ref()
onLoad((option) => {
if (app.globalData.isLogin) {
docId.value = option.docId
init()
} else {
app.firstLoadCallback = () => {
docId.value = option.docId
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
api.getFeeBillDetail(docId.value).then(res => {
list.value = res.data.personPaymentList
// arr.value = JSON.parse(JSON.stringify(list.value))
form.value = res.data
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
.subtt{
color: #666;margin: 20rpx 0 0;
font-size: 28rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;padding: 20rpx 0;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 26rpx;
color: #AD181F;
}
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<view class="searchbar">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="query.name" @blur="getList" @clear="getList" placeholder="搜索姓名">
</uni-easyinput>
</view>
<uni-swipe-action>
<uni-swipe-action-item class="personitem" v-for="n in list">
<view class="content-box" @click="handleInfo(n)">
<view class="flexbox">
<view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.name.slice(0,1)}}</view>
</view>
<view>
{{n.name}} ({{n.perCode}})
</view>
</view>
<view class="flexbox">
<text v-if="n.certStage==0" class="text-green">
新会员
</text>
<text v-if="n.certStage==1" class="text-warning">
待提交
</text>
<text v-if="n.certStage==2" class="text-red">
缴费中
</text>
<text v-if="n.certStage==3">
正常
</text>
<text v-if="n.certStage==4" class="text-gray">
过期
</text>
</view>
</view>
<!-- <template v-slot:right>
<view class="slot-button">
<view class="edit-button" @click="handleUpdate(n)">
<uni-icons type="compose" color="#fff" size="20"></uni-icons>
<text class="slot-button-text">编辑</text>
</view>
<view class="danger-button" v-if="n.certStage==0" @click="handleDelete(n)">
<uni-icons type="trash" color="#fff" size="20"></uni-icons>
<text class="slot-button-text">删除</text>
</view>
</view>
</template> -->
</uni-swipe-action-item>
</uni-swipe-action>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<button class="btn-red" v-if="userType=='4'" @click="goVipList">+ 添加会员</button>
<text v-else>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const query = ref({
pageNum: 1,
pageSize: 20,
showMyPersonFlag: null,
multiDeptFlag: 1,
perType: 1,
checkPaymentCommit: 1
})
const userType = ref('1')
const list = ref([])
const total = ref(0)
const app = getApp();
onLoad(()=>{
userType.value = app.globalData.userType
})
onMounted(() => {
getList()
})
function getList() {
if (app.globalData.userType == '4') {
// 道馆
query.value.multiDeptFlag = null
query.value.showMyPersonFlag = 1
}
api.selectPageList(query.value).then(res => {
for (var p of res.rows) {
if (p.photo) {
p.photo = config.fileUrl_api + p.photo
console.log(p.photo)
}
}
list.value = res.rows
total.value = res.total
})
}
function handleDelete(item) {
uni.showModal({
content: `是否确认删除${item.name}`,
success: function(res) {
if (res.confirm) {
api.delInfo(item.perId).then(response => {
uni.showToast({
title: '删除成功',
icon: 'none'
})
getList()
})
}
}
})
}
function handleUpdate(n) {
uni.navigateTo({
url: `/pages/personalVip/editVip?perId=${n.perId}&perType=${n.perType}`
})
}
function handleInfo(n) {
uni.navigateTo({
url: `/pages/personalVip/detail?perId=${n.perId}`
})
}
function goVipList() {
let path = '/pages/personalVip/addVip';
uni.navigateTo({
url: path
});
}
</script>
<style scoped lang="scss">
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
.invertedbtn-red {
margin-left: 15rpx;
font-size: 30rpx;
padding: 16rpx 20rpx;
box-sizing: border-box;
border-radius: 50rpx;
background-color: #fff;
}
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 会员调动 -->
<uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem"
styleType="text" activeColor="#AD181F"></uni-segmented-control>
<view class="searchbar" v-if="deptType == 6">
<uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
v-model="queryParams.name" placeholder="搜索调动名称" @blur="getList">
</uni-easyinput>
<view class="invertedbtn-red" @click="goAddMobilize">+ 新建调动</view>
</view>
<view class="appList">
<view class="appItem" v-for="item in list">
<view class="status" @click="goDetail(item)">
<view v-if="deptType == 1">
<text v-if="item.ztxRes == 0">审核中</text>
<text v-if="item.ztxRes == 1" class="text-success">审核通过</text>
<text v-if="item.ztxRes == 2" class="text-danger">审核拒绝</text>
<text v-if="item.ztxRes == 3" class="text-warning">撤销申请</text>
</view>
<view v-if="deptType == 2 || deptType == 3">
<text v-if="item.shenRes == 0">审核中</text>
<text v-if="item.shenRes == 1" class="text-success">审核通过</text>
<text v-if="item.shenRes == 2" class="text-danger">审核拒绝</text>
<text v-if="item.shenRes == 3" class="text-warning">撤销申请</text>
</view>
<view v-if="deptType == 6">
<text v-if="item.status == 0">待提交</text>
<text v-if="item.status == 1">审核中</text>
<text v-if="item.status == 2" class="text-warning">审核拒绝</text>
<text v-if="item.status == 3" class="text-success">审核通过</text>
<text v-if="item.status == 4" class="text-danger">已退回</text>
</view>
</view>
<view class="name mt0" @click="goDetail(item)">{{item.name}}</view>
<view class="flexbox" @click="goDetail(item)">
<view>
调动类型
<view>{{ item.type == 1 ? '省外调动' : '省内调动' }}</view>
</view>
<view v-if="deptType == 1 || deptType == 2 || deptType == 3">
申请调入单位
<view>{{item.targetDeptName}}</view>
</view>
<view>
会员合计
<view>{{item.personCount}}</view>
</view>
</view>
<view class="func"
v-if="(deptType == 1&&item.ztxRes == 0)||((deptType == 2 || deptType == 3)&&item.shenRes == 0)">
<button @click="audit(item.id,'2')">拒绝</button>
<button @click="audit(item.id,'1')">同意</button>
</view>
<view class="func" v-if="(deptType == 6&&(item.status == 0 || item.status == 2))">
<button @click="editThis(item)">编辑</button>
<button>提交审核</button>
</view>
</view>
</view>
<view class="nodata" v-if="list.length==0">
<image mode="aspectFit" src="/static/nodata.png"></image>
<text>暂无数据</text>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad,
onShow
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
})
const navs = ref(['未提交', '审核中', '审核通过', '审核拒绝'])
const current = ref()
const list = ref([])
const total = ref(0)
const deptType = ref('')
onLoad(() => {
})
onShow(() => {
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
uni.showLoading({
title: '加载中'
})
deptType.value = app.globalData.deptType
if (deptType.value == 2 || deptType.value == 3) {
queryParams.value.dgId = -1
queryParams.value.shenRes = '0'
navs.value = ['审核中', '审核通过', '审核拒绝']
}
if (deptType.value == 1) {
queryParams.value.dgId = -2
queryParams.value.ztxRes = '0'
navs.value = ['审核中', '审核通过', '审核拒绝', '撤销申请']
}
if (deptType.value == 6) {
queryParams.value.dgId = 1
queryParams.value.status = '0'
navs.value = ['未提交', '审核中', '审核拒绝', '审核通过', '已退回']
}
getList()
}
function onClickItem(e) {
console.log(e)
uni.showLoading({
title: '加载中'
})
if (deptType.value == 2 || deptType.value == 3) {
queryParams.value.dgId = -1
queryParams.value.shenRes = e.currentIndex
}
if (deptType.value == 1) {
queryParams.value.dgId = -2
queryParams.value.ztxRes = e.currentIndex
}
if (deptType.value == 6) {
queryParams.value.dgId = 1
queryParams.value.status = e.currentIndex
}
getList()
}
function getList() {
api.getMobilizelist(queryParams.value).then(res => {
uni.hideLoading()
list.value = res.rows
list.value.forEach(item => {
if (item.status == 0) {
item.schedule = 0
}
if (item.status == 1 || item.status == 2) {
if (item.shenRes == 0) {
item.schedule = 0
}
if (item.shenRes == 1) {
item.type == 1 ? item.schedule = 50 : item.schedule = 100
if (item.ztxRes == 1) {
item.schedule = 100
}
}
if (item.shenRes == 2) {
item.type == 1 ? item.schedule = 50 : item.schedule = 0
}
}
if (item.status == 3) {
item.schedule = 100
}
})
total.value = res.total
})
}
function goAddMobilize() {
let path = `/pages/personalVip/addMobilize`
uni.navigateTo({
url: path
});
}
function editThis(item) {
let path = `/pages/personalVip/addMobilize?rangId=${item.id}`
uni.navigateTo({
url: path
});
}
function audit(rangeId, flag) {
if (flag == '0') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(rangeId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(rangeId, flag)
}
}
})
}
}
function doApproval(rangeId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
rangeIds: rangeId
}
console.log(obj)
api.mobilizeAudit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
getList()
})
}
function goDetail(item) {
const auditLog = encodeURIComponent(JSON.stringify(item.auditLog))
const form = encodeURIComponent(JSON.stringify(item))
let path = `/pages/personalVip/mobilizeDetail?rangeId=${item.id}&auditLog=${auditLog}&form=${form}`
uni.navigateTo({
url: path
});
}
</script>
<style scoped>
.searchbar {
display: flex;
align-items: center;
padding: 25rpx;
box-sizing: border-box;
:deep(.uni-easyinput .uni-easyinput__content) {
border-radius: 35rpx;
border: none;
height: 70rpx;
}
:deep(.uni-easyinput__content-input) {
font-size: 26rpx;
}
.invertedbtn-red {
border-radius: 50px;
background-color: #fff;
font-size: 30rpx;
padding: 10rpx 20rpx;
}
}
.mt0 {
margin-top: 0 !important;
}
.appList .appItem .name {
width: 80%;
word-break: break-all;
}
</style>
\ No newline at end of file
<template>
<view class="hasfixedbottom">
<view class="wBox">
<view class="tt">{{form.name}}</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view class="photobox">
<view class="colorful">{{n.perName?.slice(0,1)}}</view>
</view>
<view>
<view class="name">{{n.perName}}</view>
<view class="date">申请调入一级协会 {{n.sourceShenDeptName||'--'}}</view>
<view class="date">申请调入单位 {{n.targetDeptName||'--'}}</view>
</view>
</view>
</view>
</view>
<view class="h3-padding">审核流程</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in auditLog">
<view class="time">{{n.auditTime||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditResult==1" class="text-success">审核通过</text>
<text v-if="n.auditResult==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditResult==0" class="text-primary"> 审核中</text>
</view>
<!-- <view class="name">{{index+1}}</view> -->
<view class="deptName">{{n.auditDeptName}}</view>
<view v-if="n.auditResult==2">
备注:{{n.auditMsg||'/' }}
</view>
</view>
</view>
</view>
<view class="fixedBottom" v-if="(deptType == 1)&&form.ztxRes == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
<view class="fixedBottom" v-if="(deptType == 2 || deptType == 3)&&form.shenRes == 0">
<button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button>
<button class="btn-red" @click="audit(form.id,'1')">同意</button>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const app = getApp();
const queryParams = ref({})
const form = ref({})
const list = ref([])
const auditLog = ref([])
const feelList = ref([])
const total = ref(0)
const totalYear = ref(0)
const deptType = ref()
let rangeId = ''
onLoad((option) => {
rangeId = option.rangeId
if ('auditLog' in option) {
auditLog.value = JSON.parse(decodeURIComponent(option.auditLog))
}
if ('form' in option) {
form.value = JSON.parse(decodeURIComponent(option.form))
}
console.log(form.value)
if (app.globalData.isLogin) {
init()
} else {
app.firstLoadCallback = () => {
init()
};
}
})
function init() {
deptType.value = app.globalData.deptType
getForm()
}
function getForm() {
uni.showLoading({
title: '加载中'
})
api.getTransferList({
rangeId: rangeId
}).then(res => {
uni.hideLoading()
list.value = res.rows
})
}
function audit(rangeId, flag) {
if (flag == '2') {
// 拒绝
// 弹出框填写理由
uni.showModal({
title: '请输入拒绝理由',
editable: true,
success: function(res) {
if (res.confirm) {
if (!res.content) {
uni.showToast({
title: '请输入拒绝理由',
icon: 'none'
})
} else {
doApproval(rangeId, flag, res.content)
}
}
}
})
} else if (flag == '1') {
// 二次确认
uni.showModal({
title: '提示',
content: `确定审批通过吗`,
success: function(res) {
if (res.confirm) {
doApproval(rangeId, flag)
}
}
})
}
}
function doApproval(rangeId, flag, reason) {
var obj = {
flag: flag,
reason: reason || '',
rangeIds: rangeIds
}
console.log(obj)
api.mobilizeAudit(obj).then((res) => {
uni.showToast({
title: '操作成功',
icon: 'none'
})
uni.navigateBack()
})
}
</script>
<style scoped lang="scss">
.wBox {
width: 700rpx;
padding: 30rpx;
margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
border-radius: 15rpx;
.tt {
color: #0A1629;
font-size: 30rpx;
}
}
.userlist {
.item {
border-bottom: 1px dashed #e5e5e5;
position: relative;
.date {
margin-top: 10rpx;
}
.name {
text {
margin-left: 1em;
color: #4C5359;
font-size: 26rpx;
}
}
.nian {
position: absolute;
right: 0;
font-size: 30rpx;
color: #AD181F;
}
}
}
.info {
display: flex;
margin: 30rpx 0 20rpx;
font-size: 28rpx;
view {
color: #7D8592;
margin-right: 20rpx;
}
}
.fixedBottom {
justify-content: center;
button {
margin: 0 20rpx;
width: 286rpx;
}
.btn-red {
width: 286rpx;
}
}
</style>
\ No newline at end of file
<template>
<view>
<!-- 会员缴费 -->
<view class="appList">
<view class="appItem" v-for="item in list" @click="goDteail(item)">
<view class="status">
<text v-if="item.status==1" class="text-primary">审核中</text>
<text v-if="item.status==2" class="text-success"> 审核通过</text>
<text v-if="item.status==3" class="text-danger"> 审核拒绝</text>
<text v-if="item.status==4" class="text-warning">已退回</text>
</view>
<view class="date">
<uni-icons type="calendar" size="16" color="#7D8592"></uni-icons>
{{item.commitTime}} 提交
</view>
<view class="name">{{item.paymentName}}</view>
<view class="flexbox">
<view>
人数合计
<view>{{item.personCount}}</view>
</view>
<view>
新会员合计
<view>{{item.newPersonCount}}</view>
</view>
<view>
年限合计
<view>{{item.totalYear}}</view>
</view>
</view>
<view class="func" v-if="item.status==0">
<button>提交审核</button>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
})
const list = ref([])
const total = ref(0)
onMounted(() => {
getList()
})
function getList() {
api.getPaymentList(queryParams.value).then(res => {
list.value = res.rows
total.value = res.total
})
}
function goDteail(item) {
let path = `/pages/personalVip/paymentDetail?wfCode=${item.wfCode}`
uni.navigateTo({
url: path
});
}
</script>
<style>
</style>
\ No newline at end of file
<template>
<view>
<view class="wBox">
<view class="tt">{{form.paymentName}}</view>
<view class="info">
<view><text>{{list.length}}</text></view>
</view>
<!-- 成员 -->
<view class="userlist">
<view class="item" v-for="n in list">
<view class="photobox">
<image class="photo" v-if="n.photo" :src="n.photo" mode='aspectFill'></image>
<view class="colorful" v-else>{{n.personName?.slice(0,1)}}</view>
</view>
<view>
<view class="name">{{n.personName}}<text>({{n.memberInfoName}})</text></view>
<view class="date">原有效期至{{n.originValidityDate||'--'}}</view>
</view>
<view class="nian">
{{n.payYear}}
</view>
</view>
</view>
</view>
<view class="h3-padding">审核流程</view>
<view class="wBox">
<view class="stepItem" v-for="(n,index) in feelList">
<view class="time">{{n.auditTime||'待审批'}}</view>
<view class="content">
<view class="status">
<text v-if="n.auditResult==1" class="text-success">审核通过</text>
<text v-if="n.auditResult==2" class="text-danger"> 审核拒绝</text>
<text v-if="n.auditResult==0" class="text-primary"> 审核中</text>
<text v-if="n.auditResult==3" class="text-warning"> 已退回</text>
</view>
<view class="name">{{index+1}}</view>
<view class="deptName">{{n.auditDeptName||n.auditBy}}</view>
<view>
备注:{{n.auditMsg||'/' }}
</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
import * as api from '@/common/api.js'
import config from '@/config.js'
import {
onMounted,
ref
} from 'vue'
import {
onLoad
} from '@dcloudio/uni-app'
const queryParams = ref({
// pageNum: 1,
// pageSize: 10
})
const wfCode = ref('')
const form = ref([])
const list = ref([])
const feelList = ref([])
const total = ref(0)
onLoad((option) => {
wfCode.value = option.wfCode
getForm()
})
function getForm() {
api.getPaymentList(queryParams.value).then(res => {
if(res.rows)
for (var n of res.rows) {
if (n.wfCode == wfCode.value) {
form.value = n
}
}
getFillList(form.value.rangId)
getPersons()
})
}
function getPersons() {
queryParams.value.rangeId = form.value.rangId
api.addSelectPageList(queryParams.value).then(res => {
list.value = res.pageData.rows
})
}
function getFillList(id) {
api.fillAuditLog(id).then(res => {
feelList.value = res.data
})
}
</script>
<style scoped lang="scss">
.wBox{
width: 700rpx;padding: 30rpx;margin: 20rpx auto 0;
background: #FFFFFF;
box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196,203,214,0.1);
border-radius: 15rpx;
.tt{
color: #0A1629;
font-size: 30rpx;}
}
.userlist{
.item{border-bottom: 1px dashed #e5e5e5;position: relative;
.date{margin-top: 10rpx;}
.name{
text{margin-left: 1em;
color: #4C5359;
font-size: 26rpx;}
}
.nian{position: absolute;right: 0;
font-size: 30rpx;
color: #AD181F;}
}
}
.info{display: flex;margin: 30rpx 0 20rpx;
font-size: 28rpx;
view{color: #7D8592;margin-right: 20rpx;
text{
color: #AD181F;}
}
}
</style>
\ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!