studentList.vue 69 KB

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