index.tsx 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951
  1. import { defineComponent, onMounted, onUnmounted, reactive, ref, nextTick, computed, watch } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. Button,
  5. CellGroup,
  6. Field,
  7. Picker,
  8. Popup,
  9. closeToast,
  10. showToast,
  11. Loading,
  12. Form,
  13. CountDown,
  14. Cell,
  15. Area,
  16. } from 'vant';
  17. import { useRoute, useRouter } from 'vue-router';
  18. import threeMan from './images/update/three-man.png'
  19. import OWxTip from '@/components/m-wx-tip';
  20. import { browser, getHttpOrigin, getUrlCode, checkPhone } from '@/helpers/utils';
  21. import qs from 'query-string';
  22. import request from '@/helpers/request';
  23. import { goWechatAuth } from '@/state';
  24. import { useInterval, useIntervalFn } from '@vueuse/core';
  25. import MMessageTip from '@/components/m-message-tip';
  26. import MImgCode from '@/components/m-img-code';
  27. import MSearch from '@/components/m-search';
  28. import submitBtn from './images/submit_icon.png'
  29. import signupBtn from './images/signup_icon.png'
  30. import signSusIcon from './images/sign_icon.png'
  31. import subSusIcon from './images/subsus_icon.png'
  32. import doneIcon from './images/done_icon.png'
  33. import { subscribe } from 'diagnostics_channel';
  34. import { api_sysAreaQueryAllProvince } from '@/views/school-register/api';
  35. export default defineComponent({
  36. name: 'fill-questionnaire',
  37. setup() {
  38. const router = useRouter();
  39. const route = useRoute();
  40. const classList: any = [];
  41. for (let i = 1; i <= 40; i++) {
  42. classList.push({ text: i + '班', value: i });
  43. }
  44. const gradeList = route.query.meetingType === 'primarySchoolNo' || route.query.meetingType === 'primarySchoolYes' ? [
  45. {
  46. text: '一年级',
  47. value: 1
  48. },
  49. {
  50. text: '二年级',
  51. value: 2
  52. },
  53. {
  54. text: '三年级',
  55. value: 3
  56. },
  57. {
  58. text: '四年级',
  59. value: 4
  60. },
  61. {
  62. text: '五年级',
  63. value: 5
  64. },
  65. {
  66. text: '六年级',
  67. value: 6
  68. },
  69. ] : [
  70. {
  71. text: '六年级',
  72. value: 6
  73. },
  74. {
  75. text: '七年级',
  76. value: 7
  77. },
  78. {
  79. text: '八年级',
  80. value: 8
  81. },
  82. {
  83. text: '九年级',
  84. value: 9
  85. },
  86. ]
  87. const GRADE_ENUM = {
  88. '1': '一年级',
  89. '2': '二年级',
  90. '3': '三年级',
  91. '4': '四年级',
  92. '5': '五年级',
  93. '6': '六年级',
  94. '7': '七年级',
  95. '8': '八年级',
  96. '9': '九年级'
  97. } as any;
  98. const getGradeList = (gradeYear?: string, instrumentCode?: string) => {
  99. let tempList: any = [];
  100. const five = [
  101. { text: '一年级', value: 1, instrumentCode },
  102. { text: '二年级', value: 2, instrumentCode },
  103. { text: '三年级', value: 3, instrumentCode },
  104. { text: '四年级', value: 4, instrumentCode },
  105. { text: '五年级', value: 5, instrumentCode }
  106. ];
  107. const one = [{ text: '六年级', value: 6, instrumentCode }];
  108. const three = [
  109. { text: '七年级', value: 7, instrumentCode },
  110. { text: '八年级', value: 8, instrumentCode },
  111. { text: '九年级', value: 9, instrumentCode }
  112. ];
  113. if (gradeYear === 'FIVE_YEAR_SYSTEM') {
  114. tempList.push(...[...five]);
  115. } else if (gradeYear === 'SIX_YEAR_SYSTEM') {
  116. tempList.push(...[...five, ...one]);
  117. } else if (gradeYear === 'THREE_YEAR_SYSTEM') {
  118. tempList.push(...[...three]);
  119. } else if (gradeYear === 'FORE_YEAR_SYSTEM') {
  120. tempList.push(...[...one, ...three]);
  121. } else {
  122. tempList.push(...[...five, ...one, ...three]);
  123. }
  124. return tempList;
  125. };
  126. const countDownRef = ref();
  127. const forms = reactive({
  128. isPageHide: false,
  129. currentClassText: '',
  130. supportList: [
  131. {
  132. title: '支持学校开展',
  133. val: true
  134. },
  135. {
  136. title: '不支持开展',
  137. val: false
  138. }
  139. ],
  140. willingList: [
  141. {
  142. title: '愿意参加并意向报名',
  143. val: true
  144. },
  145. {
  146. title: '不愿意参加',
  147. val: false
  148. }
  149. ],
  150. username: '',
  151. openId: null as any,
  152. participationFlag: null as any, // 是否愿意参加
  153. supportFlag: null as any, // 是否支持
  154. currentGrade: null as any,
  155. currentClass: null as any,
  156. provinceCode: '',
  157. cityCode: '',
  158. districtCode: '',
  159. phone: '',
  160. prePhone: '',
  161. smsCode: '',
  162. selectArea: '', // 所选地区
  163. selectSchool: '', // 所选学校
  164. selectClass: '',
  165. countDownStatus: true,
  166. countDownTime: 1000 * 120, // 倒计时时间
  167. imgCodeStatus: false,
  168. successPopShow: false, // 提交结果弹窗
  169. schoolStatus: false,
  170. schoolPopupShow: false,
  171. schoolLoading: false,
  172. schoolPopupIndex: [] as any,
  173. schoolAreaList: [] as any,
  174. schoolAreaId: null, // 学校区域编号
  175. schoolInstrumentSetType: null as any,
  176. gradeList: [] as any,
  177. classList: [] as any,
  178. schoolName: '',
  179. gradeNumText: '',
  180. areaName: '',
  181. gradeStatus: false, // 年级状态
  182. classStatus: false, // 班级状态
  183. gradePopupShow: false,
  184. gradePopupIndex: [] as any, // 年级下拉索引
  185. classPopupShow: false,
  186. classPopupIndex: [] as any, // 班级下拉索引
  187. areaList: [] as any,
  188. showPicker: false,
  189. gradeAndClass: [gradeList, classList],
  190. gradeAndClassIndex: [] as any,
  191. gradeOptions: gradeList,
  192. classOptions: classList,
  193. gradeOptionIndex: [] as any,
  194. classOptionIndex: [] as any,
  195. submitLoading: false,
  196. id: null as any,
  197. code: null as any,
  198. areaPopupIndex: null as any,
  199. customSearchText: '' as any,
  200. })
  201. onMounted(async () => {
  202. queryDetail();
  203. getAreaList();
  204. });
  205. const getAppIdAndCode = async (url?: string) => {
  206. try {
  207. const { data } = await request.get(
  208. '/edu-app/open/paramConfig/wechatAppId'
  209. );
  210. // 判断是否有微信appId
  211. if (data) {
  212. closeToast();
  213. goWechatAuth(data, url);
  214. }
  215. } catch(e) {
  216. //
  217. console.log(e)
  218. }
  219. };
  220. // 如果没有openId,跳转到第一个页面
  221. if (!sessionStorage.getItem('active-open-id')) {
  222. router.push({
  223. path: '/intention-questionnaire',
  224. query: {
  225. type: route.query.meetingType
  226. }
  227. });
  228. }
  229. if (browser().weixin) {
  230. //授权
  231. const openId = sessionStorage.getItem('active-open-id');
  232. forms.openId = openId;
  233. const code = getUrlCode();
  234. console.log(code, 'code')
  235. if (!code) {
  236. const newUrl =
  237. getHttpOrigin() +
  238. window.location.pathname +
  239. '#' +
  240. route.path +
  241. '?' +
  242. qs.stringify({
  243. ...route.query
  244. });
  245. getAppIdAndCode(newUrl);
  246. return '';
  247. } else {
  248. forms.code = code;
  249. }
  250. }
  251. const onPageShow = () => {
  252. console.log(forms.isPageHide, 'showInfo');
  253. if (forms.isPageHide) {
  254. window.location.reload();
  255. }
  256. };
  257. // 处理监听页面返回不刷新的问题
  258. window.addEventListener('pageshow', onPageShow);
  259. const onPageHide = () => {
  260. console.log(forms.isPageHide, 'showInfo');
  261. forms.isPageHide = true;
  262. };
  263. window.addEventListener('pagehide', onPageHide);
  264. const queryDetail = async () => {
  265. try {
  266. // 判断是否获取微信code码
  267. if (!forms.openId) return;
  268. const { data } = await request.get(
  269. '/edu-app/open/schoolMeetingQuestion/detail?openId=' + forms.openId
  270. );
  271. console.log(12222,data)
  272. forms.provinceCode = data.provinceCode
  273. forms.cityCode = data.cityCode
  274. forms.districtCode = data.districtCode
  275. // 回显省市区
  276. forms.areaPopupIndex = data.districtCode || data.cityCode || data.provinceCode
  277. forms.areaPopupIndex = forms.areaPopupIndex ? String(forms.areaPopupIndex) : null
  278. const primarySchool = ['一年级','二年级','三年级','四年级','五年级','六年级',], juniorSchool = ['六年级','七年级','八年级','九年级'];
  279. if (primarySchool.includes(data.currentGrade) && (route.query.meetingType === 'primarySchoolNo' || route.query.meetingType === 'primarySchoolYes')) {
  280. forms.currentClass = data.currentClass
  281. forms.currentGrade = data.currentGrade
  282. }
  283. if (juniorSchool.includes(data.currentGrade) && (route.query.meetingType === 'juniorSchoolNo' || route.query.meetingType === 'juniorSchool')) {
  284. forms.currentClass = data.currentClass
  285. forms.currentGrade = data.currentGrade
  286. }
  287. forms.phone = data.phone
  288. forms.prePhone = data.phone
  289. forms.username = data.username
  290. forms.schoolAreaId = data.schoolAreaId
  291. forms.schoolPopupIndex = data.schoolAreaId ? [data.schoolAreaId] : []
  292. forms.schoolName = data.schoolName
  293. forms.supportFlag = data.supportFlag
  294. forms.participationFlag = data.participationFlag
  295. forms.areaName = data.provinceName + ' ' + data.cityName + ' ' + (data.districtName || '')
  296. const gradeIdx = gradeList.find(item => item.text === data.currentGrade)?.value || 1
  297. // @ts-ignore
  298. const classIdx = classList.find(item => item.text === data.currentClass)?.value || 1
  299. // forms.gradeAndClassIndex = [gradeIdx, classIdx]
  300. forms.gradeOptionIndex = [gradeIdx]
  301. forms.classOptionIndex = [classIdx]
  302. getSchoolAreaList()
  303. } catch {
  304. //
  305. }
  306. }
  307. /** 手机号变更时清空验证码信息,用户信息 */
  308. const phoneChangeEmptyInfo = () => {
  309. };
  310. const onCodeSend = () => {
  311. forms.countDownStatus = false;
  312. nextTick(() => {
  313. countDownRef.value.start();
  314. });
  315. };
  316. const onSendCode = () => {
  317. // 发送验证码
  318. if (!checkPhone(forms.phone)) {
  319. return showToast('请输入正确的手机号码');
  320. }
  321. forms.imgCodeStatus = true;
  322. };
  323. const validatePhone = computed(() => {
  324. return checkPhone(forms.phone) ? true : false;
  325. });
  326. const onFinished = () => {
  327. forms.countDownStatus = true;
  328. countDownRef.value.reset();
  329. };
  330. const checkForm = (status = true) => {
  331. const regex = /^[\u4e00-\u9fa5]{2,14}$/;
  332. if (!forms.schoolAreaId) {
  333. showToast('请选择学校');
  334. return false;
  335. }
  336. if (!forms.username) {
  337. showToast('请输入姓名');
  338. return false;
  339. }
  340. if (!regex.test(forms.username)) {
  341. showToast('请输入正确的中文姓名');
  342. return false;
  343. }
  344. if (!forms.currentGrade) {
  345. showToast('请选择年级');
  346. return false;
  347. }
  348. if (!forms.currentClass) {
  349. showToast('请选择班级');
  350. return false;
  351. }
  352. if (forms.supportFlag === null) {
  353. showToast('请勾选是否支持学校数字化转型');
  354. return false;
  355. }
  356. if (forms.participationFlag === null) {
  357. showToast('请勾选是否愿意学生参加数字化转型');
  358. return false;
  359. }
  360. if (forms.participationFlag) {
  361. if (!checkPhone(forms.phone)) {
  362. status && showToast('请输入正确的手机号码');
  363. return false;
  364. } else if (!forms.smsCode) {
  365. status && showToast('请输入验证码');
  366. return false;
  367. }
  368. }
  369. return true;
  370. };
  371. const submitFill = async () => {
  372. if (checkForm()) {
  373. try {
  374. forms.submitLoading = true;
  375. const { currentClass, districtCode, currentGrade, participationFlag,cityCode, openId,provinceCode,smsCode,phone,schoolAreaId,supportFlag,username,id} = forms
  376. let params: any = {
  377. currentClass, districtCode, currentGrade, participationFlag,cityCode, openId,provinceCode,schoolAreaId,supportFlag,username
  378. }
  379. if (id) {
  380. params.id = id
  381. }
  382. if (participationFlag) {
  383. params.phone = phone
  384. params.smsCode = smsCode
  385. }
  386. const res = await request.post('/edu-app/open/schoolMeetingQuestion/save', {
  387. data: params
  388. });
  389. if (res.code === 200) {
  390. forms.successPopShow = true;
  391. forms.prePhone = forms.phone
  392. }
  393. forms.submitLoading = false;
  394. forms.countDownStatus = true;
  395. } catch {
  396. //
  397. forms.submitLoading = false;
  398. forms.countDownStatus = true;
  399. }
  400. }
  401. }
  402. const formateArea = (area: any[]) => {
  403. const province_list: { [_: string]: string } = {};
  404. const city_list: { [_: string]: string } = {};
  405. const county_list: { [_: string]: string } = {};
  406. area.forEach((item: any) => {
  407. province_list[item.code] = item.name;
  408. });
  409. area.forEach((item: any) => {
  410. item.areas?.forEach((city: any) => {
  411. city_list[city.code] = city.name;
  412. });
  413. });
  414. area.forEach((item: any) => {
  415. item.areas?.forEach((city: any) => {
  416. city.areas?.forEach((county: any) => {
  417. county_list[county.code] = county.name;
  418. });
  419. });
  420. });
  421. return {
  422. province_list,
  423. city_list,
  424. county_list
  425. };
  426. };
  427. const getAreaList = () => {
  428. api_sysAreaQueryAllProvince().then(res => {
  429. if (res?.code === 200) {
  430. forms.areaList = formateArea(res.data);
  431. }
  432. });
  433. };
  434. const openAreaPop = () => {
  435. console.log(11111)
  436. // forms.schoolStatus = true
  437. // 如果没有选省市区,默认打开省市区弹窗
  438. if (!forms.areaName) {
  439. forms.showPicker = true
  440. } else {
  441. forms.schoolStatus = true
  442. getSchoolAreaList()
  443. }
  444. }
  445. // 高亮显示匹配的文字
  446. const highlightText = (text: string) => {
  447. if (!forms.customSearchText) return text;
  448. const regex = new RegExp(`(${forms.customSearchText})`, 'gi'); // 创建正则匹配用户输入
  449. const customText = text.replace(regex, '<span class="highLight">$1</span>'); // 将匹配部分包裹在 <span> 中
  450. // console.log(customText,999)
  451. return customText
  452. }
  453. const getSchoolAreaList = async (name?: string) => {
  454. forms.schoolLoading = true;
  455. try {
  456. const { data } = await request.post('/edu-app/open/schoolArea/list', {
  457. data: {
  458. name,
  459. testFlag: true,
  460. provinceCode: forms.provinceCode,
  461. cityCode: forms.cityCode,
  462. regionCode: forms.districtCode
  463. }
  464. });
  465. forms.customSearchText = name || ''
  466. forms.schoolAreaList = data;
  467. } catch {
  468. //
  469. }
  470. forms.schoolLoading = false;
  471. };
  472. const switchParticipationFlag = (val: boolean) => {
  473. forms.participationFlag = val
  474. if (!forms.participationFlag) {
  475. forms.phone = ''
  476. forms.smsCode = ''
  477. forms.countDownStatus = true
  478. }
  479. if (forms.participationFlag) {
  480. forms.phone = forms.prePhone
  481. }
  482. }
  483. // 获取地区学校详情
  484. const getSchoolAreaDetail = async () => {
  485. try {
  486. const { data } = await request.get(
  487. '/edu-app/open/schoolArea/detail/' + forms.schoolAreaId
  488. );
  489. console.log(data, 'data');
  490. if (data.school) {
  491. const schoolInfo = data.school || {};
  492. const schoolInstrumentList = schoolInfo.schoolInstrumentList || [];
  493. forms.schoolInstrumentSetType = schoolInfo.instrumentSetType;
  494. if (schoolInfo.instrumentSetType === 'SCHOOL') {
  495. const instrumentCode = schoolInstrumentList[0]?.instrumentCode;
  496. forms.gradeList = getGradeList(
  497. schoolInfo.gradeYear,
  498. instrumentCode
  499. );
  500. forms.classList = classList;
  501. } else if (schoolInfo.instrumentSetType === 'GRADE') {
  502. forms.gradeList = [];
  503. schoolInstrumentList.forEach((item: any) => {
  504. forms.gradeList.push({
  505. text: GRADE_ENUM[item.gradeNum],
  506. value: item.gradeNum,
  507. instrumentId: item.instrumentId,
  508. instrumentCode: item.instrumentCode
  509. });
  510. });
  511. forms.gradeList.sort((a: any, b: any) => a.value - b.value);
  512. forms.classList = classList;
  513. } else if (schoolInfo.instrumentSetType === 'CLASS') {
  514. // 班级
  515. const tempGradeList: any[] = [];
  516. schoolInstrumentList.forEach((item: any) => {
  517. if (!tempGradeList.includes(item.gradeNum)) {
  518. tempGradeList.push(item.gradeNum);
  519. }
  520. });
  521. const lastGradeList: any[] = [];
  522. tempGradeList.forEach((temp: any) => {
  523. const list = {
  524. text: GRADE_ENUM[temp],
  525. value: temp,
  526. instrumentId: '',
  527. instrumentCode: '',
  528. instrumentName: '',
  529. classList: [] as any
  530. };
  531. schoolInstrumentList.forEach((item: any) => {
  532. if (temp === item.gradeNum) {
  533. list.instrumentId = item.instrumentId;
  534. list.instrumentCode = item.instrumentCode;
  535. list.instrumentName = item.instrumentName;
  536. list.classList.push({
  537. text: item.classNum + '班',
  538. value: item.classNum,
  539. instrumentCode: item.instrumentCode
  540. });
  541. }
  542. });
  543. // 排序班级
  544. list.classList.sort((a: any, b: any) => a.value - b.value);
  545. lastGradeList.push(list);
  546. });
  547. lastGradeList.sort((a: any, b: any) => a.value - b.value);
  548. forms.gradeList = lastGradeList;
  549. forms.classList = [];
  550. } else {
  551. forms.gradeList = getGradeList(schoolInfo.gradeYear);
  552. forms.classList = classList;
  553. }
  554. } else {
  555. forms.schoolInstrumentSetType = '';
  556. forms.gradeList = getGradeList();
  557. forms.classList = classList;
  558. }
  559. } catch {
  560. //
  561. }
  562. };
  563. // 监听状态
  564. watch(
  565. () => forms.showPicker,
  566. () => {
  567. if (forms.showPicker) {
  568. forms.areaPopupIndex = forms.districtCode || forms.cityCode || forms.provinceCode
  569. forms.areaPopupIndex = forms.areaPopupIndex ? String(forms.areaPopupIndex) : null
  570. }
  571. }
  572. )
  573. watch(
  574. () => forms.schoolStatus,
  575. () => {
  576. if (forms.schoolStatus) {
  577. forms.schoolPopupIndex = forms.schoolAreaId ? [forms.schoolAreaId] : [];
  578. }
  579. }
  580. )
  581. onUnmounted(() => {
  582. window.removeEventListener('pageshow', onPageShow);
  583. window.removeEventListener('pagehide', onPageHide);
  584. });
  585. return () => (
  586. <div class={styles['intention-page']}>
  587. <div class={styles.formBox}>
  588. <div class={styles.formItem}>
  589. <p>1. 学校</p>
  590. {
  591. forms.schoolName ?
  592. <div class={[styles.valDone, forms.schoolName && styles.valDone2, (forms.schoolStatus||forms.showPicker) && styles.openVal]} onClick={() => {
  593. forms.schoolStatus = true
  594. getSchoolAreaList()
  595. }}>
  596. {forms.schoolName && <span class={styles.vdSchool}>{forms.schoolName}</span>}
  597. <span class={styles.vdArea}>{forms.areaName}</span>
  598. <i></i>
  599. </div> :
  600. <div class={[styles.valDot, styles.grayText, (forms.schoolStatus||forms.showPicker) && styles.openVal]} onClick={openAreaPop}>请选择学校<i></i></div>
  601. }
  602. <div></div>
  603. </div>
  604. <div class={styles.formItem}>
  605. <p>2. 学生姓名</p>
  606. <Field
  607. class={styles.valDot}
  608. clearable={false}
  609. inputAlign="left"
  610. placeholder="请输入学生姓名"
  611. autocomplete="off"
  612. maxlength={14}
  613. v-model={forms.username}>
  614. </Field>
  615. </div>
  616. <div class={styles.formItem}>
  617. <p>3. 年级</p>
  618. <div class={[styles.valDot, !forms.currentGrade && styles.grayText, forms.gradeStatus && styles.openVal]}
  619. onClick={()=> {
  620. const gradeIdx = gradeList.find(item => item.text === forms.currentGrade)?.value || 1
  621. forms.gradeOptionIndex = [gradeIdx]
  622. forms.gradeStatus = true
  623. }}>{forms.currentGrade ? forms.currentGrade : '请选择年级'}<i></i></div>
  624. </div>
  625. <div class={styles.formItem}>
  626. <p>4. 班级</p>
  627. <div class={[styles.valDot, !forms.currentClass && styles.grayText, forms.classStatus && styles.openVal]}
  628. onClick={()=> {
  629. const classIdx = classList.find((item: any) => item.text === forms.currentClass)?.value || 1
  630. forms.classOptionIndex = [classIdx]
  631. forms.classStatus = true
  632. }}>{forms.currentClass ? forms.currentClass : '请选择班级'}<i></i></div>
  633. </div>
  634. <div class={styles.formItem}>
  635. <p>5. 在您了解以上数字化转型事项后,您是否支持学校开展音乐(器乐)课堂数字化转型</p>
  636. <div class={styles.selectItem}>
  637. {
  638. forms.supportList.map(item =>
  639. <div onClick={() => (forms.supportFlag = item.val)}>
  640. <i class={forms.supportFlag === item.val && styles.selectedIcon}></i>
  641. <span>{item.title}</span>
  642. </div>
  643. )
  644. }
  645. </div>
  646. </div>
  647. <div class={styles.formItem}>
  648. {
  649. route.query.meetingType === 'primarySchoolNo' || route.query.meetingType === 'juniorSchoolNo' ?
  650. <p>6. 您是否愿意学生参加数字化转型<span>(注:以学生及家长自愿参加为原则。如愿意参加,家长需自行为学生准备好乐器和“器乐数字Ai”应用软件两项学习工具,市面上均有提供,大约300多元一年。学校不涉及任何收费行为。如不参加,学生按原有方式进行音乐课学习。)</span></p> :
  651. <p>6. 您是否愿意学生参加数字化转型<span>(注:以学生及家长自愿参加为原则。如愿意参加,家长需自行为学生准备好“器乐数字Ai”应用软件,市面上均有提供,大约300多元一年,学校不涉及任何收费行为。如不参加,学生按原有方式进行器乐课程学习。)</span></p>
  652. }
  653. <div class={styles.selectItem}>
  654. {
  655. forms.willingList.map(item =>
  656. <div onClick={() => switchParticipationFlag(item.val)}>
  657. <i class={forms.participationFlag === item.val && styles.selectedIcon}></i>
  658. <span>{item.title}</span>
  659. </div>
  660. )
  661. }
  662. </div>
  663. </div>
  664. {
  665. forms.participationFlag &&
  666. <div class={styles.formItem}>
  667. <p>联系方式</p>
  668. <Field
  669. class={styles.valDot}
  670. clearable={false}
  671. placeholder="请输入手机号码"
  672. type="digit"
  673. autocomplete="off"
  674. inputAlign="left"
  675. v-model={forms.phone}
  676. maxlength={11}
  677. onUpdate:modelValue={(val: any) => {
  678. phoneChangeEmptyInfo();
  679. }}>
  680. </Field>
  681. <Field
  682. class={[styles.valDot, styles.codeItem]}
  683. center
  684. clearable={false}
  685. inputAlign="left"
  686. placeholder="请输入验证码"
  687. autocomplete="off"
  688. type="number"
  689. v-model={forms.smsCode}
  690. maxlength={6}>
  691. {{
  692. button: () =>
  693. forms.countDownStatus ? (
  694. <span
  695. class={[
  696. styles.codeText,
  697. !validatePhone.value ? styles.codeTextDisabled : ''
  698. ]}
  699. onClick={onSendCode}>
  700. 获取验证码
  701. </span>
  702. ) : (
  703. <CountDown
  704. ref={(el: any) => (countDownRef.value = el)}
  705. auto-start={false}
  706. class={styles.countDown}
  707. time={forms.countDownTime}
  708. onFinish={onFinished}
  709. format="ss秒后重试"
  710. />
  711. )
  712. }}
  713. </Field>
  714. </div>
  715. }
  716. {
  717. forms.participationFlag !== null &&
  718. <img class={styles.bottomBtn} src={forms.participationFlag ? signupBtn : submitBtn}
  719. onClick={() => {
  720. if (forms.submitLoading) return;
  721. submitFill()
  722. }}
  723. />
  724. }
  725. </div>
  726. {/* 是否在微信中打开 */}
  727. <OWxTip />
  728. {forms.imgCodeStatus ? (
  729. <MImgCode
  730. v-model:value={forms.imgCodeStatus}
  731. phone={forms.phone}
  732. type="MEETING_QUESTION"
  733. onClose={() => {
  734. forms.imgCodeStatus = false;
  735. }}
  736. onSendCode={onCodeSend}
  737. />
  738. ) : null}
  739. {
  740. forms.successPopShow &&
  741. <div class={styles.successPop}>
  742. <div class={styles.successBox}>
  743. <img class={styles.sTitle} src={forms.participationFlag ? signSusIcon : subSusIcon} />
  744. <p>{forms.participationFlag ? '感谢您的参与' : '感谢您的宝贵意见'}</p>
  745. <img class={styles.sDone} src={doneIcon} onClick={() => {
  746. forms.successPopShow = false
  747. }} />
  748. </div>
  749. </div>
  750. }
  751. <Popup
  752. zIndex={2010}
  753. v-model:show={forms.showPicker}
  754. position="bottom"
  755. round
  756. class={'popupBottomSearch'}>
  757. <Area
  758. optionHeight={46}
  759. areaList={forms.areaList}
  760. v-model={forms.areaPopupIndex}
  761. onCancel={() => {
  762. forms.showPicker = false
  763. // if (!forms.areaName) {
  764. // forms.schoolStatus = false
  765. // }
  766. }}
  767. onConfirm={({ selectedOptions }) => {
  768. forms.provinceCode = selectedOptions[0].value;
  769. forms.cityCode = selectedOptions[1].value;
  770. forms.districtCode = selectedOptions[2]?.value || null;
  771. forms.areaPopupIndex = forms.districtCode || forms.cityCode || forms.provinceCode
  772. forms.areaPopupIndex = forms.areaPopupIndex ? String(forms.areaPopupIndex) : null
  773. forms.areaName = selectedOptions
  774. .map((item: any) => item?.text)
  775. .join(' ');
  776. forms.showPicker = false;
  777. // if (!forms.areaName) {
  778. // forms.schoolStatus = false
  779. // }
  780. forms.schoolAreaId = null;
  781. forms.schoolName = '';
  782. forms.gradeNumText = '';
  783. forms.currentGrade = null;
  784. forms.currentClass = null;
  785. forms.currentClassText = '';
  786. // console.log('地址1')
  787. getSchoolAreaList();
  788. forms.schoolStatus = true
  789. }}
  790. />
  791. </Popup>
  792. {/* 互通学校 */}
  793. <Popup
  794. zIndex={2001}
  795. v-model:show={forms.schoolStatus}
  796. position="bottom"
  797. round
  798. safeAreaInsetBottom
  799. lazyRender={false}
  800. class={'popupBottomSearch'}
  801. onOpen={() => {
  802. forms.schoolPopupShow = true;
  803. }}
  804. onClosed={() => {
  805. forms.schoolPopupShow = false;
  806. }}>
  807. {forms.schoolPopupShow && (
  808. <div>
  809. <Picker
  810. class="cityPopBox"
  811. showToolbar
  812. v-model={forms.schoolPopupIndex}
  813. columns={forms.schoolAreaList}
  814. loading={forms.schoolLoading}
  815. columnsFieldNames={{
  816. text: 'name',
  817. value: 'id'
  818. }}
  819. onCancel={() => (forms.schoolStatus = false)}
  820. onConfirm={(val: any) => {
  821. const selectedOption = val.selectedOptions[0];
  822. forms.schoolAreaId = selectedOption.id || null;
  823. forms.schoolPopupIndex = forms.schoolAreaId ? [forms.schoolAreaId] : [];
  824. forms.schoolName = selectedOption.name;
  825. forms.schoolStatus = false;
  826. forms.currentGrade = null;
  827. forms.currentClass = null;
  828. // console.log('学校id',forms.schoolAreaId,selectedOption)
  829. // getSchoolAreaDetail();
  830. }}>
  831. {{
  832. 'columns-top': (
  833. <div class={styles.columnsTop}>
  834. <Cell border={false} clickable={false} title={forms.areaName || '请选择省市区'} isLink onClick={() => {
  835. forms.showPicker = true;
  836. }} />
  837. <MSearch
  838. placeholder="请输入学校名称"
  839. onSearch={(val: any) => {
  840. getSchoolAreaList(val);
  841. }}
  842. onSearchUpdate={(val: any) => {
  843. getSchoolAreaList(val);
  844. }}
  845. />
  846. </div>
  847. ),
  848. option: (item: any, index: number) => (
  849. <div class={styles.columnsContent} v-html={highlightText(item.name)} key={index}></div>
  850. ),
  851. }}
  852. </Picker>
  853. </div>
  854. )}
  855. </Popup>
  856. {/* 年级 */}
  857. <Popup
  858. v-model:show={forms.gradeStatus}
  859. position="bottom"
  860. round
  861. safeAreaInsetBottom
  862. lazyRender={false}
  863. class={'popupBottomSearch'}
  864. onOpen={() => {
  865. forms.gradePopupShow = true;
  866. }}
  867. onClosed={() => {
  868. forms.gradePopupShow = false;
  869. }}>
  870. {forms.gradePopupShow && (
  871. <Picker
  872. showToolbar
  873. v-model={forms.gradeOptionIndex}
  874. columns={forms.gradeOptions}
  875. onCancel={() => (forms.gradeStatus = false)}
  876. onConfirm={(val: any) => {
  877. console.log('选择1111',val)
  878. // forms.gradeAndClassIndex = [val.selectedOptions[0].value, val.selectedOptions[1].value]
  879. // forms.currentGrade = val.selectedOptions[0].text;
  880. // forms.currentClass = val.selectedOptions[1].text;
  881. forms.currentGrade = val.selectedOptions[0].text
  882. forms.gradeOptionIndex = [val.selectedOptions[0].value]
  883. forms.gradeStatus = false;
  884. }}
  885. />
  886. )}
  887. </Popup>
  888. {/* 班级 */}
  889. <Popup
  890. v-model:show={forms.classStatus}
  891. position="bottom"
  892. round
  893. safeAreaInsetBottom
  894. lazyRender={false}
  895. class={'popupBottomSearch'}
  896. onOpen={() => {
  897. forms.gradePopupShow = true;
  898. }}
  899. onClosed={() => {
  900. forms.gradePopupShow = false;
  901. }}>
  902. {forms.gradePopupShow && (
  903. <Picker
  904. showToolbar
  905. v-model={forms.classOptionIndex}
  906. columns={forms.classOptions}
  907. onCancel={() => (forms.classStatus = false)}
  908. onConfirm={(val: any) => {
  909. console.log('选择1111',val)
  910. forms.currentClass = val.selectedOptions[0].text
  911. forms.classOptionIndex = [val.selectedOptions[0].value]
  912. forms.classStatus = false;
  913. }}
  914. />
  915. )}
  916. </Popup>
  917. </div>
  918. );
  919. }
  920. });