addMember.ts 18 KB

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