MeetingApplyForm.vue 58 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731
  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="Please enter Invitation Code,If not, please enter 000000."
  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="请输入邀请码,如果没有,请输入000000。"
  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">
  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. </div>
  798. </template>
  799. <script>
  800. import { getDicts } from "@/api/dict";
  801. import {
  802. saveOrUpdate,
  803. get,
  804. getApproverId,
  805. getMeetingApplyActivityInfos,
  806. getApplyHistoryInfosByLoginAccount,
  807. getApplyField,
  808. } from "@/api/meeting/meetingApply";
  809. import { getConfrenceDetail } from "@/api/meeting/meetingOutInfo";
  810. import Base from "@/views/base/Base";
  811. import UpLoad from "@/views/conferenceServices/UpLoad";
  812. import UpLoadFile from "@/views/conferenceServices/UpLoadFile";
  813. import GlobalRoaming from "@/components/GlobalRoaming";
  814. import { getToken } from "@/utils/auth";
  815. import moment from "moment-timezone";
  816. import { addIntegral, addGrowth } from "@/utils/toCompleteTask";
  817. export default {
  818. name: "MeetingApplyForm",
  819. extends: Base,
  820. components: { UpLoad, UpLoadFile, GlobalRoaming },
  821. data() {
  822. var checkInvitationCode = (rule, value, callback) => {
  823. if (!value) {
  824. let errorTxt =
  825. this.lang == "en" ? "Please enter Invitation Code.If not, please enter 000000." : "请输入邀请码,如果没有,请输入000000。";
  826. callback(new Error(errorTxt));
  827. } else if (!this.invitationCodeArr.includes(value)) {
  828. let errorTxt =
  829. this.lang == "en"
  830. ? "Please enter the correct Invitation Code. If not, please enter 000000."
  831. : "请输入正确的邀请码。如果没有,请输入000000";
  832. callback(new Error(errorTxt));
  833. } else {
  834. callback();
  835. }
  836. };
  837. var checkTel = (rule, value, callback) => {
  838. if (!value) {
  839. let errorTxt =
  840. this.lang == "en" ? "Please enter Cellphone Number." : "请输入手机号";
  841. callback(new Error(errorTxt));
  842. } else if (this.meetingApply.mobileAreaCodeDictEn == "0086") {
  843. let reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
  844. if (!reg.test(value)) {
  845. let errorTxt =
  846. this.lang == "en"
  847. ? "The Cellphone Number is not correct."
  848. : "请输入正确的11位手机号";
  849. callback(new Error(errorTxt));
  850. } else {
  851. callback();
  852. }
  853. } else {
  854. callback();
  855. }
  856. };
  857. var checkContactCellphone = (rule, value, callback) => {
  858. if (!value) {
  859. let errorTxt =
  860. this.lang == "en"
  861. ? "Please enter Cellphone Number."
  862. : "请输入联系人手机号";
  863. return callback(new Error(errorTxt));
  864. } else if (this.meetingApply.contactMobileAreacodeDictEn == "0086") {
  865. let reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/;
  866. if (!reg.test(value)) {
  867. let errorTxt =
  868. this.lang == "en"
  869. ? "The Cellphone Number is not correct."
  870. : "请输入正确的11位手机号";
  871. callback(new Error(errorTxt));
  872. } else {
  873. callback();
  874. }
  875. } else {
  876. callback();
  877. }
  878. };
  879. var checkEmail = (rule, value, callback) => {
  880. let reg = /^\w+.*\w+@[a-zA-Z0-9]+.*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/gm;
  881. if (!value) {
  882. let errorTxt =
  883. this.lang == "en" ? "Please enter E-mail." : "请输入邮箱";
  884. return callback(new Error(errorTxt));
  885. } else if (!reg.test(value)) {
  886. let errorTxt =
  887. this.lang == "en"
  888. ? "Please enter the correct E-mail address."
  889. : "邮箱格式不正确";
  890. callback(new Error(errorTxt));
  891. } else {
  892. callback();
  893. }
  894. };
  895. var checkContactEmail = (rule, value, callback) => {
  896. let reg = /^\w+.*\w+@[a-zA-Z0-9]+.*[a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/gm;
  897. if (!value) {
  898. let errorTxt =
  899. this.lang == "en"
  900. ? "Please enter Contact E-mail."
  901. : "请输入联系人邮箱";
  902. return callback(new Error(errorTxt));
  903. } else if (!reg.test(value)) {
  904. let errorTxt =
  905. this.lang == "en"
  906. ? "Please enter the correct E-mail address."
  907. : "邮箱格式不正确";
  908. callback(new Error(errorTxt));
  909. } else {
  910. callback();
  911. }
  912. };
  913. return {
  914. applyHistorySelected: "", //被选择的报名历史
  915. applyHistoryInfo: [], //报名历史信息
  916. dialogVisible: false,
  917. num: 5,
  918. timer: "",
  919. baseInfo: {},
  920. infoSwitch: true,
  921. // imageUrl: "",
  922. fileUrl: "",
  923. lang: "",
  924. pinyin: "",
  925. //流程改造4
  926. // processKey: "MEETING_APPROVE",
  927. Authorization: {},
  928. // meetingenableFlow: null,
  929. approverId: "",
  930. genderDicts: [],
  931. meetingUnitTypeDicts: [],
  932. meetingUnitTypeDictEns: [],
  933. unitCountryDicts: [],
  934. unitCountryDictEns: [],
  935. languageDictEns: [],
  936. invitationCodePrefix: [],
  937. invitationCodeArr: ["000000"],
  938. gridData: [],
  939. checkedIds: [],
  940. intentions: {},
  941. meetingApply: {
  942. // id: this.$route.params.key,
  943. meetingYearplanTypeDict: "main_meeting",
  944. photoUrl: "",
  945. meetingId: this.$route.query.key,
  946. // meetingId: window.localStorage.getItem('conferenceId'),
  947. invitationCode: "",
  948. name: "",
  949. nameEn: "",
  950. givenName: "",
  951. middleName: "",
  952. surname: "",
  953. genderDict: "",
  954. genderDictEn: "",
  955. email: "",
  956. mobileAreaCodeDictEn: "",
  957. tel: "",
  958. unitName: "",
  959. unitNameEn: "",
  960. meetingUnitTypeDict: "",
  961. meetingUnitTypeDictEn: "",
  962. positionName: "",
  963. positionNameEn: "",
  964. unitCountryDict:
  965. window.localStorage.getItem("locale") == "zh" ? "china" : "",
  966. unitCountryDictEn: "",
  967. languageDictEn: "",
  968. contactPersonName: "",
  969. contactMobileAreacodeDictEn: "",
  970. contactCellphone: "",
  971. contactEmail: "",
  972. isNeedLetter: "No",
  973. applyWay: window.localStorage.getItem("locale"), //报名方式
  974. passportNumber: "",
  975. visitPlace: "",
  976. embassyName: "",
  977. visitTypeEn: "",
  978. isAboveMinisterial: "",
  979. numberOfEntries: "",
  980. firstEntryDate: "",
  981. longestStayDays: "",
  982. birthDate: "",
  983. nationalityDict: "",
  984. passportValidityDate: "",
  985. passportFristPageUrl: "",
  986. previousPositions: "",
  987. educationBackground: "",
  988. flightInformation: "",
  989. intineraryInChina: "",
  990. auditStatusDict: "",
  991. },
  992. rulesEnNext: {
  993. visitPlace: [
  994. {
  995. required: true,
  996. message: "Please enter Places to Visit.",
  997. trigger: "blur",
  998. },
  999. ],
  1000. embassyName: [
  1001. {
  1002. required: true,
  1003. message: "Please enter Embassy/Consulate to apply visa.",
  1004. trigger: "blur",
  1005. },
  1006. ],
  1007. visitTypeEn: [
  1008. {
  1009. required: true,
  1010. message: "Please specify Purpose of Visit.",
  1011. trigger: "blur",
  1012. },
  1013. ],
  1014. isAboveMinisterial: [
  1015. {
  1016. required: true,
  1017. message: "Please select Vice Ministerial level or above.",
  1018. trigger: "change",
  1019. },
  1020. ],
  1021. numberOfEntries: [
  1022. {
  1023. required: true,
  1024. message: "Please enter Number of entries.",
  1025. trigger: "blur",
  1026. },
  1027. ],
  1028. firstEntryDate: [
  1029. {
  1030. required: true,
  1031. message: "Please select Date of First Entry.",
  1032. trigger: "change",
  1033. },
  1034. ],
  1035. longestStayDays: [
  1036. {
  1037. required: true,
  1038. message: "Please enter Longest Stay (days).",
  1039. trigger: "change",
  1040. },
  1041. ],
  1042. // givenName: [
  1043. // { required: true, message: 'Please enter Given Name.', trigger: 'blur' },
  1044. // ],
  1045. // surname: [
  1046. // { required: true, message: 'Please enter Surname.', trigger: 'blur' },
  1047. // ],
  1048. birthDate: [
  1049. {
  1050. required: true,
  1051. message: "Please enter Date of Birth.",
  1052. trigger: "change",
  1053. },
  1054. ],
  1055. genderDictEn: [
  1056. {
  1057. required: true,
  1058. message: "Please select Gender.",
  1059. trigger: "change",
  1060. },
  1061. ],
  1062. nationalityDict: [
  1063. {
  1064. required: true,
  1065. message: "Please select Nationality.",
  1066. trigger: "change",
  1067. },
  1068. ],
  1069. // passportNumber: [
  1070. // { required: true, message: 'Please enter Passport Number.', trigger: 'change' },
  1071. // ],
  1072. passportValidityDate: [
  1073. {
  1074. required: true,
  1075. message: "Please select Passport Validity Date.",
  1076. trigger: "change",
  1077. },
  1078. ],
  1079. // unitNameEn: [
  1080. // { required: true, message: 'Please enter Affiliation.', trigger: 'blur' }
  1081. // ],
  1082. // positionName: [
  1083. // { required: true, message: 'Please enter Possition.', trigger: 'blur' }
  1084. // ],
  1085. // email: [
  1086. // { required: true, validator: checkEmail, trigger: 'blur'}
  1087. // ],
  1088. flightInformation: [
  1089. {
  1090. required: true,
  1091. message: "Please enter Flight Information.",
  1092. trigger: "blur",
  1093. },
  1094. ],
  1095. intineraryInChina: [
  1096. {
  1097. required: true,
  1098. message: "Please enter Intinerary in China.",
  1099. trigger: "blur",
  1100. },
  1101. ],
  1102. },
  1103. rulesEn: {
  1104. invitationCode: [
  1105. { required: true, validator: checkInvitationCode, trigger: "blur" },
  1106. // { required: true, message: 'Please enter Invitation Code. If not, please enter 000000.', trigger: 'blur' },
  1107. // { min: 6, max: 6, message: 'Please enter Invitation Code. If not, please enter 000000.', trigger: 'blur' }
  1108. ],
  1109. givenName: [
  1110. {
  1111. required: true,
  1112. message: "Please enter Given Name.",
  1113. trigger: "blur",
  1114. },
  1115. ],
  1116. surname: [
  1117. { required: true, message: "Please enter Surname.", trigger: "blur" },
  1118. ],
  1119. genderDictEn: [
  1120. {
  1121. required: true,
  1122. message: "Please select Gender.",
  1123. trigger: "change",
  1124. },
  1125. ],
  1126. email: [{ required: true, validator: checkEmail, trigger: "blur" }],
  1127. tel: [{ required: true, validator: checkTel, trigger: "blur" }],
  1128. unitNameEn: [
  1129. {
  1130. required: true,
  1131. message: "Please select company/Organization.",
  1132. trigger: "blur",
  1133. },
  1134. ],
  1135. meetingUnitTypeDictEn: [
  1136. {
  1137. required: true,
  1138. message: "Please select Company/Organization Type.",
  1139. trigger: "change",
  1140. },
  1141. ],
  1142. positionNameEn: [
  1143. { required: true, message: "Please enter Title.", trigger: "blur" },
  1144. ],
  1145. unitCountryDictEn: [
  1146. {
  1147. required: true,
  1148. message: "Please select Country/Region.",
  1149. trigger: "change",
  1150. },
  1151. ],
  1152. languageDictEn: [
  1153. {
  1154. required: true,
  1155. message: "Please select Language.",
  1156. trigger: "change",
  1157. },
  1158. ],
  1159. passportNumber: [
  1160. {
  1161. required: true,
  1162. message: "Please enter Passport Number.",
  1163. trigger: "blur",
  1164. },
  1165. ],
  1166. contactPersonName: [
  1167. {
  1168. required: true,
  1169. message: "Please enter Contact Person.",
  1170. trigger: "blur",
  1171. },
  1172. ],
  1173. contactCellphone: [
  1174. { required: true, validator: checkContactCellphone, trigger: "blur" },
  1175. ],
  1176. contactEmail: [
  1177. { required: true, validator: checkContactEmail, trigger: "blur" },
  1178. ],
  1179. isNeedLetter: [
  1180. {
  1181. required: true,
  1182. message: "Need to apply an invitation letter",
  1183. trigger: "change",
  1184. },
  1185. ],
  1186. },
  1187. rulesZh: {
  1188. invitationCode: [
  1189. { required: true, validator: checkInvitationCode, trigger: "blur" },
  1190. // { required: true, message: '请输入6位会议邀请码,如果没有请输入00000', trigger: 'blur' },
  1191. // { min: 6, max: 6, message: '请输入6位会议邀请码,如果没有请输入00000', trigger: 'blur' }
  1192. ],
  1193. name: [{ required: true, message: "请输入姓名", trigger: "blur" }],
  1194. genderDict: [
  1195. { required: true, message: "请选择性别", trigger: "change" },
  1196. ],
  1197. email: [{ required: true, validator: checkEmail, trigger: "blur" }],
  1198. tel: [{ required: true, validator: checkTel, trigger: "blur" }],
  1199. unitCountryDict: [
  1200. { required: true, message: "请选择国家", trigger: "change" },
  1201. ],
  1202. unitName: [
  1203. { required: true, message: "请输入所在单位", trigger: "blur" },
  1204. ],
  1205. meetingUnitTypeDict: [
  1206. { required: true, message: "请选择单位类型", trigger: "change" },
  1207. ],
  1208. positionName: [
  1209. { required: true, message: "请输入职务", trigger: "blur" },
  1210. ],
  1211. contactPersonName: [
  1212. { required: true, message: "请输入联系人", trigger: "blur" },
  1213. ],
  1214. contactCellphone: [
  1215. { required: true, validator: checkContactCellphone, trigger: "blur" },
  1216. ],
  1217. contactEmail: [
  1218. { required: true, validator: checkContactEmail, trigger: "blur" },
  1219. ],
  1220. },
  1221. };
  1222. },
  1223. props: {},
  1224. watch: {
  1225. "$i18n.locale"(val) {
  1226. this.lang = val;
  1227. this.meetingApply.applyWay = val;
  1228. this.getApplyHistoryInfos();
  1229. },
  1230. dialogVisible() {
  1231. if (this.dialogVisible == true) {
  1232. this.loginTipsChange();
  1233. }
  1234. },
  1235. "meetingApply.name"(val) {
  1236. this.meetingApply.contactPersonName = val;
  1237. setTimeout(() => {
  1238. let p = document.getElementById("pinyin").innerText;
  1239. this.meetingApply.nameEn = p;
  1240. });
  1241. },
  1242. "meetingApply.email"(val) {
  1243. this.meetingApply.contactEmail = val;
  1244. },
  1245. "meetingApply.tel"(val) {
  1246. this.meetingApply.contactCellphone = val;
  1247. },
  1248. "meetingApply.givenName"(val) {
  1249. this.meetingApply.contactPersonName = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1250. },
  1251. "meetingApply.middleName"(val) {
  1252. this.meetingApply.contactPersonName = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1253. },
  1254. "meetingApply.surname"(val) {
  1255. this.meetingApply.contactPersonName = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1256. },
  1257. },
  1258. created() {
  1259. this.lang = this.$i18n.locale;
  1260. this.meetingApply.applyWay = this.lang;
  1261. },
  1262. mounted() {
  1263. if (this.$route.query) {
  1264. localStorage.setItem("conferenceId", this.$route.query.key);
  1265. }
  1266. this.initData1()
  1267. this.getIntentions();
  1268. this.initData();
  1269. this.getApplyHistoryInfos();
  1270. this.getApplyField();
  1271. },
  1272. methods: {
  1273. initData1() {
  1274. this.user = JSON.parse(window.localStorage.getItem("user"));
  1275. },
  1276. getApplyField() {
  1277. getApplyField("1427433328149434368").then((result) => {
  1278. console.log("result::::", result);
  1279. });
  1280. },
  1281. applyHistoryChanged(i) {
  1282. Object.keys(this.applyHistoryInfo[i]).forEach((key) => {
  1283. this.meetingApply[key] = this.applyHistoryInfo[i][key];
  1284. });
  1285. },
  1286. //获取报名历史信息
  1287. getApplyHistoryInfos() {
  1288. this.applyHistorySelected = "";
  1289. getApplyHistoryInfosByLoginAccount(this.$i18n.locale).then((res) => {
  1290. this.applyHistoryInfo = res.data.applyHistoryInfos;
  1291. // console.log('ApplyHistoryInfos',res)
  1292. });
  1293. },
  1294. getIntentions() {
  1295. this.intentions = JSON.parse(
  1296. sessionStorage.getItem("pathReminder")
  1297. ).query.intentions;
  1298. // console.log('66666666',this.intentions)
  1299. },
  1300. momentDate(date) {
  1301. if (this.$i18n.locale == "zh") {
  1302. moment.locale("zh-cn");
  1303. return moment(date).format("YYYY MM DD, H:mm");
  1304. } else {
  1305. moment.locale("en");
  1306. return moment(date).format("lll");
  1307. }
  1308. },
  1309. setSelect(row) {
  1310. this.$refs.multipleTable.toggleRowSelection(row);
  1311. },
  1312. setSelectEn(row) {
  1313. this.$refs.multipleTableEn.toggleRowSelection(row);
  1314. },
  1315. checkRow(checkedData) {
  1316. this.checkedIds = [];
  1317. this.newChecked = [];
  1318. const date = []
  1319. checkedData.forEach((item) => {
  1320. date.find(i=>{
  1321. if(i===this.momentDate(item.activityStartTime)){
  1322. let msgTxt = this.$i18n.locale=='en'? 'Kind Reminder: participants can only register for one parallel session. Hope you enjoy the conference.': '温馨提示:同一时段平行召开的会议仅限选择一场参加,祝您参会愉快!';
  1323. this.$message({
  1324. message: msgTxt,
  1325. type:'error'
  1326. })
  1327. }
  1328. })
  1329. date.push(this.momentDate(item.activityStartTime))
  1330. this.checkedIds.push(item.id)
  1331. this.newChecked.push(item.activityStartTime)
  1332. });
  1333. },
  1334. ContinueRegister() {
  1335. clearInterval(this.timer);
  1336. this.dialogVisible = false;
  1337. },
  1338. loginTipsChange() {
  1339. const that = this;
  1340. this.num = 5;
  1341. this.timer = setInterval(function () {
  1342. if (that.num > 0) {
  1343. that.num--;
  1344. } else {
  1345. clearInterval(that.timer);
  1346. that.dialogVisible = false;
  1347. that.toView("ConferenceDetail", that.$route.query.key);
  1348. }
  1349. }, 1000);
  1350. },
  1351. toView(router, json) {
  1352. this.$router.push({ path: router, query: { key: json } });
  1353. },
  1354. formatDate(t) {
  1355. if (!t) {
  1356. return "";
  1357. } else {
  1358. var original = new Date(t);
  1359. var year = original.getFullYear();
  1360. var month = original.getMonth() + 1;
  1361. var date = original.getDate();
  1362. return year + "-" + month + "-" + date;
  1363. }
  1364. },
  1365. getEducationBackground(file) {
  1366. this.meetingApply.educationBackground = file.path;
  1367. },
  1368. getPreviousPositions(file) {
  1369. this.meetingApply.previousPositions = file.path;
  1370. },
  1371. getPassportFristPageUrl(file) {
  1372. this.meetingApply.passportFristPageUrl = file.path;
  1373. },
  1374. getphotoUrl(file) {
  1375. this.meetingApply.photoUrl = file.path;
  1376. },
  1377. submitFormEnNext(formName) {
  1378. this.$refs[formName].validate((valid) => {
  1379. if (!valid) {
  1380. this.$message.error("Please fill in the complete information");
  1381. return false;
  1382. }
  1383. this.$refs["meetingApplyen"].validate((validNext) => {
  1384. if (!validNext) {
  1385. this.$message.error("Please fill in the complete information");
  1386. return false;
  1387. }
  1388. // if(!this.meetingApply.passportFristPageUrl){
  1389. // this.$message.error('Please upload a copy of the front page of your passport');
  1390. // return false;
  1391. // }
  1392. // if(!this.meetingApply.previousPositions){
  1393. // this.$message.error('Please upload your experience');
  1394. // return false;
  1395. // }
  1396. // if(!this.meetingApply.educationBackground){
  1397. // this.$message.error('Please upload education experience');
  1398. // return false;
  1399. // }
  1400. // if(!this.meetingApply.photoUrl){
  1401. // this.$message.error('Please upload your picture');
  1402. // return false;
  1403. // }
  1404. this.meetingApply.nameEn = `${this.meetingApply.givenName}${this.meetingApply.middleName}${this.meetingApply.surname}`;
  1405. this.save();
  1406. });
  1407. });
  1408. },
  1409. submitFormEn(formName) {
  1410. this.$refs[formName].validate((valid) => {
  1411. if (!valid) {
  1412. this.$message.error("Please fill in the complete information");
  1413. return false;
  1414. }
  1415. // if(!this.meetingApply.photoUrl){
  1416. // this.$message.error('Please upload Photo');
  1417. // return false;
  1418. // }
  1419. this.meetingApply.nameEn = `${this.meetingApply.givenName} ${this.meetingApply.middleName} ${this.meetingApply.surname}`;
  1420. this.save();
  1421. });
  1422. },
  1423. //提交
  1424. submitForm(formName) {
  1425. this.$refs[formName].validate((valid) => {
  1426. if (!valid) {
  1427. this.$message.error("请填写完整信息");
  1428. return false;
  1429. }
  1430. // if(!this.meetingApply.photoUrl){
  1431. // this.$message.error('请上传头像');
  1432. // return false;
  1433. // }
  1434. this.save();
  1435. });
  1436. },
  1437. //获取区号
  1438. getGobileAreaCodeDictEn(code) {
  1439. this.meetingApply.mobileAreaCodeDictEn = code;
  1440. this.meetingApply.contactMobileAreacodeDictEn = code;
  1441. },
  1442. getContactMobileAreacodeDictEn(code) {
  1443. this.meetingApply.contactMobileAreacodeDictEn = code;
  1444. },
  1445. handleAvatarSuccess(res, file) {
  1446. // console.log('上传成功',res)
  1447. // console.log('上传成功',file)
  1448. this.meetingApply.photoUrl = res.data.path;
  1449. // this.imageUrl = URL.createObjectURL(file.raw);
  1450. },
  1451. beforeAvatarUpload(file) {
  1452. this.Authorization.Authorization = "Bearer " + getToken();
  1453. this.loading = true;
  1454. const isJPG = file.type === "image/jpeg" || file.type === "image/jpg";
  1455. const isPNG = file.type === "image/png";
  1456. const isLt2M = file.size / 1024 / 1024 < 2;
  1457. if (!isJPG && !isPNG) {
  1458. let erroerTxt =
  1459. this.lang == "en"
  1460. ? "Upload images can only be in JPG/JPEG or PNG format!"
  1461. : "上传图片只能是 JPG/JPEG 或者 PNG 格式!";
  1462. this.$message.error(erroerTxt);
  1463. }
  1464. if (!isLt2M) {
  1465. let erroerTxt =
  1466. this.lang == "en"
  1467. ? "The size of the uploaded image cannot exceed 2MB!"
  1468. : "上传图片大小不能超过 2MB!";
  1469. this.$message.error(erroerTxt);
  1470. }
  1471. return (isJPG || isPNG) && isLt2M;
  1472. },
  1473. save: function () {
  1474. var arr1=this.newChecked
  1475. var arr2=arr1.sort()
  1476. for(var i=0;i<arr2.length-1;i++){
  1477. if(arr2[i]==arr2[i+1]){
  1478. let msgTxt = this.$i18n.locale=='en'? 'Kind Reminder: participants can only register for one parallel session. Hope you enjoy the conference.': '温馨提示:同一时段平行召开的会议仅限选择一场参加,祝您参会愉快!';
  1479. this.$message.error(msgTxt)
  1480. return false
  1481. }else{
  1482. console.log('hello');
  1483. }
  1484. }
  1485. //流程改造6
  1486. if (this.meetingApply.auditStatusDict === "") {
  1487. this.meetingApply.auditStatusDict = "4";
  1488. } else {
  1489. this.meetingApply.auditStatusDict = this.meetingApply.auditStatusDict;
  1490. }
  1491. this.submitHandler((token) => {
  1492. //流程改造7
  1493. getApproverId(this.meetingApply.invitationCode).then((result) => {
  1494. result = result.data;
  1495. var str = "";
  1496. for (var i = 0; i < result.length; i++) {
  1497. str += result[i].userId + ",";
  1498. }
  1499. if (str.length > 0) {
  1500. str = str.substr(0, str.length - 1);
  1501. }
  1502. this.approverId = str;
  1503. saveOrUpdate(
  1504. JSON.stringify(this.meetingApply),
  1505. this.approverId,
  1506. this.taskComment,
  1507. token,
  1508. this.checkedIds.join(",")
  1509. )
  1510. .then((result) => {
  1511. console.log("result", result);
  1512. if (result.status == "200") {
  1513. if (this.user.umsUser.userUsertypeDict !== "2") {
  1514. addIntegral("meeting_registration_successful", "10");
  1515. addGrowth("meeting_registration_successful");
  1516. }
  1517. if (result.data.isRepeat) {
  1518. let errorMsg =
  1519. this.$i18n.locale == "en"
  1520. ? "The guest has registered, please do not fill in again."
  1521. : "该嘉宾已报名,请勿重复填写!";
  1522. this.$message.error(errorMsg);
  1523. this.resetToken();
  1524. } else {
  1525. this.dialogVisible = true;
  1526. this.resetToken();
  1527. }
  1528. }
  1529. this.backListView(this.meetingApply.id == null);
  1530. })
  1531. .catch((error) => {
  1532. this.resetToken();
  1533. });
  1534. });
  1535. });
  1536. },
  1537. initData: function () {
  1538. // console.log('this.$route.params.key',this.$route.params.key)
  1539. if (this.$route.params.key) {
  1540. this.meetingApply = this.$route.params.key;
  1541. }
  1542. getDicts(
  1543. "gender_dict,unit_country_dict,meeting_unit_type_dict, meeting_unit_type_dict_en, unit_country_dict_en, language_dict_en, geidco_dept_dict"
  1544. )
  1545. .then((result) => {
  1546. var data = result.data;
  1547. if (data) {
  1548. this.genderDicts = result.data[0] || [];
  1549. this.unitCountryDicts = result.data[1] || [];
  1550. this.meetingUnitTypeDicts = result.data[2] || [];
  1551. this.meetingUnitTypeDictEns = result.data[3] || [];
  1552. this.unitCountryDictEns = result.data[4] || [];
  1553. this.languageDictEns = result.data[5] || [];
  1554. this.invitationCodePrefix = result.data[6] || [];
  1555. if (this.unitCountryDictEns.length) {
  1556. this.unitCountryDictEns.sort(function (a, b) {
  1557. return a.value.charCodeAt() - b.value.charCodeAt();
  1558. });
  1559. }
  1560. }
  1561. })
  1562. .then((res) => {
  1563. let meetingId;
  1564. if (this.$route.params.key) {
  1565. meetingId = this.$route.params.key.meetingId;
  1566. } else {
  1567. meetingId = this.$route.query.key;
  1568. }
  1569. getConfrenceDetail(meetingId).then((res) => {
  1570. this.baseInfo = res.data.basicInfo;
  1571. // console.log('会议数据', res)
  1572. // 邀请码集合
  1573. this.invitationCodePrefix.forEach((item) => {
  1574. // console.log('item', item)
  1575. this.invitationCodeArr.push(
  1576. `${item.value}${res.data.basicInfo.meetingRand}`
  1577. );
  1578. });
  1579. // console.log('邀请码集合', this.invitationCodeArr)
  1580. });
  1581. //参会意向
  1582. getMeetingApplyActivityInfos(localStorage.getItem("conferenceId"))
  1583. .then((_res) => {
  1584. console.log("_res", _res);
  1585. this.gridData = _res.data.allMeetingActivitys || [];
  1586. })
  1587. .catch((err) => {
  1588. this.gridData = [];
  1589. });
  1590. });
  1591. },
  1592. },
  1593. };
  1594. </script>
  1595. <style scoped>
  1596. /deep/ .el-table thead{
  1597. display: none;
  1598. }
  1599. .container-box {
  1600. width: 1200px;
  1601. margin: 10px auto;
  1602. position: relative;
  1603. }
  1604. .bread-crumb {
  1605. height: 40px;
  1606. background: #fff;
  1607. margin: 10px 0;
  1608. }
  1609. .content-box-en {
  1610. width: 100%;
  1611. box-sizing: border-box;
  1612. padding: 20px 150px;
  1613. background: #fff;
  1614. }
  1615. .content-box-en .title-custom {
  1616. color: #909399;
  1617. }
  1618. /* .content-box-en .border-custom{
  1619. border: 1px solid #DCDFE6;
  1620. border-radius: 4px;
  1621. padding: 0 20px;
  1622. box-sizing: border-box;
  1623. } */
  1624. .tip {
  1625. font-size: 12px;
  1626. color: #888;
  1627. }
  1628. .content-box-zh {
  1629. width: 100%;
  1630. box-sizing: border-box;
  1631. padding: 20px 150px 0 150px;
  1632. background: #fff;
  1633. }
  1634. .content-box-zh .content-item {
  1635. padding-bottom: 20px;
  1636. }
  1637. .category-title {
  1638. height: 20px;
  1639. line-height: 20px;
  1640. font-size: 18px;
  1641. font-weight: bold;
  1642. border-left: 4px solid #2c558a;
  1643. padding-left: 10px;
  1644. margin: 30px 0;
  1645. }
  1646. .category-title span {
  1647. font-size: 12px;
  1648. font-weight: bold;
  1649. color: #666;
  1650. }
  1651. /deep/ .content-box-en .el-input__inner,
  1652. /deep/ .content-box-zh .el-input__inner {
  1653. border-top: none;
  1654. border-left: none;
  1655. border-right: none;
  1656. border-radius: 0;
  1657. }
  1658. /deep/ .el-input-group__prepend {
  1659. border-top: none;
  1660. border-left: none;
  1661. background: #fff;
  1662. border-radius: 0;
  1663. }
  1664. /deep/ .el-select {
  1665. width: 150px;
  1666. }
  1667. /deep/ .area-code .el-input-group__prepend {
  1668. width: 150px;
  1669. border: none;
  1670. }
  1671. .submit-success {
  1672. text-align: center;
  1673. font-size: 20px;
  1674. color: #999;
  1675. }
  1676. .submit-success p {
  1677. margin: 0;
  1678. }
  1679. .submit-success .el-button {
  1680. width: 150px;
  1681. font-size: 20px;
  1682. margin: 10px;
  1683. }
  1684. .down-load a {
  1685. font-size: 28px;
  1686. color: #49a2f2;
  1687. text-decoration: none;
  1688. }
  1689. .down-load a:hover {
  1690. color: #de551a;
  1691. }
  1692. /deep/ .el-dialog {
  1693. display: flex;
  1694. flex-direction: column;
  1695. margin: 0 !important;
  1696. position: absolute;
  1697. top: 50%;
  1698. left: 50%;
  1699. transform: translate(-50%, -50%);
  1700. max-height: calc(100% - 30px);
  1701. max-width: calc(100% - 30px);
  1702. }
  1703. /deep/ .el-dialog .el-dialog__body {
  1704. flex: 1;
  1705. overflow: auto;
  1706. }
  1707. .photo-uploader-container /deep/ .el-upload-dragger {
  1708. width: 140px;
  1709. height: 188px;
  1710. padding: 10px;
  1711. }
  1712. /deep/ .el-upload__tip {
  1713. text-indent: 0;
  1714. color: #de571a;
  1715. margin-top: 0;
  1716. }
  1717. .apply-history {
  1718. position: absolute;
  1719. top: 60px;
  1720. right: 20px;
  1721. }
  1722. .apply-history .el-select {
  1723. width: 300px;
  1724. }
  1725. </style>