signupList.vue 72 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328
  1. <template>
  2. <div class="sigup-container">
  3. <div class="topWrap">
  4. <div>
  5. <div style="display: flex; justify-content: space-between">
  6. <div
  7. style="
  8. display: flex;
  9. margin-bottom: 15px;
  10. font-size: 18px;
  11. font-weight: 400;
  12. "
  13. >
  14. <p style="margin-right: 10px" v-if="applyExpireDate">
  15. 报名截止时间:{{ applyExpireDate | formatTimer }}
  16. </p>
  17. <p v-if="paymentExpireDate">
  18. 缴费截止时间:{{ paymentExpireDate | formatTimer }}
  19. </p>
  20. </div>
  21. </div>
  22. <div class="btnList">
  23. <!-- <div class='newBand close'
  24. v-permission="'musicGroup/cancelMusicGroup'"
  25. @click="onClose">停止乐团</div> v-show="status == 'APPLY'"-->
  26. <div
  27. class="newBand"
  28. @click="payStart"
  29. v-permission="'musicGroup/openPay'"
  30. v-if="status == 'APPLY'"
  31. >
  32. 开始缴费
  33. </div>
  34. <!-- v-show="status=='PAY'" -->
  35. <div
  36. class="newBand"
  37. v-permission="'musicGroup/found'"
  38. @click="onGoHome"
  39. v-if="status == 'APPLY' || status == 'PAY'"
  40. >
  41. 确认开团
  42. </div>
  43. <div
  44. class="newBand"
  45. v-permission="'musicGroup/extensionApplyExpireDate'"
  46. @click="extendTime(false)"
  47. v-show="
  48. status == 'APPLY' ||
  49. status == 'PAY' ||
  50. status == 'PROGRESS' ||
  51. status == 'PREPARE'
  52. "
  53. >
  54. 延长报名
  55. </div>
  56. <div
  57. class="newBand"
  58. v-permission="'musicGroup/extensionPayment'"
  59. @click="extendTime(true)"
  60. v-show="
  61. status == 'APPLY' ||
  62. status == 'PAY' ||
  63. status == 'PROGRESS' ||
  64. status == 'PREPARE'
  65. "
  66. >
  67. 延长缴费
  68. </div>
  69. <div
  70. class="newBand"
  71. @click="onCreateQRCode('payment')"
  72. v-show="
  73. (status == 'PAY' ||
  74. status == 'APPLY' ||
  75. status == 'PROGRESS' ||
  76. status == 'PREPARE') &&
  77. ischeckCanReg
  78. "
  79. >
  80. 报名链接
  81. </div>
  82. <div class="newBand" @click="onCreateQRCode('detail')">缴费详情</div>
  83. <auth :auths="'studentRegistration/queryPreApplyList/4263'">
  84. <div
  85. class="newBand"
  86. style="margin-right: 0"
  87. @click="forecastVisible = true"
  88. >
  89. 预报名名单
  90. </div>
  91. </auth>
  92. <!-- v-permission="getFullPermission('musicGroup/addMusicGroupRegs')" -->
  93. <div
  94. class="newBand"
  95. v-permission="'musicGroup/addMusicGroupRegs'"
  96. @click="mergeVisible = true"
  97. v-show="
  98. (status == 'PAY' ||
  99. status == 'APPLY' ||
  100. status == 'PROGRESS' ||
  101. status == 'PREPARE') &&
  102. ischeckCanReg
  103. "
  104. >
  105. 合并学员
  106. </div>
  107. <div
  108. class="newBand"
  109. style="background-color: #f97215; border: 1px solid #f97215"
  110. @click="onCreateQRCode('rePayment')"
  111. v-show="
  112. (status == 'PAY' ||
  113. status == 'APPLY' ||
  114. status == 'PROGRESS' ||
  115. status == 'PREPARE') &&
  116. ischeckCanReg
  117. "
  118. >
  119. 报名链接(无乐器)
  120. </div>
  121. <div
  122. class="newBand"
  123. v-permission="'studentRegistration/queryStudentApplyDetailExport'"
  124. @click="onDownLoadExecl"
  125. >
  126. 名单导出
  127. </div>
  128. <auth :auths="'studentRegistration/getRegisterOrPreList'">
  129. <div
  130. class="newBand"
  131. style="margin-right: 0"
  132. @click="newForecastVisible = true"
  133. >
  134. 时间数据统计
  135. </div>
  136. </auth>
  137. <auth :auths="'subject/findSubApplyDetail'">
  138. <el-popover placement="bottom" width="1000" trigger="hover">
  139. <el-table
  140. style="width: 100% !important"
  141. :data="leftList"
  142. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  143. >
  144. <el-table-column
  145. label="乐团声部"
  146. prop="subjectName"
  147. align="center"
  148. >
  149. </el-table-column>
  150. <el-table-column
  151. label="计划招生"
  152. prop="expectedStudentNum"
  153. align="center"
  154. >
  155. <template slot-scope="scope">
  156. <div>
  157. <p v-show="!isEdit">{{ scope.row.expectedStudentNum }}</p>
  158. <el-input
  159. v-show="isEdit"
  160. v-model.trim="scope.row.expectedStudentNum"
  161. ></el-input>
  162. </div>
  163. </template>
  164. </el-table-column>
  165. <el-table-column
  166. label="已报名"
  167. prop="applyStudentNum"
  168. align="center"
  169. >
  170. </el-table-column>
  171. <el-table-column label="已缴费" prop="payNum" align="center">
  172. <template slot-scope="scope">
  173. <div>
  174. <el-button type="text" @click="getpayNum(scope.row)">{{
  175. scope.row.payNum
  176. }}</el-button>
  177. </div>
  178. </template>
  179. </el-table-column>
  180. <el-table-column label="缴费中" prop="payingNum" align="center">
  181. <template slot="header">
  182. <p>
  183. 缴费中
  184. <el-tooltip placement="top" popper-class="mTooltip">
  185. <div slot="content">提交订单尚未支付成功学员</div>
  186. <i
  187. class="el-icon-question"
  188. style="font-size: 18px; color: #f56c6c"
  189. ></i>
  190. </el-tooltip>
  191. </p>
  192. </template>
  193. <template slot-scope="scope">
  194. <div>
  195. <el-button type="text" @click="getpayingNum(scope.row)">{{
  196. scope.row.payingNum
  197. }}</el-button>
  198. </div>
  199. </template>
  200. </el-table-column>
  201. <el-table-column label="审核中" prop="checkNum" align="center">
  202. <template slot="header">
  203. <p>
  204. 审核中
  205. <el-tooltip placement="top" popper-class="mTooltip">
  206. <div slot="content">
  207. 不购买云教练系统学员数量,不包含已缴费学员
  208. </div>
  209. <i
  210. class="el-icon-question"
  211. style="font-size: 18px; color: #f56c6c"
  212. ></i>
  213. </el-tooltip>
  214. </p>
  215. </template>
  216. <template slot-scope="scope">
  217. <div>
  218. <el-button type="text" @click="getCheckNum(scope.row)">{{
  219. scope.row.checkNum
  220. }}</el-button>
  221. </div>
  222. </template>
  223. </el-table-column>
  224. <el-table-column
  225. label="购买云教练人数"
  226. prop="buyCloudTeacherNum"
  227. align="center"
  228. >
  229. <template slot="header">
  230. <p>
  231. 购买云教练人数
  232. <el-tooltip placement="top" popper-class="mTooltip">
  233. <div slot="content">
  234. 已缴费学员中购买了云教练系统的学员总数
  235. </div>
  236. <i
  237. class="el-icon-question"
  238. style="font-size: 18px; color: #f56c6c"
  239. ></i>
  240. </el-tooltip>
  241. </p>
  242. </template>
  243. <template slot-scope="scope">
  244. <div>
  245. <el-button
  246. type="text"
  247. @click="getCheckNum(scope.row, 'buyCloud')"
  248. >{{ scope.row.buyCloudTeacherNum }}</el-button
  249. >
  250. </div>
  251. </template>
  252. </el-table-column>
  253. <el-table-column
  254. label="入团未购云教练"
  255. prop="noCloudTeacherStudentNumOfNormal"
  256. align="center"
  257. >
  258. <template slot="header">
  259. <p>
  260. 入团未购云教练
  261. <el-tooltip placement="top" popper-class="mTooltip">
  262. <div slot="content">
  263. 【在读】学员中,未购买【云教练系统】学员数量
  264. </div>
  265. <i
  266. class="el-icon-question"
  267. style="font-size: 18px; color: #f56c6c"
  268. ></i>
  269. </el-tooltip>
  270. </p>
  271. </template>
  272. <template slot-scope="scope">
  273. <div>
  274. <el-button
  275. type="text"
  276. @click="getCheckNum(scope.row, 'noCloud')"
  277. >{{
  278. scope.row.noCloudTeacherStudentNumOfNormal
  279. }}</el-button
  280. >
  281. </div>
  282. </template>
  283. </el-table-column>
  284. <!-- <el-table-column label="购买乐器未入团人数" prop="cloudTeacherStudentNumOfApply" align="center">
  285. <template slot="header">
  286. <p>
  287. 购买乐器未入团人数
  288. <el-tooltip placement="top" popper-class="mTooltip">
  289. <div slot="content">
  290. 只购买乐器未解除限制学员数量(不包括退团学员)
  291. </div>
  292. <i
  293. class="el-icon-question"
  294. style="font-size: 18px; color: #f56c6c"
  295. ></i>
  296. </el-tooltip>
  297. </p>
  298. </template>
  299. <template slot-scope="scope">
  300. <div>
  301. <el-button type="text" @click="getCheckNum(scope.row, 'cloudTeacher')">{{
  302. scope.row.cloudTeacherStudentNumOfApply
  303. }}</el-button>
  304. </div>
  305. </template>
  306. </el-table-column> -->
  307. </el-table>
  308. <div
  309. class="btnWrap"
  310. v-permission="'musicGroup/updateExpectedStudentNum'"
  311. style="margin-right: 20px; margin-top: 20px"
  312. >
  313. <el-button
  314. v-show="
  315. !isEdit &&
  316. (status == 'PAY' ||
  317. status == 'APPLY' ||
  318. status == 'PROGRESS' ||
  319. status == 'PREPARE')
  320. "
  321. @click="isEdit = true"
  322. >编辑</el-button
  323. >
  324. <el-button v-show="isEdit" @click="saveIsEdit">保存</el-button>
  325. </div>
  326. <div class="newBand" slot="reference">人数统计</div>
  327. </el-popover>
  328. </auth>
  329. </div>
  330. </div>
  331. <el-dialog
  332. title="选择合并乐团"
  333. :visible.sync="mergeVisible"
  334. width="950px"
  335. >
  336. <mergeMusic
  337. v-if="mergeVisible"
  338. style="padding: 0 20px"
  339. :organId="organId"
  340. @close="mergeVisible = false"
  341. @submited="getList"
  342. />
  343. </el-dialog>
  344. <el-dialog
  345. title="时间数据统计"
  346. :visible.sync="newForecastVisible"
  347. width="1100px"
  348. >
  349. <newForecastList
  350. v-if="newForecastVisible"
  351. @close="newForecastVisible = false"
  352. />
  353. </el-dialog>
  354. <el-dialog
  355. title="预报名名单"
  356. :visible.sync="forecastVisible"
  357. width="1150px"
  358. >
  359. <forecastList v-if="forecastVisible" @close="forecastVisible = false" />
  360. </el-dialog>
  361. <!-- stepImgs: {
  362. APPLY: require('@/assets/images/base/clock.png'),
  363. PAY: require('@/assets/images/base/pay.png')
  364. }, -->
  365. </div>
  366. <div class="searchList">
  367. <save-form
  368. :inline="true"
  369. :model="searchFrom"
  370. @submit="search"
  371. @reset="onReset"
  372. >
  373. <el-form-item>
  374. <el-select
  375. v-model.trim="searchFrom.subject"
  376. filterable
  377. clearable
  378. placeholder="请选择专业"
  379. >
  380. <el-option
  381. v-for="(item, index) in soundList"
  382. :key="index"
  383. :label="item.name"
  384. :value="item.id"
  385. ></el-option>
  386. </el-select>
  387. </el-form-item>
  388. <el-form-item>
  389. <el-select
  390. v-model.trim="searchFrom.isAllowAdjust"
  391. filterable
  392. placeholder="请选择是否允许调剂"
  393. clearable
  394. >
  395. <el-option label="是" value="1"></el-option>
  396. <el-option label="否" value="0"></el-option>
  397. </el-select>
  398. </el-form-item>
  399. <el-form-item>
  400. <el-input
  401. v-model.trim="searchFrom.name"
  402. placeholder="请输入用户名或手机号"
  403. clearable
  404. ></el-input>
  405. </el-form-item>
  406. <el-form-item>
  407. <!-- <el-input v-model.trim="searchFrom.currentGrade" placeholder="请输入年级" clearable></el-input> -->
  408. <el-select
  409. v-model.trim="searchFrom.currentGrade"
  410. filterable
  411. clearable
  412. placeholder="请输入年级"
  413. >
  414. <el-option
  415. v-for="(item, index) in gradeList"
  416. :key="index"
  417. :label="item.label"
  418. :value="item.label"
  419. ></el-option>
  420. </el-select>
  421. </el-form-item>
  422. <el-form-item>
  423. <el-select
  424. v-model.trim="searchFrom.paymentStatus"
  425. clearable
  426. filterable
  427. placeholder="报名缴费"
  428. >
  429. <el-option label="未开启缴费" value="0"></el-option>
  430. <el-option label="开启缴费" value="1"></el-option>
  431. <el-option label="已缴费" value="2"></el-option>
  432. </el-select>
  433. </el-form-item>
  434. <el-form-item>
  435. <el-select
  436. v-model.trim="searchFrom.visited"
  437. clearable
  438. filterable
  439. placeholder="是否回访"
  440. >
  441. <el-option label="否" value="false"></el-option>
  442. <el-option label="是" value="true"></el-option>
  443. </el-select>
  444. </el-form-item>
  445. <el-form-item>
  446. <el-select
  447. v-model.trim="searchFrom.hasCloudTeacher"
  448. clearable
  449. filterable
  450. placeholder="是否购买云教练"
  451. >
  452. <el-option label="是" :value="1"></el-option>
  453. <el-option label="否" :value="0"></el-option>
  454. </el-select>
  455. </el-form-item>
  456. <el-form-item>
  457. <el-select
  458. v-model.trim="searchFrom.noneNeedCloudTeacher"
  459. clearable
  460. filterable
  461. placeholder="是否解除限制"
  462. >
  463. <el-option label="是" :value="1"></el-option>
  464. <el-option label="否" :value="0"></el-option>
  465. </el-select>
  466. </el-form-item>
  467. <el-form-item>
  468. <el-select
  469. v-model.trim="searchFrom.payingStatus"
  470. clearable
  471. filterable
  472. placeholder="订单状态"
  473. >
  474. <el-option label="缴费中" :value="1"></el-option>
  475. <el-option label="审核中" :value="2"></el-option>
  476. </el-select>
  477. </el-form-item>
  478. <el-form-item prop="studentStatus">
  479. <el-select
  480. v-model.trim="searchFrom.studentStatus"
  481. clearable
  482. filterable
  483. placeholder="学员状态"
  484. >
  485. <el-option label="在读" value="NORMAL"></el-option>
  486. <!-- <el-option label="请假" value="LEAVE"></el-option>
  487. <el-option label="退团" value="QUIT"></el-option> -->
  488. <el-option label="报名" value="APPLY"></el-option>
  489. </el-select>
  490. </el-form-item>
  491. <!-- 专业actualSubjectId 调剂isAllowAdjust 手机号name -->
  492. <el-form-item>
  493. <el-button type="danger" native-type="search">搜索</el-button>
  494. <el-button type="primary" native-type="reset">重置</el-button>
  495. </el-form-item>
  496. </save-form>
  497. </div>
  498. <div>
  499. <el-table
  500. :data="rightList"
  501. ref="multipleTable"
  502. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  503. @selection-change="handleSelectionChange"
  504. >
  505. <el-table-column
  506. type="selection"
  507. width="55"
  508. :selectable="checkboxSelect"
  509. >
  510. </el-table-column>
  511. <el-table-column type="expand">
  512. <template slot-scope="props">
  513. <el-form label-position="left" class="demo-table-expand">
  514. <el-row style="margin-left: 64px">
  515. <el-col :span="4">
  516. <el-form-item label="入团年份">
  517. <span>
  518. {{ props.row.createTime | dayjsFormat("YYYY年") }}</span
  519. >
  520. </el-form-item>
  521. </el-col>
  522. <el-col :span="4">
  523. <el-form-item label="报名专业">
  524. <span>{{ props.row.subjectName }}</span>
  525. </el-form-item>
  526. </el-col>
  527. <el-col :span="4">
  528. <el-form-item label="服从调剂:">
  529. <span>{{ props.row.isAllowAdjust | isAllowAdjust }}</span>
  530. </el-form-item></el-col
  531. >
  532. <!-- <el-col :span="4">
  533. <el-form-item label="是否购买云教练:">
  534. <span>{{
  535. props.row.hasCloudTeacher == 1 ? "是" : "否"
  536. }}</span>
  537. </el-form-item></el-col
  538. > -->
  539. <el-col :span="4">
  540. <!-- <el-form-item> -->
  541. <!-- <template slot="label"> -->
  542. <div class="hiddenwrap">
  543. <p
  544. style="
  545. position: relative;
  546. display: flex;
  547. align-items: center;
  548. "
  549. >
  550. 解除限制
  551. <el-tooltip placement="top" popper-class="mTooltip">
  552. <div slot="content">
  553. 学员是否受到不购买云教练的缴费限制
  554. </div>
  555. <i
  556. class="el-icon-question"
  557. style="font-size: 18px; color: #f56c6c"
  558. ></i
  559. >:
  560. </el-tooltip>
  561. </p>
  562. <!-- </template> -->
  563. <span>
  564. {{ props.row.noneNeedCloudTeacher == 1 ? "是" : "否" }}
  565. </span>
  566. </div>
  567. <!-- </el-form-item>-->
  568. </el-col>
  569. <!-- <el-col :span="4">
  570. <el-form-item label="备注:">
  571. <overflow-text
  572. :text="props.row.remark"
  573. ></overflow-text> </el-form-item
  574. ></el-col> -->
  575. </el-row>
  576. </el-form>
  577. </template>
  578. </el-table-column>
  579. <el-table-column
  580. label="姓名"
  581. prop="studentName"
  582. align="center"
  583. width="150px"
  584. >
  585. <template slot-scope="scope">
  586. <div>
  587. <p class="courseYellow left">
  588. 学员: {{ scope.row.studentName }}({{ scope.row.gender | sex }})
  589. </p>
  590. <p class="left">家长: {{ scope.row.parentsName }}</p>
  591. </div>
  592. </template>
  593. </el-table-column>
  594. <!-- <el-table-column label="家长姓名" prop="parentsName" align="center">
  595. </el-table-column> -->
  596. <!-- <el-table-column align="left" label="入团年份">
  597. <template slot-scope="scope">
  598. <div>
  599. {{ scope.row.createTime | dayjsFormat("YYYY年") }}
  600. </div>
  601. </template>
  602. </el-table-column> -->
  603. <el-table-column
  604. label="联系电话"
  605. prop="parentsPhone"
  606. align="center"
  607. width="110px"
  608. >
  609. </el-table-column>
  610. <el-table-column label="学员状态" prop="studentStatus" align="center">
  611. <template slot-scope="scope">
  612. <div>
  613. {{ scope.row.studentStatus | musicGroupStudentType }}
  614. </div>
  615. </template>
  616. </el-table-column>
  617. <el-table-column label="年级班级" align="center">
  618. <template slot-scope="scope">
  619. <div v-if=" gradeListObj[scope.row.currentGrade]">
  620. {{ gradeListObj[scope.row.currentGrade] + scope.row.currentClass }}
  621. </div>
  622. </template>
  623. </el-table-column>
  624. <!-- <el-table-column label="性别" prop="gender" align="center">
  625. <template slot-scope="scope">
  626. <div>
  627. {{ scope.row.gender | sex }}
  628. </div>
  629. </template>
  630. </el-table-column> -->
  631. <!-- <el-table-column label="服从调剂" prop="isAllowAdjust" align="center">
  632. <template slot-scope="scope">
  633. <div>
  634. {{ scope.row.isAllowAdjust | isAllowAdjust }}
  635. </div>
  636. </template>
  637. </el-table-column> -->
  638. <!-- <el-table-column label="报名专业" prop="subjectName" align="center">
  639. </el-table-column> -->
  640. <el-table-column
  641. label="调剂专业"
  642. prop="actualSubjectName"
  643. align="center"
  644. >
  645. <template slot-scope="scope">
  646. <div>
  647. <p>
  648. {{ scope.row.actualSubjectName }}
  649. </p>
  650. <!-- <p>报名:{{ scope.row.subjectName }}</p> -->
  651. </div>
  652. </template>
  653. </el-table-column>
  654. <el-table-column label="是否回访" prop="paymentStatus" align="center">
  655. <template slot-scope="scope">
  656. <div>
  657. {{ scope.row.visitNum ? "是" : "否" }}
  658. </div>
  659. </template>
  660. </el-table-column>
  661. <!-- visited -->
  662. <!-- v-show='status == "PAY"' -->
  663. <el-table-column
  664. label="报名缴费/订单状态"
  665. prop="paymentStatus"
  666. align="center"
  667. >
  668. <template slot-scope="scope">
  669. <div>
  670. <p>{{ scope.row.paymentStatus | paymentStatus }}</p>
  671. <p>{{ scope.row.payingStatus | filtersPayingStatus }}</p>
  672. </div>
  673. </template>
  674. </el-table-column>
  675. <!-- <el-table-column label="订单状态" prop="payingStatus" align="center">
  676. <template slot-scope="scope">
  677. <div>
  678. {{ scope.row.payingStatus | filtersPayingStatus }}
  679. </div>
  680. </template>
  681. </el-table-column> -->
  682. <el-table-column
  683. label="是否购买会员"
  684. prop="hasCloudTeacher"
  685. align="center"
  686. >
  687. <template slot-scope="scope">
  688. <div>
  689. {{ scope.row.hasCloudTeacher == 1 ? "是" : "否" }}
  690. </div>
  691. </template>
  692. </el-table-column>
  693. <!-- <el-table-column
  694. label="解除限制"
  695. fixed="right"
  696. prop="noneNeedCloudTeacher"
  697. align="center"
  698. >
  699. <template slot="header">
  700. <p style="position: relative; display: flex">
  701. 解除限制
  702. <el-tooltip placement="top" popper-class="mTooltip">
  703. <div slot="content">学员是否受到不购买云教练的缴费限制</div>
  704. <i
  705. class="el-icon-question"
  706. style="font-size: 18px; color: #f56c6c"
  707. ></i>
  708. </el-tooltip>
  709. </p>
  710. </template>
  711. <template slot-scope="scope">
  712. <div>
  713. {{ scope.row.noneNeedCloudTeacher == 1 ? "是" : "否" }}
  714. </div>
  715. </template>
  716. </el-table-column> -->
  717. <el-table-column label="备注" prop="remark" align="center">
  718. <template slot-scope="scope">
  719. <div>
  720. <overflow-text :text="scope.row.remark"></overflow-text>
  721. </div>
  722. </template>
  723. </el-table-column>
  724. <!-- {{ status }} -->
  725. <el-table-column
  726. label="操作"
  727. width="200px"
  728. align="center"
  729. v-if="
  730. status == 'PAY' ||
  731. status == 'APPLY' ||
  732. status == 'PROGRESS' ||
  733. status == 'PREPARE'
  734. "
  735. >
  736. <!-- v-show="
  737. status == 'PAY' || status == 'PROGRESS' || status == 'PREPARE' || status=='APPLY'
  738. " -->
  739. <template slot-scope="scope">
  740. <div>
  741. <auth :auths="'studentRegistration/batchUpdateSubject'">
  742. <el-button
  743. type="text"
  744. v-show="scope.row.paymentStatus != 2"
  745. @click="resetSubject(scope.row)"
  746. >修改专业</el-button
  747. >
  748. </auth>
  749. <!-- APPLY status == "APPLY" || s-->
  750. <!-- <el-popover
  751. v-show="scope.row.remark"
  752. placement="top-start"
  753. title="备注"
  754. width="200"
  755. trigger="hover"
  756. :content="scope.row.remark"
  757. >
  758. <el-button type="text" slot="reference">备注</el-button>
  759. </el-popover> -->
  760. <!-- PAY -->
  761. <!-- && status == "PAY"-->
  762. <auth
  763. :auths="'studentRegistration/queryFeeDetail'"
  764. v-show="scope.row.paymentStatus == 2"
  765. >
  766. <el-button type="text" @click="lookdetail(scope.row)"
  767. >查看</el-button
  768. >
  769. </auth>
  770. <auth
  771. :auths="'musicGroupQuit/apply2'"
  772. v-show="scope.row.paymentStatus == 2"
  773. >
  774. <el-button type="text" @click="quitTeam(scope.row)"
  775. >退团</el-button
  776. >
  777. </auth>
  778. <!-- <auth
  779. :auths="'musicGroupQuit/directQuitMusicGroup3'"
  780. v-show="scope.row.paymentStatus == 2"
  781. >
  782. <el-button type="text" @click="quieTeams(scope.row)"
  783. >退团</el-button
  784. >
  785. </auth> -->
  786. <auth
  787. :auths="'visit/add/teamSignupList'"
  788. v-if="scope.row.visitNum <= 0"
  789. >
  790. <el-button type="text" @click="addVisit(scope.row)"
  791. >新增回访</el-button
  792. >
  793. </auth>
  794. <auth
  795. :auths="'subjectChange/getStudentOriginal'"
  796. v-show="scope.row.paymentStatus == 2"
  797. v-if="status != 'PROGRESS'"
  798. >
  799. <el-button type="text" @click="openChangeVoice(scope.row)"
  800. >更改声部</el-button
  801. >
  802. </auth>
  803. <!-- -->
  804. <auth
  805. v-show="
  806. scope.row.payingStatus == 2 &&
  807. scope.row.noneNeedCloudTeacher == 0
  808. "
  809. :auths="'studentRegistration/setNoneCloudTeacher'"
  810. >
  811. <el-button type="text" @click="relieve(scope.row)"
  812. >解除预约限制</el-button
  813. >
  814. </auth>
  815. <auth :auths="'studentRegistration/setCloudTeacherToFailed'">
  816. <el-button
  817. type="text"
  818. v-if="scope.row.payingStatus == 2"
  819. @click="failedRelieve(scope.row)"
  820. >拒绝审核</el-button
  821. >
  822. </auth>
  823. </div>
  824. </template>
  825. </el-table-column>
  826. </el-table>
  827. <div
  828. style="margin-top: 10px; margin-bottom: 10px"
  829. v-show="
  830. status == 'APPLY' || status == 'PROGRESS' || status == 'PREPARE'
  831. "
  832. >
  833. <el-button @click="onSelectAll">全选/取消</el-button>
  834. <auth :auths="'studentRegistration/openPayment'">
  835. <el-button
  836. style="background-color: #14928a; border: 1px solid #14928a"
  837. @click="onPartPayment"
  838. type="primary"
  839. >开启缴费</el-button
  840. >
  841. </auth>
  842. <!-- <div class='newBand' v-show="status=='APPLY'">允许缴费</div> -->
  843. </div>
  844. <pagination
  845. sync
  846. :total.sync="rules.total"
  847. :page.sync="rules.page"
  848. :limit.sync="rules.limit"
  849. :page-sizes="rules.page_size"
  850. @pagination="getList"
  851. />
  852. </div>
  853. <el-dialog title="修改专业" :visible.sync="subjectVisible" width="400px">
  854. <el-form :model="maskForm">
  855. <el-form-item label="选择专业">
  856. <el-select v-model.trim="maskForm.subject" filterable clearable>
  857. <el-option
  858. v-for="(item, index) in soundList"
  859. :key="index"
  860. :label="item.name"
  861. :value="item.id"
  862. ></el-option>
  863. </el-select>
  864. </el-form-item>
  865. </el-form>
  866. <div slot="footer" class="dialog-footer">
  867. <el-button @click="subjectVisible = false">取 消</el-button>
  868. <el-button type="primary" @click="okReset">确 定</el-button>
  869. </div>
  870. </el-dialog>
  871. <el-dialog
  872. :title="!isPay ? '延长报名' : '延长缴费'"
  873. :visible.sync="extendPaymentStatus"
  874. destroy-on-close
  875. width="400px"
  876. >
  877. <el-form :model="extendForm" ref="extendForm" :rules="extendRule">
  878. <el-form-item v-if="isPay" label="延长缴费时间" prop="expireDate">
  879. <el-date-picker
  880. v-model.trim="extendForm.expireDate"
  881. value-format="yyyy-MM-dd"
  882. type="date"
  883. :picker-options="payDate()"
  884. placeholder="选择日期"
  885. >
  886. </el-date-picker>
  887. </el-form-item>
  888. <el-form-item label="延长报名时间" v-else prop="expireDate">
  889. <el-date-picker
  890. v-model.trim="extendForm.expireDate"
  891. value-format="yyyy-MM-dd"
  892. type="date"
  893. :picker-options="applyDates"
  894. placeholder="选择日期"
  895. >
  896. </el-date-picker>
  897. </el-form-item>
  898. </el-form>
  899. <div slot="footer" class="dialog-footer">
  900. <el-button @click="extendPaymentStatus = false">取 消</el-button>
  901. <el-button
  902. type="primary"
  903. v-if="isPay"
  904. @click="onExtendPayment('extendForm', isPay)"
  905. >确 定</el-button
  906. >
  907. <el-button
  908. v-else
  909. type="primary"
  910. @click="onExtendPayment('extendForm', isPay)"
  911. >确 定</el-button
  912. >
  913. </div>
  914. </el-dialog>
  915. <el-dialog title="订单详情" :visible.sync="orderVisible" width="800px">
  916. <template v-if="orderForm.length > 0">
  917. <descriptions :column="2">
  918. <template v-for="(item, index) in orderForm">
  919. <descriptions-item :key="index" :label="item.name"
  920. >{{ item.price | moneyFormat }}元</descriptions-item
  921. >
  922. <descriptions-item :key="index" label="缴费时间">{{
  923. item.createTime
  924. }}</descriptions-item>
  925. </template>
  926. </descriptions>
  927. </template>
  928. <el-row v-else>
  929. <el-col :span="24">
  930. <empty desc="暂无订单详情" />
  931. </el-col>
  932. </el-row>
  933. <div slot="footer" class="dialog-footer">
  934. <el-button type="primary" @click="orderVisible = false"
  935. >确 定</el-button
  936. >
  937. </div>
  938. </el-dialog>
  939. <el-dialog
  940. title="开始缴费"
  941. :visible.sync="paymentStatus"
  942. width="400px"
  943. destroy-on-close
  944. >
  945. <el-form
  946. ref="paymentForm"
  947. class="paymentForm"
  948. :model="paymentForm"
  949. label-position="top"
  950. :rules="paymentRules"
  951. >
  952. <el-form-item label="请设置缴费截止日期" prop="paymentExpireDate">
  953. <el-date-picker
  954. v-model.trim="paymentForm.paymentExpireDate"
  955. type="date"
  956. value-format="yyyy-MM-dd"
  957. :picker-options="payDate()"
  958. style="width: 100%"
  959. placeholder="选择日期"
  960. >
  961. </el-date-picker>
  962. </el-form-item>
  963. </el-form>
  964. <div slot="footer" class="dialog-footer">
  965. <el-button @click="paymentStatus = false">取 消</el-button>
  966. <el-button type="primary" @click="onStartPayment('paymentForm')"
  967. >确 定</el-button
  968. >
  969. </div>
  970. </el-dialog>
  971. <!-- 预报名链接 -->
  972. <qr-code v-model="codeStatus" :title="codeTitle" :codeUrl="qrCodeUrl" />
  973. <!-- 退团弹窗 -->
  974. <el-dialog
  975. title="退团信息确认"
  976. v-if="quitVisible"
  977. width="700px"
  978. :visible.sync="quitVisible"
  979. >
  980. <quiteTeam :quitForm="quitForm" :activeRow="activeRow" ref="quitForm" />
  981. <span slot="footer" class="dialog-footer question">
  982. <div>
  983. <el-popover placement="right" width="500" trigger="click">
  984. <div class="popoverWrap">
  985. <p>乐团退团退费规则:</p>
  986. <p>退还乐器练习云教练费用:报名缴费时缴费的乐器练习云教练费用</p>
  987. <p>退还课程费用:缴费总额-已结束课时单价之和</p>
  988. <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
  989. <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
  990. <p>退还乐保费用:报名缴费时缴费的乐保费用</p>
  991. <p>退费金额暂不进入账户余额</p>
  992. </div>
  993. <el-button
  994. type="text"
  995. icon="el-icon-question"
  996. slot="reference"
  997. style="color: red"
  998. >退团退费说明</el-button
  999. >
  1000. </el-popover>
  1001. </div>
  1002. <div>
  1003. <el-button @click="quitVisible = false">取 消</el-button>
  1004. <el-button type="primary" @click="chioseType">确 定</el-button>
  1005. </div>
  1006. </span>
  1007. </el-dialog>
  1008. <!-- 回访记录 -->
  1009. <el-dialog
  1010. title="新增回访"
  1011. width="500px"
  1012. destroy-on-close
  1013. :close-on-click-modal="false"
  1014. :visible.sync="visitVisiable"
  1015. >
  1016. <visit
  1017. v-if="visitVisiable && detail"
  1018. :detail="detail"
  1019. @close="visitVisiable = false"
  1020. @submited="getList"
  1021. />
  1022. </el-dialog>
  1023. <el-dialog
  1024. title="更改声部"
  1025. :visible.sync="changeVoiceVisible"
  1026. v-if="changeVoiceVisible"
  1027. width="600px"
  1028. >
  1029. <changeVoice
  1030. @close="closeChangeVoice"
  1031. @submited="getList"
  1032. :detail.sync="rowDetail"
  1033. :courseViewType="courseViewType"
  1034. :musicGroupId="id"
  1035. :voiceList="leftList"
  1036. />
  1037. </el-dialog>
  1038. </div>
  1039. </template>
  1040. <script>
  1041. import pagination from "@/components/Pagination/index";
  1042. import qrCode from "@/components/QrCode/index";
  1043. import {
  1044. getintoClass,
  1045. getStudentList,
  1046. findSound,
  1047. musicGroupOpenPay,
  1048. openPayment,
  1049. musicGroupFound,
  1050. extensionPayment,
  1051. extensionApplyExpire,
  1052. resetPlanNum,
  1053. cancelMusicGroup,
  1054. getTeamBaseInfo,
  1055. studentApplyDetailExport,
  1056. StudentQuit,
  1057. getMusicGroupGradeList,
  1058. checkCanReg,
  1059. getRefundsDetail,
  1060. applyMusicGroupQuit,
  1061. } from "@/api/buildTeam";
  1062. import { setNoneCloudTeacher, setCloudTeacherToFailed } from "./api";
  1063. import mergeMusic from "./components/merge-music";
  1064. import forecastList from "./components/forecast-list";
  1065. import newForecastList from "./components/newForecast-list";
  1066. import { resetStudentSubject, getStudentFeeDetail } from "@/api/studentManager";
  1067. import { vaildStudentUrl, vaildTeacherUrl } from "@/utils/validate";
  1068. import { addVisit } from "@/views/returnVisitManager/api.js";
  1069. import QRCode from "qrcodejs2";
  1070. import { visitChiose } from "@/utils/searchArray";
  1071. import axios from "axios";
  1072. import { getToken } from "@/utils/auth";
  1073. import load from "@/utils/loading";
  1074. import qs from "qs";
  1075. import { permission } from "@/utils/directivePage";
  1076. import cleanDeep from "clean-deep";
  1077. import changeVoice from "./modals/change-voice";
  1078. import visit from "@/views/withdrawal-application/modals/visit";
  1079. import quiteTeam from "@/views/teamDetail/components/modals/quite-team";
  1080. import { courseType } from "@/constant/index";
  1081. export default {
  1082. name: "signupList",
  1083. components: {
  1084. pagination,
  1085. qrCode,
  1086. changeVoice,
  1087. mergeMusic,
  1088. forecastList,
  1089. visit,
  1090. newForecastList,
  1091. quiteTeam,
  1092. },
  1093. data() {
  1094. return {
  1095. multipleSelection: [], //
  1096. forecastVisible: false, // 预报名状态
  1097. newForecastVisible: false,
  1098. isEdit: false,
  1099. rowDetail: null,
  1100. mergeVisible: false,
  1101. changeVoiceVisible: false,
  1102. subjectVisible: false,
  1103. orderVisible: false,
  1104. quitVisible: false,
  1105. leftList: [],
  1106. rightList: [],
  1107. searchFrom: {
  1108. name: "",
  1109. subject: "", // 专业
  1110. isAllowAdjust: "", // 是否允许调剂
  1111. currentGrade: null, // 入学年级
  1112. paymentStatus: "",
  1113. visited: "",
  1114. hasCloudTeacher: null, // 是否购买云教练
  1115. payingStatus: null,
  1116. noneNeedCloudTeacher: null,
  1117. studentStatus: null,
  1118. },
  1119. quitForm: {
  1120. // 退团信息确认
  1121. isRefundCourseFee: null,
  1122. isRefundInstrumentFee: null,
  1123. isRefundTeachingAssistantsFee: null,
  1124. courseViewType: null,
  1125. hasMaintenance: null,
  1126. studentName: null,
  1127. musicGroupName: null,
  1128. isVisit: false,
  1129. reason: "",
  1130. userComment: null,
  1131. },
  1132. stepImgs: {
  1133. APPLY: require("@/assets/images/base/clock.png"),
  1134. PAY: require("@/assets/images/base/pay.png"),
  1135. },
  1136. status: "",
  1137. id: "",
  1138. rules: {
  1139. // 分页规则
  1140. limit: 10, // 限制显示条数
  1141. page: 1, // 当前页
  1142. total: 0, // 总条数
  1143. page_size: [10, 20, 30, 40], // 选择限制显示条数
  1144. },
  1145. teamName: "",
  1146. maskForm: {
  1147. subject: "",
  1148. },
  1149. activeId: "",
  1150. soundList: [],
  1151. orderForm: [],
  1152. paymentStatus: false,
  1153. paymentForm: {
  1154. paymentExpireDate: null,
  1155. // feeType: null
  1156. },
  1157. paymentRules: {
  1158. paymentExpireDate: [
  1159. { required: true, message: "请设置缴费截止日期", trigger: "blur" },
  1160. ],
  1161. },
  1162. paymentNum: 0, // 缴费了多少人
  1163. qrcodeStatus: false, // 生成二维码
  1164. qrcodes: true,
  1165. qrcode: null,
  1166. codeUrl: null,
  1167. qrcodeStatus2: false, // 生成二维码
  1168. qrcodes2: true,
  1169. qrcode2: null,
  1170. codeUrl2: null,
  1171. codeStatus: false,
  1172. codeTitle: null,
  1173. qrCodeUrl: null,
  1174. organId: "",
  1175. extendPaymentStatus: false,
  1176. extendForm: {
  1177. expireDate: null,
  1178. },
  1179. extendRule: {
  1180. expireDate: [
  1181. { required: true, message: "请选择延长时间", trigger: "change" },
  1182. ],
  1183. },
  1184. quitRules: {
  1185. isCloudTeacherAmount: [{ required: true, message: "请输入云教练费用" }],
  1186. cloudTeacherAmount: [
  1187. { required: true, message: "请输入云教练金额", trigger: "blur" },
  1188. ],
  1189. isRefundCourseFee: [
  1190. { required: true, message: "请选择是否退还课程费用" },
  1191. ],
  1192. isRefundInstrumentFee: [
  1193. { required: true, message: "选择是否退还乐器费用" },
  1194. ],
  1195. isRefundTeachingAssistantsFee: [
  1196. { required: true, message: "选择是否退还教辅费用" },
  1197. ],
  1198. isMaintenanceFee: [{ required: true, message: "选择是否退还乐保费用" }],
  1199. maintenanceFee: [{ required: true, message: "请输入退还乐保金额" }],
  1200. reason: [{ required: true, message: "请填写退团退费原因" }],
  1201. },
  1202. applyExpireDate: "",
  1203. paymentExpireDate: "",
  1204. activeRow: { hasMaintenance: false },
  1205. visitVisiable: false,
  1206. visitForm: {
  1207. musicGroupId: "",
  1208. overview: "",
  1209. purpose: "",
  1210. studentId: "",
  1211. type: "",
  1212. visitTime: "",
  1213. visitType: "",
  1214. feedback: "",
  1215. studentName: "",
  1216. },
  1217. visitChiose,
  1218. visitRules: {
  1219. overview: [{ required: true, message: "请输入学生近况" }],
  1220. feedback: [{ required: true, message: "请输入家长反馈" }],
  1221. visitTime: [{ required: true, message: "请输入回访时间" }],
  1222. visitType: [{ required: true, message: "请选择回访类型" }],
  1223. },
  1224. isPay: false,
  1225. applyDates: this.applyDate(),
  1226. detail: null,
  1227. gradeList: [],
  1228. ischeckCanReg: false,
  1229. courseViewType: null, // 乐团模式
  1230. isManage: false,
  1231. gradeListObj:{}
  1232. };
  1233. },
  1234. created() {},
  1235. mounted() {
  1236. // 通过乐团状态判断显示隐藏的东西
  1237. let isSuperAdmin = this.$store.getters.isSuperAdmin;
  1238. let roles = this.$store.getters.roles;
  1239. if (isSuperAdmin) {
  1240. this.isManage = "super";
  1241. } else {
  1242. if (roles.indexOf(3) != -1) {
  1243. this.isManage = "manage";
  1244. } else {
  1245. this.isManage = false;
  1246. }
  1247. }
  1248. if (roles.indexOf(3) != -1 && roles.indexOf(4) != -1) {
  1249. this.isManage = "super";
  1250. }
  1251. this.init();
  1252. },
  1253. activated() {
  1254. this.init();
  1255. },
  1256. filters: {
  1257. filtersPayingStatus(val) {
  1258. let obj = {
  1259. 0: "--",
  1260. 1: "缴费中",
  1261. 2: "审核中",
  1262. };
  1263. return obj[val];
  1264. },
  1265. },
  1266. methods: {
  1267. permission(str) {
  1268. return permission(str);
  1269. },
  1270. async init() {
  1271. this.status = this.$route.query.team_status;
  1272. // 通过乐团id 获取乐团招生状态
  1273. this.id = this.$route.query.id;
  1274. this.teamName = this.$route.query.name;
  1275. // 判断是否带缓存参数
  1276. this.pickerOptions = this.beginDate(new Date());
  1277. // checkCanReg
  1278. try {
  1279. this.ischeckCanReg = await (
  1280. await checkCanReg({ musicGroupId: this.id })
  1281. ).data;
  1282. } catch (e) {
  1283. console.log(e);
  1284. }
  1285. getMusicGroupGradeList({ musicGroupId: this.id }).then((res) => {
  1286. let result = res.data;
  1287. this.gradeListObj = res.data
  1288. if (res.code == 200 && result) {
  1289. for (let i in result) {
  1290. this.gradeList.push({
  1291. value: i,
  1292. label: result[i],
  1293. });
  1294. }
  1295. }
  1296. });
  1297. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  1298. if (res.code == 200) {
  1299. this.organId = res.data.musicGroup.organId;
  1300. this.courseViewType = res.data.musicGroup.courseViewType;
  1301. this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  1302. this.paymentExpireDate = res.data.musicGroup.paymentExpireDate;
  1303. }
  1304. });
  1305. // 根据乐团id获乐团声部
  1306. findSound({ musicGroupId: this.id }).then((res) => {
  1307. if (res.code == 200) {
  1308. this.soundList = res.data;
  1309. }
  1310. });
  1311. // 通过乐团id获取乐团学生列表
  1312. this.getList();
  1313. },
  1314. search() {
  1315. this.rules.page = 1;
  1316. this.getList();
  1317. },
  1318. onReset() {
  1319. this.rules.page = 1;
  1320. this.rules.limit = 10;
  1321. this.searchFrom = {
  1322. name: null,
  1323. subject: null, // 专业
  1324. isAllowAdjust: null, // 是否允许调剂
  1325. currentGrade: null,
  1326. paymentStatus: null,
  1327. visited: null,
  1328. hasCloudTeacher: null,
  1329. payingStatus: null,
  1330. studentStatus: null,
  1331. noneNeedCloudTeacher: null,
  1332. };
  1333. this.getList();
  1334. },
  1335. onCancel() {
  1336. this.$store.dispatch("delVisitedViews", this.$route);
  1337. this.$router.push({ path: "/teamList" });
  1338. },
  1339. payStart() {
  1340. this.paymentStatus = true;
  1341. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  1342. if (res.code == 200) {
  1343. this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  1344. this.paymentExpireDate = res.data.musicGroup.paymentExpireDate;
  1345. }
  1346. });
  1347. },
  1348. getList() {
  1349. let obj = {
  1350. musicGroupId: this.id,
  1351. actualSubjectId: this.searchFrom.subject || null,
  1352. isAllowAdjust: this.searchFrom.isAllowAdjust || null,
  1353. name: this.searchFrom.name || null,
  1354. currentGrade: this.searchFrom.currentGrade || null,
  1355. paymentStatus: this.searchFrom.paymentStatus || null,
  1356. visited: this.searchFrom.visited || null,
  1357. hasCloudTeacher: this.searchFrom.hasCloudTeacher,
  1358. payingStatus: this.searchFrom.payingStatus,
  1359. studentStatus: this.searchFrom.studentStatus,
  1360. noneNeedCloudTeacher: this.searchFrom.noneNeedCloudTeacher,
  1361. page: this.rules.page,
  1362. rows: this.rules.limit,
  1363. };
  1364. // 根据乐团id获取学团情况
  1365. getintoClass({ musicGroupId: this.id }).then((res) => {
  1366. if (res.code == 200) {
  1367. this.leftList = res.data;
  1368. }
  1369. });
  1370. return getStudentList(obj).then((res) => {
  1371. if (res.code == 200) {
  1372. res.data.rows.forEach((item) => {
  1373. // '未开启缴费', '开启缴费', '已缴费'
  1374. if (item.paymentStatus == 2) {
  1375. this.paymentNum += 1;
  1376. }
  1377. });
  1378. this.rightList = res.data.rows;
  1379. this.rules.total = res.data.total;
  1380. return res;
  1381. }
  1382. });
  1383. },
  1384. onStartPayment(formName) {
  1385. // 开启缴费
  1386. this.$refs[formName].validate((valid) => {
  1387. if (valid) {
  1388. musicGroupOpenPay({
  1389. musicGroupId: this.id,
  1390. expireDate: this.paymentForm.paymentExpireDate,
  1391. // feeType: this.paymentForm.feeType
  1392. }).then((res) => {
  1393. if (res.code == 200) {
  1394. this.$message.success("开启成功");
  1395. this.paymentStatus = false;
  1396. this.$store.dispatch("delVisitedViews", this.$route);
  1397. this.$router.push({
  1398. path: "/teamList",
  1399. });
  1400. this.status = "PAY";
  1401. this.paymentExpireDate = this.paymentForm.paymentExpireDate;
  1402. this.getList();
  1403. }
  1404. });
  1405. } else {
  1406. return false;
  1407. }
  1408. });
  1409. },
  1410. onSelectAll() {
  1411. // 选中全部
  1412. this.$refs.multipleTable.toggleAllSelection();
  1413. },
  1414. onPartPayment() {
  1415. // 部分缴费
  1416. let selection = this.multipleSelection;
  1417. if (selection.length <= 0) {
  1418. this.$message.error("您还没有选择学生");
  1419. return false;
  1420. }
  1421. let ids = [];
  1422. selection.forEach((item) => {
  1423. ids.push(item.id);
  1424. });
  1425. this.$confirm(`是否确认开启缴费?`, "提示", {
  1426. confirmButtonText: "确定",
  1427. cancelButtonText: "取消",
  1428. type: "warning",
  1429. })
  1430. .then(() => {
  1431. openPayment({
  1432. ids: ids.join(","),
  1433. }).then((res) => {
  1434. if (res.code == 200) {
  1435. this.$message.success("开启成功");
  1436. this.getList();
  1437. } else {
  1438. this.$message.error(res.msg);
  1439. }
  1440. });
  1441. })
  1442. .catch(() => {});
  1443. },
  1444. onCreateQRCode(type) {
  1445. // 生成报名二维码
  1446. let id = this.id;
  1447. this.codeStatus = true;
  1448. if (type == "payment") {
  1449. this.codeTitle = "学员报名链接";
  1450. this.qrCodeUrl = vaildStudentUrl() + "/#/login?musicGroupId=" + id;
  1451. } else if (type == "detail") {
  1452. let teamName = this.$route.query.name;
  1453. this.codeTitle = "报名缴费详情";
  1454. this.qrCodeUrl =
  1455. vaildTeacherUrl() +
  1456. "/#/order?musicGroupId=" +
  1457. id +
  1458. "&musicGroupName=" +
  1459. teamName;
  1460. } else if (type == "rePayment") {
  1461. this.codeTitle = "学生报名链接(无乐器)";
  1462. this.qrCodeUrl =
  1463. vaildStudentUrl() + "/#/login?musicGroupId=" + id + "&instrument=1";
  1464. }
  1465. },
  1466. onCreateQRCode2() {
  1467. // 生成报名二维码
  1468. this.qrcodeStatus2 = true;
  1469. let id = this.id;
  1470. let teamName = this.$route.query.name;
  1471. setTimeout(() => {
  1472. document.getElementById("qrcode2").innerHTML = "";
  1473. this.qrcode2 = new QRCode("qrcode2", {
  1474. width: 200,
  1475. height: 200,
  1476. colorDark: "#000000",
  1477. colorLight: "#ffffff",
  1478. correctLevel: QRCode.CorrectLevel.H,
  1479. });
  1480. this.qrcode2.makeCode(
  1481. vaildTeacherUrl() +
  1482. "/#/order?musicGroupId=" +
  1483. id +
  1484. "&musicGroupName=" +
  1485. teamName
  1486. );
  1487. this.codeUrl2 =
  1488. vaildTeacherUrl() +
  1489. "/#/order?musicGroupId=" +
  1490. id +
  1491. "&musicGroupName=" +
  1492. teamName;
  1493. }, 500);
  1494. },
  1495. onDownLoadExecl() {
  1496. // 报表导出
  1497. let url = "/api-web/studentRegistration/queryStudentApplyDetailExport";
  1498. let data = {
  1499. musicGroupId: this.$route.query.id,
  1500. page: 1,
  1501. rows: 9999,
  1502. };
  1503. const options = {
  1504. method: "POST",
  1505. headers: {
  1506. Authorization: getToken(),
  1507. },
  1508. data: qs.stringify(data),
  1509. url,
  1510. responseType: "blob",
  1511. };
  1512. this.$confirm("您确定导出吗?", "提示", {
  1513. confirmButtonText: "确定",
  1514. cancelButtonText: "取消",
  1515. type: "warning",
  1516. })
  1517. .then(() => {
  1518. load.startLoading();
  1519. axios(options)
  1520. .then((res) => {
  1521. let blob = new Blob([res.data], {
  1522. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  1523. type: "application/vnd.ms-excel;charset=utf-8",
  1524. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  1525. });
  1526. let text = new Response(blob).text();
  1527. text.then((res) => {
  1528. // 判断是否报错
  1529. if (res.indexOf("code") != -1) {
  1530. let json = JSON.parse(res);
  1531. this.$message.error(json.msg);
  1532. } else {
  1533. let objectUrl = URL.createObjectURL(blob);
  1534. let link = document.createElement("a");
  1535. let nowTime = new Date();
  1536. let ymd =
  1537. nowTime.getFullYear() +
  1538. "" +
  1539. (nowTime.getMonth() + 1) +
  1540. "" +
  1541. nowTime.getDate() +
  1542. "" +
  1543. nowTime.getHours() +
  1544. "" +
  1545. nowTime.getMinutes();
  1546. let fname = this.$route.query.id + "-" + ymd + ".xls"; //下载文件的名字
  1547. link.href = objectUrl;
  1548. link.setAttribute("download", fname);
  1549. document.body.appendChild(link);
  1550. link.click();
  1551. }
  1552. });
  1553. load.endLoading();
  1554. })
  1555. .catch((error) => {
  1556. this.$message.error("导出数据失败,请联系管理员");
  1557. load.endLoading();
  1558. });
  1559. })
  1560. .catch(() => {});
  1561. },
  1562. onGoHome() {
  1563. // 确认开团
  1564. // 判断是否有学生缴费
  1565. if (this.paymentNum <= 0) {
  1566. this.$message.error("当前缴费人数为0,无法开团");
  1567. return;
  1568. }
  1569. this.$confirm(`是否确认开团?`, "提示", {
  1570. confirmButtonText: "确定",
  1571. cancelButtonText: "取消",
  1572. type: "warning",
  1573. })
  1574. .then(() => {
  1575. musicGroupFound({
  1576. musicGroupId: this.$route.query.id,
  1577. }).then((res) => {
  1578. if (res.code == 200) {
  1579. // let query = this.$route.query;
  1580. // this.$message.success("开启成功");
  1581. // this.$router.push({
  1582. // path: "/teamList",
  1583. // query: {
  1584. // ...query,
  1585. // },
  1586. // });
  1587. this.onCancel();
  1588. }
  1589. });
  1590. })
  1591. .catch(() => {});
  1592. },
  1593. onClose() {
  1594. // 停止乐团
  1595. this.$confirm("您确定停止乐团吗?", "提示", {
  1596. confirmButtonText: "确定",
  1597. cancelButtonText: "取消",
  1598. type: "warning",
  1599. })
  1600. .then(() => {
  1601. cancelMusicGroup({
  1602. musicGroupId: this.$route.query.id,
  1603. }).then((res) => {
  1604. if (res.code == 200) {
  1605. this.$message.success("停止成功");
  1606. this.$store.dispatch("delVisitedViews", this.$route);
  1607. this.$router.push({
  1608. path: "/teamList",
  1609. });
  1610. }
  1611. });
  1612. })
  1613. .catch(() => {});
  1614. },
  1615. handleSelectionChange(val) {
  1616. this.multipleSelection = val;
  1617. },
  1618. // 修改专业
  1619. resetSubject(row) {
  1620. this.activeId = row.studentId;
  1621. this.maskForm.subject = row.actualSubjectId;
  1622. this.subjectVisible = true;
  1623. // resetStudentSubject().then(res=>{]})
  1624. },
  1625. // 确认修改
  1626. okReset() {
  1627. if (!this.maskForm.subject) {
  1628. this.$message.error("请选择调剂专业");
  1629. return;
  1630. }
  1631. resetStudentSubject({
  1632. musicGroupId: this.id,
  1633. userId: this.activeId,
  1634. subId: this.maskForm.subject,
  1635. }).then((res) => {
  1636. if (res.code == 200) {
  1637. this.$message.success("修改成功");
  1638. this.subjectVisible = false;
  1639. this.maskForm.subject = "";
  1640. getintoClass({ musicGroupId: this.id }).then((res) => {
  1641. if (res.code == 200) {
  1642. this.leftList = res.data;
  1643. }
  1644. });
  1645. this.getList();
  1646. }
  1647. });
  1648. },
  1649. onExtendPayment(formName, isPay) {
  1650. this.$refs[formName].validate((valid) => {
  1651. if (valid) {
  1652. if (!isPay) {
  1653. extensionApplyExpire({
  1654. musicGroupId: this.id,
  1655. expireDate: this.extendForm.expireDate,
  1656. }).then((res) => {
  1657. if (res.code == 200) {
  1658. this.$message.success("延长报名成功");
  1659. this.extendPaymentStatus = false;
  1660. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  1661. if (res.code == 200) {
  1662. this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  1663. }
  1664. });
  1665. } else {
  1666. this.$message.error(res.msg);
  1667. }
  1668. });
  1669. } else {
  1670. extensionPayment({
  1671. musicGroupId: this.id,
  1672. expireDate: this.extendForm.expireDate,
  1673. }).then((res) => {
  1674. if (res.code == 200) {
  1675. this.$message.success("延长缴费成功");
  1676. this.extendPaymentStatus = false;
  1677. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  1678. if (res.code == 200) {
  1679. this.paymentExpireDate =
  1680. res.data.musicGroup.paymentExpireDate;
  1681. }
  1682. });
  1683. } else {
  1684. this.$message.error(res.msg);
  1685. }
  1686. });
  1687. }
  1688. }
  1689. });
  1690. },
  1691. async lookdetail(row) {
  1692. await getStudentFeeDetail({
  1693. musicGroupId: this.id,
  1694. studentId: row.studentId,
  1695. }).then((res) => {
  1696. if (res.code == 200) {
  1697. const paymentList = res.data || [];
  1698. paymentList.forEach((item) => {
  1699. if (item.type == "MAINTENANCE") {
  1700. item.name = "乐器保养";
  1701. } else if (item.type == "CLOUD_TEACHER" || item.type == "CLOUD_TEACHER_PLUS") {
  1702. item.name = "乐器练习云教练";
  1703. } else if (item.type == "COURSE") {
  1704. item.name = "课程";
  1705. }
  1706. if (courseType[item.type]) {
  1707. item.name = courseType[item.type];
  1708. }
  1709. });
  1710. this.orderForm = paymentList;
  1711. }
  1712. });
  1713. this.activeId = row.studentId;
  1714. this.orderVisible = true;
  1715. },
  1716. saveIsEdit() {
  1717. // 提交数据
  1718. this.isEdit = false;
  1719. resetPlanNum(this.leftList).then((res) => {});
  1720. },
  1721. async quitTeam(row) {
  1722. try {
  1723. const res = await getRefundsDetail({
  1724. musicGroupId: this.$route.query.id,
  1725. userId: row.studentId,
  1726. });
  1727. this.quitForm = {
  1728. ...this.quitForm,
  1729. ...res.data,
  1730. courseViewType: this.courseViewType,
  1731. studentName: row.studentName,
  1732. musicGroupName: this.teamName,
  1733. hasMaintenance: row.hasMaintenance,
  1734. };
  1735. this.activeRow = { ...row, ...res.data };
  1736. this.activeRow.courseViewType = this.courseViewType;
  1737. this.quitVisible = true;
  1738. // this.quitForm.cloudTeacherAmount = row.cloudTeacherAmount;
  1739. } catch (e) {
  1740. console.log(e);
  1741. }
  1742. // 查询退团费用
  1743. },
  1744. // quieTeams(row) {
  1745. // this.$prompt("请输入退团原因", "提示", {
  1746. // confirmButtonText: "确定",
  1747. // cancelButtonText: "取消",
  1748. // inputPattern: /\S/,
  1749. // inputErrorMessage: "请输入退团原因",
  1750. // type: "warning",
  1751. // })
  1752. // .then((val) => {
  1753. // // 发请求 退团
  1754. // StudentQuit({
  1755. // musicGroupId: this.id,
  1756. // userId: row.studentId,
  1757. // reason: val.value,
  1758. // isRefundCourseFee: false,
  1759. // isRefundInstrumentFee: false,
  1760. // isRefundTeachingAssistantsFee: false,
  1761. // isRefundMemberFee: false,
  1762. // }).then((res) => {
  1763. // this.quitForm = {
  1764. // // 退团信息确认
  1765. // isRefundCourseFee: null,
  1766. // isRefundInstrumentFee: null,
  1767. // isRefundTeachingAssistantsFee: null,
  1768. // isMaintenanceFee: null,
  1769. // cloudTeacherAmount: null,
  1770. // isCloudTeacherAmount: null,
  1771. // maintenanceFee: 0,
  1772. // reason: "",
  1773. // };
  1774. // if (res.code == 200) {
  1775. // this.$message.success("退团成功");
  1776. // this.getList();
  1777. // this.quitVisible = false;
  1778. // }
  1779. // });
  1780. // })
  1781. // .catch(() => {});
  1782. // },
  1783. chioseType() {
  1784. this.$refs["quitForm"].$refs["quitForm"].validate((res) => {
  1785. if (res) {
  1786. this.$confirm("确定退团?", "提示", {
  1787. confirmButtonText: "确定",
  1788. cancelButtonText: "取消",
  1789. type: "warning",
  1790. })
  1791. .then(() => {
  1792. let row = this.activeRow;
  1793. let params = {
  1794. ...this.quitForm,
  1795. musicGroupId: this.id,
  1796. userId: row.studentId,
  1797. reason: this.quitForm.reason,
  1798. isRefundCourseFee: this.quitForm.isRefundCourseFee,
  1799. isRefundInstrumentFee: this.quitForm.isRefundInstrumentFee,
  1800. isRefundTeachingAssistantsFee:
  1801. this.quitForm.isRefundTeachingAssistantsFee,
  1802. maintenanceFee: this.quitForm.maintenanceFee,
  1803. isRefundMemberFee: this.quitForm.isRefundMemberFee,
  1804. };
  1805. params.returnFeeDto = {
  1806. accessoriesFee: params.accessoriesFee,
  1807. courseFee: params.courseFee,
  1808. isReturnAccessoriesFee: params.isReturnAccessoriesFee,
  1809. isReturnCourseFee: params.isReturnCourseFee,
  1810. isReturnMaintenanceFee: params.isReturnMaintenanceFee,
  1811. isReturnMemberFee: params.isReturnMemberFee,
  1812. isReturnMusicalFee: params.isReturnMusicalFee,
  1813. maintenanceFee: params.maintenanceFee,
  1814. memberFee: params.memberFee,
  1815. musicalFee: params.musicalFee,
  1816. };
  1817. if (this.isManage) {
  1818. params.status = "APPROVED";
  1819. } else {
  1820. params.status = "PROCESSING";
  1821. }
  1822. // 发请求 退团
  1823. applyMusicGroupQuit(params).then((res) => {
  1824. if (res.code == 200) {
  1825. this.quitForm = {
  1826. // 退团信息确认
  1827. isRefundCourseFee: null,
  1828. isRefundInstrumentFee: null,
  1829. isRefundTeachingAssistantsFee: null,
  1830. reason: "",
  1831. courseViewType: null,
  1832. hasMaintenance: null,
  1833. studentName: null,
  1834. musicGroupName: null,
  1835. isVisit: false,
  1836. reason: "",
  1837. userComment: null,
  1838. };
  1839. if(this.isManage == "super") {
  1840. this.$message.success("退团成功");
  1841. }else{
  1842. this.$message.success("退团申请成功");
  1843. }
  1844. this.getList();
  1845. this.quitVisible = false;
  1846. }
  1847. });
  1848. })
  1849. .catch(() => {});
  1850. } else {
  1851. }
  1852. });
  1853. // row.typeVisible = false;
  1854. },
  1855. addVisit(row) {
  1856. // this.visitForm.studentName = row.studentName;
  1857. // this.visitForm.musicGroupId = this.teamid;
  1858. // this.visitForm.studentId = row.studentId;
  1859. row.userId = row.studentId;
  1860. this.detail = row;
  1861. this.detail.musicGroupId = this.$route.query.id;
  1862. this.visitVisiable = true;
  1863. },
  1864. openChangeVoice(row) {
  1865. this.getList().then((res) => {
  1866. for (const item of res.data.rows) {
  1867. if (item.id === row.id) {
  1868. this.rowDetail = { ...item, userId: item.studentId };
  1869. this.changeVoiceVisible = true;
  1870. }
  1871. }
  1872. });
  1873. },
  1874. closeChangeVoice() {
  1875. this.changeVoiceVisible = false;
  1876. // this.rowDetail = null
  1877. },
  1878. handleChange(val) {
  1879. this.visitForm.type = val[0];
  1880. this.visitForm.purpose = val[1];
  1881. },
  1882. submitAddVisit() {
  1883. this.$refs.visitForm.validate((res) => {
  1884. if (res) {
  1885. this.visitForm.visitType = null;
  1886. this.visitForm.musicGroupId = this.id;
  1887. addVisit(cleanDeep(this.visitForm)).then((res) => {
  1888. if (res.code === 200) {
  1889. this.$message.success("新增成功");
  1890. this.visitVisiable = false;
  1891. }
  1892. });
  1893. }
  1894. });
  1895. },
  1896. beginDate(date) {
  1897. let self = this;
  1898. return {
  1899. firstDayOfWeek: 1,
  1900. disabledDate(time) {
  1901. return time.getTime() >= date.getTime(); //开始时间不选时,结束时间最大值小于等于当天
  1902. },
  1903. };
  1904. },
  1905. extendTime(isPay) {
  1906. this.isPay = isPay;
  1907. if (isPay) {
  1908. // 点击的延长缴费
  1909. this.extendForm.expireDate = this.paymentExpireDate;
  1910. } else {
  1911. // 点击的延长报名
  1912. this.extendForm.expireDate = this.applyExpireDate;
  1913. }
  1914. this.extendPaymentStatus = true;
  1915. },
  1916. payDate() {
  1917. let self = this;
  1918. return {
  1919. firstDayOfWeek: 1,
  1920. disabledDate(time) {
  1921. return time.getTime() + 86400000 < new Date().getTime();
  1922. },
  1923. };
  1924. },
  1925. applyDate() {
  1926. let self = this;
  1927. return {
  1928. firstDayOfWeek: 1,
  1929. disabledDate(time) {
  1930. return time.getTime() + 86400000 < new Date().getTime();
  1931. },
  1932. };
  1933. },
  1934. checkboxSelect(row) {
  1935. return row.paymentStatus == 0;
  1936. },
  1937. relieve(row) {
  1938. this.$confirm("操作后该学员即可不购买云教练缴费入团", "提示", {
  1939. confirmButtonText: "确定",
  1940. cancelButtonText: "取消",
  1941. type: "warning",
  1942. }).then(async () => {
  1943. try {
  1944. const res = await setNoneCloudTeacher({ id: row.id });
  1945. console.log("code", res.code);
  1946. if (res.code == 200) {
  1947. this.$message.success("解除预约成功");
  1948. this.getList();
  1949. } else if (res.code == 100) {
  1950. this.$confirm(res.msg, "提示", {
  1951. confirmButtonText: "确定",
  1952. cancelButtonText: "取消",
  1953. type: "warning",
  1954. }).then(async (some) => {
  1955. const res = await setNoneCloudTeacher({
  1956. id: row.id,
  1957. isContinue: true,
  1958. });
  1959. if (res.code == 200) {
  1960. this.$message.success("解除预约成功");
  1961. this.getList();
  1962. }
  1963. });
  1964. }
  1965. } catch (e) {
  1966. console.log("错误", e);
  1967. }
  1968. });
  1969. },
  1970. failedRelieve(row) {
  1971. this.$confirm("拒绝后学员需购买会员方可入团", "提示", {
  1972. confirmButtonText: "确定",
  1973. cancelButtonText: "取消",
  1974. type: "warning",
  1975. }).then(async () => {
  1976. try {
  1977. const res = await setCloudTeacherToFailed({ id: row.id });
  1978. this.$message.success("操作成功");
  1979. this.getList();
  1980. } catch (e) {
  1981. console.log(e);
  1982. }
  1983. });
  1984. },
  1985. getCheckNum(row, type) {
  1986. this.rules.page = 1;
  1987. this.rules.limit = 10;
  1988. this.searchFrom = {
  1989. name: null,
  1990. subject: null, // 专业
  1991. isAllowAdjust: null, // 是否允许调剂
  1992. currentGrade: null,
  1993. paymentStatus: null,
  1994. visited: null,
  1995. hasCloudTeacher: null,
  1996. payingStatus: null,
  1997. studentStatus: null,
  1998. noneNeedCloudTeacher: null,
  1999. };
  2000. this.searchFrom.subject = row.subjectId;
  2001. if (type == "buyCloud") {
  2002. this.searchFrom.hasCloudTeacher = 1;
  2003. } else if (type == "noCloud") {
  2004. this.searchFrom.hasCloudTeacher = 0;
  2005. this.searchFrom.studentStatus = "NORMAL";
  2006. } else {
  2007. this.searchFrom.payingStatus = 2;
  2008. this.searchFrom.hasCloudTeacher = 0;
  2009. }
  2010. this.search();
  2011. },
  2012. getpayingNum(row) {
  2013. this.rules.page = 1;
  2014. this.rules.limit = 10;
  2015. this.searchFrom = {
  2016. name: null,
  2017. subject: null, // 专业
  2018. isAllowAdjust: null, // 是否允许调剂
  2019. currentGrade: null,
  2020. paymentStatus: null,
  2021. visited: null,
  2022. hasCloudTeacher: null,
  2023. payingStatus: null,
  2024. studentStatus: null,
  2025. noneNeedCloudTeacher: null,
  2026. };
  2027. this.searchFrom.subject = row.subjectId;
  2028. this.searchFrom.payingStatus = 1;
  2029. this.search();
  2030. },
  2031. getpayNum(row) {
  2032. this.rules.page = 1;
  2033. this.rules.limit = 10;
  2034. this.searchFrom = {
  2035. name: null,
  2036. subject: null, // 专业
  2037. isAllowAdjust: null, // 是否允许调剂
  2038. currentGrade: null,
  2039. paymentStatus: null,
  2040. visited: null,
  2041. hasCloudTeacher: null,
  2042. payingStatus: null,
  2043. studentStatus: null,
  2044. noneNeedCloudTeacher: null,
  2045. };
  2046. this.searchFrom.subject = row.subjectId;
  2047. this.searchFrom.paymentStatus = 2 + "";
  2048. this.search();
  2049. },
  2050. },
  2051. watch: {
  2052. "quitForm.isMaintenanceFee"(val) {
  2053. if (val) {
  2054. this.quitForm.maintenanceFee = 300;
  2055. } else {
  2056. this.quitForm.maintenanceFee = 0;
  2057. }
  2058. },
  2059. orderVisible(val) {
  2060. if (!val) {
  2061. this.orderForm = [];
  2062. }
  2063. },
  2064. qrcodeStatus(val) {
  2065. if (!val) {
  2066. this.qrcode.clear();
  2067. }
  2068. },
  2069. qrcodeStatus2(val) {
  2070. if (!val) {
  2071. this.qrcode2.clear();
  2072. }
  2073. },
  2074. paymentStatus(val) {
  2075. if (!val) {
  2076. this.paymentForm = {
  2077. paymentExpireDate: null,
  2078. // feeType: null
  2079. };
  2080. }
  2081. },
  2082. quitVisible(val) {
  2083. if (!val) {
  2084. this.quitForm = {
  2085. // 退团信息确认
  2086. isRefundCourseFee: null,
  2087. isRefundInstrumentFee: null,
  2088. isRefundTeachingAssistantsFee: null,
  2089. courseViewType: null,
  2090. hasMaintenance: null,
  2091. studentName: null,
  2092. musicGroupName: null,
  2093. isVisit: false,
  2094. reason: "",
  2095. userComment: null,
  2096. };
  2097. this.$refs["quitForm"].$refs["quitForm"].resetFields();
  2098. }
  2099. },
  2100. // visitVisiable(val) {
  2101. // if (!val) {
  2102. // this.$refs["visitForm"].resetFields();
  2103. // }
  2104. // },
  2105. },
  2106. };
  2107. </script>
  2108. <style lang="scss" scoped>
  2109. .courseYellow {
  2110. color: #ff802c;
  2111. }
  2112. .hiddenwrap {
  2113. display: flex;
  2114. flex-direction: row;
  2115. align-items: center;
  2116. p {
  2117. font-size: 14px;
  2118. color: #606266;
  2119. line-height: 40px;
  2120. padding: 0 12px 0 0;
  2121. box-sizing: border-box;
  2122. font-weight: 700;
  2123. }
  2124. }
  2125. .auth {
  2126. display: inline-block;
  2127. & + .auth {
  2128. margin-left: 0px;
  2129. }
  2130. }
  2131. .dialog-footer.question {
  2132. display: flex;
  2133. flex-direction: row;
  2134. justify-content: space-between;
  2135. }
  2136. .sigup-container {
  2137. margin-left: 12px;
  2138. .topWrap {
  2139. padding: 18px 58px 18px 0;
  2140. // height: 136px;
  2141. background-color: #fff;
  2142. // display: flex;
  2143. // flex-direction: row;
  2144. // justify-content: space-between;
  2145. .msg.pay {
  2146. color: #f85043;
  2147. }
  2148. .msg {
  2149. text-align: right;
  2150. color: #f97215;
  2151. font-size: 32px;
  2152. font-weight: bold;
  2153. padding-top: 30px;
  2154. box-sizing: border-box;
  2155. img {
  2156. width: 36px;
  2157. height: 36px;
  2158. position: relative;
  2159. top: 5px;
  2160. margin-right: 8px;
  2161. }
  2162. }
  2163. h2 {
  2164. height: 48px;
  2165. line-height: 48px;
  2166. position: relative;
  2167. // padding-left: 30px;
  2168. font-size: 32px;
  2169. font-weight: 600;
  2170. margin-bottom: 10px;
  2171. display: flex;
  2172. flex-direction: row;
  2173. justify-content: flex-start;
  2174. align-items: center;
  2175. .term {
  2176. height: 32px;
  2177. line-height: 32px;
  2178. border-radius: 24px;
  2179. width: 100px;
  2180. color: #14928a;
  2181. border: 1px solid rgba(20, 146, 138, 1);
  2182. font-size: 14px;
  2183. text-align: center;
  2184. margin-right: 12px;
  2185. &:nth-child(1) {
  2186. margin-left: 47px;
  2187. }
  2188. }
  2189. .term.active {
  2190. color: #fff;
  2191. background-color: #14928a;
  2192. }
  2193. .squrt {
  2194. position: absolute;
  2195. left: -25px;
  2196. top: 8px;
  2197. height: 34px;
  2198. width: 8px;
  2199. background-color: #14928a;
  2200. }
  2201. }
  2202. .btnList {
  2203. display: flex;
  2204. flex-direction: row;
  2205. justify-content: flex-start;
  2206. align-items: center;
  2207. flex-wrap: wrap;
  2208. & > div {
  2209. margin-right: 15px;
  2210. margin-top: 10px;
  2211. }
  2212. }
  2213. .newBand.close {
  2214. background-color: #777;
  2215. border: 1px solid #777;
  2216. }
  2217. }
  2218. .searchList {
  2219. background-color: #fff;
  2220. padding: 0 58p 0 0px;
  2221. }
  2222. .sigup-core {
  2223. margin-top: 12px;
  2224. display: flex;
  2225. flex-direction: row;
  2226. justify-content: flex-start;
  2227. .left {
  2228. width: 400px;
  2229. background-color: #fff;
  2230. height: 80vh;
  2231. overflow: auto;
  2232. }
  2233. .right {
  2234. width: calc(100% - 400px);
  2235. margin-left: 12px;
  2236. flex-grow: 1;
  2237. }
  2238. }
  2239. }
  2240. .el-dialog__body {
  2241. overflow: hidden;
  2242. }
  2243. .left-code,
  2244. .right-code {
  2245. // width: 50%;
  2246. // float: left;
  2247. h2 {
  2248. font-size: 18px;
  2249. text-align: center;
  2250. padding-bottom: 8px;
  2251. }
  2252. .qrcode {
  2253. display: flex;
  2254. flex-direction: column;
  2255. align-items: center;
  2256. img {
  2257. width: 200px;
  2258. height: 200px;
  2259. margin: 0 auto;
  2260. }
  2261. }
  2262. .code-url {
  2263. font-size: 18px;
  2264. text-align: center;
  2265. padding: 15px 15px 0 15px;
  2266. }
  2267. }
  2268. .newBand {
  2269. margin-bottom: 0;
  2270. max-width: inherit;
  2271. }
  2272. /deep/.el-button--danger {
  2273. background: #f85043;
  2274. }
  2275. .paymentForm {
  2276. /deep/.el-input__inner,
  2277. /deep/.el-input.el-input--suffix {
  2278. width: 360px !important;
  2279. }
  2280. }
  2281. .popoverWrap {
  2282. p {
  2283. line-height: 25px;
  2284. }
  2285. }
  2286. /deep/.description-title {
  2287. margin-bottom: 0;
  2288. }
  2289. /deep/.description-label {
  2290. white-space: normal !important;
  2291. }
  2292. .left {
  2293. text-align: left;
  2294. }
  2295. </style>