f120f0ea by lttnew

省级指派放开+级位考试优化+考点申请同步pc

1 parent f813fede
1 // dev 1 // dev
2 // const baseUrl_api = 'http://192.168.1.222:8787' 2 const baseUrl_api = 'http://192.168.1.222:8787'
3 // const baseUrl_api = 'http://47.98.186.233:8787' 3 // const baseUrl_api = 'http://47.98.186.233:8787'
4 const baseUrl_api = 'https://tk001.wxjylt.com/stage-api/' 4 // const baseUrl_api = 'https://tk001.wxjylt.com/stage-api/'
5 const loginImage_api = 'https://tk001.wxjylt.com/stage-api' 5 const loginImage_api = 'https://tk001.wxjylt.com/stage-api'
6 const payUrl = 'https://wxpay.cmbc.com.cn/mobilePlatform/appserver/lcbpPay.do' 6 const payUrl = 'https://wxpay.cmbc.com.cn/mobilePlatform/appserver/lcbpPay.do'
7 7
......
1 <template> 1 <template>
2 <view class="add-apply-page"> 2 <view class="add-apply-page">
3 <view v-if="activeSelectKey" class="level-dropdown-mask" @click="closeLevelDropdown"></view>
3 <!-- 顶部步骤条 --> 4 <!-- 顶部步骤条 -->
4 <view class="steps-bar"> 5 <view class="steps-bar">
5 <view :class="{ active: active >= 0, current: active == 0 }" class="step-item"> 6 <view :class="{ active: active >= 0, current: active == 0 }" class="step-item">
...@@ -101,8 +102,13 @@ ...@@ -101,8 +102,13 @@
101 </view> 102 </view>
102 103
103 <!-- 考生列表(红框主体) --> 104 <!-- 考生列表(红框主体) -->
104 <view class="student-list"> 105 <view :class="{ 'dropdown-open': activeSelectKey }" class="student-list">
105 <view v-for="(n,index) in infoList" :key="index" class="student-card"> 106 <view
107 v-for="(n,index) in infoList"
108 :key="n.id || n.perId || n.idcCode || index"
109 :class="{ 'select-open': activeSelectKey === getRowKey(n, index) }"
110 class="student-card"
111 >
106 <!-- 左侧:头像+考生信息 --> 112 <!-- 左侧:头像+考生信息 -->
107 <view class="card-left"> 113 <view class="card-left">
108 <view class="avatar"> 114 <view class="avatar">
...@@ -128,8 +134,27 @@ ...@@ -128,8 +134,27 @@
128 </view> 134 </view>
129 <view class="level-item"> 135 <view class="level-item">
130 <text class="level-label">考试级别</text> 136 <text class="level-label">考试级别</text>
131 <view class="select-wrapper exam-level-select" @click="changeLevelfather(n)"> 137 <view class="select-wrapper exam-level-select">
132 <uni-data-select v-model="n.levelNew" :clear="false" :localdata="levelArr" @change="changeLevel"/> 138 <view class="exam-level-trigger" @click="toggleLevelDropdown(n, index)">
139 <text>{{ getLevelText(n.levelNew) || '请选择' }}</text>
140 <uni-icons color="#999" size="14" type="top"></uni-icons>
141 </view>
142 <view
143 v-if="activeSelectKey === getRowKey(n, index)"
144 class="level-dropdown-up"
145 >
146 <view class="level-dropdown-inner">
147 <view
148 v-for="item in getLevelOptions(n)"
149 :key="item.value"
150 :class="{ active: n.levelNew === item.value }"
151 class="level-dropdown-item"
152 @click.stop="chooseLevel(n, item)"
153 >
154 {{ item.text }}
155 </view>
156 </view>
157 </view>
133 </view> 158 </view>
134 </view> 159 </view>
135 <view class="level-item"> 160 <view class="level-item">
...@@ -218,6 +243,17 @@ ...@@ -218,6 +243,17 @@
218 </view> 243 </view>
219 </uni-popup> 244 </uni-popup>
220 245
246 <custom-modal
247 ref="confirmModalRef"
248 :title="confirmModal.title"
249 :content="confirmModal.content"
250 :cancel-text="confirmModal.cancelText"
251 :confirm-text="confirmModal.confirmText"
252 :show-cancel="confirmModal.showCancel"
253 @cancel="handleConfirmCancel"
254 @confirm="handleConfirmOk"
255 />
256
221 </view> 257 </view>
222 </template> 258 </template>
223 259
...@@ -228,6 +264,7 @@ import {onLoad, onShow} from '@dcloudio/uni-app'; ...@@ -228,6 +264,7 @@ import {onLoad, onShow} from '@dcloudio/uni-app';
228 import config from '@/config.js' 264 import config from '@/config.js'
229 import dayjs from 'dayjs' 265 import dayjs from 'dayjs'
230 import _ from 'underscore' 266 import _ from 'underscore'
267 import customModal from '@/components/custom-modal.vue'
231 268
232 const app = getApp(); 269 const app = getApp();
233 const memberInfo = app.globalData.memberInfo 270 const memberInfo = app.globalData.memberInfo
...@@ -242,8 +279,19 @@ const active = ref(0) ...@@ -242,8 +279,19 @@ const active = ref(0)
242 const infoList = ref([]) 279 const infoList = ref([])
243 const tablePersonInfo = ref({}) 280 const tablePersonInfo = ref({})
244 const transcript = ref([]) // 补全缺失变量 281 const transcript = ref([]) // 补全缺失变量
282 const activeSelectKey = ref('')
283 const confirmModalRef = ref(null)
284 const confirmModal = ref({
285 title: '提示',
286 content: '',
287 cancelText: '取消',
288 confirmText: '确定',
289 showCancel: true
290 })
291 let confirmOkAction = null
292 let confirmCancelAction = null
245 293
246 const levelArr = ref([{ 294 const defaultLevelArr = [{
247 value: '10', 295 value: '10',
248 text: '十级' 296 text: '十级'
249 }, { 297 }, {
...@@ -273,7 +321,8 @@ const levelArr = ref([{ ...@@ -273,7 +321,8 @@ const levelArr = ref([{
273 }, { 321 }, {
274 value: '1', 322 value: '1',
275 text: '一级' 323 text: '一级'
276 }]) 324 }]
325 const levelArr = ref(defaultLevelArr.map(item => ({ ...item })))
277 326
278 const range = ref([{ 327 const range = ref([{
279 value: '1', 328 value: '1',
...@@ -300,6 +349,103 @@ const idcTypeIndex = ref(0) ...@@ -300,6 +349,103 @@ const idcTypeIndex = ref(0)
300 349
301 let examId 350 let examId
302 351
352 function openConfirmModal(options = {}) {
353 confirmModal.value = {
354 title: options.title || '提示',
355 content: options.content || '',
356 cancelText: options.cancelText || '取消',
357 confirmText: options.confirmText || '确定',
358 showCancel: options.showCancel !== false
359 }
360 confirmOkAction = typeof options.onConfirm === 'function' ? options.onConfirm : null
361 confirmCancelAction = typeof options.onCancel === 'function' ? options.onCancel : null
362 confirmModalRef.value?.open()
363 }
364
365 function handleConfirmOk() {
366 const action = confirmOkAction
367 confirmOkAction = null
368 confirmCancelAction = null
369 if (action) action()
370 }
371
372 function handleConfirmCancel() {
373 const action = confirmCancelAction
374 confirmOkAction = null
375 confirmCancelAction = null
376 if (action) action()
377 }
378
379 function getRowKey(row, index = 0) {
380 return String(row.id || row.perId || row.personId || row.idcCode || index)
381 }
382
383 function cloneLevelOptions(list = defaultLevelArr) {
384 return list.map(item => ({ ...item }))
385 }
386
387 function normalizeLevelOptions(list) {
388 if (!Array.isArray(list) || list.length === 0) {
389 return cloneLevelOptions()
390 }
391 const remoteList = list.map(item => ({
392 ...item,
393 value: String(item.value ?? item.level ?? item.id ?? '')
394 }))
395 return defaultLevelArr.map(defaultItem => {
396 const remoteItem = _.find(remoteList, item => {
397 return item.value === String(defaultItem.value) || item.name === defaultItem.text || item.text === defaultItem.text
398 })
399 const source = remoteItem || defaultItem
400 const disabled = source.status === undefined ? (source.disabled || source.disable || false) : !source.status
401 return {
402 ...source,
403 value: String(defaultItem.value),
404 text: source.text || source.name || defaultItem.text,
405 disabled,
406 disable: disabled
407 }
408 })
409 }
410
411 function getLevelOptions(row) {
412 if (!row.levelOptions || row.levelOptions.length === 0) {
413 row.levelOptions = cloneLevelOptions()
414 }
415 return row.levelOptions
416 }
417
418 function getLevelText(value) {
419 if (!value) return ''
420 const allOptions = [...defaultLevelArr, ...levelArr.value]
421 const option = _.find(allOptions, item => String(item.value) === String(value))
422 return option?.text || `${szToHz(value)}级`
423 }
424
425 function setDefaultLevel(row) {
426 row.levelOld = row.levelOld ? String(row.levelOld) : ''
427 row.levelNew = row.levelNew ? String(row.levelNew) : ''
428 if (row.levelOld) {
429 row.levelRecommend = String(parseInt(row.levelOld) - 1)
430 if (row.levelRecommend === '0') {
431 row.levelRecommend = '1'
432 }
433 } else {
434 row.levelRecommend = '9'
435 }
436
437 // 原级别是一级时不能默认推荐,其他情况按推荐级别回填,保证二次添加后列表能显示考试级别。
438 if (row.levelOld === '1') {
439 row.levelNew = ''
440 } else if (!row.levelNew) {
441 row.levelNew = row.levelRecommend
442 }
443
444 if (!row.isPass) {
445 row.isPass = '1'
446 }
447 }
448
303 onLoad(option => { 449 onLoad(option => {
304 if (app.globalData.isLogin) { 450 if (app.globalData.isLogin) {
305 initData(option) 451 initData(option)
...@@ -586,25 +732,8 @@ function getChosedStudentList() { ...@@ -586,25 +732,8 @@ function getChosedStudentList() {
586 } 732 }
587 api.getStudentList(obj).then(res => { 733 api.getStudentList(obj).then(res => {
588 _.each(res.rows, (d) => { 734 _.each(res.rows, (d) => {
589 if (d.levelOld) { 735 setDefaultLevel(d)
590 d.levelRecommend = (parseInt(d.levelOld) - 1) + '' 736 d.levelOptions = cloneLevelOptions()
591 if (d.levelRecommend === '0') {
592 d.levelRecommend = '1'
593 }
594 } else {
595 d.levelRecommend = '9'
596 }
597
598 // 原级别是一级时,levelNew 默认为空,不使用推荐值
599 if (d.levelOld === '1') {
600 d.levelNew = ''
601 } else if (!d.levelNew) {
602 d.levelNew = d.levelRecommend
603 }
604
605 if (!d.isPass) {
606 d.isPass = '1'
607 }
608 if (d.photo && d.photo.indexOf('http') == -1) { 737 if (d.photo && d.photo.indexOf('http') == -1) {
609 d.photo = config.baseUrl_api + d.photo 738 d.photo = config.baseUrl_api + d.photo
610 } 739 }
...@@ -646,7 +775,25 @@ function szToHz(num) { ...@@ -646,7 +775,25 @@ function szToHz(num) {
646 775
647 let nowRow 776 let nowRow
648 777
649 function changeLevelfather(row, flag = 0) { 778 function toggleLevelDropdown(row, index = 0) {
779 const rowKey = getRowKey(row, index)
780 if (activeSelectKey.value === rowKey) {
781 closeLevelDropdown()
782 return
783 }
784 nowRow = row
785 activeSelectKey.value = rowKey
786 getLevelOptions(row)
787 changeLevelfather(row, index)
788 }
789
790 function closeLevelDropdown() {
791 activeSelectKey.value = ''
792 }
793
794 function changeLevelfather(row, index = 0, flag = 0) {
795 nowRow = row
796 activeSelectKey.value = getRowKey(row, index)
650 const data = _.map(infoList.value, (d) => { 797 const data = _.map(infoList.value, (d) => {
651 return { 798 return {
652 id: d.id, 799 id: d.id,
...@@ -662,45 +809,49 @@ function changeLevelfather(row, flag = 0) { ...@@ -662,45 +809,49 @@ function changeLevelfather(row, flag = 0) {
662 // perId: row.perId, 809 // perId: row.perId,
663 status: flag 810 status: flag
664 }).then(res => { 811 }).then(res => {
665 levelArr.value = res.data 812 const options = normalizeLevelOptions(res.data)
666 for (let l of levelArr.value) { 813 row.levelOptions = options
667 l.text = l.name 814 levelArr.value = options
668 l.disabled = !(l.status)
669 }
670 }) 815 })
671 } 816 }
672 817
673 function changeLevel(e) { 818 function chooseLevel(row, item) {
674 // 切换考试级别时弹出确认框 819 if (!row) return
675 uni.showModal({ 820 const oldLevel = row.levelNew
821 row.levelNew = String(item.value)
822 changeLevel(row, oldLevel)
823 }
824
825 function changeLevel(row, oldLevel) {
826 nowRow = row || nowRow
827 openConfirmModal({
676 title: '提示', 828 title: '提示',
677 content: '请仔细核实本次等级申报是否正确!', 829 content: '请仔细核实本次等级申报是否正确!',
678 success: function (res) { 830 onConfirm: function () {
679 if (res.confirm) { 831 // 保存当前行数据
680 // 保存当前行数据 832 const data = _.map(infoList.value, (d) => {
681 const data = _.map(infoList.value, (d) => { 833 return {
682 return { 834 id: d.id,
683 id: d.id, 835 levelNew: d.levelNew,
684 levelNew: d.levelNew, 836 isPass: d.isPass
685 isPass: d.isPass 837 }
686 } 838 })
687 }) 839 api.editLevel({
688 api.editLevel({ 840 examId: form.value.examId,
689 examId: form.value.examId, 841 personInfo: JSON.stringify(data),
690 personInfo: JSON.stringify(data), 842 transcript: form.value.transcript,
691 transcript: form.value.transcript, 843 status: 0
692 status: 0 844 }).then(() => {
693 }).then(() => { 845 closeLevelDropdown()
694 // 保存成功后更新统计 846 // 保存成功后更新统计
695 getTablePersonInfo() 847 getTablePersonInfo()
696 }) 848 })
697 } else {
698 // 取消时恢复为推荐级别
699 nowRow.levelNew = nowRow.levelRecommend != 0 ? nowRow.levelRecommend : ''
700 }
701 }, 849 },
702 fail: function (res) { 850 onCancel: function () {
703 nowRow.levelNew = nowRow.levelRecommend != 0 ? nowRow.levelRecommend : '' 851 if (nowRow) {
852 nowRow.levelNew = oldLevel !== undefined ? oldLevel : (nowRow.levelRecommend != 0 ? nowRow.levelRecommend : '')
853 }
854 closeLevelDropdown()
704 } 855 }
705 }) 856 })
706 } 857 }
...@@ -719,20 +870,18 @@ function submitForm2(flag) { ...@@ -719,20 +870,18 @@ function submitForm2(flag) {
719 return 870 return
720 } 871 }
721 872
722 uni.showModal({ 873 openConfirmModal({
723 title: '提示', 874 title: '提示',
724 content: `请确认人员照片是否已更新?`, 875 content: `请确认人员照片是否已更新?`,
725 success: function (res) { 876 onConfirm: function () {
726 if (res.confirm) { 877 // saveStep2(flag).then(() => {
727 // saveStep2(flag).then(() => { 878 // uni.navigateTo({
728 // uni.navigateTo({ 879 // url: `/level/paymentDetail?examId=${form.value.examId}`
729 // url: `/level/paymentDetail?examId=${form.value.examId}` 880 // })
730 // }) 881 // })
731 // }) 882 uni.navigateTo({
732 uni.navigateTo({ 883 url: `/level/paymentDetail?examId=${form.value.examId}`
733 url: `/level/paymentDetail?examId=${form.value.examId}` 884 })
734 })
735 }
736 } 885 }
737 }) 886 })
738 } else { 887 } else {
...@@ -759,16 +908,14 @@ function saveStep2(flag) { ...@@ -759,16 +908,14 @@ function saveStep2(flag) {
759 } 908 }
760 909
761 function handleDelete(row) { 910 function handleDelete(row) {
762 uni.showModal({ 911 openConfirmModal({
763 title: '提示', 912 title: '提示',
764 content: `确定删除${row.realName}?`, 913 content: `确定删除${row.realName}?`,
765 success: function (res) { 914 onConfirm: function () {
766 if (res.confirm) { 915 api.dellevelPerson(row.id).then(() => {
767 api.dellevelPerson(row.id).then(() => { 916 uni.showToast({title: '操作成功', icon: 'none'})
768 uni.showToast({title: '操作成功', icon: 'none'}) 917 getChosedStudentList()
769 getChosedStudentList() 918 })
770 })
771 }
772 } 919 }
773 }) 920 })
774 } 921 }
...@@ -780,6 +927,16 @@ function handleDelete(row) { ...@@ -780,6 +927,16 @@ function handleDelete(row) {
780 padding-bottom: 120rpx; 927 padding-bottom: 120rpx;
781 } 928 }
782 929
930 .level-dropdown-mask {
931 position: fixed;
932 top: 0;
933 left: 0;
934 right: 0;
935 bottom: 0;
936 z-index: 90;
937 background: transparent;
938 }
939
783 /* 顶部步骤条 */ 940 /* 顶部步骤条 */
784 .steps-bar { 941 .steps-bar {
785 display: flex; 942 display: flex;
...@@ -986,9 +1143,14 @@ function handleDelete(row) { ...@@ -986,9 +1143,14 @@ function handleDelete(row) {
986 position: relative; 1143 position: relative;
987 z-index: 1; 1144 z-index: 1;
988 1145
1146 &.dropdown-open {
1147 z-index: 110;
1148 }
1149
989 .student-card { 1150 .student-card {
990 position: relative; 1151 position: relative;
991 z-index: 1; 1152 z-index: 1;
1153 overflow: visible;
992 // display: flex; 1154 // display: flex;
993 1155
994 // align-items: center; 1156 // align-items: center;
...@@ -998,6 +1160,10 @@ function handleDelete(row) { ...@@ -998,6 +1160,10 @@ function handleDelete(row) {
998 border-radius: 16rpx; 1160 border-radius: 16rpx;
999 margin-bottom: 20rpx; 1161 margin-bottom: 20rpx;
1000 box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04); 1162 box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.04);
1163
1164 &.select-open {
1165 z-index: 120;
1166 }
1001 1167
1002 /* 左侧:头像+考生信息 */ 1168 /* 左侧:头像+考生信息 */
1003 .card-left { 1169 .card-left {
...@@ -1084,7 +1250,64 @@ function handleDelete(row) { ...@@ -1084,7 +1250,64 @@ function handleDelete(row) {
1084 .select-wrapper { 1250 .select-wrapper {
1085 width: 160rpx; 1251 width: 160rpx;
1086 position: relative; 1252 position: relative;
1087 z-index: 1; 1253 z-index: 2;
1254 overflow: visible;
1255 }
1256
1257 .exam-level-select {
1258 z-index: 130;
1259
1260 .exam-level-trigger {
1261 display: flex;
1262 align-items: center;
1263 justify-content: space-between;
1264 height: 70rpx;
1265 padding: 0 20rpx;
1266 box-sizing: border-box;
1267 border: 1rpx solid #e5e5e5;
1268 border-radius: 8rpx;
1269 background: #fff;
1270 font-size: 28rpx;
1271 color: #333;
1272 }
1273
1274 .level-dropdown-up {
1275 position: absolute;
1276 left: 0;
1277 bottom: 78rpx;
1278 width: 180rpx;
1279 background: #fff;
1280 border-radius: 12rpx;
1281 box-shadow: 0 8rpx 28rpx rgba(0, 0, 0, 0.14);
1282 z-index: 180;
1283 padding: 8rpx 0;
1284 box-sizing: border-box;
1285
1286 }
1287
1288 .level-dropdown-inner {
1289 height: auto;
1290 }
1291
1292 .level-dropdown-item {
1293 height: 68rpx;
1294 line-height: 68rpx;
1295 padding: 0 24rpx;
1296 font-size: 28rpx;
1297 color: #333;
1298 text-align: left;
1299
1300 &.active {
1301 color: #AD181F;
1302 font-weight: 600;
1303 background: #FFF5F5;
1304 }
1305
1306 &.disabled {
1307 color: #c8c9cc;
1308 background: #fafafa;
1309 }
1310 }
1088 } 1311 }
1089 } 1312 }
1090 } 1313 }
...@@ -1278,4 +1501,5 @@ function handleDelete(row) { ...@@ -1278,4 +1501,5 @@ function handleDelete(row) {
1278 font-size: 28rpx; 1501 font-size: 28rpx;
1279 margin-top: 16rpx; 1502 margin-top: 16rpx;
1280 } 1503 }
1504
1281 </style> 1505 </style>
......
1 <template> 1 <template>
2 <view> 2 <view class="apply-detail-page">
3 <view class="wBox"> 3 <view class="wBox">
4 <view class="tt">考级基本信息</view> 4 <view class="tt">考级基本信息</view>
5 <view class="ddd"> 5 <view class="ddd">
...@@ -228,6 +228,12 @@ ...@@ -228,6 +228,12 @@
228 </script> 228 </script>
229 229
230 <style scoped lang="scss"> 230 <style scoped lang="scss">
231 .apply-detail-page {
232 min-height: 100vh;
233 padding-bottom: calc(60rpx + env(safe-area-inset-bottom));
234 box-sizing: border-box;
235 }
236
231 .wBox { 237 .wBox {
232 width: 700rpx; 238 width: 700rpx;
233 padding: 30rpx; 239 padding: 30rpx;
...@@ -246,4 +252,4 @@ ...@@ -246,4 +252,4 @@
246 } 252 }
247 } 253 }
248 254
249 </style>
...\ No newline at end of file ...\ No newline at end of file
255 </style>
......
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
12 <radio :checked="form.selfSelect == '1'" class="custom-radio" value="1"/> 12 <radio :checked="form.selfSelect == '1'" class="custom-radio" value="1"/>
13 <text class="radio-text">自行录入考官(级位考官)</text> 13 <text class="radio-text">自行录入考官(级位考官)</text>
14 </label> 14 </label>
15 <label v-if="shenForm.memberEpAudit==1" class="radio-item"> 15 <label class="radio-item">
16 <radio :checked="form.selfSelect == '0'" class="custom-radio" value="0"/> 16 <radio :checked="form.selfSelect == '0'" class="custom-radio" value="0"/>
17 <text class="radio-text">省跆协指派考官</text> 17 <text class="radio-text">省跆协指派考官</text>
18 </label> 18 </label>
......
...@@ -405,10 +405,11 @@ function checkDialogs() { ...@@ -405,10 +405,11 @@ function checkDialogs() {
405 405
406 async function checkExamPointDialog() { 406 async function checkExamPointDialog() {
407 console.log('checkExamPointDialog', app.globalData.userInfo.hintFlag ) 407 console.log('checkExamPointDialog', app.globalData.userInfo.hintFlag )
408 const [err, res] = await to(api.getMyRecentExam()) 408 // const [err, res] = await to(api.getMyRecentExam())
409 if (err || !res?.data) return 409 // if (err || !res?.data) return
410 const status = res.data?.auditStatus 410 // const status = res.data?.auditStatus
411 if ((status == 0 || status == 3) && 411 // (status == 0 || status == 3) &&
412 if (
412 app.globalData.memberInfo?.activeStatus == 1 && 413 app.globalData.memberInfo?.activeStatus == 1 &&
413 app.globalData.authenticationStatus == 2 && 414 app.globalData.authenticationStatus == 2 &&
414 app.globalData.deptType == 6 && 415 app.globalData.deptType == 6 &&
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!