addMember.ts 18 KB

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