index.tsx 32 KB

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