addMember.ts 18 KB

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