759d9885 by 杨炀

no message

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