studentList.vue 70 KB

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