studentList.vue 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 学员管理
  6. </h2>
  7. <div class="m-core">
  8. <!-- 搜索标题 -->
  9. <save-form
  10. :inline="true"
  11. class="searchForm"
  12. @submit="onSearch"
  13. @reset="onReSet"
  14. ref="saveForm"
  15. :model.sync="searchForm"
  16. >
  17. <el-form-item>
  18. <el-input
  19. clearable
  20. placeholder="学生姓名或电话"
  21. @keydown.enter.native="
  22. (e) => {
  23. e.target.blur();
  24. $refs.saveForm.save();
  25. onSearch();
  26. }
  27. "
  28. v-model.trim="searchForm.search"
  29. ></el-input>
  30. </el-form-item>
  31. <el-form-item prop="organId">
  32. <el-select
  33. class="multiple"
  34. filterable
  35. v-model.trim="searchForm.organId"
  36. multiple
  37. collapse-tags
  38. clearable
  39. placeholder="请选择分部"
  40. >
  41. <el-option
  42. v-for="(item, index) in selects.branchs"
  43. :key="index"
  44. :label="item.name"
  45. :value="item.id"
  46. ></el-option>
  47. </el-select>
  48. </el-form-item>
  49. <!-- <el-form-item>
  50. <remote-search
  51. :commit="'setTeachers'"
  52. v-model="searchForm.teacherId"
  53. :isForzenWithQueryCondition="true"
  54. />
  55. </el-form-item> -->
  56. <el-form-item prop="hasMember">
  57. <el-select
  58. class="multiple"
  59. v-model.trim="searchForm.hasMember"
  60. clearable
  61. placeholder="是否是会员"
  62. >
  63. <el-option label="是" value="1"></el-option>
  64. <el-option label="否" value="0"></el-option>
  65. <el-option label="未生效" value="2"></el-option>
  66. </el-select>
  67. </el-form-item>
  68. <el-form-item prop="isActive">
  69. <el-select
  70. class="multiple"
  71. v-model.trim="searchForm.isActive"
  72. clearable
  73. placeholder="是否激活"
  74. >
  75. <el-option label="是" value="true"></el-option>
  76. <el-option label="否" value="false"></el-option>
  77. </el-select>
  78. </el-form-item>
  79. <el-form-item prop="hasTeacher">
  80. <el-select
  81. class="multiple"
  82. v-model.trim="searchForm.hasTeacher"
  83. clearable
  84. placeholder="是否关联老师"
  85. >
  86. <el-option label="是" value="1"></el-option>
  87. <el-option label="否" value="0"></el-option>
  88. </el-select>
  89. </el-form-item>
  90. <el-form-item prop="operatingTag" v-if="tenantId == 1">
  91. <el-select
  92. class="multiple"
  93. v-model.trim="searchForm.operatingTag"
  94. clearable
  95. placeholder="是否运营"
  96. >
  97. <el-option label="是" :value="1"></el-option>
  98. <el-option label="否" :value="0"></el-option>
  99. </el-select>
  100. </el-form-item>
  101. <el-form-item prop="serviceTag" v-if="tenantId == 1">
  102. <el-select
  103. class="multiple"
  104. v-model.trim="searchForm.serviceTag"
  105. clearable
  106. placeholder="是否服务"
  107. >
  108. <el-option label="是" :value="1"></el-option>
  109. <el-option label="否" :value="0"></el-option>
  110. </el-select>
  111. </el-form-item>
  112. <el-form-item prop="carePackage">
  113. <el-select
  114. class="multiple"
  115. v-model.trim="searchForm.carePackage"
  116. clearable
  117. placeholder="关心包"
  118. >
  119. <el-option label="不可用" :value="0"></el-option>
  120. <el-option label="可用" :value="1"></el-option>
  121. <el-option label="已使用" :value="2"></el-option>
  122. </el-select>
  123. </el-form-item>
  124. <el-form-item prop="comeOnPackage">
  125. <el-select
  126. class="multiple"
  127. v-model.trim="searchForm.comeOnPackage"
  128. clearable
  129. placeholder="加油包"
  130. >
  131. <el-option label="不可用" :value="0"></el-option>
  132. <el-option label="可用" :value="1"></el-option>
  133. <el-option label="已使用" :value="2"></el-option>
  134. </el-select>
  135. </el-form-item>
  136. <el-form-item prop="isNewUser">
  137. <el-select
  138. class="multiple"
  139. v-model.trim="searchForm.isNewUser"
  140. clearable
  141. placeholder="是否是新用户"
  142. >
  143. <el-option label="是" :value="1"></el-option>
  144. <el-option label="否" :value="0"></el-option>
  145. </el-select>
  146. </el-form-item>
  147. <el-form-item prop="isRecord">
  148. <el-select
  149. class="multiple"
  150. v-model.trim="searchForm.isRecord"
  151. clearable
  152. placeholder="是否使用云教练"
  153. >
  154. <el-option label="是" value="1"></el-option>
  155. <el-option label="否" value="0"></el-option>
  156. </el-select>
  157. </el-form-item>
  158. <el-form-item>
  159. <el-button native-type="submit" type="danger">搜索</el-button>
  160. <el-button native-type="reset" type="primary">重置</el-button>
  161. <el-button
  162. type="primary"
  163. v-if="$helpers.permission('export/studentHasCourse')"
  164. @click="downLoadStudent"
  165. >导出名单</el-button
  166. >
  167. </el-form-item>
  168. </save-form>
  169. <el-button
  170. style="margin-bottom: 20px"
  171. type="primary"
  172. @click="addStudentMember"
  173. icon="el-icon-plus"
  174. >创建云教练缴费</el-button
  175. >
  176. <el-button
  177. v-if="$helpers.permission('studentManage/register')"
  178. @click="addStudent"
  179. type="primary"
  180. icon="el-icon-plus"
  181. style="margin-bottom: 20px"
  182. >
  183. 新增学员
  184. </el-button>
  185. <el-button
  186. @click="onCreateQRCode"
  187. type="primary"
  188. style="margin-bottom: 20px"
  189. >
  190. 学员激活列表
  191. </el-button>
  192. <!-- 列表 -->
  193. <div class="tableWrap">
  194. <el-table
  195. :data="tableList"
  196. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  197. @selection-change="handleSelectionChange"
  198. >
  199. <el-table-column type="selection" width="55"></el-table-column>
  200. <el-table-column type="expand">
  201. <template slot-scope="props">
  202. <el-form
  203. label-position="left"
  204. class="demo-table-expand"
  205. :inline="true"
  206. >
  207. <el-row>
  208. <el-col :span="6">
  209. <el-form-item label="所属学校">
  210. <div class="schoolWrap">
  211. <overflow-text
  212. width="100%"
  213. :text="props.row.cooperationOrganName"
  214. ></overflow-text>
  215. </div> </el-form-item
  216. ></el-col>
  217. <el-col :span="4">
  218. <el-form-item>
  219. <span slot="label"
  220. >是否激活
  221. <el-tooltip placement="top" popper-class="mTooltip">
  222. <div slot="content">学员是否设置密码</div>
  223. <i
  224. @click="
  225. () => {
  226. console.log('点击');
  227. }
  228. "
  229. class="el-icon-question question"
  230. style="
  231. font-size: 18px;
  232. color: #f56c6c;
  233. cursor: pointer;
  234. "
  235. ></i> </el-tooltip
  236. ></span>
  237. <div>{{ props.row.isActive ? "是" : "否" }}</div>
  238. </el-form-item></el-col
  239. >
  240. <el-col :span="4">
  241. <el-form-item label="课程余额(元)">
  242. <span>{{ props.row.courseBalance | moneyFormat }}</span>
  243. </el-form-item></el-col
  244. >
  245. <el-col :span="4">
  246. <el-form-item label="网管课剩余课时">
  247. <span>{{ props.row.noStartPracticeCourseNum }}</span>
  248. </el-form-item></el-col
  249. >
  250. <el-col :span="4">
  251. <el-form-item label="关心包">
  252. <span>
  253. {{ props.row.carePackage | studentPackage }}
  254. </span>
  255. </el-form-item></el-col
  256. >
  257. </el-row>
  258. <el-row>
  259. <!-- <el-col :span="6">
  260. <el-form-item label="指导老师">
  261. <span>{{ props.row.teacherName }}</span>
  262. </el-form-item></el-col
  263. > -->
  264. <el-col :span="6">
  265. <el-form-item label="是否运营" v-if="tenantId == 1">
  266. <span>{{ props.row.operatingTag ? "是" : "否" }}</span>
  267. </el-form-item></el-col
  268. >
  269. <el-col :span="4">
  270. <el-form-item label="账户余额(元)">
  271. <span>{{ props.row.balance | moneyFormat }}</span>
  272. </el-form-item></el-col
  273. >
  274. <el-col :span="4">
  275. <el-form-item label="vip课剩余课时">
  276. <span>{{ props.row.noStartVipCourseNum }}</span>
  277. </el-form-item></el-col
  278. >
  279. <el-col :span="4">
  280. <el-form-item label="加油包">
  281. <span>{{
  282. props.row.comeOnPackage | studentPackage
  283. }}</span>
  284. </el-form-item></el-col
  285. >
  286. </el-row>
  287. <el-row>
  288. <el-col :span="6">
  289. <el-form-item label="学员年级">
  290. <span>{{ props.row.currentGrade }}</span>
  291. </el-form-item></el-col
  292. >
  293. <el-col :span="6">
  294. <el-form-item label="学员班级">
  295. <span>{{ props.row.currentClass }}</span>
  296. </el-form-item></el-col
  297. >
  298. </el-row>
  299. </el-form>
  300. </template>
  301. </el-table-column>
  302. <el-table-column align="center" prop="organName" label="所属分部">
  303. <template slot-scope="scope">
  304. <copy-text>{{ scope.row.organName }}</copy-text>
  305. </template>
  306. </el-table-column>
  307. <el-table-column
  308. align="center"
  309. prop="userId"
  310. label="学员信息"
  311. width="140px"
  312. >
  313. <template slot-scope="scope">
  314. {{ scope.row.username }}
  315. ({{ scope.row.gender ? "男" : "女" }})<br />
  316. <copy-text>{{ scope.row.userId }}</copy-text>
  317. </template>
  318. </el-table-column>
  319. <!-- <el-table-column align="center" prop="username" label="学员姓名">
  320. <template slot-scope="scope"> </template>
  321. </el-table-column> -->
  322. <el-table-column
  323. align="center"
  324. prop="realName"
  325. label="家长信息"
  326. width="140px"
  327. >
  328. <template slot-scope="scope">
  329. {{ scope.row.realName }}
  330. <br />
  331. <copy-text>{{ scope.row.parentsPhone }}</copy-text>
  332. </template>
  333. </el-table-column>
  334. <el-table-column
  335. align="center"
  336. prop="subjectName"
  337. label="声部"
  338. ></el-table-column>
  339. <!-- <el-table-column
  340. align="center"
  341. prop="cooperationOrganName"
  342. label="所属学校"
  343. ></el-table-column> -->
  344. <!-- <el-table-column align="center" prop="teacherName" label="指导老师">
  345. <template slot-scope="scope">
  346. <copy-text>{{ scope.row.teacherName }}</copy-text>
  347. </template>
  348. </el-table-column> -->
  349. <!-- <el-table-column align="center" label="性别">
  350. <template slot-scope="scope"></template>
  351. </el-table-column> -->
  352. <!-- <el-table-column
  353. align="center"
  354. prop="leaveNum"
  355. label="本月请假次数"
  356. ></el-table-column> -->
  357. <!-- <el-table-column align="center">
  358. <template slot="header">
  359. <p style="position: relative">
  360. 是否激活
  361. <el-tooltip placement="top" popper-class="mTooltip">
  362. <div slot="content">学员是否设置密码</div>
  363. <i
  364. class="el-icon-question"
  365. style="font-size: 18px; color: #f56c6c"
  366. ></i>
  367. </el-tooltip>
  368. </p>
  369. </template>
  370. <template slot-scope="scope">{{
  371. scope.row.isActive ? "是" : "否"
  372. }}</template>
  373. </el-table-column> -->
  374. <el-table-column align="center" label="未上课时">
  375. <template slot-scope="scope">{{
  376. scope.row.hasCourse ? "有" : "无"
  377. }}</template>
  378. </el-table-column>
  379. <!-- <el-table-column align="center" label="预约网管课">
  380. <template slot-scope="scope">{{ scope.row.isMake ? '是' : '否' }}</template>
  381. </el-table-column> -->
  382. <!-- <el-table-column align="center" label="网管课剩余课时">
  383. <template slot-scope="scope">{{
  384. scope.row.noStartPracticeCourseNum
  385. }}</template>
  386. </el-table-column> -->
  387. <!-- <el-table-column align="center" label="vip课剩余课时">
  388. <template slot-scope="scope">{{
  389. scope.row.noStartVipCourseNum
  390. }}</template>
  391. </el-table-column> -->
  392. <!-- <el-table-column align="center" label="是否运营">
  393. <template slot-scope="scope">{{
  394. scope.row.operatingTag ? "是" : "否"
  395. }}</template>
  396. </el-table-column> -->
  397. <el-table-column align="center" label="是否服务" v-if="tenantId == 1">
  398. <template slot-scope="scope">{{
  399. scope.row.serviceTag ? "是" : "否"
  400. }}</template>
  401. </el-table-column>
  402. <el-table-column align="center" label="是否使用云教练">
  403. <template slot-scope="scope">{{
  404. scope.row.recordUserId > 0 ? "是" : "否"
  405. }}</template>
  406. </el-table-column>
  407. <el-table-column
  408. align="center"
  409. width="120px"
  410. prop="parentsPhone"
  411. label="会员截止日期(剩余天数)"
  412. >
  413. <template slot-scope="scope">
  414. <div v-if="scope.row.membershipEndTime">
  415. <div v-if="scope.row.membershipDay >= 0">
  416. {{ scope.row.membershipEndTime | dayjsFormat }}
  417. <p class="red">剩余{{ scope.row.membershipDay }}天</p>
  418. </div>
  419. <!-- 已过期 -->
  420. <div v-else>
  421. <!-- 有未生效 -->
  422. <div v-if="scope.row.hasNoStartCloudTeacher">
  423. <p>会员未生效</p>
  424. </div>
  425. <!-- 无未生效 -->
  426. <div v-else>
  427. {{ scope.row.membershipEndTime | dayjsFormat }}
  428. <p class="red" v-if="scope.row.membershipDay < 0">
  429. 已过期{{ Math.abs(scope.row.membershipDay) }}天
  430. </p>
  431. </div>
  432. </div>
  433. <!--
  434. <div></div>
  435. <p v-if="scope.row.hasNoStartCloudTeacher">
  436. {{ scope.row.membershipEndTime | dayjsFormat }}
  437. </p> -->
  438. </div>
  439. <div v-else class="red">
  440. <div v-if="scope.row.hasNoStartCloudTeacher">会员未生效</div>
  441. <div v-else>未购买会员</div>
  442. </div>
  443. </template>
  444. </el-table-column>
  445. <!-- <el-table-column
  446. label="会员试用结束日期(剩余天数)"
  447. align="center"
  448. width="120px;"
  449. >
  450. <template slot-scope="scope">
  451. <div>
  452. <p>
  453. {{ scope.row.experienceMembershipEndTime | dayjsFormat }}
  454. </p>
  455. <p
  456. class="red"
  457. v-if="
  458. scope.row.experienceMembershipEndTime &&
  459. scope.row.experienceMembershipDay >= 0
  460. "
  461. >
  462. 剩余{{ scope.row.experienceMembershipDay }}天
  463. </p>
  464. <p
  465. class="red"
  466. v-if="
  467. scope.row.membershipEndTime &&
  468. scope.row.experienceMembershipDay < 0
  469. "
  470. >
  471. 已过期{{ Math.abs(scope.row.experienceMembershipDay) }}天
  472. </p>
  473. </div>
  474. </template>
  475. </el-table-column> -->
  476. <el-table-column align="center" label="是否是新用户">
  477. <template slot="header">
  478. <p style="position: relative">
  479. 是否是新用户
  480. <el-tooltip placement="top" popper-class="mTooltip">
  481. <div slot="content">未购买VIP课程的学员为新用户</div>
  482. <i
  483. class="el-icon-question"
  484. style="font-size: 18px; color: #f56c6c; cursor: pointer"
  485. ></i>
  486. </el-tooltip>
  487. </p>
  488. </template>
  489. <template slot-scope="scope">
  490. {{ scope.row.isNewUser ? "是" : "否" }}
  491. </template>
  492. </el-table-column>
  493. <!-- <el-table-column
  494. align="center"
  495. prop="courseBalance"
  496. label="课程余额(元)"
  497. >
  498. <template slot-scope="scope">
  499. <div>
  500. {{ scope.row.courseBalance | moneyFormat }}
  501. </div>
  502. </template>
  503. </el-table-column> -->
  504. <!-- <el-table-column align="center" prop="balance" label="账户余额(元)">
  505. <template slot-scope="scope">
  506. <div>
  507. {{ scope.row.balance | moneyFormat }}
  508. </div>
  509. </template>
  510. </el-table-column> -->
  511. <!-- <el-table-column align="center" prop="carePackage" label="关心包">
  512. <template slot-scope="scope">{{
  513. scope.row.carePackage | studentPackage
  514. }}</template>
  515. </el-table-column>
  516. <el-table-column align="center" prop="comeOnPackage" label="加油包">
  517. <template slot-scope="scope">{{
  518. scope.row.comeOnPackage | studentPackage
  519. }}</template>
  520. </el-table-column> -->
  521. <el-table-column align="center" width="180px" label="操作">
  522. <template slot-scope="scope">
  523. <router-link
  524. v-if="$helpers.permission('/studentDetail')"
  525. class="el-button--text"
  526. :to="{
  527. path: `/business/studentDetail`,
  528. query: { ...scope.row },
  529. }"
  530. >查看</router-link
  531. >
  532. <el-button
  533. type="text"
  534. style="padding-left: 10px"
  535. v-if="
  536. $helpers.permission('studentManage/studentUpdate/setStudent')
  537. "
  538. @click="setStudent(scope.row)"
  539. >设置扩展声部</el-button
  540. >
  541. <el-button
  542. type="text"
  543. style="padding-left: 10px"
  544. v-if="$helpers.permission('studentManage/studentUpdate')"
  545. @click="resetStudent(scope.row)"
  546. >修改</el-button
  547. >
  548. <!-- api-auth/user/updatePassword2 -->
  549. <el-button
  550. v-if="$helpers.permission('api-auth/user/updatePassword2')"
  551. @click="resetPassWrod(scope.row)"
  552. type="text"
  553. >修改密码</el-button
  554. >
  555. <el-button
  556. v-if="
  557. scope.row.isSignedContract &&
  558. $helpers.permission('sysUserContracts/getLatest')
  559. "
  560. type="text"
  561. @click="lookContracts(scope.row)"
  562. >下载协议</el-button
  563. >
  564. </template>
  565. </el-table-column>
  566. </el-table>
  567. <pagination
  568. sync
  569. :total.sync="pageInfo.total"
  570. :page.sync="pageInfo.page"
  571. :limit.sync="pageInfo.limit"
  572. :page-sizes="pageInfo.page_size"
  573. @pagination="getList"
  574. />
  575. </div>
  576. </div>
  577. <el-dialog
  578. :title="maskName"
  579. width="700px"
  580. label-position="right"
  581. class="studentInfo"
  582. @close="onMaskClose('studentForm')"
  583. :close-on-click-modal="false"
  584. append-to-body
  585. :visible.sync="studentVisible"
  586. >
  587. <el-form
  588. :model="studentForm"
  589. :inline="true"
  590. label-width="130px"
  591. label-position="right"
  592. ref="studentForm"
  593. :rules="studentRules"
  594. >
  595. <el-alert
  596. title="基本信息"
  597. type="info"
  598. :closable="false"
  599. style="margin-bottom: 15px"
  600. ></el-alert>
  601. <el-form-item label="学生姓名" prop="name">
  602. <el-input v-model.trim="studentForm.name"></el-input>
  603. </el-form-item>
  604. <el-form-item label="学生性别" prop="sex">
  605. <el-select
  606. class="multiple"
  607. filterable
  608. v-model.trim="studentForm.sex"
  609. clearable
  610. placeholder="请选择性别"
  611. >
  612. <el-option :value="1" label="男"></el-option>
  613. <el-option :value="0" label="女"></el-option>
  614. </el-select>
  615. </el-form-item>
  616. <el-form-item label="出生日期" prop="date">
  617. <el-date-picker
  618. v-model.trim="studentForm.date"
  619. style="width: 185px"
  620. value-format="yyyy-MM-dd"
  621. type="date"
  622. :picker-options="{
  623. firstDayOfWeek: 1,
  624. }"
  625. placeholder="选择日期"
  626. ></el-date-picker>
  627. </el-form-item>
  628. <el-form-item label="学生声部" prop="subjectIdList">
  629. <el-select
  630. v-model.trim="studentForm.subjectIdList"
  631. filterable
  632. clearable
  633. placeholder="学员声部"
  634. >
  635. <el-option-group
  636. v-for="group in subjectList"
  637. :key="group.value"
  638. :label="group.label"
  639. >
  640. <el-option
  641. v-for="item in group.options"
  642. :key="item.value"
  643. :label="item.label"
  644. :value="item.value"
  645. ></el-option>
  646. </el-option-group>
  647. </el-select>
  648. </el-form-item>
  649. <el-form-item label="家长姓名" prop="parseName">
  650. <el-input
  651. v-model.trim="studentForm.parseName"
  652. :disabled="!isNew"
  653. ></el-input>
  654. </el-form-item>
  655. <el-form-item
  656. label="联系电话"
  657. prop="phone"
  658. :rules="[
  659. { required: true, message: '请输入手机号' },
  660. {
  661. pattern: /^1\d{10}$/,
  662. message: '请输入正确的手机号',
  663. trigger: 'blur',
  664. },
  665. ]"
  666. >
  667. <!-- @blur="checkPhone(studentForm.phone)" -->
  668. <el-input :maxlength="11" v-model.trim="studentForm.phone"></el-input>
  669. </el-form-item>
  670. <el-form-item label="所属分部" prop="organId">
  671. <el-select
  672. class="multiple"
  673. v-model.trim="studentForm.organId"
  674. filterable
  675. clearable
  676. placeholder="请选择分部"
  677. @change="changeStudentOrgan"
  678. >
  679. <el-option
  680. v-for="(item, index) in selects.branchs"
  681. :key="index"
  682. :label="item.name"
  683. :value="item.id"
  684. ></el-option>
  685. </el-select>
  686. </el-form-item>
  687. <el-form-item prop="school" label="所属学校">
  688. <el-select
  689. v-model.trim="studentForm.school"
  690. filterable
  691. clearable
  692. :disabled="!studentForm.organId"
  693. class="multiple"
  694. >
  695. <el-option
  696. v-for="(item, index) in cooperationList"
  697. :key="index"
  698. :label="item.name"
  699. :value="item.id"
  700. ></el-option>
  701. </el-select>
  702. </el-form-item>
  703. <el-form-item label="学员年级" prop="currentGradeNum">
  704. <el-select
  705. class="multiple"
  706. v-model.trim="studentForm.currentGradeNum"
  707. clearable
  708. filterable
  709. :disabled="!studentForm.organId"
  710. >
  711. <el-option
  712. v-for="(item, index) in studentGradeList"
  713. :label="item"
  714. :value="Number(index)"
  715. :key="index"
  716. ></el-option>
  717. </el-select>
  718. </el-form-item>
  719. <el-form-item label="学员班级" prop="currentClass">
  720. <el-select
  721. placeholder="班级"
  722. filterable
  723. clearable
  724. v-model.trim="studentForm.currentClass"
  725. style="width: 185px !important"
  726. >
  727. <el-option label="1班" value="1班"></el-option>
  728. <el-option label="2班" value="2班"></el-option>
  729. <el-option label="3班" value="3班"></el-option>
  730. <el-option label="4班" value="4班"></el-option>
  731. <el-option label="5班" value="5班"></el-option>
  732. <el-option label="6班" value="6班"></el-option>
  733. <el-option label="7班" value="7班"></el-option>
  734. <el-option label="8班" value="8班"></el-option>
  735. <el-option label="9班" value="9班"></el-option>
  736. <el-option label="10班" value="10班"></el-option>
  737. <el-option label="11班" value="11班"></el-option>
  738. <el-option label="12班" value="12班"></el-option>
  739. <el-option label="13班" value="13班"></el-option>
  740. <el-option label="14班" value="14班"></el-option>
  741. <el-option label="15班" value="15班"></el-option>
  742. <el-option label="16班" value="16班"></el-option>
  743. <el-option label="17班" value="17班"></el-option>
  744. <el-option label="18班" value="18班"></el-option>
  745. <el-option label="19班" value="19班"></el-option>
  746. <el-option label="20班" value="20班"></el-option>
  747. <el-option label="21班" value="21班"></el-option>
  748. <el-option label="22班" value="22班"></el-option>
  749. <el-option label="23班" value="23班"></el-option>
  750. <el-option label="24班" value="24班"></el-option>
  751. <el-option label="25班" value="25班"></el-option>
  752. <el-option label="26班" value="26班"></el-option>
  753. <el-option label="27班" value="27班"></el-option>
  754. <el-option label="28班" value="28班"></el-option>
  755. <el-option label="29班" value="29班"></el-option>
  756. <el-option label="30班" value="30班"></el-option>
  757. <el-option label="31班" value="31班"></el-option>
  758. <el-option label="32班" value="32班"></el-option>
  759. <el-option label="33班" value="33班"></el-option>
  760. <el-option label="34班" value="34班"></el-option>
  761. <el-option label="35班" value="35班"></el-option>
  762. <el-option label="36班" value="36班"></el-option>
  763. <el-option label="37班" value="37班"></el-option>
  764. <el-option label="38班" value="38班"></el-option>
  765. <el-option label="39班" value="39班"></el-option>
  766. <el-option label="40班" value="40班"></el-option>
  767. </el-select>
  768. <!-- <el-input
  769. v-model.trim="maskForm.course"
  770. placeholder="班级"
  771. ></el-input> -->
  772. </el-form-item>
  773. <!--
  774. <el-form-item label="指导老师" prop="teacherId">
  775. <el-select
  776. class="multiple"
  777. v-model.trim="studentForm.teacherId"
  778. clearable
  779. filterable
  780. :disabled="!studentForm.organId"
  781. >
  782. <el-option
  783. v-for="(item, index) in maskTeacherList"
  784. :label="item.realName"
  785. :value="item.id"
  786. :key="index"
  787. ></el-option>
  788. </el-select>
  789. </el-form-item> -->
  790. <el-alert
  791. title="运营信息"
  792. type="info"
  793. :closable="false"
  794. style="margin-bottom: 15px"
  795. ></el-alert>
  796. <el-form-item label="是否运营" prop="operatingTag" v-if="tenantId == 1">
  797. <el-select
  798. class="multiple"
  799. v-model.trim="studentForm.operatingTag"
  800. clearable
  801. >
  802. <el-option :value="1" label="是"></el-option>
  803. <el-option :value="0" label="否"></el-option>
  804. </el-select>
  805. </el-form-item>
  806. <el-form-item label="是否服务" prop="serviceTag" v-if="tenantId == 1">
  807. <el-select
  808. class="multiple"
  809. v-model.trim="studentForm.serviceTag"
  810. clearable
  811. >
  812. <el-option :value="1" label="是"></el-option>
  813. <el-option :value="0" label="否"></el-option>
  814. </el-select>
  815. </el-form-item>
  816. <el-form-item label="是否是新用户" prop="isNewUser">
  817. <template #label>
  818. <p style="position: relative; display: inline-block">
  819. 是否是新用户
  820. <el-tooltip placement="top" popper-class="mTooltip">
  821. <div slot="content">未购买VIP课程的学员为新用户</div>
  822. <i
  823. class="el-icon-question"
  824. style="font-size: 18px; color: #f56c6c"
  825. ></i>
  826. </el-tooltip>
  827. </p>
  828. </template>
  829. <el-select
  830. class="multiple"
  831. v-model.trim="studentForm.isNewUser"
  832. clearable
  833. >
  834. <el-option :value="1" label="是"></el-option>
  835. <el-option :value="0" label="否"></el-option>
  836. </el-select>
  837. </el-form-item>
  838. <el-form-item label="关心包" prop="carePackage">
  839. <el-select
  840. class="multiple"
  841. v-model.trim="studentForm.carePackage"
  842. clearable
  843. :disabled="!isNew && studentUpdatePackage.carePackage == 2"
  844. placeholder="请选择关心包"
  845. >
  846. <el-option label="不可用" :value="0"></el-option>
  847. <el-option label="可用" :value="1"></el-option>
  848. <el-option disabled label="已使用" :value="2"></el-option>
  849. </el-select>
  850. </el-form-item>
  851. <el-form-item label="加油包" prop="comeOnPackage">
  852. <el-select
  853. class="multiple"
  854. v-model.trim="studentForm.comeOnPackage"
  855. clearable
  856. :disabled="!isNew && studentUpdatePackage.comeOnPackage == 2"
  857. placeholder="请选择加油包"
  858. >
  859. <el-option label="不可用" :value="0"></el-option>
  860. <el-option label="可用" :value="1"></el-option>
  861. <el-option disabled label="已使用" :value="2"></el-option>
  862. </el-select>
  863. </el-form-item>
  864. </el-form>
  865. <div slot="footer" class="dialog-footer">
  866. <el-button @click="studentVisible = false">取 消</el-button>
  867. <el-button type="primary" v-if="isNew" @click="submitAddStudent"
  868. >确 定</el-button
  869. >
  870. <el-button type="primary" v-if="!isNew" @click="resetStudentSubmie"
  871. >确 定</el-button
  872. >
  873. </div>
  874. </el-dialog>
  875. <!-- 学员激活列表 -->
  876. <qr-code v-model="qrcodeStatus" title="学员激活列表" :codeUrl="qrcodeUrl" />
  877. <el-dialog
  878. title="修改密码"
  879. :visible.sync="passwrodVisiable"
  880. :before-close="closePassWord"
  881. width="400px"
  882. >
  883. <el-form :model="passwrodForm" ref="passwrodForm" :inline="true">
  884. <el-form-item
  885. label="手机号"
  886. prop="phone"
  887. label-width="120px"
  888. :rules="[
  889. { required: true, message: '手机号不能为空', trigger: 'blur' },
  890. {
  891. pattern: /^1\d{10}$/,
  892. message: '请输入正确的手机号',
  893. trigger: 'blur',
  894. },
  895. ]"
  896. >
  897. <copy-text>{{ passwrodForm.phone }}</copy-text>
  898. </el-form-item>
  899. <el-form-item
  900. label="输入密码"
  901. prop="password"
  902. label-width="120px"
  903. :rules="[
  904. { required: true, message: '密码不能为空', trigger: 'blur' },
  905. {
  906. pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
  907. message: '密码为6-20位数字和字母组合',
  908. trigger: 'blur',
  909. },
  910. ]"
  911. >
  912. <el-input v-model.trim="passwrodForm.password"></el-input>
  913. </el-form-item>
  914. <el-form-item
  915. label="再次输入"
  916. prop="password2"
  917. label-width="120px"
  918. :rules="[
  919. { required: true, message: '密码不能为空', trigger: 'blur' },
  920. {
  921. pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
  922. message: '密码为6-20位数字和字母组合',
  923. trigger: 'blur',
  924. },
  925. ]"
  926. >
  927. <el-input v-model.trim="passwrodForm.password2"></el-input>
  928. </el-form-item>
  929. </el-form>
  930. <span slot="footer" class="dialog-footer">
  931. <el-button @click="passwrodVisiable = false">取 消</el-button>
  932. <el-button type="primary" @click="submitResetPassWord">确 定</el-button>
  933. </span>
  934. </el-dialog>
  935. <el-dialog title="协议下载" :visible.sync="protocolVisible" width="650px">
  936. <protocol-model
  937. v-if="protocolVisible"
  938. @close="protocolVisible = false"
  939. :protocolVersions="protocolVersions"
  940. />
  941. </el-dialog>
  942. <el-dialog title="设置扩展分部" :visible.sync="extVisible" width="500px">
  943. <student-ext
  944. v-if="extVisible"
  945. :subjectList="subjectList"
  946. :detail="extDetail"
  947. @getList="getList"
  948. @close="extVisible = false"
  949. />
  950. </el-dialog>
  951. <el-dialog
  952. title="创建云教练缴费"
  953. width="500px"
  954. :visible.sync="memberVisible"
  955. >
  956. <createMember
  957. ref="addMember"
  958. v-if="memberVisible"
  959. :multipleSelection="multipleSelection"
  960. @close="memberVisible = false"
  961. @submited="getList"
  962. />
  963. <div slot="footer" class="dialog-footer">
  964. <el-button @click="memberVisible = false">取 消</el-button>
  965. <el-button type="primary" @click="submitAddMember">确 定</el-button>
  966. </div>
  967. </el-dialog>
  968. </div>
  969. </template>
  970. <script>
  971. import pagination from "@/components/Pagination/index";
  972. import protocolModel from "@/views/studentManager/modals/protocolModel";
  973. import {
  974. queryStudentList,
  975. getStudentInfoByPhone,
  976. registerStudent,
  977. updateStudent,
  978. getLatest,
  979. } from "@/api/studentManager";
  980. import { queryByOrganId } from "@/api/systemManage";
  981. import { getGradeList } from "@/views/2021memeberActionManager/api";
  982. import qrCode from "@/components/QrCode/index";
  983. import { vaildStudentUrl } from "@/utils/validate";
  984. import { resetPassword2, getTeacher, getAgreement } from "@/api/buildTeam";
  985. import {
  986. organizationCloudTeacherFeeQueryPage,
  987. subjectListTree,
  988. } from "@/api/specialSetting";
  989. import axios from "axios";
  990. import qs from "qs";
  991. import { getToken, getTenantId } from "@/utils/auth";
  992. import load from "@/utils/loading";
  993. import createMember from "./modals/createMember";
  994. import studentExt from "./modals/studentExt";
  995. export default {
  996. name: "studentManagerList",
  997. components: { pagination, qrCode, createMember, protocolModel, studentExt },
  998. data() {
  999. return {
  1000. extVisible: false,
  1001. extDetail: {},
  1002. studentVisible: false,
  1003. searchForm: {
  1004. organId: [],
  1005. search: null,
  1006. studentName: null,
  1007. isActive: null,
  1008. hasCourse: null,
  1009. // isMake: null,
  1010. hasPracticeCourse: null,
  1011. operatingTag: null,
  1012. serviceTag: null,
  1013. teacherId: null,
  1014. carePackage: null,
  1015. comeOnPackage: null,
  1016. isNewUser: null,
  1017. hasTeacher: null,
  1018. isRecord: null,
  1019. },
  1020. memberVisible: false,
  1021. multipleSelection: [],
  1022. searchList: [],
  1023. tableList: [],
  1024. organList: [],
  1025. teacherList: [],
  1026. maskTeacherList: [],
  1027. subjectList: [], // 声部列表
  1028. pageInfo: {
  1029. // 分页规则
  1030. limit: 10, // 限制显示条数
  1031. page: 1, // 当前页
  1032. total: 0, // 总条数
  1033. page_size: [10, 20, 40, 50], // 选择限制显示条数
  1034. },
  1035. studentForm: {
  1036. phone: "",
  1037. organId: [],
  1038. name: "",
  1039. sex: "",
  1040. parseName: "",
  1041. date: "",
  1042. serviceTag: null,
  1043. operatingTag: null,
  1044. teacherId: null,
  1045. subjectIdList: null,
  1046. isNewUser: 1,
  1047. carePackage: 0,
  1048. comeOnPackage: 0,
  1049. school: null,
  1050. currentClass: "",
  1051. currentGradeNum: "",
  1052. },
  1053. studentUpdatePackage: {
  1054. carePackage: 0,
  1055. comeOnPackage: 0,
  1056. },
  1057. studentRules: {
  1058. name: [{ required: true, message: "请输入学生姓名" }],
  1059. sex: [{ required: true, message: "请选择学生性别" }],
  1060. date: [{ required: true, message: "请选择出生日期" }],
  1061. organId: [{ required: true, message: "请选择分部" }],
  1062. subjectIdList: [{ required: true, message: "请选择声部" }],
  1063. serviceTag: [{ required: true, message: "请选择是否参与服务" }],
  1064. isNewUser: [{ required: true, message: "请选择是否是新用户" }],
  1065. operatingTag: [{ required: true, message: "请选择是否参与运营" }],
  1066. teacherId: [{ required: true, message: "请选择指导老师" }],
  1067. },
  1068. isNew: false,
  1069. active: null,
  1070. maskName: "新增学员",
  1071. qrcodeStatus: false,
  1072. qrcodeUrl: null,
  1073. activeRow: null,
  1074. passwrodVisiable: false,
  1075. passwrodForm: {
  1076. phone: "",
  1077. password: "",
  1078. password2: "",
  1079. },
  1080. activatedRow: null,
  1081. protocolVisible: false,
  1082. protocolVersions: [],
  1083. cooperationList: [],
  1084. tenantId: null,
  1085. studentGradeList: [],
  1086. };
  1087. },
  1088. mounted() {
  1089. if (this.$route.params.search) {
  1090. this.searchForm.search = this.$route.params.search;
  1091. }
  1092. if (this.$route.params.teacherId) {
  1093. this.searchForm.teacherId = this.$route.params.teacherId;
  1094. }
  1095. if (this.$route.params.hasTeacher) {
  1096. this.searchForm.hasTeacher = this.$route.params.hasTeacher;
  1097. }
  1098. if (this.$route.params.organId) {
  1099. this.searchForm.organId = [];
  1100. this.searchForm.organId = this.searchForm.organId.push(
  1101. this.$route.params.organId
  1102. );
  1103. }
  1104. this.$store.dispatch("setBranchs");
  1105. this.$store.dispatch("setTeachers");
  1106. this.getList();
  1107. this.getAgreement();
  1108. this.tenantId = this.$helpers.tenantId;
  1109. },
  1110. methods: {
  1111. async getAgreement() {
  1112. try {
  1113. const res = await getAgreement();
  1114. if (!res.data) {
  1115. this.$bus.$emit("showguide", ["agreement"]);
  1116. }
  1117. } catch (e) {}
  1118. },
  1119. handleSelectionChange(val) {
  1120. this.multipleSelection = val;
  1121. },
  1122. submitAddMember() {
  1123. this.$refs.addMember.submit();
  1124. },
  1125. addStudentMember() {
  1126. if (this.multipleSelection.length > 0) {
  1127. let organIds = [];
  1128. this.multipleSelection.forEach((m) => {
  1129. if (!organIds.includes(m.organId)) {
  1130. organIds.push(m.organId);
  1131. }
  1132. });
  1133. if (organIds.length == 1) {
  1134. this.memberVisible = true;
  1135. } else {
  1136. this.$message.error("所选学员只能是同一分部");
  1137. }
  1138. } else {
  1139. this.$message.error("请至少选择一名学员");
  1140. }
  1141. },
  1142. onSearch() {
  1143. this.pageInfo.page = 1;
  1144. this.getList();
  1145. },
  1146. onCreateQRCode() {
  1147. // 生成报名二维码
  1148. this.qrcodeStatus = true;
  1149. this.qrcodeUrl =
  1150. vaildStudentUrl() + `/#/queryStudentPer?tenantId=` + this.tenantId;
  1151. },
  1152. getList() {
  1153. let params = { ...this.searchForm };
  1154. params.rows = this.pageInfo.limit;
  1155. params.page = this.pageInfo.page;
  1156. params.organId = this.searchForm.organId.join(",");
  1157. queryStudentList(params).then((res) => {
  1158. if (res.code == 200) {
  1159. this.tableList = res.data.rows;
  1160. this.pageInfo.total = res.data.total;
  1161. }
  1162. });
  1163. },
  1164. onReSet() {
  1165. this.searchForm = {
  1166. organId: [],
  1167. search: null,
  1168. studentName: null,
  1169. isActive: null,
  1170. hasCourse: null,
  1171. // isMake: null,
  1172. hasPracticeCourse: null,
  1173. operatingTag: null,
  1174. serviceTag: null,
  1175. teacherId: null,
  1176. };
  1177. this.getList();
  1178. },
  1179. downLoadStudent() {
  1180. let url = "/api-web/export/studentHasCourse";
  1181. let searchForm = this.searchForm;
  1182. let data = {
  1183. organId: searchForm.organId.join(","),
  1184. search: searchForm.search + "" ? searchForm.search : null,
  1185. isActive: searchForm.isActive + "" ? searchForm.isActive : null,
  1186. hasCourse: searchForm.hasCourse == "" ? null : searchForm.hasCourse,
  1187. // isMake: searchForm.isMake ? searchForm.isMake : null,
  1188. hasPracticeCourse:
  1189. searchForm.hasPracticeCourse + ""
  1190. ? searchForm.hasPracticeCourse
  1191. : null,
  1192. operatingTag:
  1193. searchForm.operatingTag + "" ? searchForm.operatingTag : null,
  1194. serviceTag: searchForm.serviceTag + "" ? searchForm.serviceTag : null,
  1195. teacherId: searchForm.teacherId + "" ? searchForm.teacherId : null,
  1196. carePackage:
  1197. searchForm.carePackage + "" ? searchForm.carePackage : null,
  1198. comeOnPackage:
  1199. searchForm.comeOnPackage + "" ? searchForm.comeOnPackage : null,
  1200. isNewUser: searchForm.isNewUser + "" ? searchForm.isNewUser : null,
  1201. hasTeacher: searchForm.hasTeacher + "" ? searchForm.hasTeacher : null,
  1202. isRecord: searchForm.isRecord + "" ? searchForm.isRecord : null,
  1203. };
  1204. const options = {
  1205. method: "POST",
  1206. headers: {
  1207. Authorization: getToken(),
  1208. tenantId: getTenantId(),
  1209. },
  1210. url,
  1211. data: qs.stringify(data),
  1212. responseType: "blob",
  1213. };
  1214. this.$confirm("确定导出学员名单?", "提示", {
  1215. confirmButtonText: "确定",
  1216. cancelButtonText: "取消",
  1217. type: "warning",
  1218. })
  1219. .then(() => {
  1220. load.startLoading();
  1221. axios(options)
  1222. .then((res) => {
  1223. let blob = new Blob([res.data], {
  1224. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
  1225. type: "application/vnd.ms-excel;charset=utf-8",
  1226. // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  1227. });
  1228. let text = new Response(blob).text();
  1229. text.then((res) => {
  1230. // 判断是否报错
  1231. if (res.indexOf("code") != -1) {
  1232. let json = JSON.parse(res);
  1233. if (json.code == 403) {
  1234. this.$message.error(`登录过期,请重新登录!`);
  1235. setTimeout(() => {
  1236. this.$store.dispatch("user/resetToken").then(() => {
  1237. location.reload();
  1238. });
  1239. }, 1000);
  1240. return;
  1241. }
  1242. this.$message.error(json.msg);
  1243. } else {
  1244. let objectUrl = URL.createObjectURL(blob);
  1245. let link = document.createElement("a");
  1246. let nowTime = new Date();
  1247. let ymd =
  1248. nowTime.getFullYear() +
  1249. (nowTime.getMonth() + 1) +
  1250. nowTime.getDate();
  1251. let fname = `导出学员名单` + ymd + ".xls"; //下载文件的名字
  1252. link.href = objectUrl;
  1253. link.setAttribute("download", fname);
  1254. document.body.appendChild(link);
  1255. link.click();
  1256. }
  1257. });
  1258. load.endLoading();
  1259. })
  1260. .catch((error) => {
  1261. this.$message.error("导出数据失败,请联系管理员");
  1262. load.endLoading();
  1263. });
  1264. })
  1265. .catch(() => {});
  1266. },
  1267. checkPhone(val) {
  1268. var regu = /^1\d{10}$/;
  1269. var re = new RegExp(regu);
  1270. if (re.test(val)) {
  1271. getStudentInfoByPhone({ mobile: this.studentForm.phone }).then(
  1272. (res) => {
  1273. if (res.code == 200) {
  1274. if (res.data) {
  1275. this.studentForm = {
  1276. name: res.data.name,
  1277. sex: res.data.gender,
  1278. parseName: res.data.parentsName,
  1279. // sound: parseInt(res.data.subjectIdList),
  1280. phone: val,
  1281. date: res.data.birthdate,
  1282. };
  1283. }
  1284. }
  1285. }
  1286. );
  1287. }
  1288. },
  1289. submitAddStudent() {
  1290. const studentForm = this.studentForm;
  1291. // 效验 然后组数据提交
  1292. this.$refs["studentForm"].validate((item) => {
  1293. if (item) {
  1294. let obj = {
  1295. phone: studentForm.phone,
  1296. username: studentForm.name,
  1297. gender: studentForm.sex,
  1298. realName: studentForm.parseName,
  1299. birthdate: studentForm.date,
  1300. organId: studentForm.organId,
  1301. serviceTag: studentForm.serviceTag,
  1302. operatingTag: studentForm.operatingTag,
  1303. teacherId: studentForm.teacherId,
  1304. isNewUser: studentForm.isNewUser,
  1305. subjectIdList: studentForm.subjectIdList,
  1306. carePackage: studentForm.carePackage,
  1307. comeOnPackage: studentForm.comeOnPackage,
  1308. cooperationOrganId: studentForm.school,
  1309. currentClass: studentForm.currentClass,
  1310. currentGradeNum: studentForm.currentGradeNum,
  1311. };
  1312. registerStudent(obj).then((res) => {
  1313. if (res.code == 200) {
  1314. this.$message.success("添加成功");
  1315. this.studentVisible = false;
  1316. this.getList();
  1317. }
  1318. });
  1319. }
  1320. });
  1321. },
  1322. // 修改学生信息
  1323. resetStudentSubmie() {
  1324. const studentForm = this.studentForm;
  1325. this.$refs["studentForm"].validate((item) => {
  1326. if (item) {
  1327. let obj = {
  1328. phone: studentForm.phone,
  1329. username: studentForm.name,
  1330. gender: studentForm.sex,
  1331. realName: studentForm.parseName,
  1332. birthdate: studentForm.date,
  1333. organId: studentForm.organId,
  1334. id: this.active.userId,
  1335. serviceTag: studentForm.serviceTag,
  1336. operatingTag: studentForm.operatingTag,
  1337. teacherId: studentForm.teacherId,
  1338. isNewUser: studentForm.isNewUser,
  1339. subjectIdList: studentForm.subjectIdList,
  1340. carePackage: studentForm.carePackage,
  1341. comeOnPackage: studentForm.comeOnPackage,
  1342. cooperationOrganId: studentForm.school,
  1343. currentClass: studentForm.currentClass,
  1344. currentGradeNum: studentForm.currentGradeNum,
  1345. };
  1346. updateStudent(obj).then((res) => {
  1347. if (res.code == 200) {
  1348. this.$message.success("修改成功");
  1349. this.studentVisible = false;
  1350. this.getList();
  1351. }
  1352. });
  1353. }
  1354. });
  1355. },
  1356. async getSubjectList() {
  1357. try {
  1358. await subjectListTree({
  1359. delFlag: "NO",
  1360. rows: 9999,
  1361. }).then((res) => {
  1362. let result = res.data;
  1363. if (res.code == 200) {
  1364. let tempArray = [];
  1365. console.log(result.rows,'result')
  1366. result.rows.forEach((item, index) => {
  1367. let subject = [];
  1368. let nowSubject = item.subjects || []
  1369. nowSubject.forEach((s) => {
  1370. subject.push({
  1371. value: s.id,
  1372. label: s.name,
  1373. });
  1374. });
  1375. tempArray[index] = {
  1376. label: item.name,
  1377. value: item.id,
  1378. options: subject,
  1379. };
  1380. });
  1381. this.subjectList = tempArray;
  1382. }
  1383. });
  1384. // 获取 学生年级
  1385. } catch (e) {
  1386. console.log(e)
  1387. }
  1388. },
  1389. async getStudentGradeList(organId) {
  1390. try {
  1391. const res = await getGradeList({ id: organId });
  1392. this.studentGradeList = res.data;
  1393. } catch (e) {
  1394. console.log(e);
  1395. }
  1396. },
  1397. async addStudent() {
  1398. await this.getSubjectList();
  1399. this.isNew = true;
  1400. this.studentVisible = true;
  1401. this.maskName = "新增学员";
  1402. },
  1403. async resetStudent(row) {
  1404. this.studentVisible = true;
  1405. let organId = row.organId;
  1406. await this.getSubjectList();
  1407. await this.changeStudentOrgan(row.organId);
  1408. this.isNew = false;
  1409. this.active = row;
  1410. this.maskName = "修改学员";
  1411. this.$nextTick(() => {
  1412. this.studentForm = {
  1413. phone: row.parentsPhone || null,
  1414. name: row.username || null,
  1415. sex: row.gender,
  1416. parseName: row.realName || null,
  1417. date: row.birthdate || null,
  1418. organId: row.organId || null,
  1419. serviceTag: row.serviceTag,
  1420. operatingTag: row.operatingTag,
  1421. teacherId: row.teacherId || null,
  1422. isNewUser: row.isNewUser,
  1423. subjectIdList: Number(row.subjectIdList) || null,
  1424. carePackage: row.carePackage,
  1425. comeOnPackage: row.comeOnPackage,
  1426. school: row.cooperationOrganId || null,
  1427. extSubjectIds: row.extSubjectIds || null,
  1428. currentClass: row.currentClass || null,
  1429. currentGradeNum: row.currentGradeNum || null,
  1430. };
  1431. this.studentUpdatePackage = {
  1432. carePackage: row.carePackage,
  1433. comeOnPackage: row.comeOnPackage,
  1434. };
  1435. });
  1436. },
  1437. async setStudent(row) {
  1438. // 设置扩展分部
  1439. await this.getSubjectList();
  1440. this.extDetail = {
  1441. id: row.userId,
  1442. phone: row.parentsPhone || null,
  1443. name: row.username || null,
  1444. sex: row.gender,
  1445. parseName: row.realName || null,
  1446. date: row.birthdate || null,
  1447. organId: row.organId || null,
  1448. serviceTag: row.serviceTag,
  1449. operatingTag: row.operatingTag,
  1450. teacherId: row.teacherId || null,
  1451. isNewUser: row.isNewUser,
  1452. subjectIdList: Number(row.subjectIdList) || null,
  1453. carePackage: row.carePackage,
  1454. comeOnPackage: row.comeOnPackage,
  1455. cooperationOrganId: row.cooperationOrganId || null,
  1456. extSubjectIds: row.extSubjectIds,
  1457. };
  1458. this.extVisible = true;
  1459. },
  1460. onMaskClose(formName) {
  1461. this.$refs[formName].resetFields();
  1462. },
  1463. resetPassWrod(row) {
  1464. this.activatedRow = row;
  1465. this.passwrodForm.phone = row.parentsPhone;
  1466. this.passwrodVisiable = true;
  1467. },
  1468. closePassWord() {
  1469. this.activatedRow = null;
  1470. this.passwrodForm = {
  1471. phone: "",
  1472. password: "",
  1473. password2: "",
  1474. };
  1475. this.$refs["passwrodForm"].resetFields();
  1476. this.passwrodVisiable = false;
  1477. },
  1478. submitResetPassWord() {
  1479. if (this.passwrodForm.password !== this.passwrodForm.password2) {
  1480. this.$message.error("两次密码必须相同");
  1481. return;
  1482. }
  1483. this.$refs["passwrodForm"].validate((res) => {
  1484. if (res) {
  1485. // 发请求
  1486. resetPassword2({
  1487. mobile: this.passwrodForm.phone,
  1488. newPassword: this.passwrodForm.password,
  1489. userId: this.activatedRow.userId,
  1490. }).then((res) => {
  1491. if (res.code == 200) {
  1492. // 修改成功
  1493. this.$message.success("修改成功");
  1494. this.closePassWord();
  1495. }
  1496. });
  1497. }
  1498. });
  1499. },
  1500. async changeStudentOrgan(val) {
  1501. this.studentForm.teacherId = null;
  1502. this.studentForm.school = null;
  1503. if (val) {
  1504. await getTeacher({ organId: val }).then((res) => {
  1505. if (res.code == 200) {
  1506. this.maskTeacherList = res.data;
  1507. if (this.maskTeacherList <= 0) {
  1508. this.$nextTick(() => {
  1509. this.$bus.$emit("showguide", ["teacher"]);
  1510. });
  1511. }
  1512. }
  1513. });
  1514. queryByOrganId({ organId: val }).then((res) => {
  1515. if (res.code == 200) {
  1516. this.cooperationList = res.data;
  1517. }
  1518. });
  1519. this.getStudentGradeList(val);
  1520. } else {
  1521. this.maskTeacherList = [];
  1522. }
  1523. },
  1524. async lookContracts(row) {
  1525. await getLatest({ userId: row.userId }).then((res) => {
  1526. if (res.code == 200) {
  1527. if (res.data) {
  1528. this.protocolVersions = res.data;
  1529. this.protocolVisible = true;
  1530. }
  1531. }
  1532. });
  1533. },
  1534. checkDate(dateStr) {
  1535. let dayjs = this.$helpers.dayjs;
  1536. let nowDate = new Date().getTime();
  1537. return nowDate - dayjs(dateStr).valueOf() < 0;
  1538. },
  1539. },
  1540. };
  1541. </script>
  1542. <style lang="scss" scoped>
  1543. .newBand {
  1544. display: inline-block;
  1545. margin-right: 10px;
  1546. }
  1547. .right-code {
  1548. // width: 50%;
  1549. // float: left;
  1550. .title {
  1551. font-size: 18px;
  1552. text-align: center;
  1553. padding-bottom: 8px;
  1554. }
  1555. }
  1556. ::v-deep .studentInfo {
  1557. .multiple.el-select {
  1558. width: 185px !important;
  1559. }
  1560. }
  1561. .red {
  1562. color: red;
  1563. }
  1564. .demo-table-expand {
  1565. // font-size: 0;
  1566. }
  1567. .demo-table-expand label {
  1568. width: 150px;
  1569. color: #99a9bf;
  1570. }
  1571. .demo-table-expand .el-form-item {
  1572. margin-right: 0;
  1573. margin-bottom: 0;
  1574. overflow: hidden;
  1575. text-overflow: ellipsis;
  1576. white-space: nowrap;
  1577. padding-right: 10px;
  1578. position: relative;
  1579. }
  1580. .demo-table-expand .el-form-item__label {
  1581. z-index: 100;
  1582. }
  1583. ::v-deep .el-table__expanded-cell[class*="cell"] {
  1584. padding: 20px 0 20px 110px;
  1585. }
  1586. .schoolWrap {
  1587. // width: calc(100% - 75px) !important;
  1588. overflow: hidden;
  1589. text-overflow: ellipsis;
  1590. white-space: nowrap;
  1591. }
  1592. </style>