signupList.vue 81 KB

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