addMember.ts 19 KB

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