addMember.ts 18 KB

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