MeetingApplyFormNewEn.vue 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742
  1. <template>
  2. <div class="container-box">
  3. <div class="bread-crumb">
  4. <el-breadcrumb separator="/" style="float: left; margin: 15px">
  5. <el-breadcrumb-item :to="{ path: 'home' }">{{
  6. lang == "en" ? "Home" : "首页"
  7. }}</el-breadcrumb-item>
  8. <el-breadcrumb-item :to="{ path: 'ConferenceServices' }">{{
  9. lang == "en" ? "Conferences" : "会议"
  10. }}</el-breadcrumb-item>
  11. <el-breadcrumb-item>{{
  12. lang == "en" ? "The information provided" : "信息填报"
  13. }}</el-breadcrumb-item>
  14. </el-breadcrumb>
  15. </div>
  16. <div class="content-box-en" v-if="lang == 'en'">
  17. <el-form
  18. :model="meetingApply"
  19. :rules="rulesEn"
  20. ref="meetingApplyen"
  21. v-show="infoSwitch"
  22. label-width="250px"
  23. >
  24. <div class="content-item">
  25. <div class="category-title">The basic information</div>
  26. <div class="category-body">
  27. <!-- 邀请码 -->
  28. <el-form-item label="Invitation Code" prop="invitationCode">
  29. <el-input
  30. v-model="meetingApply.invitationCode"
  31. placeholder=""
  32. ></el-input>
  33. </el-form-item>
  34. <!-- 名 -->
  35. <el-form-item label="Given Name" prop="givenName">
  36. <el-input
  37. v-model="meetingApply.givenName"
  38. placeholder=""
  39. ></el-input>
  40. </el-form-item>
  41. <!-- 中间名 -->
  42. <el-form-item label="Middle Name">
  43. <el-input
  44. v-model="meetingApply.middleName"
  45. placeholder=""
  46. ></el-input>
  47. </el-form-item>
  48. <!-- 姓 -->
  49. <el-form-item label="Surname" prop="surname">
  50. <el-input
  51. v-model="meetingApply.surname"
  52. placeholder=""
  53. ></el-input>
  54. </el-form-item>
  55. <!-- 性别 -->
  56. <el-form-item label="Gender" prop="genderDictEn">
  57. <el-radio-group v-model="meetingApply.genderDictEn">
  58. <el-radio label="M">Male</el-radio>
  59. <el-radio label="F">Female</el-radio>
  60. <el-radio label="O">Other</el-radio>
  61. </el-radio-group>
  62. </el-form-item>
  63. <!-- 邮箱 -->
  64. <el-form-item label="E-mail" prop="email">
  65. <el-input v-model="meetingApply.email" placeholder=""></el-input>
  66. </el-form-item>
  67. <!-- 区号 -->
  68. <el-form-item label="Mobile Area Code" prop="tel">
  69. <GlobalRoaming
  70. :size="{ width: '398px' }"
  71. @getAreaCode="getGobileAreaCodeDictEn"
  72. v-model="meetingApply.tel"
  73. :language="lang"
  74. :code="meetingApply.mobileAreaCodeDictEn"
  75. :mobile="meetingApply.tel"
  76. ></GlobalRoaming>
  77. <el-input
  78. v-model="meetingApply.tel"
  79. placeholder=""
  80. v-show="false"
  81. ></el-input>
  82. </el-form-item>
  83. <!-- 手机号 -->
  84. <!-- <el-form-item label="Tel." prop="tel">
  85. <el-input v-model="meetingApply.tel" placeholder=""></el-input>
  86. </el-form-item> -->
  87. <!-- 所在国家 -->
  88. <el-form-item label="Country/Region" prop="unitCountryDictEn">
  89. <el-select
  90. v-model="meetingApply.unitCountryDictEn"
  91. filterable
  92. placeholder=""
  93. style="width: 100%"
  94. >
  95. <el-option
  96. :label="item.label"
  97. :value="item.value"
  98. v-for="item in unitCountryDictEns"
  99. ></el-option>
  100. </el-select>
  101. </el-form-item>
  102. <!-- 语言 -->
  103. <el-form-item label="Language" prop="languageDictEn">
  104. <el-select
  105. v-model="meetingApply.languageDictEn"
  106. placeholder=""
  107. style="width: 100%"
  108. >
  109. <el-option
  110. :label="item.label"
  111. :value="item.value"
  112. v-for="item in languageDictEns"
  113. ></el-option>
  114. </el-select>
  115. </el-form-item>
  116. <!-- 照片 -->
  117. <el-form-item label="Photo">
  118. <div class="photo-uploader-container">
  119. <el-upload
  120. name="upload"
  121. class="avatar-uploader"
  122. action="/api/meeting/upload/file/"
  123. :headers="Authorization"
  124. :show-file-list="false"
  125. :on-success="handleAvatarSuccess"
  126. :before-upload="beforeAvatarUpload"
  127. drag
  128. multiple
  129. >
  130. <img
  131. v-if="meetingApply.photoUrl"
  132. :src="'./api/file/pub/' + meetingApply.photoUrl"
  133. class="avatar"
  134. width="120"
  135. height="168"
  136. />
  137. <div v-else>
  138. <i class="el-icon-upload"></i>
  139. <div class="el-upload__text">Drag/<em>Upload</em></div>
  140. </div>
  141. <div class="el-upload__tip" slot="tip">
  142. Note: In PNG, JPEG or JPG format; maximally 2M.
  143. </div>
  144. </el-upload>
  145. </div>
  146. <!-- <div class="border-custom" style="width: 100%; height: 300px">
  147. <UpLoad @getphotoUrl="getphotoUrl"></UpLoad>
  148. </div> -->
  149. </el-form-item>
  150. <!-- 护照号 -->
  151. <el-form-item label="Passport Number" prop="passportNumber">
  152. <el-input
  153. v-model="meetingApply.passportNumber"
  154. placeholder=""
  155. ></el-input>
  156. </el-form-item>
  157. <!-- 是否需要来华签证邀请函 -->
  158. <!-- <el-form-item label="Need to apply an invitation letter" prop="isNeedLetter">
  159. <el-radio-group v-model="meetingApply.isNeedLetter">
  160. <el-radio label="Yes">Yes</el-radio>
  161. <el-radio label="No">No</el-radio>
  162. </el-radio-group>
  163. </el-form-item> -->
  164. </div>
  165. </div>
  166. <div class="content-item" v-show="infoSwitch">
  167. <div class="category-title">Position and Employer</div>
  168. <div class="category-body">
  169. <!-- 所在单位 -->
  170. <el-form-item
  171. label="Name of Company/Organization"
  172. prop="unitNameEn"
  173. >
  174. <el-input
  175. v-model="meetingApply.unitNameEn"
  176. placeholder=""
  177. ></el-input>
  178. </el-form-item>
  179. <!-- 单位类型 -->
  180. <el-form-item
  181. label="Company/Organization Type"
  182. prop="meetingUnitTypeDictEn"
  183. >
  184. <el-select
  185. v-model="meetingApply.meetingUnitTypeDictEn"
  186. placeholder=""
  187. style="width: 100%"
  188. >
  189. <el-option
  190. :label="item.label"
  191. :value="item.value"
  192. v-for="item in meetingUnitTypeDictEns"
  193. ></el-option>
  194. </el-select>
  195. </el-form-item>
  196. <!-- 职务 -->
  197. <el-form-item label="Title" prop="positionNameEn">
  198. <el-input
  199. v-model="meetingApply.positionNameEn"
  200. placeholder=""
  201. ></el-input>
  202. </el-form-item>
  203. </div>
  204. </div>
  205. <div class="content-item" v-show="infoSwitch">
  206. <div class="category-title">
  207. Contacts<span>
  208. (The default contact is basic information, if necessary, please
  209. change manually)</span
  210. >
  211. </div>
  212. <div class="category-body">
  213. <!-- 联系人 -->
  214. <el-form-item label="Contact Person" prop="contactPersonName">
  215. <el-input
  216. v-model="meetingApply.contactPersonName"
  217. placeholder=""
  218. ></el-input>
  219. </el-form-item>
  220. <!-- 区号 -->
  221. <el-form-item label="Mobile Area Code" prop="contactCellphone">
  222. <GlobalRoaming
  223. :size="{ width: '398px' }"
  224. @getAreaCode="getContactMobileAreacodeDictEn"
  225. :language="lang"
  226. :code="meetingApply.contactMobileAreacodeDictEn"
  227. v-model="meetingApply.contactCellphone"
  228. :mobile="meetingApply.contactCellphone"
  229. ></GlobalRoaming>
  230. <el-input
  231. v-model="meetingApply.contactCellphone"
  232. placeholder=""
  233. v-show="false"
  234. ></el-input>
  235. </el-form-item>
  236. <!-- 手机号 -->
  237. <!-- <el-form-item label="Contact Cellphone" prop="contactCellphone">
  238. <el-input v-model="meetingApply.contactCellphone" placeholder=""></el-input>
  239. </el-form-item> -->
  240. <!-- 邮箱 -->
  241. <el-form-item label="Contact E-mail" prop="contactEmail">
  242. <el-input
  243. v-model="meetingApply.contactEmail"
  244. placeholder=""
  245. ></el-input>
  246. </el-form-item>
  247. <!-- 参会意向 -->
  248. <el-form-item
  249. v-if="
  250. gridData.length && intentions.isShowEnOnsiteIntention == 'Yes'
  251. "
  252. >
  253. <p style="font-size: 16px">
  254. Among multiple events of our conference, please kindly choose
  255. your preferable events to attend to(Multiple choice).
  256. </p>
  257. <el-table
  258. :data="gridData"
  259. :border="false"
  260. @selection-change="checkRow"
  261. @row-click="setSelectEn"
  262. size="small"
  263. ref="multipleTableEn"
  264. :empty-text="'Sorry no date.'"
  265. class="active-grid"
  266. >
  267. <el-table-column type="selection" width="50"></el-table-column>
  268. <el-table-column property="activityName" label="ALL">
  269. <template slot-scope="scope">
  270. <p style="font-weight: bold">
  271. {{ momentDate(scope.row.activityStartTime) }} ~
  272. {{ momentDate(scope.row.activityEndTime) }}
  273. </p>
  274. <p>{{ scope.row.activityNameEn }}</p>
  275. </template>
  276. </el-table-column>
  277. </el-table>
  278. </el-form-item>
  279. <el-form-item style="text-align: center">
  280. <el-button
  281. type="primary"
  282. v-if="meetingApply.isNeedLetter == 'Yes'"
  283. @click="infoSwitch = false"
  284. >Next Visa</el-button
  285. >
  286. <el-button type="primary" @click="submitFormEn('meetingApplyen')"
  287. >Submit</el-button
  288. >
  289. </el-form-item>
  290. </div>
  291. </div>
  292. </el-form>
  293. <el-form
  294. :model="meetingApply"
  295. :rules="rulesEnNext"
  296. ref="meetingApplyenNext"
  297. label-width="250px"
  298. >
  299. <div class="content-item" v-show="!infoSwitch">
  300. <div class="category-title">Visa Application information</div>
  301. <div class="category-body">
  302. <!-- 访问地点 -->
  303. <el-form-item label="Places to Visit" prop="visitPlace">
  304. <el-input
  305. v-model="meetingApply.visitPlace"
  306. placeholder="e.g. Beijing"
  307. ></el-input>
  308. </el-form-item>
  309. <!-- 拟前往办理签证的中国使/领馆名称 -->
  310. <el-form-item
  311. label="Embassy/Consulate to apply visa"
  312. prop="embassyName"
  313. >
  314. <el-input
  315. v-model="meetingApply.embassyName"
  316. placeholder="Accuracy of the Embassy is very important for visa application"
  317. ></el-input>
  318. </el-form-item>
  319. <!-- 邀请种类 -->
  320. <el-form-item label="Purpose of visit" prop="visitTypeEn">
  321. <el-input
  322. v-model="meetingApply.visitTypeEn"
  323. placeholder="e.g. Communication"
  324. ></el-input>
  325. </el-form-item>
  326. <!-- 申请人是否为副部长及以上级别 -->
  327. <el-form-item
  328. label="Vice Ministerial level or above"
  329. prop="isAboveMinisterial"
  330. >
  331. <el-radio-group v-model="meetingApply.isAboveMinisterial">
  332. <el-radio label="Yes">Yes</el-radio>
  333. <el-radio label="No">No</el-radio>
  334. </el-radio-group>
  335. </el-form-item>
  336. <!-- 拟申请签证有效次数 -->
  337. <el-form-item label="Number of entries" prop="numberOfEntries">
  338. <el-input
  339. v-model="meetingApply.numberOfEntries"
  340. placeholder=""
  341. ></el-input>
  342. <div class="tip">
  343. (Multiple entry visa application should be well illustratied
  344. with reasons)
  345. </div>
  346. </el-form-item>
  347. <!-- 拟入境日期 -->
  348. <el-form-item label="Date of First Entry" prop="firstEntryDate">
  349. <el-date-picker
  350. v-model="meetingApply.firstEntryDate"
  351. type="date"
  352. placeholder="YYYY-MM-DD"
  353. style="width: 100%"
  354. ></el-date-picker>
  355. </el-form-item>
  356. <!-- 最长停留天数 -->
  357. <el-form-item label="Longest Stay (days)" prop="longestStayDays">
  358. <el-input
  359. v-model="meetingApply.longestStayDays"
  360. placeholder=""
  361. ></el-input>
  362. </el-form-item>
  363. </div>
  364. </div>
  365. <div class="content-item" v-show="!infoSwitch">
  366. <div class="category-title">Guest's Personal Information</div>
  367. <div class="category-body">
  368. <!-- 名 -->
  369. <el-form-item label="Given Name" prop="givenName">
  370. <el-input
  371. v-model="meetingApply.givenName"
  372. placeholder=""
  373. :disabled="true"
  374. ></el-input>
  375. <div class="tip">(Type in Engllis.In line with Passport)</div>
  376. </el-form-item>
  377. <!-- 中间名 -->
  378. <el-form-item label="Middle Name">
  379. <el-input
  380. v-model="meetingApply.middleName"
  381. placeholder=""
  382. :disabled="true"
  383. ></el-input>
  384. <div class="tip">(Type in Engllis.In line with Passport)</div>
  385. </el-form-item>
  386. <!-- 姓 -->
  387. <el-form-item label="Surname" prop="surname">
  388. <el-input
  389. v-model="meetingApply.surname"
  390. placeholder=""
  391. :disabled="true"
  392. ></el-input>
  393. <div class="tip">(Type in Engllis.In line with Passport)</div>
  394. </el-form-item>
  395. <!-- 出生日期 -->
  396. <el-form-item label="Date of Birth" prop="birthDate">
  397. <el-date-picker
  398. v-model="meetingApply.birthDate"
  399. type="date"
  400. placeholder="YYYY-MM-DD"
  401. style="width: 100%"
  402. ></el-date-picker>
  403. </el-form-item>
  404. <!-- 性别 -->
  405. <el-form-item label="Gender" prop="genderDictEn">
  406. <el-radio-group
  407. v-model="meetingApply.genderDictEn"
  408. :disabled="true"
  409. >
  410. <el-radio label="M">Male</el-radio>
  411. <el-radio label="F">Female</el-radio>
  412. <el-radio label="O">Other</el-radio>
  413. </el-radio-group>
  414. </el-form-item>
  415. <!-- 国籍 -->
  416. <el-form-item label="Nationality" prop="nationalityDict">
  417. <el-select
  418. v-model="meetingApply.nationalityDict"
  419. filterable
  420. placeholder=""
  421. style="width: 100%"
  422. >
  423. <el-option
  424. :label="item.label"
  425. :value="item.value"
  426. v-for="item in unitCountryDictEns"
  427. ></el-option>
  428. </el-select>
  429. </el-form-item>
  430. <!-- 护照号 -->
  431. <el-form-item label="Passport Number" prop="passportNumber">
  432. <el-input
  433. v-model="meetingApply.passportNumber"
  434. placeholder=""
  435. :disabled="true"
  436. ></el-input>
  437. </el-form-item>
  438. <!-- 护照有效期 -->
  439. <el-form-item
  440. label="Passport Validity Date"
  441. prop="passportValidityDate"
  442. >
  443. <el-date-picker
  444. v-model="meetingApply.passportValidityDate"
  445. type="date"
  446. placeholder="YYYY-MM-DD"
  447. style="width: 100%"
  448. ></el-date-picker>
  449. </el-form-item>
  450. <!-- 工作单位 -->
  451. <el-form-item label="Affiliation" prop="unitNameEn">
  452. <el-input
  453. v-model="meetingApply.unitNameEn"
  454. placeholder=""
  455. :disabled="true"
  456. ></el-input>
  457. </el-form-item>
  458. <!-- 职务 -->
  459. <el-form-item label="Possition" prop="positionName">
  460. <el-input
  461. v-model="meetingApply.positionName"
  462. placeholder=""
  463. :disabled="true"
  464. ></el-input>
  465. </el-form-item>
  466. <!-- 电子邮件 -->
  467. <el-form-item label="E-mail" prop="email">
  468. <el-input
  469. v-model="meetingApply.email"
  470. placeholder=""
  471. :disabled="true"
  472. ></el-input>
  473. </el-form-item>
  474. <!-- 护照首页复印件 -->
  475. <el-form-item label>
  476. <div
  477. class="border-custom"
  478. style="width: 48%; height: 360px; float: left"
  479. >
  480. <p class="title-custom">
  481. Photocopy of the Passport's front page
  482. </p>
  483. <UpLoad @getphotoUrl="getPassportFristPageUrl"></UpLoad>
  484. </div>
  485. <!-- 任职经历 -->
  486. <div
  487. class="border-custom"
  488. style="width: 48%; height: 360px; float: left; margin-left: 4%"
  489. >
  490. <p class="title-custom">Previous Positions</p>
  491. <UpLoadFile @getFileUrl="getPreviousPositions"></UpLoadFile>
  492. </div>
  493. </el-form-item>
  494. <!-- 教育经历 -->
  495. <el-form-item label>
  496. <div class="border-custom" style="width: 100%; height: 360px">
  497. <p class="title-custom">Education Background</p>
  498. <UpLoadFile @getFileUrl="getEducationBackground"></UpLoadFile>
  499. </div>
  500. </el-form-item>
  501. </div>
  502. </div>
  503. <div class="content-item" v-show="!infoSwitch">
  504. <div class="category-title">
  505. Relevant information during my stay in China
  506. </div>
  507. <div class="category-body">
  508. <!-- 航班信息 -->
  509. <el-form-item label="Flight Information" prop="flightInformation">
  510. <el-input
  511. v-model="meetingApply.flightInformation"
  512. placeholder=""
  513. ></el-input>
  514. </el-form-item>
  515. <!-- 在华行程 -->
  516. <el-form-item label="Intinerary in China" prop="intineraryInChina">
  517. <el-input
  518. type="textarea"
  519. :rows="4"
  520. placeholder="eg.day by day schedule"
  521. v-model="meetingApply.intineraryInChina"
  522. ></el-input>
  523. </el-form-item>
  524. <el-form-item style="text-align: center">
  525. <el-button type="primary" @click="infoSwitch = true"
  526. >Back</el-button
  527. >
  528. <el-button
  529. type="primary"
  530. @click="submitFormEnNext('meetingApplyenNext')"
  531. >Submit</el-button
  532. >
  533. </el-form-item>
  534. </div>
  535. </div>
  536. </el-form>
  537. </div>
  538. <div class="content-box-zh" v-else>
  539. <el-form
  540. :model="meetingApply"
  541. :rules="rulesZh"
  542. ref="meetingApplyzh"
  543. label-width="100px"
  544. >
  545. <div class="content-item">
  546. <div class="category-title">基本信息</div>
  547. <el-form-item label="邀请码" prop="invitationCode">
  548. <el-input
  549. v-model="meetingApply.invitationCode"
  550. placeholder="请输入邀请码"
  551. ></el-input>
  552. </el-form-item>
  553. <el-form-item label="姓名" prop="name">
  554. <el-input
  555. v-model="meetingApply.name"
  556. placeholder="请输入姓名"
  557. ></el-input>
  558. </el-form-item>
  559. <el-form-item label="英文姓名">
  560. <el-input
  561. v-model="meetingApply.nameEn"
  562. placeholder="请输入英文姓名"
  563. ></el-input>
  564. <p
  565. v-py.upperfirst="meetingApply.name"
  566. id="pinyin"
  567. v-show="false"
  568. ></p>
  569. </el-form-item>
  570. <el-form-item label="性别" prop="genderDict">
  571. <el-radio-group v-model="meetingApply.genderDict">
  572. <el-radio label="M">男</el-radio>
  573. <el-radio label="F">女</el-radio>
  574. </el-radio-group>
  575. </el-form-item>
  576. <el-form-item label="邮箱" prop="email">
  577. <el-input
  578. v-model="meetingApply.email"
  579. placeholder="请输入邮箱"
  580. ></el-input>
  581. <div class="tip">
  582. 输入您始终可以访问的电子邮箱。该邮箱用于接收邮件通知。
  583. </div>
  584. </el-form-item>
  585. <el-form-item label="手机" prop="tel">
  586. <GlobalRoaming
  587. :size="{ width: '398px' }"
  588. @getAreaCode="getGobileAreaCodeDictEn"
  589. v-model="meetingApply.tel"
  590. :language="lang"
  591. :code="meetingApply.mobileAreaCodeDictEn"
  592. :mobile="meetingApply.tel"
  593. ></GlobalRoaming>
  594. <div class="tip">
  595. 输入您始终可以访问的电话号码。该号码用于接收短信通知。
  596. </div>
  597. </el-form-item>
  598. <el-form-item label="国家" prop="unitCountryDict">
  599. <el-select
  600. v-model="meetingApply.unitCountryDict"
  601. filterable
  602. placeholder="请选择"
  603. style="width: 100%"
  604. >
  605. <el-option
  606. :label="item.label"
  607. :value="item.value"
  608. v-for="item in unitCountryDicts"
  609. ></el-option>
  610. </el-select>
  611. </el-form-item>
  612. <el-form-item label="上传照片">
  613. <div class="photo-uploader-container">
  614. <el-upload
  615. name="upload"
  616. class="avatar-uploader"
  617. action="/api/meeting/upload/file/"
  618. :headers="Authorization"
  619. :show-file-list="false"
  620. :on-success="handleAvatarSuccess"
  621. :before-upload="beforeAvatarUpload"
  622. drag
  623. multiple
  624. >
  625. <img
  626. v-if="meetingApply.photoUrl"
  627. :src="'./api/file/pub/' + meetingApply.photoUrl"
  628. class="avatar"
  629. width="120"
  630. height="168"
  631. />
  632. <div v-else>
  633. <i class="el-icon-upload"></i>
  634. <div class="el-upload__text">拖拽/<em>点击上传</em></div>
  635. </div>
  636. <div class="el-upload__tip" slot="tip">
  637. 注:请上传个人一寸证件照片,图片大小不能超过2M,且只允许上传格式为PNG、JPEG、JPG。
  638. </div>
  639. </el-upload>
  640. </div>
  641. </el-form-item>
  642. </div>
  643. <div class="content-item">
  644. <div class="category-title">单位信息</div>
  645. <el-form-item label="所在单位" prop="unitName">
  646. <el-input
  647. v-model="meetingApply.unitName"
  648. placeholder="请输入所在单位"
  649. ></el-input>
  650. </el-form-item>
  651. <el-form-item label="英文单位">
  652. <el-input
  653. v-model="meetingApply.unitNameEn"
  654. placeholder="请输入英文单位"
  655. ></el-input>
  656. </el-form-item>
  657. <el-form-item label="单位类型" prop="meetingUnitTypeDict">
  658. <el-select
  659. v-model="meetingApply.meetingUnitTypeDict"
  660. placeholder="请选择"
  661. style="width: 100%"
  662. >
  663. <el-option
  664. :label="item.label"
  665. :value="item.value"
  666. v-for="item in meetingUnitTypeDicts"
  667. ></el-option>
  668. </el-select>
  669. </el-form-item>
  670. <el-form-item label="职务" prop="positionName">
  671. <el-input
  672. v-model="meetingApply.positionName"
  673. placeholder="请输入职务"
  674. ></el-input>
  675. </el-form-item>
  676. <el-form-item label="英文职务">
  677. <el-input
  678. v-model="meetingApply.positionNameEn"
  679. placeholder="请输入英文"
  680. ></el-input>
  681. </el-form-item>
  682. </div>
  683. <div class="content-item">
  684. <div class="category-title">
  685. 联系人信息<span>(默认本人为联系人,如有需要请手动修改)</span>
  686. </div>
  687. <el-form-item label="联系人" prop="contactPersonName">
  688. <el-input
  689. v-model="meetingApply.contactPersonName"
  690. placeholder="请输入联系人"
  691. ></el-input>
  692. </el-form-item>
  693. <el-form-item label="联系人手机" prop="contactCellphone">
  694. <GlobalRoaming
  695. :size="{ width: '398px' }"
  696. @getAreaCode="getContactMobileAreacodeDictEn"
  697. v-model="meetingApply.contactCellphone"
  698. :language="lang"
  699. :code="meetingApply.contactMobileAreacodeDictEn"
  700. :mobile="meetingApply.contactCellphone"
  701. ></GlobalRoaming>
  702. </el-form-item>
  703. <el-form-item label="邮箱" prop="contactEmail">
  704. <el-input
  705. v-model="meetingApply.contactEmail"
  706. placeholder="请输入邮箱"
  707. ></el-input>
  708. </el-form-item>
  709. <el-form-item
  710. v-if="
  711. gridData.length && intentions.isShowZhOnsiteIntention == 'Yes'
  712. "
  713. >
  714. <p style="font-size: 16px">
  715. 此次大会包括多场会议活动,请勾选您希望参加的场次(可多选)。
  716. </p>
  717. <el-table
  718. :data="gridData"
  719. :border="false"
  720. @selection-change="checkRow"
  721. @row-click="setSelect"
  722. size="small"
  723. ref="multipleTable"
  724. class="active-grid"
  725. >
  726. <el-table-column type="selection" width="50"></el-table-column>
  727. <el-table-column property="activityName" label="全选">
  728. <template slot-scope="scope">
  729. <p style="font-weight: bold">
  730. {{ momentDate(scope.row.activityStartTime) }} ~
  731. {{ momentDate(scope.row.activityEndTime) }}
  732. </p>
  733. <p>{{ scope.row.activityName }}</p>
  734. </template>
  735. </el-table-column>
  736. </el-table>
  737. </el-form-item>
  738. <el-form-item>
  739. <el-button
  740. type="primary"
  741. @click="submitForm('meetingApplyzh')"
  742. style="width: 100%"
  743. >提交</el-button
  744. >
  745. </el-form-item>
  746. </div>
  747. </el-form>
  748. </div>
  749. <el-dialog :show-close="false" :visible.sync="dialogVisible" width="600px">
  750. <div class="category-body submit-success">
  751. <p>
  752. <img
  753. src="@/assets/img/conference/submit-success.png"
  754. alt=""
  755. width="200"
  756. />
  757. </p>
  758. <p style="font-size: 24px; color: #666; margin-bottom: 20px">
  759. {{ lang == "en" ? "Registered!" : "报名成功!" }}
  760. </p>
  761. <p>
  762. <el-button
  763. style="background: #2c558a; color: #fff"
  764. @click="toView('ConferenceDetail', $route.query.key)"
  765. >{{ lang == "en" ? "Back" : "返回" }}({{ num }}s)</el-button
  766. >
  767. <el-button @click="ContinueRegister">{{
  768. lang == "en" ? "Continue" : "继续报名"
  769. }}</el-button>
  770. </p>
  771. </div>
  772. </el-dialog>
  773. <div class="apply-history" v-if="applyHistoryInfo.length">
  774. <span style="font-size: 14px; margin-right: 20px">{{
  775. $i18n.locale == "en" ? "Registration History" : "报名历史"
  776. }}</span>
  777. <el-select
  778. v-model="applyHistorySelected"
  779. @change="applyHistoryChanged"
  780. :placeholder="$i18n.locale == 'en' ? 'Please Select' : '请选择'"
  781. >
  782. <el-option
  783. v-for="(item, i) in applyHistoryInfo"
  784. :key="i"
  785. :label="$i18n.locale == 'en' ? item.nameEn : item.name"
  786. :value="i"
  787. >
  788. <span style="float: left">{{
  789. $i18n.locale == "en" ? item.nameEn : item.name
  790. }}</span>
  791. <span style="float: right; color: #8492a6; font-size: 13px">{{
  792. $i18n.locale == "en" ? item.unitNameEn : item.unitName
  793. }}</span>
  794. </el-option>
  795. </el-select>
  796. </div>
  797. <loginTopEn ref="loginTopEn"></loginTopEn>
  798. </div>
  799. </template>
  800. <script>
  801. import { getDicts } from "@/api/dict";
  802. import {
  803. saveOrUpdate,
  804. get,
  805. getApproverId,
  806. getMeetingApplyActivityInfos,
  807. getApplyHistoryInfosByLoginAccount,
  808. getApplyField,
  809. } from "@/api/meeting/meetingApply";
  810. import { getConfrenceDetail } from "@/api/meeting/meetingOutInfo";
  811. import Base from "@/views/base/Base";
  812. import UpLoad from "@/views/conferenceServices/UpLoad";
  813. import UpLoadFile from "@/views/conferenceServices/UpLoadFile";
  814. import GlobalRoaming from "@/components/GlobalRoaming";
  815. import { getToken } from "@/utils/auth";
  816. import moment from "moment-timezone";
  817. import { addIntegral, addGrowth } from "@/utils/toCompleteTask";
  818. import loginTopEn from './loginTopEn'
  819. export default {
  820. name: "MeetingApplyForm",
  821. extends: Base,
  822. components: { UpLoad, UpLoadFile, GlobalRoaming, loginTopEn },
  823. data() {
  824. var checkInvitationCode = (rule, value, callback) => {
  825. if (!value) {
  826. let errorTxt =
  827. this.lang == "en" ? "Please enter Invitation Code." : "请输入邀请码";
  828. callback(new Error(errorTxt));
  829. } else if (!this.invitationCodeArr.includes(value)) {
  830. let errorTxt =
  831. this.lang == "en"
  832. ? "Please enter the correct Invitation Code. If not, please enter 000000."
  833. : "请输入正确的邀请码。如果没有,请输入000000";
  834. callback(new Error(errorTxt));
  835. } else {
  836. callback();
  837. }
  838. };
  839. var checkTel = (rule, value, callback) => {
  840. if (!value) {
  841. let errorTxt =
  842. this.lang == "en" ? "Please enter Cellphone Number." : "请输入手机号";
  843. callback(new Error(errorTxt));
  844. } else if (this.meetingApply.mobileAreaCodeDictEn == "0086") {
  845. let reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
  846. if (!reg.test(value)) {
  847. let errorTxt =
  848. this.lang == "en"
  849. ? "The Cellphone Number is not correct."
  850. : "请输入正确的11位手机号";
  851. callback(new Error(errorTxt));
  852. } else {
  853. callback();
  854. }
  855. } else {
  856. callback();
  857. }
  858. };
  859. var checkContactCellphone = (rule, value, callback) => {
  860. if (!value) {
  861. let errorTxt =
  862. this.lang == "en"
  863. ? "Please enter Cellphone Number."
  864. : "请输入联系人手机号";
  865. return callback(new Error(errorTxt));
  866. } else if (this.meetingApply.contactMobileAreacodeDictEn == "0086") {
  867. let reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
  868. if (!reg.test(value)) {
  869. let errorTxt =
  870. this.lang == "en"
  871. ? "The Cellphone Number is not correct."
  872. : "请输入正确的11位手机号";
  873. callback(new Error(errorTxt));
  874. } else {
  875. callback();
  876. }
  877. } else {
  878. callback();
  879. }
  880. };
  881. var checkEmail = (rule, value, callback) => {
  882. let reg = /^\w+.*\w+@[a-zA-Z0-9]+.*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/gm;
  883. if (!value) {
  884. let errorTxt =
  885. this.lang == "en" ? "Please enter E-mail." : "请输入邮箱";
  886. return callback(new Error(errorTxt));
  887. } else if (!reg.test(value)) {
  888. let errorTxt =
  889. this.lang == "en"
  890. ? "Please enter the correct E-mail address."
  891. : "邮箱格式不正确";
  892. callback(new Error(errorTxt));
  893. } else {
  894. callback();
  895. }
  896. };
  897. var checkContactEmail = (rule, value, callback) => {
  898. let reg = /^\w+.*\w+@[a-zA-Z0-9]+.*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/gm;
  899. if (!value) {
  900. let errorTxt =
  901. this.lang == "en"
  902. ? "Please enter Contact E-mail."
  903. : "请输入联系人邮箱";
  904. return callback(new Error(errorTxt));
  905. } else if (!reg.test(value)) {
  906. let errorTxt =
  907. this.lang == "en"
  908. ? "Please enter the correct E-mail address."
  909. : "邮箱格式不正确";
  910. callback(new Error(errorTxt));
  911. } else {
  912. callback();
  913. }
  914. };
  915. return {
  916. applyHistorySelected: "", //被选择的报名历史
  917. applyHistoryInfo: [], //报名历史信息
  918. dialogVisible: false,
  919. num: 5,
  920. timer: "",
  921. baseInfo: {},
  922. infoSwitch: true,
  923. // imageUrl: "",
  924. fileUrl: "",
  925. lang: "",
  926. pinyin: "",
  927. //流程改造4
  928. // processKey: "MEETING_APPROVE",
  929. Authorization: {},
  930. // meetingenableFlow: null,
  931. approverId: "",
  932. genderDicts: [],
  933. meetingUnitTypeDicts: [],
  934. meetingUnitTypeDictEns: [],
  935. unitCountryDicts: [],
  936. unitCountryDictEns: [],
  937. languageDictEns: [],
  938. invitationCodePrefix: [],
  939. invitationCodeArr: ["000000"],
  940. gridData: [],
  941. checkedIds: [],
  942. intentions: {},
  943. meetingApply: {
  944. // id: this.$route.params.key,
  945. meetingYearplanTypeDict: "main_meeting",
  946. photoUrl: "",
  947. meetingId: this.$route.query.key,
  948. // meetingId: window.localStorage.getItem('conferenceId'),
  949. invitationCode: "",
  950. name: "",
  951. nameEn: "",
  952. givenName: "",
  953. middleName: "",
  954. surname: "",
  955. genderDict: "",
  956. genderDictEn: "",
  957. email: "",
  958. mobileAreaCodeDictEn: "",
  959. tel: "",
  960. unitName: "",
  961. unitNameEn: "",
  962. meetingUnitTypeDict: "",
  963. meetingUnitTypeDictEn: "",
  964. positionName: "",
  965. positionNameEn: "",
  966. unitCountryDict:
  967. window.localStorage.getItem("locale") == "zh" ? "china" : "",
  968. unitCountryDictEn: "",
  969. languageDictEn: "",
  970. contactPersonName: "",
  971. contactMobileAreacodeDictEn: "",
  972. contactCellphone: "",
  973. contactEmail: "",
  974. isNeedLetter: "No",
  975. applyWay: window.localStorage.getItem("locale"), //报名方式
  976. passportNumber: "",
  977. visitPlace: "",
  978. embassyName: "",
  979. visitTypeEn: "",
  980. isAboveMinisterial: "",
  981. numberOfEntries: "",
  982. firstEntryDate: "",
  983. longestStayDays: "",
  984. birthDate: "",
  985. nationalityDict: "",
  986. passportValidityDate: "",
  987. passportFristPageUrl: "",
  988. previousPositions: "",
  989. educationBackground: "",
  990. flightInformation: "",
  991. intineraryInChina: "",
  992. auditStatusDict: "",
  993. },
  994. rulesEnNext: {
  995. visitPlace: [
  996. {
  997. required: true,
  998. message: "Please enter Places to Visit.",
  999. trigger: "blur",
  1000. },
  1001. ],
  1002. embassyName: [
  1003. {
  1004. required: true,
  1005. message: "Please enter Embassy/Consulate to apply visa.",
  1006. trigger: "blur",
  1007. },
  1008. ],
  1009. visitTypeEn: [
  1010. {
  1011. required: true,
  1012. message: "Please specify Purpose of Visit.",
  1013. trigger: "blur",
  1014. },
  1015. ],
  1016. isAboveMinisterial: [
  1017. {
  1018. required: true,
  1019. message: "Please select Vice Ministerial level or above.",
  1020. trigger: "change",
  1021. },
  1022. ],
  1023. numberOfEntries: [
  1024. {
  1025. required: true,
  1026. message: "Please enter Number of entries.",
  1027. trigger: "blur",
  1028. },
  1029. ],
  1030. firstEntryDate: [
  1031. {
  1032. required: true,
  1033. message: "Please select Date of First Entry.",
  1034. trigger: "change",
  1035. },
  1036. ],
  1037. longestStayDays: [
  1038. {
  1039. required: true,
  1040. message: "Please enter Longest Stay (days).",
  1041. trigger: "change",
  1042. },
  1043. ],
  1044. // givenName: [
  1045. // { required: true, message: 'Please enter Given Name.', trigger: 'blur' },
  1046. // ],
  1047. // surname: [
  1048. // { required: true, message: 'Please enter Surname.', trigger: 'blur' },
  1049. // ],
  1050. birthDate: [
  1051. {
  1052. required: true,
  1053. message: "Please enter Date of Birth.",
  1054. trigger: "change",
  1055. },
  1056. ],
  1057. genderDictEn: [
  1058. {
  1059. required: true,
  1060. message: "Please select Gender.",
  1061. trigger: "change",
  1062. },
  1063. ],
  1064. nationalityDict: [
  1065. {
  1066. required: true,
  1067. message: "Please select Nationality.",
  1068. trigger: "change",
  1069. },
  1070. ],
  1071. // passportNumber: [
  1072. // { required: true, message: 'Please enter Passport Number.', trigger: 'change' },
  1073. // ],
  1074. passportValidityDate: [
  1075. {
  1076. required: true,
  1077. message: "Please select Passport Validity Date.",
  1078. trigger: "change",
  1079. },
  1080. ],
  1081. // unitNameEn: [
  1082. // { required: true, message: 'Please enter Affiliation.', trigger: 'blur' }
  1083. // ],
  1084. // positionName: [
  1085. // { required: true, message: 'Please enter Possition.', trigger: 'blur' }
  1086. // ],
  1087. // email: [
  1088. // { required: true, validator: checkEmail, trigger: 'blur'}
  1089. // ],
  1090. flightInformation: [
  1091. {
  1092. required: true,
  1093. message: "Please enter Flight Information.",
  1094. trigger: "blur",
  1095. },
  1096. ],
  1097. intineraryInChina: [
  1098. {
  1099. required: true,
  1100. message: "Please enter Intinerary in China.",
  1101. trigger: "blur",
  1102. },
  1103. ],
  1104. },
  1105. rulesEn: {
  1106. invitationCode: [
  1107. { required: true, validator: checkInvitationCode, trigger: "blur" },
  1108. // { required: true, message: 'Please enter Invitation Code. If not, please enter 000000.', trigger: 'blur' },
  1109. // { min: 6, max: 6, message: 'Please enter Invitation Code. If not, please enter 000000.', trigger: 'blur' }
  1110. ],
  1111. givenName: [
  1112. {
  1113. required: true,
  1114. message: "Please enter Given Name.",
  1115. trigger: "blur",
  1116. },
  1117. ],
  1118. surname: [
  1119. { required: true, message: "Please enter Surname.", trigger: "blur" },
  1120. ],
  1121. genderDictEn: [
  1122. {
  1123. required: true,
  1124. message: "Please select Gender.",
  1125. trigger: "change",
  1126. },
  1127. ],
  1128. email: [{ required: true, validator: checkEmail, trigger: "blur" }],
  1129. tel: [{ required: true, validator: checkTel, trigger: "blur" }],
  1130. unitNameEn: [
  1131. {
  1132. required: true,
  1133. message: "Please select company/Organization.",
  1134. trigger: "blur",
  1135. },
  1136. ],
  1137. meetingUnitTypeDictEn: [
  1138. {
  1139. required: true,
  1140. message: "Please select Company/Organization Type.",
  1141. trigger: "change",
  1142. },
  1143. ],
  1144. positionNameEn: [
  1145. { required: true, message: "Please enter Title.", trigger: "blur" },
  1146. ],
  1147. unitCountryDictEn: [
  1148. {
  1149. required: true,
  1150. message: "Please select Country/Region.",
  1151. trigger: "change",
  1152. },
  1153. ],
  1154. languageDictEn: [
  1155. {
  1156. required: true,
  1157. message: "Please select Language.",
  1158. trigger: "change",
  1159. },
  1160. ],
  1161. passportNumber: [
  1162. {
  1163. required: true,
  1164. message: "Please enter Passport Number.",
  1165. trigger: "blur",
  1166. },
  1167. ],
  1168. contactPersonName: [
  1169. {
  1170. required: true,
  1171. message: "Please enter Contact Person.",
  1172. trigger: "blur",
  1173. },
  1174. ],
  1175. contactCellphone: [
  1176. { required: true, validator: checkContactCellphone, trigger: "blur" },
  1177. ],
  1178. contactEmail: [
  1179. { required: true, validator: checkContactEmail, trigger: "blur" },
  1180. ],
  1181. isNeedLetter: [
  1182. {
  1183. required: true,
  1184. message: "Need to apply an invitation letter",
  1185. trigger: "change",
  1186. },
  1187. ],
  1188. },
  1189. rulesZh: {
  1190. invitationCode: [
  1191. { required: true, validator: checkInvitationCode, trigger: "blur" },
  1192. // { required: true, message: '请输入6位会议邀请码,如果没有请输入00000', trigger: 'blur' },
  1193. // { min: 6, max: 6, message: '请输入6位会议邀请码,如果没有请输入00000', trigger: 'blur' }
  1194. ],
  1195. name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
  1196. genderDict: [
  1197. { required: true, message: "请选择性别", trigger: "change" },
  1198. ],
  1199. email: [{ required: true, validator: checkEmail, trigger: "blur" }],
  1200. tel: [{ required: true, validator: checkTel, trigger: "blur" }],
  1201. unitCountryDict: [
  1202. { required: true, message: "请选择国家", trigger: "change" },
  1203. ],
  1204. unitName: [
  1205. { required: true, message: "请输入所在单位", trigger: "blur" },
  1206. ],
  1207. meetingUnitTypeDict: [
  1208. { required: true, message: "请选择单位类型", trigger: "change" },
  1209. ],
  1210. positionName: [
  1211. { required: true, message: "请输入职务", trigger: "blur" },
  1212. ],
  1213. contactPersonName: [
  1214. { required: true, message: "请输入联系人", trigger: "blur" },
  1215. ],
  1216. contactCellphone: [
  1217. { required: true, validator: checkContactCellphone, trigger: "blur" },
  1218. ],
  1219. contactEmail: [
  1220. { required: true, validator: checkContactEmail, trigger: "blur" },
  1221. ],
  1222. },
  1223. };
  1224. },
  1225. props: {},
  1226. watch: {
  1227. "$i18n.locale"(val) {
  1228. this.lang = val;
  1229. this.meetingApply.applyWay = val;
  1230. this.getApplyHistoryInfos();
  1231. },
  1232. dialogVisible() {
  1233. if (this.dialogVisible == true) {
  1234. this.loginTipsChange();
  1235. }
  1236. },
  1237. "meetingApply.name"(val) {
  1238. this.meetingApply.contactPersonName = val;
  1239. setTimeout(() => {
  1240. let p = document.getElementById("pinyin").innerText;
  1241. this.meetingApply.nameEn = p;
  1242. });
  1243. },
  1244. "meetingApply.email"(val) {
  1245. this.meetingApply.contactEmail = val;
  1246. },
  1247. "meetingApply.tel"(val) {
  1248. this.meetingApply.contactCellphone = val;
  1249. },
  1250. "meetingApply.givenName"(val) {
  1251. this.meetingApply.contactPersonName = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1252. },
  1253. "meetingApply.middleName"(val) {
  1254. this.meetingApply.contactPersonName = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1255. },
  1256. "meetingApply.surname"(val) {
  1257. this.meetingApply.contactPersonName = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1258. },
  1259. },
  1260. created() {
  1261. this.lang = this.$i18n.locale;
  1262. this.meetingApply.applyWay = this.lang;
  1263. },
  1264. mounted() {
  1265. //localStorage.setItem('aaa','false')
  1266. this.$i18n.locale='en'
  1267. localStorage.setItem('locale', 'en');
  1268. var url = window.location.href;
  1269. var temp1 = url.split('=')[1].split('&')[0];
  1270. let rpath = { path: 'NewMeetingApplyFormEn', query: { key: temp1}};
  1271. sessionStorage.setItem('pathReminder', JSON.stringify(rpath));
  1272. this.$refs.loginTopEn.activeChange('NewMeetingApplyFormEn',temp1);
  1273. this.initData();
  1274. if (this.$route.query) {
  1275. localStorage.setItem("conferenceId", this.$route.query.key);
  1276. }else{
  1277. localStorage.setItem("conferenceId", temp1);
  1278. }
  1279. this.initData1()
  1280. this.getIntentions();
  1281. this.getApplyHistoryInfos();
  1282. this.getApplyField();
  1283. },
  1284. methods: {
  1285. initData1() {
  1286. this.user = JSON.parse(window.localStorage.getItem("user"));
  1287. },
  1288. getApplyField() {
  1289. getApplyField("1427433328149434368").then((result) => {
  1290. console.log("result::::", result);
  1291. });
  1292. },
  1293. applyHistoryChanged(i) {
  1294. Object.keys(this.applyHistoryInfo[i]).forEach((key) => {
  1295. this.meetingApply[key] = this.applyHistoryInfo[i][key];
  1296. });
  1297. },
  1298. //获取报名历史信息
  1299. getApplyHistoryInfos() {
  1300. this.applyHistorySelected = "";
  1301. getApplyHistoryInfosByLoginAccount(this.$i18n.locale).then((res) => {
  1302. this.applyHistoryInfo = res.data.applyHistoryInfos;
  1303. // console.log('ApplyHistoryInfos',res)
  1304. });
  1305. },
  1306. getIntentions() {
  1307. this.intentions={
  1308. isShowEnOnlineIntention: "Yes",
  1309. isShowEnOnsiteIntention: "Yes",
  1310. isShowZhOnlineIntention: "Yes",
  1311. isShowZhOnsiteIntention: "Yes",
  1312. }
  1313. },
  1314. momentDate(date) {
  1315. if (this.$i18n.locale == "zh") {
  1316. moment.locale("zh-cn");
  1317. return moment(date).format("YYYY MM DD, H:mm");
  1318. } else {
  1319. moment.locale("en");
  1320. return moment(date).format("lll");
  1321. }
  1322. },
  1323. setSelect(row) {
  1324. this.$refs.multipleTable.toggleRowSelection(row);
  1325. },
  1326. setSelectEn(row) {
  1327. this.$refs.multipleTableEn.toggleRowSelection(row);
  1328. },
  1329. checkRow(checkedData) {
  1330. this.checkedIds = [];
  1331. this.newChecked = [];
  1332. const date = []
  1333. checkedData.forEach((item) => {
  1334. date.find(i=>{
  1335. if(i===this.momentDate(item.activityStartTime)){
  1336. let msgTxt = this.$i18n.locale=='en'? 'Kind Reminder: participants can only register for one parallel session. Hope you enjoy the conference.': '温馨提示:同一时段平行召开的会议仅限选择一场参加,祝您参会愉快!';
  1337. this.$message({
  1338. message: msgTxt,
  1339. type:'error'
  1340. })
  1341. }
  1342. })
  1343. date.push(this.momentDate(item.activityStartTime))
  1344. this.checkedIds.push(item.id)
  1345. this.newChecked.push(item.activityStartTime)
  1346. });
  1347. },
  1348. ContinueRegister() {
  1349. clearInterval(this.timer);
  1350. this.dialogVisible = false;
  1351. },
  1352. loginTipsChange() {
  1353. const that = this;
  1354. this.num = 5;
  1355. this.timer = setInterval(function () {
  1356. if (that.num > 0) {
  1357. that.num--;
  1358. } else {
  1359. clearInterval(that.timer);
  1360. that.dialogVisible = false;
  1361. that.toView("ConferenceDetail", that.$route.query.key);
  1362. }
  1363. }, 1000);
  1364. },
  1365. toView(router, json) {
  1366. this.$router.push({ path: router, query: { key: json } });
  1367. },
  1368. formatDate(t) {
  1369. if (!t) {
  1370. return "";
  1371. } else {
  1372. var original = new Date(t);
  1373. var year = original.getFullYear();
  1374. var month = original.getMonth() + 1;
  1375. var date = original.getDate();
  1376. return year + "-" + month + "-" + date;
  1377. }
  1378. },
  1379. getEducationBackground(file) {
  1380. this.meetingApply.educationBackground = file.path;
  1381. },
  1382. getPreviousPositions(file) {
  1383. this.meetingApply.previousPositions = file.path;
  1384. },
  1385. getPassportFristPageUrl(file) {
  1386. this.meetingApply.passportFristPageUrl = file.path;
  1387. },
  1388. getphotoUrl(file) {
  1389. this.meetingApply.photoUrl = file.path;
  1390. },
  1391. submitFormEnNext(formName) {
  1392. this.$refs[formName].validate((valid) => {
  1393. if (!valid) {
  1394. this.$message.error("Please fill in the complete information");
  1395. return false;
  1396. }
  1397. this.$refs["meetingApplyen"].validate((validNext) => {
  1398. if (!validNext) {
  1399. this.$message.error("Please fill in the complete information");
  1400. return false;
  1401. }
  1402. // if(!this.meetingApply.passportFristPageUrl){
  1403. // this.$message.error('Please upload a copy of the front page of your passport');
  1404. // return false;
  1405. // }
  1406. // if(!this.meetingApply.previousPositions){
  1407. // this.$message.error('Please upload your experience');
  1408. // return false;
  1409. // }
  1410. // if(!this.meetingApply.educationBackground){
  1411. // this.$message.error('Please upload education experience');
  1412. // return false;
  1413. // }
  1414. // if(!this.meetingApply.photoUrl){
  1415. // this.$message.error('Please upload your picture');
  1416. // return false;
  1417. // }
  1418. this.meetingApply.nameEn = `${this.meetingApply.givenName}${this.meetingApply.middleName}${this.meetingApply.surname}`;
  1419. this.save();
  1420. });
  1421. });
  1422. },
  1423. submitFormEn(formName) {
  1424. this.$refs[formName].validate((valid) => {
  1425. if (!valid) {
  1426. this.$message.error("Please fill in the complete information");
  1427. return false;
  1428. }
  1429. // if(!this.meetingApply.photoUrl){
  1430. // this.$message.error('Please upload Photo');
  1431. // return false;
  1432. // }
  1433. this.meetingApply.nameEn = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1434. this.save();
  1435. });
  1436. },
  1437. //提交
  1438. submitForm(formName) {
  1439. this.$refs[formName].validate((valid) => {
  1440. if (!valid) {
  1441. this.$message.error("请填写完整信息");
  1442. return false;
  1443. }
  1444. // if(!this.meetingApply.photoUrl){
  1445. // this.$message.error('请上传头像');
  1446. // return false;
  1447. // }
  1448. this.save();
  1449. });
  1450. },
  1451. //获取区号
  1452. getGobileAreaCodeDictEn(code) {
  1453. this.meetingApply.mobileAreaCodeDictEn = code;
  1454. this.meetingApply.contactMobileAreacodeDictEn = code;
  1455. },
  1456. getContactMobileAreacodeDictEn(code) {
  1457. this.meetingApply.contactMobileAreacodeDictEn = code;
  1458. },
  1459. handleAvatarSuccess(res, file) {
  1460. // console.log('上传成功',res)
  1461. // console.log('上传成功',file)
  1462. this.meetingApply.photoUrl = res.data.path;
  1463. // this.imageUrl = URL.createObjectURL(file.raw);
  1464. },
  1465. beforeAvatarUpload(file) {
  1466. this.Authorization.Authorization = "Bearer " + getToken();
  1467. this.loading = true;
  1468. const isJPG = file.type === "image/jpeg" || file.type === "image/jpg";
  1469. const isPNG = file.type === "image/png";
  1470. const isLt2M = file.size / 1024 / 1024 < 2;
  1471. if (!isJPG && !isPNG) {
  1472. let erroerTxt =
  1473. this.lang == "en"
  1474. ? "Upload images can only be in JPG/JPEG or PNG format!"
  1475. : "上传图片只能是 JPG/JPEG 或者 PNG 格式!";
  1476. this.$message.error(erroerTxt);
  1477. }
  1478. if (!isLt2M) {
  1479. let erroerTxt =
  1480. this.lang == "en"
  1481. ? "The size of the uploaded image cannot exceed 2MB!"
  1482. : "上传图片大小不能超过 2MB!";
  1483. this.$message.error(erroerTxt);
  1484. }
  1485. return (isJPG || isPNG) && isLt2M;
  1486. },
  1487. save: function () {
  1488. var arr1=this.newChecked
  1489. var arr2=arr1.sort()
  1490. for(var i=0;i<arr2.length-1;i++){
  1491. if(arr2[i]==arr2[i+1]){
  1492. let msgTxt = this.$i18n.locale=='en'? 'Kind Reminder: participants can only register for one parallel session. Hope you enjoy the conference.': '温馨提示:同一时段平行召开的会议仅限选择一场参加,祝您参会愉快!';
  1493. this.$message.error(msgTxt)
  1494. return false
  1495. }else{
  1496. console.log('hello');
  1497. }
  1498. }
  1499. //流程改造6
  1500. if (this.meetingApply.auditStatusDict === "") {
  1501. this.meetingApply.auditStatusDict = "4";
  1502. } else {
  1503. this.meetingApply.auditStatusDict = this.meetingApply.auditStatusDict;
  1504. }
  1505. this.submitHandler((token) => {
  1506. //流程改造7
  1507. getApproverId(this.meetingApply.invitationCode).then((result) => {
  1508. result = result.data;
  1509. var str = "";
  1510. for (var i = 0; i < result.length; i++) {
  1511. str += result[i].userId + ",";
  1512. }
  1513. if (str.length > 0) {
  1514. str = str.substr(0, str.length - 1);
  1515. }
  1516. this.approverId = str;
  1517. saveOrUpdate(
  1518. JSON.stringify(this.meetingApply),
  1519. this.approverId,
  1520. this.taskComment,
  1521. token,
  1522. this.checkedIds.join(",")
  1523. )
  1524. .then((result) => {
  1525. console.log("result", result);
  1526. if (result.status == "200") {
  1527. if (this.user.umsUser.userUsertypeDict !== "2") {
  1528. addIntegral("meeting_registration_successful", "10");
  1529. addGrowth("meeting_registration_successful");
  1530. }
  1531. if (result.data.isRepeat) {
  1532. let errorMsg =
  1533. this.$i18n.locale == "en"
  1534. ? "The guest has registered, please do not fill in again."
  1535. : "该嘉宾已报名,请勿重复填写!";
  1536. this.$message.error(errorMsg);
  1537. this.resetToken();
  1538. } else {
  1539. this.dialogVisible = true;
  1540. this.resetToken();
  1541. }
  1542. }
  1543. this.backListView(this.meetingApply.id == null);
  1544. })
  1545. .catch((error) => {
  1546. this.resetToken();
  1547. });
  1548. });
  1549. });
  1550. },
  1551. initData: function () {
  1552. // console.log('this.$route.params.key',this.$route.params.key)
  1553. if (this.$route.params.key) {
  1554. this.meetingApply = this.$route.params.key;
  1555. }
  1556. getDicts(
  1557. "gender_dict,unit_country_dict,meeting_unit_type_dict, meeting_unit_type_dict_en, unit_country_dict_en, language_dict_en, geidco_dept_dict"
  1558. )
  1559. .then((result) => {
  1560. var data = result.data;
  1561. if (data) {
  1562. this.genderDicts = result.data[0] || [];
  1563. this.unitCountryDicts = result.data[1] || [];
  1564. this.meetingUnitTypeDicts = result.data[2] || [];
  1565. this.meetingUnitTypeDictEns = result.data[3] || [];
  1566. this.unitCountryDictEns = result.data[4] || [];
  1567. this.languageDictEns = result.data[5] || [];
  1568. this.invitationCodePrefix = result.data[6] || [];
  1569. if (this.unitCountryDictEns.length) {
  1570. this.unitCountryDictEns.sort(function (a, b) {
  1571. return a.value.charCodeAt() - b.value.charCodeAt();
  1572. });
  1573. }
  1574. }
  1575. })
  1576. .then((res) => {
  1577. let meetingId;
  1578. if (this.$route.params.key) {
  1579. meetingId = this.$route.params.key.meetingId;
  1580. } else {
  1581. meetingId = this.$route.query.key;
  1582. }
  1583. getConfrenceDetail(meetingId).then((res) => {
  1584. this.baseInfo = res.data.basicInfo;
  1585. // console.log('会议数据', res)
  1586. // 邀请码集合
  1587. this.invitationCodePrefix.forEach((item) => {
  1588. // console.log('item', item)
  1589. this.invitationCodeArr.push(
  1590. `${item.value}${res.data.basicInfo.meetingRand}`
  1591. );
  1592. });
  1593. // console.log('邀请码集合', this.invitationCodeArr)
  1594. });
  1595. //参会意向
  1596. getMeetingApplyActivityInfos(localStorage.getItem("conferenceId"))
  1597. .then((_res) => {
  1598. console.log("_res", _res);
  1599. this.gridData = _res.data.allMeetingActivitys || [];
  1600. })
  1601. .catch((err) => {
  1602. this.gridData = [];
  1603. });
  1604. });
  1605. },
  1606. },
  1607. };
  1608. </script>
  1609. <style scoped>
  1610. .container-box {
  1611. width: 1200px;
  1612. margin: 10px auto;
  1613. position: relative;
  1614. }
  1615. .bread-crumb {
  1616. height: 40px;
  1617. background: #fff;
  1618. margin: 10px 0;
  1619. }
  1620. .content-box-en {
  1621. width: 100%;
  1622. box-sizing: border-box;
  1623. padding: 20px 150px;
  1624. background: #fff;
  1625. }
  1626. .content-box-en .title-custom {
  1627. color: #909399;
  1628. }
  1629. /* .content-box-en .border-custom{
  1630. border: 1px solid #DCDFE6;
  1631. border-radius: 4px;
  1632. padding: 0 20px;
  1633. box-sizing: border-box;
  1634. } */
  1635. .tip {
  1636. font-size: 12px;
  1637. color: #888;
  1638. }
  1639. .content-box-zh {
  1640. width: 100%;
  1641. box-sizing: border-box;
  1642. padding: 20px 150px 0 150px;
  1643. background: #fff;
  1644. }
  1645. .content-box-zh .content-item {
  1646. padding-bottom: 20px;
  1647. }
  1648. .category-title {
  1649. height: 20px;
  1650. line-height: 20px;
  1651. font-size: 18px;
  1652. font-weight: bold;
  1653. border-left: 4px solid #2c558a;
  1654. padding-left: 10px;
  1655. margin: 30px 0;
  1656. }
  1657. .category-title span {
  1658. font-size: 12px;
  1659. font-weight: bold;
  1660. color: #666;
  1661. }
  1662. /deep/ .content-box-en .el-input__inner,
  1663. /deep/ .content-box-zh .el-input__inner {
  1664. border-top: none;
  1665. border-left: none;
  1666. border-right: none;
  1667. border-radius: 0;
  1668. }
  1669. /deep/ .el-input-group__prepend {
  1670. border-top: none;
  1671. border-left: none;
  1672. background: #fff;
  1673. border-radius: 0;
  1674. }
  1675. /deep/ .el-select {
  1676. width: 150px;
  1677. }
  1678. /deep/ .area-code .el-input-group__prepend {
  1679. width: 150px;
  1680. border: none;
  1681. }
  1682. .submit-success {
  1683. text-align: center;
  1684. font-size: 20px;
  1685. color: #999;
  1686. }
  1687. .submit-success p {
  1688. margin: 0;
  1689. }
  1690. .submit-success .el-button {
  1691. width: 150px;
  1692. font-size: 20px;
  1693. margin: 10px;
  1694. }
  1695. .down-load a {
  1696. font-size: 28px;
  1697. color: #49a2f2;
  1698. text-decoration: none;
  1699. }
  1700. .down-load a:hover {
  1701. color: #de551a;
  1702. }
  1703. /deep/ .el-dialog {
  1704. display: flex;
  1705. flex-direction: column;
  1706. margin: 0 !important;
  1707. position: absolute;
  1708. top: 50%;
  1709. left: 50%;
  1710. transform: translate(-50%, -50%);
  1711. max-height: calc(100% - 30px);
  1712. max-width: calc(100% - 30px);
  1713. }
  1714. /deep/ .el-dialog .el-dialog__body {
  1715. flex: 1;
  1716. overflow: auto;
  1717. }
  1718. .photo-uploader-container /deep/ .el-upload-dragger {
  1719. width: 140px;
  1720. height: 188px;
  1721. padding: 10px;
  1722. }
  1723. /deep/ .el-upload__tip {
  1724. text-indent: 0;
  1725. color: #de571a;
  1726. margin-top: 0;
  1727. }
  1728. .apply-history {
  1729. position: absolute;
  1730. top: 60px;
  1731. right: 20px;
  1732. }
  1733. .apply-history .el-select {
  1734. width: 300px;
  1735. }
  1736. </style>