addMember.ts 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. import { api_schoolAreaDetail, api_schoolAreaList, api_sysAreaQueryAllProvince, api_userBeneficiarySave, api_userBeneficiaryUpdate, api_userBeneficiaryDetail } from "../../api/login";
  2. const classList: any = [];
  3. for (let i = 1; i <= 40; i++) {
  4. classList.push({ text: i + '班', value: i });
  5. }
  6. const GRADE_ENUM = {
  7. '1': '一年级',
  8. '2': '二年级',
  9. '3': '三年级',
  10. '4': '四年级',
  11. '5': '五年级',
  12. '6': '六年级',
  13. '7': '七年级',
  14. '8': '八年级',
  15. '9': '九年级'
  16. } as any;
  17. /** 获取年级 */
  18. const getGradeList = (gradeYear?: string, instrumentCode?: string) => {
  19. let tempList: any = [];
  20. const five = [
  21. { text: '一年级', value: 1, instrumentCode },
  22. { text: '二年级', value: 2, instrumentCode },
  23. { text: '三年级', value: 3, instrumentCode },
  24. { text: '四年级', value: 4, instrumentCode },
  25. { text: '五年级', value: 5, instrumentCode }
  26. ];
  27. const one = [{ text: '六年级', value: 6, instrumentCode }];
  28. const three = [
  29. { text: '七年级', value: 7, instrumentCode },
  30. { text: '八年级', value: 8, instrumentCode },
  31. { text: '九年级', value: 9, instrumentCode }
  32. ];
  33. if (gradeYear === 'FIVE_YEAR_SYSTEM') {
  34. tempList.push(...[...five]);
  35. } else if (gradeYear === 'SIX_YEAR_SYSTEM') {
  36. tempList.push(...[...five, ...one]);
  37. } else if (gradeYear === 'THREE_YEAR_SYSTEM') {
  38. tempList.push(...[...three]);
  39. } else if (gradeYear === 'FORE_YEAR_SYSTEM') {
  40. tempList.push(...[...one, ...three]);
  41. } else {
  42. tempList.push(...[...five, ...one, ...three]);
  43. }
  44. return tempList;
  45. };
  46. Page({
  47. data: {
  48. redirectUrl: "",
  49. id: "",
  50. phone: "",
  51. name: "",
  52. gender: "1",
  53. cacheArea: [] as { cityCode: string, shiftCityCode: string }[], // 临时存储的对应关系
  54. showArea: false,
  55. areaList: [] as any, // 省市区
  56. provinceCode: "", // 地区
  57. cityCode: "",
  58. regionCode: "",
  59. provinceName: "",
  60. cityName: "",
  61. regionName: "",
  62. showSchool: false,
  63. schoolLoading: false,
  64. schoolAreaList: [] as any,
  65. tempChangeSchoolAreaId: '', // 临时改变的学校id
  66. schoolAreaId: '', //学校
  67. schoolAreaName: '',
  68. schoolAreaIndex: 0,
  69. searchName: '',
  70. showGrade: false, //年级
  71. gradeList: [] as any,
  72. gradeId: "",
  73. gradeName: "",
  74. gradeIndex: 0,
  75. showClass: false, //班级
  76. classList: [] as any,
  77. classId: "",
  78. className: "",
  79. classIndex: 0,
  80. },
  81. async onLoad(options: any) {
  82. const { redirectUrl, id } = options;
  83. this.setData({
  84. redirectUrl,
  85. id
  86. })
  87. if (this.data.id) {
  88. wx.showLoading({
  89. title: '',
  90. })
  91. await this.getUserDetail()
  92. wx.hideLoading()
  93. } else {
  94. this.getAreas()
  95. }
  96. },
  97. async getUserDetail() {
  98. try {
  99. const { data } = await api_userBeneficiaryDetail(this.data.id)
  100. if (data.code === 200) {
  101. const params = data.data
  102. this.setData({
  103. phone: params.phone,
  104. name: params.name,
  105. gender: params.gender + "",
  106. provinceCode: params.provinceCode,
  107. cityCode: params.cityCode,
  108. regionCode: params.regionCode || "",
  109. provinceName: params.provinceName,
  110. cityName: params.cityName,
  111. regionName: params.regionName,
  112. schoolAreaId: params.schoolAreaId,
  113. schoolAreaName: params.schoolAreaName,
  114. gradeId: params.currentGradeNum,
  115. gradeName: GRADE_ENUM[params.currentGradeNum],
  116. classId: params.currentClass,
  117. className: params.currentClass + "班"
  118. })
  119. await this.getAreas()
  120. // 回显市区
  121. this.setData({
  122. cityCode: this.formateCityCode(true)
  123. })
  124. await this.getSchools()
  125. await this.getSchoolAreaDetail()
  126. // 学校index
  127. const schoolAreaIndex = this.data.schoolAreaList.findIndex(((item: any) => {
  128. return item.value === this.data.schoolAreaId
  129. }))
  130. // 获取学校列表之后 需要给tempChangeSchoolAreaId赋值 因为tempChangeSchoolAreaId默认选中第一个
  131. this.setData({
  132. tempChangeSchoolAreaId: params.schoolAreaId
  133. })
  134. // 筛选出年级 赋值班级
  135. const gradeIndex = (this.data.gradeList[0]?.values || []).findIndex((item: any) => {
  136. return item.value === params.currentGradeNum
  137. })
  138. const gradeData = this.data.gradeList[0]?.values[gradeIndex]
  139. const classListData = gradeData?.classList || classList
  140. // 班级index
  141. const classIndex = classListData.findIndex(((item: any) => {
  142. return item.value === this.data.classId
  143. }))
  144. this.setData({
  145. classList: [{
  146. values: classListData
  147. }]
  148. }, () => {
  149. // 不知道为啥 直接写在上面 gradeIndex 不能回显
  150. this.setData({
  151. schoolAreaIndex,
  152. gradeIndex,
  153. classIndex
  154. })
  155. })
  156. }
  157. } catch (e: any) {
  158. }
  159. },
  160. /** 选择男女 */
  161. onCheckGender(e: any) {
  162. const { dataset } = e.currentTarget
  163. this.setData({
  164. gender: dataset.gender
  165. })
  166. },
  167. /** 显示选择地区 */
  168. onShowAreaList() {
  169. this.setData({
  170. showArea: true
  171. })
  172. },
  173. /** 关闭选择地区 */
  174. onCloseAreaList() {
  175. this.setData({
  176. showArea: false
  177. })
  178. },
  179. /** 确定选择地区 */
  180. submitArea(e: any) {
  181. const selectedOptions: any = e.detail.values
  182. if (!selectedOptions || !selectedOptions[0]) {
  183. wx.showToast({
  184. title: '未选中值',
  185. icon: 'none'
  186. })
  187. return
  188. }
  189. if (selectedOptions[0].code == this.data.provinceCode && selectedOptions[1].code == this.data.cityCode && (selectedOptions[2]?.code || "") == this.data.regionCode) {
  190. this.setData({
  191. showArea: false
  192. })
  193. return
  194. }
  195. this.setData({
  196. provinceCode: selectedOptions[0].code,
  197. cityCode: selectedOptions[1].code,
  198. regionCode: selectedOptions[2]?.code || "",
  199. provinceName: selectedOptions[0].name,
  200. cityName: selectedOptions[1].name,
  201. regionName: selectedOptions[2]?.name || "",
  202. showArea: false,
  203. searchName: "",
  204. tempChangeSchoolAreaId: '',
  205. schoolAreaId: '',
  206. schoolAreaName: '',
  207. schoolAreaIndex: 0,
  208. gradeId: "",
  209. gradeName: "",
  210. gradeIndex: 0,
  211. classId: "",
  212. className: "",
  213. classIndex: 0
  214. }, () => {
  215. this.getSchools()
  216. })
  217. },
  218. /** 获取省市区 */
  219. async getAreas() {
  220. try {
  221. const { data } = await api_sysAreaQueryAllProvince({})
  222. this.setData({
  223. areaList: this.formateArea(data.data)
  224. })
  225. } catch {
  226. //
  227. }
  228. },
  229. formateArea(area: any[]) {
  230. const province_list: { [_: string]: string } = {};
  231. const city_list: { [_: string]: string } = {};
  232. const county_list: { [_: string]: string } = {};
  233. area.forEach((item: any) => {
  234. province_list[item.code] = item.name;
  235. });
  236. area.forEach((item: any) => {
  237. item.areas && item.areas.forEach((city: any, index: number) => {
  238. let code = city.code + ""
  239. // 某些数据不标准 这里需要转换一下
  240. if (code[4] !== "0" || code[5] !== "0") {
  241. // 现在把区域的数据改为市的
  242. const newCode = code.substring(0, 2) + (index < 10 ? `a${index}` : index < 20 ? `b${index - 10}` : index < 30 ? `c${index - 20}` : `d${index - 30}`) + "00";
  243. this.data.cacheArea.push({
  244. cityCode: code,
  245. shiftCityCode: newCode
  246. })
  247. code = newCode
  248. }
  249. city_list[code] = city.name;
  250. });
  251. });
  252. area.forEach((item: any) => {
  253. item.areas && item.areas.forEach((city: any) => {
  254. city.areas && city.areas.forEach((county: any) => {
  255. county_list[county.code] = county.name;
  256. });
  257. });
  258. });
  259. return {
  260. province_list,
  261. city_list,
  262. county_list
  263. };
  264. },
  265. // 转换
  266. formateCityCode(reverse?: boolean) {
  267. if (!this.data.regionCode && this.data.cityCode) {
  268. const cityCodeObj = this.data.cacheArea.find((item: any) => {
  269. return item[reverse ? "cityCode" : "shiftCityCode"] == this.data.cityCode
  270. })
  271. return cityCodeObj ? cityCodeObj[reverse ? "shiftCityCode" : "cityCode"] : ""
  272. }
  273. return this.data.cityCode
  274. },
  275. /** 选择学校 */
  276. onSelectSchool() {
  277. if (!this.data.provinceCode) {
  278. wx.showToast({
  279. title: '请先选择学校地区',
  280. icon: 'none'
  281. })
  282. return
  283. }
  284. this.setData({
  285. showSchool: true
  286. })
  287. },
  288. /** 关闭选择学校 */
  289. onCloseSchool() {
  290. this.setData({
  291. showSchool: false
  292. })
  293. },
  294. onChangeSchool(e: any) {
  295. const { value } = e.detail.value
  296. this.setData({
  297. tempChangeSchoolAreaId: value
  298. })
  299. },
  300. onSearchChange(e: any) {
  301. this.setData({
  302. searchName: e.detail
  303. })
  304. },
  305. onSearch() {
  306. this.getSchools(this.data.searchName);
  307. },
  308. /** 确定选择学校 */
  309. onSubmitSchool() {
  310. if (!this.data.tempChangeSchoolAreaId) {
  311. wx.showToast({
  312. title: '未选中值',
  313. icon: 'none'
  314. })
  315. return
  316. }
  317. const schoolAreaIndex = this.data.schoolAreaList.findIndex((item: any) => item.value === this.data.tempChangeSchoolAreaId)
  318. const detail = this.data.schoolAreaList[schoolAreaIndex]
  319. if (detail.value == this.data.schoolAreaId) {
  320. this.setData({
  321. showSchool: false
  322. })
  323. return
  324. }
  325. this.setData({
  326. schoolAreaIndex,
  327. schoolAreaName: detail.text,
  328. schoolAreaId: detail.value,
  329. showSchool: false,
  330. gradeId: "",
  331. gradeName: "",
  332. gradeIndex: 0,
  333. classId: "",
  334. className: "",
  335. classIndex: 0,
  336. }, () => {
  337. this.getSchoolAreaDetail()
  338. })
  339. },
  340. /** 获取学校列表 */
  341. async getSchools(name?: string) {
  342. this.setData({
  343. schoolLoading: true
  344. })
  345. try {
  346. // 判断是否有地区信息
  347. if (!this.data.provinceCode || !this.data.cityCode) {
  348. return
  349. }
  350. // 转换CityCode
  351. const citycode = this.formateCityCode()
  352. const { data } = await api_schoolAreaList({
  353. name,
  354. testFlag: true,
  355. provinceCode: this.data.provinceCode,
  356. cityCode: citycode,
  357. regionCode: this.data.regionCode
  358. })
  359. const result = data.data || []
  360. const tempList: any[] = []
  361. result.forEach((item: any) => {
  362. tempList.push({
  363. text: item.name,
  364. value: item.id
  365. })
  366. })
  367. let tempSchoolId = ''
  368. if (tempList.length > 0) {
  369. const first = tempList[0]
  370. tempSchoolId = first.value || ''
  371. }
  372. this.setData({
  373. schoolAreaList: tempList,
  374. tempChangeSchoolAreaId: tempSchoolId
  375. })
  376. } catch {
  377. //
  378. }
  379. this.setData({
  380. schoolLoading: false
  381. })
  382. },
  383. /** 获取学校详情 */
  384. async getSchoolAreaDetail() {
  385. const { data } = await api_schoolAreaDetail({ id: this.data.schoolAreaId })
  386. const result = data.data || {}
  387. if (result.school) {
  388. const schoolInfo = result.school || {};
  389. const schoolInstrumentList = schoolInfo.schoolInstrumentList || [];
  390. if (schoolInfo.instrumentSetType === 'SCHOOL') {
  391. const gradeClassList = [{
  392. values: getGradeList(schoolInfo.gradeYear),
  393. }]
  394. this.setData({
  395. gradeList: gradeClassList
  396. })
  397. } else if (schoolInfo.instrumentSetType === 'GRADE') {
  398. const gradeList: any = []
  399. schoolInstrumentList.forEach((item: any) => {
  400. gradeList.push({
  401. text: GRADE_ENUM[item.gradeNum],
  402. value: item.gradeNum,
  403. instrumentId: item.instrumentId
  404. })
  405. });
  406. gradeList.sort((a: any, b: any) => a.value - b.value);
  407. const gradeClassList = [{
  408. values: gradeList
  409. }]
  410. this.setData({
  411. gradeList: gradeClassList,
  412. })
  413. } else if (schoolInfo.instrumentSetType === 'CLASS') {
  414. // // 班级
  415. const tempGradeList: any[] = [];
  416. schoolInstrumentList.forEach((item: any) => {
  417. if (!tempGradeList.includes(item.gradeNum)) {
  418. tempGradeList.push(item.gradeNum);
  419. }
  420. });
  421. const lastGradeList: any[] = [];
  422. tempGradeList.forEach((temp: any) => {
  423. const list = {
  424. text: GRADE_ENUM[temp],
  425. value: temp,
  426. instrumentId: '',
  427. instrumentCode: '',
  428. instrumentName: '',
  429. classList: [] as any
  430. };
  431. schoolInstrumentList.forEach((item: any) => {
  432. if (temp === item.gradeNum) {
  433. list.instrumentId = item.instrumentId;
  434. list.instrumentCode = item.instrumentCode;
  435. list.instrumentName = item.instrumentName;
  436. list.classList.push({
  437. text: item.classNum + '班',
  438. value: item.classNum,
  439. instrumentCode: item.instrumentCode
  440. });
  441. }
  442. });
  443. // 排序班级
  444. list.classList.sort((a: any, b: any) => a.value - b.value);
  445. lastGradeList.push(list);
  446. });
  447. lastGradeList.sort((a: any, b: any) => a.value - b.value);
  448. console.log(lastGradeList, 'lastGradeList')
  449. this.setData({
  450. gradeList: [{
  451. values: lastGradeList
  452. }]
  453. })
  454. } else {
  455. const gradeClassList = [{
  456. values: getGradeList(),
  457. }]
  458. this.setData({
  459. gradeList: gradeClassList
  460. })
  461. }
  462. } else {
  463. const gradeClassList = [{
  464. values: getGradeList(),
  465. }]
  466. this.setData({
  467. gradeList: gradeClassList
  468. })
  469. }
  470. },
  471. /** 选择年级 */
  472. onSelectGrade() {
  473. if (!this.data.schoolAreaId) {
  474. wx.showToast({
  475. title: '请先选择学校',
  476. icon: 'none'
  477. })
  478. return
  479. }
  480. this.setData({
  481. showGrade: true
  482. })
  483. },
  484. onCloseGrade() {
  485. this.setData({
  486. showGrade: false
  487. })
  488. },
  489. /** 确认选择年级 */
  490. onSubmitGrade(e: any) {
  491. const selectedOptions: any = e.detail.value
  492. if (!selectedOptions || !selectedOptions[selectedOptions.length - 1]) {
  493. wx.showToast({
  494. title: '未选中值',
  495. icon: 'none'
  496. })
  497. return
  498. }
  499. const gradeIndex = (this.data.gradeList[0]?.values || []).findIndex((item: any) => {
  500. return item.value === selectedOptions[0].value
  501. })
  502. if (selectedOptions[0].value == this.data.gradeId) {
  503. this.setData({
  504. showGrade: false
  505. })
  506. return
  507. }
  508. this.setData({
  509. gradeId: selectedOptions[0].value,
  510. gradeName: selectedOptions[0].text,
  511. showGrade: false,
  512. gradeIndex,
  513. classId: "",
  514. className: "",
  515. classIndex: 0,
  516. })
  517. this.setData({
  518. classList: [{
  519. values: selectedOptions[0].classList || classList
  520. }]
  521. })
  522. },
  523. /** 选择班级 */
  524. onSelectClass() {
  525. if (!this.data.gradeId) {
  526. wx.showToast({
  527. title: '请先选择年级',
  528. icon: 'none'
  529. })
  530. return
  531. }
  532. this.setData({
  533. showClass: true
  534. })
  535. },
  536. onCloseClass() {
  537. this.setData({
  538. showClass: false
  539. })
  540. },
  541. /** 确认选择班级 */
  542. onSubmitClass(e: any) {
  543. const selectedOptions: any = e.detail.value
  544. if (!selectedOptions || !selectedOptions[selectedOptions.length - 1]) {
  545. wx.showToast({
  546. title: '未选中值',
  547. icon: 'none'
  548. })
  549. return
  550. }
  551. // 班级index
  552. const classIndex = (this.data.classList[0]?.values || []).findIndex(((item: any) => {
  553. return item.value === selectedOptions[0].value
  554. }))
  555. if (selectedOptions[0].value == this.data.classId) {
  556. this.setData({
  557. showClass: false
  558. })
  559. return
  560. }
  561. this.setData({
  562. classId: selectedOptions[0].value,
  563. className: selectedOptions[0].text,
  564. classIndex,
  565. showClass: false
  566. })
  567. },
  568. messageName(value: string) {
  569. const nameReg = /^[\u4E00-\u9FA5]+$/
  570. if (!value) {
  571. return '请输入学生姓名';
  572. } else if (!nameReg.test(value)) {
  573. return '学生姓名必须为中文';
  574. } else if (value.length < 2 || value.length > 14) {
  575. return '学生姓名必须为2~14个字';
  576. } else {
  577. return ''
  578. }
  579. },
  580. /** 最终提交 */
  581. async onSubmit() {
  582. try {
  583. const params = this.data
  584. if (!params.phone || !/^1[3456789]\d{9}$/.test(params.phone)) {
  585. wx.showToast({
  586. title: '请输入正确的手机号',
  587. icon: "none"
  588. })
  589. return
  590. }
  591. const mesName = this.messageName(params.name)
  592. if (mesName) {
  593. wx.showToast({
  594. title: mesName,
  595. icon: "none"
  596. })
  597. return
  598. }
  599. if (!params.provinceCode || !params.cityCode) {
  600. wx.showToast({
  601. title: '请选择学校地区',
  602. icon: "none"
  603. })
  604. return
  605. }
  606. if (!params.schoolAreaId) {
  607. wx.showToast({
  608. title: '请选择学校',
  609. icon: "none"
  610. })
  611. return
  612. }
  613. if (!params.gradeId) {
  614. wx.showToast({
  615. title: '请选择年级',
  616. icon: "none"
  617. })
  618. return
  619. }
  620. if (!params.classId) {
  621. wx.showToast({
  622. title: '请选择班级',
  623. icon: "none"
  624. })
  625. return
  626. }
  627. const pages = getCurrentPages();
  628. const prevPage = pages[pages.length - 2]; // 获取上一个页面实例
  629. wx.showLoading({
  630. mask: true,
  631. title: "",
  632. });
  633. // 编辑
  634. if (params.id) {
  635. await api_userBeneficiaryUpdate({
  636. id: params.id,
  637. phone: params.phone,
  638. name: params.name,
  639. gender: params.gender,
  640. currentGradeNum: params.gradeId,
  641. currentClass: params.classId,
  642. schoolAreaId: params.schoolAreaId,
  643. defaultStatus: false
  644. })
  645. wx.showToast({
  646. title: '保存成功',
  647. icon: 'none'
  648. })
  649. } else {
  650. const { data } = await api_userBeneficiarySave({
  651. "phone": params.phone,
  652. "name": params.name,
  653. "gender": params.gender,
  654. "currentGradeNum": params.gradeId,
  655. "currentClass": params.classId,
  656. "schoolAreaId": params.schoolAreaId,
  657. defaultStatus: false
  658. })
  659. if (this.data.redirectUrl === "index") {
  660. prevPage.setData({ memberInfo: { id: data.data.id, name: params.name, phone: params.phone, schoolInfo: params.provinceName + params.cityName + (params.regionName || "") + params.schoolAreaName + params.gradeName + params.className } });
  661. }
  662. wx.showToast({
  663. title: '保存成功',
  664. icon: 'none'
  665. })
  666. }
  667. wx.hideLoading()
  668. wx.navigateBack()
  669. } catch {
  670. wx.hideLoading()
  671. //
  672. }
  673. },
  674. })