index.tsx 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. import { defineComponent, onMounted, onUnmounted, reactive, ref, nextTick, computed } 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. gradePopupShow: false,
  183. gradePopupIndex: [] as any, // 年级下拉索引
  184. classPopupShow: false,
  185. classPopupIndex: [] as any, // 班级下拉索引
  186. areaList: [] as any,
  187. showPicker: false,
  188. gradeAndClass: [gradeList, classList],
  189. gradeAndClassIndex: [] as any,
  190. submitLoading: false,
  191. id: null as any,
  192. code: null as any,
  193. })
  194. onMounted(async () => {
  195. queryDetail();
  196. getAreaList();
  197. });
  198. const getAppIdAndCode = async (url?: string) => {
  199. try {
  200. const { data } = await request.get(
  201. '/edu-app/open/paramConfig/wechatAppId'
  202. );
  203. // 判断是否有微信appId
  204. if (data) {
  205. closeToast();
  206. goWechatAuth(data, url);
  207. }
  208. } catch(e) {
  209. //
  210. console.log(e)
  211. }
  212. };
  213. if (browser().weixin) {
  214. //授权
  215. const openId = sessionStorage.getItem('active-open-id');
  216. forms.openId = openId;
  217. const code = getUrlCode();
  218. console.log(code, 'code')
  219. if (!code) {
  220. const newUrl =
  221. getHttpOrigin() +
  222. window.location.pathname +
  223. '#' +
  224. route.path +
  225. '?' +
  226. qs.stringify({
  227. ...route.query
  228. });
  229. getAppIdAndCode(newUrl);
  230. return '';
  231. } else {
  232. forms.code = code;
  233. }
  234. }
  235. const onPageShow = () => {
  236. console.log(forms.isPageHide, 'showInfo');
  237. if (forms.isPageHide) {
  238. window.location.reload();
  239. }
  240. };
  241. // 处理监听页面返回不刷新的问题
  242. window.addEventListener('pageshow', onPageShow);
  243. const onPageHide = () => {
  244. console.log(forms.isPageHide, 'showInfo');
  245. forms.isPageHide = true;
  246. };
  247. window.addEventListener('pagehide', onPageHide);
  248. const queryDetail = async () => {
  249. try {
  250. // 判断是否获取微信code码
  251. if (!forms.openId) return;
  252. const { data } = await request.get(
  253. '/edu-app/open/schoolMeetingQuestion/detail?openId=' + forms.openId
  254. );
  255. // console.log(12222,data)
  256. forms.provinceCode = data.provinceCode
  257. forms.cityCode = data.cityCode
  258. forms.districtCode = data.districtCode
  259. forms.currentClass = data.currentClass
  260. forms.currentGrade = data.currentGrade
  261. forms.phone = data.phone
  262. forms.prePhone = data.phone
  263. forms.username = data.username
  264. forms.schoolAreaId = data.schoolAreaId
  265. forms.schoolName = data.schoolName
  266. forms.supportFlag = data.supportFlag
  267. forms.participationFlag = data.participationFlag
  268. forms.areaName = data.provinceName + ' ' + data.cityName + ' ' + data.districtName
  269. const gradeIdx = gradeList.find(item => item.text === data.currentGrade)?.value || 1
  270. // @ts-ignore
  271. const classIdx = classList.find(item => item.text === data.currentClass)?.value || 1
  272. forms.gradeAndClassIndex = [gradeIdx, classIdx]
  273. getSchoolAreaList()
  274. } catch {
  275. //
  276. }
  277. }
  278. /** 手机号变更时清空验证码信息,用户信息 */
  279. const phoneChangeEmptyInfo = () => {
  280. };
  281. const onCodeSend = () => {
  282. forms.countDownStatus = false;
  283. nextTick(() => {
  284. countDownRef.value.start();
  285. });
  286. };
  287. const onSendCode = () => {
  288. // 发送验证码
  289. if (!checkPhone(forms.phone)) {
  290. return showToast('请输入正确的手机号码');
  291. }
  292. forms.imgCodeStatus = true;
  293. };
  294. const validatePhone = computed(() => {
  295. return checkPhone(forms.phone) ? true : false;
  296. });
  297. const onFinished = () => {
  298. forms.countDownStatus = true;
  299. countDownRef.value.reset();
  300. };
  301. const checkForm = (status = true) => {
  302. if (!forms.schoolAreaId) {
  303. showToast('请选择学校');
  304. return false;
  305. }
  306. if (!forms.username) {
  307. showToast('请输入姓名');
  308. return false;
  309. }
  310. if (!forms.currentClass) {
  311. showToast('请选择年级班级');
  312. return false;
  313. }
  314. if (forms.supportFlag === null) {
  315. showToast('请勾选是否支持学校数字化转型');
  316. return false;
  317. }
  318. if (forms.participationFlag === null) {
  319. showToast('请勾选是否愿意学生参加数字化转型');
  320. return false;
  321. }
  322. if (forms.participationFlag) {
  323. if (!checkPhone(forms.phone)) {
  324. status && showToast('请输入正确的手机号码');
  325. return false;
  326. } else if (!forms.smsCode) {
  327. status && showToast('请输入验证码');
  328. return false;
  329. }
  330. }
  331. return true;
  332. };
  333. const submitFill = async () => {
  334. if (checkForm()) {
  335. try {
  336. forms.submitLoading = true;
  337. const { currentClass, districtCode, currentGrade, participationFlag,cityCode, openId,provinceCode,smsCode,phone,schoolAreaId,supportFlag,username,id} = forms
  338. let params: any = {
  339. currentClass, districtCode, currentGrade, participationFlag,cityCode, openId,provinceCode,schoolAreaId,supportFlag,username
  340. }
  341. if (id) {
  342. params.id = id
  343. }
  344. if (participationFlag) {
  345. params.phone = phone
  346. params.smsCode = smsCode
  347. }
  348. const res = await request.post('/edu-app/open/schoolMeetingQuestion/save', {
  349. data: params
  350. });
  351. if (res.code === 200) {
  352. forms.successPopShow = true;
  353. forms.prePhone = forms.phone
  354. }
  355. forms.submitLoading = false;
  356. forms.countDownStatus = true;
  357. } catch {
  358. //
  359. forms.submitLoading = false;
  360. forms.countDownStatus = true;
  361. }
  362. }
  363. }
  364. const formateArea = (area: any[]) => {
  365. const province_list: { [_: string]: string } = {};
  366. const city_list: { [_: string]: string } = {};
  367. const county_list: { [_: string]: string } = {};
  368. area.forEach((item: any) => {
  369. province_list[item.code] = item.name;
  370. });
  371. area.forEach((item: any) => {
  372. item.areas?.forEach((city: any) => {
  373. city_list[city.code] = city.name;
  374. });
  375. });
  376. area.forEach((item: any) => {
  377. item.areas?.forEach((city: any) => {
  378. city.areas?.forEach((county: any) => {
  379. county_list[county.code] = county.name;
  380. });
  381. });
  382. });
  383. return {
  384. province_list,
  385. city_list,
  386. county_list
  387. };
  388. };
  389. const getAreaList = () => {
  390. api_sysAreaQueryAllProvince().then(res => {
  391. if (res?.code === 200) {
  392. forms.areaList = formateArea(res.data);
  393. }
  394. });
  395. };
  396. const openAreaPop = () => {
  397. console.log(11111)
  398. // forms.schoolStatus = true
  399. // 如果没有选省市区,默认打开省市区弹窗
  400. if (!forms.areaName) {
  401. forms.showPicker = true
  402. }
  403. }
  404. const getSchoolAreaList = async (name?: string) => {
  405. forms.schoolLoading = true;
  406. try {
  407. const { data } = await request.post('/edu-app/open/schoolArea/list', {
  408. data: {
  409. name,
  410. testFlag: true,
  411. provinceCode: forms.provinceCode,
  412. cityCode: forms.cityCode,
  413. regionCode: forms.districtCode
  414. }
  415. });
  416. forms.schoolAreaList = data;
  417. } catch {
  418. //
  419. }
  420. forms.schoolLoading = false;
  421. };
  422. const switchParticipationFlag = (val: boolean) => {
  423. forms.participationFlag = val
  424. if (!forms.participationFlag) {
  425. forms.phone = ''
  426. forms.smsCode = ''
  427. forms.countDownStatus = true
  428. }
  429. if (forms.participationFlag) {
  430. forms.phone = forms.prePhone
  431. }
  432. }
  433. // 获取地区学校详情
  434. const getSchoolAreaDetail = async () => {
  435. try {
  436. const { data } = await request.get(
  437. '/edu-app/open/schoolArea/detail/' + forms.schoolAreaId
  438. );
  439. console.log(data, 'data');
  440. if (data.school) {
  441. const schoolInfo = data.school || {};
  442. const schoolInstrumentList = schoolInfo.schoolInstrumentList || [];
  443. forms.schoolInstrumentSetType = schoolInfo.instrumentSetType;
  444. if (schoolInfo.instrumentSetType === 'SCHOOL') {
  445. const instrumentCode = schoolInstrumentList[0]?.instrumentCode;
  446. forms.gradeList = getGradeList(
  447. schoolInfo.gradeYear,
  448. instrumentCode
  449. );
  450. forms.classList = classList;
  451. } else if (schoolInfo.instrumentSetType === 'GRADE') {
  452. forms.gradeList = [];
  453. schoolInstrumentList.forEach((item: any) => {
  454. forms.gradeList.push({
  455. text: GRADE_ENUM[item.gradeNum],
  456. value: item.gradeNum,
  457. instrumentId: item.instrumentId,
  458. instrumentCode: item.instrumentCode
  459. });
  460. });
  461. forms.gradeList.sort((a: any, b: any) => a.value - b.value);
  462. forms.classList = classList;
  463. } else if (schoolInfo.instrumentSetType === 'CLASS') {
  464. // 班级
  465. const tempGradeList: any[] = [];
  466. schoolInstrumentList.forEach((item: any) => {
  467. if (!tempGradeList.includes(item.gradeNum)) {
  468. tempGradeList.push(item.gradeNum);
  469. }
  470. });
  471. const lastGradeList: any[] = [];
  472. tempGradeList.forEach((temp: any) => {
  473. const list = {
  474. text: GRADE_ENUM[temp],
  475. value: temp,
  476. instrumentId: '',
  477. instrumentCode: '',
  478. instrumentName: '',
  479. classList: [] as any
  480. };
  481. schoolInstrumentList.forEach((item: any) => {
  482. if (temp === item.gradeNum) {
  483. list.instrumentId = item.instrumentId;
  484. list.instrumentCode = item.instrumentCode;
  485. list.instrumentName = item.instrumentName;
  486. list.classList.push({
  487. text: item.classNum + '班',
  488. value: item.classNum,
  489. instrumentCode: item.instrumentCode
  490. });
  491. }
  492. });
  493. // 排序班级
  494. list.classList.sort((a: any, b: any) => a.value - b.value);
  495. lastGradeList.push(list);
  496. });
  497. lastGradeList.sort((a: any, b: any) => a.value - b.value);
  498. forms.gradeList = lastGradeList;
  499. forms.classList = [];
  500. } else {
  501. forms.gradeList = getGradeList(schoolInfo.gradeYear);
  502. forms.classList = classList;
  503. }
  504. } else {
  505. forms.schoolInstrumentSetType = '';
  506. forms.gradeList = getGradeList();
  507. forms.classList = classList;
  508. }
  509. } catch {
  510. //
  511. }
  512. };
  513. onUnmounted(() => {
  514. window.removeEventListener('pageshow', onPageShow);
  515. window.removeEventListener('pagehide', onPageHide);
  516. });
  517. return () => (
  518. <div class={styles['intention-page']}>
  519. <div class={styles.formBox}>
  520. <div class={styles.formItem}>
  521. <p>1. 学校</p>
  522. {
  523. forms.areaName || forms.schoolName ?
  524. <div class={[styles.valDone, forms.schoolName && styles.valDone2, forms.schoolStatus && styles.openVal]} onClick={() => forms.schoolStatus = true}>
  525. {forms.schoolName && <span class={styles.vdSchool}>{forms.schoolName}</span>}
  526. <span class={styles.vdArea}>{forms.areaName}</span>
  527. <i></i>
  528. </div> :
  529. <div class={[styles.valDot, styles.grayText, forms.schoolStatus && styles.openVal]} onClick={openAreaPop}>请选择学校<i></i></div>
  530. }
  531. <div></div>
  532. </div>
  533. <div class={styles.formItem}>
  534. <p>2. 学生姓名</p>
  535. <Field
  536. class={styles.valDot}
  537. clearable={false}
  538. inputAlign="left"
  539. placeholder="请输入学生姓名"
  540. autocomplete="off"
  541. maxlength={14}
  542. v-model={forms.username}>
  543. </Field>
  544. </div>
  545. <div class={styles.formItem}>
  546. <p>3. 年级班级</p>
  547. <div class={[styles.valDot, !forms.currentClass && styles.grayText, forms.gradeStatus && styles.openVal]}
  548. onClick={()=> forms.gradeStatus = true}>{forms.currentClass ? forms.currentGrade+forms.currentClass : '请选择年级班级'}<i></i></div>
  549. </div>
  550. <div class={styles.formItem}>
  551. <p>4. 在您了解以上数字化转型事项后,您是否支持学校开展音乐(器乐)课堂数字化转型</p>
  552. <div class={styles.selectItem}>
  553. {
  554. forms.supportList.map(item =>
  555. <div onClick={() => (forms.supportFlag = item.val)}>
  556. <i class={forms.supportFlag === item.val && styles.selectedIcon}></i>
  557. <span>{item.title}</span>
  558. </div>
  559. )
  560. }
  561. </div>
  562. </div>
  563. <div class={styles.formItem}>
  564. <p>5. 您是否愿意学生参加数字化转型<span>(注:以学生及家长自愿参加为原则。如愿意参加,家长需自行为学生准备好“器乐数字Ai”应用软件,市面上均有提供,大约300多元一年,学校不涉及任何收费行为。如不参加,学生按原有方式进行器乐课程学习)</span></p>
  565. <div class={styles.selectItem}>
  566. {
  567. forms.willingList.map(item =>
  568. <div onClick={() => switchParticipationFlag(item.val)}>
  569. <i class={forms.participationFlag === item.val && styles.selectedIcon}></i>
  570. <span>{item.title}</span>
  571. </div>
  572. )
  573. }
  574. </div>
  575. </div>
  576. {
  577. forms.participationFlag &&
  578. <div class={styles.formItem}>
  579. <p>联系方式</p>
  580. <Field
  581. class={styles.valDot}
  582. clearable={false}
  583. placeholder="请输入手机号码"
  584. type="digit"
  585. autocomplete="off"
  586. inputAlign="left"
  587. v-model={forms.phone}
  588. maxlength={11}
  589. onUpdate:modelValue={(val: any) => {
  590. phoneChangeEmptyInfo();
  591. }}>
  592. </Field>
  593. <Field
  594. class={[styles.valDot, styles.codeItem]}
  595. center
  596. clearable={false}
  597. inputAlign="left"
  598. placeholder="请输入验证码"
  599. autocomplete="off"
  600. type="number"
  601. v-model={forms.smsCode}
  602. maxlength={6}>
  603. {{
  604. button: () =>
  605. forms.countDownStatus ? (
  606. <span
  607. class={[
  608. styles.codeText,
  609. !validatePhone.value ? styles.codeTextDisabled : ''
  610. ]}
  611. onClick={onSendCode}>
  612. 获取验证码
  613. </span>
  614. ) : (
  615. <CountDown
  616. ref={(el: any) => (countDownRef.value = el)}
  617. auto-start={false}
  618. class={styles.countDown}
  619. time={forms.countDownTime}
  620. onFinish={onFinished}
  621. format="ss秒后重试"
  622. />
  623. )
  624. }}
  625. </Field>
  626. </div>
  627. }
  628. {
  629. forms.participationFlag !== null &&
  630. <img class={styles.bottomBtn} src={forms.participationFlag ? signupBtn : submitBtn}
  631. onClick={() => {
  632. if (forms.submitLoading) return;
  633. submitFill()
  634. }}
  635. />
  636. }
  637. </div>
  638. {/* 是否在微信中打开 */}
  639. {/* <OWxTip /> */}
  640. {forms.imgCodeStatus ? (
  641. <MImgCode
  642. v-model:value={forms.imgCodeStatus}
  643. phone={forms.phone}
  644. type="MEETING_QUESTION"
  645. onClose={() => {
  646. forms.imgCodeStatus = false;
  647. }}
  648. onSendCode={onCodeSend}
  649. />
  650. ) : null}
  651. {
  652. forms.successPopShow &&
  653. <div class={styles.successPop}>
  654. <div class={styles.successBox}>
  655. <img class={styles.sTitle} src={forms.participationFlag ? signSusIcon : subSusIcon} />
  656. <p>{forms.participationFlag ? '感谢您的参与' : '感谢您的宝贵意见'}</p>
  657. <img class={styles.sDone} src={doneIcon} onClick={() => {
  658. forms.successPopShow = false
  659. }} />
  660. </div>
  661. </div>
  662. }
  663. <Popup
  664. zIndex={2010}
  665. v-model:show={forms.showPicker}
  666. position="bottom"
  667. round
  668. class={'popupBottomSearch'}>
  669. <Area
  670. optionHeight={46}
  671. areaList={forms.areaList}
  672. onCancel={() => {
  673. forms.showPicker = false
  674. // if (!forms.areaName) {
  675. // forms.schoolStatus = false
  676. // }
  677. }}
  678. onConfirm={({ selectedOptions }) => {
  679. forms.provinceCode = selectedOptions[0].value;
  680. forms.cityCode = selectedOptions[1].value;
  681. forms.districtCode = selectedOptions[2]?.value;
  682. forms.areaName = selectedOptions
  683. .map((item: any) => item?.text)
  684. .join(' ');
  685. forms.showPicker = false;
  686. // if (!forms.areaName) {
  687. // forms.schoolStatus = false
  688. // }
  689. forms.schoolAreaId = null;
  690. forms.schoolName = '';
  691. forms.gradeNumText = '';
  692. forms.currentGrade = null;
  693. forms.currentClass = null;
  694. forms.currentClassText = '';
  695. // console.log('地址1')
  696. getSchoolAreaList();
  697. forms.schoolStatus = true
  698. }}
  699. />
  700. </Popup>
  701. {/* 互通学校 */}
  702. <Popup
  703. v-model:show={forms.schoolStatus}
  704. position="bottom"
  705. round
  706. safeAreaInsetBottom
  707. lazyRender={false}
  708. class={'popupBottomSearch'}
  709. onOpen={() => {
  710. forms.schoolPopupShow = true;
  711. }}
  712. onClosed={() => {
  713. forms.schoolPopupShow = false;
  714. }}>
  715. {forms.schoolPopupShow && (
  716. <div>
  717. <Picker
  718. showToolbar
  719. v-model={forms.schoolPopupIndex}
  720. columns={forms.schoolAreaList}
  721. loading={forms.schoolLoading}
  722. columnsFieldNames={{
  723. text: 'name',
  724. value: 'id'
  725. }}
  726. onCancel={() => (forms.schoolStatus = false)}
  727. onConfirm={(val: any) => {
  728. const selectedOption = val.selectedOptions[0];
  729. forms.schoolAreaId = selectedOption.id || null;
  730. forms.schoolName = selectedOption.name;
  731. forms.schoolStatus = false;
  732. forms.currentGrade = null;
  733. forms.currentClass = null;
  734. // console.log('学校id',forms.schoolAreaId,selectedOption)
  735. // getSchoolAreaDetail();
  736. }}>
  737. {{
  738. 'columns-top': (
  739. <div class={styles.columnsTop}>
  740. <Cell border={false} clickable={false} title={forms.areaName || '请选择省市区'} isLink onClick={() => {
  741. forms.showPicker = true;
  742. }} />
  743. <MSearch
  744. placeholder="请输入学校名称"
  745. onSearch={(val: any) => {
  746. getSchoolAreaList(val);
  747. }}
  748. />
  749. </div>
  750. )
  751. }}
  752. </Picker>
  753. </div>
  754. )}
  755. </Popup>
  756. {/* 年级班级 */}
  757. <Popup
  758. v-model:show={forms.gradeStatus}
  759. position="bottom"
  760. round
  761. safeAreaInsetBottom
  762. lazyRender={false}
  763. class={'popupBottomSearch'}
  764. onOpen={() => {
  765. forms.gradePopupShow = true;
  766. }}
  767. onClosed={() => {
  768. forms.gradePopupShow = false;
  769. }}>
  770. {forms.gradePopupShow && (
  771. <Picker
  772. showToolbar
  773. v-model={forms.gradeAndClassIndex}
  774. columns={forms.gradeAndClass}
  775. onCancel={() => (forms.gradeStatus = false)}
  776. onConfirm={(val: any) => {
  777. // console.log('选择1111',val)
  778. forms.gradeAndClassIndex = [val.selectedOptions[0].value, val.selectedOptions[1].value]
  779. forms.currentGrade = val.selectedOptions[0].text;
  780. forms.currentClass = val.selectedOptions[1].text;
  781. forms.gradeStatus = false;
  782. }}
  783. />
  784. )}
  785. </Popup>
  786. </div>
  787. );
  788. }
  789. });