signupList.vue 77 KB

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