9da759d0 by 杨炀

no message

1 parent c450dde1
...@@ -5,7 +5,7 @@ import { ...@@ -5,7 +5,7 @@ import {
5 import * as api from '@/common/api.js'; 5 import * as api from '@/common/api.js';
6 import config from '@/config.js'; 6 import config from '@/config.js';
7 7
8 let loginUrl=['pages/index/login', 'pages/index/register'] 8 let loginUrl=['login/login', 'login/register']
9 let firstload = false 9 let firstload = false
10 export default { 10 export default {
11 onLaunch: function(options) { 11 onLaunch: function(options) {
...@@ -27,13 +27,13 @@ export default { ...@@ -27,13 +27,13 @@ export default {
27 }) 27 })
28 .catch(() => { 28 .catch(() => {
29 uni.redirectTo({ 29 uni.redirectTo({
30 url: '/pages/index/login' 30 url: '/login/login'
31 }) 31 })
32 }) 32 })
33 } else { 33 } else {
34 this.globalData.isLogin = false; 34 this.globalData.isLogin = false;
35 uni.redirectTo({ 35 uni.redirectTo({
36 url: '/pages/index/login' 36 url: '/login/login'
37 }) 37 })
38 } 38 }
39 } 39 }
......
...@@ -738,7 +738,204 @@ function cancelMerge(id) { ...@@ -738,7 +738,204 @@ function cancelMerge(id) {
738 url: '/exam/info/cancelMerge/' + id, 738 url: '/exam/info/cancelMerge/' + id,
739 method: 'post' 739 method: 'post'
740 }) 740 })
741 } 741 }
742 function getInfoModRange(params) {
743 return request({
744 url: `/person/infoModRange/list`,
745 method: 'get',
746 params:params
747 })
748 }
749 function addInfoModeList(data) {
750 return request({
751 url: `/person/infoMod/list`,
752 method: 'get',
753 params: data
754 })
755 }
756 function infoMod(ids) {
757 return request({
758 url: `/person/infoMod/${ids}`,
759 method: 'delete'
760 })
761 }
762 function commitPersonalChange(ids) {
763 return request({
764 url: `/person/infoModRange/commit/${ids}`,
765 method: 'post'
766 })
767 }
768 function delPersonalChange(ids) {
769 return request({
770 url: `/person/infoModRange/${ids}`,
771 method: 'delete'
772 })
773 }
774 function addInfoModeToRange(data) {
775 return request({
776 url: `/person/infoMod/addInfoModeToRange/${data.perIds}?rangeIdStr=${data.rangeIdStr}`,
777 method: 'post'
778 })
779 }
780 function addGroupInfoModeToRange(data) {
781 return request({
782 url: `/member/infoMod/addInfoModeToRange/${data.memId}?rangeIdStr=${data.rangeIdStr}`,
783 method: 'post'
784 })
785 }
786 function personChangeEditMod(data) {
787 return request({
788 url: `/person/infoMod/editMod`,
789 method: 'post',
790 params: data
791 })
792 }
793 function groupChangeEditMod(data) {
794 return request({
795 url: `/member/infoMod/editMod`,
796 method: 'post',
797 params: data
798 })
799 }
800 function personChangeWithDraw(ids) {
801 return request({
802 url: `/person/infoModRange/withDraw/${ids}`,
803 method: 'post'
804 })
805 }
806 function personChangeAudit(data) {
807 return request({
808 url: `/person/infoModRange/audit/${data.ids}?flag=${data.flag}&reason=${data.reason}`,
809 method: 'post'
810 })
811 }
812 function groupChangeAudit(data) {
813 return request({
814 url: `/member/infoModRange/audit/${data.ids}?flag=${data.flag}&reason=${data.reason}`,
815 method: 'post'
816 })
817 }
818 function pickUpByPersonInfo(form) {
819 return request({
820 url: `/person/technology/getPersonTecDetailsByIdc/${form.idcType}/${form.idcCode}`,
821 method: 'get'
822 })
823 }
824 function getLevelChangeAddList(params) {
825 return request({
826 url: `/person/levelMod/list`,
827 method: 'get',
828 params: params
829 })
830 }
831 function getChangelevelList(params) {
832 return request({
833 url: `/person/levelModRange/list`,
834 method: 'get',
835 params: params
836 })
837 }
838 function addLevelList(data) {
839 return request({
840 url: `/person/levelMod/addLevelModToRange`,
841 method: 'post',
842 params:data
843 })
844 }
845 function addLevelModToRange(data) {
846 return request({
847 url: `/person/levelMod/editModInfo/${data.modId}?reason=${data.reason}&modId=${data.modId}`,
848 method: 'post'
849 })
850 }
851 function addLevelModToRangeFile(data) {
852 return request({
853 url: `/person/levelMod/editModInfo/${data.modId}?modId=${data.modId}&fileUrl=${encodeURIComponent(data.fileUrl)}`,
854 method: 'post'
855 })
856 }
857 function levelModRangeDelete(ids) {
858 return request({
859 url: `/person/levelModRange/${ids}`,
860 method: 'delete'
861 })
862 }
863 function commitLevelChange(ids) {
864 return request({
865 url: `/person/levelModRange/commit/${ids}`,
866 method: 'post'
867 })
868 }
869 function editNewJi(data) {
870 return request({
871 url: `/person/levelMod/editNewJi/${data.modId}?newJi=${data.NewJi}`,
872 method: 'post'
873 })
874 }
875 function delLevelChangePer(data) {
876 return request({
877 url: `/person/levelMod/${data}`,
878 method: 'delete'
879 })
880 }
881 function levelModCommit(ids) {
882 return request({
883 url: `/person/levelModRange/commit/${ids}`,
884 method: 'post'
885 })
886 }
887 function changeLevelAudit(data) {
888 return request({
889 url: `/person/levelModRange/audit/${data.ids}?flag=${data.flag}&reason=${data.reason}`,
890 method: 'post'
891 })
892 }
893 function changeLevelWithDraw(data) {
894 return request({
895 url: `/person/levelModRange/withDraw/${data}`,
896 method: 'post'
897 })
898 }
899 function getMemberInfoModRange(data) {
900 return request({
901 url: `/member/infoModRange/list`,
902 method: 'get',
903 params: data
904 })
905 }
906 function commitGroupChange(ids) {
907 return request({
908 url: `/member/infoModRange/commit/${ids}`,
909 method: 'post'
910 })
911 }
912 function delGroupChange(ids) {
913 return request({
914 url: `/member/infoModRange/${ids}`,
915 method: 'delete'
916 })
917 }
918 function getChangeGroupByRangeId(data) {
919 return request({
920 url: `/member/infoMod/list`,
921 method: 'get',
922 params: data
923 })
924 }
925 function groupInfoMod(ids) {
926 return request({
927 url: `/member/infoMod/${ids}`,
928 method: 'delete'
929 })
930 }
931 function extractInfoFromChinaIdCard(data) {
932 return request({
933 url: '/person/info/extractInfo',
934 method: 'post',
935 params: data
936 })
937 }
938
742 export { 939 export {
743 getMessage, 940 getMessage,
744 reader, 941 reader,
...@@ -820,5 +1017,18 @@ export { ...@@ -820,5 +1017,18 @@ export {
820 doMergeFlowsPer, 1017 doMergeFlowsPer,
821 unMerge, dellevelPerson, getExamPersonNum, 1018 unMerge, dellevelPerson, getExamPersonNum,
822 doVerityBack,delRange,groupWithDraw, 1019 doVerityBack,delRange,groupWithDraw,
823 delLevel,cancelMerge,submitPayment 1020 delLevel,cancelMerge,submitPayment,
1021 getInfoModRange,addInfoModeList,infoMod,
1022 commitPersonalChange,delPersonalChange,
1023 addInfoModeToRange,
1024 personChangeEditMod,personChangeWithDraw,
1025 personChangeAudit,pickUpByPersonInfo,
1026 getLevelChangeAddList,getChangelevelList,addLevelList,
1027 addLevelModToRange,levelModRangeDelete,commitLevelChange,
1028 editNewJi,delLevelChangePer,levelModCommit,addLevelModToRangeFile,
1029 changeLevelAudit,changeLevelWithDraw,
1030
1031 getMemberInfoModRange,commitGroupChange,delGroupChange,
1032 getChangeGroupByRangeId,groupInfoMod,addGroupInfoModeToRange,
1033 groupChangeEditMod,groupChangeAudit,extractInfoFromChinaIdCard
824 } 1034 }
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -29,7 +29,7 @@ function h5LoginAuto() { ...@@ -29,7 +29,7 @@ function h5LoginAuto() {
29 return h5Login(userName) 29 return h5Login(userName)
30 } else { 30 } else {
31 uni.redirectTo({ 31 uni.redirectTo({
32 url: '/pages/index/login' 32 url: '/login/login'
33 }) 33 })
34 } 34 }
35 } 35 }
...@@ -81,8 +81,10 @@ function getInfo() { ...@@ -81,8 +81,10 @@ function getInfo() {
81 method: 'get' 81 method: 'get'
82 }).then(res => { 82 }).then(res => {
83 const app = getApp() 83 const app = getApp()
84 const user = res.data.user 84 const user = res.data.user
85 uni.setStorageSync('userName', user.userName) 85 // const personInfo = res.data.personInfo
86 uni.setStorageSync('userName', user.userName)
87 // uni.setStorageSync('perId', personInfo.perId||-1)
86 app.globalData.deptType = user.dept.deptType 88 app.globalData.deptType = user.dept.deptType
87 switch (user.dept.deptType) { 89 switch (user.dept.deptType) {
88 case '1': // 中跆协 90 case '1': // 中跆协
......
This diff could not be displayed because it is too large.
...@@ -24,8 +24,9 @@ function getHeaders() { ...@@ -24,8 +24,9 @@ function getHeaders() {
24 const token = getToken() 24 const token = getToken()
25 const header = { 25 const header = {
26 'Authorization': token, 26 'Authorization': token,
27 'Content-Type': 'application/json' // 根据自己的数据类型 27 'Content-Type': 'application/json', // 根据自己的数据类型
28 // "Content-Type":"application/x-www-form-urlencoded", 28 // "Content-Type":"application/x-www-form-urlencoded",
29 'Ztx-Per-Id': uni.getStorageSync('perId') || '-1'
29 } 30 }
30 return header 31 return header
31 } 32 }
...@@ -41,11 +42,11 @@ const request = function(req) { ...@@ -41,11 +42,11 @@ const request = function(req) {
41 } 42 }
42 43
43 // if (req.method === 'GET') { 44 // if (req.method === 'GET') {
44 // if (!req.params) { 45 // if (!req.params) {
45 // req.params = {} 46 // req.params = {}
46 // } 47 // }
47 // req.params.pageNum = req.params.pageNum || 1 48 // req.params.pageNum = req.params.pageNum || 1
48 // req.params.pageSize = req.params.pageSize || 50 49 // req.params.pageSize = req.params.pageSize || 50
49 // } 50 // }
50 51
51 // if (req.method == 'POST' && !req.hideLoding) { 52 // if (req.method == 'POST' && !req.hideLoding) {
...@@ -70,27 +71,27 @@ const request = function(req) { ...@@ -70,27 +71,27 @@ const request = function(req) {
70 resolve(data) 71 resolve(data)
71 } else { 72 } else {
72 // if (!excludeUrls.includes(req.url)) { 73 // if (!excludeUrls.includes(req.url)) {
73 // if (data.msg) { 74 // if (data.msg) {
74 // uni.showModal({ 75 // uni.showModal({
75 // content: data.msg, 76 // content: data.msg,
76 // success: function(res) { 77 // success: function(res) {
77 78
78 // } 79 // }
79 // }) 80 // })
80 uni.showToast({ 81 uni.showToast({
81 title: data.msg, 82 title: data.msg,
82 icon: 'none', 83 icon: 'none',
83 duration: 2000 84 duration: 2000
84 }) 85 })
85 // } 86 // }
86 // uni.hideLoading() 87 // uni.hideLoading()
87 88
88 // } 89 // }
89 90
90 // 登录超时 91 // 登录超时
91 if (data.code === 60002 || data.code === 60001) { 92 if (data.code === 60002 || data.code === 60001) {
92 uni.redirectTo({ 93 uni.redirectTo({
93 url: '/pages/index/login' 94 url: '/login/login'
94 }) 95 })
95 } else if (data.code === 401) { 96 } else if (data.code === 401) {
96 h5LoginAuto() 97 h5LoginAuto()
......
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
2 // const baseUrl_api = 'https://research.wtwuxicenter.com/'; 2 // const baseUrl_api = 'https://research.wtwuxicenter.com/';
3 3
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 = "http://123.60.96.243//stage-api/"; 7 // const baseUrl_api = "http://123.60.96.243/stage-api/";
8 // const baseUrl_api = 'http://192.168.1.11:8787' 8 const baseUrl_api = 'http://192.168.1.11:8787'
9 const baseUrl_api = 'https://ztx.itechtop.cn/stage-api' 9 // const baseUrl_api = 'https://ztx.itechtop.cn/stage-api'
10 // const baseUrl_api = 'https://newsystem.taekwondo.org.cn/stage-api/' 10 // const baseUrl_api = 'https://newsystem.taekwondo.org.cn/stage-api/'
11
12 // train
13 // const baseUrl_api = 'http://192.168.1.25:8686'
11 14
12 export default { 15 export default {
13 baseUrl_api 16 baseUrl_api
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
4 <view class="invertedbtn-red" @click="gochose">+ 在线选择</view> 4 <view class="invertedbtn-red" @click="gochose">+ 在线选择</view>
5 </view> 5 </view>
6 <uni-swipe-action> 6 <uni-swipe-action>
7 <uni-swipe-action-item class="personitem" v-for="n in list"> 7 <uni-swipe-action-item class="personitem" v-for="(n,index) in list" :key="index">
8 <view class="content-box"> 8 <view class="content-box">
9 <view style="width: 70%;"> 9 <view style="width: 70%;">
10 <view>{{n.memberName}} 10 <view>{{n.memberName}}
...@@ -60,7 +60,7 @@ ...@@ -60,7 +60,7 @@
60 60
61 <uni-popup ref="pickView" type="bottom"> 61 <uni-popup ref="pickView" type="bottom">
62 <view class="pickViewBox"> 62 <view class="pickViewBox">
63 <view v-for="n in yearlist" @click="bindyear(n)"> 63 <view v-for="(n,index) in yearlist" :key="index" @click="bindyear(n)">
64 {{n.text}}<uni-icons v-show="n.value == (nowYear)" type="checkmarkempty" size="20" 64 {{n.text}}<uni-icons v-show="n.value == (nowYear)" type="checkmarkempty" size="20"
65 color="green"></uni-icons> 65 color="green"></uni-icons>
66 </view> 66 </view>
...@@ -255,7 +255,7 @@ ...@@ -255,7 +255,7 @@
255 box-sizing: border-box; 255 box-sizing: border-box;
256 margin-bottom: 30rpx; 256 margin-bottom: 30rpx;
257 257
258 .content-box { 258 .content-box {background: #fff;
259 display: flex; 259 display: flex;
260 align-items: center; 260 align-items: center;
261 padding: 16rpx; 261 padding: 16rpx;
......
1 <template>
2 <view>
3 <view class="searchbar">
4 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
5 v-model="queryParams.code" placeholder="搜索变更单号" @blur="getList" @clear="getList">
6 </uni-easyinput>
7 </view>
8 <view class="vipData">
9 <view>变更团体数合计: <text>{{statistical.personCount}}</text></view>
10 </view>
11 <view class="appList">
12 <view class="appItem" v-for="(item,index) in list" :key="index">
13 <view class="status" @click="goDetail(item)">
14 <view>
15 <text v-if="item.status == 0" class="text-warning">待提交</text>
16 <text v-if="item.status == 1" class="text-primary">审核中</text>
17 <text v-if="item.status == 2" class="text-success">审核通过</text>
18 <text v-if="item.status == 3" class="text-danger">审核拒绝</text>
19 <text v-if="item.status == 4" class="text-warning">已撤回</text>
20 </view>
21 </view>
22
23 <view class="name mt0" @click="goDetail(item)">
24 {{item.code}}-{{item.shenMemName}}
25 </view>
26 <view class="flexbox" @click="goDetail(item)">
27 <view>
28 变更团体数
29 <view>
30 <text class="text-danger">{{item.count}}</text>
31 </view>
32 </view>
33 <view class="w50">
34 提交时间
35 <view>{{item.commitTime||'--'}}</view>
36 </view>
37 </view>
38 <view class="func" v-if="item.status==1">
39 <button @click="audit(item.id,0)">拒绝</button>
40 <button @click="audit(item.id,1)">同意</button>
41 </view>
42 <!-- <view class="func" v-if="item.status==2">
43 <button @click="handleDelete(item)">撤回</button>
44 </view> -->
45
46 </view>
47 </view>
48 <view class="nodata" v-if="list.length==0">
49 <image mode="aspectFit" src="/static/nodata.png"></image>
50 <text>暂无数据</text>
51 </view>
52 </view>
53 </template>
54
55 <script setup>
56 import * as api from '@/common/api.js'
57 import config from '@/config.js'
58 import {
59 ref
60 } from 'vue'
61 import {
62 onLoad,
63 onShow
64 } from '@dcloudio/uni-app'
65 const app = getApp();
66 const queryParams = ref({
67 code:'',
68 ztxFlag: '1'
69 })
70 const list = ref([])
71 const statistical = ref({
72 personCount: 0
73 })
74 const total = ref(0)
75 onShow(()=>{
76 getList()
77 })
78 function getList(){
79 uni.showLoading({
80 title:'加载中'
81 })
82 statistical.value.personCount = 0
83 api.getMemberInfoModRange(queryParams.value).then(res=>{
84 list.value = res.rows
85 list.value.forEach(item => {
86 statistical.value.personCount += (item.count * 1)
87 })
88 total.value = res.total
89 uni.hideLoading()
90 })
91 }
92 function goDetail(item){
93 let path = `/group/changeGroupDetail?rangeId=${item.id}`
94 uni.navigateTo({
95 url: path
96 });
97 }
98 function handleDelete(row){
99 uni.showModal({
100 title: '提示',
101 content: `确定撤回吗`,
102 success: function(res) {
103 if (res.confirm) {
104 api.personChangeWithDraw([row.id]).then(Response=>{
105 uni.showToast({
106 icon:"none",
107 title:'撤回成功!'
108 })
109 getList()
110 })
111 }
112 }
113 })
114 }
115 function audit(id, flag) {
116 if (flag == 0) {
117 // 拒绝
118 // 弹出框填写理由
119 uni.showModal({
120 title: '请输入拒绝理由',
121 editable: true,
122 success: function(res) {
123 if (res.confirm) {
124 if (!res.content) {
125 uni.showToast({
126 title: '请输入拒绝理由',
127 icon: 'none'
128 })
129 } else {
130 doApproval(id, flag, res.content)
131 }
132 }
133 }
134 })
135 } else if (flag == 1) {
136 // 二次确认
137 uni.showModal({
138 title: '提示',
139 content: `确定审批通过吗`,
140 success: function(res) {
141 if (res.confirm) {
142 doApproval(id, flag)
143 }
144 }
145 })
146 }
147 }
148
149 function doApproval(id, flag, reason) {
150 var obj = {
151 flag: flag,
152 reason: reason || '',
153 ids: [id]
154 }
155 console.log(obj)
156 api.groupChangeAudit(obj).then((res) => {
157 uni.showToast({
158 title: '操作成功',
159 icon: 'none'
160 })
161 getList()
162 })
163 }
164
165 </script>
166
167 <style lang='scss' scoped>
168 .searchbar {
169 display: flex;
170 align-items: center;
171 padding: 25rpx;
172 box-sizing: border-box;
173
174 :deep(.uni-easyinput .uni-easyinput__content) {
175 border-radius: 35rpx;
176 border: none;
177 height: 70rpx;
178 }
179
180 :deep(.uni-easyinput__content-input) {
181 font-size: 26rpx;
182 }
183
184 .invertedbtn-red {
185 border-radius: 50px;
186 background-color: #fff;
187
188 font-size: 30rpx;
189 padding: 10rpx 20rpx;
190 }
191 }
192
193 </style>
1 <template>
2 <view>
3 <uni-collapse>
4 <uni-collapse-item :title="n.newName" v-for="n in list" :key="n.id" open>
5 <view class="collapseBody">
6 <view>
7 <label>会员编号:</label>
8 <text>{{n.memCode}}</text>
9 </view>
10 <view>
11 <label>团体会员名称:</label>
12 <view>
13 {{n.oldName}}
14 <text class="text-primary" v-if="n.oldName!=n.newName">变更为 </text>
15 <text class="text-danger" v-if="n.oldName!=n.newName">{{ n.newName }}</text>
16
17 </view>
18 </view>
19
20 <view v-if="n.fileUrl">
21 <label>附件:</label>
22 <text class="text-primary" @click="showImg(n)">
23 查看附件
24 </text>
25 </view>
26 </view>
27
28 </uni-collapse-item>
29 </uni-collapse>
30
31 </view>
32 </template>
33
34 <script setup>
35 import {
36 ref
37 } from 'vue'
38 import {
39 onLoad
40 } from '@dcloudio/uni-app'
41 import * as api from '@/common/api.js'
42 import config from '@/config.js'
43 const queryParams = ref({})
44 const total = ref(0)
45 const list = ref([])
46 const popup = ref(null)
47 const type = ref('')
48 const form = ref({})
49 onLoad((option) => {
50 if (option.rangeId) {
51 queryParams.value.rangeId = option.rangeId
52 getList()
53 }
54 })
55
56 function getList() {
57 uni.showLoading({
58 title: '加载中'
59 })
60 api.getChangeGroupByRangeId(queryParams.value).then(res => {
61 list.value = res.rows
62 list.value.forEach(item => {
63 item.fileUrl = JSON.parse(item.fileUrl)
64 })
65 total.value = res.total
66 uni.hideLoading()
67 })
68 }
69
70 function showImg(n) {
71 var str = config.baseUrl_api + n.fileUrl[0]?.url
72 if (n.fileUrl[0]?.url.indexOf('png') > -1 || n.fileUrl[0]?.url.indexOf('jpg') > -1 || n.fileUrl[0]?.url.indexOf(
73 'jpeg') > -1) {
74 uni.previewImage({
75 urls: [str],
76 success: function(res) {
77 console.log('success', res)
78 },
79 fail: function(res) {
80 console.log('fail', res)
81 },
82 complete: function(res) {
83 console.log('complete', res)
84 }
85 })
86 } else {
87 goWebView(str)
88 }
89 }
90
91 function goWebView(url) {
92 url = url.replace("http://", "https://")
93 uni.showLoading({
94 title: '下载中'
95 });
96 uni.downloadFile({
97 url: url,
98 success: function(res) {
99 uni.hideLoading();
100 var filePath = res.tempFilePath;
101 uni.showLoading({
102 title: '正在打开'
103 });
104 uni.openDocument({
105 filePath: filePath,
106 showMenu: true,
107 success: function(res) {
108 uni.hideLoading();
109 },
110 fail: function(err) {
111 uni.hideLoading();
112 uni.showToast({
113 title: err,
114 icon: 'none',
115 duration: 2000
116 });
117 }
118 });
119 },
120 fail: function(error) {
121 uni.hideLoading();
122 uni.showToast({
123 title: `下载失败`,
124 icon: 'none',
125 duration: 2000
126 });
127 }
128 });
129 }
130 </script>
131 <style scoped lang="scss">
132 .flexbox {
133 padding: 30rpx 30rpx 0
134 }
135
136 .danger-button {
137 display: flex;
138 flex-direction: column;
139 align-items: center;
140 justify-content: center;
141 }
142
143 .collapseBody {
144 padding: 0 30rpx;
145 box-sizing: border-box;
146 font-size: 28rpx;
147
148 &>view {
149 margin: 0 0 20rpx;display: flex;
150
151 label {
152 width: 7em;
153 color: #999;
154 display: inline-block;
155 text-align: right;flex:0 0 auto;
156 }
157 view{flex:1 1 auto;}
158 }
159 }
160
161 .popBody {
162 background: #fff;
163 padding: 30rpx;
164 }
165 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <view>
3 <view class="searchbar">
4 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
5 v-model="queryParams.code" placeholder="搜索变更单号" @blur="getList" @clear="getList">
6 </uni-easyinput>
7 <view class="invertedbtn-red" @click="goAdd">+ 新建变更</view>
8 </view>
9
10 <view class="appList">
11 <view class="appItem" v-for="(item,index) in list" :key="index">
12 <view class="status" @click="goDetail(item)">
13 <view>
14 <text v-if="item.status == 0" class="text-warning">待提交</text>
15 <text v-if="item.status == 1" class="text-primary">审核中</text>
16 <text v-if="item.status == 2" class="text-success">审核通过</text>
17 <text v-if="item.status == 3" class="text-danger">审核拒绝</text>
18 <text v-if="item.status == 4" class="text-warning">已撤回</text>
19 </view>
20 </view>
21
22 <view class="name mt0" @click="goDetail(item)">
23 {{item.code}}-{{item.shenMemName}}
24 </view>
25 <view class="flexbox" @click="goDetail(item)">
26 <view>
27 变更会员数
28 <view>
29 <text class="text-danger">{{item.count}}</text>
30 </view>
31
32 </view>
33
34 <view class="w50">
35 提交时间
36 <view>{{item.commitTime||'--'}}</view>
37 </view>
38 </view>
39 <view class="func" v-if="(item.status==0||item.status==3||item.status==4)">
40 <button @click="handleUpdate(item)">编辑</button>
41 <button @click="commitFN(item)">提交审核</button>
42 <button @click="handleDelete(item)">删除</button>
43 </view>
44
45 </view>
46 </view>
47
48
49
50 <view class="nodata" v-if="list.length==0">
51 <image mode="aspectFit" src="/static/nodata.png"></image>
52 <text>暂无数据</text>
53 </view>
54 </view>
55 </template>
56
57 <script setup>
58 import * as api from '@/common/api.js'
59 import config from '@/config.js'
60 import {
61 ref
62 } from 'vue'
63 import {
64 onLoad,
65 onShow
66 } from '@dcloudio/uni-app'
67 const app = getApp();
68 const queryParams = ref({
69 code:''
70 })
71 const list = ref([])
72 const total = ref(0)
73 onShow(()=>{
74 getList()
75 })
76 function goAdd(){
77 let path = `/group/newChange`
78 uni.navigateTo({
79 url: path
80 });
81 }
82 function getList(){
83 uni.showLoading({
84 title:'加载中'
85 })
86 queryParams.value.memId = app.globalData.memberInfo.memId
87 api.getMemberInfoModRange(queryParams.value).then(res=>{
88 list.value = res.rows
89 total.value = res.total
90 uni.hideLoading()
91 })
92 }
93 function goDetail(item){
94 let path = `/group/changeGroupDetail?rangeId=${item.id}`
95 uni.navigateTo({
96 url: path
97 });
98 }
99 function handleUpdate(item){
100 // 编辑
101 let path = `/group/newChange?rangeId=${item.id}`
102 uni.navigateTo({
103 url: path
104 });
105 }
106 function commitFN(row){
107 uni.showModal({
108 title: '提示',
109 content: `确定提交吗`,
110 success: function(res) {
111 if (res.confirm) {
112 api.commitGroupChange(row.id).then(Response=>{
113 uni.showToast({
114 icon:"none",
115 title:'提交成功!'
116 })
117 getList()
118 })
119 }
120 }
121 })
122 }
123 function handleDelete(row){
124 uni.showModal({
125 title: '提示',
126 content: `确定删除吗`,
127 success: function(res) {
128 if (res.confirm) {
129 api.delGroupChange([row.id]).then(Response=>{
130 uni.showToast({
131 icon:"none",
132 title:'删除成功!'
133 })
134 getList()
135 })
136 }
137 }
138 })
139 }
140
141 </script>
142
143 <style lang='scss' scoped>
144 .searchbar {
145 display: flex;
146 align-items: center;
147 padding: 25rpx;
148 box-sizing: border-box;
149
150 :deep(.uni-easyinput .uni-easyinput__content) {
151 border-radius: 35rpx;
152 border: none;
153 height: 70rpx;
154 }
155
156 :deep(.uni-easyinput__content-input) {
157 font-size: 26rpx;
158 }
159
160 .invertedbtn-red {
161 border-radius: 50px;
162 background-color: #fff;
163
164 font-size: 30rpx;
165 padding: 10rpx 20rpx;
166 }
167 }
168
169 </style>
1 <template>
2 <view class="hasfixedbottom">
3
4 <view class="flexbox mb30">
5 <button class="btn-red-kx mini w100" @click="chooseOnline">
6 <uni-icons type="personadd" size="16" color="#AD181F"></uni-icons>
7 在线选择</button>
8 </view>
9
10 <uni-swipe-action>
11 <uni-swipe-action-item class="personitem" v-for="n in list" :key="n.id">
12 <uni-collapse>
13 <uni-collapse-item :title="n.oldName" open>
14 <view class="collapseBody">
15 <view v-if="n.memCode">
16 <label>会员编号:</label>
17 {{n.memCode}}
18 </view>
19 <view>
20 <label>团体会员名称:</label>
21 {{n.oldName}}
22 <text class="text-primary" @click="handleChange(n,'newName')">变更 </text>
23 <text class="text-danger" v-if="n.oldName!=n.newName">{{ n.newName }}</text>
24 </view>
25 <view style="display: flex;">
26 <label><text class="text-danger">*</text>附件:</label>
27 <view class="content">
28 <uni-file-picker limit="1" v-model="n.fileUrl" file-extname="png,jpg,jpeg,pdf,zip"
29 file-mediatype="all" @select="selectFile(n,$event)"
30 @delete="delSupplementFile(n)"></uni-file-picker>
31 <text class="text-danger">*需上传有效资料</text>
32 </view>
33 </view>
34
35 </view>
36
37 </uni-collapse-item>
38 </uni-collapse>
39
40 <template v-slot:right>
41 <view class="slot-button">
42 <view class="danger-button" @click="handleDelete(n)">
43 <uni-icons type="trash" color="#fff" size="20"></uni-icons>
44 <text class="slot-button-text">删除</text>
45 </view>
46 </view>
47 </template>
48 </uni-swipe-action-item>
49 </uni-swipe-action>
50 <view class="nodata" v-if="list.length==0">
51 <image mode="aspectFit" src="/static/nodata.png"></image>
52 <text>请选择变更会员</text>
53 </view>
54
55 <view class="fixedBottom">
56 <button class="btn-red" :disabled="list?.length <= 0" @click="commitFN">保存并提交</button>
57 </view>
58
59
60
61 <uni-popup ref="popup" type="bottom" background-color="#fff">
62 <view class="popBody">
63 <view class="h3 text-center mb30">信息变更</view>
64 <uni-forms class="mt30" label-width="100">
65 <view style="min-height: 30vh">
66 <uni-forms-item label="团体会员名称:" v-show="type=='newName'">
67 <uni-easyinput v-model="form.newName" placeholder="请输入" />
68 </uni-forms-item>
69 </view>
70
71 </uni-forms>
72 <view class="text-center">
73 <button class="btn-red-kx" @click="submitForm(type)">保存</button>
74 </view>
75
76 </view>
77 </uni-popup>
78
79 <uni-popup ref="choseStudent" type="bottom" background-color="#fff" animation>
80 <view class="popBody">
81 <view class="searchbar">
82 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
83 v-model="query.name" placeholder="搜索团体会员名称" @blur="getSonList" @clear="getSonList">
84 </uni-easyinput>
85 <view class="invertedbtn-red" @click="getSonList">搜索</view>
86 </view>
87 <view class="userlist" style="height:70vh;overflow: auto;">
88 <view class="item" v-for=" (n,index) in studentList" :key="index">
89 <view @click="checkThis(n)">
90 <image class="icon" v-if="n.checked"
91 :src="config.baseUrl_api+'/fs/static/member/dx_dwn.png'" />
92 <image class="icon" v-else :src="config.baseUrl_api+'/fs/static/member/dx.png'" />
93 </view>
94 <view class="w100">
95 <view class="name">{{n.name}} </view>
96 <view class="flexbox" style="padding: 0">
97 <view v-if="n.memCode">会员号
98 <text>{{n.memCode}}</text>
99 </view>
100 <view class="date" v-if="n.validityDate">到期时间
101 <text>{{n.validityDate?.slice(0,10)}}</text>
102 </view>
103 <view class="date">团体类型
104 <text v-if="n.deptType == 2">一级协会</text>
105 <text v-if="n.deptType == 3">直属协会</text>
106 <text v-if="n.deptType == 4">二级协会</text>
107 <text v-if="n.deptType == 5">三级协会</text>
108 <text v-if="n.deptType == 6">职业性团体会员</text>
109 </view>
110 </view>
111 </view>
112 </view>
113 <view class="nodata" v-if="studentList.length==0">
114 <image mode="aspectFit" src="/static/nodata.png"></image>
115 <text>无可变更会员</text>
116 </view>
117 </view>
118 <button class="btn-red-kx" v-if="studentList.length!=0" @click="handleImport">批量添加</button>
119 </view>
120 </uni-popup>
121
122 </view>
123 </template>
124
125 <script setup>
126 import {
127 ref
128 } from 'vue'
129 import {
130 onLoad,
131 onShow
132 } from '@dcloudio/uni-app'
133 import * as api from '@/common/api.js'
134 import config from '/config.js'
135 const queryParams = ref({})
136 const query = ref({})
137 const total = ref(0)
138 const list = ref([])
139 const popup = ref(null)
140 const choseStudent = ref(null)
141 const studentList = ref([])
142 const type = ref('')
143 const form = ref({})
144
145 onLoad((option) => {
146 if (option.rangeId) {
147 queryParams.value.rangeId = option.rangeId
148 getList()
149 }
150 })
151 onShow(() => {})
152
153 function getList() {
154 uni.showLoading({
155 title: '加载中'
156 })
157 api.getChangeGroupByRangeId(queryParams.value).then(res => {
158 list.value = res.rows
159 list.value.forEach(item => {
160 item.fileUrl = JSON.parse(item.fileUrl)
161 })
162 total.value = res.total
163 uni.hideLoading()
164 })
165 }
166
167 function handleChange(a, b) {
168 type.value = b
169 form.value = a
170 console.log(form.value.newName)
171 popup.value.open()
172 }
173
174 function handleDelete(row) {
175 uni.showModal({
176 content: `确认删除${row.newName}`,
177 success: function(res) {
178 if (res.confirm) {
179 api.groupInfoMod([row.id]).then(Response => {
180 uni.showToast({
181 title: '操作成功'
182 })
183 getList()
184 })
185 }
186 }
187 })
188 }
189
190 function chooseOnline() {
191 uni.showLoading({
192 title: '加载中',
193 icon: 'none'
194 })
195 query.value.paymentRangeId = queryParams.value.rangeId || '-1'
196 api.getMySonList(query.value).then(res => {
197 studentList.value = res.data.rows
198 uni.hideLoading()
199 choseStudent.value.open()
200 })
201
202 }
203 function getSonList(){
204 uni.showLoading({
205 title: '加载中',
206 icon: 'none'
207 })
208 query.value.paymentRangeId = queryParams.value.rangeId || '-1'
209 api.getMySonList(query.value).then(res => {
210 studentList.value = res.data.rows
211 uni.hideLoading()
212 })
213 }
214
215 function checkThis(n) {
216 if (n.checked) {
217 n.checked = false
218 } else {
219 n.checked = true
220 }
221 }
222
223 function handleImport() {
224 var arr = []
225 for (var n of studentList.value) {
226 if (n.checked) {
227 arr.push(n.memId)
228 }
229 }
230 api.addGroupInfoModeToRange({
231 memId: arr,
232 rangeIdStr: queryParams.value.rangeId || '-1'
233 }).then(res => {
234 queryParams.value.rangeId = res.data
235 choseStudent.value.close()
236 getList()
237 })
238 }
239
240 function submitForm(type) {
241 api.groupChangeEditMod({
242 id: form.value.id,
243 newName: form.value.newName
244 }).then(res => {
245 popup.value.close()
246 uni.showToast({
247 title: '操作成功!'
248 })
249 getList()
250 })
251 }
252
253 function commitFN() {
254 const flag = list.value.some(item => {
255 if (!item.fileUrl) {
256 uni.showToast({
257 title: `请上传${item.newName}的附件`,
258 icon: 'none'
259 })
260 return !item.fileUrl
261 }
262 })
263 if (flag) return
264 if (form.value.rangeId == '') return
265
266 uni.showModal({
267 title: '提示',
268 content: `确定提交吗`,
269 success: function(res) {
270 if (res.confirm) {
271 api.commitGroupChange([queryParams.value.rangeId]).then(Response => {
272 uni.showToast({
273 icon: "none",
274 title: '提交成功!'
275 })
276 uni.navigateBack()
277 })
278 }
279 }
280 })
281 }
282 let selectFileValue = {}
283
284 function selectFile(row, e) {
285 console.log(row, e)
286 form.value = row
287 let file = e.tempFiles[0]
288 api.uploadFile(e).then(data => {
289 selectFileValue = {
290 url: data.msg,
291 name: file.name,
292 extname: file.extname
293 }
294 console.log(selectFileValue, row.fileUrl)
295 uni.showLoading({
296 title: '上传中'
297 })
298 api.groupChangeEditMod({
299 id: form.value.id,
300 newName: form.value.newName,
301 fileUrl: JSON.stringify([selectFileValue])
302 }).then(Response => {
303 uni.hideLoading()
304 getList()
305 })
306 });
307 }
308
309 function delSupplementFile(row) {
310 selectFileValue = {}
311 row.fileUrl = []
312 }
313 </script>
314 <style scoped lang="scss">
315 .searchbar {
316 display: flex;
317 align-items: center;
318 padding:0 0 25rpx;
319 box-sizing: border-box;
320
321 :deep(.uni-easyinput .uni-easyinput__content) {
322 border-radius: 35rpx;
323 height: 66rpx; border: 1px solid #AD181F!important;
324 }
325
326 :deep(.uni-easyinput__content-input) {
327 font-size: 26rpx;
328 }
329
330 .invertedbtn-red {
331 border-radius: 50px; margin-left: 20rpx;
332 background-color: #fff;
333
334 font-size: 30rpx;
335 padding: 10rpx 20rpx;
336 }
337 }
338 .userlist .item{background-color: #f4f4f4;}
339 .flexbox {
340 padding: 30rpx 30rpx 0
341 }
342
343 .danger-button {
344 display: flex;
345 flex-direction: column;
346 align-items: center;
347 justify-content: center;
348 }
349
350 .collapseBody {
351 padding: 0 30rpx;
352 box-sizing: border-box;
353 font-size: 28rpx;
354
355 view {
356 margin: 0 0 20rpx;
357
358 label {
359 width: 7em;
360 color: #999;
361 display: inline-block;
362 text-align: right;
363 }
364 }
365 }
366
367 .popBody {
368 background: #fff;
369 padding: 30rpx;
370 }
371
372 .text-center .btn-red-kx {
373 border-radius: 50px;
374 font-size: 28rpx;
375 }
376 :deep(.file-picker__progress){opacity: 0;}
377 </style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -47,7 +47,8 @@ ...@@ -47,7 +47,8 @@
47 47
48 <script setup> 48 <script setup>
49 import * as api from '@/common/api.js' 49 import * as api from '@/common/api.js'
50 import config from '@/config.js' 50 import config from '@/config.js'
51 import {szToHz} from '@/common/utils.js'
51 import { 52 import {
52 onMounted, 53 onMounted,
53 ref 54 ref
...@@ -58,8 +59,9 @@ ...@@ -58,8 +59,9 @@
58 import _ from 'lodash' 59 import _ from 'lodash'
59 const queryParams = ref({ 60 const queryParams = ref({
60 pageNum: 1, 61 pageNum: 1,
61 pageSize: 20 62 pageSize: 10
62 }) 63 })
64 const studentquery = ref({})
63 const paging = ref(null) 65 const paging = ref(null)
64 const userType = ref('') 66 const userType = ref('')
65 const list = ref([]) 67 const list = ref([])
...@@ -67,94 +69,76 @@ ...@@ -67,94 +69,76 @@
67 const total = ref(0) 69 const total = ref(0)
68 const app = getApp(); 70 const app = getApp();
69 onLoad((option)=>{ 71 onLoad((option)=>{
70 console.log(option) 72 if ('studentquery' in option) {
71 if ('obj' in option) { 73 studentquery.value = JSON.parse(decodeURIComponent(option.studentquery))
72 queryParams.value = JSON.parse(decodeURIComponent(option.obj)) 74 queryParams.value.examId = studentquery.value.examId
73 } 75 }
74 if (app.globalData.isLogin) { 76 if (app.globalData.isLogin) {
75 userType.value = app.globalData.userType 77 userType.value = app.globalData.userType
76 } else { 78 } else {
77
78 app.firstLoadCallback = () => { 79 app.firstLoadCallback = () => {
79 userType.value = app.globalData.userType 80 userType.value = app.globalData.userType
80 }; 81 };
81 } 82 }
82 }) 83 })
83 onMounted(() => { 84 onMounted(() => {
84 getList() 85 // getList()
85 }) 86 })
86 87
87 function getList() { 88 function getList() {
88 api.getStudentList(queryParams.value).then(res => { 89 api.getStudentList(queryParams.value).then(res => {
89 paging.value.complete(res.rows); 90 paging.value.complete(res.rows);
90 91 if(!studentquery.value.recordId){
91 const levelArr = [] 92 getVipData({
92 let total = 0
93 if(!queryParams.value.recordId){
94 var obj = {
95 examId:queryParams.value.examId, 93 examId:queryParams.value.examId,
96 type:'1' 94 type:'1'
97 } 95 })
98 }else{ 96 }else{
99 var obj = { 97 getVipData({
100 examId:queryParams.value.examId, 98 examId:queryParams.value.examId,
101 recordId:queryParams.value.recordId, 99 recordId:studentquery.value.recordId,
102 type:'1' 100 type:'1'
103 } 101 })
104 } 102 }
105 api.getExamPersonNum(obj).then(res=>{
106 _.each(res.data, (val, key) => {
107 if (val > 0) {
108 levelArr.push({
109 level: key,
110 num: val
111 })
112 total += val
113 }
114 })
115
116 tablePersonInfo.value = {
117 total: total,
118 levelArr: _.sortBy(levelArr, (l) => {
119 return l.level
120 })
121 }
122 })
123
124 }) 103 })
125 } 104 }
105 function getVipData(obj){
106 const levelArr = []
107 let total = 0
108 if(!queryParams.value.examId) return
109 api.getExamPersonNum(obj).then(res=>{
110 _.each(res.data, (val, key) => {
111 if (val > 0) {
112 levelArr.push({
113 level: key,
114 num: val
115 })
116 total += val
117 }
118 })
119
120 tablePersonInfo.value = {
121 total: total,
122 levelArr: _.sortBy(levelArr, (l) => {
123 return l.level
124 })
125 }
126 })
127 }
126 function getQuery(pageNum,pageSize) { 128 function getQuery(pageNum,pageSize) {
127 queryParams.value.pageNum = pageNum 129 // if(total.value>0&&list.value.length>=total.value){
130 // return
131 // }
132 queryParams.value.pageNum = pageNum,
128 queryParams.value.pageSize = pageSize 133 queryParams.value.pageSize = pageSize
129 api.getStudentList(queryParams.value).then(res=>{ 134 api.getStudentList(queryParams.value).then(res=>{
130 paging.value.complete(res.rows); 135 paging.value.complete(res.rows);
131 // total.value = res.total 136 total.value = res.total
132 137 getVipData({
133 const levelArr = [] 138 examId:queryParams.value.examId,
134 let total = 0 139 type:'1'
135 api.getExamPersonNum(queryParams.value.examId, '1').then(res=>{
136 _.each(res.data, (val, key) => {
137 if (val > 0) {
138 levelArr.push({
139 level: key,
140 num: val
141 })
142 total += val
143 }
144 })
145
146 tablePersonInfo.value = {
147 total: total,
148 levelArr: _.sortBy(levelArr, (l) => {
149 return l.level
150 })
151 }
152 }) 140 })
153 }) 141 })
154 }
155 function szToHz(num) {
156 const hzArr = ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
157 return hzArr[parseInt(num)]
158 } 142 }
159 </script> 143 </script>
160 144
......
...@@ -44,7 +44,8 @@ ...@@ -44,7 +44,8 @@
44 44
45 <script setup> 45 <script setup>
46 import * as api from '@/common/api.js' 46 import * as api from '@/common/api.js'
47 import config from '@/config.js' 47 import config from '@/config.js'
48 import {szToHz} from '@/common/utils.js'
48 import { 49 import {
49 ref, 50 ref,
50 getCurrentInstance 51 getCurrentInstance
...@@ -80,12 +81,6 @@ ...@@ -80,12 +81,6 @@
80 }) 81 })
81 } 82 }
82 83
83 function szToHz(num) {
84 const hzArr = ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十']
85 return hzArr[parseInt(num)]
86 }
87
88
89 function sendCert(row) { 84 function sendCert(row) {
90 let msg 85 let msg
91 if(row.isCert==1){ 86 if(row.isCert==1){
......
...@@ -139,7 +139,7 @@ function register() { ...@@ -139,7 +139,7 @@ function register() {
139 } 139 }
140 140
141 function goLogin() { 141 function goLogin() {
142 let path = '/pages/index/login'; 142 let path = '/login/login';
143 uni.navigateTo({ 143 uni.navigateTo({
144 url: path 144 url: path
145 }); 145 });
...@@ -225,7 +225,7 @@ function timeup() { ...@@ -225,7 +225,7 @@ function timeup() {
225 } 225 }
226 226
227 .formbox { 227 .formbox {
228 background: #fff; 228 background: #fff;box-sizing: border-box;
229 width: 700rpx; 229 width: 700rpx;
230 padding: 30rpx 50rpx; 230 padding: 30rpx 50rpx;
231 margin: auto; 231 margin: auto;
......
...@@ -38,10 +38,7 @@ ...@@ -38,10 +38,7 @@
38 "quickapp" : {}, 38 "quickapp" : {},
39 /* 小程序特有相关 */ 39 /* 小程序特有相关 */
40 "mp-weixin" : { 40 "mp-weixin" : {
41 "appid" : "wx70f16625f10de4fe", //J系统 41 "appid" : "wx523ee37fff4fea9d",
42
43 // "appid" : "wx70f16625f10de4fe",//新跆联
44 // "appid" : "wx5e2471ed6210c3a6",
45 "setting" : { 42 "setting" : {
46 "urlCheck" : false, 43 "urlCheck" : false,
47 "minified" : false, 44 "minified" : false,
......
...@@ -11,20 +11,6 @@ ...@@ -11,20 +11,6 @@
11 } 11 }
12 }, 12 },
13 { 13 {
14 "path": "pages/index/login",
15 "style": {
16 "navigationBarTitleText": "登录",
17 "enablePullDownRefresh": false,
18 "navigationStyle": "custom"
19 }
20 }, {
21 "path": "pages/index/register",
22 "style": {
23 "navigationBarTitleText": "注册",
24 "enablePullDownRefresh": false,
25 "navigationStyle": "custom"
26 }
27 }, {
28 "path": "pages/index/msgList", 14 "path": "pages/index/msgList",
29 "style": { 15 "style": {
30 "navigationBarTitleText": "待办列表", 16 "navigationBarTitleText": "待办列表",
...@@ -114,7 +100,25 @@ ...@@ -114,7 +100,25 @@
114 "navigationBarBackgroundColor": "#ffffff", 100 "navigationBarBackgroundColor": "#ffffff",
115 "navigationBarTitleText": "中跆协-工作台" 101 "navigationBarTitleText": "中跆协-工作台"
116 }, 102 },
117 "subPackages": [{ 103 "subPackages": [
104 {
105 "root": "login",
106 "pages": [{
107 "path": "login",
108 "style": {
109 "navigationBarTitleText": "登录",
110 "enablePullDownRefresh": false,
111 "navigationStyle": "custom"
112 }
113 }, {
114 "path": "register",
115 "style": {
116 "navigationBarTitleText": "注册",
117 "enablePullDownRefresh": false,
118 "navigationStyle": "custom"
119 }
120 }]
121 },{
118 "root": "personalVip", 122 "root": "personalVip",
119 "pages": [{ 123 "pages": [{
120 "path": "addVip", 124 "path": "addVip",
...@@ -230,6 +234,70 @@ ...@@ -230,6 +234,70 @@
230 "navigationBarTitleText": "会员缴费人员列表", 234 "navigationBarTitleText": "会员缴费人员列表",
231 "enablePullDownRefresh": false 235 "enablePullDownRefresh": false
232 } 236 }
237 },
238 {
239 "path" : "changeVip",
240 "style" :
241 {
242 "navigationBarTitleText" : "会员信息变更",
243 "enablePullDownRefresh" : false
244 }
245 },
246 {
247 "path" : "addChange",
248 "style" :
249 {
250 "navigationBarTitleText" : "新增变更",
251 "enablePullDownRefresh" : false
252 }
253 },
254 {
255 "path" : "changeVipDetail",
256 "style" :
257 {
258 "navigationBarTitleText" : "详情",
259 "enablePullDownRefresh" : false
260 }
261 },
262 {
263 "path" : "changeVipAudit",
264 "style" :
265 {
266 "navigationBarTitleText" : "会员信息变更审核",
267 "enablePullDownRefresh" : false
268 }
269 },
270 {
271 "path" : "changeLevel",
272 "style" :
273 {
274 "navigationBarTitleText" : "级位变更审核",
275 "enablePullDownRefresh" : false
276 }
277 },
278 {
279 "path" : "addChangeLevel",
280 "style" :
281 {
282 "navigationBarTitleText" : "新建级位变更",
283 "enablePullDownRefresh" : false
284 }
285 },
286 {
287 "path" : "changeLevelDetail",
288 "style" :
289 {
290 "navigationBarTitleText" : "级位变更详情",
291 "enablePullDownRefresh" : false
292 }
293 },
294 {
295 "path" : "changeLevelAudit",
296 "style" :
297 {
298 "navigationBarTitleText" : "级位变更审批",
299 "enablePullDownRefresh" : false
300 }
233 }] 301 }]
234 }, { 302 }, {
235 "root": "group", 303 "root": "group",
...@@ -327,6 +395,38 @@ ...@@ -327,6 +395,38 @@
327 "navigationBarTitleText": "会员列表", 395 "navigationBarTitleText": "会员列表",
328 "enablePullDownRefresh": false 396 "enablePullDownRefresh": false
329 } 397 }
398 },
399 {
400 "path" : "changeGroupInfo",
401 "style" :
402 {
403 "navigationBarTitleText" : "团体会员信息修改",
404 "enablePullDownRefresh" : false
405 }
406 },
407 {
408 "path" : "changeGroupAudit",
409 "style" :
410 {
411 "navigationBarTitleText" : "团体信息变更审核",
412 "enablePullDownRefresh" : false
413 }
414 },
415 {
416 "path" : "changeGroupDetail",
417 "style" :
418 {
419 "navigationBarTitleText" : "团体信息变更详情",
420 "enablePullDownRefresh" : false
421 }
422 },
423 {
424 "path" : "newChange",
425 "style" :
426 {
427 "navigationBarTitleText" : "新建团体信息变更",
428 "enablePullDownRefresh" : false
429 }
330 }] 430 }]
331 },{ 431 },{
332 "root": "level", 432 "root": "level",
...@@ -429,11 +529,29 @@ ...@@ -429,11 +529,29 @@
429 "enablePullDownRefresh": false 529 "enablePullDownRefresh": false
430 } 530 }
431 }] 531 }]
532 },{
533 "root": "training",
534 "pages":[{
535 "path" : "trainList",
536 "style" :
537 {
538 "navigationBarTitleText" : "培训列表",
539 "enablePullDownRefresh" : false
540 }
541 },
542 {
543 "path" : "detailPage",
544 "style" :
545 {
546 "navigationBarTitleText" : "培训详情",
547 "enablePullDownRefresh" : false
548 }
549 }]
432 }], 550 }],
433 "preloadRule": { 551 "preloadRule": {
434 "pages/index/index": { 552 "pages/index/index": {
435 "network": "all", 553 "network": "all",
436 "packages": ["personalVip", "group","level"] 554 "packages": ["login","personalVip", "group","level","training"]
437 } 555 }
438 } 556 }
439 } 557 }
...\ No newline at end of file ...\ No newline at end of file
......
This diff could not be displayed because it is too large.
1 <template> 1 <template>
2 <view> 2 <view>
3 <view v-if="userType=='1'" class="girdBox f3"> 3 <view v-if="userType=='1'" class="girdBox f3">
4 <view @click="goPath('/pages/rank/approval?type=2')">
5 <image :src="config.baseUrl_api+'/fs/static/icon/19.png'" />段位考试审核
6 </view>
7 <view @click="goPath('/pages/rank/scoreApproval?type=2')">
8 <image :src="config.baseUrl_api+'/fs/static/icon/19.png'" />考段成绩审核
9 </view>
10 <view @click="goPath('/level/ztx/cert?type=2')">
11 <image :src="config.baseUrl_api+'/fs/static/icon/20.png'" />考段证书发布
12 </view>
4 <view @click="goPath('/pages/rank/approval?type=3')"> 13 <view @click="goPath('/pages/rank/approval?type=3')">
5 <image :src="config.baseUrl_api+'/fs/static/icon/21.png'" />越段考试审核 14 <image :src="config.baseUrl_api+'/fs/static/icon/21.png'" />越段考试审核
6 </view> 15 </view>
...@@ -12,6 +21,16 @@ ...@@ -12,6 +21,16 @@
12 </view> 21 </view>
13 </view> 22 </view>
14 <view class="girdBox" v-if="userType=='2'"> 23 <view class="girdBox" v-if="userType=='2'">
24 <view @click="goPath('/group/feeBill')">
25 <image :src="config.baseUrl_api+'/fs/static/icon/17.png'" />团体会员缴费单
26 </view>
27 <view @click="goPath('/level/approval')">
28 <image :src="config.baseUrl_api+'/fs/static/icon/3.png'" />级位考试审核
29 </view>
30 <view @click="goPath('/pages/exam/payment?type=1')">
31 <image :src="config.baseUrl_api+'/fs/static/icon/10.png'" />级位考试缴费单
32 </view>
33
15 <view @click="goPath('/pages/rank/apply?type=2')"> 34 <view @click="goPath('/pages/rank/apply?type=2')">
16 <image :src="config.baseUrl_api+'/fs/static/icon/11.png'" />段位考试申请 35 <image :src="config.baseUrl_api+'/fs/static/icon/11.png'" />段位考试申请
17 </view> 36 </view>
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
2 <view class="hasfixedbottom"> 2 <view class="hasfixedbottom">
3 <view class="nolineform"> 3 <view class="nolineform">
4 <uni-forms :border="true" :modelValue="baseFormData" label-width="120"> 4 <uni-forms :border="true" :modelValue="baseFormData" label-width="120">
5 <uni-forms-item label="姓名" required name="name"> 5 <!-- <uni-forms-item label="姓名" required name="name">
6 <uni-easyinput :styles="inputstyle" :clearable='false' :placeholderStyle="placeholderStyle" 6 <uni-easyinput :styles="inputstyle" :clearable='false' :placeholderStyle="placeholderStyle"
7 v-model="baseFormData.name" placeholder="请输入姓名" /> 7 v-model="baseFormData.name" placeholder="请输入姓名" />
8 </uni-forms-item> 8 </uni-forms-item> -->
9 <uni-forms-item label="证件类型" required name="idcType"> 9 <uni-forms-item label="证件类型" required name="idcType">
10 <uni-data-select v-model="baseFormData.idcType" :localdata="idcTypeList" 10 <uni-data-select v-model="baseFormData.idcType" :localdata="idcTypeList"
11 :clear="false"></uni-data-select> 11 :clear="false"></uni-data-select>
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
25 <view>人数合计 <text class="text-danger"> {{ total}} </text></view> 25 <view>人数合计 <text class="text-danger"> {{ total}} </text></view>
26 </view> 26 </view>
27 <uni-swipe-action> 27 <uni-swipe-action>
28 <uni-swipe-action-item class="personitem" v-for="n in list"> 28 <uni-swipe-action-item class="personitem" v-for="(n,index) in list" :key="index">
29 <view class="content-box" @click="handleInfo(n)"> 29 <view class="content-box" @click="handleInfo(n)">
30 <view class="flexbox"> 30 <view class="flexbox">
31 <view class="photobox"> 31 <view class="photobox">
...@@ -84,6 +84,10 @@ ...@@ -84,6 +84,10 @@
84 { 84 {
85 value: '3', 85 value: '3',
86 text: "外国护照" 86 text: "外国护照"
87 },
88 {
89 value: '4',
90 text: "其他"
87 } 91 }
88 ]) 92 ])
89 const baseFormData = ref({ 93 const baseFormData = ref({
...@@ -104,13 +108,13 @@ ...@@ -104,13 +108,13 @@
104 }) 108 })
105 // 查询会员 109 // 查询会员
106 function selectMember() { 110 function selectMember() {
107 if (!baseFormData.value.name) { 111 // if (!baseFormData.value.name) {
108 uni.showToast({ 112 // uni.showToast({
109 title: '请输入姓名', 113 // title: '请输入姓名',
110 icon: 'none' 114 // icon: 'none'
111 }) 115 // })
112 return 116 // return
113 } 117 // }
114 118
115 if (!baseFormData.value.idcCode) { 119 if (!baseFormData.value.idcCode) {
116 uni.showToast({ 120 uni.showToast({
...@@ -120,7 +124,7 @@ ...@@ -120,7 +124,7 @@
120 return 124 return
121 } 125 }
122 126
123 127 baseFormData.value.fromTransfer = '1'
124 api.pickUp(baseFormData.value).then(res => { 128 api.pickUp(baseFormData.value).then(res => {
125 baseFormData.value.perId = res.data.perId 129 baseFormData.value.perId = res.data.perId
126 baseFormData.value.ancestorNameList = res.data.ancestorNameList 130 baseFormData.value.ancestorNameList = res.data.ancestorNameList
...@@ -134,13 +138,13 @@ ...@@ -134,13 +138,13 @@
134 } 138 }
135 139
136 function submitForm() { 140 function submitForm() {
137 if (!baseFormData.value.name) { 141 // if (!baseFormData.value.name) {
138 uni.showToast({ 142 // uni.showToast({
139 title: '请输入姓名', 143 // title: '请输入姓名',
140 icon: 'none' 144 // icon: 'none'
141 }) 145 // })
142 return 146 // return
143 } 147 // }
144 148
145 if (!baseFormData.value.idcCode) { 149 if (!baseFormData.value.idcCode) {
146 uni.showToast({ 150 uni.showToast({
...@@ -165,8 +169,8 @@ ...@@ -165,8 +169,8 @@
165 title:'新增成功' 169 title:'新增成功'
166 }) 170 })
167 } 171 }
168 baseFormData.value.rangeId = res.data 172 baseFormData.value.rangeId = res.data.rangeId
169 queryParams.value.rangeId = res.data 173 queryParams.value.rangeId = res.data.rangeId
170 flag.value = true 174 flag.value = true
171 baseFormData.value.idcType = '0' 175 baseFormData.value.idcType = '0'
172 baseFormData.value.idcCode = '' 176 baseFormData.value.idcCode = ''
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
13 v-model="baseFormData.name" placeholder="请输入姓名" /> 13 v-model="baseFormData.name" placeholder="请输入姓名" />
14 </uni-forms-item> 14 </uni-forms-item>
15 <uni-forms-item label="证件类型" required name="idcType"> 15 <uni-forms-item label="证件类型" required name="idcType">
16 <uni-data-select v-model="baseFormData.idcType" :localdata="idcTypeList"></uni-data-select> 16 <uni-data-select v-model="baseFormData.idcType" :clearable="false" :disabled="current === 0" :localdata="idcTypeList"></uni-data-select>
17 </uni-forms-item> 17 </uni-forms-item>
18 <uni-forms-item label="证件照" required name="picUrl" v-show="current === 1"> 18 <uni-forms-item label="证件照" required name="picUrl" v-show="current === 1">
19 <view class="upCard"> 19 <view class="upCard">
...@@ -54,11 +54,8 @@ ...@@ -54,11 +54,8 @@
54 54
55 <uni-forms-item label="头像" required name="photo"> 55 <uni-forms-item label="头像" required name="photo">
56 <uni-file-picker v-model="photoArr" @delete="delPhoto" return-type="object" limit="1" 56 <uni-file-picker v-model="photoArr" @delete="delPhoto" return-type="object" limit="1"
57 @select="upPhoto" :del-ico="false" :image-styles="imageStylesTx"></uni-file-picker> 57 @select="upPhoto" :del-ico="false" :image-styles="imageStylesTx"></uni-file-picker>
58 </uni-forms-item> 58 </uni-forms-item>
59
60
61
62 </view> 59 </view>
63 60
64 61
...@@ -105,6 +102,18 @@ ...@@ -105,6 +102,18 @@
105 <button @click="closepopup" class="btn-red">我已阅读</button> 102 <button @click="closepopup" class="btn-red">我已阅读</button>
106 </view> 103 </view>
107 </uni-popup> 104 </uni-popup>
105
106 <uni-popup ref="infoConfirm" type="center">
107 <view class="tt">确认信息</view>
108 <view class="popBody">
109 <view>
110
111 </view>
112
113 <button @click="closepopup" class="btn-red">已确认</button>
114 </view>
115 </uni-popup>
116
108 </view> 117 </view>
109 </template> 118 </template>
110 119
...@@ -118,7 +127,8 @@ ...@@ -118,7 +127,8 @@
118 } from '@dcloudio/uni-app' 127 } from '@dcloudio/uni-app'
119 import config from '@/config.js' 128 import config from '@/config.js'
120 const current = ref(0) 129 const current = ref(0)
121 const popup = ref(null) 130 const popup = ref(null)
131 const infoConfirm = ref(null)
122 const agree = ref(false) 132 const agree = ref(false)
123 const perId = ref() 133 const perId = ref()
124 const photoArr = ref([]) 134 const photoArr = ref([])
...@@ -141,11 +151,7 @@ ...@@ -141,11 +151,7 @@
141 { 151 {
142 value: '3', 152 value: '3',
143 text: "外国护照" 153 text: "外国护照"
144 }, 154 },{
145 {
146 value: '4',
147 text: "其它"
148 }, {
149 value: '5', 155 value: '5',
150 text: '户口本' 156 text: '户口本'
151 } 157 }
...@@ -194,6 +200,9 @@ ...@@ -194,6 +200,9 @@
194 function onClickItem(e) { 200 function onClickItem(e) {
195 if (current.value != e.currentIndex) { 201 if (current.value != e.currentIndex) {
196 current.value = e.currentIndex 202 current.value = e.currentIndex
203 }
204 if(current.value==0){
205 baseFormData.value.idcType = '0'
197 } 206 }
198 } 207 }
199 208
...@@ -248,31 +257,71 @@ ...@@ -248,31 +257,71 @@
248 icon: 'none' 257 icon: 'none'
249 }) 258 })
250 } else { 259 } else {
251 let tmpStr = ""; 260 // let tmpStr = "";
252 if (baseFormData.value.idcCode.length == 15) { 261 // if (baseFormData.value.idcCode.length == 15) {
253 tmpStr = baseFormData.value.idcCode.substring(6, 12); 262 // tmpStr = baseFormData.value.idcCode.substring(6, 12);
254 tmpStr = "19" + tmpStr; 263 // tmpStr = "19" + tmpStr;
255 tmpStr = tmpStr.substring(0, 4) + "-" + tmpStr.substring(4, 6) + "-" + tmpStr.substring(6) 264 // tmpStr = tmpStr.substring(0, 4) + "-" + tmpStr.substring(4, 6) + "-" + tmpStr.substring(6)
256 265
257 } else { 266 // } else {
258 tmpStr = baseFormData.value.idcCode.substring(6, 14); 267 // tmpStr = baseFormData.value.idcCode.substring(6, 14);
259 tmpStr = tmpStr.substring(0, 4) + "-" + tmpStr.substring(4, 6) + "-" + tmpStr.substring(6) 268 // tmpStr = tmpStr.substring(0, 4) + "-" + tmpStr.substring(4, 6) + "-" + tmpStr.substring(6)
260 269
261 } 270 // }
262 271
263 baseFormData.value.birth = tmpStr 272 // baseFormData.value.birth = tmpStr
264 273
265 const sse = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/ 274 // const sse = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/
266 if (sse.test(baseFormData.value.idcCode)) { 275 // if (sse.test(baseFormData.value.idcCode)) {
267 const genderCode = baseFormData.value.idcCode.charAt(16) 276 // const genderCode = baseFormData.value.idcCode.charAt(16)
268 if (parseInt(genderCode) % 2 == 0) { 277 // if (parseInt(genderCode) % 2 == 0) {
269 baseFormData.value.sex = '1' 278 // baseFormData.value.sex = '1'
270 } else { 279 // } else {
271 baseFormData.value.sex = '0' 280 // baseFormData.value.sex = '0'
272 } 281 // }
273 } 282 // }
283
284 //如果老会员
285 api.extractInfoFromChinaIdCard({
286 idcCode:baseFormData.value.idcCode,
287 idcType:baseFormData.value.idcType,
288 perType:baseFormData.value.perType,
289 }).then(res=>{
290 perId.value = res.data.perId
291 baseFormData.value.sex = res.data.sex
292 baseFormData.value.birth = res.data.birth
293 baseFormData.value.phone = res.data.phone
294 baseFormData.value.cityId = res.data.cityId
295 baseFormData.value.address = res.data.address
296 photoArr.value = []
297 if(res.data.photo){
298 baseFormData.value.photo = res.data.photo
299 let obj = {
300 url: config.baseUrl_api + res.data.photo,
301 name:'头像',
302 extname:'jpg'
303 }
304 photoArr.value.push(obj)
305 }
306 baseFormData.value.name = res.data.name
307 baseFormData.value.perId = res.data.perId
308 })
309
274 } 310 }
275 } 311 }
312 if (baseFormData.value.idcType == 1||baseFormData.value.idcType == 3||baseFormData.value.idcType == 4){
313 //转换为大写并判断位数12
314 baseFormData.value.idcCode = baseFormData.value.idcCode.toUpperCase()
315 // var regex = /^[a-zA-Z]/
316 if(baseFormData.value.idcCode.length>12){
317 uni.showToast({
318 icon: 'none',
319 title: '请输入正确的证件号',
320 duration: 2000
321 })
322 return
323 }
324 }
276 } 325 }
277 326
278 function changeSex(e) { 327 function changeSex(e) {
...@@ -320,9 +369,22 @@ ...@@ -320,9 +369,22 @@
320 }) 369 })
321 return 370 return
322 } 371 }
372 if (baseFormData.value.idcType == 1||baseFormData.value.idcType == 3||baseFormData.value.idcType == 4){
373 //转换为大写并判断位数12
374 baseFormData.value.idcCode = baseFormData.value.idcCode.toUpperCase()
375 // var regex = /^[a-zA-Z]/
376 if(baseFormData.value.idcCode.length>12){
377 uni.showToast({
378 icon: 'none',
379 title: '请输入正确的证件号',
380 duration: 2000
381 })
382 return
383 }
384 }
323 //信息确认弹出 385 //信息确认弹出
324 uni.showModal({ 386 uni.showModal({
325 content: '确认信息正确', 387 content: '确认信息正确',
326 success: function(res) { 388 success: function(res) {
327 if (res.confirm) { 389 if (res.confirm) {
328 api.addPersonToMyDept(baseFormData.value).then(res => { 390 api.addPersonToMyDept(baseFormData.value).then(res => {
......
1 <template>
2 <view>
3 <view class="searchbar">
4 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
5 v-model="queryParams.code" placeholder="搜索变更单号" @blur="getList" @clear="getList">
6 </uni-easyinput>
7 <view class="invertedbtn-red" @click="goAdd">+ 新建级位变更</view>
8 </view>
9
10 <view class="appList">
11 <view class="appItem" v-for="(item,index) in list" :key="index">
12 <view class="status" @click="goDetail(item)">
13 <view>
14 <text v-if="item.status == 0" class="text-warning">待提交</text>
15 <text v-if="item.status == 1" class="text-primary">审核中</text>
16 <text v-if="item.status == 2" class="text-success">审核通过</text>
17 <text v-if="item.status == 3" class="text-danger">审核拒绝</text>
18 <text v-if="item.status == 4" class="text-warning">已撤回</text>
19 </view>
20 </view>
21
22 <view class="name mt0" @click="goDetail(item)">
23 {{item.code}}-{{item.shenMemName}}
24 </view>
25 <view class="flexbox" @click="goDetail(item)">
26 <view>
27 变更人数
28 <view>
29 <text class="text-danger">{{item.count}}</text>
30 </view>
31
32 </view>
33
34 <view class="w50">
35 提交时间
36 <view>{{item.commitTime||'--'}}</view>
37 </view>
38 </view>
39 <view class="func" v-if="(item.status==0||item.status==3||item.status==4)">
40 <button @click="handleUpdate(item)">编辑</button>
41 <button @click="commitFN(item)">提交审核</button>
42 <button @click="handleDelete(item)">删除</button>
43 </view>
44
45 </view>
46 </view>
47
48
49
50 <view class="nodata" v-if="list.length==0">
51 <image mode="aspectFit" src="/static/nodata.png"></image>
52 <text>暂无数据</text>
53 </view>
54 </view>
55 </template>
56
57 <script setup>
58 import * as api from '@/common/api.js'
59 import config from '@/config.js'
60 import {
61 ref
62 } from 'vue'
63 import {
64 onLoad,
65 onShow
66 } from '@dcloudio/uni-app'
67 const app = getApp();
68 const queryParams = ref({
69 code:''
70 })
71 const list = ref([])
72 const total = ref(0)
73 onShow(()=>{
74 getList()
75 })
76 function goAdd(){
77 let path = `/personalVip/addChangeLevel`
78 uni.navigateTo({
79 url: path
80 });
81 }
82 function getList(){
83 uni.showLoading({
84 title:'加载中'
85 })
86 api.getChangelevelList(queryParams.value).then(res=>{
87 list.value = res.rows
88 total.value = res.total
89 uni.hideLoading()
90 })
91 }
92 function goDetail(item){
93 let path = `/personalVip/changeLevelDetail?rangeId=${item.id}`
94 uni.navigateTo({
95 url: path
96 });
97 }
98 function handleUpdate(item){
99 // 编辑
100 let path = `/personalVip/addChangeLevel?rangeId=${item.id}`
101 uni.navigateTo({
102 url: path
103 });
104 }
105 function commitFN(row){
106 uni.showModal({
107 title: '提示',
108 content: `确定提交吗`,
109 success: function(res) {
110 if (res.confirm) {
111 api.commitLevelChange(row.id).then(Response=>{
112 uni.showToast({
113 icon:"none",
114 title:'提交成功!'
115 })
116 getList()
117 })
118 }
119 }
120 })
121 }
122 function handleDelete(row){
123 uni.showModal({
124 title: '提示',
125 content: `确定删除吗`,
126 success: function(res) {
127 if (res.confirm) {
128 api.levelModRangeDelete([row.id]).then(Response=>{
129 uni.showToast({
130 icon:"none",
131 title:'删除成功!'
132 })
133 getList()
134 })
135 }
136 }
137 })
138 }
139
140 </script>
141
142 <style lang='scss' scoped>
143 .searchbar {
144 display: flex;
145 align-items: center;
146 padding: 25rpx;
147 box-sizing: border-box;
148
149 :deep(.uni-easyinput .uni-easyinput__content) {
150 border-radius: 35rpx;
151 border: none;
152 height: 70rpx;
153 }
154
155 :deep(.uni-easyinput__content-input) {
156 font-size: 26rpx;
157 }
158
159 .invertedbtn-red {
160 border-radius: 50px;
161 background-color: #fff;
162
163 font-size: 30rpx;
164 padding: 10rpx 20rpx;
165 }
166 }
167
168 </style>
1 <template>
2 <view>
3 <view class="searchbar">
4 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
5 v-model="queryParams.code" placeholder="搜索变更单号" @blur="getList" @clear="getList">
6 </uni-easyinput>
7 </view>
8 <view class="vipData">
9 <view>级位变更人数合计: <text>{{statistical.personCount}}</text></view>
10 </view>
11 <view class="appList">
12 <view class="appItem" v-for="(item,index) in list" :key="index">
13 <view class="status" @click="goDetail(item)">
14 <view>
15 <text v-if="item.status == 0" class="text-warning">待提交</text>
16 <text v-if="item.status == 1" class="text-primary">审核中</text>
17 <text v-if="item.status == 2" class="text-success">审核通过</text>
18 <text v-if="item.status == 3" class="text-danger">审核拒绝</text>
19 <text v-if="item.status == 4" class="text-warning">已撤回</text>
20 </view>
21 </view>
22
23 <view class="name mt0" @click="goDetail(item)">
24 {{item.code}}-{{item.shenMemName}}
25 </view>
26 <view class="flexbox" @click="goDetail(item)">
27 <view>
28 变更人数
29 <view>
30 <text class="text-danger">{{item.count}}</text>
31 </view>
32 </view>
33 <view class="w50">
34 提交时间
35 <view>{{item.commitTime||'--'}}</view>
36 </view>
37 </view>
38 <view class="func" v-if="item.status==1">
39 <button @click="audit(item.id,'0')">拒绝</button>
40 <button @click="audit(item.id,'1')">同意</button>
41 </view>
42 <view class="func" v-if="item.status==2">
43 <button @click="handleDelete(item)">撤回</button>
44 </view>
45 </view>
46 </view>
47 <view class="nodata" v-if="list.length==0">
48 <image mode="aspectFit" src="/static/nodata.png"></image>
49 <text>暂无数据</text>
50 </view>
51 </view>
52 </template>
53
54 <script setup>
55 import * as api from '@/common/api.js'
56 import config from '@/config.js'
57 import {
58 ref
59 } from 'vue'
60 import {
61 onLoad,
62 onShow
63 } from '@dcloudio/uni-app'
64 const app = getApp();
65 const queryParams = ref({
66 code: '',
67 ztxList: 0
68 })
69 const list = ref([])
70 const statistical = ref({
71 personCount: 0
72 })
73 const total = ref(0)
74 onShow(() => {
75 getList()
76 })
77
78 function getList() {
79 uni.showLoading({
80 title: '加载中'
81 })
82 statistical.value.personCount = 0
83 api.getChangelevelList(queryParams.value).then(res => {
84 list.value = res.rows
85 list.value.forEach(item => {
86 statistical.value.personCount += (item.count * 1)
87 })
88 total.value = res.total
89 uni.hideLoading()
90 })
91 }
92
93 function goDetail(item) {
94 let path = `/personalVip/changeLevelDetail?rangeId=${item.id}`
95 uni.navigateTo({
96 url: path
97 });
98 }
99
100 function handleDelete(row) {
101 uni.showModal({
102 title: '提示',
103 content: `确定撤回吗`,
104 success: function(res) {
105 if (res.confirm) {
106 api.changeLevelWithDraw([row.id]).then(Response => {
107 uni.showToast({
108 icon: "none",
109 title: '撤回成功!'
110 })
111 getList()
112 })
113 }
114 }
115 })
116 }
117
118 function audit(id, flag) {
119 if (flag == 0) {
120 // 拒绝
121 // 弹出框填写理由
122 uni.showModal({
123 title: '请输入拒绝理由',
124 editable: true,
125 success: function(res) {
126 if (res.confirm) {
127 if (!res.content) {
128 uni.showToast({
129 title: '请输入拒绝理由',
130 icon: 'none'
131 })
132 } else {
133 doApproval(id, flag, res.content)
134 }
135 }
136 }
137 })
138 } else if (flag == '1') {
139 // 二次确认
140 uni.showModal({
141 title: '提示',
142 content: `确定审批通过吗`,
143 success: function(res) {
144 if (res.confirm) {
145 doApproval(id, flag)
146 }
147 }
148 })
149 }
150 }
151
152 function doApproval(id, flag, reason) {
153 var obj = {
154 flag: flag,
155 reason: reason || '',
156 ids: [id]
157 }
158 console.log(obj)
159 api.changeLevelAudit(obj).then((res) => {
160 uni.showToast({
161 title: '操作成功',
162 icon: 'none'
163 })
164 getList()
165 })
166 }
167 </script>
168
169 <style lang='scss' scoped>
170 .searchbar {
171 display: flex;
172 align-items: center;
173 padding: 25rpx;
174 box-sizing: border-box;
175
176 :deep(.uni-easyinput .uni-easyinput__content) {
177 border-radius: 35rpx;
178 border: none;
179 height: 70rpx;
180 }
181
182 :deep(.uni-easyinput__content-input) {
183 font-size: 26rpx;
184 }
185
186 .invertedbtn-red {
187 border-radius: 50px;
188 background-color: #fff;
189
190 font-size: 30rpx;
191 padding: 10rpx 20rpx;
192 }
193 }
194 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <view>
3 <view class="wBox">
4 <uni-collapse>
5 <uni-collapse-item v-for="n in list" :key="n.id" :border="false"
6 :title="n.perName+' - '+ szToHz(n.oldJi)+'级'" title-border="none" open>
7 <view class="collapseBody">
8 <view>
9 <label>变更后级别: </label>
10 <view class="content">
11 {{szToHz(n.newJi)}}
12 </view>
13 </view>
14 <view>
15 <label>变更理由: </label>
16 <view class="content">
17 {{reasonArr[Number(n.reason)-1]?.text}}
18 </view>
19 </view>
20 <view>
21 <label>附件: </label>
22 <view class="content">
23 <view class="text-primary" @click="showImg(n)">
24 查看附件
25 </view>
26
27 </view>
28 </view>
29 <view>
30 <label>级位编号: </label>
31 <view class="content">
32 {{n.examPersonData.certCode}}
33 </view>
34 </view>
35 <view>
36 <label>证件类型: </label>
37 <view class="content">{{idcTypeList[n.idcType]?.text}}</view>
38 </view>
39 <view>
40 <label>证件编号: </label>
41 <view class="content">{{n.idcCode}}</view>
42 </view>
43 <view>
44 <label>通过日期: </label>
45 <view class="content">{{n.examPersonData.certTime.slice(0,10)}}</view>
46 </view>
47
48 </view>
49 </uni-collapse-item>
50 </uni-collapse>
51
52 </view>
53 </view>
54 </template>
55
56 <script setup>
57 import {
58 ref
59 } from 'vue'
60 import {
61 onLoad,
62 onShow
63 } from '@dcloudio/uni-app'
64 import {
65 szToHz
66 } from '@/common/utils.js'
67 import * as api from '@/common/api.js'
68 import config from '../config';
69 const inputstyle = ref({
70 borderColor: '#fff',
71 fontSize: '30rpx'
72 })
73 const placeholderStyle = ref('text-align: right;font-size:30rpx')
74 const levelArr = ref([{
75 text: '九级',
76 value: '9'
77 },
78 {
79 text: '八级',
80 value: '8'
81 },
82 {
83 text: '七级',
84 value: '7'
85 },
86 {
87 text: '六级',
88 value: '6'
89 },
90 {
91 text: '五级',
92 value: '5'
93 },
94 {
95 text: '四级',
96 value: '4'
97 },
98 {
99 text: '三级',
100 value: '3'
101 },
102 {
103 text: '二级',
104 value: '2'
105 },
106 {
107 text: '一级',
108 value: '1'
109 }
110 ])
111 const reasonArr = ref([{
112 text: '报错级位',
113 value: '1'
114 },
115 {
116 text: '以前有级位无法报下一级',
117 value: '2'
118 },
119 {
120 text: '其它',
121 value: '3'
122 }
123 ])
124 const idcTypeList = ref([{
125 value: '0',
126 text: "身份证"
127 },
128 {
129 value: '1',
130 text: "港澳台通信身份证"
131 },
132 {
133 value: '2',
134 text: "中国护照"
135 },
136 {
137 value: '3',
138 text: "外国护照"
139 },
140 {
141 value: '4',
142 text: "其它"
143 },
144 {
145 value: '5',
146 text: "户口本"
147 }
148 ])
149 const baseFormData = ref({
150 idcType: '0'
151 })
152 const list = ref([])
153 const levelList = ref([])
154 const total = ref(0)
155 const flag = ref(true)
156 const popup = ref(null)
157 const queryParams = ref({
158 rangeId: ''
159 })
160 onLoad((option) => {
161 if (option.rangeId) {
162 baseFormData.value.rangeId = option.rangeId
163 queryParams.value.rangeId = option.rangeId
164 }
165 })
166 onShow(() => {
167 if (queryParams.value.rangeId != '') {
168 getList()
169 }
170 })
171 // 查询会员
172 function selectMember() {
173 if (!baseFormData.value.idcCode) {
174 uni.showToast({
175 title: '请输入证件号',
176 icon: 'none'
177 })
178 return
179 }
180
181 api.pickUpByPersonInfo(baseFormData.value).then(res => {
182 if (res.data.length == 0) {
183 uni.showModal({
184 title: '提示',
185 content: '该会员无级位考试记录',
186 success: function(res) {}
187 })
188 return
189 }
190
191 levelList.value = res.data
192 popup.value.open()
193 })
194 }
195
196 function submitForm() {
197 if (!baseFormData.value.name) {
198 uni.showToast({
199 title: '请输入姓名',
200 icon: 'none'
201 })
202 return
203 }
204
205 if (!baseFormData.value.idcCode) {
206 uni.showToast({
207 title: '请输入证件号',
208 icon: 'none'
209 })
210 return
211 }
212 api.addTransferToRange({
213 rangeId: baseFormData.value.rangeId || -1,
214 personIdArray: baseFormData.value.personIdArray
215 }).then(res => {
216 if (res.data.result == 0) {
217 uni.showModal({
218 content: res.data?.list?.[0]?.msg,
219 success: function(res) {
220
221 }
222 })
223 } else {
224 uni.showToast({
225 title: '新增成功'
226 })
227 }
228 baseFormData.value.rangeId = res.data
229 queryParams.value.rangeId = res.data
230 flag.value = true
231 baseFormData.value.idcType = '0'
232 baseFormData.value.idcCode = ''
233 baseFormData.value.name = ''
234 getList()
235 })
236 }
237
238 function getList() {
239 uni.showLoading({
240 title: '加载中'
241 })
242 api.getLevelChangeAddList(queryParams.value).then(Response => {
243 list.value = Response.rows
244 for (var item of list.value) {
245 item.examPersonData = JSON.parse(item.examPersonData)
246 if (item.fileUrl) {
247 item.fileUrl = JSON.parse(item.fileUrl)
248 }
249 }
250 total.value = Response.total
251 uni.hideLoading()
252 })
253 }
254
255 function showImg(n) {
256 var str= config.baseUrl_api + n.fileUrl[0]?.url
257 if(n.fileUrl[0]?.url.indexOf('png')>-1||n.fileUrl[0]?.url.indexOf('jpg')>-1||n.fileUrl[0]?.url.indexOf('jpeg')>-1){
258 uni.previewImage({
259 urls: [str],
260 success: function(res) {
261 console.log('success', res)
262 },
263 fail: function(res) {
264 console.log('fail', res)
265 },
266 complete: function(res) {
267 console.log('complete', res)
268 }
269 })
270 }else{
271 goWebView(str)
272 }
273 }
274 function goWebView(url){
275 url = url.replace("http://", "https://")
276 uni.showLoading({
277 title: '下载中'
278 });
279 uni.downloadFile({
280 url: url,
281 success: function(res) {
282 uni.hideLoading();
283 var filePath = res.tempFilePath;
284 uni.showLoading({
285 title: '正在打开'
286 });
287 uni.openDocument({
288 filePath: filePath,
289 showMenu: true,
290 success: function(res) {
291 uni.hideLoading();
292 },
293 fail: function(err) {
294 uni.hideLoading();
295 uni.showToast({
296 title: err,
297 icon: 'none',
298 duration: 2000
299 });
300 }
301 });
302 },
303 fail: function(error) {
304 uni.hideLoading();
305 uni.showToast({
306 title: `下载失败`,
307 icon: 'none',
308 duration: 2000
309 });
310 }
311 });
312 }
313 </script>
314
315 <style scoped lang="scss">
316 .wBox {
317 width: 700rpx;
318 margin: 20rpx auto 0;
319 background: #FFFFFF;
320 box-shadow: 0rpx 12rpx 116rpx 0rpx rgba(196, 203, 214, 0.1);
321 border-radius: 15rpx;
322
323 .tt {
324 color: #0A1629;
325 font-size: 30rpx;
326 }
327 }
328
329 .danger-button {
330 display: flex;
331 flex-direction: column;
332 align-items: center;
333 justify-content: center;
334 }
335
336 .collapseBody {
337 padding: 0 30rpx 50rpx;
338 box-sizing: border-box;
339 font-size: 28rpx;
340 }
341
342 .collapseBody>view {
343 margin: 0 0 20rpx;
344 display: flex;
345 align-items: baseline;
346
347 label {
348 width: 6em;
349 color: #999;
350 display: inline-block;
351 // text-align: right;
352 flex: 0 0 auto;
353 }
354
355 .content {
356 flex: 1 1 auto;
357 padding-left: 10rpx;
358 }
359 }
360
361 .button-group {
362 text-align: right;
363
364 button {
365 margin-left: 30rpx;
366 }
367 }
368
369 .h3 {
370 padding: 20rpx 0;
371 }
372
373 :deep(.uni-list-item__extra-text) {
374 color: #1561CB;
375 }
376
377 .popBody {
378 max-height: 60vh;
379 overflow: auto;
380 }
381
382 :deep(.uni-forms-item__inner) {
383 padding-bottom: 20rpx;
384 align-items: baseline;
385 }
386
387 // :deep(.uni-forms-item__label){
388 // padding: 0;height: auto;
389 // }
390 // :deep(.uni-forms-item__content){
391 // min-height: auto;
392 // }
393 .collapseTitle {
394 padding: 20rpx;
395
396 .name {
397 font-size: 30rpx;
398 }
399
400 .date {
401 color: #999;
402 font-size: 28rpx;
403 }
404 }
405
406 :deep(.file-picker__progress) {
407 opacity: 0;
408 }
409 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <view>
3 <view class="searchbar">
4 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
5 v-model="queryParams.code" placeholder="搜索变更单号" @blur="getList" @clear="getList">
6 </uni-easyinput>
7 <view class="invertedbtn-red" @click="goAdd">+ 新建变更</view>
8 </view>
9
10 <view class="appList">
11 <view class="appItem" v-for="(item,index) in list" :key="index">
12 <view class="status" @click="goDetail(item)">
13 <view>
14 <text v-if="item.status == 0" class="text-warning">待提交</text>
15 <text v-if="item.status == 1" class="text-primary">审核中</text>
16 <text v-if="item.status == 2" class="text-success">审核通过</text>
17 <text v-if="item.status == 3" class="text-danger">审核拒绝</text>
18 <text v-if="item.status == 4" class="text-warning">已撤回</text>
19 </view>
20 </view>
21
22 <view class="name mt0" @click="goDetail(item)">
23 {{item.code}}-{{item.shenMemName}}
24 </view>
25 <view class="flexbox" @click="goDetail(item)">
26 <view>
27 变更人数
28 <view>
29 <text class="text-danger">{{item.count}}</text>
30 </view>
31
32 </view>
33
34 <view class="w50">
35 提交时间
36 <view>{{item.commitTime||'--'}}</view>
37 </view>
38 </view>
39 <view class="func" v-if="(item.status==0||item.status==3||item.status==4)">
40 <button @click="handleUpdate(item)">编辑</button>
41 <button @click="commitFN(item)">提交审核</button>
42 <button @click="handleDelete(item)">删除</button>
43 </view>
44
45 </view>
46 </view>
47
48
49
50 <view class="nodata" v-if="list.length==0">
51 <image mode="aspectFit" src="/static/nodata.png"></image>
52 <text>暂无数据</text>
53 </view>
54 </view>
55 </template>
56
57 <script setup>
58 import * as api from '@/common/api.js'
59 import config from '@/config.js'
60 import {
61 ref
62 } from 'vue'
63 import {
64 onLoad,
65 onShow
66 } from '@dcloudio/uni-app'
67 const app = getApp();
68 const queryParams = ref({
69 code:''
70 })
71 const list = ref([])
72 const total = ref(0)
73 onShow(()=>{
74 getList()
75 })
76 function goAdd(){
77 let path = `/personalVip/addChange`
78 uni.navigateTo({
79 url: path
80 });
81 }
82 function getList(){
83 uni.showLoading({
84 title:'加载中'
85 })
86 api.getInfoModRange(queryParams.value).then(res=>{
87 list.value = res.rows
88 total.value = res.total
89 uni.hideLoading()
90 })
91 }
92 function goDetail(item){
93 let path = `/personalVip/changeVipDetail?rangeId=${item.id}`
94 uni.navigateTo({
95 url: path
96 });
97 }
98 function handleUpdate(item){
99 // 编辑
100 let path = `/personalVip/addChange?rangeId=${item.id}`
101 uni.navigateTo({
102 url: path
103 });
104 }
105 function commitFN(row){
106 uni.showModal({
107 title: '提示',
108 content: `确定提交吗`,
109 success: function(res) {
110 if (res.confirm) {
111 api.commitPersonalChange(row.id).then(Response=>{
112 uni.showToast({
113 icon:"none",
114 title:'提交成功!'
115 })
116 getList()
117 })
118 }
119 }
120 })
121 }
122 function handleDelete(row){
123 uni.showModal({
124 title: '提示',
125 content: `确定删除吗`,
126 success: function(res) {
127 if (res.confirm) {
128 api.delPersonalChange([row.id]).then(Response=>{
129 uni.showToast({
130 icon:"none",
131 title:'删除成功!'
132 })
133 getList()
134 })
135 }
136 }
137 })
138 }
139
140 </script>
141
142 <style lang='scss' scoped>
143 .searchbar {
144 display: flex;
145 align-items: center;
146 padding: 25rpx;
147 box-sizing: border-box;
148
149 :deep(.uni-easyinput .uni-easyinput__content) {
150 border-radius: 35rpx;
151 border: none;
152 height: 70rpx;
153 }
154
155 :deep(.uni-easyinput__content-input) {
156 font-size: 26rpx;
157 }
158
159 .invertedbtn-red {
160 border-radius: 50px;
161 background-color: #fff;
162
163 font-size: 30rpx;
164 padding: 10rpx 20rpx;
165 }
166 }
167
168 </style>
1 <template>
2 <view>
3 <view class="searchbar">
4 <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search"
5 v-model="queryParams.code" placeholder="搜索变更单号" @blur="getList" @clear="getList">
6 </uni-easyinput>
7 </view>
8 <view class="vipData">
9 <view>会员信息变更人数合计: <text>{{statistical.personCount}}</text></view>
10 </view>
11 <view class="appList">
12 <view class="appItem" v-for="(item,index) in list" :key="index">
13 <view class="status" @click="goDetail(item)">
14 <view>
15 <text v-if="item.status == 0" class="text-warning">待提交</text>
16 <text v-if="item.status == 1" class="text-primary">审核中</text>
17 <text v-if="item.status == 2" class="text-success">审核通过</text>
18 <text v-if="item.status == 3" class="text-danger">审核拒绝</text>
19 <text v-if="item.status == 4" class="text-warning">已撤回</text>
20 </view>
21 </view>
22
23 <view class="name mt0" @click="goDetail(item)">
24 {{item.code}}-{{item.shenMemName}}
25 </view>
26 <view class="flexbox" @click="goDetail(item)">
27 <view>
28 变更人数
29 <view>
30 <text class="text-danger">{{item.count}}</text>
31 </view>
32 </view>
33 <view class="w50">
34 提交时间
35 <view>{{item.commitTime||'--'}}</view>
36 </view>
37 </view>
38 <view class="func" v-if="item.status==1">
39 <button @click="audit(item.id,0)">拒绝</button>
40 <button @click="audit(item.id,1)">同意</button>
41 </view>
42 <view class="func" v-if="item.status==2">
43 <button @click="handleDelete(item)">撤回</button>
44 </view>
45 </view>
46 </view>
47 <view class="nodata" v-if="list.length==0">
48 <image mode="aspectFit" src="/static/nodata.png"></image>
49 <text>暂无数据</text>
50 </view>
51 </view>
52 </template>
53
54 <script setup>
55 import * as api from '@/common/api.js'
56 import config from '@/config.js'
57 import {
58 ref
59 } from 'vue'
60 import {
61 onLoad,
62 onShow
63 } from '@dcloudio/uni-app'
64 const app = getApp();
65 const queryParams = ref({
66 code:'',
67 ztxList: 0
68 })
69 const list = ref([])
70 const statistical = ref({
71 personCount: 0
72 })
73 const total = ref(0)
74 onShow(()=>{
75 getList()
76 })
77 function getList(){
78 uni.showLoading({
79 title:'加载中'
80 })
81 api.getInfoModRange(queryParams.value).then(res=>{
82 list.value = res.rows
83 list.value.forEach(item => {
84 statistical.value.personCount += (item.count * 1)
85 })
86 total.value = res.total
87 uni.hideLoading()
88 })
89 }
90 function goDetail(item){
91 let path = `/personalVip/changeVipDetail?rangeId=${item.id}`
92 uni.navigateTo({
93 url: path
94 });
95 }
96 function handleDelete(row){
97 uni.showModal({
98 title: '提示',
99 content: `确定撤回吗`,
100 success: function(res) {
101 if (res.confirm) {
102 api.personChangeWithDraw([row.id]).then(Response=>{
103 uni.showToast({
104 icon:"none",
105 title:'撤回成功!'
106 })
107 getList()
108 })
109 }
110 }
111 })
112 }
113 function audit(id, flag) {
114 if (flag == 0) {
115 // 拒绝
116 // 弹出框填写理由
117 uni.showModal({
118 title: '请输入拒绝理由',
119 editable: true,
120 success: function(res) {
121 if (res.confirm) {
122 if (!res.content) {
123 uni.showToast({
124 title: '请输入拒绝理由',
125 icon: 'none'
126 })
127 } else {
128 doApproval(id, flag, res.content)
129 }
130 }
131 }
132 })
133 } else if (flag == 1) {
134 // 二次确认
135 uni.showModal({
136 title: '提示',
137 content: `确定审批通过吗`,
138 success: function(res) {
139 if (res.confirm) {
140 doApproval(id, flag)
141 }
142 }
143 })
144 }
145 }
146
147 function doApproval(id, flag, reason) {
148 var obj = {
149 flag: flag,
150 reason: reason || '',
151 ids: [id]
152 }
153 console.log(obj)
154 api.personChangeAudit(obj).then((res) => {
155 uni.showToast({
156 title: '操作成功',
157 icon: 'none'
158 })
159 getList()
160 })
161 }
162
163 </script>
164
165 <style lang='scss' scoped>
166 .searchbar {
167 display: flex;
168 align-items: center;
169 padding: 25rpx;
170 box-sizing: border-box;
171
172 :deep(.uni-easyinput .uni-easyinput__content) {
173 border-radius: 35rpx;
174 border: none;
175 height: 70rpx;
176 }
177
178 :deep(.uni-easyinput__content-input) {
179 font-size: 26rpx;
180 }
181
182 .invertedbtn-red {
183 border-radius: 50px;
184 background-color: #fff;
185
186 font-size: 30rpx;
187 padding: 10rpx 20rpx;
188 }
189 }
190
191 </style>
1 <template>
2 <view>
3 <uni-collapse>
4 <uni-collapse-item :title="n.personCode+' - '+n.oldName" v-for="n in list" :key="n.id" open>
5 <view class="collapseBody">
6 <view>
7 <label>姓名:</label>
8 {{n.oldName}}
9 <text class="text-primary" v-if="n.oldName!=n.newName">变更为 </text>
10 <text class="text-danger" v-if="n.oldName!=n.newName">{{ n.newName }}</text>
11 </view>
12 <view>
13 <label>性别:</label>
14 {{ n.oldSex==0?'男':'女' }}
15 <text class="text-primary" v-if="n.oldSex!=n.newSex">变更为 </text>
16 <text class="text-danger" v-if="n.oldSex!=n.newSex">{{ n.newSex==0?'男':'女' }}</text>
17 </view>
18 <view>
19 <label>证件类型:</label>
20 {{ cardType[n.oldIdcType].label }}
21 <text class="text-primary" v-if="n.oldIdcType!=n.newIdcType">变更为 </text>
22 <text class="text-danger" v-if="n.oldIdcType!=n.newIdcType">{{ cardType[n.newIdcType].label }}
23 </text>
24 </view>
25 <view>
26 <label>证件号:</label>
27 {{ n.oldIdcCode }}
28 <text class="text-primary" v-if="n.oldIdcCode!=n.newIdcCode">变更为 </text>
29 <text class="text-danger" v-if="n.oldIdcCode!=n.newIdcCode">{{ n.newIdcCode }}</text>
30 </view>
31 <view>
32 <label>出生日期:</label>
33 {{ n.oldBirth?.slice(0,10) }}
34 <text v-if="n.oldBirth!=n.newBirth" class="text-gray">变更为 </text>
35 <text class="text-danger" v-if="n.oldBirth!=n.newBirth">{{ n.newBirth?.slice(0,10) }}</text>
36 </view>
37 <view v-if="n.fileUrl">
38 <label>附件: </label>
39 <text class="text-primary" @click="showImg(n)">
40 查看附件
41 </text>
42 </view>
43 <view>
44 <label>会员状态:</label>
45 <text class="text-primary" v-if="n.personCertStage==0">
46 新会员
47 </text>
48 <text class="text-primary" v-if="n.personCertStage==1">
49 待提交
50 </text>
51 <text class="text-warning" v-if="n.personCertStage==2">
52 缴费中
53 </text>
54 <text class="text-success" v-if="n.personCertStage==3">
55 正常
56 </text>
57 <text class="text-danger" v-if="n.personCertStage==4">
58 过期
59 </text>
60 </view>
61 </view>
62
63 </uni-collapse-item>
64 </uni-collapse>
65
66 </view>
67 </template>
68
69 <script setup>
70 import {
71 ref
72 } from 'vue'
73 import {
74 onLoad
75 } from '@dcloudio/uni-app'
76 import * as api from '@/common/api.js'
77 import config from '@/config.js'
78 const queryParams = ref({})
79 const total = ref(0)
80 const list = ref([])
81 const popup = ref(null)
82 const type = ref('')
83 const form = ref({})
84 const cardType = ref([{
85 label: '身份证',
86 value: '0'
87 },
88 {
89 label: '港澳台通行证 ',
90 value: '1'
91 },
92 {
93 label: '中国护照',
94 value: '2'
95 },
96 {
97 label: '外国护照',
98 value: '3'
99 },
100 {
101 label: '其它',
102 value: '4'
103 },
104 {
105 label: '户口本',
106 value: '5'
107 }
108 ])
109 onLoad((option) => {
110 if (option.rangeId) {
111 queryParams.value.rangeId = option.rangeId
112 getList()
113 }
114 })
115
116 function getList() {
117 uni.showLoading({
118 title: '加载中'
119 })
120 api.addInfoModeList(queryParams.value).then(res => {
121 list.value = res.rows
122 list.value.forEach(item => {
123 item.fileUrl = JSON.parse(item.fileUrl)
124 })
125 total.value = res.total
126 uni.hideLoading()
127 })
128 }
129
130 function handleChange(a, b) {
131 type.value = b
132 form.value = a
133 console.log(form.value.newName)
134 popup.value.open()
135 }
136
137 function handleDelete(row) {
138 uni.showModal({
139 content: `确认删除会员${row.newName}`,
140 success: function(res) {
141 if (res.confirm) {
142 api.infoMod([row.id]).then(res => {
143 uni.showToast({
144 title: '操作成功'
145 })
146 getList()
147 })
148 }
149 }
150 })
151 }
152
153 function showImg(n) {
154 var str = config.baseUrl_api + n.fileUrl[0]?.url
155 if (n.fileUrl[0]?.url.indexOf('png') > -1 || n.fileUrl[0]?.url.indexOf('jpg') > -1 || n.fileUrl[0]?.url.indexOf(
156 'jpeg') > -1) {
157 uni.previewImage({
158 urls: [str],
159 success: function(res) {
160 console.log('success', res)
161 },
162 fail: function(res) {
163 console.log('fail', res)
164 },
165 complete: function(res) {
166 console.log('complete', res)
167 }
168 })
169 } else {
170 goWebView(str)
171 }
172 }
173
174 function goWebView(url) {
175 url = url.replace("http://", "https://")
176 uni.showLoading({
177 title: '下载中'
178 });
179 uni.downloadFile({
180 url: url,
181 success: function(res) {
182 uni.hideLoading();
183 var filePath = res.tempFilePath;
184 uni.showLoading({
185 title: '正在打开'
186 });
187 uni.openDocument({
188 filePath: filePath,
189 showMenu: true,
190 success: function(res) {
191 uni.hideLoading();
192 },
193 fail: function(err) {
194 uni.hideLoading();
195 uni.showToast({
196 title: err,
197 icon: 'none',
198 duration: 2000
199 });
200 }
201 });
202 },
203 fail: function(error) {
204 uni.hideLoading();
205 uni.showToast({
206 title: `下载失败`,
207 icon: 'none',
208 duration: 2000
209 });
210 }
211 });
212 }
213 </script>
214 <style scoped lang="scss">
215 .flexbox {
216 padding: 30rpx 30rpx 0
217 }
218
219 .danger-button {
220 display: flex;
221 flex-direction: column;
222 align-items: center;
223 justify-content: center;
224 }
225
226 .collapseBody {
227 padding: 0 30rpx;
228 box-sizing: border-box;
229 font-size: 28rpx;
230
231 view {
232 margin: 0 0 20rpx;
233
234 label {
235 width: 5em;
236 color: #999;
237 display: inline-block;
238 text-align: right;
239 }
240 }
241 }
242
243 .popBody {
244 background: #fff;
245 padding: 30rpx;
246 }
247 </style>
...\ No newline at end of file ...\ No newline at end of file
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
3 <!-- 查看缴费单+上传凭证 --> 3 <!-- 查看缴费单+上传凭证 -->
4 <!-- 缴费审核 --> 4 <!-- 缴费审核 -->
5 <view class="appList"> 5 <view class="appList">
6 <view class="appItem" v-for="item in list"> 6 <view class="appItem" v-for="(item,index) in list" :key="index">
7 <view class="status" @click="goDetail(item)"> 7 <view class="status" @click="goDetail(item)">
8 <text v-if="item.record.auditStatus==0" class="text-primary">审核中</text> 8 <text v-if="item.record.auditStatus==0" class="text-primary">审核中</text>
9 <text v-if="item.record.auditStatus==1" class="text-success"> 审核通过</text> 9 <text v-if="item.record.auditStatus==1" class="text-success"> 审核通过</text>
......
...@@ -45,7 +45,10 @@ ...@@ -45,7 +45,10 @@
45 </view> 45 </view>
46 </view> 46 </view>
47 </view> 47 </view>
48 48 <view class="nodata" v-if="list.length==0">
49 <image mode="aspectFit" src="/static/nodata.png"></image>
50 <text>暂无数据</text>
51 </view>
49 </view> 52 </view>
50 </template> 53 </template>
51 54
...@@ -68,7 +71,6 @@ ...@@ -68,7 +71,6 @@
68 const total = ref(0) 71 const total = ref(0)
69 const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝']) 72 const navs = ref(['待提交', '审核中', '审核通过', '审核拒绝'])
70 onShow(() => { 73 onShow(() => {
71 console.log('123')
72 getList() 74 getList()
73 }) 75 })
74 76
......
1 <template>
2 <view class="box">
3 <view class="box1">
4 <view class="title">
5 <view class="title-left">{{ porps.title }}</view>
6 <view class="title-icon" @click="changFN">
7 <uni-icons type="top" color="#95a1a6" v-if="show"></uni-icons>
8 <uni-icons type="bottom" color="#95a1a6" v-else></uni-icons>
9 </view>
10 </view>
11 <view class="conter-liner-cost">
12 <view class="liner-left">{{ porps.text }}&nbsp;&nbsp; 合计:</view>
13 <view class="liner-right">{{ porps.cost }}</view>
14 </view>
15 </view>
16 <view class="box2" v-show="show"><slot></slot></view>
17 </view>
18 </template>
19
20 <script setup>
21 import { ref } from 'vue';
22 const porps = defineProps({
23 title: String,
24 text: String,
25 cost: String
26 });
27 const show = ref(false);
28
29 function changFN() {
30 show.value = !show.value;
31 }
32 </script>
33
34 <style lang="scss" scoped>
35 .box {
36 margin: 0;
37 padding: 0 25rpx;
38 .box1 {
39 margin-bottom: 23rpx;
40 margin-top: 35rpx;
41 .title {
42 display: flex;
43 justify-content: space-between;
44 margin-bottom: 10rpx;
45
46 .title-left {
47 font-size: 30rpx;
48 font-family: PingFang SC;
49 font-weight: 500;
50 color: #2b3133;
51 }
52 }
53 .conter-liner-cost {
54 display: flex;
55 .liner-left {
56 font-size: 28rpx;
57 font-family: PingFang SC;
58 font-weight: 400;
59 color: #7b7f83;
60 }
61 .liner-right {
62 font-size: 28rpx;
63 font-family: PingFang SC;
64 font-weight: 400;
65 color: #ff8124;
66 }
67 }
68 }
69 .box2 {
70 border-top: 1rpx solid #e6e6e6;
71 }
72 }
73 </style>
1 <template>
2 <view class=" conter-box">
3 <view class="box" v-if="props.trainProjectsList.length != 0">
4 <view class="text">培训科目</view>
5 <view class="box2">
6 <checkbox-group>
7 <view class="box-check" v-for="item in props.trainProjectsList" :key="item.id">
8 <view class="">
9 <view class="title">{{ item.projectName }}</view>
10 <view class="content">
11 {{ item.isNecessary == 1 ? '必选' : '非必选' }}&nbsp;&nbsp;合计:
12 <view class="span">{{ item.cost }}</view>
13 </view>
14 </view>
15 <view class="checkbox">
16 <checkbox
17 :disabled="item.isNecessary == 1"
18 :value="item.id"
19 @click="checkTrain(item)"
20 :checked="item.check"
21 />
22 </view>
23 </view>
24 </checkbox-group>
25 </view>
26 </view>
27 <view class="box" v-if="props.examProjectsList.length != 0">
28 <view class="text">考试科目</view>
29 <view class="box2">
30 <checkbox-group>
31 <view class="box-check" v-for="item in props.examProjectsList" :key="item.id">
32 <view class="">
33 <view class="title">{{ item.projectName }}</view>
34 <view class="content">
35 {{ item.isNecessary == 1 ? '必选' : '非必选' }}&nbsp;&nbsp;合计:
36 <view class="span">{{ item.cost }}</view>
37 </view>
38 </view>
39 <view class="checkbox">
40 <checkbox
41 :disabled="item.isNecessary == 1"
42 :value="item.id"
43 @click="checkTrain(item)"
44 :checked="item.check"
45 />
46 </view>
47 </view>
48 </checkbox-group>
49 </view>
50 </view>
51 </view>
52 <view class="foot">
53 <view class="button1" @click="upFN">上一步</view>
54 <view class="button" @click="nextFN">下一步</view>
55 </view>
56 <view class="nodata " v-if="props.examProjectsList.length == 0 && props.trainProjectsList.length == 0">
57 没有培训科目
58 </view>
59 </template>
60
61 <script setup>
62 import { forEach } from 'lodash';
63 import { ref, getCurrentInstance, reactive, toRefs } from 'vue';
64 const props = defineProps({
65 trainProjectsList: {},
66 examProjectsList: {},
67 hotelList: {},
68 id: {}
69 });
70 const data = reactive({
71 projectIdsArray: []
72 });
73
74 const examIdsArry = ref([]);
75 const { projectIdsArray } = toRefs(data);
76 const emit = defineEmits(['nextFN']);
77 const checkbox1 = ref([0]);
78
79 function checkTrain(item) {
80 if (item.isNecessary == 1) {
81 item.check = true;
82 } else {
83 item.check = !item.check;
84 }
85 }
86
87 // 上一步
88 function upFN() {
89 emit('nextFN', 0);
90 }
91
92 // 下一步
93 function nextFN() {
94 let falg = true;
95 let arr1 = [];
96 let arr2 = [];
97 props.examProjectsList.forEach(item => {
98 if (item.check) {
99 arr1.push(item.id);
100 }
101 });
102 props.trainProjectsList.forEach(item => {
103 if (item.check) {
104 arr2.push(item.id);
105 }
106 });
107 let examList = JSON.parse(JSON.stringify(props.examProjectsList));
108 let trainList = JSON.parse(JSON.stringify(props.trainProjectsList));
109 examList.concat(trainList).forEach(item => {
110 if (item.isNecessary == 1 && item.check == false) {
111 falg = false;
112 }
113 });
114
115 if (falg) {
116 examIdsArry.value = arr1;
117 projectIdsArray.value = arr2;
118 if (props.hotelList.length == 0) {
119 // 没有酒店直接报名
120 // 页面跳转
121 let path = `/pages/train/costBreakdown/costBreakdown?id=` + props.id;
122 wx.navigateTo({
123 url: path
124 });
125 } else {
126 emit('nextFN', 2, projectIdsArray.value, examIdsArry.value);
127 }
128 } else {
129 uni.showToast({
130 title: '请选择必选科目!',
131 duration: 2000,
132 icon: 'error'
133 });
134 return false;
135 }
136 }
137 </script>
138
139 <style scoped lang="scss">
140 .nodata {
141 background: url(/static/nodata.png) no-repeat;
142 background-size: 100%;
143 width: 100%;
144 height: 835rpx;
145 color: #aaa59f;
146 font-size: 50rpx;
147 }
148
149 .conter-box {
150 padding-bottom: 100rpx;
151 }
152
153 .box {
154 padding: 34rpx 25rpx;
155 background-color: #f4f6fa;
156 padding-bottom: 0;
157
158 .box2 {
159 background-color: #fff;
160 border-radius: 15rpx;
161 margin-top: 20rpx;
162 }
163
164 .text {
165 height: 29px;
166 font-size: 30rpx;
167 font-family: PingFang SC;
168 font-weight: 500;
169 color: #000000;
170 line-height: 62rpx;
171 }
172
173 .box-check {
174 padding: 40rpx;
175 display: flex;
176 justify-content: space-between;
177 border-bottom: 1rpx solid #e6e6e6;
178 padding-bottom: 20rpx;
179
180 :deep(.checkbox__inner) {
181 background-color: #d9d9d9 !important;
182 border-color: #d9d9d9 !important;
183 border-radius: 50% !important;
184 width: 45rpx !important;
185 height: 45rpx !important;
186 line-height: 40rpx;
187 }
188
189 .text {
190 font-size: 12px;
191 color: #666;
192 margin-top: 5px;
193 }
194
195 .title {
196 font-size: 30rpx;
197 font-family: PingFang SC;
198 font-weight: 400;
199 color: #2b3133;
200 margin-bottom: 10rpx;
201 }
202
203 .content {
204 display: flex;
205 font-size: 30rpx;
206 font-family: PingFang SC;
207 font-weight: 400;
208 color: #2b3133;
209
210 .span {
211 color: #ff8124;
212 font-size: 28rpx;
213 font-family: PingFang SC;
214 font-weight: 400;
215 }
216 }
217 }
218
219 :deep(.checkbox__inner-icon) {
220 position: absolute !important;
221 top: 4px !important;
222 left: 7px !important;
223 color: #000 !important;
224 }
225
226 :deep(.uni-data-checklist .checklist-group .checklist-box) {
227 margin-right: 0;
228 }
229 }
230
231 .conter-button {
232 position: absolute;
233 left: 0;
234 bottom: 10rpx;
235 width: 100%;
236 display: flex;
237 justify-content: center;
238
239 .button {
240 height: 80rpx;
241 width: 500rpx;
242 text-align: center;
243 font-size: 32rpx;
244 font-family: PingFang SC;
245 font-weight: 500;
246 color: #ffffff;
247 line-height: 80rpx;
248 background: linear-gradient(270deg, #54e1b9, #00caa6);
249 border-radius: 40rpx;
250 }
251 }
252
253 .foot {
254 display: flex;
255 background-color: #ffffff;
256 padding: 20rpx 0;
257 position: absolute;
258 left: 0;
259 bottom: 0;
260 width: 100%;
261
262 .button {
263 margin: 0 auto;
264 height: 80rpx;
265 width: 300rpx;
266 text-align: center;
267 font-size: 32rpx;
268 font-family: PingFang SC;
269 font-weight: 500;
270 color: #ffffff;
271 line-height: 80rpx;
272 background: linear-gradient(270deg, #54e1b9, #00caa6);
273 border-radius: 40rpx;
274 }
275
276 .button1 {
277 margin: 0 auto;
278 height: 80rpx;
279 width: 300rpx;
280 text-align: center;
281 font-size: 32rpx;
282 font-family: PingFang SC;
283 font-weight: 500;
284 line-height: 80rpx;
285 background: #fff;
286 border-radius: 40rpx;
287 border: 1px solid #2ed981;
288 color: #2ed981;
289 }
290 }
291 </style>
1 <template>
2 <view class="box">
3 <view class="liner" v-for="item in props.scheduleList" :key="item.id">
4 <view class="timer">
5 <uni-icons custom-prefix="iconfont" type="icon-ai253" color="#1ec886" size="20"></uni-icons>
6 &nbsp; {{ item.dayStr }} 10:00-12:00
7 </view>
8 <view class="conetr">{{ item.event }}</view>
9 <view class="data">
10 <uni-icons custom-prefix="iconfont" type="icon-loufangfangzi"></uni-icons>
11 {{ item.place }}
12 </view>
13 </view>
14 <view class="nodata" v-if="props?.scheduleList?.length == 0">你还没有日程安排</view>
15 </view>
16 </template>
17
18 <script setup>
19 import { ref, getCurrentInstance, reactive, toRefs } from 'vue';
20 const props = defineProps({
21 scheduleList: {}
22 });
23 </script>
24
25 <style scoped lang="scss">
26 .nodata {
27 background: url(/static/nodata.png) no-repeat;
28 background-size: 100%;
29 width: 100%;
30 height: 835rpx;
31 color: #aaa59f;
32 font-size: 50rpx;
33 }
34
35 .box {
36 padding-top: 25rpx;
37
38 .liner {
39 margin-bottom: 20rpx;
40 background-color: #fff;
41 border-radius: 15rpx;
42 padding: 20rpx;
43 }
44
45 .timer {
46 display: flex;
47 font-size: 28rpx;
48 font-family: PingFang SC;
49 font-weight: 400;
50 color: #1ec886;
51 }
52
53 .conetr {
54 font-size: 30rpx;
55 font-family: PingFang SC;
56 font-weight: 400;
57 color: #2b3133;
58 margin: 25rpx 0;
59 }
60
61 .data {
62 font-size: 28rpx;
63 font-family: PingFang SC;
64 font-weight: 400;
65 color: #7b7f83;
66 }
67 }
68 </style>
1 <template>
2 <view class="big-box">
3 <view class="list-box">
4 <view class="image">
5 <image class="img" referrer="no-referrer|origin|unsafe-url" :src="porps.pic" mode="aspectFill"></image>
6 </view>
7 <view class="text">
8 <view class="text-title">{{ porps.title }}</view>
9 <view class="text-card color" v-if="porps.card == '报名中'">{{ porps.card }}</view>
10 <view class="text-card color1" v-if="porps.card == '进行中'">{{ porps.card }}</view>
11 <view class="text-card color2" v-if="porps.card == '即将开始'">{{ porps.card }}</view>
12 <view class="text-card color3" v-if="porps.card == '已结束'">{{ porps.card }}</view>
13 <view class="text-card color4" v-if="porps.card == '培训未开始'">{{ porps.card }}</view>
14 <view class="text-card color4" v-if="porps.card == '报名未开始'">{{ porps.card }}</view>
15 <view class="text-timer ">报名时间:{{ porps.timer }}</view>
16 </view>
17 </view>
18 <view class="hr"></view>
19 </view>
20 </template>
21
22 <script setup>
23 const porps = defineProps({
24 pic: {
25 type: String
26 },
27 title: {
28 type: String
29 },
30 card: {
31 type: String
32 },
33 timer: {
34 type: String
35 }
36 });
37 </script>
38
39 <style lang="scss">
40 .big-box {
41 width: 100%;
42 padding: 25rpx 0;
43
44 .hr {
45 width: 100%;
46 border-bottom: 1rpx solid #e5e5e5;
47 padding-top: 25rpx;
48 }
49
50 .list-box {
51 width: 100%;
52 height: 180rpx;
53 display: flex;
54
55 .image {
56 width: 270rpx;
57 height: 180rpx;
58 padding-right: 25rpx;
59
60 .img {
61 width: 270rpx;
62 height: 180rpx;
63 border-radius: 15rpx;
64 }
65 }
66
67 .text {
68 margin-left: 20rpx;
69
70 .text-title {
71 text-align: left;
72 font-size: 30rpx;
73 font-family: PingFang SC;
74 font-weight: 400;
75 color: #000000;
76 }
77
78 .text-card {
79 font-size: 20rpx;
80 width: 110rpx;
81 height: 32rpx;
82 margin-top: 57rpx;
83 text-align: center;
84 font-family: PingFang SC;
85 font-weight: 400;
86 color: #ffffff;
87 border-radius: 16px 16px 16px 0px;
88 }
89
90 .color {
91 background: linear-gradient(270deg, #54e1b9, #00caa6);
92 }
93
94 .color1 {
95 background: linear-gradient(270deg, #be8efb, #a76df4);
96 }
97
98 .color2 {
99 background: linear-gradient(270deg, #fea449, #ffb95f);
100 }
101
102 .color3 {
103 background: linear-gradient(270deg, #d9d9d9, #bcbcbc);
104 }
105
106 .color4 {
107 background: linear-gradient(270deg, #40d8ee, #53a7f6);
108 }
109
110 .text-timer {
111 margin-top: 20rpx;
112 height: 23rpx;
113 font-size: 24rpx;
114 font-family: PingFang SC;
115 font-weight: 400;
116 color: #7b7f83;
117 }
118 }
119 }
120 }
121 </style>
...\ No newline at end of file ...\ No newline at end of file
1 <template>
2 <view class="big-box">
3 <view class="list-box">
4 <view class="image">
5 <image
6 class="img"
7 referrer="no-referrer|origin|unsafe-url"
8 :src="porps.item.cover"
9 mode="aspectFill"
10 ></image>
11 </view>
12 <view class="text">
13 <view class="text-title">{{ porps.item.trainName }}</view>
14 <view class="text-card color1" v-if="porps.item.statusStr == '审核通过'">
15 {{ porps.item.statusStr }}
16 </view>
17 <view class="text-card color2" v-if="porps.item.statusStr == '待审核'">
18 {{
19 porps.item.status == '0' && porps.item.payStatus == '0'
20 ? porps.item.payStatusStr
21 : porps.item.statusStr
22 }}
23 </view>
24 <view class="text-card color3" v-if="porps.item.statusStr == '报名失败'">
25 {{ porps.item.statusStr }}
26 </view>
27 <view class="text-card color3" v-if="porps.item.statusStr == '审核拒绝'">
28 {{ porps.item.statusStr }}
29 </view>
30 <view class="text-card color4" v-if="porps.item.statusStr == '待支付'">{{ porps.item.statusStr }}</view>
31 <view class="text-card color4" v-if="porps.item.statusStr == '待提交'">{{ porps.item.statusStr }}</view>
32 <view class="text-card color5" v-if="porps.item.statusStr == '已取消'">{{ porps.item.statusStr }}</view>
33 </view>
34 </view>
35 <view class="hr"></view>
36 </view>
37 </template>
38
39 <script setup>
40 const porps = defineProps({
41 pic: {
42 type: String
43 },
44 title: {
45 type: String
46 },
47 card: {
48 type: String
49 },
50 timer: {
51 type: String
52 },
53 item: {}
54 });
55 </script>
56
57 <style lang="scss">
58 .big-box {
59 width: 100%;
60 padding: 25rpx 0;
61
62 .hr {
63 width: 100%;
64 border-bottom: 1rpx solid #e5e5e5;
65 padding-top: 25rpx;
66 }
67
68 .list-box {
69 width: 100%;
70 height: 180rpx;
71 display: flex;
72
73 .image {
74 width: 270rpx;
75 height: 180rpx;
76 padding-right: 25rpx;
77
78 .img {
79 width: 270rpx;
80 height: 180rpx;
81 border-radius: 15rpx;
82 }
83 }
84
85 .text {
86 margin-left: 20rpx;
87
88 .text-title {
89 text-align: left;
90 font-size: 30rpx;
91 font-family: PingFang SC;
92 font-weight: 400;
93 color: #000000;
94 }
95
96 .text-card {
97 font-size: 20rpx;
98 width: 94rpx;
99 height: 32rpx;
100 margin-top: 57rpx;
101 text-align: center;
102 font-family: PingFang SC;
103 font-weight: 400;
104 color: #ffffff;
105 border-radius: 16px 16px 16px 0px;
106 }
107
108 .color1 {
109 background: linear-gradient(270deg, #54e1b9, #00caa6);
110 }
111
112 .color2 {
113 background: linear-gradient(270deg, #be8efb, #a76df4);
114 }
115
116 .color3 {
117 background: linear-gradient(90deg, #f83841, #f76d74);
118 }
119
120 .color4 {
121 background: linear-gradient(90deg, #fea449, #ffb95f);
122 }
123
124 .color5 {
125 background: linear-gradient(270deg, #d9d9d9, #bcbcbc);
126 }
127 }
128 }
129 }
130 </style>
1 import request from '@/common/request.js'
2 const accountInfo = uni.getAccountInfoSync()
3 const appId = accountInfo.miniProgram.appId;
4
5 // 获取培训列表
6 export function getTrainList(params) {
7 return request({
8 url: `/webPc/getTrains`,
9 method: 'get',
10 params: params
11 })
12 }
13
14 // 查看培训项目
15 export function getTrainDetail(id) {
16 return request({
17 url: '/webPc/getTrainDetails',
18 method: 'get',
19 params: {id}
20 })
21 }
22
23 // 查看培训项目
24 export function trainProjectList(params) {
25 return request({
26 url: '/systemj/information/projectList',
27 method: 'get',
28 params: params
29 })
30 }
31
32 // 查看报名费用(未支付前)
33 export function searchTrainCost(params) {
34 return request({
35 url: '/systemj/signer/getEnrollBill',
36 method: 'get',
37 params: params
38 })
39 }
40
41 // 提交 用户资料
42 export function trainNext(params) {
43 return request({
44 url: `/systemj/signer/signUp`,
45 method: 'post',
46 params,
47 })
48 }
49
50 // 生成订单
51 export function createOrder(params) {
52 return request({
53 url: `/systemj/order/saveOrder`,
54 method: 'post',
55 params,
56 })
57 }
58
59 //会员支付
60 export function pay(params) {
61 return request({
62 url: `/systemj/order/pay`,
63 method: 'post',
64 params,
65 })
66 }
67
68 // 线下支付银行信息
69 export function bankSlip(params) {
70 return request({
71 url: `/systemj/order/bankInfo`,
72 method: 'get',
73 params,
74 })
75 }
76
77 export function trainOrder(params) {
78 return request({
79 url: `/systemj/order/getMyOrders`,
80 method: 'get',
81 params,
82 })
83 }
84
85 // 修改报名
86 export function trainUpdata(params) {
87 return request({
88 url: `/systemj/signer/updateSign`,
89 method: 'put',
90 params,
91 })
92 }
93
94 // 取消订单
95 export function cancelOrder(params) {
96 return request({
97 url: `/systemj/order/cancelOrder`,
98 method: 'put',
99 params,
100 })
101 }
102
103 // 报项列表
104 export function signList(params) {
105 return request({
106 url: `/systemj/signer/applets/signList`,
107 method: 'get',
108 params,
109 })
110 }
111
112 // 报项详情
113 export function signDetail(params) {
114 return request({
115 url: `/systemj/signer/applets/signDetail`,
116 method: 'get',
117 params,
118 })
119 }
120
121 // 订单列表
122 export function orderList(params) {
123 return request({
124 url: `/systemj/order/applets/orderList`,
125 method: 'get',
126 params,
127 })
128 }
129
130
131 // 订单详情
132 export function getOrderDetail(params) {
133 return request({
134 url: `/systemj/order/getOrderDetail`,
135 method: 'get',
136 params,
137 })
138 }
139
140
1 <template>
2 <view class="box">
3 <view class="title">
4 <view class="navSerch">
5 <view class="serch">
6 <uni-search-bar class="uni-mt-10" radius="30" placeholder="搜索" clearButton="auto" Button="none"
7 cancelText="" v-model="name" bgColor="#F4F6FA" @confirm="search" @blur="blur" @clear="clear" />
8 </view>
9 </view>
10 <view class="searchLeft">
11 </view>
12 </view>
13 <view>
14
15 <view class="nav-box">
16 <view class="nav-ul">
17 <view class="nva-li" @click="nvaText(index)" :class="{nt:Nindex==index}"
18 v-for="(item,index) in items" :key="index">
19 {{item}}
20 </view>
21 </view>
22 </view>
23
24 <view class="content">
25 <view class="taber">
26 <view v-for="item in list" :key="item.trainId" @click="detail(item)">
27 <uniList :pic="config.baseUrl_api + item.cover" :title="item.name" :card="item.trainStatusStr"
28 :timer="filterTime(item.signTimeRange) "></uniList>
29 </view>
30 </view>
31 </view>
32 <view><uni-load-more :status="status" :content-text="contentText" /></view>
33 </view>
34 </view>
35 </template>
36
37 <script setup>
38 import config from '@/config.js'
39 import uniList from '@/training/components/ulist/ulist';
40 import * as train from '@/training/train.js';
41 import {
42 onLoad,
43 onReady,
44 onShareAppMessage,
45 onShareTimeline,
46 onPullDownRefresh,
47 onReachBottom
48 } from '@dcloudio/uni-app';
49 import {
50 ref,
51 getCurrentInstance,
52 reactive,
53 toRefs
54 } from 'vue';
55
56 const searchValue = ref();
57 const items = ref(['全部', '报名中', '培训进行中', '已结束']);
58 const current = ref(0);
59 const name = ref();
60 const Nindex = ref(0)
61 const range = ref([{
62 value: 1,
63 text: '全部'
64 },
65 {
66 value: 2,
67 text: '报名中'
68 },
69 {
70 value: 3,
71 text: '进行中'
72 },
73 {
74 value: 4,
75 text: '即将开始'
76 },
77 {
78 value: 5,
79 text: '报名未开始'
80 },
81 {
82 value: 6,
83 text: '培训未开始'
84 },
85 {
86 value: 7,
87 text: '已结束'
88 }
89 ]);
90 const list = ref();
91 const total = ref();
92 // noMore没有更多了
93 // loading加载中
94 // more下来加载
95 const status = ref('more');
96 const flag = ref();
97 const data = reactive({
98 query: {
99 flag: '',
100 pageSize: 10,
101 pageNum: 1
102 },
103 contentText: {
104 contentdown: '',
105 contentrefresh: '加载中',
106 contentnomore: '没有更多'
107 }
108 });
109 const {
110 query,
111 contentText
112 } = toRefs(data);
113
114 // 加载培训列表数据
115 onLoad(option => {
116 initData();
117
118 });
119
120 function initData() {
121 query.value.flag = current.value;
122 train.getTrainList(query.value).then(res=>{
123 list.value = res.rows;
124 total.value = res.rows;
125 })
126 }
127
128 // 详情页
129 function detail(item) {
130 let path = `/training/detailPage?trainId=${item.id}`;
131 uni.navigateTo({
132 url: path
133 });
134 }
135
136 function nvaText(index) {
137 Nindex.value = index
138 current.value = index
139 initData()
140 console.log(index);
141 }
142
143
144 function filterTime(num) {
145 if (num) return num.slice(0, 16)
146 }
147
148
149 // 下拉框
150 function change(e) {
151 if (e) {
152 addForm.value.flag = e - 1;
153 current.value = e - 1;
154 Nindex.value = e - 1
155 console.log(e);
156 initData();
157 }
158 }
159
160 // 搜索
161 function search(res) {
162 if (res.value != '') {
163 addForm.value.trainName = res.value;
164 initData();
165 }
166
167 }
168
169 // 搜索清空按钮
170 function clear(res) {
171 addForm.value.trainName = '';
172 initData();
173 }
174
175 // 下来刷新
176 onPullDownRefresh(() => {
177 addForm.value.flag = 0;
178 initData();
179 wx.stopPullDownRefresh();
180 });
181
182 // 上拉加载
183 onReachBottom(async () => {
184 if (list.value.length == total.value) {
185 status.value = 'noMore';
186 return false;
187 } else {
188 status.value = 'loading';
189 addForm.value.pageNum += 1;
190 let res = await train.getTrainList(addForm.value);
191 let arr = res.rows;
192 list.value = list.value.concat(arr);
193 total.value = res.total;
194 status.value = 'noMore';
195 }
196 });
197 </script>
198
199 <style lang="scss">
200 .uni-section-header {
201 display: none !important;
202 }
203
204 .box {
205 background-color: #fff;
206 }
207
208 .nav-box {
209 overflow-x: scroll;
210 }
211
212 .nav-ul {
213 display: flex;
214 justify-content: space-around;
215 width: 100%;
216
217 }
218
219 .nva-li {
220 font-size: 26rpx;
221 padding: 10rpx 0rpx;
222 margin: 0 15rpx;
223
224 }
225
226 .nt {
227 font-size: 30rpx;
228 font-weight: 400;
229 border-bottom: 4rpx solid #AD181F;
230 }
231
232
233 .taber {
234 width: 100%;
235 padding: 25rpx 30rpx;
236 padding-bottom: 0;
237 }
238
239 .segmented-control__text {
240 font-size: 26rpx !important;
241 font-family: PingFang SC !important;
242 font-weight: 400 !important;
243 color: #4c5359 !important;
244 }
245
246 .segmented-control__item--text {
247 border-bottom: 4rpx solid #54e1b9;
248 font-size: 30rpx !important;
249 font-family: PingFang SC !important;
250 font-weight: 500 !important;
251 color: #2b3133 !important;
252 }
253
254 .title {
255 display: flex;
256 justify-content: space-between;
257
258 .navSerch {
259 width:100%;height:100rpx;flex:1 1 auto;
260 position: relative;
261
262 .serch {
263 width:100%;
264 }
265 }
266
267 .searchLeft {
268 font-size: 26rpx;
269 font-family: PingFang SC;
270 font-weight: 400;
271 color: #000000;
272 margin-top: 25rpx;
273 display: flex;
274 }
275
276 .uni-searchbar__cancel {
277 display: none;
278 }
279
280 :deep(.uni-select) {
281 border: 0;
282 // padding-left: 20rpx;
283 }
284
285 :deep(.uni-select__input-text) {
286 font-size: 26rpx;
287 font-family: PingFang SC;
288 font-weight: 400;
289 color: #000000;
290 margin-right: 14rpx;
291 width: 110rpx;
292 text-align: right;
293 }
294
295 :deep(.uni-select__selector-item) {
296 // padding: 0 auto;
297 text-align: center;
298 font-size: 26rpx;
299 font-family: PingFang SC;
300 font-weight: 400;
301 color: #000000;
302 }
303 }
304
305 // 搜索框
306 .search-result {
307 padding-top: 10rpx;
308 padding-bottom: 20rpx;
309 text-align: center;
310 }
311
312 .search-result-text {
313 text-align: center;
314 font-size: 14rpx;
315 color: #666;
316 }
317
318 :deep(.uni-searchbar) {box-sizing: border-box;
319 }
320
321 .uni-searchbar__box {
322 padding-right: 0rpx !important;
323 }
324
325 .example-body {
326 /* #ifndef APP-NVUE */
327 display: block;
328 /* #endif */
329 padding: 0px;
330 }
331
332 .uni-mt-10 {
333 width: 600rpx;
334 }
335
336 // 分段器
337 .example-body {
338 /* #ifndef APP-NVUE */
339 display: flex;
340 /* #endif */
341 flex-direction: row;
342 padding: 0;
343 }
344
345 .uni-common-mt {
346 margin-top: 30rpx;
347 }
348
349 .uni-padding-wrap {
350 // width: 750rpx;
351 padding: 0rpx 30rpx;
352 }
353
354 .content {
355 /* #ifndef APP-NVUE */
356 display: flex;
357 /* #endif */
358 justify-content: center;
359 // height: 1235rpx;
360 text-align: center;
361 }
362
363 .content-text {
364 font-size: 14rpx;
365 color: #666;
366 }
367
368 .color-tag {
369 width: 25rpx;
370 height: 25rpx;
371 }
372
373 .uni-list {
374 flex: 1;
375 }
376
377 .uni-list-item {
378 /* #ifndef APP-NVUE */
379 display: flex;
380 /* #endif */
381 flex: 1;
382 flex-direction: row;
383 background-color: #ffffff;
384 }
385
386 .uni-list-item__container {
387 padding: 12rpx 15rpx;
388 width: 100%;
389 flex: 1;
390 position: relative;
391 /* #ifndef APP-NVUE */
392 display: flex;
393 box-sizing: border-box;
394 /* #endif */
395 flex-direction: row;
396 justify-content: space-between;
397 align-items: center;
398 border-bottom-style: solid;
399 border-bottom-width: 1rpx;
400 border-bottom-color: #eee;
401 }
402
403 .uni-list-item__content-title {
404 font-size: 14rpx;
405 }
406
407 .chat-custom-right {
408 flex: 1;
409 /* #ifndef APP-NVUE */
410 display: flex;
411 /* #endif */
412 flex-direction: column;
413 justify-content: space-between;
414 align-items: flex-end;
415 }
416
417 .chat-custom-text {
418 font-size: 12rpx;
419 color: #999;
420 }
421 </style>
...\ No newline at end of file ...\ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!