studentList.vue 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102
  1. <template>
  2. <div class="stu-container">
  3. <div class="studentListWrap">
  4. <div
  5. v-if="team_status == 'PROGRESS'"
  6. class="newBand"
  7. v-permission="'studentRegistration/insertStudent'"
  8. @click="createStudentFrom"
  9. >
  10. 新增学员
  11. </div>
  12. <div
  13. class="newBand"
  14. v-permission="'studentManage/updateMemberExperience'"
  15. @click="addTryTime"
  16. >
  17. 增加会员试用期
  18. </div>
  19. </div>
  20. <!-- 搜索类型 -->
  21. <save-form
  22. ref="searchForm"
  23. :inline="true"
  24. :save-key="saveKey"
  25. class="searchForm"
  26. @submit="search"
  27. @reset="onReSet"
  28. :model="searchForm"
  29. >
  30. <el-form-item prop="search">
  31. <el-input
  32. v-model.trim="searchForm.search"
  33. clearable
  34. placeholder="学生姓名或电话"
  35. @keyup.enter.native="search"
  36. ></el-input>
  37. </el-form-item>
  38. <el-form-item prop="studentStatus">
  39. <el-select
  40. v-model.trim="searchForm.studentStatus"
  41. clearable
  42. filterable
  43. placeholder="学员状态"
  44. >
  45. <el-option label="在读" value="NORMAL"></el-option>
  46. <el-option label="请假" value="LEAVE"></el-option>
  47. <el-option label="退团" value="QUIT"></el-option>
  48. <el-option label="报名" value="APPLY"></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item prop="createYear">
  52. <el-date-picker
  53. v-model="searchForm.createYear"
  54. type="year"
  55. value-format="yyyy"
  56. placeholder="选择入团年份"
  57. >
  58. </el-date-picker>
  59. </el-form-item>
  60. <el-form-item prop="currentGrade">
  61. <!-- <el-input
  62. v-model.trim="searchForm.currentGrade"
  63. clearable
  64. placeholder="学员年级"
  65. ></el-input> -->
  66. <el-select
  67. v-model.trim="searchForm.currentGrade"
  68. filterable
  69. clearable
  70. placeholder="请选择年级"
  71. >
  72. <el-option
  73. v-for="(item, index) in gradeList"
  74. :key="index"
  75. :label="item.label"
  76. :value="item.label"
  77. ></el-option>
  78. </el-select>
  79. </el-form-item>
  80. <el-form-item prop="classGroupId">
  81. <el-select
  82. v-model.trim="searchForm.classGroupId"
  83. clearable
  84. filterable
  85. placeholder="请选择班级"
  86. >
  87. <el-option
  88. v-for="(item, index) in classList"
  89. :key="index"
  90. :value="item.id"
  91. :label="item.name"
  92. ></el-option>
  93. </el-select>
  94. </el-form-item>
  95. <el-form-item prop="major">
  96. <el-select
  97. v-model.trim="searchForm.major"
  98. clearable
  99. filterable
  100. placeholder="所选专业"
  101. >
  102. <el-option
  103. v-for="(item, index) in soundList"
  104. :key="index"
  105. :value="item.id"
  106. :label="item.name"
  107. ></el-option>
  108. </el-select>
  109. </el-form-item>
  110. <el-form-item prop="isPay">
  111. <el-select
  112. v-model.trim="searchForm.isPay"
  113. clearable
  114. filterable
  115. placeholder="报名缴费"
  116. >
  117. <el-option label="未开启缴费" value="0"></el-option>
  118. <el-option label="开启缴费" value="1"></el-option>
  119. <el-option label="已缴费" value="2"></el-option>
  120. </el-select>
  121. </el-form-item>
  122. <el-form-item prop="oweFlag">
  123. <el-select
  124. v-model.trim="searchForm.oweFlag"
  125. clearable
  126. filterable
  127. placeholder="是否欠费"
  128. >
  129. <el-option label="否" value="0"></el-option>
  130. <el-option label="是" value="1"></el-option>
  131. </el-select>
  132. </el-form-item>
  133. <el-form-item prop="hasMember">
  134. <el-select
  135. class="multiple"
  136. v-model.trim="searchForm.hasMember"
  137. clearable
  138. placeholder="是否是会员"
  139. >
  140. <el-option label="是" value="1"></el-option>
  141. <el-option label="否" value="0"></el-option>
  142. <el-option label="未生效" value="2"></el-option>
  143. </el-select>
  144. </el-form-item>
  145. <el-form-item prop="isActive">
  146. <el-select
  147. v-model.trim="searchForm.isActive"
  148. clearable
  149. filterable
  150. placeholder="是否激活"
  151. >
  152. <el-option label="是" value="1"></el-option>
  153. <el-option label="否" value="0"></el-option>
  154. </el-select>
  155. </el-form-item>
  156. <el-form-item prop="hasCourse">
  157. <el-select
  158. v-model.trim="searchForm.hasCourse"
  159. clearable
  160. placeholder="VIP/网管是否有课"
  161. >
  162. <el-option label="是" value="true"></el-option>
  163. <el-option label="否" value="false"></el-option>
  164. </el-select>
  165. </el-form-item>
  166. <el-form-item prop="carePackage">
  167. <el-select
  168. class="multiple"
  169. v-model.trim="searchForm.carePackage"
  170. clearable
  171. placeholder="关心包"
  172. >
  173. <el-option label="不可用" :value="0"></el-option>
  174. <el-option label="可用" :value="1"></el-option>
  175. <el-option label="已使用" :value="2"></el-option>
  176. </el-select>
  177. </el-form-item>
  178. <el-form-item prop="comeOnPackage">
  179. <el-select
  180. class="multiple"
  181. v-model.trim="searchForm.comeOnPackage"
  182. clearable
  183. placeholder="加油包"
  184. >
  185. <el-option label="不可用" :value="0"></el-option>
  186. <el-option label="可用" :value="1"></el-option>
  187. <el-option label="已使用" :value="2"></el-option>
  188. </el-select>
  189. </el-form-item>
  190. <el-form-item>
  191. <el-button native-type="submit" type="danger">搜索</el-button>
  192. <el-button type="primary" native-type="reset">重置</el-button>
  193. <el-button
  194. type="primary"
  195. v-permission="'export/musicGroupStudent'"
  196. @click="onMusicGroupExport"
  197. >导出</el-button
  198. >
  199. </el-form-item>
  200. </save-form>
  201. <div style="font-size: 14px; color: #f85043; padding-bottom: 10px">
  202. 在读人数:{{ studentListInfo.studying
  203. }}<i style="width: 10px; display: inline-block"></i> 退团人数:{{
  204. studentListInfo.quit
  205. }}<i style="width: 10px; display: inline-block"></i> VIP&网管转化率:{{
  206. studentListInfo.courseRate
  207. }}<i style="width: 10px; display: inline-block"></i>
  208. </div>
  209. <!-- 列表 -->
  210. <div class="tableWrap">
  211. <el-table
  212. :data="tableList"
  213. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  214. @selection-change="handleSelectionChange"
  215. >
  216. <el-table-column
  217. type="selection"
  218. width="55"
  219. :selectable="checkboxSelect"
  220. ></el-table-column>
  221. <el-table-column type="expand">
  222. <template slot-scope="props">
  223. <el-form label-position="left" class="demo-table-expand">
  224. <el-row>
  225. <el-col :span="6">
  226. <el-form-item label="入团年份">
  227. <span>{{
  228. props.row.registerTime | dayjsFormat("YYYY年")
  229. }}</span>
  230. </el-form-item></el-col
  231. >
  232. <el-col :span="6">
  233. <el-form-item label="性别">
  234. <span>{{ props.row.gender | sex }}</span>
  235. </el-form-item></el-col
  236. >
  237. <el-col :span="6">
  238. <el-form-item label="关心包">
  239. <span> {{ props.row.carePackage | studentPackage }} </span>
  240. </el-form-item></el-col
  241. >
  242. <el-col :span="6">
  243. <el-form-item label="报名专业">
  244. <copy-text>
  245. {{ props.row.regSubjectName }}
  246. </copy-text>
  247. </el-form-item></el-col
  248. >
  249. </el-row>
  250. <el-row>
  251. <el-col :span="6">
  252. <el-form-item label="是否激活">
  253. <span>{{ props.row.isActive ? "是" : "否" }}</span>
  254. </el-form-item></el-col
  255. >
  256. <el-col :span="6">
  257. <el-form-item label="VIP/网管是否有课">
  258. <span>{{ props.row.hasCourse ? "是" : "否" }}</span>
  259. </el-form-item></el-col
  260. >
  261. <el-col :span="6">
  262. <el-form-item label="加油包">
  263. <span>{{ props.row.comeOnPackage | studentPackage }}</span>
  264. </el-form-item></el-col
  265. >
  266. <el-col :span="6">
  267. <el-form-item label="退团原因">
  268. <overflow-text
  269. :text="props.row.quitReason"
  270. ></overflow-text> </el-form-item
  271. ></el-col>
  272. </el-row>
  273. </el-form>
  274. </template>
  275. </el-table-column>
  276. <el-table-column label="学员信息" width="120px;" prop="userId">
  277. <template slot-scope="scope">
  278. <div
  279. @click="gotoStudent(scope.row.userId)"
  280. style="color: #14928a; cursor: pointer"
  281. >
  282. <p>
  283. <copy-text>
  284. {{ scope.row.userId }}
  285. </copy-text>
  286. </p>
  287. <p>
  288. <copy-text>
  289. {{ scope.row.realName }}
  290. </copy-text>
  291. </p>
  292. </div>
  293. </template>
  294. </el-table-column>
  295. <!-- <el-table-column label="学员姓名" width="120px;" prop="realName">
  296. <template slot-scope="scope">
  297. <div
  298. @click="gotoStudent(scope.row.realName)"
  299. style="color: #14928a; cursor: pointer"
  300. >
  301. <copy-text>
  302. {{ scope.row.realName }}
  303. </copy-text>
  304. </div>
  305. </template>
  306. </el-table-column> -->
  307. <!-- <el-table-column
  308. align="center"
  309. prop="gender"
  310. width="50px;"
  311. label="性别"
  312. >
  313. <template slot-scope="scope">
  314. <div>{{ scope.row.gender | sex }}</div>
  315. </template>
  316. </el-table-column> -->
  317. <el-table-column align="center" prop="phone" label="联系电话">
  318. <template slot-scope="scope">
  319. <copy-text>
  320. {{ scope.row.phone }}
  321. </copy-text>
  322. </template>
  323. </el-table-column>
  324. <!-- <el-table-column align="center" label="入团年份">
  325. <template slot-scope="scope">
  326. <div>{{ scope.row.registerTime | dayjsFormat("YYYY年") }}</div>
  327. </template>
  328. </el-table-column> -->
  329. <el-table-column align="center" label="年级班级">
  330. <template slot-scope="scope">
  331. <div>{{ scope.row.currentGrade + scope.row.currentClass }}</div>
  332. </template>
  333. </el-table-column>
  334. <!-- <el-table-column align="center" label="报名专业" prop="subjectName">
  335. <template slot-scope="scope">
  336. <copy-text>
  337. {{ scope.row.regSubjectName }}
  338. </copy-text>
  339. </template>
  340. </el-table-column> -->
  341. <el-table-column align="center" label="入团专业" prop="subjectName">
  342. <template slot-scope="scope">
  343. <copy-text>
  344. {{ scope.row.subjectName }}
  345. </copy-text>
  346. </template>
  347. </el-table-column>
  348. <el-table-column align="center" prop="studentStatus" label="学员状态">
  349. <template slot-scope="scope">
  350. <div>{{ scope.row.studentStatus | musicGroupStudentType }}</div>
  351. </template>
  352. </el-table-column>
  353. <!-- <el-table-column align="center" label="新增学员">
  354. <template slot-scope="scope">
  355. <div>{{ scope.row.isNewStudent | yesOrNo }}</div>
  356. </template>
  357. </el-table-column> -->
  358. <el-table-column align="center" label="报名缴费">
  359. <template slot-scope="scope">
  360. <div>{{ scope.row.paymentStatus | paymentStatus }}</div>
  361. </template>
  362. </el-table-column>
  363. <!-- <el-table-column align="center" label="是否激活">
  364. <template slot-scope="scope">
  365. <div>{{ scope.row.isActive ? "是" : "否" }}</div>
  366. </template>
  367. </el-table-column> -->
  368. <!-- <el-table-column align="center" label="VIP/网管是否有课">
  369. <template slot-scope="scope">
  370. <div>{{ scope.row.hasCourse ? "是" : "否" }}</div>
  371. </template>
  372. </el-table-column> -->
  373. <!-- <el-table-column align="center" label="关心包">
  374. <template slot-scope="scope">{{
  375. scope.row.carePackage | studentPackage
  376. }}</template>
  377. </el-table-column> -->
  378. <!-- <el-table-column align="center" label="加油包">
  379. <template slot-scope="scope">{{
  380. scope.row.comeOnPackage | studentPackage
  381. }}</template>
  382. </el-table-column> -->
  383. <el-table-column align="center" label="欠费金额(元)">
  384. <template slot-scope="scope">
  385. <div :class="[scope.row.noPaymentAmount > 0 ? 'error' : null]">
  386. {{ scope.row.noPaymentAmount | moneyFormat }}
  387. <!-- musicGroupPaymentCalenderDetail/queryPage/studentList -->
  388. <auth
  389. auths="musicGroupPaymentCalenderDetail/queryPage/studentList"
  390. :router="['/business/resetTeaming']"
  391. >
  392. <i
  393. style="color: #14928a; font-size: 17px"
  394. title="缴费记录"
  395. class="el-icon-view"
  396. @click="onPaymentDetail(scope.row)"
  397. ></i>
  398. </auth>
  399. </div>
  400. </template>
  401. </el-table-column>
  402. <!-- <el-table-column label="退团原因" align="center">
  403. <template slot-scope="scope">
  404. <div>
  405. <Tooltip :content="scope.row.quitReason" />
  406. </div>
  407. </template>
  408. </el-table-column> -->
  409. <el-table-column
  410. label="下次续费时间(剩余天数)"
  411. align="center"
  412. width="120px;"
  413. >
  414. <template slot-scope="scope">
  415. <div>
  416. {{ scope.row.musicMembershipEndTime | dayjsFormat }}
  417. <p
  418. class="error"
  419. v-if="
  420. scope.row.musicMembershipEndTime &&
  421. scope.row.musicMembershipDay >= 0
  422. "
  423. >
  424. 剩余{{ scope.row.musicMembershipDay }}天
  425. </p>
  426. <p
  427. class="error"
  428. v-if="
  429. scope.row.musicMembershipEndTime &&
  430. scope.row.musicMembershipDay < 0
  431. "
  432. >
  433. 已欠费{{ Math.abs(scope.row.musicMembershipDay) }}天
  434. </p>
  435. </div>
  436. </template>
  437. </el-table-column>
  438. <el-table-column
  439. label="会员试用结束日期(剩余天数)"
  440. align="center"
  441. width="120px;"
  442. >
  443. <template slot-scope="scope">
  444. <div>
  445. {{ scope.row.experienceMembershipEndTime | dayjsFormat }}
  446. <p
  447. class="error"
  448. v-if="
  449. scope.row.experienceMembershipEndTime &&
  450. scope.row.experienceMembershipDay >= 0
  451. "
  452. >
  453. 剩余{{ scope.row.experienceMembershipDay }}天
  454. </p>
  455. <p
  456. class="error"
  457. v-if="
  458. scope.row.experienceMembershipEndTime &&
  459. scope.row.experienceMembershipDay < 0
  460. "
  461. >
  462. 已过期{{ Math.abs(scope.row.experienceMembershipDay) }}天
  463. </p>
  464. </div>
  465. </template>
  466. </el-table-column>
  467. <el-table-column
  468. label="会员截止时间(剩余天数)"
  469. align="center"
  470. width="120px;"
  471. >
  472. <template slot-scope="scope">
  473. <div v-if="scope.row.membershipEndTime">
  474. <div v-if="scope.row.membershipDay >= 0">
  475. {{ scope.row.membershipEndTime | dayjsFormat }}
  476. <p class="red">剩余{{ scope.row.membershipDay }}天</p>
  477. </div>
  478. <!-- 已过期 -->
  479. <div v-else>
  480. <!-- 有未生效 -->
  481. <div v-if="scope.row.hasNoStartCloudTeacher">
  482. <p>会员未生效</p>
  483. </div>
  484. <!-- 无未生效 -->
  485. <div v-else>
  486. {{ scope.row.membershipEndTime | dayjsFormat }}
  487. <p class="red" v-if="scope.row.membershipDay < 0">
  488. 已过期{{ Math.abs(scope.row.membershipDay) }}天
  489. </p>
  490. </div>
  491. </div>
  492. <!-- <div></div>
  493. <p v-if="scope.row.hasNoStartCloudTeacher">
  494. {{ scope.row.membershipEndTime | dayjsFormat }}
  495. </p> -->
  496. </div>
  497. <div v-else class="red">
  498. <div v-if="scope.row.hasNoStartCloudTeacher">会员未生效</div>
  499. <div v-else>未购买会员</div>
  500. </div>
  501. </template>
  502. </el-table-column>
  503. <el-table-column label="备注" prop="remark" align="center">
  504. <template slot-scope="scope">
  505. <div>
  506. <overflow-text :text="scope.row.remark"></overflow-text>
  507. </div>
  508. </template>
  509. </el-table-column>
  510. <el-table-column align="center" width="180px;" label="操作">
  511. <template slot-scope="scope">
  512. <div>
  513. <el-button
  514. type="text"
  515. v-if="
  516. permission('studentManage/queryStudentClassGroup') &&
  517. scope.row.studentStatus != 'QUIT'
  518. "
  519. @click="lookClass(scope.row)"
  520. >查看班级</el-button
  521. >
  522. <el-button
  523. type="text"
  524. v-if="
  525. permission('musicGroupPaymentCalender/add') &&
  526. scope.row.studentStatus == 'APPLY' &&
  527. scope.row.paymentStatus != '2' &&
  528. team_status == 'PROGRESS'
  529. "
  530. @click="addPay(scope.row)"
  531. >添加缴费</el-button
  532. >
  533. <el-button
  534. type="text"
  535. v-if="
  536. permission('musicGroupQuit/directQuitMusicGroup/3852') &&
  537. scope.row.studentStatus != 'QUIT'
  538. "
  539. @click="quieTeamMask(scope.row)"
  540. >退团退费</el-button
  541. >
  542. <el-button
  543. type="text"
  544. v-if="
  545. permission('musicGroupQuit/directQuitMusicGroup/3851') &&
  546. scope.row.studentStatus != 'QUIT'
  547. "
  548. @click="quieTeam(scope.row)"
  549. >退团</el-button
  550. >
  551. <el-button
  552. type="text"
  553. v-if="permission('visit/add/teamStudentList')"
  554. @click="addVisit(scope.row)"
  555. >新增回访</el-button
  556. >
  557. <!-- <el-popover
  558. v-show="scope.row.remark"
  559. placement="top-start"
  560. title="备注"
  561. width="200"
  562. trigger="hover"
  563. :content="scope.row.remark"
  564. >
  565. <el-button type="text" slot="reference">备注</el-button>
  566. </el-popover> -->
  567. </div>
  568. </template>
  569. </el-table-column>
  570. </el-table>
  571. <pagination
  572. :save-key="saveKey"
  573. sync
  574. :total.sync="rules.total"
  575. :page.sync="rules.page"
  576. :limit.sync="rules.limit"
  577. :page-sizes="rules.page_size"
  578. @pagination="getList"
  579. />
  580. </div>
  581. <el-dialog
  582. title="新增学员"
  583. width="700px"
  584. class="studentInfo"
  585. :visible.sync="addStudentVisible"
  586. >
  587. <el-form
  588. :model="maskForm"
  589. label-position="right"
  590. label-width="120px"
  591. ref="maskForm"
  592. :rules="maskRules"
  593. :inline="true"
  594. >
  595. <el-alert title="基本信息" :closable="false" class="alert" type="info">
  596. </el-alert>
  597. <el-form-item
  598. label="联系电话"
  599. prop="phone"
  600. :rules="[
  601. { required: true, message: '请输入手机号' },
  602. {
  603. pattern: /^1[3456789]\d{9}$/,
  604. message: '请输入正确的手机号',
  605. trigger: 'blur',
  606. },
  607. ]"
  608. >
  609. <el-input
  610. v-model.trim="maskForm.phone"
  611. placeholder="联系电话"
  612. @blur="checkPhone(maskForm.phone)"
  613. ></el-input>
  614. </el-form-item>
  615. <el-form-item label="学员姓名" prop="studentName">
  616. <el-input
  617. v-model.trim="maskForm.studentName"
  618. placeholder="学员姓名"
  619. ></el-input>
  620. </el-form-item>
  621. <el-form-item label="学员性别" prop="sex">
  622. <el-select
  623. v-model.trim="maskForm.sex"
  624. clearable
  625. style="width: 185px !important"
  626. >
  627. <el-option label="男" :value="1"></el-option>
  628. <el-option label="女" :value="0"></el-option>
  629. </el-select>
  630. </el-form-item>
  631. <!-- <el-form-item label="家长姓名" prop="parentName">
  632. <el-input
  633. v-model.trim="maskForm.parentName"
  634. placeholder="家长姓名"
  635. ></el-input>
  636. </el-form-item> -->
  637. <el-form-item label="年级" prop="currentGradeNum">
  638. <el-select
  639. placeholder="起始年级"
  640. filterable
  641. clearable
  642. v-model.trim="maskForm.currentGradeNum"
  643. style="width: 185px !important"
  644. >
  645. <el-option
  646. v-for="item in gradeList"
  647. :key="item.value"
  648. :label="item.label"
  649. :value="item.value"
  650. ></el-option>
  651. <!-- <el-option value="一年级" label="一年级"></el-option>
  652. <el-option value="二年级" label="二年级"></el-option>
  653. <el-option value="三年级" label="三年级"></el-option>
  654. <el-option value="四年级" label="四年级"></el-option>
  655. <el-option value="五年级" label="五年级"></el-option>
  656. <el-option value="六年级" label="六年级"></el-option>
  657. <el-option value="初一" label="初一"></el-option>
  658. <el-option value="初二" label="初二"></el-option>
  659. <el-option value="初三" label="初三"></el-option>
  660. <el-option value="高一" label="高一"></el-option>
  661. <el-option value="高二" label="高二"></el-option>
  662. <el-option value="高三" label="高三"></el-option> -->
  663. </el-select>
  664. </el-form-item>
  665. <el-form-item label="班级" prop="course">
  666. <el-input
  667. v-model.trim="maskForm.course"
  668. placeholder="班级"
  669. ></el-input>
  670. </el-form-item>
  671. <el-form-item label="学员声部" prop="sound">
  672. <el-select
  673. v-model.trim="maskForm.sound"
  674. clearable
  675. filterable
  676. @change="onSoundChange"
  677. style="width: 185px !important"
  678. >
  679. <el-option
  680. v-for="(item, index) in soundList"
  681. :key="index"
  682. :value="item.id"
  683. :label="item.name"
  684. ></el-option>
  685. </el-select>
  686. </el-form-item>
  687. <!-- <el-form-item label="证件号"
  688. prop="id">
  689. <el-input v-model.trim="maskForm.id"></el-input>
  690. </el-form-item>-->
  691. <el-form-item label="出生日期" style="margin-right: 0" prop="timer">
  692. <el-col :span="24">
  693. <el-date-picker
  694. v-model.trim="maskForm.timer"
  695. value-format="yyyy-MM-dd"
  696. type="date"
  697. :picker-options="{
  698. firstDayOfWeek: 1,
  699. }"
  700. placeholder="选择日期"
  701. ></el-date-picker>
  702. </el-col>
  703. </el-form-item>
  704. </el-form>
  705. <div slot="footer" class="dialog-footer">
  706. <!-- <el-button @click="addStudentVisible = false">取 消</el-button> -->
  707. <el-button type="primary" @click="addStudent">确 定</el-button>
  708. </div>
  709. </el-dialog>
  710. <el-dialog
  711. title="学员所在班级"
  712. width="640px"
  713. :visible.sync="studentClassVisible"
  714. >
  715. <el-form :model="classMask">
  716. <el-form-item label="学生姓名">{{
  717. classMask.studentName
  718. }}</el-form-item>
  719. <el-form-item
  720. label="所在班级"
  721. v-for="(item, index) in classLists"
  722. :key="index"
  723. >{{ item.name }}</el-form-item
  724. >
  725. </el-form>
  726. </el-dialog>
  727. <!-- 退团弹窗 -->
  728. <el-dialog title="退团信息确认" width="640px" :visible.sync="quitVisible">
  729. <quiteTeam :quitForm="quitForm" :activeRow="activeRow" ref="quitForm" />
  730. <span slot="footer" class="dialog-footer question">
  731. <div>
  732. <el-popover placement="right" width="500" trigger="click">
  733. <div class="popoverWrap">
  734. <p>乐团退团退费规则:</p>
  735. <p>退还乐器练习云教练费用:报名缴费时缴费的乐器练习云教练费用</p>
  736. <p>退还课程费用:缴费总额-已结束课时单价之和</p>
  737. <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
  738. <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
  739. <p>退还乐保费用:报名缴费时缴费的乐保费用</p>
  740. </div>
  741. <el-button
  742. type="text"
  743. icon="el-icon-question"
  744. slot="reference"
  745. style="color: red"
  746. >退团退费说明</el-button
  747. >
  748. </el-popover>
  749. </div>
  750. <div>
  751. <el-button @click="quitVisible = false">取 消</el-button>
  752. <el-button type="primary" @click="chioseType">确 定</el-button>
  753. </div>
  754. </span>
  755. </el-dialog>
  756. <el-dialog
  757. title="修改缴费周期"
  758. :before-close="closePayVisible"
  759. width="600px"
  760. :visible.sync="payVisible"
  761. >
  762. <el-form :model="payForm" ref="payForm" :inline="true">
  763. <el-form-item label="学生姓名" prop="studentName">
  764. <el-input v-model.trim="payForm.studentName" disabled></el-input>
  765. </el-form-item>
  766. <br />
  767. <el-form-item label="缴费金额" prop="payMoney">
  768. <el-input
  769. type="number"
  770. v-model.trim="payForm.payMoney"
  771. @mousewheel.native.prevent
  772. ></el-input>
  773. </el-form-item>
  774. <el-form-item label="缴费月份" prop="payMonth">
  775. <el-checkbox-group
  776. v-model.trim="payForm.payMonth"
  777. fill="#14928A"
  778. text-color="#474747"
  779. >
  780. <el-checkbox label="1">一月</el-checkbox>
  781. <el-checkbox label="2">二月</el-checkbox>
  782. <el-checkbox label="3">三月</el-checkbox>
  783. <el-checkbox label="4">四月</el-checkbox>
  784. <el-checkbox label="5">五月</el-checkbox>
  785. <el-checkbox label="6">六月</el-checkbox>
  786. <el-checkbox label="7">七月</el-checkbox>
  787. <el-checkbox label="8">八月</el-checkbox>
  788. <el-checkbox label="9">九月</el-checkbox>
  789. <el-checkbox label="10">十月</el-checkbox>
  790. <el-checkbox label="11">十一月</el-checkbox>
  791. <el-checkbox label="12">十二月</el-checkbox>
  792. </el-checkbox-group>
  793. </el-form-item>
  794. <!-- studentName: '',
  795. payMoney: '',
  796. payMonth-->
  797. </el-form>
  798. <div slot="footer" class="dialog-footer">
  799. <el-button @click="quitVisible = false">取 消</el-button>
  800. <el-button type="primary" @click="submitPay">确 定</el-button>
  801. </div>
  802. </el-dialog>
  803. <el-dialog
  804. title="新增回访"
  805. width="500px"
  806. destroy-on-close
  807. :close-on-click-modal="false"
  808. :visible.sync="visitVisiable"
  809. >
  810. <visit
  811. v-if="visitVisiable && detail"
  812. :detail="detail"
  813. @close="visitVisiable = false"
  814. @submited="getList"
  815. />
  816. </el-dialog>
  817. <el-dialog
  818. title="选择班级"
  819. destroy-on-close
  820. width="830px"
  821. :visible.sync="createUserPayVisible"
  822. >
  823. <createUserPay
  824. :signList="signList"
  825. :mixList="mixList"
  826. :highList="highList"
  827. :snapList="snapList"
  828. :highonlineList="highonlineList"
  829. :musicGroupId="this.teamid"
  830. :organizationCourseUnitPriceSettings="
  831. organizationCourseUnitPriceSettings
  832. "
  833. :createdUserId="createdUserId"
  834. :baseInfo="baseInfo"
  835. @submited="getList"
  836. @close="createUserPayVisible = false"
  837. />
  838. </el-dialog>
  839. <el-dialog
  840. title="缴费记录"
  841. width="900px"
  842. :visible.sync="paymentDetailVisible"
  843. >
  844. <payment-list
  845. v-if="paymentDetailVisible"
  846. :paymentDetail="paymentDetail"
  847. @close="paymentDetailVisible = false"
  848. />
  849. </el-dialog>
  850. <el-dialog
  851. title="订单详情"
  852. :visible.sync="orderVisible"
  853. width="600px"
  854. v-if="orderVisible"
  855. >
  856. <el-form :model="orderForm" :inline="true">
  857. <el-form-item label="学员姓名">
  858. <el-input v-model.trim="orderForm.name" disabled=""></el-input>
  859. </el-form-item>
  860. <el-form-item label="实缴金额">
  861. <el-input v-model.trim="orderForm.totalAmount" disabled=""></el-input>
  862. </el-form-item>
  863. <el-form-item label="实际专业">
  864. <el-input v-model.trim="orderForm.subject" disabled=""></el-input>
  865. </el-form-item>
  866. <el-form-item label="课程费用">
  867. <el-input v-model.trim="orderForm.subjectFee" disabled=""></el-input>
  868. </el-form-item>
  869. <el-form-item label="选择乐器">
  870. <el-input v-model.trim="orderForm.axe" disabled=""></el-input>
  871. </el-form-item>
  872. <el-form-item label="乐器价格">
  873. <el-input v-model.trim="orderForm.axePrice" disabled=""></el-input>
  874. </el-form-item>
  875. <el-form-item label="教辅组合">
  876. <el-input v-model.trim="orderForm.others" disabled=""></el-input>
  877. </el-form-item>
  878. <el-form-item label="组合价格">
  879. <el-input v-model.trim="orderForm.othersPrice" disabled=""></el-input>
  880. </el-form-item>
  881. </el-form>
  882. <div slot="footer" class="dialog-footer">
  883. <!-- <el-button>取 消</el-button> -->
  884. <el-button type="primary" @click="orderVisible = false"
  885. >确 定</el-button
  886. >
  887. </div>
  888. </el-dialog>
  889. <el-dialog
  890. title="新增会员试用期"
  891. width="600px"
  892. :visible.sync="addTryVisible"
  893. >
  894. <addTryList
  895. ref="addTry"
  896. v-if="addTryVisible"
  897. :multipleSelection="multipleSelection"
  898. :memberRankList="memberRankList"
  899. @close="addTryVisible = false"
  900. @submited="getList"
  901. />
  902. <div slot="footer" class="dialog-footer">
  903. <el-button @click="addTryVisible = false">取 消</el-button>
  904. <el-button type="primary" @click="submitAddTryTime">确 定</el-button>
  905. </div>
  906. </el-dialog>
  907. </div>
  908. </template>
  909. <script>
  910. import {
  911. getTeamStudentList,
  912. getTeamStudentInfo,
  913. findSound,
  914. StudentQuit,
  915. findSubjectPlan,
  916. getGoods,
  917. getMusicGroup,
  918. getMusicGroupAllClass,
  919. StudentFeeIsLock,
  920. updateStudentFee,
  921. getMusicGroupGradeList,
  922. } from "@/api/buildTeam";
  923. import {
  924. addStudent,
  925. getStudentClass,
  926. getStudentInfoByPhone,
  927. } from "@/api/studentManager";
  928. import { getAllmemberRank } from "@/views/resetTeaming/api";
  929. import qrCode from "@/components/QrCode/index";
  930. import { getOrganizationCourseUnitPriceSettings } from "@/api/specialSetting";
  931. import { visitChiose } from "@/utils/searchArray";
  932. import pagination from "@/components/Pagination/index";
  933. import { vaildStudentUrl, vaildTeacherUrl } from "@/utils/validate";
  934. import QRCode from "qrcodejs2";
  935. import axios from "axios";
  936. import { getToken } from "@/utils/auth";
  937. import { permission } from "@/utils/directivePage";
  938. import { addVisit } from "@/views/returnVisitManager/api.js";
  939. import cleanDeep from "clean-deep";
  940. import createUserPay from "./modals/create-user-pay.vue";
  941. import TimesView from "./modals/course-time-detail";
  942. import paymentCycle from "../../resetTeaming/modals/payment-cycle";
  943. import paymentList from "./modals/payment-list";
  944. import Tooltip from "@/components/Tooltip/index";
  945. import changeVoice from "@/views/teamBuild/modals/change-voice";
  946. //import changeVoice from "./modals/change-voice";
  947. import visit from "@/views/withdrawal-application/modals/visit";
  948. import mergeMusic from "@/views/teamBuild/components/merge-music";
  949. import quiteTeam from "@/views/teamDetail/components/modals/quite-team";
  950. import addTryList from "@/views/teamDetail/components/modals/addTryList";
  951. export default {
  952. name: "tstudentList",
  953. data() {
  954. return {
  955. detail: null,
  956. teamid: "",
  957. paymentDetailVisible: false,
  958. paymentDetail: {},
  959. payVisible: false,
  960. quitVisible: false, // 退团信息确认的弹窗
  961. studentClassVisible: false, // 学员所在班级弹窗
  962. addStudentVisible: false, //新增学员弹窗
  963. timesVisible: false,
  964. timerDetail: null,
  965. topFrom: {
  966. // 顶部的禁选框集合
  967. expect: "2", // 预期招生
  968. studing: "5", // 在读人数
  969. allmoney: "100", //实收总额
  970. students: "5", // 实际招生人数
  971. signout: "10", // 退团总数
  972. },
  973. searchForm: {
  974. studentStatus: "", // 学生状态
  975. major: "", // 报名专业
  976. isPay: "", // 是否缴费
  977. search: "",
  978. isActive: "",
  979. oweFlag: "",
  980. currentGrade: null,
  981. createYear: null,
  982. classGroupId: null,
  983. hasCourse: null,
  984. carePackage: null,
  985. comeOnPackage: null,
  986. },
  987. organizationCourseUnitPriceSettings: [],
  988. quitForm: {
  989. // 退团信息确认
  990. isCloudTeacherAmount: null,
  991. cloudTeacherAmount: null,
  992. isRefundCourseFee: null,
  993. isRefundInstrumentFee: null,
  994. isRefundTeachingAssistantsFee: null,
  995. isMaintenanceFee: null,
  996. maintenanceFee: 0,
  997. reason: "",
  998. },
  999. classMask: {
  1000. studentName: "",
  1001. },
  1002. baseInfo: {},
  1003. searchLsit: [],
  1004. tableList: [], //
  1005. rules: {
  1006. // 分页规则
  1007. limit: 10, // 限制显示条数
  1008. page: 1, // 当前页
  1009. total: 0, // 总条数
  1010. page_size: [10, 20, 40, 50], // 选择限制显示条数
  1011. },
  1012. studentListInfo: {
  1013. add: "",
  1014. quit: "",
  1015. studying: "",
  1016. courseRate: "",
  1017. },
  1018. signList: [],
  1019. mixList: [],
  1020. highList: [],
  1021. snapList: [],
  1022. soundList: [],
  1023. highonlineList: [],
  1024. muiscnetworkList: [],
  1025. qrcodeStatus: false, // 生成二维码
  1026. qrcodes: true,
  1027. qrcode: null,
  1028. codeUrl: null,
  1029. gradeList: [], // 学生
  1030. maskForm: {
  1031. studentName: "",
  1032. sex: "",
  1033. parentName: "",
  1034. course: "",
  1035. phone: "",
  1036. sound: "",
  1037. timer: "",
  1038. signClass: "",
  1039. mixClass: "",
  1040. highClass: "",
  1041. snapClass: [],
  1042. highonline: "",
  1043. muiscnetwork: "",
  1044. startClass: "",
  1045. currentGradeNum: null,
  1046. id: "",
  1047. // courseFee: null, // 声部费用
  1048. temporaryCourseFee: null, // 本次课程费用
  1049. musicGoodsIdList: null, // 乐器商品编号
  1050. kitGroupPurchaseType: "GROUP", // 乐器购买方式
  1051. musicPrice: null, // 乐器购买金额
  1052. instrGoodsIdList: [], // 辅件商品编号
  1053. instrPrice: null, // 辅件购买金额
  1054. },
  1055. remark: "", // 退团原因
  1056. classList: [],
  1057. maskRules: {
  1058. studentName: [{ required: true, message: "请输入学生姓名" }],
  1059. sex: [{ required: true, message: "请选择学生姓名" }],
  1060. parentName: [{ required: true, message: "请输入家长姓名" }],
  1061. course: [{ required: true, message: "请输入班级" }],
  1062. // phone: [{ required: true, message: '请输入手机号' }, { pattern: /^1[3456789]\d{9}$/, message: '请输入正确的手机号', trigger: 'blur' }],
  1063. sound: [{ required: true, message: "请选择声部" }],
  1064. timer: [{ required: true, message: "请选择出生日期" }],
  1065. signClass: [{ required: true, message: "请选择声部班" }],
  1066. // price: [{ required: true, message: '请输入首缴金额' },],
  1067. currentGradeNum: [{ required: true, message: "请选择年级" }],
  1068. id: [{ required: true, message: "请输入证件号" }],
  1069. // courseFee: [{ required: true, message: "请输入声部费用" }],
  1070. temporaryCourseFee: [{ required: true, message: "请输课程费用" }],
  1071. musicGoodsIdList: [
  1072. { required: true, message: "请选择乐器", trigger: "change" },
  1073. ],
  1074. musicPrice: [{ required: true, message: "请输入乐器购买金额" }],
  1075. instrGoodsIdList: [{ required: true, message: "请选择辅件" }],
  1076. instrPrice: [{ required: true, message: "请输入辅件金额" }],
  1077. },
  1078. INSTRUMENTLIST: [], // 乐器列表
  1079. ACCESSORIESLIST: [], // 辅件列表
  1080. activeRow: { hasMaintenance: false },
  1081. Fsearch: null,
  1082. Frules: null,
  1083. payForm: {
  1084. studentName: "",
  1085. payMoney: "",
  1086. payMonth: [],
  1087. },
  1088. kitStatus: false, // 乐器提供方式
  1089. // 新增回访记录弹窗
  1090. visitVisiable: false,
  1091. visitForm: {
  1092. musicGroupId: "",
  1093. overview: "",
  1094. purpose: "",
  1095. studentId: "",
  1096. type: "",
  1097. visitTime: "",
  1098. visitType: "",
  1099. feedback: "",
  1100. studentName: "",
  1101. },
  1102. cycles: [{}],
  1103. collapse: [0],
  1104. visitChiose,
  1105. visitRules: {
  1106. overview: [{ required: true, message: "请输入学生近况" }],
  1107. feedback: [{ required: true, message: "请输入家长反馈" }],
  1108. visitTime: [{ required: true, message: "请输入回访时间" }],
  1109. visitType: [{ required: true, message: "请选择回访类型" }],
  1110. },
  1111. pickerOptions: null,
  1112. classLists: null,
  1113. createdUserId: 0,
  1114. createUserPayVisible: false,
  1115. team_status: "",
  1116. // 整合报名中
  1117. orderVisible: false,
  1118. orderForm: {
  1119. name: "",
  1120. totalAmount: "",
  1121. subject: "",
  1122. subjectFee: "",
  1123. axe: "",
  1124. axePrice: "",
  1125. others: "",
  1126. othersPrice: "",
  1127. },
  1128. maskSoundForm: {
  1129. subject: "",
  1130. },
  1131. subjectVisible: false,
  1132. multipleSelection: [],
  1133. isCanReg: false,
  1134. organId: "",
  1135. addTryVisible: false,
  1136. memberRankList: [],
  1137. };
  1138. },
  1139. components: {
  1140. pagination,
  1141. paymentCycle,
  1142. createUserPay,
  1143. Tooltip,
  1144. "times-view": TimesView,
  1145. paymentList,
  1146. visit,
  1147. qrCode,
  1148. changeVoice,
  1149. mergeMusic,
  1150. quiteTeam,
  1151. addTryList,
  1152. },
  1153. created() {},
  1154. filters: {
  1155. studentPays(val) {
  1156. let template = {
  1157. 0: "未缴费",
  1158. 1: "已缴费",
  1159. };
  1160. return template[val];
  1161. },
  1162. },
  1163. // activated() {
  1164. // this.init();
  1165. // },
  1166. async mounted() {
  1167. try {
  1168. const res = await getOrganizationCourseUnitPriceSettings({
  1169. rows: 9999,
  1170. });
  1171. this.organizationCourseUnitPriceSettings = res.data.rows;
  1172. } catch (error) {}
  1173. try {
  1174. const res = await getAllmemberRank({ isDefault: 0 });
  1175. this.memberRankList = res.data;
  1176. } catch (e) {
  1177. console.log(e);
  1178. }
  1179. this.init();
  1180. },
  1181. methods: {
  1182. onPaymentDetail(row) {
  1183. this.paymentDetail = row;
  1184. this.paymentDetailVisible = true;
  1185. },
  1186. viewTimer(row) {
  1187. // this.timerDetail = row
  1188. this.timesVisible = true;
  1189. },
  1190. permission(str) {
  1191. return permission(str);
  1192. },
  1193. async init() {
  1194. this.teamid = this.$route.query.id;
  1195. this.team_status = this.$route.query.team_status;
  1196. this.organId = this.$route.query.organId;
  1197. // 获取乐团是否能补招
  1198. // try {
  1199. // const ruselt = await checkCanReg({ musicGroupId: this.teamid });
  1200. // this.isCanReg = ruselt.data;
  1201. // } catch (e) {
  1202. // console.log(e);
  1203. // }
  1204. getMusicGroupGradeList({ musicGroupId: this.teamid }).then((res) => {
  1205. let result = res.data;
  1206. if (res.code == 200 && result) {
  1207. for (let i in result) {
  1208. this.gradeList.push({
  1209. value: i,
  1210. label: result[i],
  1211. });
  1212. }
  1213. }
  1214. });
  1215. // 获取报名截止日期和缴费截止日期
  1216. // getTeamBaseInfo({ musicGroupId: this.teamid }).then((res) => {
  1217. // if (res.code == 200) {
  1218. // this.paymentExpireDate = res.data.musicGroup.paymentExpireDate;
  1219. // this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  1220. // this.organId = res.data.musicGroup.organId;
  1221. // }
  1222. // });
  1223. // 获取汇总数据
  1224. // this.getTeamStudent();
  1225. this.pickerOptions = this.beginDate();
  1226. this.getList();
  1227. // 获取乐团内所有声部
  1228. findSound({ musicGroupId: this.teamid }).then((res) => {
  1229. if (res.code == 200) {
  1230. this.soundList = res.data;
  1231. }
  1232. });
  1233. // this.getMusicClass()
  1234. // 获取乐团基本信息
  1235. getMusicGroup({ musicGroupId: this.teamid }).then(
  1236. (res) => (this.baseInfo = res.data)
  1237. );
  1238. // 获取乐团所有合奏课
  1239. },
  1240. getMusicClass() {
  1241. getMusicGroupAllClass({ musicGroupId: this.teamid }).then((res) => {
  1242. if (res.code == 200) {
  1243. this.classList = res.data;
  1244. this.signList = [];
  1245. this.mixList = [];
  1246. this.highList = [];
  1247. this.snapList = [];
  1248. this.highonlineList = [];
  1249. this.classList.forEach((item) => {
  1250. if (item.type == "NORMAL") {
  1251. this.signList.push(item);
  1252. } else if (item.type == "MIX") {
  1253. this.mixList.push(item);
  1254. } else if (item.type == "HIGH") {
  1255. this.highList.push(item);
  1256. } else if (item.type == "HIGH_ONLINE" && item.studentNum < 6) {
  1257. this.highonlineList.push(item);
  1258. } else if (item.type == "SNAP") {
  1259. this.snapList.push(item);
  1260. } else if (item.type == "MUSIC_NETWORK") {
  1261. this.muiscnetworkList.push(item);
  1262. }
  1263. });
  1264. }
  1265. });
  1266. },
  1267. getTeamStudent() {
  1268. getTeamStudentInfo({ musicGroupId: this.teamid }).then((res) => {
  1269. if (res.code == 200) {
  1270. this.studentListInfo = res.data;
  1271. }
  1272. });
  1273. },
  1274. permission(str) {
  1275. return permission(str);
  1276. },
  1277. onInstrumentChange() {
  1278. // 乐器切换时
  1279. // 乐器切换时
  1280. // let tempkitType = this.maskForm.kitGroupPurchaseType
  1281. // if(tempkitType == 'GROUP') {
  1282. // this.INSTRUMENTLIST.forEach(item => {
  1283. // if(item.value == value) {
  1284. // this.maskForm.musicPrice = item.marketPrice
  1285. // }
  1286. // })
  1287. // }
  1288. },
  1289. onKitGroupChnage(value) {
  1290. // 乐器提供方式
  1291. this.kitStatus = false;
  1292. if (value == "FREE") {
  1293. this.kitStatus = true;
  1294. this.maskForm.musicPrice = 0;
  1295. } else {
  1296. this.maskForm.musicPrice = null;
  1297. }
  1298. },
  1299. onMusicGroupExport() {
  1300. let url = "/api-web/export/musicGroupStudent";
  1301. let data = {
  1302. musicGroupId: this.teamid,
  1303. studentStatus: this.searchForm.studentStatus || null,
  1304. paymentStatus: this.searchForm.isPay || null,
  1305. subjectId: this.searchForm.major || null,
  1306. search: this.searchForm.search || null,
  1307. isActive: this.searchForm.isActive || null,
  1308. classGroupId: this.searchForm.classGroupId || null,
  1309. currentGrade: this.searchForm.currentGrade || null,
  1310. createYear: this.searchForm.createYear || null,
  1311. hasCourse: this.searchForm.hasCourse || null,
  1312. comeOnPackage: this.searchForm.comeOnPackage,
  1313. carePackage: this.searchForm.carePackage,
  1314. };
  1315. const options = {
  1316. method: "get",
  1317. headers: {
  1318. Authorization: getToken(),
  1319. },
  1320. url,
  1321. params: data,
  1322. responseType: "blob",
  1323. };
  1324. this.$confirm("您确定导出学员列表?", "提示", {
  1325. confirmButtonText: "确定",
  1326. cancelButtonText: "取消",
  1327. type: "warning",
  1328. })
  1329. .then(() => {
  1330. axios(options).then((res) => {
  1331. let blob = new Blob([res.data], {
  1332. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
  1333. type: "application/vnd.ms-excel;charset=utf-8",
  1334. // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  1335. });
  1336. let objectUrl = URL.createObjectURL(blob);
  1337. let link = document.createElement("a");
  1338. let fname = this.$route.query.name + "学员列表.xls";
  1339. link.href = objectUrl;
  1340. link.setAttribute("download", fname);
  1341. document.body.appendChild(link);
  1342. link.click();
  1343. });
  1344. })
  1345. .catch(() => {});
  1346. },
  1347. search() {
  1348. this.rules.page = 1;
  1349. this.getList();
  1350. },
  1351. onReSet() {
  1352. this.$refs.searchForm.resetFields();
  1353. this.search();
  1354. },
  1355. getList() {
  1356. // getintoClass({ musicGroupId: this.teamid }).then((res) => {
  1357. // if (res.code == 200) {
  1358. // this.$set(this, "leftList", res.data);
  1359. // // this.leftList = res.data;
  1360. // }
  1361. // });
  1362. this.getTeamStudent();
  1363. let obj = {
  1364. musicGroupId: this.teamid,
  1365. page: this.rules.page,
  1366. rows: this.rules.limit,
  1367. studentStatus: this.searchForm.studentStatus || null,
  1368. paymentStatus: this.searchForm.isPay || null,
  1369. subjectId: this.searchForm.major || null,
  1370. search: this.searchForm.search || null,
  1371. isActive: this.searchForm.isActive || null,
  1372. classGroupId: this.searchForm.classGroupId || null,
  1373. currentGrade: this.searchForm.currentGrade || null,
  1374. createYear: this.searchForm.createYear || null,
  1375. oweFlag: this.searchForm.oweFlag || null,
  1376. hasCourse: this.searchForm.hasCourse || null,
  1377. oweFlag: this.searchForm.oweFlag || null,
  1378. comeOnPackage: this.searchForm.comeOnPackage,
  1379. carePackage: this.searchForm.carePackage,
  1380. hasMember: this.searchForm.hasMember,
  1381. };
  1382. return getTeamStudentList(obj).then((res) => {
  1383. if (res.code == 200) {
  1384. this.tableList = res.data.rows;
  1385. this.rules.total = res.data.total;
  1386. return res;
  1387. }
  1388. });
  1389. },
  1390. addPay(row) {
  1391. this.createUserPayVisible = true;
  1392. this.createdUserId = row.userId;
  1393. },
  1394. addCycle() {
  1395. this.cycles.push({});
  1396. this.collapse.push(this.collapse.length);
  1397. },
  1398. removeCycle(index) {
  1399. this.cycles[index] = null;
  1400. this.cycles = this.cycles.filter((item) => !!item);
  1401. this.collapse.pop();
  1402. },
  1403. collapseChange(val) {
  1404. this.collapse = val;
  1405. },
  1406. gotoSignin() {
  1407. this.$router.push({
  1408. path: "/business/studentSignin",
  1409. query: {
  1410. id: this.teamid,
  1411. status: this.$route.query.status,
  1412. name: this.$route.query.name,
  1413. rules: this.Frules,
  1414. search: this.Fsearch,
  1415. },
  1416. });
  1417. },
  1418. chioseType() {
  1419. // 父级验证子集表单
  1420. this.$refs["quitForm"].$refs["quitForm"].validate((res) => {
  1421. if (res) {
  1422. this.$confirm("确定退团?", "提示", {
  1423. confirmButtonText: "确定",
  1424. cancelButtonText: "取消",
  1425. type: "warning",
  1426. })
  1427. .then(() => {
  1428. let row = this.activeRow;
  1429. let params = {
  1430. musicGroupId: this.teamid,
  1431. userId: row.userId,
  1432. reason: this.quitForm.reason,
  1433. isRefundCourseFee: this.quitForm.isRefundCourseFee,
  1434. isRefundInstrumentFee: this.quitForm.isRefundInstrumentFee,
  1435. isRefundTeachingAssistantsFee:
  1436. this.quitForm.isRefundTeachingAssistantsFee,
  1437. maintenanceFee: this.quitForm.maintenanceFee,
  1438. isRefundMemberFee: this.quitForm.isRefundMemberFee,
  1439. };
  1440. // 退还乐器练习云教练费用
  1441. if (this.quitForm.isRefundMemberFee) {
  1442. params.cloudTeacherAmount = this.quitForm.cloudTeacherAmount;
  1443. } else {
  1444. params.cloudTeacherAmount = 0;
  1445. }
  1446. // 发请求 退团
  1447. StudentQuit(params).then((res) => {
  1448. this.quitForm = {
  1449. // 退团信息确认
  1450. isRefundCourseFee: null,
  1451. isRefundInstrumentFee: null,
  1452. isRefundTeachingAssistantsFee: null,
  1453. isMaintenanceFee: null,
  1454. cloudTeacherAmount: null,
  1455. isCloudTeacherAmount: null,
  1456. isRefundMemberFee: null,
  1457. maintenanceFee: 0,
  1458. reason: "",
  1459. };
  1460. if (res.code == 200) {
  1461. this.$message.success("退团成功");
  1462. this.getList();
  1463. this.quitVisible = false;
  1464. }
  1465. });
  1466. })
  1467. .catch(() => {});
  1468. } else {
  1469. }
  1470. });
  1471. // row.typeVisible = false;
  1472. },
  1473. //
  1474. addStudent() {
  1475. // 发请求添加学员
  1476. this.$refs["maskForm"].validate((res) => {
  1477. if (res) {
  1478. // this.maskForm.parentName.timer 少个生日的字段
  1479. // classGroupId: maskForm.signClass
  1480. /** <!-- signClass: '',
  1481. mixClass: '',
  1482. highClass: '',
  1483. snapClass: [], --> */
  1484. let maskForm = this.maskForm;
  1485. // if (
  1486. // !maskForm.signClass &&
  1487. // !maskForm.mixClass &&
  1488. // !maskForm.highClass &&
  1489. // !maskForm.highonline &&
  1490. // !maskForm.muiscnetwork
  1491. // ) {
  1492. // if (
  1493. // !maskForm.snapClass ||
  1494. // !(maskForm.snapClass && maskForm.snapClass.length >= 1)
  1495. // ) {
  1496. // this.$message.error("该学生必须加入一个班级");
  1497. // return;
  1498. // }
  1499. // }
  1500. if (
  1501. maskForm.musicGoodsIdList &&
  1502. (maskForm.musicPrice === "" || maskForm.musicPrice === null)
  1503. ) {
  1504. this.$message.error("请输入乐器金额");
  1505. return;
  1506. }
  1507. if (
  1508. maskForm.instrGoodsIdList &&
  1509. maskForm.instrGoodsIdList.length > 0 &&
  1510. (maskForm.instrPrice === "" || maskForm.instrPrice === null)
  1511. ) {
  1512. this.$message.error("请输入辅件金额");
  1513. return;
  1514. }
  1515. let snapClassIds;
  1516. maskForm.snapClass
  1517. ? (snapClassIds = maskForm.snapClass.join(","))
  1518. : (snapClassIds = null);
  1519. let params = {
  1520. signClassId: maskForm.signClass,
  1521. mixClassId: maskForm.mixClass,
  1522. snapClassIds,
  1523. highClassId: maskForm.highClass,
  1524. courseFee: maskForm.courseFee,
  1525. temporaryCourseFee: maskForm.temporaryCourseFee,
  1526. studentRegistration: {
  1527. name: maskForm.studentName,
  1528. gender: maskForm.sex,
  1529. birthdate: maskForm.timer,
  1530. parentsName: maskForm.parentName,
  1531. parentsPhone: maskForm.phone,
  1532. currentGrade: maskForm.startClass,
  1533. currentGradeNum: maskForm.currentGradeNum,
  1534. currentClass: maskForm.course,
  1535. subjectId: maskForm.sound,
  1536. musicGroupId: this.teamid,
  1537. },
  1538. };
  1539. params.studentPaymentOrderDetails = [];
  1540. if (maskForm.musicGoodsIdList) {
  1541. params.studentPaymentOrderDetails.push({
  1542. goodsIdList: maskForm.musicGoodsIdList,
  1543. kitGroupPurchaseType: maskForm.kitGroupPurchaseType,
  1544. type: "MUSICAL",
  1545. price: maskForm.musicPrice,
  1546. });
  1547. }
  1548. if (maskForm.instrGoodsIdList && maskForm.instrGoodsIdList != "") {
  1549. params.studentPaymentOrderDetails.push({
  1550. goodsIdList: maskForm.instrGoodsIdList.join(","),
  1551. type: "ACCESSORIES",
  1552. price: maskForm.instrPrice,
  1553. });
  1554. }
  1555. addStudent(params).then((res) => {
  1556. if (res.code == 200) {
  1557. this.$message.success("添加学生成功");
  1558. this.getList();
  1559. this.addStudentVisible = false;
  1560. this.createUserPayVisible = true;
  1561. this.createdUserId = res.data;
  1562. }
  1563. this.$refs.maskForm.resetFields();
  1564. });
  1565. }
  1566. });
  1567. },
  1568. onSoundChange(value) {
  1569. // 学员声部切换时
  1570. // this.findSubjectPlan(value)
  1571. // this.ACCESSORIESLIST = [];
  1572. // this.maskForm.instrGoodsIdList = [];
  1573. // this.maskForm.instrPrice = null;
  1574. // this.INSTRUMENTLIST = [];
  1575. // this.maskForm.musicPrice = null;
  1576. // this.maskForm.musicGoodsIdList = null;
  1577. // this.getGoodsList(value, "INSTRUMENT"); // 乐器
  1578. // this.getGoodsList(value, "ACCESSORIES"); // 辅件
  1579. },
  1580. // 获取购买方式
  1581. findSubjectPlan(subjectId) {
  1582. findSubjectPlan({
  1583. musicGroupId: this.teamid,
  1584. subjectId: subjectId,
  1585. }).then((res) => {
  1586. let result = res.data;
  1587. if (res.code == 200) {
  1588. this.maskForm.musicMode = this.getBranchType(
  1589. result.kitGroupPurchaseType
  1590. );
  1591. }
  1592. });
  1593. },
  1594. getGoodsList(subjectId, type) {
  1595. getGoods({
  1596. subjectId: subjectId,
  1597. type: type,
  1598. organId: this.organId,
  1599. }).then((res) => {
  1600. let result = res.data;
  1601. if (res.code == 200) {
  1602. let tempArr = [];
  1603. result.forEach((item) => {
  1604. tempArr.push({
  1605. label: item.name,
  1606. value: item.id,
  1607. marketPrice: item.marketPrice,
  1608. });
  1609. });
  1610. if (type == "ACCESSORIES") {
  1611. this.ACCESSORIESLIST = tempArr;
  1612. }
  1613. if (type == "INSTRUMENT") {
  1614. this.INSTRUMENTLIST = tempArr;
  1615. }
  1616. }
  1617. });
  1618. },
  1619. getBranchType(status) {
  1620. let common = {
  1621. FREE: "免费",
  1622. GROUP: "团购",
  1623. LEASE: "租赁",
  1624. };
  1625. return common[status];
  1626. },
  1627. lookClass(row) {
  1628. this.classMask.studentName = row.realName;
  1629. getStudentClass({
  1630. musicGroupId: this.teamid,
  1631. teacherId: row.userId,
  1632. }).then((res) => {
  1633. if (res.code == 200) {
  1634. this.classLists = res.data;
  1635. this.studentClassVisible = true;
  1636. }
  1637. });
  1638. },
  1639. quieTeamMask(row) {
  1640. this.activeRow = row;
  1641. this.activeRow.courseViewType = this.baseInfo.courseViewType;
  1642. this.quitVisible = true;
  1643. this.quitForm.cloudTeacherAmount = row.cloudTeacherAmount;
  1644. },
  1645. quieTeam(row) {
  1646. this.$prompt("请输入退团原因", "提示", {
  1647. confirmButtonText: "确定",
  1648. cancelButtonText: "取消",
  1649. type: "warning",
  1650. inputPattern: /\S/,
  1651. inputErrorMessage: "请输入退团原因",
  1652. })
  1653. .then((val) => {
  1654. // 发请求 退团
  1655. StudentQuit({
  1656. musicGroupId: this.teamid,
  1657. userId: row.userId,
  1658. reason: val.value,
  1659. isRefundCourseFee: false,
  1660. isRefundInstrumentFee: false,
  1661. isRefundTeachingAssistantsFee: false,
  1662. }).then((res) => {
  1663. this.quitForm = {
  1664. // 退团信息确认
  1665. isRefundCourseFee: null,
  1666. isRefundInstrumentFee: null,
  1667. isRefundTeachingAssistantsFee: null,
  1668. isMaintenanceFee: null,
  1669. cloudTeacherAmount: null,
  1670. isCloudTeacherAmount: null,
  1671. maintenanceFee: 0,
  1672. reason: "",
  1673. };
  1674. if (res.code == 200) {
  1675. this.$message.success("退团成功");
  1676. this.getList();
  1677. this.quitVisible = false;
  1678. }
  1679. });
  1680. })
  1681. .catch(() => {});
  1682. },
  1683. checkPhone(val) {
  1684. var regu = /^1[3456789]\d{9}$/;
  1685. var re = new RegExp(regu);
  1686. if (re.test(val)) {
  1687. getStudentInfoByPhone({ mobile: this.maskForm.phone }).then((res) => {
  1688. if (res.code == 200) {
  1689. if (res.data) {
  1690. this.maskForm.studentName = res.data.name;
  1691. this.maskForm.sex = res.data.gender;
  1692. this.maskForm.parentName = res.data.parentsName;
  1693. this.maskForm.course = res.data.currentClass;
  1694. this.maskForm.startClass = res.data.currentGrade;
  1695. this.maskForm.currentGradeNum = res.data.currentGradeNum
  1696. ? res.data.currentGradeNum + ""
  1697. : null;
  1698. this.maskForm.phone = val;
  1699. this.maskForm.timer = res.data.birthdate;
  1700. }
  1701. }
  1702. });
  1703. }
  1704. },
  1705. lockStudent(row) {
  1706. this.$confirm("是否锁定/解锁学生缴费周期?", "提示", {
  1707. confirmButtonText: "确定",
  1708. cancelButtonText: "取消",
  1709. type: "warning",
  1710. })
  1711. .then(() => {
  1712. let musicGroupId = this.teamid;
  1713. let studentId = row.userId;
  1714. let isLock;
  1715. row.isLock == 0 ? (isLock = 1) : (isLock = 0);
  1716. StudentFeeIsLock({ musicGroupId, studentId, isLock }).then((res) => {
  1717. if (res.code == 200) {
  1718. this.$message.success("修改成功");
  1719. this.getList();
  1720. }
  1721. });
  1722. })
  1723. .catch(() => {});
  1724. },
  1725. resetPay(row) {
  1726. this.activeRow = row;
  1727. this.payVisible = true;
  1728. this.payForm.studentName = row.realName;
  1729. this.payForm.payMoney = row.courseFee;
  1730. this.payForm.payMonth = row.paymentPeriodList.split(",");
  1731. if (this.payForm.payMonth[0] == "") {
  1732. this.payForm.payMonth = [];
  1733. }
  1734. },
  1735. submitPay() {
  1736. let studentId = this.activeRow.userId;
  1737. let musicGroupId = this.teamid;
  1738. let month = this.payForm.payMonth.join(",") || null;
  1739. let amount = this.payForm.payMoney;
  1740. let obj = {
  1741. studentId,
  1742. musicGroupId,
  1743. month,
  1744. amount,
  1745. };
  1746. updateStudentFee(obj).then((res) => {
  1747. if (res.code == 200) {
  1748. this.$message.success("修改成功");
  1749. this.payVisible = false;
  1750. this.getList();
  1751. }
  1752. });
  1753. },
  1754. closePayVisible() {
  1755. this.$refs["payForm"].resetFields();
  1756. this.payVisible = false;
  1757. },
  1758. addVisit(row) {
  1759. console.log(row);
  1760. this.detail = row;
  1761. // this.visitForm.studentName = row.realName;
  1762. // this.visitForm.musicGroupId = this.teamid;
  1763. // this.visitForm.studentId = row.userId;
  1764. this.visitVisiable = true;
  1765. },
  1766. handleChange(val) {
  1767. this.visitForm.type = val[0];
  1768. this.visitForm.purpose = val[1];
  1769. },
  1770. submitAddVisit() {
  1771. console.log(this.$refs.visitForm);
  1772. this.$refs.visitForm.validate((res) => {
  1773. if (res) {
  1774. addVisit(cleanDeep(this.visitForm)).then((res) => {
  1775. if (res.code === 200) {
  1776. this.$message.success("新增成功");
  1777. this.visitVisiable = false;
  1778. }
  1779. });
  1780. }
  1781. });
  1782. },
  1783. beginDate() {
  1784. let self = this;
  1785. return {
  1786. firstDayOfWeek: 1,
  1787. disabledDate(time) {
  1788. return time.getTime() >= new Date().getTime(); //开始时间不选时,结束时间最大值小于等于当天
  1789. },
  1790. };
  1791. },
  1792. createStudentFrom() {
  1793. this.addStudentVisible = true;
  1794. },
  1795. // 报名缴费功能
  1796. payDate() {
  1797. let self = this;
  1798. return {
  1799. firstDayOfWeek: 1,
  1800. disabledDate(time) {
  1801. if (self.applyExpireDate) {
  1802. return (
  1803. time.getTime() <=
  1804. new Date(self.applyExpireDate.replace(/-/g, "/")).getTime()
  1805. );
  1806. } else {
  1807. return false;
  1808. }
  1809. },
  1810. };
  1811. },
  1812. applyDate() {
  1813. let self = this;
  1814. return {
  1815. firstDayOfWeek: 1,
  1816. disabledDate(time) {
  1817. if (self.paymentExpireDate) {
  1818. return (
  1819. time.getTime() >
  1820. new Date(self.paymentExpireDate.replace(/-/g, "/")).getTime()
  1821. );
  1822. } else {
  1823. return false;
  1824. }
  1825. },
  1826. };
  1827. },
  1828. handleSelectionChange(val) {
  1829. this.multipleSelection = val;
  1830. },
  1831. checkboxSelect(row) {
  1832. return row.studentStatus == "NORMAL";
  1833. },
  1834. gotoStudent(search) {
  1835. // this.$router.push({
  1836. // name: "teamCourseList",
  1837. // params: { courseIdSearch: row.id },
  1838. // });
  1839. this.$router.push({
  1840. name: "studentList",
  1841. params: { search: search },
  1842. });
  1843. },
  1844. addTryTime() {
  1845. if (this.multipleSelection.length > 0) {
  1846. this.addTryVisible = true;
  1847. } else {
  1848. this.$message.error("请至少选择一名学员");
  1849. }
  1850. },
  1851. submitAddTryTime() {
  1852. this.$refs.addTry.submit();
  1853. },
  1854. },
  1855. watch: {
  1856. createUserPayVisible(val) {
  1857. if (val) {
  1858. this.getMusicClass();
  1859. }
  1860. },
  1861. "quitForm.isMaintenanceFee"(val) {
  1862. if (val) {
  1863. this.quitForm.maintenanceFee = 300;
  1864. } else {
  1865. this.quitForm.maintenanceFee = 0;
  1866. }
  1867. },
  1868. quitVisible(val) {
  1869. if (!val) {
  1870. this.quitForm = {
  1871. // 退团信息确认
  1872. isRefundCourseFee: null,
  1873. isRefundInstrumentFee: null,
  1874. isRefundTeachingAssistantsFee: null,
  1875. isMaintenanceFee: null,
  1876. cloudTeacherAmount: null,
  1877. isCloudTeacherAmount: null,
  1878. isRefundMemberFee: null,
  1879. maintenanceFee: 0,
  1880. reason: "",
  1881. };
  1882. this.$refs["quitForm"].$refs["quitForm"].resetFields();
  1883. }
  1884. },
  1885. // visitVisiable(val) {
  1886. // if (!val) {
  1887. // this.$refs["visitForm"].resetFields();
  1888. // }
  1889. // },
  1890. },
  1891. computed: {
  1892. saveKey() {
  1893. // return 'teamDetails-'+this.$route.query.id
  1894. return "teamDetails-studentList|id|" + this.$route.query.id;
  1895. },
  1896. },
  1897. };
  1898. </script>
  1899. <style lang="scss" scoped>
  1900. .dialog-footer.question {
  1901. display: flex;
  1902. flex-direction: row;
  1903. justify-content: space-between;
  1904. }
  1905. // .moreInput {
  1906. // width: 100%;
  1907. // display: flex;
  1908. // /deep/.el-form-item__content {
  1909. // display: flex;
  1910. // flex-direction: row;
  1911. // }
  1912. // }
  1913. .error {
  1914. color: red;
  1915. }
  1916. .el-select {
  1917. width: 180px !important;
  1918. }
  1919. .headWrap {
  1920. padding: 20px 0;
  1921. }
  1922. /deep/.el-date-editor.el-input {
  1923. width: auto;
  1924. .el-input__inner {
  1925. padding-right: 0;
  1926. }
  1927. }
  1928. .studentInfo {
  1929. /deep/.el-dialog__body {
  1930. // padding-top: 0;
  1931. // padding-bottom: 0;
  1932. }
  1933. }
  1934. // .instrList {
  1935. // display: flex;
  1936. // /deep/.el-form-item__content {
  1937. // width: 80%;
  1938. // }
  1939. // .el-col {
  1940. // /deep/.el-form-item__content {
  1941. // width: 100%;
  1942. // }
  1943. // }
  1944. // }
  1945. .stu-container {
  1946. .topFrom {
  1947. margin: 20px 30px 0;
  1948. width: 1000px;
  1949. }
  1950. .newStudent {
  1951. width: 121px;
  1952. height: 40px;
  1953. background: rgba(20, 146, 138, 1);
  1954. border-radius: 4px;
  1955. color: #fff;
  1956. text-align: center;
  1957. line-height: 40px;
  1958. font-size: 14px;
  1959. cursor: pointer;
  1960. }
  1961. }
  1962. .left-code,
  1963. .right-code {
  1964. // width: 50%;
  1965. // float: left;
  1966. h2 {
  1967. display: block;
  1968. font-size: 18px;
  1969. text-align: center;
  1970. padding-bottom: 8px;
  1971. line-height: 1;
  1972. height: 30px;
  1973. margin-bottom: 0;
  1974. }
  1975. .qrcode {
  1976. display: flex;
  1977. justify-content: center;
  1978. img {
  1979. width: 200px;
  1980. height: 200px;
  1981. // margin: 0 auto;
  1982. }
  1983. }
  1984. .code-url {
  1985. font-size: 18px;
  1986. text-align: center;
  1987. padding: 15px 15px 0 15px;
  1988. }
  1989. }
  1990. .export {
  1991. background: #14928a;
  1992. }
  1993. .alert {
  1994. margin-bottom: 10px;
  1995. }
  1996. .collapse-title {
  1997. display: flex;
  1998. justify-content: space-between;
  1999. align-items: center;
  2000. width: 100%;
  2001. .el-icon-circle-close {
  2002. font-size: 16px;
  2003. margin-right: 10px;
  2004. }
  2005. }
  2006. /deep/ .el-collapse-item__wrap {
  2007. padding-top: 20px;
  2008. }
  2009. .cycleForm {
  2010. /deep/ .el-form-item {
  2011. display: flex;
  2012. width: 100%;
  2013. /deep/ .el-form-item__content {
  2014. margin-left: 0 !important;
  2015. flex: 1;
  2016. }
  2017. }
  2018. }
  2019. .statistic {
  2020. padding: 20px 0;
  2021. text-align: center;
  2022. width: 100%;
  2023. margin: auto !important;
  2024. }
  2025. .popoverWrap {
  2026. p {
  2027. line-height: 25px;
  2028. }
  2029. }
  2030. .studentListWrap {
  2031. display: flex;
  2032. flex-direction: row;
  2033. justify-content: flex-start;
  2034. align-items: center;
  2035. div {
  2036. margin-right: 15px;
  2037. }
  2038. }
  2039. .btnList {
  2040. display: flex;
  2041. flex-direction: row;
  2042. justify-content: flex-start;
  2043. align-items: center;
  2044. flex-wrap: wrap;
  2045. & > div {
  2046. margin-right: 15px;
  2047. margin-bottom: 10px;
  2048. }
  2049. }
  2050. .demo-table-expand {
  2051. font-size: 0;
  2052. }
  2053. .demo-table-expand label {
  2054. width: 150px;
  2055. color: #99a9bf;
  2056. }
  2057. .demo-table-expand .el-form-item {
  2058. margin-right: 0;
  2059. margin-bottom: 0;
  2060. overflow: hidden;
  2061. text-overflow: ellipsis;
  2062. white-space: nowrap;
  2063. padding-right: 10px;
  2064. }
  2065. /deep/.el-table__expanded-cell[class*="cell"] {
  2066. padding: 20px 0 20px 110px;
  2067. }
  2068. .red {
  2069. color:red;
  2070. }
  2071. </style>