addMember.ts 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613
  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. showArea: false,
  54. areaList: [] as any, // 省市区
  55. provinceCode: null, // 地区
  56. cityCode: null,
  57. regionCode: null,
  58. provinceName: "",
  59. cityName: "",
  60. regionName: "",
  61. showSchool: false,
  62. schoolLoading: false,
  63. schoolAreaList: [] as any,
  64. tempChangeSchoolAreaId: '', // 临时改变的学校id
  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. },
  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. await this.getSchools()
  120. await this.getSchoolAreaDetail()
  121. // 学校index
  122. const schoolAreaIndex = this.data.schoolAreaList.findIndex(((item: any) => {
  123. return item.value === this.data.schoolAreaId
  124. }))
  125. // 筛选出年级 赋值班级
  126. const gradeIndex = (this.data.gradeList[0]?.values || []).findIndex((item: any) => {
  127. return item.value === params.currentGradeNum
  128. })
  129. const gradeData = this.data.gradeList[0]?.values[gradeIndex]
  130. const classListData = gradeData?.classList || classList
  131. // 班级index
  132. const classIndex = classListData.findIndex(((item: any) => {
  133. return item.value === this.data.classId
  134. }))
  135. this.setData({
  136. classList: [{
  137. values: classListData
  138. }]
  139. }, () => {
  140. // 不知道为啥 直接写在上面 gradeIndex 不能回显
  141. this.setData({
  142. schoolAreaIndex,
  143. gradeIndex,
  144. classIndex
  145. })
  146. })
  147. }
  148. } catch (e: any) {
  149. }
  150. },
  151. /** 选择男女 */
  152. onCheckGender(e: any) {
  153. const { dataset } = e.target
  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[selectedOptions.length - 1]) {
  174. wx.showToast({
  175. title: '未选中值',
  176. icon: 'none'
  177. })
  178. return
  179. }
  180. this.setData({
  181. provinceCode: selectedOptions[0].code,
  182. cityCode: selectedOptions[1].code,
  183. regionCode: selectedOptions[2].code,
  184. provinceName: selectedOptions[0].name,
  185. cityName: selectedOptions[1].name,
  186. regionName: selectedOptions[2].name,
  187. showArea: false,
  188. searchName: "",
  189. tempChangeSchoolAreaId: '',
  190. schoolAreaId: '',
  191. schoolAreaName: '',
  192. gradeId: "",
  193. gradeName: "",
  194. classId: "",
  195. className: ""
  196. }, () => {
  197. this.getSchools()
  198. })
  199. },
  200. /** 获取省市区 */
  201. async getAreas() {
  202. try {
  203. const { data } = await api_sysAreaQueryAllProvince({})
  204. this.setData({
  205. areaList: this.formateArea(data.data)
  206. })
  207. } catch {
  208. //
  209. }
  210. },
  211. formateArea(area: any[]) {
  212. const province_list: { [_: string]: string } = {};
  213. const city_list: { [_: string]: string } = {};
  214. const county_list: { [_: string]: string } = {};
  215. area.forEach((item: any) => {
  216. province_list[item.code] = item.name;
  217. });
  218. area.forEach((item: any) => {
  219. item.areas && item.areas.forEach((city: any) => {
  220. city_list[city.code] = city.name;
  221. });
  222. });
  223. area.forEach((item: any) => {
  224. item.areas && item.areas.forEach((city: any) => {
  225. city.areas && city.areas.forEach((county: any) => {
  226. county_list[county.code] = county.name;
  227. });
  228. });
  229. });
  230. return {
  231. province_list,
  232. city_list,
  233. county_list
  234. };
  235. },
  236. /** 选择学校 */
  237. onSelectSchool() {
  238. if (!this.data.provinceName) {
  239. wx.showToast({
  240. title: '请先选择学校地区',
  241. icon: 'none'
  242. })
  243. return
  244. }
  245. this.setData({
  246. showSchool: true
  247. })
  248. },
  249. /** 关闭选择学校 */
  250. onCloseSchool() {
  251. this.setData({
  252. showSchool: false
  253. })
  254. },
  255. onChangeSchool(e: any) {
  256. const { value } = e.detail.value
  257. this.setData({
  258. tempChangeSchoolAreaId: value
  259. })
  260. },
  261. onSearchChange(e: any) {
  262. this.setData({
  263. searchName: e.detail
  264. })
  265. },
  266. onSearch() {
  267. this.getSchools(this.data.searchName);
  268. },
  269. /** 确定选择学校 */
  270. onSubmitSchool() {
  271. if (!this.data.tempChangeSchoolAreaId) {
  272. wx.showToast({
  273. title: '未选中值',
  274. icon: 'none'
  275. })
  276. return
  277. }
  278. const detail = this.data.schoolAreaList.find((item: any) => item.value === this.data.tempChangeSchoolAreaId)
  279. this.setData({
  280. schoolAreaName: detail.text,
  281. schoolAreaId: detail.value,
  282. showSchool: false,
  283. gradeId: "",
  284. gradeName: "",
  285. classId: "",
  286. className: ""
  287. }, () => {
  288. this.getSchoolAreaDetail()
  289. })
  290. },
  291. /** 获取学校列表 */
  292. async getSchools(name?: string) {
  293. this.setData({
  294. schoolLoading: true
  295. })
  296. try {
  297. // 判断是否有地区信息
  298. if (!this.data.provinceCode || !this.data.cityCode || !this.data.regionCode) {
  299. return
  300. }
  301. const { data } = await api_schoolAreaList({
  302. name,
  303. testFlag: true,
  304. provinceCode: this.data.provinceCode,
  305. cityCode: this.data.cityCode,
  306. regionCode: this.data.regionCode
  307. })
  308. const result = data.data || []
  309. const tempList: any[] = []
  310. result.forEach((item: any) => {
  311. tempList.push({
  312. text: item.name,
  313. value: item.id
  314. })
  315. })
  316. let tempSchoolId = ''
  317. if (tempList.length > 0) {
  318. const first = tempList[0]
  319. tempSchoolId = first.value || ''
  320. }
  321. this.setData({
  322. schoolAreaList: tempList,
  323. tempChangeSchoolAreaId: tempSchoolId
  324. })
  325. } catch {
  326. //
  327. }
  328. this.setData({
  329. schoolLoading: false
  330. })
  331. },
  332. /** 获取学校详情 */
  333. async getSchoolAreaDetail() {
  334. const { data } = await api_schoolAreaDetail({ id: this.data.schoolAreaId })
  335. const result = data.data || {}
  336. if (result.school) {
  337. const schoolInfo = result.school || {};
  338. const schoolInstrumentList = schoolInfo.schoolInstrumentList || [];
  339. if (schoolInfo.instrumentSetType === 'SCHOOL') {
  340. const gradeClassList = [{
  341. values: getGradeList(schoolInfo.gradeYear),
  342. }]
  343. this.setData({
  344. gradeList: gradeClassList
  345. })
  346. } else if (schoolInfo.instrumentSetType === 'GRADE') {
  347. const gradeList: any = []
  348. schoolInstrumentList.forEach((item: any) => {
  349. gradeList.push({
  350. text: GRADE_ENUM[item.gradeNum],
  351. value: item.gradeNum,
  352. instrumentId: item.instrumentId
  353. })
  354. });
  355. gradeList.sort((a: any, b: any) => a.value - b.value);
  356. const gradeClassList = [{
  357. values: gradeList
  358. }]
  359. this.setData({
  360. gradeList: gradeClassList,
  361. })
  362. } else if (schoolInfo.instrumentSetType === 'CLASS') {
  363. // // 班级
  364. const tempGradeList: any[] = [];
  365. schoolInstrumentList.forEach((item: any) => {
  366. if (!tempGradeList.includes(item.gradeNum)) {
  367. tempGradeList.push(item.gradeNum);
  368. }
  369. });
  370. const lastGradeList: any[] = [];
  371. tempGradeList.forEach((temp: any) => {
  372. const list = {
  373. text: GRADE_ENUM[temp],
  374. value: temp,
  375. instrumentId: '',
  376. instrumentCode: '',
  377. instrumentName: '',
  378. classList: [] as any
  379. };
  380. schoolInstrumentList.forEach((item: any) => {
  381. if (temp === item.gradeNum) {
  382. list.instrumentId = item.instrumentId;
  383. list.instrumentCode = item.instrumentCode;
  384. list.instrumentName = item.instrumentName;
  385. list.classList.push({
  386. text: item.classNum + '班',
  387. value: item.classNum,
  388. instrumentCode: item.instrumentCode
  389. });
  390. }
  391. });
  392. // 排序班级
  393. list.classList.sort((a: any, b: any) => a.value - b.value);
  394. lastGradeList.push(list);
  395. });
  396. lastGradeList.sort((a: any, b: any) => a.value - b.value);
  397. console.log(lastGradeList, 'lastGradeList')
  398. this.setData({
  399. gradeList: [{
  400. values: lastGradeList
  401. }]
  402. })
  403. } else {
  404. const gradeClassList = [{
  405. values: getGradeList(),
  406. }]
  407. this.setData({
  408. gradeList: gradeClassList
  409. })
  410. }
  411. } else {
  412. const gradeClassList = [{
  413. values: getGradeList(),
  414. }]
  415. this.setData({
  416. gradeList: gradeClassList
  417. })
  418. }
  419. },
  420. /** 选择年级 */
  421. onSelectGrade() {
  422. if (!this.data.schoolAreaId) {
  423. wx.showToast({
  424. title: '请先选择学校',
  425. icon: 'none'
  426. })
  427. return
  428. }
  429. this.setData({
  430. showGrade: true
  431. })
  432. },
  433. onCloseGrade() {
  434. this.setData({
  435. showGrade: false
  436. })
  437. },
  438. /** 确认选择年级 */
  439. onSubmitGrade(e: any) {
  440. const selectedOptions: any = e.detail.value
  441. if (!selectedOptions || !selectedOptions[selectedOptions.length - 1]) {
  442. wx.showToast({
  443. title: '未选中值',
  444. icon: 'none'
  445. })
  446. return
  447. }
  448. this.setData({
  449. gradeId: selectedOptions[0].value,
  450. gradeName: selectedOptions[0].text,
  451. showGrade: false,
  452. classId: "",
  453. className: ""
  454. })
  455. this.setData({
  456. classList: [{
  457. values: selectedOptions[0].classList || classList
  458. }]
  459. })
  460. },
  461. /** 选择班级 */
  462. onSelectClass() {
  463. if (!this.data.gradeId) {
  464. wx.showToast({
  465. title: '请先选择年级',
  466. icon: 'none'
  467. })
  468. return
  469. }
  470. this.setData({
  471. showClass: true
  472. })
  473. },
  474. onCloseClass() {
  475. this.setData({
  476. showClass: false
  477. })
  478. },
  479. /** 确认选择班级 */
  480. onSubmitClass(e: any) {
  481. const selectedOptions: any = e.detail.value
  482. if (!selectedOptions || !selectedOptions[selectedOptions.length - 1]) {
  483. wx.showToast({
  484. title: '未选中值',
  485. icon: 'none'
  486. })
  487. return
  488. }
  489. this.setData({
  490. classId: selectedOptions[0].value,
  491. className: selectedOptions[0].text,
  492. showClass: false
  493. })
  494. },
  495. /** 最终提交 */
  496. async onSubmit() {
  497. try {
  498. const params = this.data
  499. if (!params.phone || !/^1[3456789]\d{9}$/.test(params.phone)) {
  500. wx.showToast({
  501. title: '请输入正确的手机号',
  502. icon: "none"
  503. })
  504. return
  505. }
  506. if (!params.name) {
  507. wx.showToast({
  508. title: '请输入学生姓名',
  509. icon: "none"
  510. })
  511. return
  512. }
  513. if (!params.provinceCode || !params.cityCode || !params.regionCode) {
  514. wx.showToast({
  515. title: '请选择学校地区',
  516. icon: "none"
  517. })
  518. return
  519. }
  520. if (!params.schoolAreaId) {
  521. wx.showToast({
  522. title: '请选择学校',
  523. icon: "none"
  524. })
  525. return
  526. }
  527. if (!params.gradeId) {
  528. wx.showToast({
  529. title: '请选择年级',
  530. icon: "none"
  531. })
  532. return
  533. }
  534. if (!params.classId) {
  535. wx.showToast({
  536. title: '请选择班级',
  537. icon: "none"
  538. })
  539. return
  540. }
  541. const pages = getCurrentPages();
  542. const prevPage = pages[pages.length - 2]; // 获取上一个页面实例
  543. wx.showLoading({
  544. mask: true,
  545. title: "",
  546. });
  547. // 编辑
  548. if (params.id) {
  549. await api_userBeneficiaryUpdate({
  550. id: params.id,
  551. phone: params.phone,
  552. name: params.name,
  553. gender: params.gender,
  554. currentGradeNum: params.gradeId,
  555. currentClass: params.classId,
  556. schoolAreaId: params.schoolAreaId,
  557. defaultStatus: false
  558. })
  559. wx.showToast({
  560. title: '保存成功',
  561. icon: 'none'
  562. })
  563. } else {
  564. const { data } = await api_userBeneficiarySave({
  565. "phone": params.phone,
  566. "name": params.name,
  567. "gender": params.gender,
  568. "currentGradeNum": params.gradeId,
  569. "currentClass": params.classId,
  570. "schoolAreaId": params.schoolAreaId,
  571. defaultStatus: false
  572. })
  573. if (this.data.redirectUrl === "index") {
  574. 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 } });
  575. }
  576. wx.showToast({
  577. title: '保存成功',
  578. icon: 'none'
  579. })
  580. }
  581. wx.hideLoading()
  582. wx.navigateBack()
  583. } catch {
  584. wx.hideLoading()
  585. //
  586. }
  587. },
  588. })