04b3bff0 by 华明祺

no message

1 parent e06a0e25
...@@ -790,6 +790,14 @@ export function getVisaInfo(query) { ...@@ -790,6 +790,14 @@ export function getVisaInfo(query) {
790 }) 790 })
791 } 791 }
792 792
793 export function listVisaInfo(query) {
794 return request({
795 url: '/league/visaInfo/list',
796 method: 'get',
797 params: query
798 })
799 }
800
793 // 酒店预约查询 801 // 酒店预约查询
794 export function hotelList(params) { 802 export function hotelList(params) {
795 return request({ 803 return request({
......
...@@ -567,6 +567,12 @@ export const constantRoutes = [ ...@@ -567,6 +567,12 @@ export const constantRoutes = [
567 meta: {title: 'My reservation'} 567 meta: {title: 'My reservation'}
568 }, 568 },
569 { 569 {
570 path: 'myVisa',
571 component: () => import('@/viewsPc/center/myVisa'),
572 name: 'myVisa',
573 meta: {title: 'My visa'}
574 },
575 {
570 path: 'mySms', 576 path: 'mySms',
571 component: () => import('@/viewsPc/center/mySms'), 577 component: () => import('@/viewsPc/center/mySms'),
572 name: 'mySms', 578 name: 'mySms',
......
...@@ -47,7 +47,8 @@ import {onMounted} from '@vue/runtime-core' ...@@ -47,7 +47,8 @@ import {onMounted} from '@vue/runtime-core'
47 import useUserStore from '@/store/modules/user' 47 import useUserStore from '@/store/modules/user'
48 import _ from 'lodash' 48 import _ from 'lodash'
49 import {useStorage} from "@vueuse/core/index"; 49 import {useStorage} from "@vueuse/core/index";
50 const language= useStorage('language',0) 50
51 const language = useStorage('language', 0)
51 52
52 const route = useRoute() 53 const route = useRoute()
53 const router = useRouter() 54 const router = useRouter()
...@@ -63,14 +64,14 @@ const menus3 = ref([ ...@@ -63,14 +64,14 @@ const menus3 = ref([
63 // isActive: false 64 // isActive: false
64 // }, 65 // },
65 { 66 {
66 name: language.value==0?'修改密码':'Change Password', 67 name: language.value == 0 ? '修改密码' : 'Change Password',
67 routeName: 'myPassword', 68 routeName: 'myPassword',
68 picUrl1: '/img/nav_27.png', 69 picUrl1: '/img/nav_27.png',
69 picUrl2: '/img/nav_27_dwn.png', 70 picUrl2: '/img/nav_27_dwn.png',
70 isActive: false 71 isActive: false
71 }, 72 },
72 { 73 {
73 name: language.value==0?'我的预订':'My Reservation', 74 name: language.value == 0 ? '我的预订' : 'My Reservation',
74 routeName: 'myReservation', 75 routeName: 'myReservation',
75 picUrl1: '/img/nav_29.png', 76 picUrl1: '/img/nav_29.png',
76 picUrl2: '/img/nav_29_dwn.png', 77 picUrl2: '/img/nav_29_dwn.png',
...@@ -84,7 +85,7 @@ const menus3 = ref([ ...@@ -84,7 +85,7 @@ const menus3 = ref([
84 // isActive: false 85 // isActive: false
85 // }, 86 // },
86 { 87 {
87 name: language.value==0?'发票申请':'Electronic invoice', 88 name: language.value == 0 ? '发票申请' : 'Electronic invoice',
88 routeName: 'myKP', 89 routeName: 'myKP',
89 picUrl1: '/img/fp.svg', 90 picUrl1: '/img/fp.svg',
90 picUrl2: '/img/fp_dwn.svg', 91 picUrl2: '/img/fp_dwn.svg',
...@@ -100,19 +101,26 @@ const menus3En = ref([ ...@@ -100,19 +101,26 @@ const menus3En = ref([
100 // isActive: false 101 // isActive: false
101 // }, 102 // },
102 { 103 {
103 name: language.value==0?'修改密码':'Change Password', 104 name: language.value == 0 ? '修改密码' : 'Change Password',
104 routeName: 'myPassword', 105 routeName: 'myPassword',
105 picUrl1: '/img/nav_27.png', 106 picUrl1: '/img/nav_27.png',
106 picUrl2: '/img/nav_27_dwn.png', 107 picUrl2: '/img/nav_27_dwn.png',
107 isActive: false 108 isActive: false
108 }, 109 },
109 { 110 {
110 name: language.value==0?'我的预订':'My Reservation', 111 name: language.value == 0 ? '我的预订' : 'My Reservation',
111 routeName: 'myReservation', 112 routeName: 'myReservation',
112 picUrl1: '/img/nav_29.png', 113 picUrl1: '/img/nav_29.png',
113 picUrl2: '/img/nav_29_dwn.png', 114 picUrl2: '/img/nav_29_dwn.png',
114 isActive: false 115 isActive: false
115 }, 116 },
117 {
118 name: language.value == 0 ? '签证审核记录' : 'Visa Review record',
119 routeName: 'myVisa',
120 picUrl1: '/img/fp.svg',
121 picUrl2: '/img/fp_dwn.svg',
122 isActive: false
123 },
116 // { 124 // {
117 // name: language.value==0?'票务预订':'Ticket Reservation', 125 // name: language.value==0?'票务预订':'Ticket Reservation',
118 // routeName: 'seat_order', 126 // routeName: 'seat_order',
...@@ -125,18 +133,19 @@ const menus3En = ref([ ...@@ -125,18 +133,19 @@ const menus3En = ref([
125 let currMenu 133 let currMenu
126 onMounted(() => { 134 onMounted(() => {
127 console.log(route.query) 135 console.log(route.query)
128 if(!user.utype){ 136 if (!user.utype) {
129 router.push({name: 'home'}) 137 router.push({name: 'home'})
130 return 138 return
131 } 139 }
132 currMenu = _.find(menus3.value, (m) => { 140
141 currMenu = _.find((language.value == 0? menus3.value: menus3En.value), (m) => {
133 return m.routeName === route.name 142 return m.routeName === route.name
134 }) 143 })
135 currMenu.isActive = true 144 currMenu.isActive = true
136 145
137 }) 146 })
138 147
139 const toInfo = (item,list) => { 148 const toInfo = (item, list) => {
140 _.each(list, (m) => { 149 _.each(list, (m) => {
141 m.isActive = false 150 m.isActive = false
142 }) 151 })
...@@ -159,11 +168,23 @@ const toInfo = (item,list) => { ...@@ -159,11 +168,23 @@ const toInfo = (item,list) => {
159 li { 168 li {
160 margin-bottom: 15px; 169 margin-bottom: 15px;
161 } 170 }
162 &.en-menu{text-align: left; 171
163 li{padding: 6px 0 6px 14px; 172 &.en-menu {
164 a{display: flex;align-items: center;} 173 text-align: left;
174
175 li {
176 padding: 6px 0 6px 14px;
177
178 a {
179 display: flex;
180 align-items: center;
181 }
182 }
183
184 img {
185 padding: 0;
186 width: 26px;
165 } 187 }
166 img{padding: 0;width: 26px;}
167 } 188 }
168 } 189 }
169 190
...@@ -179,24 +200,61 @@ li img { ...@@ -179,24 +200,61 @@ li img {
179 background: #000; 200 background: #000;
180 border-radius: 20px; 201 border-radius: 20px;
181 } 202 }
203
182 @media (max-width: 500px) { 204 @media (max-width: 500px) {
183 .pd20{padding: 8px;} 205 .pd20 {
184 .el-card{box-shadow: none!important; 206 padding: 8px;
185 :deep(.el-card__body){padding: 0!important;} 207 }
186 } 208 .el-card {
187 .el-col{padding: 0!important;} 209 box-shadow: none !important;
188 .center-menu{height: 100vh;padding: 20px 0;position: fixed;left: 0;z-index: 1; 210
189 background: #F5F7F9;top: 80px;width: 100px;border-right: 1px solid #eee; 211 :deep(.el-card__body) {
190 li{font-size: 13px;padding:8px 10px;border-radius: 0; 212 padding: 0 !important;
191 img{display: none} 213 }
192 &.active{background: #fff; 214 }
215 .el-col {
216 padding: 0 !important;
217 }
218 .center-menu {
219 height: 100vh;
220 padding: 20px 0;
221 position: fixed;
222 left: 0;
223 z-index: 1;
224 background: #F5F7F9;
225 top: 80px;
226 width: 100px;
227 border-right: 1px solid #eee;
228
229 li {
230 font-size: 13px;
231 padding: 8px 10px;
232 border-radius: 0;
233
234 img {
235 display: none
236 }
237
238 &.active {
239 background: #fff;
193 border-left: 2px solid var(--el-color-primary); 240 border-left: 2px solid var(--el-color-primary);
194 color: var(--el-color-primary);} 241 color: var(--el-color-primary);
195 } 242 }
196 } 243 }
197 .rightPart{width: calc(100vw - 100px);left: 100px;position: fixed; z-index: 1;
198 height: calc(100vh - 80px);overflow: auto;top: 80px;background: #fff;
199 } 244 }
245 .rightPart {
246 width: calc(100vw - 100px);
247 left: 100px;
248 position: fixed;
249 z-index: 1;
250 height: calc(100vh - 80px);
251 overflow: auto;
252 top: 80px;
253 background: #fff;
254 }
255 }
256
257 .app-container {
258 min-height: 80vh;
200 } 259 }
201 .app-container{min-height: 80vh;}
202 </style> 260 </style>
......
1 <template>
2 <div>
3 <el-card :body-style="{'padding':'0'}">
4 <div class="indexTitle">
5 <h3 class="leftboderTT">{{ language == 0 ? '我的签证' : 'My visa' }}
6 </h3>
7
8 <!-- <el-button class="fr" type="primary" plain @click="toInvoice">{{ language==0?'发票开具':'Invoice' }}</el-button>-->
9 <!-- <el-button class="fr" type="primary" plain @click="toInvoice">{{ language==0?'我的发票':'My Invoice' }}</el-button>-->
10 </div>
11 <el-empty v-if="list?.length == 0" :image="`/img/order_no.png`" :image-size="228"/>
12
13 <div class="pd20">
14 <div v-for="b in list" class="item">
15 <div class="title">
16 <label class="orangeTag"> {{ b.applicatTypeName }} </label>
17 <span>{{ language == 0 ? '订单编号:' : 'No.' }} {{ b.id }}</span>
18 </div>
19
20 <div class="status-po">
21 <span v-if="b.status == '0'" class="bg-gary">{{ 'Under Review' }}</span>
22 <span v-if="b.status == '1'" class="bg-blue">{{ 'Approved' }}</span>
23 <span v-if="b.status == '2'" class="bg-danger">{{ 'Rejected' }}</span>
24 </div>
25
26 <el-row align="middle" class="pd20 mt10" justify="space-between">
27 <el-col :lg="9" :md="12" :sm="12" :xs="24">
28 <div>
29 <h3 class="name">{{ b.fullName }}</h3>
30 <p>{{ b.email }}</p>
31 <!-- <p>{{ b.phone }}</p>-->
32 </div>
33 </el-col>
34 <el-col :lg="3" :md="6" :sm="6" :xs="6" class="text-center">
35 <span class="text-warning"> {{ b.invitationTypeName }} </span>
36 </el-col>
37 <el-col :lg="6" :md="16" :sm="16" :xs="16">
38 <div class="text-right">
39 <el-button class="mb10" plain round size="small" type="primary" @click="goDetail(b)">
40 {{ language == 0 ? '详情' : 'Detail' }}
41 </el-button>
42 </div>
43 </el-col>
44 </el-row>
45 </div>
46 </div>
47 </el-card>
48 <affix-invitation-view ref="affixInvitationRef"></affix-invitation-view>
49 </div>
50 </template>
51
52 <script setup>
53 import {onMounted, getCurrentInstance} from "@vue/runtime-core";
54 import {useStorage} from "@vueuse/core/index";
55 // import {newbilllist} from "@/apiPc/common";
56 import useUserStore from "@/store/modules/user";
57 // import dayjs from 'dayjs'
58 import {cancelOrder2, cancelOrder} from "/@/apiPc/booking";
59
60 import {ElMessage} from "element-plus";
61 import {getVisaInfo} from "/@/apiPc/match";
62 import AffixInvitationView from "/@/viewsPc/match/components/affix-invitation-view.vue";
63 import {ref} from "vue";
64 import {useRouter} from "vue-router";
65
66 const router = useRouter()
67 const language = useStorage('language', 0)
68 const list = ref([])
69 const user = useUserStore().user
70 const {proxy} = getCurrentInstance()
71
72 const affixInvitationRef = ref(null)
73
74 onMounted(() => {
75 getList()
76 })
77
78 function finish(bill) {
79 bill.status = '2'
80 // getList()
81 }
82
83 function getList() {
84 getVisaInfo({userId: user.userId}).then(res => {
85 list.value = res.rows || []
86 for (let b of list.value) {
87 b.messageObj = JSON.parse(b.message) || {}
88 b.extJsonObj = JSON.parse(b.extJson) || {}
89 if (b.orderType == 5) {
90 try {
91 b.extJsonObj.ticketDate = b.extJsonObj.ticketDate ? JSON.parse(b.extJsonObj.ticketDate) : {}
92 b.extJsonObj.ticketType = b.extJsonObj.ticketType ? JSON.parse(b.extJsonObj.ticketType) : {}
93 } catch (e) {
94 console.log(e)
95 }
96 }
97 if (b.surplus && b.status == '0' && (b.surplus != '0,0' && b.surplus != '0')) {
98 b.countdown = Date.now() + Number((b.surplus.split(',')[0] * 60 + b.surplus.split(',')[1]) * 10)
99 }
100 }
101 })
102 }
103
104 function goDetail(b) {
105 affixInvitationRef.value.open(b)
106 // router.push({
107 // name: 'bookingPay',
108 // query: {
109 // orderId: b.id,
110 // orderType: b.orderType
111 // }
112 // })
113 }
114
115 function Rebook(row) {
116 console.log(row)
117 if (row.orderType == 0) {
118 router.push({
119 name: 'hotelDetail',
120 params: {
121 cptId: row.activeId,
122 hotelId: row.hotelId
123 },
124 query: {
125 id: row.extId
126 }
127 })
128 } else {
129 router.push({
130 name: 'ticket',
131 params: {
132 activeId: row.activeId,
133 }
134 })
135 }
136 }
137
138 const cancel = (row) => {
139 //取消订单
140 proxy.$modal.confirm(language.value == 0 ? '确定取消订单吗 ?' : `Are you sure to cancel the order?`).then(() => {
141 return cancelOrder2(row.id).then(res => {
142 getList()
143 ElMessage({
144 message: language.value == 0 ? '操作成功' : 'Successful operation!',
145 type: 'success'
146 })
147 })
148 })
149 }
150
151 const unsubscribe = (row) => {
152 proxy.$modal.confirm(language.value == 0 ? `确定退款吗 ?` : 'Are you sure to refund?').then(() => {
153 return cancelOrder(row.id).then(res => {
154 getList()
155 ElMessage({
156 message: language.value == 0 ? '已提交退款,请等待审核!' : 'Refund has been submitted, please wait for review!',
157 type: 'success'
158 })
159 })
160 })
161 }
162
163
164 function toInvoice() {
165 router.push({
166 name: 'invoice'
167 })
168 }
169 </script>
170
171 <style lang="scss" scoped>
172 .bigMoney {
173 font-size: 24px;
174 font-family: "DIN Alternate";
175 }
176
177 .name {
178 font-size: 18px;
179 margin: 0;
180 }
181
182 .status-po {
183 position: absolute;
184 right: 0;
185 top: 0;
186 font-size: 12px;
187 color: #FFFFFF;
188
189 span {
190 border-radius: 0px 10px 0px 10px;
191 padding: 4px 10px;
192 }
193
194 .bg-danger {
195 background: #E60012;
196 }
197
198 .bg-warning {
199 background: #e89f39;
200 }
201
202 .bg-pink {
203 background: #F740A6;
204 }
205
206 .bg-primary {
207 background: var(--el-color-primary)
208 }
209
210 .bg-blue {
211 background: #00a0e9
212 }
213 }
214
215 .indexTitle {
216 margin: 20px 0 12px;
217 overflow: visible;
218 padding: 0 20px 15px;
219 border-bottom: 1px solid #e5e5e5;
220
221 .fr {
222 margin: -8px 0 0
223 }
224
225 h3 {
226 display: inline-block;
227 font-size: 16px;
228 color: var(--el-color-primary);
229 }
230 }
231
232 .item {
233 .name {
234 font-size: 18px;
235 color: #000000;
236 margin: 0 0 10px;
237 }
238
239 p {
240 margin: 8px 0 0;
241 color: #707070;
242 font-size: 14px;
243 }
244
245 margin: 0 0 20px;
246 border: 1px solid #E5E5E5;
247 border-radius: 10px;
248 position: relative;
249
250 .bbody {
251 padding: 0 15px 20px;
252 }
253
254 .title {
255 background: #F7F7F7;
256 border-bottom: 1px solid #E5E5E5;
257
258 span {
259 font-size: 14px;
260 color: #4C5359;
261 }
262 }
263
264 .title label {
265 border-radius: 5px 0 5px 0;
266 font-size: 12px;
267 color: #fff;
268 padding: 4px 10px;
269 margin-right: 10px;
270 }
271
272 .blueTag {
273 background-color: #1EC886;
274 }
275
276 .purpleTag {
277 background-color: #717bef;
278 }
279
280 .orangeTag {
281 background-color: #ff8124;
282 }
283 }
284
285 .billFoot {
286 .price {
287 width: 100%;
288 justify-content: space-between;
289 }
290 }
291
292 .billFoot .tip {
293 font-size: 24px;
294 color: #999;
295 font-weight: 500;
296 margin: 0 20px;
297 }
298
299 .status {
300 position: absolute;
301 right: 10px;
302 bottom: 60px;
303 white-space: nowrap;
304
305 .warning {
306 color: #ff8124;
307 }
308
309 .danger {
310 color: #da2a2a;
311 }
312
313 .gary {
314 color: #666;
315 }
316
317 .success {
318 color: #1EC886;
319 }
320 }
321
322 </style>
323
1 <template>
2 <el-dialog
3 v-model="show" title="Visa Invitation Letter" append-to-body close-icon="CircleClose" center
4 close-on-click-modal destroy-on-close width="1100"
5 >
6 <el-descriptions border>
7 <el-descriptions-item label="No.">{{ form.id }}</el-descriptions-item>
8 <el-descriptions-item label="Applicant Type">{{ form.remarks || form.applicatTypeName }}</el-descriptions-item>
9 <el-descriptions-item label="Invitation Type">{{ form.invitationTypeName }}</el-descriptions-item>
10 <el-descriptions-item label="Do you need a Chinese invitation?">{{
11 form.chinese == '1' ? 'YES' : 'No'
12 }}
13 </el-descriptions-item>
14 <el-descriptions-item label="MNA/Team Name">{{ form.nameEn }}</el-descriptions-item>
15 <el-descriptions-item label="MNA/Team Address">{{ form.associationAddress }}</el-descriptions-item>
16 <el-descriptions-item label="Contact Email">{{ form.email }}</el-descriptions-item>
17 <el-descriptions-item label="Full Name">{{ form.fullName }}</el-descriptions-item>
18 <el-descriptions-item label="Position">{{ form.remarks1 || form.positionName }}</el-descriptions-item>
19 <el-descriptions-item label="Phone">{{ form.phone }}</el-descriptions-item>
20 <el-descriptions-item label="Chinese Embassy Visas Office">{{ form.embassy }}</el-descriptions-item>
21 <el-descriptions-item label="Chinese Embassy Email">{{ form.embassyEmail }}</el-descriptions-item>
22 <el-descriptions-item label="Additional Documents">
23 <el-link v-if="form.files" :href="fillImgUrl(form.files)" target="_blank" type="primary">
24 additional documents
25 </el-link>
26 </el-descriptions-item>
27 <el-descriptions-item label="Proof of Employment">
28 <el-link v-if="form.invitationFile" target="_blank" :href="fillImgUrl(form.invitationFile)" type="primary">
29 proof of employment
30 </el-link>
31 </el-descriptions-item>
32 </el-descriptions>
33 <!-- <el-divider></el-divider>-->
34 <br/>
35 <el-table :data="visaList" border stripe>
36 <el-table-column prop="passportCopy" label="Passport Copy">
37 <template #default="{row}">
38 <el-image
39 :src="fillImgUrl(row.passportCopy)"
40 :preview-src-list="[fillImgUrl(row.passportCopy)]"
41 :preview-teleported="true"
42 style="width: 50px;height: 70px"
43 />
44 </template>
45 </el-table-column>
46 <el-table-column label="position" align="center" prop="position"/>
47 <el-table-column label="lastName" align="center" prop="lastName"/>
48 <el-table-column label="firstName" align="center" prop="fristName"/>
49 <el-table-column prop="sex" label="Gender" align="center">
50 <template #default="{row}">
51 {{ row.sex == '0' ? 'M' : 'F' }}
52 </template>
53 </el-table-column>
54 <el-table-column label="nationality" align="center" prop="nationality"/>
55 <el-table-column label="birthday" align="center" prop="birthday"/>
56 <el-table-column label="Passport No." align="center" prop="passportNo"/>
57 <el-table-column label="DATE OF ISSUE" align="center" prop="issueDate"/>
58 <el-table-column label="DATE OF EXPIRY" align="center" prop="expiryDate"/>
59 </el-table>
60 </el-dialog>
61
62 </template>
63
64 <script setup>
65 import {useStorage} from "@vueuse/core/index";
66 import {getCurrentInstance, ref} from "vue";
67 import {listVisaInfo} from "@/apiPc/match";
68 import useUserStore from "@/store/modules/user";
69 import {fillImgUrl} from "/@/utils/ruoyi";
70
71 const user = useUserStore().user
72 const {proxy} = getCurrentInstance()
73 const language = useStorage('language', 0)
74 const form = ref({
75 gender: '0',
76 cptVisaInfoBos: [],
77 email: user?.email,
78 })
79 const show = ref(false)
80 const visaList = ref([])
81
82 const open = (params) => {
83 show.value = true
84 form.value = params
85
86 listVisaInfo({visaId: params.id})
87 .then((res) => {
88 visaList.value = res.rows
89 })
90
91 }
92 defineExpose({open})
93
94 </script>
95
96 <style scoped lang="scss">
97
98 </style>
...@@ -76,13 +76,13 @@ export default defineConfig(({ mode, command }) => { ...@@ -76,13 +76,13 @@ export default defineConfig(({ mode, command }) => {
76 rewrite: (p) => p.replace(/^\/dev-api\/ztx-match/, '') 76 rewrite: (p) => p.replace(/^\/dev-api\/ztx-match/, '')
77 }, 77 },
78 '/dev-api/ztx-webSite': { 78 '/dev-api/ztx-webSite': {
79 target: 'http://192.168.1.118:8081/', 79 target: 'http://192.168.1.118:8082/',
80 // target: 'https://ces.2025wtcwuxi.com/stage-api/', 80 // target: 'https://ces.2025wtcwuxi.com/stage-api/',
81 changeOrigin: true, 81 changeOrigin: true,
82 rewrite: (p) => p.replace(/^\/dev-api\/ztx-webSite/, '') 82 rewrite: (p) => p.replace(/^\/dev-api\/ztx-webSite/, '')
83 }, 83 },
84 '/dev-api': { 84 '/dev-api': {
85 target: 'http://192.168.1.118:8081/', 85 target: 'http://192.168.1.118:8082/',
86 // target: 'http://192.168.1.131:8081/', 86 // target: 'http://192.168.1.131:8081/',
87 // target: 'https://ces.2025wtcwuxi.com/stage-api/', 87 // target: 'https://ces.2025wtcwuxi.com/stage-api/',
88 // target: 'http://124.70.181.90:1880/stage-api', 88 // target: 'http://124.70.181.90:1880/stage-api',
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!