addMember.ts 18 KB

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