studentList.vue 68 KB

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