会员缴费
Showing
23 changed files
with
3184 additions
and
583 deletions
| ... | @@ -313,9 +313,16 @@ export function delInfo(perId) { | ... | @@ -313,9 +313,16 @@ export function delInfo(perId) { |
| 313 | }) | 313 | }) |
| 314 | } | 314 | } |
| 315 | // 查询个人个人会员缴费列表 | 315 | // 查询个人个人会员缴费列表 |
| 316 | // export function getPaymentList(query) { | ||
| 317 | // return request({ | ||
| 318 | // url: '/person/paymentRange/selectPageList', | ||
| 319 | // method: 'get', | ||
| 320 | // params: query | ||
| 321 | // }) | ||
| 322 | // } | ||
| 316 | export function getPaymentList(query) { | 323 | export function getPaymentList(query) { |
| 317 | return request({ | 324 | return request({ |
| 318 | url: '/person/paymentRange/selectPageList', | 325 | url: '/person/paymentRangeNew/list', |
| 319 | method: 'get', | 326 | method: 'get', |
| 320 | params: query | 327 | params: query |
| 321 | }) | 328 | }) |
| ... | @@ -725,6 +732,12 @@ export function personalCommit(id) { | ... | @@ -725,6 +732,12 @@ export function personalCommit(id) { |
| 725 | params: id | 732 | params: id |
| 726 | }) | 733 | }) |
| 727 | } | 734 | } |
| 735 | export function getNewCountByRangeId(rangeId) { | ||
| 736 | return request({ | ||
| 737 | url: `/person/paymentNew/getNewCountByRangeId/${rangeId}`, | ||
| 738 | method: 'get', | ||
| 739 | }) | ||
| 740 | } | ||
| 728 | 741 | ||
| 729 | export function delPayment(payIds) { | 742 | export function delPayment(payIds) { |
| 730 | return request({ | 743 | return request({ |
| ... | @@ -746,13 +759,11 @@ export function delcertified(ids) { | ... | @@ -746,13 +759,11 @@ export function delcertified(ids) { |
| 746 | }) | 759 | }) |
| 747 | } | 760 | } |
| 748 | 761 | ||
| 749 | export function editYear(id, year) { | 762 | export function editYear(data) { |
| 750 | return request({ | 763 | return request({ |
| 751 | url: `/person/payment/editYear/${id}`, | 764 | url: `/person/paymentNew/editYear/${data.payId}?payId=${data.payId}&year=${data.year}`, |
| 752 | method: 'get', | 765 | method: 'post', |
| 753 | params: { | 766 | params: data |
| 754 | year: year | ||
| 755 | } | ||
| 756 | }) | 767 | }) |
| 757 | } | 768 | } |
| 758 | 769 | ||
| ... | @@ -1256,3 +1267,130 @@ export function checkPersonByPersonId(perId) { | ... | @@ -1256,3 +1267,130 @@ export function checkPersonByPersonId(perId) { |
| 1256 | method: 'get' | 1267 | method: 'get' |
| 1257 | }) | 1268 | }) |
| 1258 | } | 1269 | } |
| 1270 | // 获取团体会员优惠政策 | ||
| 1271 | export function canUseDiscount(params) { | ||
| 1272 | return request({ | ||
| 1273 | url: `/system/certifiedNew/canUseDiscount`, | ||
| 1274 | method: 'get', | ||
| 1275 | params | ||
| 1276 | }) | ||
| 1277 | } | ||
| 1278 | // 获取团体会员一年缴费价格 | ||
| 1279 | export function getMyMemberCertUnitFee(params) { | ||
| 1280 | return request({ | ||
| 1281 | url: `/system/certifiedNew/getMyMemberCertUnitFee`, | ||
| 1282 | method: 'get', | ||
| 1283 | params | ||
| 1284 | }) | ||
| 1285 | } | ||
| 1286 | export function checkBusinessLicense(data) { | ||
| 1287 | return request({ | ||
| 1288 | url: `/member/info/checkBusinessLicense`, | ||
| 1289 | method: 'post', | ||
| 1290 | params: data | ||
| 1291 | }) | ||
| 1292 | } | ||
| 1293 | |||
| 1294 | // 生成团体订单renewYear | ||
| 1295 | export function certifiedNew(params) { | ||
| 1296 | return request({ | ||
| 1297 | url: `/system/certifiedNew/commit`, | ||
| 1298 | method: 'post', | ||
| 1299 | params | ||
| 1300 | }) | ||
| 1301 | } | ||
| 1302 | |||
| 1303 | // 模拟回调 | ||
| 1304 | export function callBack2(orderId) { | ||
| 1305 | return request({ | ||
| 1306 | url: `/system/certifiedNew/callBack2/${orderId}` | ||
| 1307 | }) | ||
| 1308 | } | ||
| 1309 | // 优惠政策回显 | ||
| 1310 | export function getZtxDiscountPolicy(params) { | ||
| 1311 | return request({ | ||
| 1312 | url: '/system/config/getZtxDiscountPolicy', | ||
| 1313 | method: 'get', | ||
| 1314 | params | ||
| 1315 | }) | ||
| 1316 | } | ||
| 1317 | // 考官列表 | ||
| 1318 | export function listApi(params) { | ||
| 1319 | return request({ | ||
| 1320 | url: `/member/examiner/list`, | ||
| 1321 | method: 'get', | ||
| 1322 | params | ||
| 1323 | }) | ||
| 1324 | } | ||
| 1325 | |||
| 1326 | // 考官列表 | ||
| 1327 | export function examinerDel(id) { | ||
| 1328 | return request({ | ||
| 1329 | url: `/member/examiner/${id}`, | ||
| 1330 | method: 'delete' | ||
| 1331 | }) | ||
| 1332 | } | ||
| 1333 | |||
| 1334 | // 添加考官 | ||
| 1335 | export function otherAdd(memId, ids) { | ||
| 1336 | return request({ | ||
| 1337 | url: `/member/examiner/otherAdd/${memId}/${ids}`, | ||
| 1338 | method: 'post' | ||
| 1339 | }) | ||
| 1340 | } | ||
| 1341 | |||
| 1342 | export function commitExamPointApply(params) { | ||
| 1343 | return request({ | ||
| 1344 | url: `/member/examPointApply/commit?selfSelect=${params.selfSelect}`, | ||
| 1345 | method: 'post', | ||
| 1346 | params | ||
| 1347 | }) | ||
| 1348 | } | ||
| 1349 | |||
| 1350 | export function getMyStatus() { | ||
| 1351 | return request({ | ||
| 1352 | url: `/member/examPointApply/getMyStatus` | ||
| 1353 | }) | ||
| 1354 | } | ||
| 1355 | |||
| 1356 | // 个人会员缴费支付 | ||
| 1357 | export function goPay(id) { | ||
| 1358 | return request({ | ||
| 1359 | url: `/person/paymentRangeNew/pay/${id}`, | ||
| 1360 | method: 'post' | ||
| 1361 | }) | ||
| 1362 | } | ||
| 1363 | // 缴费单列表学员 | ||
| 1364 | export function listAPI(params) { | ||
| 1365 | return request({ | ||
| 1366 | url: `/person/paymentNew/list`, | ||
| 1367 | method: 'get', | ||
| 1368 | params | ||
| 1369 | }) | ||
| 1370 | } | ||
| 1371 | |||
| 1372 | |||
| 1373 | // 删除学员 | ||
| 1374 | export function paymentNewDel(id) { | ||
| 1375 | return request({ | ||
| 1376 | url: `/person/paymentNew/${id}`, | ||
| 1377 | method: 'delete' | ||
| 1378 | }) | ||
| 1379 | } | ||
| 1380 | |||
| 1381 | |||
| 1382 | // 缴费单列表 | ||
| 1383 | export function memberInsertPersons(data) { | ||
| 1384 | return request({ | ||
| 1385 | url: `/person/paymentNew/memberInsertPersons/${data.rangeId}/${data.year}/${data.idcCode}`, | ||
| 1386 | method: 'post', | ||
| 1387 | data | ||
| 1388 | }) | ||
| 1389 | } | ||
| 1390 | export function createMemberPayRange(data) { | ||
| 1391 | return request({ | ||
| 1392 | url: `/person/paymentRangeNew/createMemberPayRange`, | ||
| 1393 | method: 'post', | ||
| 1394 | data | ||
| 1395 | }) | ||
| 1396 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -42,7 +42,12 @@ page { | ... | @@ -42,7 +42,12 @@ page { |
| 42 | .text-primary{text-decoration: underline;}} | 42 | .text-primary{text-decoration: underline;}} |
| 43 | } | 43 | } |
| 44 | } | 44 | } |
| 45 | 45 | .flex{ | |
| 46 | display: flex; | ||
| 47 | } | ||
| 48 | .f-j-s{ | ||
| 49 | justify-content: space-between; | ||
| 50 | } | ||
| 46 | .vipData{ | 51 | .vipData{ |
| 47 | font-size: 24rpx;padding: 10px 20px;box-sizing: border-box; | 52 | font-size: 24rpx;padding: 10px 20px;box-sizing: border-box; |
| 48 | display: flex;background: #F7E7E8; | 53 | display: flex;background: #F7E7E8; | ... | ... |
| ... | @@ -4,9 +4,10 @@ | ... | @@ -4,9 +4,10 @@ |
| 4 | 4 | ||
| 5 | // staging 会员系统 | 5 | // staging 会员系统 |
| 6 | // const baseUrl_api = "http://22yidpjzjifv.ngrok.xiaomiqiu123.top/stage-api/"; | 6 | // const baseUrl_api = "http://22yidpjzjifv.ngrok.xiaomiqiu123.top/stage-api/"; |
| 7 | const baseUrl_api = "https://ztx.itechtop.cn:8443/stage-api"; | 7 | // const baseUrl_api = "https://ztx.itechtop.cn:8443/stage-api"; |
| 8 | // const baseUrl_api = 'http://192.168.1.132:8787' | 8 | const baseUrl_api = 'http://192.168.1.154:8788' |
| 9 | // const baseUrl_api = 'https://tkcn.19wk.cn:8443/stage-api' | 9 | // const baseUrl_api = 'https://tkcn.19wk.cn:8443/stage-api' |
| 10 | // const baseUrl_api = 'http://tk004.wxjylt.com/stage-api' | ||
| 10 | 11 | ||
| 11 | // const baseUrl_api = 'https://system.taekwondo.org.cn/stage-api' | 12 | // const baseUrl_api = 'https://system.taekwondo.org.cn/stage-api' |
| 12 | export default { | 13 | export default { | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <view> | 2 | <view :class="{ 'lock-scroll': popupShow }"> |
| 3 | <view v-if="showDirectly&&directUnderFlag==0"> | 3 | <view v-if="showDirectly&&directUnderFlag==0"> |
| 4 | <view class="flexbox"> | 4 | <view class="flexbox"> |
| 5 | <view> | 5 | <view> |
| ... | @@ -15,25 +15,25 @@ | ... | @@ -15,25 +15,25 @@ |
| 15 | <text v-if="authenticationStatusa == 4" class="text-danger">即将过期</text> | 15 | <text v-if="authenticationStatusa == 4" class="text-danger">即将过期</text> |
| 16 | <text v-if="authenticationStatusa == 5" class="text-danger">已过期</text> | 16 | <text v-if="authenticationStatusa == 5" class="text-danger">已过期</text> |
| 17 | </text> | 17 | </text> |
| 18 | |||
| 19 | </view> | 18 | </view> |
| 20 | </view> | 19 | </view> |
| 21 | <view class="flexbox" style="justify-content: end;padding: 0 30rpx 40rpx;"> | 20 | <view class="flexbox" style="justify-content: flex-end;padding: 0 30rpx 40rpx;"> |
| 22 | <button class="btn-red" style="margin: 0 20rpx 0 0;" size="mini" | 21 | <button class="btn-red" style="margin: 0 20rpx 0 0;" size="mini" |
| 23 | v-if="activeStatus==0&&authenticationStatusa" @click="payTheFees">激活</button> | 22 | v-if="activeStatus==0&&authenticationStatusa" @click="payTheFees">激活</button> |
| 24 | <view v-else> | 23 | <view v-else > |
| 24 | <button class="btn-red" style="margin: 0 20rpx 0 0;" size="mini" :disabled="auditStatus==1||auditStatus==2||form.isPoints==0" | ||
| 25 | @click="showApplyDialog">考点申请</button> | ||
| 25 | <button class="btn-red" style="margin: 0 20rpx 0 0;" size="mini" :disabled="btn" | 26 | <button class="btn-red" style="margin: 0 20rpx 0 0;" size="mini" :disabled="btn" |
| 26 | @click="payTheFees">去缴费</button> | 27 | @click="payTheFees">去缴费</button> |
| 27 | <button class="btn-red-kx" style="margin: 0 20rpx 0 0;" size="mini" v-if="form.deptType!=1" | 28 | <button class="btn-red-kx" style="margin: 0 20rpx 0 0;" size="mini" v-if="form.deptType!=1" |
| 28 | @click="auditEditFN">审核详情</button> | 29 | @click="auditEditFN">审核详情</button> |
| 29 | </view> | 30 | </view> |
| 30 | </view> | 31 | </view> |
| 31 | </view> | 32 | </view> |
| 32 | <view class="mainbox"> | 33 | <view class="mainbox"> |
| 33 | <uni-list> | 34 | <uni-list> |
| 34 | <uni-list-item v-if="authenticationStatusa != 1&&authenticationStatusa != 0&&authenticationStatusa != 3" | 35 | <uni-list-item v-if="authenticationStatusa != 1&&authenticationStatusa != 0&&authenticationStatusa != 3" |
| 35 | title="所属协会" :rightText="form.aname"> | 36 | title="所属协会" :rightText="form.aname"> |
| 36 | |||
| 37 | </uni-list-item> | 37 | </uni-list-item> |
| 38 | <uni-list-item title="会员编号" v-if="form.menCode" :rightText="form.menCode" /> | 38 | <uni-list-item title="会员编号" v-if="form.menCode" :rightText="form.menCode" /> |
| 39 | <uni-list-item title="机构名称" :rightText="form.name" /> | 39 | <uni-list-item title="机构名称" :rightText="form.name" /> |
| ... | @@ -43,9 +43,7 @@ | ... | @@ -43,9 +43,7 @@ |
| 43 | <uni-data-picker readonly :clear-icon="false" | 43 | <uni-data-picker readonly :clear-icon="false" |
| 44 | v-model="form.belongProvinceId" :localdata="options"> | 44 | v-model="form.belongProvinceId" :localdata="options"> |
| 45 | </uni-data-picker> | 45 | </uni-data-picker> |
| 46 | |||
| 47 | </view> | 46 | </view> |
| 48 | |||
| 49 | </template> | 47 | </template> |
| 50 | </uni-list-item> | 48 | </uni-list-item> |
| 51 | <uni-list-item title="社会信用代码" | 49 | <uni-list-item title="社会信用代码" |
| ... | @@ -101,13 +99,27 @@ | ... | @@ -101,13 +99,27 @@ |
| 101 | </image> | 99 | </image> |
| 102 | <text>共{{form.picturesArr?.length}}张</text> | 100 | <text>共{{form.picturesArr?.length}}张</text> |
| 103 | </view> | 101 | </view> |
| 104 | |||
| 105 | </view> | 102 | </view> |
| 106 | </template> | 103 | </template> |
| 107 | </uni-list-item> | 104 | </uni-list-item> |
| 108 | </uni-list> | 105 | </uni-list> |
| 109 | </view> | 106 | </view> |
| 110 | 107 | <!-- 弹窗添加触摸事件拦截 --> | |
| 108 | <uni-popup ref="applyPopup" type="center" | ||
| 109 | @touchmove.stop.prevent="() => {}" | ||
| 110 | @open="onPopupOpen" | ||
| 111 | @close="onPopupClose"> | ||
| 112 | <view class="apply-dialog" @touchmove.stop.prevent="() => {}"> | ||
| 113 | <view class="dialog-title">考点申请</view> | ||
| 114 | <view class="dialog-content"> | ||
| 115 | <text class="remind">友情提示:非考点无法申请级位考试</text> | ||
| 116 | </view> | ||
| 117 | <view class="dialog-buttons"> | ||
| 118 | <button class="btn-cancel" @click="closeApplyDialog">暂不申请</button> | ||
| 119 | <button class="btn-confirm" @click="goToApplyPage">立即申请</button> | ||
| 120 | </view> | ||
| 121 | </view> | ||
| 122 | </uni-popup> | ||
| 111 | <view class="height1"></view> | 123 | <view class="height1"></view> |
| 112 | </view> | 124 | </view> |
| 113 | </template> | 125 | </template> |
| ... | @@ -119,7 +131,7 @@ | ... | @@ -119,7 +131,7 @@ |
| 119 | 131 | ||
| 120 | import _ from 'underscore' | 132 | import _ from 'underscore' |
| 121 | import { | 133 | import { |
| 122 | ref | 134 | ref, onUnmounted |
| 123 | } from 'vue' | 135 | } from 'vue' |
| 124 | import { | 136 | import { |
| 125 | onLoad,onShow | 137 | onLoad,onShow |
| ... | @@ -141,8 +153,23 @@ | ... | @@ -141,8 +153,23 @@ |
| 141 | const pr = ref({}) | 153 | const pr = ref({}) |
| 142 | const applicationForMembership1 = ref({}) | 154 | const applicationForMembership1 = ref({}) |
| 143 | const options = ref([]) | 155 | const options = ref([]) |
| 156 | const applyPopup = ref(null) | ||
| 157 | // 新增:控制弹窗显示状态(用于锁定滚动) | ||
| 158 | const popupShow = ref(false) | ||
| 159 | // 考点审核状态 0 未提交 1 审核中 2 审核成功 3 审核失败 | ||
| 160 | const auditStatus = ref(0) | ||
| 161 | |||
| 144 | onShow(() => { | 162 | onShow(() => { |
| 145 | init() | 163 | init() |
| 164 | if (form.value.deptType != 1) { // 修复:原代码deptType未定义,改为form.value.deptType | ||
| 165 | getMyStatusAPI() | ||
| 166 | } | ||
| 167 | }) | ||
| 168 | |||
| 169 | // 页面卸载时恢复滚动(防止异常锁死) | ||
| 170 | onUnmounted(() => { | ||
| 171 | uni.setPageScrollEnabled({ enabled: true }) | ||
| 172 | popupShow.value = false | ||
| 146 | }) | 173 | }) |
| 147 | 174 | ||
| 148 | function init() { | 175 | function init() { |
| ... | @@ -190,12 +217,10 @@ | ... | @@ -190,12 +217,10 @@ |
| 190 | // 入会材料 | 217 | // 入会材料 |
| 191 | if (form.value.materials) { | 218 | if (form.value.materials) { |
| 192 | form.value.materials1 = JSON.parse(form.value.materials) | 219 | form.value.materials1 = JSON.parse(form.value.materials) |
| 193 | // form.value.materials = JSON.parse(form.value.materials) | ||
| 194 | } | 220 | } |
| 195 | // 入会申请书 | 221 | // 入会申请书 |
| 196 | if (form.value.applicationForMembership) { | 222 | if (form.value.applicationForMembership) { |
| 197 | form.value.applicationForMembership1 = JSON.parse(form.value.applicationForMembership) | 223 | form.value.applicationForMembership1 = JSON.parse(form.value.applicationForMembership) |
| 198 | // form.value.applicationForMembership = JSON.parse(form.value.applicationForMembership) | ||
| 199 | } | 224 | } |
| 200 | applicationForMembership1.value = form.value.applicationForMembership || [] | 225 | applicationForMembership1.value = form.value.applicationForMembership || [] |
| 201 | form.value.deptType = res.data.dept.deptType | 226 | form.value.deptType = res.data.dept.deptType |
| ... | @@ -238,7 +263,53 @@ | ... | @@ -238,7 +263,53 @@ |
| 238 | } | 263 | } |
| 239 | console.log(form.value.picturesArr) | 264 | console.log(form.value.picturesArr) |
| 240 | } | 265 | } |
| 266 | }) | ||
| 267 | } | ||
| 268 | |||
| 269 | async function getMyStatusAPI() { | ||
| 270 | const { data } = await api.getMyStatus() | ||
| 271 | if (data && data.auditStatus) { | ||
| 272 | auditStatus.value = data.auditStatus | ||
| 273 | } else { | ||
| 274 | auditStatus.value = 0 | ||
| 275 | } | ||
| 276 | } | ||
| 277 | |||
| 278 | // 新增:弹窗打开时锁定滚动 | ||
| 279 | function onPopupOpen() { | ||
| 280 | popupShow.value = true | ||
| 281 | // 1. 小程序API锁定页面滚动 | ||
| 282 | uni.setPageScrollEnabled({ enabled: false }) | ||
| 283 | // 延时兜底(防止API生效延迟) | ||
| 284 | setTimeout(() => { | ||
| 285 | uni.setPageScrollEnabled({ enabled: false }) | ||
| 286 | }, 100) | ||
| 287 | } | ||
| 288 | |||
| 289 | // 新增:弹窗关闭时恢复滚动 | ||
| 290 | function onPopupClose() { | ||
| 291 | popupShow.value = false | ||
| 292 | // 恢复页面滚动 | ||
| 293 | uni.setPageScrollEnabled({ enabled: true }) | ||
| 294 | setTimeout(() => { | ||
| 295 | uni.setPageScrollEnabled({ enabled: true }) | ||
| 296 | }, 100) | ||
| 297 | } | ||
| 298 | |||
| 299 | function showApplyDialog() { | ||
| 300 | applyPopup.value.open() | ||
| 301 | } | ||
| 241 | 302 | ||
| 303 | // 关闭申请弹窗 | ||
| 304 | function closeApplyDialog() { | ||
| 305 | applyPopup.value.close() | ||
| 306 | } | ||
| 307 | |||
| 308 | // 跳转到考点申请页面 | ||
| 309 | function goToApplyPage() { | ||
| 310 | closeApplyDialog() | ||
| 311 | uni.navigateTo({ | ||
| 312 | url: `/myCenter/examPointApply?memId=${form.value.memId}` | ||
| 242 | }) | 313 | }) |
| 243 | } | 314 | } |
| 244 | 315 | ||
| ... | @@ -247,13 +318,12 @@ | ... | @@ -247,13 +318,12 @@ |
| 247 | url: `/myCenter/reviewList` | 318 | url: `/myCenter/reviewList` |
| 248 | }) | 319 | }) |
| 249 | } | 320 | } |
| 321 | |||
| 250 | function showImage(arr, index) { | 322 | function showImage(arr, index) { |
| 251 | uni.previewImage({ | 323 | uni.previewImage({ |
| 252 | urls: arr, | 324 | urls: arr, |
| 253 | current: index, | 325 | current: index, |
| 254 | success: function(res) { | 326 | success: function(res) {} |
| 255 | |||
| 256 | } | ||
| 257 | }) | 327 | }) |
| 258 | } | 328 | } |
| 259 | 329 | ||
| ... | @@ -263,15 +333,12 @@ | ... | @@ -263,15 +333,12 @@ |
| 263 | if(url.indexOf('http')>-1){ | 333 | if(url.indexOf('http')>-1){ |
| 264 | uni.previewImage({ | 334 | uni.previewImage({ |
| 265 | urls: [url], | 335 | urls: [url], |
| 266 | success: function(res) { | 336 | success: function(res) {} |
| 267 | |||
| 268 | } | ||
| 269 | }) | 337 | }) |
| 270 | } else { | 338 | } else { |
| 271 | uni.previewImage({ | 339 | uni.previewImage({ |
| 272 | urls: [config.baseUrl_api + url], | 340 | urls: [config.baseUrl_api + url], |
| 273 | success: function(res) { | 341 | success: function(res) {} |
| 274 | } | ||
| 275 | }) | 342 | }) |
| 276 | } | 343 | } |
| 277 | } else { | 344 | } else { |
| ... | @@ -322,12 +389,14 @@ | ... | @@ -322,12 +389,14 @@ |
| 322 | } | 389 | } |
| 323 | }); | 390 | }); |
| 324 | } | 391 | } |
| 392 | |||
| 325 | function payTheFees(){ | 393 | function payTheFees(){ |
| 326 | if (!form.value.name) { | 394 | if (!form.value.name) { |
| 327 | uni.showToast({ | 395 | uni.showToast({ |
| 328 | title: `请先完善团体信息`, | 396 | title: `请先完善团体信息`, |
| 329 | icon: 'none' | 397 | icon: 'none' |
| 330 | }); | 398 | }); |
| 399 | return; // 新增:防止无名称时跳转 | ||
| 331 | } | 400 | } |
| 332 | uni.navigateTo({ | 401 | uni.navigateTo({ |
| 333 | url:`/myCenter/perfect` | 402 | url:`/myCenter/perfect` |
| ... | @@ -336,6 +405,17 @@ | ... | @@ -336,6 +405,17 @@ |
| 336 | </script> | 405 | </script> |
| 337 | 406 | ||
| 338 | <style scoped lang="scss"> | 407 | <style scoped lang="scss"> |
| 408 | // 新增:锁定滚动的核心样式 | ||
| 409 | .lock-scroll { | ||
| 410 | position: fixed !important; | ||
| 411 | top: 0; | ||
| 412 | left: 0; | ||
| 413 | right: 0; | ||
| 414 | bottom: 0; | ||
| 415 | overflow: hidden !important; | ||
| 416 | height: 100vh !important; | ||
| 417 | } | ||
| 418 | |||
| 339 | .height1{height: 100rpx;} | 419 | .height1{height: 100rpx;} |
| 340 | .photobox { | 420 | .photobox { |
| 341 | position: relative; | 421 | position: relative; |
| ... | @@ -399,4 +479,57 @@ | ... | @@ -399,4 +479,57 @@ |
| 399 | .mainbox { | 479 | .mainbox { |
| 400 | margin: 30rpx; | 480 | margin: 30rpx; |
| 401 | } | 481 | } |
| 482 | .apply-dialog { | ||
| 483 | width: 530rpx; | ||
| 484 | background: #fff; | ||
| 485 | border-radius: 16rpx; | ||
| 486 | padding: 40rpx; | ||
| 487 | // 新增:禁止弹窗内部滚动 | ||
| 488 | touch-action: none; | ||
| 489 | } | ||
| 490 | .dialog-title { | ||
| 491 | font-size: 32rpx; | ||
| 492 | font-weight: bold; | ||
| 493 | text-align: center; | ||
| 494 | margin-bottom: 30rpx; | ||
| 495 | } | ||
| 496 | .dialog-content { | ||
| 497 | margin: 40rpx; | ||
| 498 | } | ||
| 499 | .remind { | ||
| 500 | color: #FF8124; | ||
| 501 | font-size: 26rpx; | ||
| 502 | margin-top: 40rpx; | ||
| 503 | } | ||
| 504 | .dialog-buttons { | ||
| 505 | display: flex; | ||
| 506 | justify-content: space-between; | ||
| 507 | margin-top: 40rpx; | ||
| 508 | } | ||
| 509 | .btn-cancel { | ||
| 510 | width: 225rpx; | ||
| 511 | height: 80rpx; | ||
| 512 | line-height: 80rpx; | ||
| 513 | border: 1rpx solid #ddd; | ||
| 514 | border-radius: 40rpx; | ||
| 515 | background: #fff; | ||
| 516 | color: #333; | ||
| 517 | text-align: center; | ||
| 518 | font-size: 14px; | ||
| 519 | } | ||
| 520 | .btn-confirm { | ||
| 521 | width: 225rpx; | ||
| 522 | height: 80rpx; | ||
| 523 | line-height: 80rpx; | ||
| 524 | border-radius: 40rpx; | ||
| 525 | background: #C4121B; | ||
| 526 | font-size: 14px; | ||
| 527 | color: #fff; | ||
| 528 | text-align: center; | ||
| 529 | } | ||
| 530 | |||
| 531 | // 新增:给uni-popup蒙版添加禁止滚动样式 | ||
| 532 | :deep(.uni-popup__mask) { | ||
| 533 | touch-action: none !important; | ||
| 534 | } | ||
| 402 | </style> | 535 | </style> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
myCenter/chooseExaminer.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="container"> | ||
| 3 | <!-- 搜索区域:固定在顶部 --> | ||
| 4 | <view class="search-area"> | ||
| 5 | <view class="search-item"> | ||
| 6 | <text>考官姓名:</text> | ||
| 7 | <input v-model="queryParams.name" placeholder="请输入考官姓名" class="search-input" /> | ||
| 8 | </view> | ||
| 9 | <view class="search-item"> | ||
| 10 | <text>考官编号:</text> | ||
| 11 | <input v-model="queryParams.certCode" placeholder="请输入考官编号" class="search-input" /> | ||
| 12 | </view> | ||
| 13 | <view class="search-buttons"> | ||
| 14 | <button class="search-btn" @click="handleQuery">查询</button> | ||
| 15 | <button class="reset-btn" @click="resetQuery">重置</button> | ||
| 16 | </view> | ||
| 17 | </view> | ||
| 18 | |||
| 19 | <view class="list-item" v-for="(item, index) in infoList" :key="item.perId"> | ||
| 20 | <view class="info"> | ||
| 21 | <view class="name">{{ item.name }} {{ item.perCode }}</view> | ||
| 22 | <view class="idc">证件号码:{{ item.idcCode }}</view> | ||
| 23 | <view class="reg">注册地:{{ item.memName }}</view> | ||
| 24 | </view> | ||
| 25 | <button | ||
| 26 | class="choose-btn" | ||
| 27 | :class="{ disabled: checkChosen(item) }" | ||
| 28 | @click="handleChoose(item)" | ||
| 29 | :disabled="checkChosen(item)" | ||
| 30 | > | ||
| 31 | {{ checkChosen(item) ? '已选择' : '选择' }} | ||
| 32 | </button> | ||
| 33 | </view> | ||
| 34 | |||
| 35 | <uni-popup ref="expirePopup" type="center" background-color="rgba(0,0,0,0.5)"> | ||
| 36 | <view class="custom-modal"> | ||
| 37 | <view class="modal-title">提示</view> | ||
| 38 | <view class="modal-content">该考官资质已过期,是否继续添加?</view> | ||
| 39 | <view class="modal-btns"> | ||
| 40 | <button class="btn-cancel" @click="closeExpirePopup()">取消</button> | ||
| 41 | <button class="btn-confirm" @click="confirmAddExpireExaminer()">确定</button> | ||
| 42 | </view> | ||
| 43 | </view> | ||
| 44 | </uni-popup> | ||
| 45 | </view> | ||
| 46 | </template> | ||
| 47 | |||
| 48 | <script setup> | ||
| 49 | import { ref, reactive, toRefs } from 'vue' | ||
| 50 | import { onLoad } from '@dcloudio/uni-app'; | ||
| 51 | import * as api from '@/common/api.js' | ||
| 52 | import _ from 'lodash' | ||
| 53 | |||
| 54 | const props = defineProps({ | ||
| 55 | isValidity: { | ||
| 56 | type: String, | ||
| 57 | default: '0' | ||
| 58 | } | ||
| 59 | }) | ||
| 60 | |||
| 61 | const isValidity = ref('0') | ||
| 62 | const memId = ref('') | ||
| 63 | const chosen = ref([]) | ||
| 64 | const expirePopup = ref(null) | ||
| 65 | const currentExpireItem = ref(null) | ||
| 66 | |||
| 67 | onLoad((option) => { | ||
| 68 | isValidity.value = option.isValidity | ||
| 69 | memId.value = option.memId | ||
| 70 | chosen.value = JSON.parse(option.chosen) | ||
| 71 | }) | ||
| 72 | |||
| 73 | const data = reactive({ | ||
| 74 | queryParams: { | ||
| 75 | pageNum: 1, | ||
| 76 | pageSize: 10, | ||
| 77 | name: null, | ||
| 78 | certCode: null, | ||
| 79 | type: 1, | ||
| 80 | shenMemId: '' | ||
| 81 | } | ||
| 82 | }) | ||
| 83 | const { queryParams } = toRefs(data) | ||
| 84 | |||
| 85 | const infoList = ref([]) | ||
| 86 | const loading = ref(false) | ||
| 87 | const total = ref(0) | ||
| 88 | |||
| 89 | // 获取考官列表 | ||
| 90 | async function getList() { | ||
| 91 | if (!queryParams.value.name) | ||
| 92 | return uni.showToast({ title: '请输入考官姓名', icon: 'none' }) | ||
| 93 | if (queryParams.value.type == 1 && !queryParams.value.certCode) | ||
| 94 | return uni.showToast({ title: '请输入考官编号', icon: 'none' }) | ||
| 95 | |||
| 96 | loading.value = true | ||
| 97 | const res = await api.getCoachList(queryParams.value) | ||
| 98 | infoList.value = res.rows | ||
| 99 | total.value = res.total | ||
| 100 | loading.value = false | ||
| 101 | |||
| 102 | if (infoList.value.length === 0) { | ||
| 103 | uni.showToast({ title: '请核实考官编号、有效期及归属地!', icon: 'none' }) | ||
| 104 | } | ||
| 105 | } | ||
| 106 | |||
| 107 | // 检查是否已选择 | ||
| 108 | function checkChosen(row) { | ||
| 109 | return _.some(chosen.value, (c) => { | ||
| 110 | return c.perId == row.perId | ||
| 111 | }) | ||
| 112 | } | ||
| 113 | |||
| 114 | // 查询 | ||
| 115 | function handleQuery() { | ||
| 116 | queryParams.value.pageNum = 1 | ||
| 117 | getList() | ||
| 118 | } | ||
| 119 | |||
| 120 | // 重置 | ||
| 121 | function resetQuery() { | ||
| 122 | queryParams.value.name = null | ||
| 123 | queryParams.value.certCode = null | ||
| 124 | infoList.value = [] | ||
| 125 | total.value = 0 | ||
| 126 | } | ||
| 127 | |||
| 128 | async function handleChoose(row) { | ||
| 129 | if (checkChosen(row)) { | ||
| 130 | return uni.showToast({ title: '已选择该考官', icon: 'none' }) | ||
| 131 | } | ||
| 132 | |||
| 133 | // 资质过期逻辑 | ||
| 134 | if (row.canChoose != 1) { | ||
| 135 | // 暂存当前考官数据 | ||
| 136 | currentExpireItem.value = row | ||
| 137 | // 打开自定义过期确认弹窗 | ||
| 138 | expirePopup.value.open() | ||
| 139 | return | ||
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | // 关闭过期确认弹窗 | ||
| 144 | function closeExpirePopup() { | ||
| 145 | expirePopup.value.close() | ||
| 146 | } | ||
| 147 | |||
| 148 | // 确认添加过期考官 | ||
| 149 | async function confirmAddExpireExaminer() { | ||
| 150 | if (!currentExpireItem.value) return | ||
| 151 | |||
| 152 | try { | ||
| 153 | await api.otherAdd(memId.value, currentExpireItem.value.perId) | ||
| 154 | uni.showToast({ title: '添加成功', icon: 'success' }) | ||
| 155 | uni.navigateBack({ delta: 1 }) | ||
| 156 | } catch (err) { | ||
| 157 | uni.showToast({ title: '添加失败', icon: 'none' }) | ||
| 158 | } finally { | ||
| 159 | expirePopup.value.close() | ||
| 160 | currentExpireItem.value = null | ||
| 161 | } | ||
| 162 | } | ||
| 163 | </script> | ||
| 164 | |||
| 165 | <style scoped> | ||
| 166 | .container { | ||
| 167 | display: flex; | ||
| 168 | flex-direction: column; | ||
| 169 | background: #f7f7f7; | ||
| 170 | min-height: 100vh; | ||
| 171 | padding: 0; | ||
| 172 | } | ||
| 173 | |||
| 174 | .search-area { | ||
| 175 | background: #ffffff; | ||
| 176 | border-radius: 16rpx; | ||
| 177 | padding: 30rpx; | ||
| 178 | margin: 30rpx; | ||
| 179 | flex-shrink: 0; | ||
| 180 | } | ||
| 181 | |||
| 182 | .search-item { | ||
| 183 | display: flex; | ||
| 184 | align-items: center; | ||
| 185 | margin-bottom: 20rpx; | ||
| 186 | } | ||
| 187 | .search-input { | ||
| 188 | flex: 1; | ||
| 189 | border: 1rpx solid #ddd; | ||
| 190 | border-radius: 8rpx; | ||
| 191 | padding: 20rpx; | ||
| 192 | font-size: 28rpx; | ||
| 193 | } | ||
| 194 | |||
| 195 | .search-buttons { | ||
| 196 | display: flex; | ||
| 197 | justify-content: space-between; | ||
| 198 | margin-top: 10rpx; | ||
| 199 | } | ||
| 200 | .search-btn, .reset-btn { | ||
| 201 | width: 200rpx; | ||
| 202 | height: 70rpx; | ||
| 203 | line-height: 70rpx; | ||
| 204 | border-radius: 8rpx; | ||
| 205 | text-align: center; | ||
| 206 | font-size: 28rpx; | ||
| 207 | } | ||
| 208 | .search-btn { | ||
| 209 | background: #C4121B; | ||
| 210 | color: #fff; | ||
| 211 | } | ||
| 212 | .reset-btn { | ||
| 213 | background: #f7f7f7; | ||
| 214 | color: #333; | ||
| 215 | } | ||
| 216 | |||
| 217 | /* 列表区域:滚动 */ | ||
| 218 | .list-area { | ||
| 219 | flex: 1; | ||
| 220 | background: #ffffff; | ||
| 221 | border-radius: 16rpx; | ||
| 222 | margin: 0 30rpx 30rpx; | ||
| 223 | padding: 0 30rpx; | ||
| 224 | } | ||
| 225 | |||
| 226 | .list-item { | ||
| 227 | padding: 30rpx; | ||
| 228 | margin: 0 30rpx; | ||
| 229 | border-bottom: 1rpx solid #eee; | ||
| 230 | background-color: #fff; | ||
| 231 | } | ||
| 232 | .info { | ||
| 233 | flex: 1; | ||
| 234 | } | ||
| 235 | .name { | ||
| 236 | font-size: 30rpx; | ||
| 237 | font-weight: bold; | ||
| 238 | color: #333; | ||
| 239 | } | ||
| 240 | .idc, .reg { | ||
| 241 | font-size: 26rpx; | ||
| 242 | color: #666; | ||
| 243 | margin: 20rpx 0; | ||
| 244 | } | ||
| 245 | .choose-btn { | ||
| 246 | color: #C4121B; | ||
| 247 | font-size: 26rpx; | ||
| 248 | border: 1rpx solid #C4121B; | ||
| 249 | border-radius: 8rpx; | ||
| 250 | padding: 10rpx 20rpx; | ||
| 251 | background-color: #fff; | ||
| 252 | margin: 10rpx auto; | ||
| 253 | } | ||
| 254 | .choose-btn.disabled { | ||
| 255 | color: #ccc; | ||
| 256 | border-color: #ccc; | ||
| 257 | } | ||
| 258 | |||
| 259 | /* 自定义弹窗样式(和之前保持统一) */ | ||
| 260 | .custom-modal { | ||
| 261 | width: 600rpx; | ||
| 262 | background: #fff; | ||
| 263 | border-radius: 20rpx; | ||
| 264 | padding: 40rpx 30rpx; | ||
| 265 | box-sizing: border-box; | ||
| 266 | text-align: center; | ||
| 267 | } | ||
| 268 | .modal-title { | ||
| 269 | font-size: 36rpx; | ||
| 270 | font-weight: 600; | ||
| 271 | color: #333; | ||
| 272 | margin-bottom: 30rpx; | ||
| 273 | } | ||
| 274 | .modal-content { | ||
| 275 | font-size: 30rpx; | ||
| 276 | color: #666; | ||
| 277 | line-height: 1.6; | ||
| 278 | margin-bottom: 30rpx; | ||
| 279 | } | ||
| 280 | .modal-btns { | ||
| 281 | display: flex; | ||
| 282 | justify-content: space-between; | ||
| 283 | gap: 20rpx; | ||
| 284 | } | ||
| 285 | .btn-cancel { | ||
| 286 | flex: 1; | ||
| 287 | height: 80rpx; | ||
| 288 | line-height: 80rpx; | ||
| 289 | background: #f5f5f5; | ||
| 290 | color: #999; | ||
| 291 | border-radius: 40rpx; | ||
| 292 | font-size: 32rpx; | ||
| 293 | border: none; | ||
| 294 | } | ||
| 295 | .btn-confirm { | ||
| 296 | flex: 1; | ||
| 297 | height: 80rpx; | ||
| 298 | line-height: 80rpx; | ||
| 299 | background: #C4121B; | ||
| 300 | color: #fff; | ||
| 301 | border-radius: 40rpx; | ||
| 302 | font-size: 32rpx; | ||
| 303 | border: none; | ||
| 304 | } | ||
| 305 | /* 去除button默认边框 */ | ||
| 306 | .btn-cancel::after, .btn-confirm::after { | ||
| 307 | border: none; | ||
| 308 | } | ||
| 309 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
myCenter/examPointApply.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="container"> | ||
| 3 | <!-- 考官选择类型 --> | ||
| 4 | <view class="radio-section"> | ||
| 5 | <radio-group @change="onSelfSelectChange" class="radio-group"> | ||
| 6 | <label class="radio-item"> | ||
| 7 | <radio value="1" :checked="form.selfSelect == '1'" class="custom-radio" /> | ||
| 8 | <text class="radio-text">自行录入考官(级位考官)</text> | ||
| 9 | </label> | ||
| 10 | <label class="radio-item"> | ||
| 11 | <radio value="0" :checked="form.selfSelect == '0'" class="custom-radio" /> | ||
| 12 | <text class="radio-text">省跆协指派考官</text> | ||
| 13 | </label> | ||
| 14 | </radio-group> | ||
| 15 | </view> | ||
| 16 | <view class="section"> | ||
| 17 | <!-- 自行录入考官区域 --> | ||
| 18 | <view class="section examiner-section" v-if="showExamine"> | ||
| 19 | <button class="add-btn" @click="handelAddExamine">+ 添加考官</button> | ||
| 20 | </view> | ||
| 21 | |||
| 22 | <view class="examiner-list" v-if="showExamine"> | ||
| 23 | <view class="examiner-item" v-for="(item, index) in list" :key="item.id"> | ||
| 24 | <view class="info"> | ||
| 25 | <text class="name">{{ item.perName }} {{ item.perCode }}</text> | ||
| 26 | <text class="idc">证件号码:{{ item.perIdcCode }}</text> | ||
| 27 | <text class="reg">注册地:{{ item.memName }}</text> | ||
| 28 | </view> | ||
| 29 | <button class="del-btn" @click="handleDel(item)">删除</button> | ||
| 30 | </view> | ||
| 31 | </view> | ||
| 32 | </view> | ||
| 33 | <!-- 提交按钮 --> | ||
| 34 | <view class="submit-area"> | ||
| 35 | <button class="submit-btn" @click="handelSubmit">确定提交</button> | ||
| 36 | </view> | ||
| 37 | |||
| 38 | <!-- 自定义考点申请弹窗(替换原uni.showModal) --> | ||
| 39 | <uni-popup ref="applyPopup" type="center" background-color="rgba(0,0,0,0.5)"> | ||
| 40 | <view class="custom-modal"> | ||
| 41 | <view class="modal-title">考点申请</view> | ||
| 42 | <view class="modal-btns"> | ||
| 43 | <button class="btn-cancel" @click="closeApplyPopup()">暂不申请</button> | ||
| 44 | <button class="btn-confirm" @click="confirmApply()">立即申请</button> | ||
| 45 | </view> | ||
| 46 | <view class="modal-tip">友情提示:非考点无法申请级位考试</view> | ||
| 47 | </view> | ||
| 48 | </uni-popup> | ||
| 49 | |||
| 50 | <!-- 自定义删除确认弹窗 --> | ||
| 51 | <uni-popup ref="delPopup" type="center" background-color="rgba(0,0,0,0.5)"> | ||
| 52 | <view class="custom-modal"> | ||
| 53 | <view class="modal-title">提示</view> | ||
| 54 | <view class="modal-content">确定删除该考官吗?</view> | ||
| 55 | <view class="modal-btns"> | ||
| 56 | <button class="btn-cancel" @click="closeDelPopup()">取消</button> | ||
| 57 | <button class="btn-confirm" @click="confirmDel()">确定</button> | ||
| 58 | </view> | ||
| 59 | </view> | ||
| 60 | </uni-popup> | ||
| 61 | |||
| 62 | <!-- 自定义省跆协指派提示弹窗 --> | ||
| 63 | <uni-popup ref="assignPopup" type="center" background-color="rgba(0,0,0,0.5)"> | ||
| 64 | <view class="custom-modal"> | ||
| 65 | <view class="modal-title">温馨提示</view> | ||
| 66 | <view class="modal-content">关于考官指派,请联系河北省跆协,联系电话:XXXX</view> | ||
| 67 | <view class="modal-btns"> | ||
| 68 | <button class="btn-confirm single-btn" @click="closeAssignPopup()">我知道了</button> | ||
| 69 | </view> | ||
| 70 | </view> | ||
| 71 | </uni-popup> | ||
| 72 | |||
| 73 | <!-- 自定义提交成功弹窗 --> | ||
| 74 | <uni-popup ref="successPopup" type="center" background-color="rgba(0,0,0,0.5)"> | ||
| 75 | <view class="custom-modal"> | ||
| 76 | <view class="modal-title">成功</view> | ||
| 77 | <view class="modal-content">提交成功,请等待审核</view> | ||
| 78 | <view class="modal-btns"> | ||
| 79 | <button class="btn-confirm single-btn" @click="confirmSuccess()">确定</button> | ||
| 80 | </view> | ||
| 81 | </view> | ||
| 82 | </uni-popup> | ||
| 83 | </view> | ||
| 84 | </template> | ||
| 85 | |||
| 86 | <script setup> | ||
| 87 | import { ref, } from 'vue' | ||
| 88 | import { onLoad,onShow } from '@dcloudio/uni-app' | ||
| 89 | import * as api from '@/common/api.js' | ||
| 90 | |||
| 91 | const form = ref({ | ||
| 92 | selfSelect: '1' // 1:自行录入 0:省跆协指派 | ||
| 93 | }) | ||
| 94 | const showExamine = ref(true) | ||
| 95 | const loading = ref(false) | ||
| 96 | const list = ref([]) | ||
| 97 | const memId = ref(null) | ||
| 98 | |||
| 99 | // 弹窗引用 | ||
| 100 | const applyPopup = ref(null) | ||
| 101 | const delPopup = ref(null) | ||
| 102 | const assignPopup = ref(null) | ||
| 103 | const successPopup = ref(null) | ||
| 104 | let currentDelItem = ref(null) | ||
| 105 | |||
| 106 | onLoad((option) => { | ||
| 107 | memId.value = option.memId | ||
| 108 | getExaminer() | ||
| 109 | }) | ||
| 110 | |||
| 111 | onShow(() => { | ||
| 112 | if (memId.value) { | ||
| 113 | getExaminer() | ||
| 114 | } | ||
| 115 | }) | ||
| 116 | |||
| 117 | async function getExaminer() { | ||
| 118 | loading.value = true | ||
| 119 | const res = await api.listApi({ memId: memId.value }) | ||
| 120 | list.value = res.rows | ||
| 121 | loading.value = false | ||
| 122 | } | ||
| 123 | |||
| 124 | // 删除考官:打开自定义弹窗 | ||
| 125 | function handleDel(row) { | ||
| 126 | currentDelItem.value = row | ||
| 127 | delPopup.value.open() | ||
| 128 | } | ||
| 129 | // 确认删除 | ||
| 130 | async function confirmDel() { | ||
| 131 | await api.examinerDel(currentDelItem.value.id) | ||
| 132 | uni.showToast({ title: '删除成功', icon: 'success' }) | ||
| 133 | getExaminer() | ||
| 134 | closeDelPopup() | ||
| 135 | } | ||
| 136 | function closeDelPopup() { | ||
| 137 | delPopup.value.close() | ||
| 138 | } | ||
| 139 | |||
| 140 | // 切换考官类型:打开自定义提示弹窗 | ||
| 141 | function onSelfSelectChange(e) { | ||
| 142 | form.value.selfSelect = e.detail.value | ||
| 143 | showExamine.value = e.detail.value == '1' | ||
| 144 | if (e.detail.value == '2') { | ||
| 145 | assignPopup.value.open() | ||
| 146 | } | ||
| 147 | } | ||
| 148 | function closeAssignPopup() { | ||
| 149 | assignPopup.value.close() | ||
| 150 | } | ||
| 151 | |||
| 152 | function handelAddExamine() { | ||
| 153 | const chosenStr = JSON.stringify(list.value) | ||
| 154 | uni.navigateTo({ | ||
| 155 | url: `/myCenter/chooseExaminer?memId=${memId.value}&isValidity=0&chosen=${chosenStr}` | ||
| 156 | }) | ||
| 157 | } | ||
| 158 | |||
| 159 | // 提交申请:打开自定义成功弹窗 | ||
| 160 | async function handelSubmit() { | ||
| 161 | if (!form.value.selfSelect) { | ||
| 162 | return uni.showToast({ title: '请选择考官类型', icon: 'none' }) | ||
| 163 | } | ||
| 164 | if (form.value.selfSelect == '1' && list.value.length == 0) { | ||
| 165 | return uni.showToast({ title: '请添加考官', icon: 'none' }) | ||
| 166 | } | ||
| 167 | |||
| 168 | try { | ||
| 169 | await api.commitExamPointApply(form.value) | ||
| 170 | successPopup.value.open() | ||
| 171 | } catch (err) { | ||
| 172 | uni.showToast({ title: err.data.msg, icon: 'none' }) | ||
| 173 | } | ||
| 174 | } | ||
| 175 | function confirmSuccess() { | ||
| 176 | successPopup.value.close() | ||
| 177 | uni.navigateBack() | ||
| 178 | } | ||
| 179 | |||
| 180 | // 考点申请弹窗(如需调用可在合适位置打开) | ||
| 181 | function openApplyPopup() { | ||
| 182 | applyPopup.value.open() | ||
| 183 | } | ||
| 184 | function closeApplyPopup() { | ||
| 185 | applyPopup.value.close() | ||
| 186 | } | ||
| 187 | function confirmApply() { | ||
| 188 | applyPopup.value.close() | ||
| 189 | // 此处添加考点申请逻辑 | ||
| 190 | } | ||
| 191 | </script> | ||
| 192 | |||
| 193 | <style scoped> | ||
| 194 | /* 全局容器 */ | ||
| 195 | .container { | ||
| 196 | min-height: 100vh; | ||
| 197 | } | ||
| 198 | .section{ | ||
| 199 | padding:15rpx 20rpx; | ||
| 200 | } | ||
| 201 | /* 单选框区域 */ | ||
| 202 | .radio-section { | ||
| 203 | background: #fff; | ||
| 204 | padding: 20rpx 15rpx; | ||
| 205 | margin-bottom: 10rpx; | ||
| 206 | border: none; | ||
| 207 | border-radius: 0; | ||
| 208 | } | ||
| 209 | |||
| 210 | .radio-group { | ||
| 211 | display: flex; | ||
| 212 | align-items: center; | ||
| 213 | gap: 30rpx; | ||
| 214 | } | ||
| 215 | |||
| 216 | .radio-item { | ||
| 217 | display: flex; | ||
| 218 | align-items: center; | ||
| 219 | margin: 0; | ||
| 220 | } | ||
| 221 | |||
| 222 | ::v-deep .custom-radio .wx-radio-input { | ||
| 223 | width: 30rpx; | ||
| 224 | height: 30rpx; | ||
| 225 | border-radius: 50%; | ||
| 226 | } | ||
| 227 | |||
| 228 | ::v-deep .custom-radio .wx-radio-input.wx-radio-input-checked { | ||
| 229 | border-color: #C4121B !important; | ||
| 230 | background: #C4121B !important; | ||
| 231 | } | ||
| 232 | |||
| 233 | .radio-text { | ||
| 234 | font-size: 14px; | ||
| 235 | color: #333; | ||
| 236 | margin-left: 8rpx; | ||
| 237 | } | ||
| 238 | |||
| 239 | /* 考官区域 */ | ||
| 240 | .examiner-section { | ||
| 241 | background: #fff; | ||
| 242 | padding: 15rpx; | ||
| 243 | margin-bottom: 20rpx; | ||
| 244 | border: none; | ||
| 245 | border-radius: 0; | ||
| 246 | } | ||
| 247 | |||
| 248 | .add-btn { | ||
| 249 | background: #fff; | ||
| 250 | color: #C4121B; | ||
| 251 | border: 1rpx solid #C4121B; | ||
| 252 | border-radius: 10rpx; | ||
| 253 | padding: 10rpx 0; | ||
| 254 | width: 100%; | ||
| 255 | font-size: 14px; | ||
| 256 | } | ||
| 257 | |||
| 258 | .examiner-list { | ||
| 259 | padding: 0 10rpx; | ||
| 260 | background-color: #fff; | ||
| 261 | margin-bottom: 20rpx; | ||
| 262 | overflow-y: auto; | ||
| 263 | margin-bottom: 70px; | ||
| 264 | } | ||
| 265 | |||
| 266 | .examiner-item { | ||
| 267 | display: flex; | ||
| 268 | justify-content: space-between; | ||
| 269 | align-items: flex-start; | ||
| 270 | padding: 20rpx; | ||
| 271 | border-bottom: 1rpx solid #eee; | ||
| 272 | align-items: center; | ||
| 273 | } | ||
| 274 | |||
| 275 | .info { | ||
| 276 | flex: 1; | ||
| 277 | } | ||
| 278 | |||
| 279 | .name { | ||
| 280 | font-size: 14px; | ||
| 281 | font-weight: 500; | ||
| 282 | color: #333; | ||
| 283 | display: block; | ||
| 284 | margin-bottom: 5rpx; | ||
| 285 | } | ||
| 286 | |||
| 287 | .idc, .reg { | ||
| 288 | font-size: 12px; | ||
| 289 | color: #666; | ||
| 290 | display: block; | ||
| 291 | margin: 10rpx 0; | ||
| 292 | } | ||
| 293 | |||
| 294 | .del-btn { | ||
| 295 | color: #C4121B; | ||
| 296 | font-size: 12px; | ||
| 297 | border: 1rpx solid #C4121B; | ||
| 298 | border-radius: 50rpx; | ||
| 299 | padding: 10rpx 25rpx; | ||
| 300 | line-height: 1.2; | ||
| 301 | background: #fff; | ||
| 302 | } | ||
| 303 | |||
| 304 | /* 提交按钮 */ | ||
| 305 | .submit-area { | ||
| 306 | padding: 20rpx 0; | ||
| 307 | background-color: #fff; | ||
| 308 | width: 100%; | ||
| 309 | position: fixed; | ||
| 310 | bottom: 0; | ||
| 311 | } | ||
| 312 | |||
| 313 | .submit-btn { | ||
| 314 | width: 80%; | ||
| 315 | height: 88rpx; | ||
| 316 | border-radius: 44rpx; | ||
| 317 | margin: 0 auto; | ||
| 318 | line-height: 88rpx; | ||
| 319 | background: #C4121B; | ||
| 320 | color: #fff; | ||
| 321 | text-align: center; | ||
| 322 | font-size: 16px; | ||
| 323 | border: none; | ||
| 324 | } | ||
| 325 | |||
| 326 | /* 自定义弹窗样式(核心) */ | ||
| 327 | .custom-modal { | ||
| 328 | width: 600rpx; | ||
| 329 | background: #fff; | ||
| 330 | border-radius: 20rpx; | ||
| 331 | padding: 40rpx 30rpx; | ||
| 332 | box-sizing: border-box; | ||
| 333 | text-align: center; | ||
| 334 | } | ||
| 335 | .modal-title { | ||
| 336 | font-size: 36rpx; | ||
| 337 | font-weight: 600; | ||
| 338 | color: #333; | ||
| 339 | margin-bottom: 30rpx; | ||
| 340 | } | ||
| 341 | .modal-content { | ||
| 342 | font-size: 30rpx; | ||
| 343 | color: #666; | ||
| 344 | line-height: 1.6; | ||
| 345 | margin-bottom: 30rpx; | ||
| 346 | } | ||
| 347 | .modal-tip { | ||
| 348 | font-size: 28rpx; | ||
| 349 | color: #FF7A00; | ||
| 350 | margin-top: 20rpx; | ||
| 351 | } | ||
| 352 | .modal-btns { | ||
| 353 | display: flex; | ||
| 354 | justify-content: space-between; | ||
| 355 | gap: 20rpx; | ||
| 356 | } | ||
| 357 | .btn-cancel { | ||
| 358 | flex: 1; | ||
| 359 | height: 80rpx; | ||
| 360 | line-height: 80rpx; | ||
| 361 | background: #f5f5f5; | ||
| 362 | color: #999; | ||
| 363 | border-radius: 40rpx; | ||
| 364 | font-size: 32rpx; | ||
| 365 | border: none; | ||
| 366 | } | ||
| 367 | .btn-confirm { | ||
| 368 | flex: 1; | ||
| 369 | height: 80rpx; | ||
| 370 | line-height: 80rpx; | ||
| 371 | background: #C4121B; | ||
| 372 | color: #fff; | ||
| 373 | border-radius: 40rpx; | ||
| 374 | font-size: 32rpx; | ||
| 375 | border: none; | ||
| 376 | } | ||
| 377 | .single-btn { | ||
| 378 | flex: 1; | ||
| 379 | } | ||
| 380 | .btn-cancel::after, .btn-confirm::after { | ||
| 381 | border: none; | ||
| 382 | } | ||
| 383 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
myCenter/goPay.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="container"> | ||
| 3 | <!-- 主内容区域 --> | ||
| 4 | <view class="content"> | ||
| 5 | <!-- 缴费年限 + 费用卡片 --> | ||
| 6 | <view class="card"> | ||
| 7 | <!-- 缴费年限 --> | ||
| 8 | <view class="yearRow"> | ||
| 9 | <view class="label">缴费年限</view> | ||
| 10 | <view class="control"> | ||
| 11 | <image class="icon" @click="minusYear" src="/static/dd_02.png" mode="widthFix" v-if="form.renewYear > 1" ></image> | ||
| 12 | <image class="icon" src="/static/dd_02_g.png" mode="widthFix" v-else ></image> | ||
| 13 | <text class="num">{{ form.renewYear }}年</text> | ||
| 14 | <image class="icon" src="/static/btn_03.png" mode="widthFix" @click="plusYear" v-if="form.renewYear < 5" ></image> | ||
| 15 | <image class="icon" src="/static/btn_03_g.png" mode="widthFix" v-else ></image> | ||
| 16 | </view> | ||
| 17 | </view> | ||
| 18 | </view> | ||
| 19 | |||
| 20 | <view class="card "> | ||
| 21 | <!-- 费用合计 --> | ||
| 22 | <view class="row "> | ||
| 23 | <text class="label">费用合计</text> | ||
| 24 | <text class="value red">{{ form.renewYear * memberFee }}元</text> | ||
| 25 | </view> | ||
| 26 | |||
| 27 | <view class="hintRow" v-if="preferentialPolicy"> | ||
| 28 | <text class="hintText">温馨提示:根据中国跆协{{ preferentialData.name || '优惠' }}政策减免一年费用,每个单位在政策有效期内只享受一次</text> | ||
| 29 | </view> | ||
| 30 | </view> | ||
| 31 | |||
| 32 | <view class="payRow "> | ||
| 33 | <radio-group @change="onPayTypeChange"> | ||
| 34 | <label class="radioItem"> | ||
| 35 | <radio value="1" :checked="payType === '1'" class="custom-radio" /> | ||
| 36 | <view class="payInfo"> | ||
| 37 | <image class="icon" src="/static/min.png" mode="widthFix"></image> | ||
| 38 | <text>民生付</text> | ||
| 39 | </view> | ||
| 40 | </label> | ||
| 41 | </radio-group> | ||
| 42 | </view> | ||
| 43 | |||
| 44 | <view class="totalRow "> | ||
| 45 | <text class="label">支付费用合计</text> | ||
| 46 | <text class="value redBig">{{ memberTotalFee }}元</text> | ||
| 47 | </view> | ||
| 48 | |||
| 49 | </view> | ||
| 50 | |||
| 51 | <view class="bottomBtn"> | ||
| 52 | <view class="deductRow"> | ||
| 53 | <text class="label">减免费用</text> | ||
| 54 | <text class="value red">-{{ memberFee }}元</text> | ||
| 55 | </view> | ||
| 56 | <button class="payBtn" @click="handelPay" :loading="isPaying">立即支付 ¥{{ memberTotalFee }}</button> | ||
| 57 | </view> | ||
| 58 | |||
| 59 | </view> | ||
| 60 | </template> | ||
| 61 | |||
| 62 | <script setup> | ||
| 63 | import { ref, computed } from 'vue' | ||
| 64 | import { onLoad } from '@dcloudio/uni-app'; | ||
| 65 | import * as api from '@/common/api.js' | ||
| 66 | |||
| 67 | const form = ref({ | ||
| 68 | renewYear: 1 | ||
| 69 | }) | ||
| 70 | const memberFee = ref(0) | ||
| 71 | const preferentialPolicy = ref(false) | ||
| 72 | const preferentialData = ref({ name: '优惠' }) | ||
| 73 | const payType = ref('1') | ||
| 74 | const isPaying = ref(false) | ||
| 75 | |||
| 76 | const memberTotalFee = computed(() => { | ||
| 77 | if (preferentialPolicy.value) { | ||
| 78 | return memberFee.value * form.value.renewYear - memberFee.value * 1 | ||
| 79 | } else { | ||
| 80 | return memberFee.value * form.value.renewYear | ||
| 81 | } | ||
| 82 | }) | ||
| 83 | |||
| 84 | // 年限减 | ||
| 85 | const minusYear = () => { | ||
| 86 | if (form.value.renewYear > 1) { | ||
| 87 | form.value.renewYear-- | ||
| 88 | } | ||
| 89 | } | ||
| 90 | // 年限加 | ||
| 91 | const plusYear = () => { | ||
| 92 | if (form.value.renewYear < 6) { | ||
| 93 | form.value.renewYear++ | ||
| 94 | } | ||
| 95 | } | ||
| 96 | |||
| 97 | // 支付方式切换 | ||
| 98 | const onPayTypeChange = (e) => { | ||
| 99 | payType.value = e.detail.value | ||
| 100 | } | ||
| 101 | |||
| 102 | // 支付操作 | ||
| 103 | const handelPay = async () => { | ||
| 104 | // if (memberTotalFee.value <= 0) return | ||
| 105 | |||
| 106 | isPaying.value = true | ||
| 107 | const { data } = await api.certifiedNew({ renewYear: form.value.renewYear }) | ||
| 108 | isPaying.value = false | ||
| 109 | if (data.payFlag == 0) { | ||
| 110 | uni.navigateTo({ | ||
| 111 | url: `/myCenter/sucPay` | ||
| 112 | }) | ||
| 113 | } else { | ||
| 114 | if (data.orderId) { | ||
| 115 | await callBack2(data.orderId) | ||
| 116 | uni.navigateTo({ | ||
| 117 | url: `/myCenter/goPay` | ||
| 118 | }) | ||
| 119 | |||
| 120 | } | ||
| 121 | } | ||
| 122 | } | ||
| 123 | |||
| 124 | onLoad((option) => { | ||
| 125 | // 接收年限 | ||
| 126 | form.value.renewYear = Number(option.renewYear || 1) | ||
| 127 | // 初始化获取费用和优惠 | ||
| 128 | init() | ||
| 129 | }) | ||
| 130 | |||
| 131 | // 初始化接口 | ||
| 132 | async function init() { | ||
| 133 | try { | ||
| 134 | await getMyMemberCertUnitFeeApi() | ||
| 135 | await canUseDiscountApi() | ||
| 136 | await getZtxDiscountPolicyApi() | ||
| 137 | } catch (err) { | ||
| 138 | console.error('初始化失败:', err) | ||
| 139 | } | ||
| 140 | } | ||
| 141 | |||
| 142 | // 获取会员单价 | ||
| 143 | async function getMyMemberCertUnitFeeApi() { | ||
| 144 | const res = await api.getMyMemberCertUnitFee() | ||
| 145 | memberFee.value = Number(res.data || 1500) | ||
| 146 | } | ||
| 147 | |||
| 148 | // 是否可用优惠 | ||
| 149 | async function canUseDiscountApi() { | ||
| 150 | const res = await api.canUseDiscount() | ||
| 151 | preferentialPolicy.value = res.data || true | ||
| 152 | } | ||
| 153 | |||
| 154 | // 获取优惠政策详情 | ||
| 155 | async function getZtxDiscountPolicyApi() { | ||
| 156 | const res = await api.getZtxDiscountPolicy() | ||
| 157 | preferentialData.value = res.data || { name: '优惠' } | ||
| 158 | } | ||
| 159 | </script> | ||
| 160 | |||
| 161 | <style scoped> | ||
| 162 | /* 整体容器 */ | ||
| 163 | .container { | ||
| 164 | min-height: 100vh; | ||
| 165 | background-color: #f7f7f7; | ||
| 166 | } | ||
| 167 | |||
| 168 | /* 内容区域 */ | ||
| 169 | .content { | ||
| 170 | padding: 20rpx 20rpx 120rpx; | ||
| 171 | } | ||
| 172 | |||
| 173 | /* 卡片 */ | ||
| 174 | .card { | ||
| 175 | background: #fff; | ||
| 176 | border-radius: 8rpx; | ||
| 177 | padding: 25rpx 20rpx; | ||
| 178 | margin-bottom: 20rpx; | ||
| 179 | } | ||
| 180 | |||
| 181 | /* 缴费年限行 */ | ||
| 182 | .yearRow { | ||
| 183 | display: flex; | ||
| 184 | align-items: center; | ||
| 185 | justify-content: space-between; | ||
| 186 | margin-bottom: 20rpx; | ||
| 187 | } | ||
| 188 | |||
| 189 | .yearRow .label { | ||
| 190 | font-size: 28rpx; | ||
| 191 | color: #333; | ||
| 192 | } | ||
| 193 | |||
| 194 | .yearRow .control { | ||
| 195 | display: flex; | ||
| 196 | align-items: center; | ||
| 197 | } | ||
| 198 | .control image { | ||
| 199 | width: 50rpx; | ||
| 200 | height: 50rpx; | ||
| 201 | } | ||
| 202 | |||
| 203 | /* 加减按钮样式 */ | ||
| 204 | .num-btn { | ||
| 205 | width: 40rpx; | ||
| 206 | height: 40rpx; | ||
| 207 | border-radius: 50%; | ||
| 208 | display: flex; | ||
| 209 | align-items: center; | ||
| 210 | justify-content: center; | ||
| 211 | background-color: #fff; | ||
| 212 | border: 1rpx solid #C4121B; | ||
| 213 | } | ||
| 214 | |||
| 215 | .num-btn.disabled { | ||
| 216 | border-color: #ccc; | ||
| 217 | } | ||
| 218 | |||
| 219 | .num-btn.disabled .btn-icon { | ||
| 220 | color: #ccc; | ||
| 221 | } | ||
| 222 | |||
| 223 | .btn-icon { | ||
| 224 | font-size: 24rpx; | ||
| 225 | color: #C4121B; | ||
| 226 | font-weight: bold; | ||
| 227 | } | ||
| 228 | |||
| 229 | .yearRow .num { | ||
| 230 | font-size: 28rpx; | ||
| 231 | color: #333; | ||
| 232 | min-width: 80rpx; | ||
| 233 | text-align: center; | ||
| 234 | margin: 0 10rpx; | ||
| 235 | } | ||
| 236 | |||
| 237 | |||
| 238 | /* 通用行 */ | ||
| 239 | .row { | ||
| 240 | display: flex; | ||
| 241 | justify-content: space-between; | ||
| 242 | align-items: center; | ||
| 243 | |||
| 244 | } | ||
| 245 | |||
| 246 | .row .label { | ||
| 247 | font-size: 28rpx; | ||
| 248 | color: #333; | ||
| 249 | } | ||
| 250 | |||
| 251 | .row .value { | ||
| 252 | font-size: 30rpx; | ||
| 253 | color: #C4121B; | ||
| 254 | font-weight: 500; | ||
| 255 | } | ||
| 256 | |||
| 257 | /* 优惠提示 */ | ||
| 258 | .hintRow { | ||
| 259 | display: flex; | ||
| 260 | align-items: flex-start; | ||
| 261 | font-size: 24rpx; | ||
| 262 | line-height: 1.4; | ||
| 263 | } | ||
| 264 | |||
| 265 | .hint-icon { | ||
| 266 | width: 24rpx; | ||
| 267 | height: 24rpx; | ||
| 268 | border-radius: 50%; | ||
| 269 | background-color: #C4121B; | ||
| 270 | display: flex; | ||
| 271 | align-items: center; | ||
| 272 | justify-content: center; | ||
| 273 | margin-right: 10rpx; | ||
| 274 | flex-shrink: 0; | ||
| 275 | margin-top: 2rpx; | ||
| 276 | } | ||
| 277 | .icon{ | ||
| 278 | width:30px; | ||
| 279 | } | ||
| 280 | |||
| 281 | .icon-check { | ||
| 282 | color: #fff; | ||
| 283 | font-size: 16rpx; | ||
| 284 | } | ||
| 285 | |||
| 286 | .hintRow .hintText { | ||
| 287 | color: #FF8124; | ||
| 288 | flex: 1; | ||
| 289 | margin-top: 10rpx; | ||
| 290 | } | ||
| 291 | |||
| 292 | /* 减免费用 */ | ||
| 293 | .deductRow { | ||
| 294 | background: #fff; | ||
| 295 | padding: 20rpx 20rpx; | ||
| 296 | display: flex; | ||
| 297 | justify-content: space-between; | ||
| 298 | align-items: center; | ||
| 299 | margin-bottom: 10rpx; | ||
| 300 | border-radius: 8rpx; | ||
| 301 | } | ||
| 302 | |||
| 303 | .deductRow .label { | ||
| 304 | font-size: 28rpx; | ||
| 305 | color: #333; | ||
| 306 | } | ||
| 307 | |||
| 308 | .deductRow .value { | ||
| 309 | font-size: 30rpx; | ||
| 310 | color: #C4121B; | ||
| 311 | } | ||
| 312 | |||
| 313 | /* 支付方式行 */ | ||
| 314 | .payRow { | ||
| 315 | background: #fff; | ||
| 316 | border-radius: 8rpx; | ||
| 317 | padding: 20rpx 20rpx; | ||
| 318 | margin-bottom: 20rpx; | ||
| 319 | } | ||
| 320 | |||
| 321 | .radioItem { | ||
| 322 | display: flex; | ||
| 323 | align-items: center; | ||
| 324 | } | ||
| 325 | |||
| 326 | /* 自定义红色单选框 */ | ||
| 327 | ::v-deep .custom-radio .wx-radio-input { | ||
| 328 | width: 30rpx; | ||
| 329 | height: 30rpx; | ||
| 330 | border-radius: 50%; | ||
| 331 | border: 2rpx solid #ccc; | ||
| 332 | } | ||
| 333 | |||
| 334 | ::v-deep .custom-radio .wx-radio-input.wx-radio-input-checked { | ||
| 335 | border-color: #C4121B !important; | ||
| 336 | background: #C4121B !important; | ||
| 337 | } | ||
| 338 | |||
| 339 | |||
| 340 | .payInfo { | ||
| 341 | display: flex; | ||
| 342 | align-items: center; | ||
| 343 | margin-left: 15rpx; | ||
| 344 | } | ||
| 345 | |||
| 346 | .payInfo .icon { | ||
| 347 | width: 40rpx; | ||
| 348 | height: 40rpx; | ||
| 349 | margin-right: 10rpx; | ||
| 350 | } | ||
| 351 | |||
| 352 | .payInfo text { | ||
| 353 | font-size: 28rpx; | ||
| 354 | color: #333; | ||
| 355 | } | ||
| 356 | |||
| 357 | /* 总费用行(突出显示) */ | ||
| 358 | .totalRow { | ||
| 359 | background: #fff; | ||
| 360 | border-radius: 8rpx; | ||
| 361 | padding: 20rpx 20rpx; | ||
| 362 | display: flex; | ||
| 363 | justify-content: space-between; | ||
| 364 | align-items: center; | ||
| 365 | margin-top: 10rpx; | ||
| 366 | } | ||
| 367 | |||
| 368 | .totalRow .label { | ||
| 369 | font-size: 28rpx; | ||
| 370 | color: #333; | ||
| 371 | } | ||
| 372 | |||
| 373 | .redBig { | ||
| 374 | font-size: 32rpx; | ||
| 375 | color: #C4121B; | ||
| 376 | font-weight: bold; | ||
| 377 | } | ||
| 378 | |||
| 379 | /* 底部按钮 */ | ||
| 380 | .bottomBtn { | ||
| 381 | position: fixed; | ||
| 382 | bottom: 0; | ||
| 383 | left: 0; | ||
| 384 | right: 0; | ||
| 385 | padding: 20rpx 20rpx; | ||
| 386 | background: #fff; | ||
| 387 | border-top: 1rpx solid #eee; | ||
| 388 | } | ||
| 389 | |||
| 390 | .payBtn { | ||
| 391 | width: 100%; | ||
| 392 | height: 88rpx; | ||
| 393 | line-height: 88rpx; | ||
| 394 | background-color: #C4121B; | ||
| 395 | color: #fff; | ||
| 396 | border-radius: 8rpx; | ||
| 397 | font-size: 32rpx; | ||
| 398 | text-align: center; | ||
| 399 | border: none; | ||
| 400 | } | ||
| 401 | |||
| 402 | .payBtn[disabled] { | ||
| 403 | background-color: #ccc; | ||
| 404 | color: #999; | ||
| 405 | } | ||
| 406 | |||
| 407 | /* 通用红色文字 */ | ||
| 408 | .red { | ||
| 409 | color: #C4121B; | ||
| 410 | } | ||
| 411 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
myCenter/payOrder.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="pay-order-container"> | ||
| 3 | <!-- 页面头部 --> | ||
| 4 | <view class="page-header"> | ||
| 5 | <text class="title">确认并支付</text> | ||
| 6 | </view> | ||
| 7 | |||
| 8 | <!-- 订单核心信息 --> | ||
| 9 | <view class="order-info"> | ||
| 10 | <view class="info-item"> | ||
| 11 | <text class="label">人数合计:</text> | ||
| 12 | <text class="value red">{{ formData.all ?? 0 }}人</text> | ||
| 13 | </view> | ||
| 14 | <view class="info-item"> | ||
| 15 | <text class="label">新会员合计:</text> | ||
| 16 | <text class="value red">{{ formData.new ?? 0 }}人</text> | ||
| 17 | </view> | ||
| 18 | <view class="info-item"> | ||
| 19 | <text class="label">续费会员合计:</text> | ||
| 20 | <text class="value red">{{ formData.old ?? 0 }}人</text> | ||
| 21 | </view> | ||
| 22 | <view class="info-item total-price"> | ||
| 23 | <text class="label">支付总费用:</text> | ||
| 24 | <text class="value red">{{ formData.price ?? 0 }}元</text> | ||
| 25 | </view> | ||
| 26 | </view> | ||
| 27 | |||
| 28 | <!-- 支付方式选择(修复v-model报错 + 默认勾选) --> | ||
| 29 | <view class="pay-type-section"> | ||
| 30 | <text class="section-title">选择支付方式</text> | ||
| 31 | <!-- uni-app小程序原生radio-group写法 --> | ||
| 32 | <radio-group :value="payType" @change="handlePayTypeChange"> | ||
| 33 | <label class="radio-item"> | ||
| 34 | <!-- checked属性实现默认勾选 --> | ||
| 35 | <radio value="0" color="#E60012" :checked="payType === '0'" /> | ||
| 36 | <view class="pay-method"> | ||
| 37 | <image class="icon" src="/static/min.png" mode="widthFix"></image> | ||
| 38 | <text class="pay-name">民生付</text> | ||
| 39 | </view> | ||
| 40 | </label> | ||
| 41 | </radio-group> | ||
| 42 | </view> | ||
| 43 | |||
| 44 | <!-- 底部支付按钮 --> | ||
| 45 | <view class="fixed-bottom"> | ||
| 46 | <button class="pay-btn red-bg" :loading="payLoading" @click="handlePay">立即支付</button> | ||
| 47 | </view> | ||
| 48 | </view> | ||
| 49 | </template> | ||
| 50 | |||
| 51 | <script setup> | ||
| 52 | import { ref } from 'vue' | ||
| 53 | import { onLoad } from '@dcloudio/uni-app'; | ||
| 54 | import * as api from '@/common/api.js' | ||
| 55 | |||
| 56 | // 核心数据 | ||
| 57 | const formData = ref({}) // 订单统计数据 | ||
| 58 | const rangeId = ref('') // 核心业务ID | ||
| 59 | const payType = ref('0') // 支付方式(默认0=民生付) | ||
| 60 | const payLoading = ref(false) // 支付按钮加载状态 | ||
| 61 | |||
| 62 | // 页面加载接收参数 | ||
| 63 | onLoad(async (options) => { | ||
| 64 | console.log('订单ID:', options.rangeId) | ||
| 65 | if (options.rangeId) { | ||
| 66 | rangeId.value = options.rangeId | ||
| 67 | await getCount() | ||
| 68 | } | ||
| 69 | }) | ||
| 70 | |||
| 71 | async function getCount() { | ||
| 72 | try { | ||
| 73 | const res = await api.getNewCountByRangeId(rangeId.value) | ||
| 74 | formData.value = res.data || { all: 0, new: 0, old: 0 } | ||
| 75 | } catch (e) { | ||
| 76 | formData.value = { all: 0, new: 0, old: 0 } | ||
| 77 | } | ||
| 78 | } | ||
| 79 | |||
| 80 | // 支付方式切换 | ||
| 81 | function handlePayTypeChange(e) { | ||
| 82 | payType.value = e.detail.value | ||
| 83 | } | ||
| 84 | |||
| 85 | // 立即支付核心逻辑 | ||
| 86 | async function handlePay() { | ||
| 87 | // 基础校验 | ||
| 88 | if (!rangeId.value || rangeId.value === '-1') { | ||
| 89 | return uni.showToast({ title: '订单ID异常', icon: 'none' }) | ||
| 90 | } | ||
| 91 | |||
| 92 | try { | ||
| 93 | payLoading.value = true | ||
| 94 | const res = await api.goPay(rangeId.value) | ||
| 95 | |||
| 96 | // 订单ID存在则调用回调接口 | ||
| 97 | if (res.data?.orderId) { | ||
| 98 | await api.callBack2(res.data.orderId) | ||
| 99 | } | ||
| 100 | |||
| 101 | // 跳转到支付成功页 | ||
| 102 | uni.navigateTo({ | ||
| 103 | url: `/pages/payOk/payOk?rangeId=${rangeId.value}` | ||
| 104 | }) | ||
| 105 | } catch (err) { | ||
| 106 | console.error('支付失败:', err) | ||
| 107 | uni.showToast({ title: err.data.msg, icon: 'none' }) | ||
| 108 | } finally { | ||
| 109 | payLoading.value = false | ||
| 110 | } | ||
| 111 | } | ||
| 112 | </script> | ||
| 113 | |||
| 114 | <style scoped lang="scss"> | ||
| 115 | .pay-order-container { | ||
| 116 | padding: 30rpx; | ||
| 117 | background-color: #fff; | ||
| 118 | min-height: 100vh; | ||
| 119 | box-sizing: border-box; | ||
| 120 | } | ||
| 121 | .icon{ | ||
| 122 | width:30px; | ||
| 123 | } | ||
| 124 | // 页面头部 | ||
| 125 | .page-header { | ||
| 126 | text-align: center; | ||
| 127 | padding: 20rpx 0; | ||
| 128 | border-bottom: 1px solid #eee; | ||
| 129 | margin-bottom: 40rpx; | ||
| 130 | |||
| 131 | .title { | ||
| 132 | font-size: 36rpx; | ||
| 133 | font-weight: 600; | ||
| 134 | color: #333; | ||
| 135 | } | ||
| 136 | } | ||
| 137 | |||
| 138 | // 订单信息区域 | ||
| 139 | .order-info { | ||
| 140 | margin-bottom: 60rpx; | ||
| 141 | |||
| 142 | .info-item { | ||
| 143 | display: flex; | ||
| 144 | justify-content: space-between; | ||
| 145 | align-items: center; | ||
| 146 | padding: 25rpx 0; | ||
| 147 | border-bottom: 1px solid #f5f5f5; | ||
| 148 | font-size: 32rpx; | ||
| 149 | |||
| 150 | .label { | ||
| 151 | color: #666; | ||
| 152 | } | ||
| 153 | |||
| 154 | .value { | ||
| 155 | font-weight: 600; | ||
| 156 | font-size: 34rpx; | ||
| 157 | } | ||
| 158 | |||
| 159 | .red { | ||
| 160 | color: #E60012; | ||
| 161 | } | ||
| 162 | } | ||
| 163 | |||
| 164 | .total-price { | ||
| 165 | border-bottom: none; | ||
| 166 | margin-top: 10rpx; | ||
| 167 | |||
| 168 | .label { | ||
| 169 | font-size: 34rpx; | ||
| 170 | color: #333; | ||
| 171 | } | ||
| 172 | |||
| 173 | .value { | ||
| 174 | font-size: 38rpx; | ||
| 175 | } | ||
| 176 | } | ||
| 177 | } | ||
| 178 | |||
| 179 | // 支付方式区域 | ||
| 180 | .pay-type-section { | ||
| 181 | margin-bottom: 80rpx; | ||
| 182 | |||
| 183 | .section-title { | ||
| 184 | font-size: 32rpx; | ||
| 185 | color: #333; | ||
| 186 | margin-bottom: 20rpx; | ||
| 187 | display: block; | ||
| 188 | } | ||
| 189 | |||
| 190 | .radio-item { | ||
| 191 | display: flex; | ||
| 192 | align-items: center; | ||
| 193 | font-size: 32rpx; | ||
| 194 | padding: 10rpx 0; | ||
| 195 | |||
| 196 | .pay-method { | ||
| 197 | display: flex; | ||
| 198 | align-items: center; | ||
| 199 | margin-left: 10rpx; | ||
| 200 | |||
| 201 | .pay-name { | ||
| 202 | font-size: 32rpx; | ||
| 203 | margin-left: 20rpx; | ||
| 204 | color: #333; | ||
| 205 | } | ||
| 206 | } | ||
| 207 | } | ||
| 208 | } | ||
| 209 | |||
| 210 | // 底部支付按钮 | ||
| 211 | .fixed-bottom { | ||
| 212 | position: fixed; | ||
| 213 | bottom: 0; | ||
| 214 | left: 0; | ||
| 215 | right: 0; | ||
| 216 | padding: 20rpx 30rpx 30rpx; | ||
| 217 | background-color: #fff; | ||
| 218 | border-top: 1px solid #eee; | ||
| 219 | |||
| 220 | .pay-btn { | ||
| 221 | width: 100%; | ||
| 222 | height: 88rpx; | ||
| 223 | line-height: 88rpx; | ||
| 224 | border-radius: 44rpx; | ||
| 225 | font-size: 34rpx; | ||
| 226 | font-weight: 600; | ||
| 227 | } | ||
| 228 | |||
| 229 | .red-bg { | ||
| 230 | background-color: #E60012; | ||
| 231 | color: #fff; | ||
| 232 | } | ||
| 233 | } | ||
| 234 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -71,64 +71,63 @@ | ... | @@ -71,64 +71,63 @@ |
| 71 | <button class="btn-red" @click="submit()">确定</button> | 71 | <button class="btn-red" @click="submit()">确定</button> |
| 72 | </view> | 72 | </view> |
| 73 | </view> | 73 | </view> |
| 74 | </view> | ||
| 74 | 75 | ||
| 76 | <uni-popup ref="verifyPopup" type="center" background-color="rgba(0,0,0,0.5)"> | ||
| 77 | <view class="custom-modal"> | ||
| 78 | <view class="modal-title">提示</view> | ||
| 79 | <view class="modal-content"> | ||
| 80 | 暂未查询到相关企业信息,企业信息异常请检查相关资料信息,确认无误后再次提交! | ||
| 75 | </view> | 81 | </view> |
| 82 | <view class="modal-btns"> | ||
| 83 | <button class="btn-cancel" @click="closeVerifyPopup()">返回修改</button> | ||
| 84 | <button class="btn-confirm" @click="confirmSubmit()">确认无误</button> | ||
| 76 | </view> | 85 | </view> |
| 77 | |||
| 78 | <uni-popup ref="popup" type="bottom"> | ||
| 79 | <view class="popBody"> | ||
| 80 | <view class="tt">选择缴费年限</view> | ||
| 81 | <view class="pickitem" v-for="(item,index) in years" :key="index" @click="bindChange(item)"> | ||
| 82 | {{item}}年 | ||
| 83 | <uni-icons v-if="form.renewYear == item" type="checkmarkempty" size="20" color="green"></uni-icons> | ||
| 84 | <uni-icons v-else type="checkmarkempty" size="20" color="white"></uni-icons> | ||
| 85 | </view> | 86 | </view> |
| 87 | </uni-popup> | ||
| 86 | 88 | ||
| 87 | <view style="margin: 30rpx 0;"> | 89 | <uni-popup ref="applyPopup" type="center" background-color="rgba(0,0,0,0.5)"> |
| 88 | <button class="btn-red" @click="submitForm">确定</button> | 90 | <view class="custom-modal apply-modal"> |
| 91 | <view class="modal-title">考点申请</view> | ||
| 92 | <view class="modal-btns apply-btns"> | ||
| 93 | <button class="btn-cancel" @click="closeApplyPopup()">暂不申请</button> | ||
| 94 | <button class="btn-confirm" @click="confirmApply()">立即申请</button> | ||
| 89 | </view> | 95 | </view> |
| 96 | <view class="modal-tip">友情提示:非考点无法申请级位考试</view> | ||
| 90 | </view> | 97 | </view> |
| 91 | |||
| 92 | </uni-popup> | 98 | </uni-popup> |
| 99 | </view> | ||
| 93 | </template> | 100 | </template> |
| 94 | 101 | ||
| 95 | <script setup> | 102 | <script setup> |
| 96 | import { | 103 | import { ref, reactive, computed } from 'vue'; |
| 97 | ref | ||
| 98 | } from 'vue'; | ||
| 99 | import * as api from '@/common/api.js'; | 104 | import * as api from '@/common/api.js'; |
| 100 | import _ from 'underscore' | 105 | import _ from 'underscore' |
| 101 | import { | 106 | import { onLoad, onShow } from '@dcloudio/uni-app'; |
| 102 | onLoad, | ||
| 103 | onShow | ||
| 104 | } from '@dcloudio/uni-app'; | ||
| 105 | import config from '@/config.js' | 107 | import config from '@/config.js' |
| 106 | const app = getApp(); | 108 | const app = getApp(); |
| 109 | |||
| 110 | const verifyPopup = ref(null) | ||
| 111 | const applyPopup = ref(null) | ||
| 112 | const verifyResult = ref({}) | ||
| 113 | |||
| 107 | const form = ref({ | 114 | const form = ref({ |
| 108 | type: '1', | 115 | type: '1', |
| 109 | applyPoints: '0' | 116 | applyPoints: '0', |
| 117 | renewYear: 1, | ||
| 118 | legalIdcCode: '' | ||
| 110 | }); | 119 | }); |
| 111 | const typeList = ref([{ | ||
| 112 | value: '1', | ||
| 113 | text: '企业' | ||
| 114 | }, { | ||
| 115 | value: '2', | ||
| 116 | text: '国家组织' | ||
| 117 | }, { | ||
| 118 | value: '3', | ||
| 119 | text: '社会组织' | ||
| 120 | }, { | ||
| 121 | value: '4', | ||
| 122 | text: '其他' | ||
| 123 | }]) | ||
| 124 | const years = ref(['1', '2', '3', '4', '5']) | 120 | const years = ref(['1', '2', '3', '4', '5']) |
| 125 | const yesno = ref([{ | 121 | const yesno = ref([{ value: '0', text: '否' }, { value: '1', text: '是' }]) |
| 126 | value: '0', | 122 | const memberFee = ref('') |
| 127 | text: '否' | 123 | const preferentialPolicy = ref(false) |
| 128 | }, { | 124 | const preferentialData = ref({}) |
| 129 | value: '1', | 125 | const typeList = ref([ |
| 130 | text: '是' | 126 | { value: '1', text: '企业' }, |
| 131 | }, ]) | 127 | { value: '2', text: '国家组织' }, |
| 128 | { value: '3', text: '社会组织' }, | ||
| 129 | { value: '4', text: '其他' } | ||
| 130 | ]) | ||
| 132 | const regionArr = ref(); | 131 | const regionArr = ref(); |
| 133 | const regionsList = ref([]); | 132 | const regionsList = ref([]); |
| 134 | const tree = ref([]); | 133 | const tree = ref([]); |
| ... | @@ -140,32 +139,22 @@ | ... | @@ -140,32 +139,22 @@ |
| 140 | const signType = ref(); | 139 | const signType = ref(); |
| 141 | const editIng = ref(true); | 140 | const editIng = ref(true); |
| 142 | const isSign = ref(false); | 141 | const isSign = ref(false); |
| 143 | const type = ref(false) // 第一次选择认证认证类型 | 142 | const type = ref(false) |
| 144 | const flag = ref(false) | 143 | const flag = ref(false) |
| 145 | const result = ref(false) | 144 | const result = ref(false) |
| 146 | const query = ref({ | 145 | const query = ref({ type: 0 }); |
| 147 | type: 0 | ||
| 148 | }); | ||
| 149 | const activeStatus = ref(0) | 146 | const activeStatus = ref(0) |
| 150 | const active = ref(0) | 147 | const active = ref(0) |
| 151 | const memberInfo = ref({}) | 148 | const memberInfo = ref({}) |
| 152 | const authenticationStatus = ref() | 149 | const authenticationStatus = ref() |
| 153 | const authenticationStatusa = ref() | 150 | const authenticationStatusa = ref() |
| 154 | const newResult = ref(false) | 151 | const newResult = ref(false) |
| 155 | const popup = ref(null) | ||
| 156 | const belongProvinceId = ref() | 152 | const belongProvinceId = ref() |
| 157 | const picArr = ref([]) | 153 | const picArr = ref([]) |
| 158 | const picArrR = ref([]) | 154 | const picArrR = ref([]) |
| 159 | const businessLicenseArr = ref([]) | 155 | const businessLicenseArr = ref([]) |
| 160 | const list1 = ref([{ | 156 | const list1 = ref([{ title: '完善信息' }, { title: '会员认证' }]) |
| 161 | title: '完善信息' | 157 | const imageStylesZJ = ref({ width: '400rpx', height: '253rpx' }); |
| 162 | }, { | ||
| 163 | title: '会员认证' | ||
| 164 | }]) | ||
| 165 | const imageStylesZJ = ref({ | ||
| 166 | width: '400rpx', | ||
| 167 | height: '253rpx' | ||
| 168 | }); | ||
| 169 | const indicatorStyle = ref(`height: 50px;`) | 158 | const indicatorStyle = ref(`height: 50px;`) |
| 170 | const imgfront = ref({}) | 159 | const imgfront = ref({}) |
| 171 | const imgBack = ref({}) | 160 | const imgBack = ref({}) |
| ... | @@ -173,8 +162,9 @@ | ... | @@ -173,8 +162,9 @@ |
| 173 | const parentId = ref() | 162 | const parentId = ref() |
| 174 | const legalIdcPhoto1 = ref('') | 163 | const legalIdcPhoto1 = ref('') |
| 175 | const legalIdcPhoto2 = ref('') | 164 | const legalIdcPhoto2 = ref('') |
| 176 | onLoad(option => { | 165 | const companyName = ref('') |
| 177 | 166 | ||
| 167 | onLoad(option => { | ||
| 178 | if (app.globalData.isLogin) { | 168 | if (app.globalData.isLogin) { |
| 179 | init() | 169 | init() |
| 180 | } else { | 170 | } else { |
| ... | @@ -184,115 +174,111 @@ | ... | @@ -184,115 +174,111 @@ |
| 184 | } | 174 | } |
| 185 | }); | 175 | }); |
| 186 | 176 | ||
| 187 | function init() { | 177 | async function init() { |
| 188 | getRegionsList() | 178 | getRegionsList() |
| 189 | getForm() | 179 | await getForm() |
| 180 | await canUseDiscountApi() | ||
| 181 | await getZtxDiscountPolicyApi() | ||
| 182 | } | ||
| 183 | |||
| 184 | async function getMyMemberCertUnitFeeApi() { | ||
| 185 | const res = await api.getMyMemberCertUnitFee() | ||
| 186 | memberFee.value = res.data | ||
| 187 | } | ||
| 188 | |||
| 189 | async function canUseDiscountApi() { | ||
| 190 | const res = await api.canUseDiscount() | ||
| 191 | preferentialPolicy.value = res.data | ||
| 190 | } | 192 | } |
| 191 | 193 | ||
| 192 | function getForm() { | 194 | async function getZtxDiscountPolicyApi() { |
| 193 | api.getMyOwnMemberInfo().then(res => { | 195 | const res = await api.getZtxDiscountPolicy() |
| 194 | newResult.value = res.data.newResult // | 196 | preferentialData.value = res.data |
| 195 | result.value = res.data.result // 认证缴费状态 | 197 | } |
| 198 | |||
| 199 | async function getForm() { | ||
| 200 | const res = await api.getMyOwnMemberInfo() | ||
| 201 | newResult.value = res.data.newResult | ||
| 202 | result.value = res.data.result | ||
| 196 | authenticationStatusa.value = res.data.authenticationStatus | 203 | authenticationStatusa.value = res.data.authenticationStatus |
| 197 | showDirectly.value = !res.data.memberInfo.associateId | 204 | showDirectly.value = !res.data.memberInfo.associateId |
| 198 | activeStatus.value = res.data.memberInfo.activeStatus | 205 | activeStatus.value = res.data.memberInfo.activeStatus |
| 199 | directUnderFlag.value = res.data.memberInfo.directUnderFlag | 206 | directUnderFlag.value = res.data.memberInfo.directUnderFlag |
| 200 | // 认证信息 | 207 | |
| 201 | if (authenticationStatusa.value == 0 || authenticationStatusa.value == 3) { | 208 | if (authenticationStatusa.value == 0 || authenticationStatusa.value == 3) { |
| 202 | type.value = false | 209 | type.value = false |
| 203 | } else { | 210 | } else { |
| 204 | type.value = true | 211 | type.value = true |
| 205 | } | 212 | } |
| 206 | // 至少审核通过一次 | 213 | |
| 207 | if (authenticationStatusa.value != 0) { | 214 | if (authenticationStatusa.value != 0) { |
| 208 | if (newResult.value) { | 215 | flag.value = newResult.value |
| 209 | // 至少认证过一次 | ||
| 210 | flag.value = true | ||
| 211 | } else { | ||
| 212 | // 没有认证 | ||
| 213 | flag.value = false | ||
| 214 | } | ||
| 215 | } | ||
| 216 | form.value = { | ||
| 217 | ...res.data.dept, | ||
| 218 | ...res.data.memberInfo | ||
| 219 | } | 216 | } |
| 217 | |||
| 218 | form.value = { ...res.data.dept, ...res.data.memberInfo } | ||
| 220 | getTree() | 219 | getTree() |
| 221 | form.value.deptType = res.data.dept.deptType | 220 | form.value.deptType = res.data.dept.deptType |
| 222 | form.value.parentId = form.value.parentId.toString() | 221 | form.value.parentId = form.value.parentId.toString() |
| 223 | creditCode.value = form.value.creditCode | 222 | creditCode.value = form.value.creditCode |
| 223 | companyName.value = form.value.companyName | ||
| 224 | belongProvinceId.value = form.value.belongProvinceId | 224 | belongProvinceId.value = form.value.belongProvinceId |
| 225 | parentId.value = form.value.parentId | 225 | parentId.value = form.value.parentId |
| 226 | if (form.value.regionId){ | 226 | |
| 227 | if (form.value.regionId) { | ||
| 227 | form.value.coordinates1 = form.value.regionId | 228 | form.value.coordinates1 = form.value.regionId |
| 228 | } else if(form.value.cityId){ | 229 | } else if (form.value.cityId) { |
| 229 | form.value.coordinates1 = form.value.cityId | 230 | form.value.coordinates1 = form.value.cityId |
| 230 | } else if(form.value.provinceId){ | 231 | } else if (form.value.provinceId) { |
| 231 | form.value.coordinates1 = form.value.provinceId | 232 | form.value.coordinates1 = form.value.provinceId |
| 232 | } else { | 233 | } else { |
| 233 | form.value.coordinates1 = '' | 234 | form.value.coordinates1 = '' |
| 234 | } | 235 | } |
| 235 | if(form.value.businessLicense){ | 236 | |
| 236 | try{ | 237 | if (form.value.businessLicense) { |
| 238 | try { | ||
| 237 | businessLicenseArr.value = JSON.parse(form.value.businessLicense) || [] | 239 | businessLicenseArr.value = JSON.parse(form.value.businessLicense) || [] |
| 238 | }catch(e){ | 240 | } catch (e) { |
| 239 | businessLicenseArr.value=[{url:form.value.businessLicense,name:'营业执照'}] | 241 | businessLicenseArr.value = [{ url: form.value.businessLicense, name: '营业执照' }] |
| 240 | } | 242 | } |
| 241 | } | 243 | } |
| 242 | if(form.value.legalIdcPhoto){ | 244 | |
| 245 | if (form.value.legalIdcPhoto) { | ||
| 243 | legalIdcPhoto1.value = form.value.legalIdcPhoto.split(',')?.[0] || '' | 246 | legalIdcPhoto1.value = form.value.legalIdcPhoto.split(',')?.[0] || '' |
| 244 | legalIdcPhoto2.value = form.value.legalIdcPhoto.split(',')?.[1] || '' | 247 | legalIdcPhoto2.value = form.value.legalIdcPhoto.split(',')?.[1] || '' |
| 245 | if(legalIdcPhoto1.value.indexOf('http')==-1){ | 248 | if (legalIdcPhoto1.value.indexOf('http') == -1) { |
| 246 | legalIdcPhoto1.value = config.baseUrl_api + legalIdcPhoto1.value | 249 | legalIdcPhoto1.value = config.baseUrl_api + legalIdcPhoto1.value |
| 247 | } | 250 | } |
| 248 | if(legalIdcPhoto2.value.indexOf('http')==-1){ | 251 | if (legalIdcPhoto2.value.indexOf('http') == -1) { |
| 249 | legalIdcPhoto2.value = config.baseUrl_api + legalIdcPhoto2.value | 252 | legalIdcPhoto2.value = config.baseUrl_api + legalIdcPhoto2.value |
| 250 | } | 253 | } |
| 251 | imgfront.value = { | 254 | imgfront.value = { url: legalIdcPhoto1.value, name: '身份证正面', extname: 'png' } |
| 252 | url: legalIdcPhoto1.value, | 255 | imgBack.value = { url: legalIdcPhoto2.value, name: '身份证反面', extname: 'png' } |
| 253 | name: '身份证正面', | ||
| 254 | extname: 'png' | ||
| 255 | } | ||
| 256 | imgBack.value = { | ||
| 257 | url:legalIdcPhoto2.value, | ||
| 258 | name: '身份证反面', | ||
| 259 | extname: 'png' | ||
| 260 | } | 256 | } |
| 261 | } | 257 | |
| 262 | if(form.value.pictures){ | 258 | if (form.value.pictures) { |
| 263 | picArrR.value = [] | 259 | picArrR.value = [] |
| 264 | picArr.value = [] | 260 | picArr.value = [] |
| 265 | var arr = form.value.pictures.split(',') || [] | 261 | var arr = form.value.pictures.split(',') || [] |
| 266 | if (arr.length > 0) { | 262 | if (arr.length > 0) { |
| 267 | arr = _.map(arr, (p) => { | 263 | _.map(arr, (p) => { |
| 268 | if(p.indexOf('http')==-1){ | 264 | if (p.indexOf('http') == -1) { |
| 269 | p = config.baseUrl_api + p | 265 | p = config.baseUrl_api + p |
| 270 | } | 266 | } |
| 271 | var obj = { | 267 | var obj = { url: p, name: '图片', extname: 'png' } |
| 272 | url: p, | ||
| 273 | name: '图片', | ||
| 274 | extname: 'png' | ||
| 275 | } | ||
| 276 | picArrR.value.push(obj) | 268 | picArrR.value.push(obj) |
| 277 | picArr.value.push(p) | 269 | picArr.value.push(p) |
| 278 | }) | 270 | }) |
| 279 | |||
| 280 | } | 271 | } |
| 281 | } | 272 | } |
| 282 | 273 | ||
| 283 | if(!form.value.applyPoints||form.value.applyPoints==''){ | 274 | if (!form.value.applyPoints || form.value.applyPoints == '') { |
| 284 | form.value.applyPoints = '0' | 275 | form.value.applyPoints = '0' |
| 285 | } | 276 | } |
| 286 | }) | ||
| 287 | } | 277 | } |
| 288 | 278 | ||
| 289 | function getTree() { | 279 | function getTree() { |
| 290 | if (authenticationStatusa.value == 0 || authenticationStatusa.value == 3 || authenticationStatusa.value == 1) { | 280 | if (authenticationStatusa.value == 0 || authenticationStatusa.value == 3 || authenticationStatusa.value == 1) { |
| 291 | var obj = { | 281 | var obj = { selfDeptId: '-1', webSiteShow: 1, showDisabled: 1 } |
| 292 | selfDeptId: '-1', | ||
| 293 | webSiteShow: 1, | ||
| 294 | showDisabled: 1 | ||
| 295 | } | ||
| 296 | api.certifiedDeptTree(obj).then(res => { | 282 | api.certifiedDeptTree(obj).then(res => { |
| 297 | tree.value = res.data | 283 | tree.value = res.data |
| 298 | }) | 284 | }) |
| ... | @@ -300,8 +286,7 @@ | ... | @@ -300,8 +286,7 @@ |
| 300 | var obj = { | 286 | var obj = { |
| 301 | selfDeptId: '-1', | 287 | selfDeptId: '-1', |
| 302 | showDisabled: 1, | 288 | showDisabled: 1, |
| 303 | showDirect: authenticationStatusa.value == 2 || authenticationStatusa.value == 5 || | 289 | showDirect: authenticationStatusa.value == 2 || authenticationStatusa.value == 5 || authenticationStatusa.value == 4 ? 1 : null |
| 304 | authenticationStatusa.value == 4 ? 1 : null | ||
| 305 | } | 290 | } |
| 306 | api.deptTreeSelect(obj).then(res => { | 291 | api.deptTreeSelect(obj).then(res => { |
| 307 | tree.value = res.data | 292 | tree.value = res.data |
| ... | @@ -309,197 +294,221 @@ | ... | @@ -309,197 +294,221 @@ |
| 309 | } | 294 | } |
| 310 | } | 295 | } |
| 311 | 296 | ||
| 312 | |||
| 313 | function getRegionsList() { | 297 | function getRegionsList() { |
| 314 | api.regionsList().then(res => { | 298 | api.regionsList().then(res => { |
| 315 | regionsList.value = res.data; | 299 | regionsList.value = res.data; |
| 316 | }); | 300 | }); |
| 317 | } | 301 | } |
| 318 | 302 | ||
| 319 | function submit() { | 303 | // 核心:修改submit方法,改用自定义弹窗 |
| 320 | // 验证必填项 | 304 | async function submit() { |
| 305 | // 基础表单验证 | ||
| 321 | if (form.value.name == '') { | 306 | if (form.value.name == '') { |
| 322 | uni.showToast({ | 307 | uni.showToast({ title: '请填写机构名称', icon: 'none' }) |
| 323 | title: '请填写机构名称', | ||
| 324 | icon: 'none' | ||
| 325 | }) | ||
| 326 | return | 308 | return |
| 327 | } | 309 | } |
| 328 | if (form.value.creditCode == '') { | 310 | if (form.value.creditCode == '') { |
| 329 | uni.showToast({ | 311 | uni.showToast({ title: '请填写社会信用代码', icon: 'none' }) |
| 330 | title: '请填写社会信用代码', | ||
| 331 | icon: 'none' | ||
| 332 | }) | ||
| 333 | return | 312 | return |
| 334 | } | 313 | } |
| 335 | if (form.value.siteContact == '') { | 314 | if (form.value.companyName == '') { |
| 336 | uni.showToast({ | 315 | uni.showToast({ title: '请填写营业执照名称', icon: 'none' }) |
| 337 | title: '请填写联系人', | 316 | return |
| 338 | icon: 'none' | 317 | } |
| 339 | }) | 318 | if (form.value.legalIdcCode == '') { |
| 319 | uni.showToast({ title: '请填写法人证件号', icon: 'none' }) | ||
| 340 | return | 320 | return |
| 341 | } | 321 | } |
| 342 | |||
| 343 | if (form.value.siteContact == '') { | 322 | if (form.value.siteContact == '') { |
| 344 | uni.showToast({ | 323 | uni.showToast({ title: '请填写联系人', icon: 'none' }) |
| 345 | title: '请填写联系人', | ||
| 346 | icon: 'none' | ||
| 347 | }) | ||
| 348 | return | 324 | return |
| 349 | } | 325 | } |
| 350 | |||
| 351 | if (form.value.siteTel == '') { | 326 | if (form.value.siteTel == '') { |
| 352 | uni.showToast({ | 327 | uni.showToast({ title: '请填写联系方式', icon: 'none' }) |
| 353 | title: '请填写联系方式', | ||
| 354 | icon: 'none' | ||
| 355 | }) | ||
| 356 | return | 328 | return |
| 357 | } | 329 | } |
| 358 | |||
| 359 | if (form.value.coordinates1 == '') { | 330 | if (form.value.coordinates1 == '') { |
| 360 | uni.showToast({ | 331 | uni.showToast({ title: '请选择认证地址', icon: 'none' }) |
| 361 | title: '请选择认证地址', | ||
| 362 | icon: 'none' | ||
| 363 | }) | ||
| 364 | return | 332 | return |
| 365 | } | 333 | } |
| 366 | if (form.value.adress == '') { | 334 | if (form.value.adress == '') { |
| 367 | uni.showToast({ | 335 | uni.showToast({ title: '请填写详细地址', icon: 'none' }) |
| 368 | title: '请填写详细地址', | ||
| 369 | icon: 'none' | ||
| 370 | }) | ||
| 371 | return | 336 | return |
| 372 | } | 337 | } |
| 373 | if (form.value.legal == '') { | 338 | if (form.value.legal == '') { |
| 374 | uni.showToast({ | 339 | uni.showToast({ title: '请填写法人姓名', icon: 'none' }) |
| 375 | title: '请填写法人姓名', | ||
| 376 | icon: 'none' | ||
| 377 | }) | ||
| 378 | return | 340 | return |
| 379 | } | 341 | } |
| 380 | if (legalIdcPhoto1.value == '' || legalIdcPhoto2.value == '') { | 342 | if (legalIdcPhoto1.value == '' || legalIdcPhoto2.value == '') { |
| 381 | uni.showToast({ | 343 | uni.showToast({ title: '请上传法人身份证', icon: 'none' }) |
| 382 | title: '请上传法人身份证', | ||
| 383 | icon: 'none' | ||
| 384 | }) | ||
| 385 | return | 344 | return |
| 386 | } | 345 | } |
| 387 | if (form.value.businessLicense == '') { | 346 | if (!form.value.businessLicense) { |
| 388 | uni.showToast({ | 347 | uni.showToast({ title: '请上传营业执照', icon: 'none' }) |
| 389 | title: '请上传营业执照', | ||
| 390 | icon: 'none' | ||
| 391 | }) | ||
| 392 | return | 348 | return |
| 393 | } | 349 | } |
| 394 | if (picArr.value.length == 0) { | 350 | if (picArr.value.length == 0) { |
| 395 | uni.showToast({ | 351 | uni.showToast({ title: '请上传机构照片', icon: 'none' }) |
| 396 | title: '请上传机构照片', | ||
| 397 | icon: 'none' | ||
| 398 | }) | ||
| 399 | return | 352 | return |
| 400 | } | 353 | } |
| 401 | |||
| 402 | form.value.duanPrice = undefined | ||
| 403 | form.value.jiPrice = undefined | ||
| 404 | if (form.value.parentId == -1 || form.value.parentId == 0) { | 354 | if (form.value.parentId == -1 || form.value.parentId == 0) { |
| 405 | uni.showToast({ | 355 | uni.showToast({ title: '请选择所属协会', icon: 'none' }) |
| 406 | title: '请选择所属协会', | ||
| 407 | icon: 'none' | ||
| 408 | }) | ||
| 409 | return | 356 | return |
| 410 | } | 357 | } |
| 358 | |||
| 359 | try { | ||
| 360 | const res = await handelVerify() | ||
| 361 | verifyResult.value = res | ||
| 362 | |||
| 363 | if (!res.passFlag) { | ||
| 364 | // 打开自定义弹窗(替代原有showModal) | ||
| 365 | verifyPopup.value.open() | ||
| 366 | return | ||
| 367 | } | ||
| 368 | |||
| 369 | submitData() | ||
| 370 | |||
| 371 | } catch (error) { | ||
| 372 | uni.showToast({ title: error.message || '验证失败,请重试', icon: 'none' }) | ||
| 373 | } | ||
| 374 | } | ||
| 375 | |||
| 376 | // 新增:关闭验证弹窗 | ||
| 377 | function closeVerifyPopup() { | ||
| 378 | verifyPopup.value.close() | ||
| 379 | } | ||
| 380 | |||
| 381 | // 新增:确认无误提交 | ||
| 382 | function confirmSubmit() { | ||
| 383 | verifyPopup.value.close() | ||
| 384 | submitData() | ||
| 385 | } | ||
| 386 | |||
| 387 | // 新增:打开考点申请弹窗(备用,如需调用可加触发逻辑) | ||
| 388 | function openApplyPopup() { | ||
| 389 | applyPopup.value.open() | ||
| 390 | } | ||
| 391 | |||
| 392 | // 新增:关闭考点申请弹窗 | ||
| 393 | function closeApplyPopup() { | ||
| 394 | applyPopup.value.close() | ||
| 395 | } | ||
| 396 | |||
| 397 | // 新增:确认考点申请 | ||
| 398 | function confirmApply() { | ||
| 399 | applyPopup.value.close() | ||
| 400 | // 此处添加考点申请逻辑 | ||
| 401 | } | ||
| 402 | |||
| 403 | // 企业信息验证 | ||
| 404 | function handelVerify() { | ||
| 405 | return new Promise(async(resolve, reject) => { | ||
| 406 | if (!form.value.legalIdcCode || !form.value.legal) { | ||
| 407 | return reject(new Error('请重新上传身份证并填写法人证件号')) | ||
| 408 | } | ||
| 409 | if (!form.value.companyName || !form.value.creditCode) { | ||
| 410 | return reject(new Error('请重新上传营业执照并填写营业执照名称')) | ||
| 411 | } | ||
| 412 | |||
| 413 | try { | ||
| 414 | const res = await api.checkBusinessLicense({ | ||
| 415 | creditCode: form.value.creditCode, | ||
| 416 | companyName: form.value.companyName, | ||
| 417 | legalIdcCode: form.value.legalIdcCode, | ||
| 418 | legal: form.value.legal | ||
| 419 | }) | ||
| 420 | if (res.code == 200) { | ||
| 421 | resolve(res.data) | ||
| 422 | } else { | ||
| 423 | reject(new Error(res.msg || '企业信息验证失败')) | ||
| 424 | } | ||
| 425 | } catch (e) { | ||
| 426 | reject(new Error('验证接口调用失败,请检查网络')) | ||
| 427 | } | ||
| 428 | }) | ||
| 429 | } | ||
| 430 | |||
| 431 | // 数据提交核心逻辑 | ||
| 432 | function submitData() { | ||
| 411 | const dataInfo = { | 433 | const dataInfo = { |
| 412 | parentId: form.value.parentId, | 434 | parentId: form.value.parentId, |
| 413 | creditCode: form.value.creditCode, | 435 | creditCode: form.value.creditCode, |
| 414 | legal: form.value.legal, | 436 | legal: form.value.legal, |
| 415 | businessLicense:form.value.businessLicense, | 437 | businessLicense: form.value.businessLicense, |
| 416 | pictures: picArr.value.toString(), | 438 | pictures: picArr.value.toString(), |
| 417 | memId: form.value.memId, | 439 | memId: form.value.memId, |
| 418 | id: form.value.deptId, | 440 | id: form.value.deptId, |
| 419 | name: form.value.name, | 441 | name: form.value.name, |
| 420 | regionId: form.value.coordinates1, | 442 | regionId: form.value.coordinates1, |
| 421 | // cityId: form.value.cityId, | ||
| 422 | // provinceId: form.value.provinceId, | ||
| 423 | adress: form.value.adress, | 443 | adress: form.value.adress, |
| 424 | belongProvinceId: form.value.belongProvinceId, | 444 | belongProvinceId: form.value.belongProvinceId, |
| 425 | deptType: form.value.deptType, | 445 | deptType: form.value.deptType, |
| 426 | legalIdcPhoto: [legalIdcPhoto1.value,legalIdcPhoto2.value]?.join(','), | 446 | legalIdcPhoto: [legalIdcPhoto1.value, legalIdcPhoto2.value]?.join(','), |
| 447 | legalIdcCode: form.value.legalIdcCode, | ||
| 448 | companyName: form.value.companyName, | ||
| 427 | applyPoints: form.value.applyPoints, | 449 | applyPoints: form.value.applyPoints, |
| 428 | siteContact: form.value.siteContact, | 450 | siteContact: form.value.siteContact, |
| 429 | siteTel: form.value.siteTel | 451 | siteTel: form.value.siteTel |
| 430 | } | 452 | } |
| 431 | console.log(dataInfo) | 453 | |
| 432 | if (activeStatus.value == 0) { | 454 | if (activeStatus.value == 0) { |
| 433 | api.active(dataInfo).then(res => { | 455 | api.active(dataInfo).then(res => { |
| 434 | uni.showModal({ | 456 | uni.showModal({ |
| 435 | content: '激活成功,返回首页', | 457 | content: '激活成功,返回首页', |
| 436 | success: function(resp) { | 458 | success: function(resp) { |
| 437 | if (resp.confirm) { | 459 | if (resp.confirm) { |
| 438 | uni.reLaunch({ | 460 | uni.reLaunch({ url: `/pages/index/index` }) |
| 439 | url:`/pages/index/index` | ||
| 440 | }) | ||
| 441 | } else { | 461 | } else { |
| 442 | uni.navigateBack() | 462 | uni.navigateBack() |
| 443 | } | 463 | } |
| 444 | } | 464 | } |
| 445 | }) | 465 | }) |
| 466 | }).catch(err => { | ||
| 467 | uni.showToast({ title: '激活失败,请重试', icon: 'none' }) | ||
| 446 | }) | 468 | }) |
| 447 | } else { | 469 | } else { |
| 448 | api.editMyMemberCertifiedInfo(dataInfo).then(res => { | 470 | api.editMyMemberCertifiedInfo(dataInfo).then(res => { |
| 449 | popup.value.open() | 471 | uni.navigateTo({ |
| 472 | url: `/myCenter/goPay` | ||
| 450 | }) | 473 | }) |
| 451 | } | 474 | |
| 452 | } | 475 | }).catch(err => { |
| 453 | function changeCoordinates1(e){ | 476 | uni.showToast({ title: '提交失败,请重试', icon: 'none' }) |
| 454 | console.log(e) | ||
| 455 | } | ||
| 456 | function submitForm() { | ||
| 457 | if (!form.value.renewYear) { | ||
| 458 | uni.showToast({ | ||
| 459 | title: '请选择缴费年限', | ||
| 460 | icon: 'none' | ||
| 461 | }) | 477 | }) |
| 462 | return | ||
| 463 | } | ||
| 464 | api.centerCommit({ | ||
| 465 | renewYear: form.value.renewYear | ||
| 466 | }).then(res => { | ||
| 467 | uni.showModal({ | ||
| 468 | content: `缴费等待审核中!`, | ||
| 469 | success: function(res) { | ||
| 470 | if (res.confirm) { | ||
| 471 | uni.navigateBack() | ||
| 472 | } | 478 | } |
| 473 | } | 479 | } |
| 474 | }) | 480 | |
| 475 | }) | 481 | function changeCoordinates1(e) { |
| 482 | form.value.provinceId = e?.[0]?.toString() | ||
| 483 | form.value.cityId = e?.[1]?.toString() | ||
| 484 | form.value.regionId = e?.[2]?.toString() | ||
| 476 | } | 485 | } |
| 477 | 486 | ||
| 478 | function upIdCardImgFront(e) { | 487 | function upIdCardImgFront(e) { |
| 479 | const tempFilePaths = e.tempFilePaths; | 488 | const tempFilePaths = e.tempFilePaths; |
| 480 | const imgUrl = tempFilePaths[0] | 489 | const imgUrl = tempFilePaths[0] |
| 481 | if (!imgUrl) { | 490 | if (!imgUrl) return |
| 482 | return | 491 | uni.showLoading({ title: '上传中' }) |
| 483 | } | ||
| 484 | uni.showLoading({ | ||
| 485 | title: '加载中' | ||
| 486 | }) | ||
| 487 | api.uploadImg(e).then(data => { | 492 | api.uploadImg(e).then(data => { |
| 488 | legalIdcPhoto1.value = data.msg | 493 | legalIdcPhoto1.value = data.msg |
| 494 | uni.hideLoading() | ||
| 495 | }).catch(err => { | ||
| 496 | uni.hideLoading() | ||
| 497 | uni.showToast({ title: '上传失败', icon: 'none' }) | ||
| 489 | }) | 498 | }) |
| 490 | } | 499 | } |
| 491 | 500 | ||
| 492 | function upIdCardImgBack(e) { | 501 | function upIdCardImgBack(e) { |
| 493 | const tempFilePaths = e.tempFilePaths; | 502 | const tempFilePaths = e.tempFilePaths; |
| 494 | const imgUrl = tempFilePaths[0] | 503 | const imgUrl = tempFilePaths[0] |
| 495 | if (!imgUrl) { | 504 | if (!imgUrl) return |
| 496 | return | 505 | uni.showLoading({ title: '上传中' }) |
| 497 | } | ||
| 498 | uni.showLoading({ | ||
| 499 | title: '加载中' | ||
| 500 | }) | ||
| 501 | api.uploadImg(e).then(data => { | 506 | api.uploadImg(e).then(data => { |
| 502 | legalIdcPhoto2.value = data.msg | 507 | legalIdcPhoto2.value = data.msg |
| 508 | uni.hideLoading() | ||
| 509 | }).catch(err => { | ||
| 510 | uni.hideLoading() | ||
| 511 | uni.showToast({ title: '上传失败', icon: 'none' }) | ||
| 503 | }) | 512 | }) |
| 504 | } | 513 | } |
| 505 | 514 | ||
| ... | @@ -514,103 +523,64 @@ | ... | @@ -514,103 +523,64 @@ |
| 514 | } | 523 | } |
| 515 | 524 | ||
| 516 | let selectFileValue = {} | 525 | let selectFileValue = {} |
| 517 | |||
| 518 | function selectFile(e) { | 526 | function selectFile(e) { |
| 519 | console.log(e) | ||
| 520 | let file = e.tempFiles[0] | 527 | let file = e.tempFiles[0] |
| 521 | if (!file) { | 528 | if (!file) return |
| 522 | return | 529 | uni.showLoading({ title: '上传中' }) |
| 523 | } | ||
| 524 | api.uploadFile(e).then(data => { | 530 | api.uploadFile(e).then(data => { |
| 525 | selectFileValue = { | 531 | selectFileValue = { url: data.msg, name: file.name, extname: file.extname } |
| 526 | url: data.msg, | ||
| 527 | name: file.name, | ||
| 528 | extname: file.extname | ||
| 529 | } | ||
| 530 | form.value.businessLicense = JSON.stringify([selectFileValue]) | 532 | form.value.businessLicense = JSON.stringify([selectFileValue]) |
| 531 | console.log(selectFileValue,form.value.businessLicense) | 533 | uni.hideLoading() |
| 534 | }).catch(err => { | ||
| 535 | uni.hideLoading() | ||
| 536 | uni.showToast({ title: '上传失败', icon: 'none' }) | ||
| 532 | }) | 537 | }) |
| 533 | } | 538 | } |
| 534 | 539 | ||
| 535 | function delSupplementFile() { | 540 | function delSupplementFile() { |
| 536 | selectFileValue = {} | 541 | selectFileValue = {} |
| 542 | form.value.businessLicense = '' | ||
| 537 | } | 543 | } |
| 538 | 544 | ||
| 539 | function upPicArr(e) { | 545 | function upPicArr(e) { |
| 540 | const tempFilePaths = e.tempFilePaths; | 546 | const tempFilePaths = e.tempFilePaths; |
| 541 | const imgUrl = tempFilePaths[0] | 547 | const imgUrl = tempFilePaths[0] |
| 542 | if (!imgUrl) { | 548 | if (!imgUrl) return |
| 543 | return | 549 | uni.showLoading({ title: '上传中' }) |
| 544 | } | ||
| 545 | uni.showLoading({ | ||
| 546 | title: '加载中' | ||
| 547 | }) | ||
| 548 | api.uploadImg(e).then(data => { | 550 | api.uploadImg(e).then(data => { |
| 549 | picArr.value.push(data.msg) | 551 | picArr.value.push(data.msg) |
| 550 | // form.value.pictures | 552 | uni.hideLoading() |
| 551 | console.log(picArr.value) | 553 | }).catch(err => { |
| 554 | uni.hideLoading() | ||
| 555 | uni.showToast({ title: '上传失败', icon: 'none' }) | ||
| 552 | }) | 556 | }) |
| 553 | } | 557 | } |
| 554 | 558 | ||
| 555 | function delpicArr(e) { | 559 | function delpicArr(e) { |
| 556 | picArr.value.splice(e.index, 1) | 560 | picArr.value.splice(e.index, 1) |
| 557 | console.log(picArr.value, picArrR.value) | ||
| 558 | } | ||
| 559 | |||
| 560 | |||
| 561 | function bindChange(e) { | ||
| 562 | console.log(e) | ||
| 563 | form.value.renewYear = e | ||
| 564 | } | 561 | } |
| 565 | </script> | 562 | </script> |
| 566 | 563 | ||
| 567 | <style lang="scss" scoped> | 564 | <style lang="scss" scoped> |
| 568 | :deep(.file-picker__progress){ opacity: 0; } | 565 | :deep(.file-picker__progress){ opacity: 0; } |
| 569 | :deep(.input-value){padding: 0 5px;} | 566 | :deep(.input-value){padding: 0 5px;} |
| 570 | .pickitem { | ||
| 571 | height: 40px; | ||
| 572 | text-align: center; | ||
| 573 | line-height: 40px; | ||
| 574 | } | ||
| 575 | |||
| 576 | .picker-view { | 567 | .picker-view { |
| 577 | width: 750rpx; | 568 | width: 750rpx; |
| 578 | height: 600rpx; | 569 | height: 600rpx; |
| 579 | margin-top: 20rpx; | 570 | margin-top: 20rpx; |
| 580 | } | 571 | } |
| 581 | |||
| 582 | .item { | 572 | .item { |
| 583 | line-height: 100rpx; | 573 | line-height: 100rpx; |
| 584 | text-align: center; | 574 | text-align: center; |
| 585 | } | 575 | } |
| 586 | |||
| 587 | .popBody { | ||
| 588 | background: #fff; | ||
| 589 | padding: 30rpx; | ||
| 590 | } | ||
| 591 | |||
| 592 | :deep(.uni-data-tree) { | 576 | :deep(.uni-data-tree) { |
| 593 | border: 1px solid #dcdfe6; | 577 | border: 1px solid #dcdfe6; |
| 594 | border-radius: 4px; | 578 | border-radius: 4px; |
| 595 | 579 | .selected-list { justify-content: start; } | |
| 596 | .selected-list { | ||
| 597 | justify-content: start; | ||
| 598 | } | 580 | } |
| 599 | } | 581 | :deep(.uni-select__input-placeholder) { font-size: 30rpx; } |
| 600 | 582 | :deep(.uni-easyinput__content-input) { font-size: 30rpx; } | |
| 601 | :deep(.uni-select__input-placeholder) { | 583 | :deep(.uni-easyinput__placeholder-class) { font-size: 30rpx;color: grey; } |
| 602 | font-size: 30rpx; | ||
| 603 | } | ||
| 604 | |||
| 605 | :deep(.uni-easyinput__content-input) { | ||
| 606 | font-size: 30rpx; | ||
| 607 | } | ||
| 608 | |||
| 609 | :deep(.uni-easyinput__placeholder-class) { | ||
| 610 | font-size: 30rpx; | ||
| 611 | color: grey; | ||
| 612 | } | ||
| 613 | |||
| 614 | .wBox { | 584 | .wBox { |
| 615 | width: 700rpx; | 585 | width: 700rpx; |
| 616 | padding: 30rpx; | 586 | padding: 30rpx; |
| ... | @@ -619,11 +589,98 @@ | ... | @@ -619,11 +589,98 @@ |
| 619 | box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1); | 589 | box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1); |
| 620 | border-radius: 15rpx; | 590 | border-radius: 15rpx; |
| 621 | } | 591 | } |
| 622 | |||
| 623 | .imgArea { | 592 | .imgArea { |
| 624 | padding: 1px; | 593 | padding: 1px; |
| 625 | display: flex; | 594 | display: flex; |
| 626 | flex-wrap: wrap; | 595 | flex-wrap: wrap; |
| 627 | flex-direction: column; | 596 | flex-direction: column; |
| 628 | } | 597 | } |
| 598 | .btn-red { | ||
| 599 | background-color: #F56C6C; | ||
| 600 | color: #fff; | ||
| 601 | border-radius: 8rpx; | ||
| 602 | height: 80rpx; | ||
| 603 | line-height: 80rpx; | ||
| 604 | font-size: 32rpx; | ||
| 605 | width: 100%; | ||
| 606 | } | ||
| 607 | .fixedBottom { | ||
| 608 | position: fixed; | ||
| 609 | bottom: 0; | ||
| 610 | left: 0; | ||
| 611 | right: 0; | ||
| 612 | padding: 20rpx 30rpx; | ||
| 613 | background: #fff; | ||
| 614 | z-index: 99; | ||
| 615 | } | ||
| 616 | .text-warning { | ||
| 617 | font-size: 28rpx; | ||
| 618 | margin-top: 20rpx; | ||
| 619 | } | ||
| 620 | |||
| 621 | /* 新增:自定义弹窗样式(核心) */ | ||
| 622 | .custom-modal { | ||
| 623 | width: 600rpx; | ||
| 624 | background: #fff; | ||
| 625 | border-radius: 20rpx; | ||
| 626 | padding: 40rpx 30rpx; | ||
| 627 | box-sizing: border-box; | ||
| 628 | text-align: center; | ||
| 629 | } | ||
| 630 | .modal-title { | ||
| 631 | font-size: 36rpx; | ||
| 632 | font-weight: 600; | ||
| 633 | color: #333; | ||
| 634 | margin-bottom: 30rpx; | ||
| 635 | } | ||
| 636 | .modal-content { | ||
| 637 | font-size: 30rpx; | ||
| 638 | color: #666; | ||
| 639 | line-height: 1.6; | ||
| 640 | margin-bottom: 20rpx; | ||
| 641 | text-align: left; | ||
| 642 | } | ||
| 643 | .modal-tip { | ||
| 644 | font-size: 26rpx; | ||
| 645 | color: #F56C6C; | ||
| 646 | margin-top: 10rpx; | ||
| 647 | margin-bottom: 30rpx; | ||
| 648 | } | ||
| 649 | .modal-btns { | ||
| 650 | display: flex; | ||
| 651 | justify-content: space-between; | ||
| 652 | gap: 20rpx; | ||
| 653 | } | ||
| 654 | .btn-cancel { | ||
| 655 | flex: 1; | ||
| 656 | height: 80rpx; | ||
| 657 | line-height: 80rpx; | ||
| 658 | background: #f5f5f5; | ||
| 659 | color: #666; | ||
| 660 | border-radius: 40rpx; | ||
| 661 | font-size: 32rpx; | ||
| 662 | border: none; | ||
| 663 | } | ||
| 664 | .btn-confirm { | ||
| 665 | flex: 1; | ||
| 666 | height: 80rpx; | ||
| 667 | line-height: 80rpx; | ||
| 668 | background: #C4121B; /* 红色主色调,和图二一致 */ | ||
| 669 | color: #fff; | ||
| 670 | border-radius: 40rpx; | ||
| 671 | font-size: 32rpx; | ||
| 672 | border: none; | ||
| 673 | } | ||
| 674 | /* 去掉按钮默认边框 */ | ||
| 675 | .btn-cancel::after, .btn-confirm::after { | ||
| 676 | border: none; | ||
| 677 | } | ||
| 678 | |||
| 679 | /* 考点申请弹窗专属样式 */ | ||
| 680 | .apply-modal { | ||
| 681 | padding: 40rpx 30rpx 20rpx; | ||
| 682 | } | ||
| 683 | .apply-btns { | ||
| 684 | margin-bottom: 20rpx; | ||
| 685 | } | ||
| 629 | </style> | 686 | </style> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
myCenter/sucPay.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="success-container"> | ||
| 3 | <!-- 成功图标(渐变圆形+动效) --> | ||
| 4 | <view class="success-icon"> | ||
| 5 | <view class="icon-circle"> | ||
| 6 | <text class="check-icon">✓</text> | ||
| 7 | </view> | ||
| 8 | </view> | ||
| 9 | |||
| 10 | <!-- 支付成功标题(动画) --> | ||
| 11 | <view class="success-title">支付成功</view> | ||
| 12 | <view class="success-subtitle">支付成功,请等待审核</view> | ||
| 13 | |||
| 14 | <!-- 订单信息卡片(带阴影) --> | ||
| 15 | <view class="info-card"> | ||
| 16 | <view class="info-item"> | ||
| 17 | <text class="label">付款账户</text> | ||
| 18 | <text class="value">(5437)</text> | ||
| 19 | </view> | ||
| 20 | <view class="info-item"> | ||
| 21 | <text class="label">交易流水号</text> | ||
| 22 | <text class="value">2205051351076117833</text> | ||
| 23 | </view> | ||
| 24 | <view class="info-item"> | ||
| 25 | <text class="label">商户名称</text> | ||
| 26 | <text class="value">中国跆拳道协会</text> | ||
| 27 | </view> | ||
| 28 | <view class="info-item"> | ||
| 29 | <text class="label">订单金额</text> | ||
| 30 | <text class="value amount">1500.00元</text> | ||
| 31 | </view> | ||
| 32 | <view class="info-item"> | ||
| 33 | <text class="label">会员编号</text> | ||
| 34 | <text class="value">CTA00004</text> | ||
| 35 | </view> | ||
| 36 | <view class="info-item"> | ||
| 37 | <text class="label">会员有效期</text> | ||
| 38 | <text class="value">2028年1月25日</text> | ||
| 39 | </view> | ||
| 40 | </view> | ||
| 41 | |||
| 42 | <!-- 确定按钮(渐变+动效) --> | ||
| 43 | <view class="confirm-btn-area"> | ||
| 44 | <button class="confirm-btn" @click="handleConfirm">确定</button> | ||
| 45 | </view> | ||
| 46 | </view> | ||
| 47 | </template> | ||
| 48 | |||
| 49 | <script setup> | ||
| 50 | import { onLoad } from '@dcloudio/uni-app' | ||
| 51 | |||
| 52 | // 确定按钮点击事件 | ||
| 53 | const handleConfirm = () => { | ||
| 54 | uni.navigateBack({ delta: 1 }) | ||
| 55 | // 也可跳转首页:uni.redirectTo({ url: '/pages/index/index' }) | ||
| 56 | } | ||
| 57 | |||
| 58 | onLoad((option) => { | ||
| 59 | // 可接收订单参数动态渲染,示例: | ||
| 60 | // if (option.amount) { /* 赋值给金额变量 */ } | ||
| 61 | }) | ||
| 62 | </script> | ||
| 63 | |||
| 64 | <style scoped> | ||
| 65 | /* 全局容器 */ | ||
| 66 | .success-container { | ||
| 67 | display: flex; | ||
| 68 | flex-direction: column; | ||
| 69 | align-items: center; | ||
| 70 | padding: 100rpx 40rpx 60rpx; | ||
| 71 | min-height: 100vh; | ||
| 72 | background-color: #f8f9fa; | ||
| 73 | box-sizing: border-box; | ||
| 74 | } | ||
| 75 | |||
| 76 | /* 成功图标容器 */ | ||
| 77 | .success-icon { | ||
| 78 | margin-bottom: 40rpx; | ||
| 79 | animation: fadeIn 0.6s ease-out; | ||
| 80 | } | ||
| 81 | |||
| 82 | /* 渐变圆形背景 */ | ||
| 83 | .icon-circle { | ||
| 84 | width: 180rpx; | ||
| 85 | height: 180rpx; | ||
| 86 | border-radius: 50%; | ||
| 87 | /* 青绿色渐变 */ | ||
| 88 | background: linear-gradient(135deg, #06c1ae, #04a896); | ||
| 89 | display: flex; | ||
| 90 | align-items: center; | ||
| 91 | justify-content: center; | ||
| 92 | box-shadow: 0 8rpx 30rpx rgba(6, 193, 174, 0.3); | ||
| 93 | /* 轻微上浮动效 */ | ||
| 94 | animation: scaleIn 0.8s ease-out; | ||
| 95 | } | ||
| 96 | |||
| 97 | /* 对勾图标 */ | ||
| 98 | .check-icon { | ||
| 99 | font-size: 90rpx; | ||
| 100 | color: #ffffff; | ||
| 101 | font-weight: bold; | ||
| 102 | } | ||
| 103 | |||
| 104 | /* 支付成功标题 */ | ||
| 105 | .success-title { | ||
| 106 | font-size: 48rpx; | ||
| 107 | font-weight: 700; | ||
| 108 | color: #333333; | ||
| 109 | margin-bottom: 12rpx; | ||
| 110 | animation: slideUp 0.6s ease-out; | ||
| 111 | } | ||
| 112 | |||
| 113 | /* 副标题 */ | ||
| 114 | .success-subtitle { | ||
| 115 | font-size: 28rpx; | ||
| 116 | color: #666666; | ||
| 117 | margin-bottom: 60rpx; | ||
| 118 | animation: slideUp 0.8s ease-out; | ||
| 119 | } | ||
| 120 | |||
| 121 | /* 订单信息卡片 */ | ||
| 122 | .info-card { | ||
| 123 | width: 100%; | ||
| 124 | background: #ffffff; | ||
| 125 | border-radius: 20rpx; | ||
| 126 | padding: 40rpx 30rpx; | ||
| 127 | box-shadow: 0 6rpx 20rpx rgba(0, 0, 0, 0.05); | ||
| 128 | margin-bottom: 80rpx; | ||
| 129 | animation: fadeIn 1s ease-out; | ||
| 130 | } | ||
| 131 | |||
| 132 | /* 单个信息项 */ | ||
| 133 | .info-item { | ||
| 134 | display: flex; | ||
| 135 | justify-content: space-between; | ||
| 136 | align-items: center; | ||
| 137 | padding: 24rpx 0; | ||
| 138 | border-bottom: 1rpx solid #f5f5f5; | ||
| 139 | } | ||
| 140 | /* 最后一项去掉下划线 */ | ||
| 141 | .info-item:last-child { | ||
| 142 | border-bottom: none; | ||
| 143 | } | ||
| 144 | |||
| 145 | /* 标签样式 */ | ||
| 146 | .label { | ||
| 147 | font-size: 32rpx; | ||
| 148 | color: #666666; | ||
| 149 | } | ||
| 150 | |||
| 151 | /* 值样式 */ | ||
| 152 | .value { | ||
| 153 | font-size: 32rpx; | ||
| 154 | color: #333333; | ||
| 155 | text-align: right; | ||
| 156 | } | ||
| 157 | /* 金额特殊样式 */ | ||
| 158 | .amount { | ||
| 159 | color: #cd1e27; | ||
| 160 | font-weight: 600; | ||
| 161 | } | ||
| 162 | |||
| 163 | /* 确定按钮区域 */ | ||
| 164 | .confirm-btn-area { | ||
| 165 | width: 100%; | ||
| 166 | padding: 0 20rpx; | ||
| 167 | box-sizing: border-box; | ||
| 168 | } | ||
| 169 | |||
| 170 | /* 确定按钮(渐变+动效) */ | ||
| 171 | .confirm-btn { | ||
| 172 | width: 100%; | ||
| 173 | height: 90rpx; | ||
| 174 | line-height: 90rpx; | ||
| 175 | /* 按钮渐变背景 */ | ||
| 176 | background: #fff; | ||
| 177 | color: #C4121B; | ||
| 178 | font-size: 36rpx; | ||
| 179 | font-weight: 600; | ||
| 180 | border-radius: 45rpx; | ||
| 181 | border: 1px solid #C4121B; | ||
| 182 | animation: slideUp 1s ease-out; | ||
| 183 | /* 禁止默认样式 */ | ||
| 184 | position: relative; | ||
| 185 | overflow: hidden; | ||
| 186 | } | ||
| 187 | /* 按钮点击反馈 */ | ||
| 188 | .confirm-btn::after { | ||
| 189 | border: none; | ||
| 190 | } | ||
| 191 | .confirm-btn:active { | ||
| 192 | transform: scale(0.98); | ||
| 193 | box-shadow: 0 4rpx 10rpx rgba(6, 193, 174, 0.2); | ||
| 194 | } | ||
| 195 | |||
| 196 | /* 动画定义 */ | ||
| 197 | @keyframes fadeIn { | ||
| 198 | 0% { opacity: 0; } | ||
| 199 | 100% { opacity: 1; } | ||
| 200 | } | ||
| 201 | @keyframes scaleIn { | ||
| 202 | 0% { transform: scale(0); } | ||
| 203 | 70% { transform: scale(1.1); } | ||
| 204 | 100% { transform: scale(1); } | ||
| 205 | } | ||
| 206 | @keyframes slideUp { | ||
| 207 | 0% { opacity: 0; transform: translateY(30rpx); } | ||
| 208 | 100% { opacity: 1; transform: translateY(0); } | ||
| 209 | } | ||
| 210 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -675,6 +675,46 @@ | ... | @@ -675,6 +675,46 @@ |
| 675 | "navigationBarTitleText" : "团体会员缴费", | 675 | "navigationBarTitleText" : "团体会员缴费", |
| 676 | "enablePullDownRefresh" : false | 676 | "enablePullDownRefresh" : false |
| 677 | } | 677 | } |
| 678 | }, | ||
| 679 | { | ||
| 680 | "path" : "goPay", | ||
| 681 | "style" : | ||
| 682 | { | ||
| 683 | "navigationBarTitleText" : "付款详情", | ||
| 684 | "enablePullDownRefresh" : false | ||
| 685 | } | ||
| 686 | }, | ||
| 687 | { | ||
| 688 | "path" : "examPointApply", | ||
| 689 | "style" : | ||
| 690 | { | ||
| 691 | "navigationBarTitleText" : "申请考点", | ||
| 692 | "enablePullDownRefresh" : false | ||
| 693 | } | ||
| 694 | }, | ||
| 695 | { | ||
| 696 | "path" : "chooseExaminer", | ||
| 697 | "style" : | ||
| 698 | { | ||
| 699 | "navigationBarTitleText" : "选择考官", | ||
| 700 | "enablePullDownRefresh" : false | ||
| 701 | } | ||
| 702 | }, | ||
| 703 | { | ||
| 704 | "path" : "sucPay", | ||
| 705 | "style" : | ||
| 706 | { | ||
| 707 | "navigationBarTitleText" : "支付成功", | ||
| 708 | "enablePullDownRefresh" : false | ||
| 709 | } | ||
| 710 | }, | ||
| 711 | { | ||
| 712 | "path" : "payOrder", | ||
| 713 | "style" : | ||
| 714 | { | ||
| 715 | "navigationBarTitleText" : "支付详情", | ||
| 716 | "enablePullDownRefresh" : false | ||
| 717 | } | ||
| 678 | } | 718 | } |
| 679 | ] | 719 | ] |
| 680 | }], | 720 | }], | ... | ... |
| ... | @@ -557,13 +557,48 @@ | ... | @@ -557,13 +557,48 @@ |
| 557 | } | 557 | } |
| 558 | </script> | 558 | </script> |
| 559 | 559 | ||
| 560 | <style lang="scss" scoped> | 560 | <style lang="scss"> |
| 561 | |||
| 562 | /* 字段名左对齐 */ | ||
| 563 | .uni-forms-item .uni-forms-item__label { | ||
| 564 | text-align: left !important; | ||
| 565 | justify-content: flex-start !important; | ||
| 566 | padding-left: 0 !important; | ||
| 567 | width: auto !important; | ||
| 568 | } | ||
| 569 | |||
| 570 | /* 内容右对齐 */ | ||
| 571 | .uni-forms-item .uni-forms-item__content { | ||
| 572 | display: flex !important; | ||
| 573 | align-items: center !important; | ||
| 574 | justify-content: flex-end !important; | ||
| 575 | text-align: right !important; | ||
| 576 | } | ||
| 577 | |||
| 578 | /* 输入框内容右对齐 */ | ||
| 579 | .uni-forms-item .uni-easyinput .uni-easyinput__content-input, | ||
| 580 | .uni-forms-item .uni-easyinput input, | ||
| 581 | .uni-forms-item input, | ||
| 582 | .uni-forms-item .uni-data-select .uni-select__input-box, | ||
| 583 | .uni-forms-item .uni-data-picker .uni-data-picker__input-box { | ||
| 584 | text-align: right !important; | ||
| 585 | } | ||
| 586 | |||
| 587 | /* 文本内容右对齐 */ | ||
| 588 | .uni-forms-item .uni-forms-item__content text, | ||
| 589 | .uni-forms-item .uni-forms-item__content > text { | ||
| 590 | text-align: right !important; | ||
| 591 | width: 100%; | ||
| 592 | display: block; | ||
| 593 | } | ||
| 594 | |||
| 595 | /* 覆盖原有样式 */ | ||
| 561 | :deep(.uni-forms-item__content) { | 596 | :deep(.uni-forms-item__content) { |
| 562 | display: flex; | 597 | justify-content: flex-end !important; |
| 563 | align-items: center; | ||
| 564 | justify-content: flex-end; | ||
| 565 | } | 598 | } |
| 599 | </style> | ||
| 566 | 600 | ||
| 601 | <style lang="scss" scoped> | ||
| 567 | :deep(.segmented-control) { | 602 | :deep(.segmented-control) { |
| 568 | height: 100rpx; | 603 | height: 100rpx; |
| 569 | } | 604 | } | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <view> | 2 | <!-- 根容器:弹窗时强制固定定位,彻底锁死滚动 --> |
| 3 | <!-- <uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem" | 3 | <view class="container" :class="{ 'lock-scroll': showModal }"> |
| 4 | styleType="text" activeColor="#AD181F"></uni-segmented-control> --> | 4 | <!-- 搜索栏 --> |
| 5 | <view class="searchbar"> | 5 | <view class="search-bar"> |
| 6 | <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search" | 6 | <uni-easyinput |
| 7 | v-model="queryParams.paymentName" placeholder="搜索缴费名称" @blur="getList" @clear="getList"> | 7 | class="search-input" |
| 8 | placeholderStyle="font-size:30rpx;color:#999" | ||
| 9 | :input-border="false" | ||
| 10 | prefixIcon="search" | ||
| 11 | v-model="queryParams.memName" | ||
| 12 | placeholder="搜索缴费名称" | ||
| 13 | @blur="getList" | ||
| 14 | @clear="getList"> | ||
| 8 | </uni-easyinput> | 15 | </uni-easyinput> |
| 9 | <view class="invertedbtn-red" @click="goAdd">+ 新建缴费</view> | 16 | <view class="add-btn" @click="goAdd"> |
| 17 | <text class="add-icon">+</text> | ||
| 18 | <text class="add-text">新建缴费</text> | ||
| 19 | </view> | ||
| 10 | </view> | 20 | </view> |
| 11 | 21 | ||
| 12 | <!-- 会员缴费 --> | 22 | <!-- 1. 新增:审核状态筛选 Tab --> |
| 13 | <view class="appList"> | 23 | <view class="status-tabs"> |
| 14 | <view class="appItem" v-for="(item,index) in list" :key="index"> | 24 | <view class="tab-item" :class="{ active: activeTab === '' }" @click="switchTab('')">全部</view> |
| 15 | <view class="status" @click="goDetail(item)"> | 25 | <view class="tab-item" :class="{ active: activeTab === 0 }" @click="switchTab(0)">待提交</view> |
| 16 | <text v-if="item.status==0" class="text-primary"></text> | 26 | <view class="tab-item" :class="{ active: activeTab === 1 }" @click="switchTab(1)">审核中</view> |
| 17 | <text v-if="item.status==1" class="text-primary">审核中</text> | 27 | <view class="tab-item" :class="{ active: activeTab === 2 }" @click="switchTab(2)">审核通过</view> |
| 18 | <text v-if="item.status==2" class="text-success"> 审核通过</text> | 28 | <view class="tab-item" :class="{ active: activeTab === 3 }" @click="switchTab(3)">审核拒绝</view> |
| 19 | <text v-if="item.status==3" class="text-danger"> 审核拒绝</text> | ||
| 20 | <text v-if="item.status==4" class="text-warning">已撤回</text> | ||
| 21 | </view> | 29 | </view> |
| 22 | <view class="date" @click="goDetail(item)" v-if="item.commitTime"> | 30 | |
| 23 | <uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons> | 31 | <!-- 会员缴费列表 --> |
| 24 | {{item.commitTime}} 提交 | 32 | <view class="list-container" v-if="list.length > 0"> |
| 33 | <view class="list-item" v-for="(item, index) in list" :key="index" @click="goDetail(item)"> | ||
| 34 | <view class="item-header"> | ||
| 35 | <view class="left-info"> | ||
| 36 | <text class="mem-name">{{ item.memName }}</text> | ||
| 37 | <text class="wf-code" v-if="item.wfCode">{{ item.wfCode }}</text> | ||
| 25 | </view> | 38 | </view> |
| 26 | <view class="text-primary" v-if="item.wfCode">{{item.wfCode}}</view> | 39 | <view class="status-badge" :class="getStatusClass(item.auditStatus)"> |
| 27 | <view class="date" @click="goDetail(item)">{{item.paymentName}}</view> | 40 | {{ getStatusText(item.auditStatus) }} |
| 28 | <view class="flexbox" @click="goDetail(item)"> | ||
| 29 | <view> | ||
| 30 | 人数合计 | ||
| 31 | <view>{{item.personCount}}</view> | ||
| 32 | </view> | 41 | </view> |
| 33 | <view> | ||
| 34 | 新会员合计 | ||
| 35 | <view>{{item.newPersonCount}}</view> | ||
| 36 | </view> | 42 | </view> |
| 37 | <view> | 43 | |
| 38 | 年限合计 | 44 | <view class="stats-row"> |
| 39 | <view>{{item.totalYear}}</view> | 45 | <view class="stat-item"> |
| 46 | <text class="stat-label">人数合计</text> | ||
| 47 | <text class="stat-value">{{ item.allCount || 0 }}</text> | ||
| 40 | </view> | 48 | </view> |
| 49 | <view class="stat-item"> | ||
| 50 | <text class="stat-label">新会员合计</text> | ||
| 51 | <text class="stat-value">{{ item.newCount || 0 }}</text> | ||
| 41 | </view> | 52 | </view> |
| 42 | <view class="func" v-if="item.status==0||item.status==3||item.status==4"> | 53 | <view class="stat-item"> |
| 43 | <button @click="handleDel(item)">删除</button> | 54 | <text class="stat-label">年限合计</text> |
| 44 | <button @click="handleUpdate(item)">编辑</button> | 55 | <text class="stat-value">{{ item.yearCount || 0 }}</text> |
| 45 | <button @click="commitFN(item)">提交审核</button> | ||
| 46 | </view> | 56 | </view> |
| 47 | </view> | 57 | </view> |
| 58 | |||
| 59 | <view class="submit-time" v-if="item.commitTime"> | ||
| 60 | <uni-icons type="calendar-filled" size="16" color="#AD181F"></uni-icons> | ||
| 61 | <text class="time-text">{{ item.commitTime }} 提交</text> | ||
| 62 | </view> | ||
| 63 | |||
| 64 | <view class="action-buttons"> | ||
| 65 | <button | ||
| 66 | class="action-btn delete-btn" | ||
| 67 | @click.stop="handleDel(item)" | ||
| 68 | :disabled="item.auditStatus == 1 || item.auditStatus == 9"> | ||
| 69 | 删除 | ||
| 70 | </button> | ||
| 71 | <button | ||
| 72 | class="action-btn edit-btn" | ||
| 73 | @click.stop="handleUpdate(item)" | ||
| 74 | :disabled="item.auditStatus != 0"> | ||
| 75 | 编辑 | ||
| 76 | </button> | ||
| 77 | <button | ||
| 78 | class="action-btn submit-btn" | ||
| 79 | @click.stop="commitFN(item)" | ||
| 80 | :disabled="item.auditStatus != 0"> | ||
| 81 | 提交审核 | ||
| 82 | </button> | ||
| 83 | </view> | ||
| 84 | </view> | ||
| 85 | </view> | ||
| 86 | |||
| 87 | <!-- 空数据状态 --> | ||
| 88 | <view class="empty-state" v-else> | ||
| 89 | <image mode="aspectFit" src="/static/nodata.png" class="empty-icon"></image> | ||
| 90 | <text class="empty-text">暂无数据</text> | ||
| 91 | </view> | ||
| 92 | |||
| 93 | <view | ||
| 94 | class="modal-mask" | ||
| 95 | v-show="showModal" | ||
| 96 | @click="closeModal" | ||
| 97 | @touchmove.stop.prevent="() => {}" | ||
| 98 | :style="{ display: showModal ? 'flex' : 'none' }" | ||
| 99 | > | ||
| 100 | <view | ||
| 101 | class="modal-box" | ||
| 102 | @click.stop | ||
| 103 | @touchmove.stop.prevent="() => {}" | ||
| 104 | > | ||
| 105 | <view class="modal-title">提示</view> | ||
| 106 | <view class="modal-con">{{ modalTitle }}</view> | ||
| 107 | <view class="modal-buttons"> | ||
| 108 | <view class="btn-cancel" @click="closeModal">取消</view> | ||
| 109 | <view class="btn-confirm" @click="confirmModal">确定</view> | ||
| 110 | </view> | ||
| 48 | </view> | 111 | </view> |
| 49 | <view class="nodata" v-if="list.length==0"> | ||
| 50 | <image mode="aspectFit" src="/static/nodata.png"></image> | ||
| 51 | <text>暂无数据</text> | ||
| 52 | </view> | 112 | </view> |
| 53 | </view> | 113 | </view> |
| 54 | </template> | 114 | </template> |
| 55 | 115 | ||
| 56 | <script setup> | 116 | <script setup> |
| 57 | import * as api from '@/common/api.js' | 117 | import * as api from '@/common/api.js' |
| 58 | import config from '@/config.js' | 118 | import config from '@/config.js' |
| 59 | import { | 119 | import { ref, onUnmounted } from 'vue' |
| 60 | ref | 120 | import { onLoad, onShow, onReady } from '@dcloudio/uni-app' |
| 61 | } from 'vue' | 121 | |
| 62 | import { | 122 | const queryParams = ref({}) |
| 63 | onLoad, | 123 | const list = ref([]) |
| 64 | onShow | 124 | const total = ref(0) |
| 65 | } from '@dcloudio/uni-app' | 125 | // 新增:状态 Tab 激活项 |
| 66 | const app = getApp() | 126 | const activeTab = ref('') |
| 67 | const queryParams = ref({ | 127 | |
| 68 | // pageNum: 1, | 128 | // ========== 1. 彻底解决弹窗默认显示 ========== |
| 69 | // pageSize: 10 | 129 | let showModal = ref(false) |
| 70 | }) | 130 | onLoad(() => { |
| 71 | const list = ref([]) | 131 | showModal.value = false |
| 72 | const total = ref(0) | 132 | }) |
| 73 | const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝']) | 133 | onReady(() => { |
| 74 | onShow(() => { | 134 | showModal.value = false |
| 135 | }) | ||
| 136 | onShow(() => { | ||
| 137 | showModal.value = false | ||
| 75 | getList() | 138 | getList() |
| 76 | }) | 139 | }) |
| 140 | |||
| 141 | const modalTitle = ref('') | ||
| 142 | let confirmCallback = null | ||
| 143 | |||
| 144 | // ========== 2. 移除所有 uni.setPageScrollEnabled 调用 ========== | ||
| 145 | onUnmounted(() => { | ||
| 146 | showModal.value = false | ||
| 147 | }) | ||
| 77 | 148 | ||
| 78 | function getList() { | 149 | // 新增:状态 Tab 切换 |
| 150 | function switchTab(status) { | ||
| 151 | activeTab.value = status | ||
| 152 | if (status === '') { | ||
| 153 | delete queryParams.value.auditStatus | ||
| 154 | } else { | ||
| 155 | queryParams.value.auditStatus = status | ||
| 156 | } | ||
| 157 | getList() | ||
| 158 | } | ||
| 159 | |||
| 160 | function getList() { | ||
| 79 | api.getPaymentList(queryParams.value).then(res => { | 161 | api.getPaymentList(queryParams.value).then(res => { |
| 80 | list.value = res.rows | 162 | list.value = res.rows || [] |
| 81 | total.value = res.total | 163 | total.value = res.total || 0 |
| 82 | }) | 164 | }) |
| 83 | } | 165 | } |
| 84 | 166 | ||
| 85 | function goDetail(item) { | 167 | function goDetail(item) { |
| 86 | const form = encodeURIComponent(JSON.stringify(item)) | 168 | const form = encodeURIComponent(JSON.stringify(item)) |
| 87 | let path = `/personalVip/paymentDetail?form=${form}` | 169 | let path = `/personalVip/paymentDetail?form=${form}` |
| 88 | uni.navigateTo({ | 170 | uni.navigateTo({ url: path }) |
| 89 | url: path | 171 | } |
| 90 | }); | ||
| 91 | } | ||
| 92 | 172 | ||
| 93 | function handleUpdate(item) { | 173 | function handleUpdate(item) { |
| 94 | let path = `/personalVip/renew?rangeId=${item.rangId}` | 174 | let path = `/personalVip/renew?rangeId=${item.rangId}` |
| 95 | uni.navigateTo({ | 175 | uni.navigateTo({ url: path }) |
| 96 | url: path | 176 | } |
| 97 | }); | 177 | |
| 98 | } | 178 | // 打开弹窗:只控制弹窗显示,滚动锁定交给 CSS |
| 99 | function handleDel(row){ | 179 | function openModal(title, callback) { |
| 100 | uni.showModal({ | 180 | modalTitle.value = title |
| 101 | title: '提示', | 181 | showModal.value = true |
| 102 | content: `确定删除${row.paymentName}吗`, | 182 | confirmCallback = callback |
| 103 | success: function(res) { | 183 | } |
| 104 | if (res.confirm) { | 184 | |
| 105 | uni.showLoading({ | 185 | // 关闭弹窗:只控制弹窗隐藏,滚动恢复交给 CSS |
| 106 | icon: 'none', | 186 | function closeModal() { |
| 107 | title: '请求中' | 187 | showModal.value = false |
| 108 | }) | 188 | confirmCallback = null |
| 109 | api.paymentDel(row.rangId).then(res => { | 189 | } |
| 190 | |||
| 191 | function confirmModal() { | ||
| 192 | if (confirmCallback) confirmCallback() | ||
| 193 | closeModal() | ||
| 194 | } | ||
| 195 | |||
| 196 | // 删除 | ||
| 197 | function handleDel(row) { | ||
| 198 | showModal.value = false | ||
| 199 | openModal(`是否确认删除缴费编号为"${row.wfCode}"的数据项?`, () => { | ||
| 200 | uni.showLoading({ title: '删除中', mask: true }) | ||
| 201 | api.paymentDel(row.rangId).then(() => { | ||
| 110 | uni.hideLoading() | 202 | uni.hideLoading() |
| 111 | uni.showToast({ | 203 | uni.showToast({ title: '删除成功' }) |
| 112 | title: '操作成功' | ||
| 113 | }) | ||
| 114 | getList() | 204 | getList() |
| 115 | }) | 205 | }) |
| 116 | } | ||
| 117 | } | ||
| 118 | }) | ||
| 119 | } | ||
| 120 | function commitFN(row) { | ||
| 121 | uni.showModal({ | ||
| 122 | title: '提示', | ||
| 123 | content: `确定提交${row.paymentName}吗`, | ||
| 124 | success: function(res) { | ||
| 125 | if (res.confirm) { | ||
| 126 | uni.showLoading({ | ||
| 127 | icon: 'none', | ||
| 128 | title: '提交中', | ||
| 129 | mask: true | ||
| 130 | }) | ||
| 131 | api.personalCommit(row.rangId).then(res => { | ||
| 132 | uni.hideLoading() | ||
| 133 | uni.showToast({ | ||
| 134 | title: '提交成功' | ||
| 135 | }) | ||
| 136 | getList() | ||
| 137 | }) | 206 | }) |
| 138 | } | 207 | } |
| 139 | } | 208 | |
| 209 | // 提交审核 | ||
| 210 | function commitFN(row) { | ||
| 211 | uni.navigateTo({ | ||
| 212 | url: `/myCenter/payOrder?rangeId=${row.rangId}` | ||
| 140 | }) | 213 | }) |
| 214 | } | ||
| 141 | 215 | ||
| 216 | async function goAdd() { | ||
| 217 | const res = await api.createMemberPayRange() | ||
| 218 | if (res.data) { | ||
| 219 | let path = `/personalVip/renew?rangeId=${res.data}` | ||
| 220 | uni.navigateTo({ url: path }) | ||
| 221 | } | ||
| 222 | } | ||
| 142 | 223 | ||
| 224 | function getStatusText(status) { | ||
| 225 | const statusMap = { | ||
| 226 | 0: '待提交', | ||
| 227 | 1: '审核中', | ||
| 228 | 2: '审核通过', | ||
| 229 | 3: '审核拒绝', | ||
| 230 | 9: '缴费中' | ||
| 143 | } | 231 | } |
| 232 | return statusMap[status] || '未知状态' | ||
| 233 | } | ||
| 144 | 234 | ||
| 145 | function goAdd() { | 235 | function getStatusClass(status) { |
| 146 | let path = `/personalVip/renew` | 236 | const classMap = { |
| 147 | uni.navigateTo({ | 237 | 0: 'status-pending', |
| 148 | url: path | 238 | 1: 'status-processing', |
| 149 | }); | 239 | 2: 'status-success', |
| 240 | 3: 'status-rejected', | ||
| 241 | 9: 'status-withdrawn' | ||
| 150 | } | 242 | } |
| 243 | return classMap[status] || 'status-default' | ||
| 244 | } | ||
| 151 | </script> | 245 | </script> |
| 152 | 246 | ||
| 153 | <style lang="scss" scoped> | 247 | <style lang="scss" scoped> |
| 154 | .searchbar { | 248 | /* 核心:锁死滚动的样式(优先级最高) */ |
| 249 | .container { | ||
| 250 | min-height: 100vh; | ||
| 251 | background-color: #f8f9fa; | ||
| 252 | padding-bottom: 60rpx; | ||
| 253 | transition: all 0.2s ease; | ||
| 254 | } | ||
| 255 | /* 弹窗时强制固定定位,彻底禁止滚动(纯 CSS 实现,不依赖 API) */ | ||
| 256 | .container.lock-scroll { | ||
| 257 | position: fixed; | ||
| 258 | top: 0; | ||
| 259 | left: 0; | ||
| 260 | right: 0; | ||
| 261 | bottom: 0; | ||
| 262 | overflow: hidden !important; | ||
| 263 | } | ||
| 264 | |||
| 265 | /* 搜索栏 */ | ||
| 266 | .search-bar { | ||
| 155 | display: flex; | 267 | display: flex; |
| 156 | align-items: center; | 268 | align-items: center; |
| 157 | padding: 25rpx; | 269 | padding: 20rpx 30rpx; |
| 158 | box-sizing: border-box; | 270 | background-color: #ffffff; |
| 271 | margin-bottom: 24rpx; | ||
| 272 | box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.04); | ||
| 159 | 273 | ||
| 160 | :deep(.uni-easyinput .uni-easyinput__content) { | 274 | .search-input { |
| 161 | border-radius: 35rpx; | 275 | flex: 1; |
| 162 | border: none; | 276 | margin-right: 20rpx; |
| 163 | height: 70rpx; | 277 | |
| 278 | :deep(.uni-easyinput__content) { | ||
| 279 | border-radius: 40rpx; | ||
| 280 | background-color: #f5f7fa; | ||
| 281 | height: 76rpx; | ||
| 282 | padding: 0 24rpx; | ||
| 283 | transition: all 0.3s ease; | ||
| 164 | } | 284 | } |
| 165 | 285 | ||
| 166 | :deep(.uni-easyinput__content-input) { | 286 | :deep(.uni-easyinput__content-input) { |
| 287 | font-size: 28rpx; | ||
| 288 | color: #333; | ||
| 289 | letter-spacing: 0.5rpx; | ||
| 290 | } | ||
| 291 | |||
| 292 | :deep(.uni-easyinput__content):focus-within { | ||
| 293 | background-color: #f0f2f5; | ||
| 294 | box-shadow: 0 0 0 2rpx rgba(173, 24, 31, 0.1); | ||
| 295 | } | ||
| 296 | } | ||
| 297 | |||
| 298 | .add-btn { | ||
| 299 | display: flex; | ||
| 300 | align-items: center; | ||
| 301 | padding: 10rpx 30rpx; | ||
| 302 | background-color: #AD181F; | ||
| 303 | border-radius: 40rpx; | ||
| 304 | font-size: 28rpx; | ||
| 305 | color: #ffffff; | ||
| 306 | box-shadow: 0 4rpx 12rpx rgba(173, 24, 31, 0.2); | ||
| 307 | transition: all 0.2s ease; | ||
| 308 | |||
| 309 | &:active { | ||
| 310 | transform: scale(0.96); | ||
| 311 | box-shadow: 0 2rpx 8rpx rgba(173, 24, 31, 0.15); | ||
| 312 | } | ||
| 313 | |||
| 314 | .add-icon { | ||
| 315 | font-size: 36rpx; | ||
| 316 | margin-right: 10rpx; | ||
| 317 | font-weight: bold; | ||
| 318 | } | ||
| 319 | } | ||
| 320 | } | ||
| 321 | |||
| 322 | /* 1. 新增:审核状态筛选 Tab 样式 */ | ||
| 323 | .status-tabs { | ||
| 324 | display: flex; | ||
| 325 | background: #fff; | ||
| 326 | padding: 0 30rpx; | ||
| 327 | margin-bottom: 20rpx; | ||
| 328 | |||
| 329 | .tab-item { | ||
| 330 | flex: 1; | ||
| 331 | text-align: center; | ||
| 332 | height: 70rpx; | ||
| 333 | line-height: 70rpx; | ||
| 167 | font-size: 26rpx; | 334 | font-size: 26rpx; |
| 335 | color: #666; | ||
| 336 | position: relative; | ||
| 337 | |||
| 338 | &.active { | ||
| 339 | color: #AD181F; | ||
| 340 | font-weight: 600; | ||
| 341 | |||
| 342 | &::after { | ||
| 343 | content: ""; | ||
| 344 | position: absolute; | ||
| 345 | bottom: 0; | ||
| 346 | left: 50%; | ||
| 347 | transform: translateX(-50%); | ||
| 348 | width: 40rpx; | ||
| 349 | height: 6rpx; | ||
| 350 | background: #AD181F; | ||
| 351 | border-radius: 3rpx; | ||
| 352 | } | ||
| 353 | } | ||
| 354 | } | ||
| 355 | } | ||
| 356 | |||
| 357 | /* 列表容器 */ | ||
| 358 | .list-container { | ||
| 359 | padding: 0 30rpx; | ||
| 360 | } | ||
| 361 | |||
| 362 | /* 列表项 */ | ||
| 363 | .list-item { | ||
| 364 | background: #ffffff; | ||
| 365 | border-radius: 24rpx; | ||
| 366 | padding: 36rpx 32rpx; | ||
| 367 | margin-bottom: 24rpx; | ||
| 368 | box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05); | ||
| 369 | transition: all 0.2s ease; | ||
| 370 | |||
| 371 | &:active { | ||
| 372 | transform: translateY(2rpx); | ||
| 373 | box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); | ||
| 168 | } | 374 | } |
| 375 | } | ||
| 169 | 376 | ||
| 170 | .invertedbtn-red { | 377 | .item-header { |
| 171 | border-radius: 50px; | 378 | display: flex; |
| 172 | background-color: #fff; | 379 | justify-content: space-between; |
| 380 | align-items: center; | ||
| 381 | margin-bottom: 30rpx; | ||
| 382 | |||
| 383 | .left-info { | ||
| 384 | display: flex; | ||
| 385 | align-items: center; | ||
| 386 | flex:1; | ||
| 387 | flex-wrap: wrap; | ||
| 388 | } | ||
| 389 | |||
| 390 | .mem-name { | ||
| 391 | font-size:34rpx; | ||
| 392 | font-weight:600; | ||
| 393 | color:#1a1a1a; | ||
| 394 | margin-right:16rpx; | ||
| 395 | letter-spacing: 0.8rpx; | ||
| 396 | } | ||
| 173 | 397 | ||
| 174 | font-size: 30rpx; | 398 | .wf-code { |
| 175 | padding: 10rpx 20rpx; | 399 | font-size:24rpx; |
| 400 | color:#666; | ||
| 401 | background:#f0f8fb; | ||
| 402 | padding:6rpx 12rpx; | ||
| 403 | border-radius: 16rpx; | ||
| 404 | margin-top: 4rpx; | ||
| 176 | } | 405 | } |
| 406 | |||
| 407 | .status-badge { | ||
| 408 | font-size:24rpx; | ||
| 409 | padding:8rpx 16rpx; | ||
| 410 | border-radius: 20rpx; | ||
| 411 | font-weight: 500; | ||
| 412 | letter-spacing: 0.5rpx; | ||
| 413 | } | ||
| 414 | } | ||
| 415 | |||
| 416 | /* 状态徽章 */ | ||
| 417 | .status-pending { background:#f5f5f5; color:#888; } | ||
| 418 | .status-processing { background:#e8e8ff; color:#1890ff; } | ||
| 419 | .status-success { background:#f0fff4; color:#52c41a; } | ||
| 420 | .status-rejected { background:#fff2f2; color:#ff4d4f; } | ||
| 421 | .status-withdrawn { background:#fffbe6; color:#faad14; } | ||
| 422 | .status-default { background:#f5f5f5; color:#999; } | ||
| 423 | |||
| 424 | /* 数据统计 */ | ||
| 425 | .stats-row { | ||
| 426 | display: flex; | ||
| 427 | justify-content: space-between; | ||
| 428 | padding-bottom: 24rpx; | ||
| 429 | |||
| 430 | .stat-item { | ||
| 431 | display: flex; | ||
| 432 | flex-direction: column; | ||
| 433 | align-items: center; | ||
| 434 | flex:1; | ||
| 435 | |||
| 436 | .stat-label { | ||
| 437 | font-size:24rpx; | ||
| 438 | color:#999; | ||
| 439 | margin-bottom:10rpx; | ||
| 440 | letter-spacing: 0.5rpx; | ||
| 441 | } | ||
| 442 | |||
| 443 | .stat-value { | ||
| 444 | font-size:32rpx; | ||
| 445 | font-weight:700; | ||
| 446 | color:#333; | ||
| 447 | } | ||
| 448 | } | ||
| 449 | } | ||
| 450 | |||
| 451 | /* 提交时间 */ | ||
| 452 | .submit-time { | ||
| 453 | display: flex; | ||
| 454 | align-items: center; | ||
| 455 | padding-bottom: 20rpx; | ||
| 456 | |||
| 457 | .time-text { | ||
| 458 | font-size:24rpx; | ||
| 459 | color:#666; | ||
| 460 | margin-left:20rpx; | ||
| 461 | letter-spacing: 0.3rpx; | ||
| 462 | } | ||
| 463 | } | ||
| 464 | |||
| 465 | /* 操作按钮 */ | ||
| 466 | .action-buttons { | ||
| 467 | display: flex; | ||
| 468 | |||
| 469 | .action-btn { | ||
| 470 | flex:1; | ||
| 471 | height:60rpx; | ||
| 472 | line-height:60rpx; | ||
| 473 | font-size:26rpx; | ||
| 474 | border-radius:40rpx; | ||
| 475 | margin:0 8rpx; | ||
| 476 | border:none; | ||
| 477 | font-weight: 500; | ||
| 478 | letter-spacing: 0.8rpx; | ||
| 479 | transition: all 0.2s ease; | ||
| 480 | |||
| 481 | |||
| 482 | /* 2. 强化:按钮禁用样式(一眼能看出不可用) */ | ||
| 483 | &:disabled { | ||
| 484 | background: #f0f0f0 !important; | ||
| 485 | color: #ccc !important; | ||
| 486 | cursor: not-allowed; | ||
| 487 | transform: none !important; | ||
| 488 | opacity: 1 !important; | ||
| 489 | } | ||
| 490 | } | ||
| 491 | .action-btn[disabled] { | ||
| 492 | background: #f0f0f0 !important; | ||
| 493 | color: #cccccc !important; | ||
| 494 | opacity: 1 !important; | ||
| 495 | cursor: not-allowed; | ||
| 496 | transform: none !important; | ||
| 497 | } | ||
| 498 | |||
| 499 | .delete-btn { | ||
| 500 | background:#fff2f2; | ||
| 501 | color:#ff4d4f; | ||
| 502 | } | ||
| 503 | .edit-btn { | ||
| 504 | background:#e8f4ff; | ||
| 505 | color:#1890ff; | ||
| 506 | } | ||
| 507 | .submit-btn { | ||
| 508 | background:#fffbe6; | ||
| 509 | color:#faad14; | ||
| 510 | } | ||
| 511 | } | ||
| 512 | |||
| 513 | /* 空数据 */ | ||
| 514 | .empty-state { | ||
| 515 | display: flex; | ||
| 516 | flex-direction: column; | ||
| 517 | align-items: center; | ||
| 518 | padding:160rpx 40rpx 0; | ||
| 519 | |||
| 520 | .empty-icon { | ||
| 521 | width:240rpx; | ||
| 522 | height:240rpx; | ||
| 523 | margin-bottom:40rpx; | ||
| 524 | opacity:0.5; | ||
| 525 | } | ||
| 526 | |||
| 527 | .empty-text { | ||
| 528 | font-size:30rpx; | ||
| 529 | color:#999; | ||
| 530 | letter-spacing: 1rpx; | ||
| 531 | } | ||
| 532 | } | ||
| 533 | |||
| 534 | /* 弹窗:最高优先级样式 */ | ||
| 535 | .modal-mask { | ||
| 536 | position: fixed; | ||
| 537 | top: 0; | ||
| 538 | left: 0; | ||
| 539 | right: 0; | ||
| 540 | bottom: 0; | ||
| 541 | background: rgba(0, 0, 0, 0.7); | ||
| 542 | display: flex; | ||
| 543 | align-items: center; | ||
| 544 | justify-content: center; | ||
| 545 | z-index: 99999 !important; /* 最高层级 */ | ||
| 546 | backdrop-filter: blur(4rpx); | ||
| 547 | touch-action: none !important; /* 禁止触摸 */ | ||
| 548 | pointer-events: auto !important; /* 强制可点击 */ | ||
| 549 | } | ||
| 550 | |||
| 551 | .modal-box { | ||
| 552 | width: 85%; | ||
| 553 | max-width: 580rpx; | ||
| 554 | background: #ffffff; | ||
| 555 | border-radius: 32rpx; | ||
| 556 | padding: 60rpx 40rpx 50rpx; | ||
| 557 | box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.15); | ||
| 558 | touch-action: none !important; | ||
| 559 | pointer-events: auto !important; | ||
| 560 | } | ||
| 561 | .modal-con { | ||
| 562 | text-align: center; | ||
| 563 | font-size: 32rpx; | ||
| 564 | // font-weight: 600; | ||
| 565 | color: #333; | ||
| 566 | margin-bottom: 50rpx; | ||
| 567 | letter-spacing: 1rpx; | ||
| 568 | line-height: 1.4; | ||
| 569 | } | ||
| 570 | .modal-title { | ||
| 571 | text-align: center; | ||
| 572 | font-size: 32rpx; | ||
| 573 | // font-weight: 600; | ||
| 574 | color: #333; | ||
| 575 | margin-bottom: 20rpx; | ||
| 576 | letter-spacing: 1rpx; | ||
| 577 | line-height: 1.4; | ||
| 578 | } | ||
| 579 | |||
| 580 | .modal-buttons { | ||
| 581 | display: flex; | ||
| 582 | gap: 24rpx; | ||
| 583 | } | ||
| 584 | |||
| 585 | .btn-cancel { | ||
| 586 | flex: 1; | ||
| 587 | height: 92rpx; | ||
| 588 | line-height: 92rpx; | ||
| 589 | text-align: center; | ||
| 590 | font-size: 32rpx; | ||
| 591 | color: #666; | ||
| 592 | background: #f5f7fa; | ||
| 593 | border-radius: 46rpx; | ||
| 594 | transition: all 0.2s ease; | ||
| 595 | |||
| 596 | &:active { | ||
| 597 | background: #e8e8e8; | ||
| 598 | } | ||
| 599 | } | ||
| 600 | |||
| 601 | .btn-confirm { | ||
| 602 | flex: 1; | ||
| 603 | height: 92rpx; | ||
| 604 | line-height: 92rpx; | ||
| 605 | text-align: center; | ||
| 606 | font-size: 32rpx; | ||
| 607 | color: #fff; | ||
| 608 | background: linear-gradient(135deg, #AD181F 0%, #c92028 100%); | ||
| 609 | border-radius: 46rpx; | ||
| 610 | font-weight: 600; | ||
| 611 | box-shadow: 0 6rpx 16rpx rgba(173, 24, 31, 0.25); | ||
| 612 | transition: all 0.2s ease; | ||
| 613 | |||
| 614 | &:active { | ||
| 615 | transform: scale(0.96); | ||
| 616 | box-shadow: 0 4rpx 12rpx rgba(173, 24, 31, 0.2); | ||
| 177 | } | 617 | } |
| 618 | } | ||
| 178 | </style> | 619 | </style> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -5,25 +5,23 @@ | ... | @@ -5,25 +5,23 @@ |
| 5 | <view class="info"> | 5 | <view class="info"> |
| 6 | <view>共<text>{{list.length}}</text>人</view> | 6 | <view>共<text>{{list.length}}</text>人</view> |
| 7 | </view> | 7 | </view> |
| 8 | <!-- 成员 --> | ||
| 9 | <view class="userlist"> | 8 | <view class="userlist"> |
| 10 | <view class="item" v-for="(n,index) in list" :key="index"> | 9 | <view class="item" v-for="(n,index) in list" :key="index"> |
| 11 | <view> | 10 | <view> |
| 12 | <view class="name">{{n.personName}}<text>({{n.memberInfoName}})</text></view> | 11 | <view class="name">{{n.perName}}<text v-if="n.memberInfoName">({{n.memberInfoName || ''}})</text></view> |
| 13 | <view class="date">原有效期至 {{n.originValidityDate?.slice(0,10)||'--'}}</view> | 12 | <view class="date">原有效期至 {{n.originValidityDate ? n.originValidityDate.slice(0,10) : '--'}}</view> |
| 14 | </view> | 13 | </view> |
| 15 | <view class="nian"> | 14 | <view class="nian"> |
| 16 | {{n.payYear}}年 | 15 | {{n.payYear}}年 |
| 17 | </view> | 16 | </view> |
| 18 | </view> | 17 | </view> |
| 19 | </view> | 18 | </view> |
| 20 | |||
| 21 | </view> | 19 | </view> |
| 22 | 20 | ||
| 23 | <view class="h3-padding" v-if="feelList.length>0">审核流程</view> | 21 | <view class="h3-padding" v-if="feelList.length>0">审核流程</view> |
| 24 | <view class="wBox" v-if="feelList.length>0"> | 22 | <view class="wBox" v-if="feelList.length>0"> |
| 25 | <view class="stepItem" v-for="(n,index) in feelList" :key="index"> | 23 | <view class="stepItem" v-for="(n,index) in feelList" :key="index"> |
| 26 | <view class="time">{{n.auditTime||'待审批'}}</view> | 24 | <view class="time">{{n.auditTime || '待审批'}}</view> |
| 27 | <view class="content"> | 25 | <view class="content"> |
| 28 | <view class="status"> | 26 | <view class="status"> |
| 29 | <text v-if="n.auditResult==0" class="text-primary"> 审核中</text> | 27 | <text v-if="n.auditResult==0" class="text-primary"> 审核中</text> |
| ... | @@ -32,10 +30,8 @@ | ... | @@ -32,10 +30,8 @@ |
| 32 | <text v-if="n.auditResult==3" class="text-warning"> 已撤回</text> | 30 | <text v-if="n.auditResult==3" class="text-warning"> 已撤回</text> |
| 33 | </view> | 31 | </view> |
| 34 | <view class="name">第 {{index+1}} 步</view> | 32 | <view class="name">第 {{index+1}} 步</view> |
| 35 | <view class="deptName">{{n.auditDeptName||n.auditBy}}</view> | 33 | <view class="deptName">{{n.auditDeptName || n.auditBy}}</view> |
| 36 | <view> | 34 | <view>备注:{{n.auditMsg || '/' }}</view> |
| 37 | 备注:{{n.auditMsg||'/' }} | ||
| 38 | </view> | ||
| 39 | </view> | 35 | </view> |
| 40 | </view> | 36 | </view> |
| 41 | </view> | 37 | </view> |
| ... | @@ -44,47 +40,48 @@ | ... | @@ -44,47 +40,48 @@ |
| 44 | 40 | ||
| 45 | <script setup> | 41 | <script setup> |
| 46 | import * as api from '@/common/api.js' | 42 | import * as api from '@/common/api.js' |
| 47 | import config from '@/config.js' | 43 | import { ref } from 'vue' |
| 48 | import { | 44 | import { onLoad } from '@dcloudio/uni-app' |
| 49 | onMounted, | 45 | |
| 50 | ref | 46 | // 查询参数(和PC保持一致) |
| 51 | } from 'vue' | ||
| 52 | import { | ||
| 53 | onLoad | ||
| 54 | } from '@dcloudio/uni-app' | ||
| 55 | const queryParams = ref({ | 47 | const queryParams = ref({ |
| 56 | // pageNum: 1, | 48 | rangeId: '', |
| 57 | // pageSize: 10 | 49 | pageNum: 1, |
| 50 | pageSize: 999 | ||
| 58 | }) | 51 | }) |
| 59 | const wfCode = ref('') | 52 | |
| 60 | const form = ref([]) | 53 | const form = ref({}) |
| 61 | const list = ref([]) | 54 | const list = ref([]) |
| 62 | const feelList = ref([]) | 55 | const feelList = ref([]) |
| 63 | const total = ref(0) | 56 | |
| 64 | onLoad((option) => { | 57 | onLoad((option) => { |
| 65 | if ('form' in option) { | 58 | if (option.form) { |
| 66 | form.value = JSON.parse(decodeURIComponent(option.form)) | 59 | form.value = JSON.parse(decodeURIComponent(option.form)) |
| 60 | queryParams.value.rangeId = form.value.rangId || form.value.rangeId | ||
| 61 | |||
| 62 | getList() | ||
| 63 | getAuditLogs() | ||
| 67 | } | 64 | } |
| 68 | getFillList(form.value.rangId) | ||
| 69 | getPersons() | ||
| 70 | }) | 65 | }) |
| 71 | 66 | ||
| 72 | function getPersons() { | 67 | async function getList() { |
| 73 | queryParams.value.rangeId = form.value.rangId | 68 | try { |
| 74 | api.addSelectPageList(queryParams.value).then(res => { | 69 | const res = await api.listAPI(queryParams.value) |
| 75 | list.value = res.pageData.rows | 70 | list.value = res.rows || [] |
| 76 | for (var l of list.value) { | 71 | } catch (e) { |
| 77 | if (l.photo && l.photo.indexOf('http') == -1) { | 72 | list.value = [] |
| 78 | l.photo = config.baseUrl_api + l.photo | 73 | console.error('获取成员失败', e) |
| 79 | } | 74 | } |
| 80 | } | 75 | } |
| 81 | }) | ||
| 82 | } | ||
| 83 | 76 | ||
| 84 | function getFillList(id) { | 77 | function getAuditLogs() { |
| 85 | api.fillAuditLog(id).then(res => { | 78 | if (form.value.auditLogs) { |
| 86 | feelList.value = res.data | 79 | try { |
| 87 | }) | 80 | feelList.value = JSON.parse(form.value.auditLogs) |
| 81 | } catch (e) { | ||
| 82 | feelList.value = [] | ||
| 83 | } | ||
| 84 | } | ||
| 88 | } | 85 | } |
| 89 | </script> | 86 | </script> |
| 90 | 87 | ||
| ... | @@ -107,12 +104,16 @@ | ... | @@ -107,12 +104,16 @@ |
| 107 | .item { | 104 | .item { |
| 108 | border-bottom: 1px dashed #e5e5e5; | 105 | border-bottom: 1px dashed #e5e5e5; |
| 109 | position: relative; | 106 | position: relative; |
| 107 | padding: 20rpx 0; | ||
| 110 | 108 | ||
| 111 | .date { | 109 | .date { |
| 112 | margin-top: 10rpx; | 110 | margin-top: 10rpx; |
| 111 | font-size: 24rpx; | ||
| 112 | color: #999; | ||
| 113 | } | 113 | } |
| 114 | 114 | ||
| 115 | .name { | 115 | .name { |
| 116 | font-size: 30rpx; | ||
| 116 | text { | 117 | text { |
| 117 | margin-left: 1em; | 118 | margin-left: 1em; |
| 118 | color: #4C5359; | 119 | color: #4C5359; |
| ... | @@ -123,6 +124,7 @@ | ... | @@ -123,6 +124,7 @@ |
| 123 | .nian { | 124 | .nian { |
| 124 | position: absolute; | 125 | position: absolute; |
| 125 | right: 0; | 126 | right: 0; |
| 127 | top: 30rpx; | ||
| 126 | font-size: 30rpx; | 128 | font-size: 30rpx; |
| 127 | color: #AD181F; | 129 | color: #AD181F; |
| 128 | } | 130 | } |
| ... | @@ -137,10 +139,56 @@ | ... | @@ -137,10 +139,56 @@ |
| 137 | view { | 139 | view { |
| 138 | color: #7D8592; | 140 | color: #7D8592; |
| 139 | margin-right: 20rpx; | 141 | margin-right: 20rpx; |
| 140 | |||
| 141 | text { | 142 | text { |
| 142 | color: #AD181F; | 143 | color: #AD181F; |
| 143 | } | 144 | } |
| 144 | } | 145 | } |
| 145 | } | 146 | } |
| 147 | |||
| 148 | .h3-padding { | ||
| 149 | padding: 20rpx 30rpx 0; | ||
| 150 | font-size: 30rpx; | ||
| 151 | font-weight: 500; | ||
| 152 | } | ||
| 153 | |||
| 154 | .stepItem { | ||
| 155 | border-left: 2rpx solid #E60012; | ||
| 156 | padding-left: 20rpx; | ||
| 157 | position: relative; | ||
| 158 | margin-bottom: 30rpx; | ||
| 159 | |||
| 160 | &:before { | ||
| 161 | content: ''; | ||
| 162 | width: 12rpx; | ||
| 163 | height: 12rpx; | ||
| 164 | background: #E60012; | ||
| 165 | border-radius: 50%; | ||
| 166 | position: absolute; | ||
| 167 | left: -7rpx; | ||
| 168 | top: 0; | ||
| 169 | } | ||
| 170 | |||
| 171 | .time { | ||
| 172 | font-size: 24rpx; | ||
| 173 | color: #999; | ||
| 174 | } | ||
| 175 | |||
| 176 | .content { | ||
| 177 | margin-top: 10rpx; | ||
| 178 | font-size: 28rpx; | ||
| 179 | |||
| 180 | .status { | ||
| 181 | margin-bottom: 8rpx; | ||
| 182 | } | ||
| 183 | |||
| 184 | .name { | ||
| 185 | font-weight: 500; | ||
| 186 | } | ||
| 187 | |||
| 188 | .deptName { | ||
| 189 | margin: 6rpx 0; | ||
| 190 | color: #666; | ||
| 191 | } | ||
| 192 | } | ||
| 193 | } | ||
| 146 | </style> | 194 | </style> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -2,25 +2,25 @@ | ... | @@ -2,25 +2,25 @@ |
| 2 | <view class="hasfixedbottom"> | 2 | <view class="hasfixedbottom"> |
| 3 | <view class="searchbar"> | 3 | <view class="searchbar"> |
| 4 | <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search" | 4 | <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search" |
| 5 | v-model="queryParams.personName" placeholder="搜索姓名或证件号码" @blur="getList" @clear="getList"> | 5 | v-model="queryParams.perName" placeholder="搜索姓名或证件号码" @blur="getList" @clear="getList"> |
| 6 | </uni-easyinput> | 6 | </uni-easyinput> |
| 7 | <view class="invertedbtn-red" @click="goVipList">+ 添加会员</view> | 7 | <view class="invertedbtn-red" @click="goVipList">+ 添加会员</view> |
| 8 | </view> | 8 | </view> |
| 9 | <view style="padding:0 20rpx"> | ||
| 9 | 10 | ||
| 10 | <view class="vipData mtb30"> | 11 | <view class="vipData mtb30"> |
| 11 | <view> 人数合计:<text>{{ formData.personCount? formData.personCount:0 }}</text>人 </view> | 12 | <view> 人数合计:<text>{{ countData.all? countData.all:0 }}</text>人 </view> |
| 12 | <view> 新会员合计:<text>{{ formData.newPersonCount? formData.newPersonCount:0 }}</text>人 </view> | 13 | <view> 新会员合计:<text>{{ countData.new? countData.new:0 }}</text>人 </view> |
| 13 | <view> 续费会员合计:<text>{{ formData.oldPersonCount? formData.oldPersonCount:0 }}</text>人 </view> | 14 | <view> 续费会员合计:<text>{{ countData.old? countData.old:0 }}</text>人 </view> |
| 14 | </view> | 15 | </view> |
| 15 | 16 | ||
| 16 | <uni-swipe-action> | 17 | <uni-swipe-action> |
| 17 | <uni-swipe-action-item class="personitem" v-for="(n,index) in list" :key="index"> | 18 | <uni-swipe-action-item class="personitem" v-for="(n,index) in list" :key="index"> |
| 18 | <view class="content-box"> | 19 | <view class="content-box"> |
| 19 | <view class="flexbox"> | 20 | <view class="flexbox"> |
| 20 | <!-- <view class="colorful">{{n.personName?.slice(0,1)}}</view> --> | 21 | <view>{{n.perName}} |
| 21 | <view>{{n.personName}} | ||
| 22 | <view class="date"> | 22 | <view class="date"> |
| 23 | 证件号:{{n.personIdcCode}} | 23 | 证件号:{{n.perIdcCode}} |
| 24 | </view> | 24 | </view> |
| 25 | </view> | 25 | </view> |
| 26 | </view> | 26 | </view> |
| ... | @@ -40,14 +40,14 @@ | ... | @@ -40,14 +40,14 @@ |
| 40 | </template> | 40 | </template> |
| 41 | </uni-swipe-action-item> | 41 | </uni-swipe-action-item> |
| 42 | </uni-swipe-action> | 42 | </uni-swipe-action> |
| 43 | 43 | </view> | |
| 44 | <view class="nodata" v-if="list.length==0"> | 44 | <view class="nodata" v-if="list.length==0"> |
| 45 | <image mode="aspectFit" src="/static/nodata.png"></image> | 45 | <image mode="aspectFit" src="/static/nodata.png"></image> |
| 46 | <text>请添加会员</text> | 46 | <text>请添加会员</text> |
| 47 | </view> | 47 | </view> |
| 48 | 48 | ||
| 49 | <view class="fixedBottom"> | 49 | <view class="fixedBottom"> |
| 50 | <button class="btn-red" :disabled="list?.length <= 0" @click="commitFN">保存并提交</button> | 50 | <button class="btn-red" :disabled="list?.length <= 0" @click="commitFN">保存并缴费</button> |
| 51 | </view> | 51 | </view> |
| 52 | 52 | ||
| 53 | <uni-popup ref="pickView" type="bottom"> | 53 | <uni-popup ref="pickView" type="bottom"> |
| ... | @@ -62,21 +62,17 @@ | ... | @@ -62,21 +62,17 @@ |
| 62 | </template> | 62 | </template> |
| 63 | 63 | ||
| 64 | <script setup> | 64 | <script setup> |
| 65 | import { | 65 | import { ref } from 'vue' |
| 66 | ref | 66 | import { onShow, onLoad } from '@dcloudio/uni-app' |
| 67 | } from 'vue' | ||
| 68 | import { | ||
| 69 | onShow, | ||
| 70 | onLoad | ||
| 71 | } from '@dcloudio/uni-app' | ||
| 72 | import * as api from '@/common/api.js' | 67 | import * as api from '@/common/api.js' |
| 73 | import config from '@/config.js' | ||
| 74 | const app = getApp() | 68 | const app = getApp() |
| 75 | const queryParams = ref({ | 69 | const queryParams = ref({ |
| 76 | rangeId: -1 | 70 | rangeId: '', |
| 71 | pageNum: 1, | ||
| 72 | pageSize: 10, | ||
| 77 | }) | 73 | }) |
| 78 | const formData = ref({}) | 74 | const countData = ref({}) |
| 79 | const list = ref({}) | 75 | const list = ref([]) |
| 80 | const total = ref(0) | 76 | const total = ref(0) |
| 81 | const nowYear = ref(1) | 77 | const nowYear = ref(1) |
| 82 | const nowItem = ref({}) | 78 | const nowItem = ref({}) |
| ... | @@ -98,11 +94,13 @@ | ... | @@ -98,11 +94,13 @@ |
| 98 | text: '五年', | 94 | text: '五年', |
| 99 | value: 5 | 95 | value: 5 |
| 100 | }]) | 96 | }]) |
| 97 | |||
| 101 | onLoad((option) => { | 98 | onLoad((option) => { |
| 102 | if (option.rangeId) { | 99 | if (option.rangeId) { |
| 103 | queryParams.value.rangeId = option.rangeId | 100 | queryParams.value.rangeId = option.rangeId |
| 104 | } | 101 | } |
| 105 | }) | 102 | }) |
| 103 | |||
| 106 | onShow(() => { | 104 | onShow(() => { |
| 107 | if (app.globalData.isLogin) { | 105 | if (app.globalData.isLogin) { |
| 108 | init() | 106 | init() |
| ... | @@ -114,70 +112,88 @@ | ... | @@ -114,70 +112,88 @@ |
| 114 | }) | 112 | }) |
| 115 | 113 | ||
| 116 | function init() { | 114 | function init() { |
| 115 | console.log('init',queryParams.value.rangeId ) | ||
| 117 | getList() | 116 | getList() |
| 117 | getCount() | ||
| 118 | } | 118 | } |
| 119 | 119 | ||
| 120 | function getList() { | 120 | // 获取列表 + 统计(修复版) |
| 121 | api.addSelectPageList(queryParams.value).then(res => { | 121 | async function getList() { |
| 122 | list.value = res.pageData.rows | 122 | try { |
| 123 | total.value = res.pageData.total | 123 | const res = await api.listAPI(queryParams.value) |
| 124 | formData.value = res | 124 | list.value = res.rows || [] |
| 125 | }) | 125 | total.value = res.total || 0 |
| 126 | } catch (e) { | ||
| 127 | list.value = [] | ||
| 128 | total.value = 0 | ||
| 129 | } | ||
| 130 | |||
| 131 | // 只有 rangeId 合法时才获取统计(修复关键) | ||
| 132 | // if (queryParams.value.rangeId && queryParams.value.rangeId > 0) { | ||
| 133 | // await getCount() | ||
| 134 | // } else { | ||
| 135 | // // 清空统计 | ||
| 136 | // countData.value = { all: 0, new: 0, old: 0 } | ||
| 137 | // } | ||
| 138 | } | ||
| 139 | |||
| 140 | // 获取统计 | ||
| 141 | async function getCount() { | ||
| 142 | try { | ||
| 143 | const res = await api.getNewCountByRangeId(queryParams.value.rangeId) | ||
| 144 | countData.value = res.data || { all: 0, new: 0, old: 0 } | ||
| 145 | } catch (e) { | ||
| 146 | countData.value = { all: 0, new: 0, old: 0 } | ||
| 147 | } | ||
| 126 | } | 148 | } |
| 127 | 149 | ||
| 128 | function goVipList() { | 150 | function goVipList() { |
| 129 | let path = `/personalVip/vipList?rangeId=${queryParams.value.rangeId}` | 151 | let path = `/personalVip/vipList?rangeId=${queryParams.value.rangeId}` |
| 130 | uni.redirectTo({ | 152 | uni.navigateTo({ url: path }); |
| 131 | url: path | ||
| 132 | }); | ||
| 133 | } | 153 | } |
| 134 | 154 | ||
| 135 | function changeYear(e) { | 155 | function changeYear(e) { |
| 136 | nowItem.value = e | 156 | nowItem.value = e |
| 137 | nowYear.value = e.payYear | 157 | nowYear.value = e.payYear |
| 138 | pickView.value.open() | 158 | pickView.value.open() |
| 139 | |||
| 140 | } | 159 | } |
| 141 | 160 | ||
| 142 | function bindyear(n) { | 161 | // 修改年限 |
| 162 | async function bindyear(n) { | ||
| 143 | nowYear.value = n.value | 163 | nowYear.value = n.value |
| 144 | pickView.value.close() | 164 | pickView.value.close() |
| 145 | nowItem.value.payYear = n.value | 165 | nowItem.value.payYear = n.value |
| 146 | api.editYear(nowItem.value.payId, nowItem.value.payYear).then(res => { | 166 | |
| 147 | for (var nn of list.value) { | 167 | await api.editYear({ |
| 148 | if (nn.perId == nowItem.value.perId) { | 168 | payId: nowItem.value.payId, |
| 149 | nn.payYear = nowItem.value.payYear | 169 | year: nowItem.value.payYear |
| 150 | } | ||
| 151 | } | ||
| 152 | }) | 170 | }) |
| 171 | |||
| 172 | // 刷新列表和统计 | ||
| 173 | await getList() | ||
| 174 | uni.showToast({ title: '操作成功' }) | ||
| 153 | } | 175 | } |
| 154 | 176 | ||
| 155 | function handleDelete(row) { | 177 | // 删除(修复关键逻辑) |
| 178 | async function handleDelete(row) { | ||
| 156 | uni.showModal({ | 179 | uni.showModal({ |
| 157 | title: '提示', | 180 | title: '提示', |
| 158 | content: `确定删除${row.personName}吗`, | 181 | content: `确定删除${row.perName}吗`, |
| 159 | success: function(res) { | 182 | success: async function(res) { |
| 160 | if (res.confirm) { | 183 | if (res.confirm) { |
| 161 | api.delPayment([row.payId]).then(res => { | 184 | await api.paymentNewDel(row.payId) |
| 162 | uni.showToast({ | 185 | uni.showToast({ title: '删除成功' }) |
| 163 | title: '删除成功' | ||
| 164 | }) | ||
| 165 | if (list.value.length == 1) { | ||
| 166 | queryParams.value.rangeId = -1 | ||
| 167 | } | ||
| 168 | getList() | 186 | getList() |
| 169 | }) | ||
| 170 | } | 187 | } |
| 171 | } | 188 | } |
| 172 | }) | 189 | }) |
| 173 | } | 190 | } |
| 174 | function commitFN(){ | 191 | |
| 175 | if (queryParams.value.rangeId == -1) return | 192 | // 保存缴费 |
| 176 | api.commitRenew(queryParams.value.rangeId).then(res=>{ | 193 | async function commitFN(){ |
| 177 | uni.showToast({ | 194 | if (!queryParams.value.rangeId) return |
| 178 | title: '提交成功' | 195 | uni.navigateTo({ |
| 179 | }) | 196 | url: `/myCenter/payOrder?rangeId=${queryParams.value.rangeId}` |
| 180 | uni.navigateBack() | ||
| 181 | }) | 197 | }) |
| 182 | } | 198 | } |
| 183 | </script> | 199 | </script> |
| ... | @@ -186,10 +202,7 @@ | ... | @@ -186,10 +202,7 @@ |
| 186 | .pickViewBox { | 202 | .pickViewBox { |
| 187 | background-color: #fff; | 203 | background-color: #fff; |
| 188 | text-align: center; | 204 | text-align: center; |
| 189 | 205 | view { line-height: 3; } | |
| 190 | view { | ||
| 191 | line-height: 3; | ||
| 192 | } | ||
| 193 | } | 206 | } |
| 194 | 207 | ||
| 195 | .searchbar { | 208 | .searchbar { |
| ... | @@ -201,7 +214,7 @@ | ... | @@ -201,7 +214,7 @@ |
| 201 | .invertedbtn-red { | 214 | .invertedbtn-red { |
| 202 | margin-left: 15rpx; | 215 | margin-left: 15rpx; |
| 203 | font-size: 30rpx; | 216 | font-size: 30rpx; |
| 204 | padding: 16rpx 20rpx; | 217 | padding: 10rpx 20rpx; |
| 205 | box-sizing: border-box; | 218 | box-sizing: border-box; |
| 206 | border-radius: 50rpx; | 219 | border-radius: 50rpx; |
| 207 | background-color: #fff; | 220 | background-color: #fff; |
| ... | @@ -238,47 +251,53 @@ | ... | @@ -238,47 +251,53 @@ |
| 238 | margin-bottom: 30rpx; | 251 | margin-bottom: 30rpx; |
| 239 | 252 | ||
| 240 | .content-box { | 253 | .content-box { |
| 241 | display: flex;background-color: #fff; | 254 | display: flex; |
| 255 | background-color: #fff; | ||
| 242 | align-items: center; | 256 | align-items: center; |
| 243 | padding: 16rpx; | 257 | padding: 16rpx; |
| 244 | border-radius: 15rpx; | 258 | border-radius: 15rpx; |
| 245 | justify-content: space-between; | 259 | justify-content: space-between; |
| 246 | 260 | margin-bottom: 20rpx; | |
| 247 | .noborder { | ||
| 248 | border: none; | ||
| 249 | |||
| 250 | :deep(.uni-select) { | ||
| 251 | border: none; | ||
| 252 | text-align: right; | ||
| 253 | } | ||
| 254 | } | ||
| 255 | } | 261 | } |
| 256 | 262 | ||
| 257 | .flexbox { | 263 | .flexbox { |
| 258 | align-items: center; | 264 | align-items: center; |
| 259 | } | 265 | } |
| 260 | |||
| 261 | &:nth-child(3n) .colorful { | ||
| 262 | background: #014A9F; | ||
| 263 | } | 266 | } |
| 264 | 267 | ||
| 265 | &:nth-child(3n+1) .colorful { | 268 | .vipData { |
| 266 | background: #AD181F; | 269 | padding: 10rpx 20rpx; |
| 270 | font-size: 28rpx; | ||
| 271 | color: #666; | ||
| 272 | view { margin-bottom: 10rpx; } | ||
| 273 | text { color: #AD181F; font-weight: bold; } | ||
| 267 | } | 274 | } |
| 268 | 275 | ||
| 269 | &:nth-child(3n+2) .colorful { | 276 | .nodata { |
| 270 | background: #D3B267; | 277 | text-align: center; |
| 278 | padding: 100rpx 0; | ||
| 279 | image { width: 200rpx; height: 200rpx; margin-bottom: 20rpx; } | ||
| 280 | text { font-size: 28rpx; color: #999; } | ||
| 271 | } | 281 | } |
| 282 | |||
| 283 | .fixedBottom { | ||
| 284 | position: fixed; | ||
| 285 | bottom: 0; | ||
| 286 | left: 0; | ||
| 287 | right: 0; | ||
| 288 | padding: 20rpx; | ||
| 289 | background: #fff; | ||
| 290 | border-top: 1rpx solid #eee; | ||
| 272 | } | 291 | } |
| 273 | 292 | ||
| 274 | .colorful { | 293 | .btn-red { |
| 275 | width: 100rpx; | 294 | width: 100%; |
| 276 | margin-right: 14rpx; | 295 | height: 80rpx; |
| 277 | height: 100rpx; | 296 | line-height: 80rpx; |
| 278 | line-height: 100rpx; | 297 | background: #E60012; |
| 279 | font-size: 44rpx; | ||
| 280 | color: #fff; | 298 | color: #fff; |
| 281 | text-align: center; | 299 | border-radius: 40rpx; |
| 282 | border-radius: 50%; | 300 | font-size: 32rpx; |
| 301 | border: none; | ||
| 283 | } | 302 | } |
| 284 | </style> | 303 | </style> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -7,7 +7,6 @@ | ... | @@ -7,7 +7,6 @@ |
| 7 | </view> | 7 | </view> |
| 8 | <view class="indexboxre"> | 8 | <view class="indexboxre"> |
| 9 | <view class="tt">会员列表<text class="text-danger">(列表只显示不在缴费中的个人会员)</text></view> | 9 | <view class="tt">会员列表<text class="text-danger">(列表只显示不在缴费中的个人会员)</text></view> |
| 10 | <!-- <uni-indexed-list :options="list" :showSelect="true" @click="bindClick"></uni-indexed-list> --> | ||
| 11 | <view class="userlist"> | 10 | <view class="userlist"> |
| 12 | <view class="item" v-for="(n,index) in list" :key="index"> | 11 | <view class="item" v-for="(n,index) in list" :key="index"> |
| 13 | <view @click="checkThis(n)"> | 12 | <view @click="checkThis(n)"> |
| ... | @@ -46,19 +45,15 @@ | ... | @@ -46,19 +45,15 @@ |
| 46 | <text>暂无数据</text> | 45 | <text>暂无数据</text> |
| 47 | </view> | 46 | </view> |
| 48 | </view> | 47 | </view> |
| 49 | |||
| 50 | </view> | 48 | </view> |
| 51 | 49 | ||
| 52 | <view class="fixedBottom" v-if="list.length>0"> | 50 | <view class="fixedBottom" v-if="list.length>0"> |
| 53 | |||
| 54 | <button class="btn-red" @click="handleImport">导入</button> | 51 | <button class="btn-red" @click="handleImport">导入</button> |
| 55 | </view> | 52 | </view> |
| 56 | |||
| 57 | </view> | 53 | </view> |
| 58 | </template> | 54 | </template> |
| 59 | 55 | ||
| 60 | <script setup> | 56 | <script setup> |
| 61 | import * as api from '@/common/api.js' | ||
| 62 | import config from '@/config.js' | 57 | import config from '@/config.js' |
| 63 | import { | 58 | import { |
| 64 | ref, | 59 | ref, |
| ... | @@ -67,6 +62,8 @@ | ... | @@ -67,6 +62,8 @@ |
| 67 | import { | 62 | import { |
| 68 | onLoad | 63 | onLoad |
| 69 | } from '@dcloudio/uni-app' | 64 | } from '@dcloudio/uni-app' |
| 65 | import * as api from '@/common/api.js' | ||
| 66 | |||
| 70 | const { | 67 | const { |
| 71 | proxy | 68 | proxy |
| 72 | } = getCurrentInstance() | 69 | } = getCurrentInstance() |
| ... | @@ -74,27 +71,37 @@ | ... | @@ -74,27 +71,37 @@ |
| 74 | const queryParams = ref({ | 71 | const queryParams = ref({ |
| 75 | showMyPersonFlag: 1, | 72 | showMyPersonFlag: 1, |
| 76 | checkPaymentCommit: 1, | 73 | checkPaymentCommit: 1, |
| 77 | fromChoose: 1 | 74 | fromChoose: 1, |
| 75 | pageNum: 1, | ||
| 76 | pageSize: 10, | ||
| 77 | paymentRangeId: -1, | ||
| 78 | name: '', | ||
| 79 | isBlack: 0, | ||
| 80 | // certStage: '', | ||
| 81 | validityDateRange: null | ||
| 78 | }) | 82 | }) |
| 79 | const list = ref([]) | 83 | const list = ref([]) |
| 80 | const total = ref(0) | 84 | const total = ref(0) |
| 81 | const userType = ref('') | 85 | const userType = ref('') |
| 86 | |||
| 82 | onLoad((option) => { | 87 | onLoad((option) => { |
| 83 | userType.value = app.globalData.userType | 88 | userType.value = app.globalData.userType |
| 84 | queryParams.value.paymentRangeId = option.rangeId | 89 | queryParams.value.paymentRangeId = option.rangeId |
| 85 | getList() | 90 | getList() |
| 86 | }) | 91 | }) |
| 87 | 92 | ||
| 88 | function getList() { | 93 | async function getList() { |
| 89 | api.selectPageList(queryParams.value).then(res => { | 94 | const res = await api.selectPageList(queryParams.value) |
| 90 | list.value = res.rows | 95 | list.value = res.rows |
| 96 | // 处理图片路径 | ||
| 91 | for(var l of list.value){ | 97 | for(var l of list.value){ |
| 92 | if(l.photo&&l.photo.indexOf('http')==-1){ | 98 | if(l.photo&&l.photo.indexOf('http')==-1){ |
| 93 | l.photo = config.baseUrl_api + l.photo | 99 | l.photo = config.baseUrl_api + l.photo |
| 94 | } | 100 | } |
| 101 | // 初始化选中状态 | ||
| 102 | l.checked = false | ||
| 95 | } | 103 | } |
| 96 | total.value = res.total | 104 | total.value = res.total |
| 97 | }) | ||
| 98 | } | 105 | } |
| 99 | 106 | ||
| 100 | function handleInfo(n) { | 107 | function handleInfo(n) { |
| ... | @@ -106,20 +113,21 @@ | ... | @@ -106,20 +113,21 @@ |
| 106 | function goAddRenew() { | 113 | function goAddRenew() { |
| 107 | uni.navigateBack() | 114 | uni.navigateBack() |
| 108 | } | 115 | } |
| 116 | |||
| 109 | function checkThis(n){ | 117 | function checkThis(n){ |
| 110 | if(n.checked){ | 118 | n.checked = !n.checked |
| 111 | n.checked = false | ||
| 112 | }else{ | ||
| 113 | n.checked = true | ||
| 114 | } | ||
| 115 | } | 119 | } |
| 116 | function handleImport(){ | 120 | |
| 117 | var arr=[] | 121 | async function handleImport(){ |
| 122 | const arr = [] | ||
| 123 | const idcCodeList = [] | ||
| 118 | for(var n of list.value){ | 124 | for(var n of list.value){ |
| 119 | if(n.checked){ | 125 | if(n.checked){ |
| 120 | arr.push(n.perId) | 126 | arr.push(n.perId) |
| 127 | idcCodeList.push(n.idcCode) | ||
| 121 | } | 128 | } |
| 122 | } | 129 | } |
| 130 | |||
| 123 | if(arr.length==0){ | 131 | if(arr.length==0){ |
| 124 | uni.showToast({ | 132 | uni.showToast({ |
| 125 | title:"请选择会员", | 133 | title:"请选择会员", |
| ... | @@ -127,18 +135,30 @@ | ... | @@ -127,18 +135,30 @@ |
| 127 | }) | 135 | }) |
| 128 | return | 136 | return |
| 129 | } | 137 | } |
| 130 | api.addPersonPaymentGroup({ rangeId: queryParams.value.paymentRangeId, personIdArray: arr.join(',') }).then(res=>{ | 138 | |
| 131 | let path = `/personalVip/renew?rangeId=${res.data.rangeId}` | 139 | try { |
| 132 | uni.redirectTo({ | 140 | const res = await api.memberInsertPersons({ |
| 133 | url: path | 141 | rangeId: queryParams.value.paymentRangeId, |
| 134 | }); | 142 | year: 1, |
| 143 | idcCode: idcCodeList | ||
| 135 | }) | 144 | }) |
| 145 | uni.navigateBack() | ||
| 146 | |||
| 147 | uni.showToast({ | ||
| 148 | title: '导入成功', | ||
| 149 | icon: 'success' | ||
| 150 | }) | ||
| 151 | } catch (e) { | ||
| 152 | uni.showToast({ | ||
| 153 | title: '导入失败', | ||
| 154 | icon: 'none' | ||
| 155 | }) | ||
| 156 | console.error('批量添加失败:', e) | ||
| 157 | } | ||
| 136 | } | 158 | } |
| 137 | </script> | 159 | </script> |
| 138 | 160 | ||
| 139 | <style scoped lang="scss"> | 161 | <style scoped lang="scss"> |
| 140 | |||
| 141 | |||
| 142 | .indexboxre { | 162 | .indexboxre { |
| 143 | padding: 0 30rpx; | 163 | padding: 0 30rpx; |
| 144 | 164 | ||
| ... | @@ -169,4 +189,92 @@ | ... | @@ -169,4 +189,92 @@ |
| 169 | font-size: 26rpx; | 189 | font-size: 26rpx; |
| 170 | } | 190 | } |
| 171 | } | 191 | } |
| 192 | |||
| 193 | .userlist { | ||
| 194 | .item { | ||
| 195 | display: flex; | ||
| 196 | align-items: center; | ||
| 197 | padding: 20rpx 0; | ||
| 198 | border-bottom: 1px solid #f5f5f5; | ||
| 199 | |||
| 200 | .icon { | ||
| 201 | width: 40rpx; | ||
| 202 | height: 40rpx; | ||
| 203 | margin-right: 20rpx; | ||
| 204 | } | ||
| 205 | |||
| 206 | .photobox { | ||
| 207 | margin-right: 20rpx; | ||
| 208 | |||
| 209 | .photo { | ||
| 210 | width: 80rpx; | ||
| 211 | height: 80rpx; | ||
| 212 | border-radius: 50%; | ||
| 213 | } | ||
| 214 | |||
| 215 | .colorful { | ||
| 216 | width: 80rpx; | ||
| 217 | height: 80rpx; | ||
| 218 | line-height: 80rpx; | ||
| 219 | text-align: center; | ||
| 220 | color: #fff; | ||
| 221 | border-radius: 50%; | ||
| 222 | font-size: 36rpx; | ||
| 223 | } | ||
| 224 | } | ||
| 225 | |||
| 226 | .name { | ||
| 227 | font-size: 32rpx; | ||
| 228 | font-weight: 500; | ||
| 229 | } | ||
| 230 | |||
| 231 | .date { | ||
| 232 | font-size: 24rpx; | ||
| 233 | color: #999; | ||
| 234 | margin-top: 8rpx; | ||
| 235 | } | ||
| 236 | |||
| 237 | .status { | ||
| 238 | margin-left: auto; | ||
| 239 | font-size: 28rpx; | ||
| 240 | } | ||
| 241 | } | ||
| 242 | } | ||
| 243 | |||
| 244 | .nodata { | ||
| 245 | text-align: center; | ||
| 246 | padding: 100rpx 0; | ||
| 247 | |||
| 248 | image { | ||
| 249 | width: 200rpx; | ||
| 250 | height: 200rpx; | ||
| 251 | margin-bottom: 20rpx; | ||
| 252 | } | ||
| 253 | |||
| 254 | text { | ||
| 255 | font-size: 28rpx; | ||
| 256 | color: #999; | ||
| 257 | } | ||
| 258 | } | ||
| 259 | |||
| 260 | .fixedBottom { | ||
| 261 | position: fixed; | ||
| 262 | bottom: 0; | ||
| 263 | left: 0; | ||
| 264 | right: 0; | ||
| 265 | padding: 20rpx; | ||
| 266 | background: #fff; | ||
| 267 | border-top: 1px solid #eee; | ||
| 268 | |||
| 269 | .btn-red { | ||
| 270 | width: 100%; | ||
| 271 | height: 80rpx; | ||
| 272 | line-height: 80rpx; | ||
| 273 | background: #E60012; | ||
| 274 | color: #fff; | ||
| 275 | border-radius: 40rpx; | ||
| 276 | font-size: 32rpx; | ||
| 277 | border: none; | ||
| 278 | } | ||
| 279 | } | ||
| 172 | </style> | 280 | </style> |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| 1 | { | 1 | { |
| 2 | "appid": "wx5d51e8ed31bbdbb7", | 2 | "appid": "wx523ee37fff4fea9d", |
| 3 | "compileType": "miniprogram", | 3 | "compileType": "miniprogram", |
| 4 | "libVersion": "3.0.0", | 4 | "libVersion": "3.0.0", |
| 5 | "packOptions": { | 5 | "packOptions": { |
| ... | @@ -19,11 +19,23 @@ | ... | @@ -19,11 +19,23 @@ |
| 19 | "disablePlugins": [], | 19 | "disablePlugins": [], |
| 20 | "outputPath": "" | 20 | "outputPath": "" |
| 21 | }, | 21 | }, |
| 22 | "condition": false | 22 | "condition": false, |
| 23 | "compileWorklet": false, | ||
| 24 | "uglifyFileName": false, | ||
| 25 | "uploadWithSourceMap": true, | ||
| 26 | "packNpmManually": false, | ||
| 27 | "minifyWXSS": true, | ||
| 28 | "minifyWXML": true, | ||
| 29 | "localPlugins": false, | ||
| 30 | "disableUseStrict": false, | ||
| 31 | "useCompilerPlugins": false, | ||
| 32 | "swc": false, | ||
| 33 | "disableSWC": true | ||
| 23 | }, | 34 | }, |
| 24 | "condition": {}, | 35 | "condition": {}, |
| 25 | "editorSetting": { | 36 | "editorSetting": { |
| 26 | "tabIndent": "insertSpaces", | 37 | "tabIndent": "insertSpaces", |
| 27 | "tabSize": 2 | 38 | "tabSize": 2 |
| 28 | } | 39 | }, |
| 40 | "simulatorPluginLibVersion": {} | ||
| 29 | } | 41 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -2,6 +2,23 @@ | ... | @@ -2,6 +2,23 @@ |
| 2 | "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", | 2 | "description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html", |
| 3 | "projectname": "Venue", | 3 | "projectname": "Venue", |
| 4 | "setting": { | 4 | "setting": { |
| 5 | "compileHotReLoad": true | 5 | "compileHotReLoad": true, |
| 6 | } | 6 | "urlCheck": true, |
| 7 | "coverView": true, | ||
| 8 | "lazyloadPlaceholderEnable": false, | ||
| 9 | "skylineRenderEnable": false, | ||
| 10 | "preloadBackgroundData": false, | ||
| 11 | "autoAudits": false, | ||
| 12 | "useApiHook": true, | ||
| 13 | "useApiHostProcess": true, | ||
| 14 | "showShadowRootInWxmlPanel": true, | ||
| 15 | "useStaticServer": false, | ||
| 16 | "useLanDebug": false, | ||
| 17 | "showES6CompileOption": false, | ||
| 18 | "checkInvalidKey": true, | ||
| 19 | "ignoreDevUnusedFiles": true, | ||
| 20 | "bigPackageSizeSupport": false | ||
| 21 | }, | ||
| 22 | "libVersion": "3.15.0", | ||
| 23 | "condition": {} | ||
| 7 | } | 24 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
static/btn_03.png
0 → 100644
1.46 KB
static/btn_03_g.png
0 → 100644
1.43 KB
static/dd_02.png
0 → 100644
1.42 KB
static/dd_02_g.png
0 → 100644
1.4 KB
static/min.png
0 → 100644
11.1 KB
-
Please register or sign in to post a comment