signupList.vue 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708
  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. <h2>
  8. <!-- + '报名详情' -->
  9. <el-page-header @back="onCancel" :content="teamName">
  10. </el-page-header>
  11. </h2>
  12. <p style="margin-bottom: 15px; font-size: 18px; font-weight: 400">
  13. 报名截止时间:{{ applyExpireDate | formatTimer }} 缴费截止时间:{{
  14. paymentExpireDate | formatTimer
  15. }}
  16. </p>
  17. </div>
  18. <p
  19. class="msg"
  20. :class="status == 'PAY' ? 'pay' : ''"
  21. v-if="status == 'APPLY' || status == 'PAY'"
  22. >
  23. <img
  24. :src="status == 'APPLY' ? stepImgs.APPLY : stepImgs.PAY"
  25. alt=""
  26. />
  27. {{ status == "APPLY" ? "报名中" : "缴费中" }}
  28. </p>
  29. </div>
  30. <div class="btnList">
  31. <!-- <div class='newBand close'
  32. v-permission="'musicGroup/cancelMusicGroup'"
  33. @click="onClose">停止乐团</div> v-show="status == 'APPLY'"-->
  34. <div
  35. class="newBand"
  36. @click="payStart"
  37. v-permission="getFullPermission('musicGroup/openPay')"
  38. v-if="status == 'APPLY'"
  39. >
  40. 开始缴费
  41. </div>
  42. <!-- v-show="status=='PAY'" -->
  43. <div
  44. class="newBand"
  45. v-permission="getFullPermission('musicGroup/found')"
  46. @click="onGoHome"
  47. v-if="status == 'APPLY' || status == 'PAY'"
  48. >
  49. 确认开团
  50. </div>
  51. <div
  52. class="newBand"
  53. v-permission="getFullPermission('musicGroup/extensionPayment')"
  54. @click="extendTime(true)"
  55. v-show="
  56. status == 'PAY' || status == 'PROGRESS' || status == 'PREPARE'
  57. "
  58. >
  59. 延长缴费
  60. </div>
  61. <div
  62. class="newBand"
  63. v-permission="
  64. getFullPermission('musicGroup/extensionApplyExpireDate')
  65. "
  66. @click="extendTime(false)"
  67. v-show="
  68. status == 'PAY' ||
  69. status == 'APPLY' ||
  70. status == 'PROGRESS' ||
  71. status == 'PREPARE'
  72. "
  73. >
  74. 延长报名
  75. </div>
  76. <div class="newBand" @click="onCreateQRCode('payment')">报名链接</div>
  77. <div class="newBand" @click="onCreateQRCode('detail')">缴费详情</div>
  78. <div
  79. class="newBand"
  80. v-show="rightList.length > 0"
  81. v-permission="
  82. getFullPermission(
  83. 'studentRegistration/queryStudentApplyDetailExport'
  84. )
  85. "
  86. @click="onDownLoadExecl"
  87. >
  88. 报表导出
  89. </div>
  90. <auth
  91. :auths="getFullPermission('studentRegistration/queryPreApplyList')"
  92. >
  93. <div
  94. class="newBand"
  95. style="margin-right: 0"
  96. @click="forecastVisible = true"
  97. >
  98. 预报名名单
  99. </div>
  100. </auth>
  101. <!-- v-permission="getFullPermission('musicGroup/addMusicGroupRegs')" -->
  102. <div
  103. class="newBand"
  104. v-permission="'musicGroup/addMusicGroupRegs'"
  105. @click="mergeVisible = true"
  106. v-show="status == 'PAY' || status == 'APPLY'"
  107. >
  108. 合并学员
  109. </div>
  110. <div class="newBand" style="background-color: #f97215; border: 1px solid #f97215;" @click="onCreateQRCode('rePayment')">
  111. 报名链接(无乐器)
  112. </div>
  113. </div>
  114. </div>
  115. <el-dialog
  116. title="选择合并乐团"
  117. :visible.sync="mergeVisible"
  118. width="950px"
  119. >
  120. <mergeMusic
  121. v-if="mergeVisible"
  122. style="padding: 0 20px"
  123. :organId="organId"
  124. @close="mergeVisible = false"
  125. @submited="getList"
  126. />
  127. </el-dialog>
  128. <el-dialog
  129. title="预报名名单"
  130. :visible.sync="forecastVisible"
  131. width="950px"
  132. >
  133. <forecastList v-if="forecastVisible" @close="forecastVisible = false" />
  134. </el-dialog>
  135. <!-- stepImgs: {
  136. APPLY: require('@/assets/images/base/clock.png'),
  137. PAY: require('@/assets/images/base/pay.png')
  138. }, -->
  139. </div>
  140. <div class="searchList">
  141. <save-form
  142. :inline="true"
  143. :model="searchFrom"
  144. @submit="search"
  145. @reset="onReset"
  146. >
  147. <el-form-item >
  148. <el-select v-model.trim="searchFrom.subject" filterable clearable placeholder="请选择专业">
  149. <el-option
  150. v-for="(item, index) in soundList"
  151. :key="index"
  152. :label="item.name"
  153. :value="item.id"
  154. ></el-option>
  155. </el-select>
  156. </el-form-item>
  157. <el-form-item >
  158. <el-select
  159. v-model.trim="searchFrom.isAllowAdjust"
  160. filterable
  161. placeholder="请选择是否允许调剂"
  162. clearable
  163. >
  164. <el-option label="是" value="1"></el-option>
  165. <el-option label="否" value="0"></el-option>
  166. </el-select>
  167. </el-form-item>
  168. <el-form-item>
  169. <el-input v-model.trim="searchFrom.name" placeholder="请输入用户名或手机号" clearable></el-input>
  170. </el-form-item>
  171. <el-form-item>
  172. <!-- <el-input v-model.trim="searchFrom.currentGrade" placeholder="请输入年级" clearable></el-input> -->
  173. <el-select v-model.trim="searchFrom.currentGrade" filterable clearable placeholder="请输入年级">
  174. <el-option
  175. v-for="(item, index) in gradeList"
  176. :key="index"
  177. :label="item.label"
  178. :value="item.label"
  179. ></el-option>
  180. </el-select>
  181. </el-form-item>
  182. <!-- 专业actualSubjectId 调剂isAllowAdjust 手机号name -->
  183. <el-form-item>
  184. <el-button type="danger" native-type="search">搜索</el-button>
  185. <el-button type="primary" native-type="reset">重置</el-button>
  186. </el-form-item>
  187. </save-form>
  188. </div>
  189. <div class="sigup-core">
  190. <div class="left">
  191. <el-table
  192. style="width: 100% !important"
  193. :data="leftList"
  194. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  195. >
  196. <el-table-column label="乐团声部" prop="subjectName" align="center">
  197. </el-table-column>
  198. <el-table-column
  199. label="计划招生"
  200. prop="expectedStudentNum"
  201. align="center"
  202. >
  203. <template slot-scope="scope">
  204. <div>
  205. <p v-show="!isEdit">{{ scope.row.expectedStudentNum }}</p>
  206. <el-input
  207. v-show="isEdit"
  208. v-model.trim="scope.row.expectedStudentNum"
  209. ></el-input>
  210. </div>
  211. </template>
  212. </el-table-column>
  213. <el-table-column label="已报名" prop="applyStudentNum" align="center">
  214. </el-table-column>
  215. <el-table-column label="已缴费" prop="payNum" align="center">
  216. </el-table-column>
  217. </el-table>
  218. <div
  219. class="btnWrap"
  220. v-permission="
  221. getFullPermission('musicGroup/updateExpectedStudentNum')
  222. "
  223. style="margin-right: 20px; margin-top: 20px"
  224. >
  225. <el-button v-show="!isEdit" @click="isEdit = true">编辑</el-button>
  226. <el-button v-show="isEdit" @click="saveIsEdit">保存</el-button>
  227. </div>
  228. </div>
  229. <div class="right">
  230. <el-table
  231. :data="rightList"
  232. ref="multipleTable"
  233. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  234. @selection-change="handleSelectionChange"
  235. >
  236. <el-table-column
  237. type="selection"
  238. width="55"
  239. :selectable="checkboxSelect"
  240. >
  241. </el-table-column>
  242. <el-table-column label="学员姓名" prop="studentName" align="center">
  243. </el-table-column>
  244. <el-table-column label="家长姓名" prop="parentsName" align="center">
  245. </el-table-column>
  246. <el-table-column align="center" label="入团年份">
  247. <template slot-scope="scope">
  248. <div>{{ scope.row.currentGradeDate | dayjsFormat('YYYY年') }}</div>
  249. </template>
  250. </el-table-column>
  251. <el-table-column label="年级班级" align="center">
  252. <template slot-scope="scope">
  253. <div>
  254. {{ scope.row.currentGrade + scope.row.currentClass }}
  255. </div>
  256. </template>
  257. </el-table-column>
  258. <el-table-column label="性别" prop="gender" align="center">
  259. <template slot-scope="scope">
  260. <div>
  261. {{ scope.row.gender | sex }}
  262. </div>
  263. </template>
  264. </el-table-column>
  265. <el-table-column label="服从调剂" prop="isAllowAdjust" align="center">
  266. <template slot-scope="scope">
  267. <div>
  268. {{ scope.row.isAllowAdjust | isAllowAdjust }}
  269. </div>
  270. </template>
  271. </el-table-column>
  272. <el-table-column label="报名专业" prop="subjectName" align="center">
  273. </el-table-column>
  274. <el-table-column
  275. label="调剂专业"
  276. prop="actualSubjectName"
  277. align="center"
  278. >
  279. </el-table-column>
  280. <el-table-column label="联系电话" prop="parentsPhone" align="center">
  281. </el-table-column>
  282. <!-- v-show='status == "PAY"' -->
  283. <el-table-column
  284. label="报名缴费状态"
  285. fixed="right"
  286. prop="paymentStatus"
  287. align="center"
  288. >
  289. <template slot-scope="scope">
  290. <div>
  291. {{ scope.row.paymentStatus | paymentStatus }}
  292. </div>
  293. </template>
  294. </el-table-column>
  295. <el-table-column
  296. label="操作"
  297. fixed="right"
  298. width="240"
  299. align="center"
  300. >
  301. <template slot-scope="scope">
  302. <div>
  303. <auth
  304. :auths="
  305. getFullPermission('studentRegistration/batchUpdateSubject')
  306. "
  307. >
  308. <el-button
  309. type="text"
  310. v-show="scope.row.paymentStatus != 2"
  311. @click="resetSubject(scope.row)"
  312. >修改专业</el-button
  313. >
  314. </auth>
  315. <!-- APPLY status == "APPLY" || s-->
  316. <el-popover
  317. v-show="scope.row.remark"
  318. placement="top-start"
  319. title="备注"
  320. width="200"
  321. trigger="hover"
  322. :content="scope.row.remark"
  323. >
  324. <el-button type="text" slot="reference">备注</el-button>
  325. </el-popover>
  326. <!-- PAY -->
  327. <!-- && status == "PAY"-->
  328. <auth
  329. :auths="
  330. getFullPermission('studentRegistration/queryFeeDetail')
  331. "
  332. v-show="scope.row.paymentStatus == 2"
  333. >
  334. <el-button type="text" @click="lookdetail(scope.row)"
  335. >查看</el-button
  336. >
  337. </auth>
  338. <auth
  339. :auths="
  340. getFullPermission('musicGroupQuit/directQuitMusicGroup2')
  341. "
  342. v-show="scope.row.paymentStatus == 2"
  343. >
  344. <el-button type="text" @click="quitTeam(scope.row)"
  345. >退团退费</el-button
  346. >
  347. </auth>
  348. <auth
  349. :auths="
  350. getFullPermission('musicGroupQuit/directQuitMusicGroup3')
  351. "
  352. v-show="scope.row.paymentStatus == 2"
  353. >
  354. <el-button type="text" @click="quieTeams(scope.row)"
  355. >退团</el-button
  356. >
  357. </auth>
  358. <auth :auths="getFullPermission('visit/add')">
  359. <el-button type="text" @click="addVisit(scope.row)"
  360. >新增回访</el-button
  361. >
  362. </auth>
  363. <auth
  364. :auths="getFullPermission('subjectChange/getStudentOriginal')"
  365. v-show="scope.row.paymentStatus == 2"
  366. >
  367. <el-button type="text" @click="openChangeVoice(scope.row)"
  368. >更改声部</el-button
  369. >
  370. </auth>
  371. </div>
  372. </template>
  373. </el-table-column>
  374. </el-table>
  375. <div
  376. style="margin-top: 10px; margin-bottom: 10px"
  377. v-show="
  378. status == 'APPLY' || status == 'PROGRESS' || status == 'PREPARE'
  379. "
  380. >
  381. <el-button @click="onSelectAll">全选/取消</el-button>
  382. <auth :auths="getFullPermission('studentRegistration/openPayment')">
  383. <el-button
  384. style="background-color: #14928a; border: 1px solid #14928a"
  385. @click="onPartPayment"
  386. type="primary"
  387. >开启缴费</el-button
  388. >
  389. </auth>
  390. <!-- <div class='newBand' v-show="status=='APPLY'">允许缴费</div> -->
  391. </div>
  392. <pagination
  393. sync
  394. :total.sync="rules.total"
  395. :page.sync="rules.page"
  396. :limit.sync="rules.limit"
  397. :page-sizes="rules.page_size"
  398. @pagination="getList"
  399. />
  400. </div>
  401. </div>
  402. <el-dialog title="修改专业" :visible.sync="subjectVisible" width="400px">
  403. <el-form :model="maskForm">
  404. <el-form-item label="选择专业">
  405. <el-select v-model.trim="maskForm.subject" filterable clearable>
  406. <el-option
  407. v-for="(item, index) in soundList"
  408. :key="index"
  409. :label="item.name"
  410. :value="item.id"
  411. ></el-option>
  412. </el-select>
  413. </el-form-item>
  414. </el-form>
  415. <div slot="footer" class="dialog-footer">
  416. <el-button @click="subjectVisible = false">取 消</el-button>
  417. <el-button type="primary" @click="okReset">确 定</el-button>
  418. </div>
  419. </el-dialog>
  420. <el-dialog
  421. :title="!isPay ? '延长报名' : '延长缴费'"
  422. :visible.sync="extendPaymentStatus"
  423. destroy-on-close
  424. width="400px"
  425. >
  426. <el-form :model="extendForm" ref="extendForm" :rules="extendRule">
  427. <el-form-item v-if="isPay" label="延长缴费时间" prop="expireDate">
  428. <el-date-picker
  429. v-model.trim="extendForm.expireDate"
  430. value-format="yyyy-MM-dd"
  431. type="date"
  432. :picker-options="{
  433. firstDayOfWeek: 1,
  434. }"
  435. placeholder="选择日期"
  436. >
  437. </el-date-picker>
  438. </el-form-item>
  439. <el-form-item label="延长报名时间" v-else prop="expireDate">
  440. <el-date-picker
  441. v-model.trim="extendForm.expireDate"
  442. value-format="yyyy-MM-dd"
  443. type="date"
  444. :picker-options="applyDates"
  445. placeholder="选择日期"
  446. >
  447. </el-date-picker>
  448. </el-form-item>
  449. </el-form>
  450. <div slot="footer" class="dialog-footer">
  451. <el-button @click="extendPaymentStatus = false">取 消</el-button>
  452. <el-button
  453. type="primary"
  454. v-if="isPay"
  455. @click="onExtendPayment('extendForm', isPay)"
  456. >确 定</el-button
  457. >
  458. <el-button
  459. v-else
  460. type="primary"
  461. @click="onExtendPayment('extendForm', isPay)"
  462. >确 定</el-button
  463. >
  464. </div>
  465. </el-dialog>
  466. <el-dialog title="订单详情" :visible.sync="orderVisible" width="600px">
  467. <el-form :model="orderForm" :inline="true">
  468. <!-- name: '',
  469. totalAmount: '',
  470. subject: '',
  471. subjectFee: '',
  472. axe: '',
  473. axePrice: '',
  474. others: '',
  475. othersPrice: '' -->
  476. <el-form-item label="学员姓名">
  477. <el-input v-model.trim="orderForm.name" disabled=""></el-input>
  478. </el-form-item>
  479. <el-form-item label="实缴金额">
  480. <el-input v-model.trim="orderForm.totalAmount" disabled=""></el-input>
  481. </el-form-item>
  482. <el-form-item label="实际专业">
  483. <el-input v-model.trim="orderForm.subject" disabled=""></el-input>
  484. </el-form-item>
  485. <el-form-item label="课程费用">
  486. <el-input v-model.trim="orderForm.subjectFee" disabled=""></el-input>
  487. </el-form-item>
  488. <el-form-item label="选择乐器">
  489. <el-input v-model.trim="orderForm.axe" disabled=""></el-input>
  490. </el-form-item>
  491. <el-form-item label="乐器价格">
  492. <el-input v-model.trim="orderForm.axePrice" disabled=""></el-input>
  493. </el-form-item>
  494. <el-form-item label="教辅组合">
  495. <el-input v-model.trim="orderForm.others" disabled=""></el-input>
  496. </el-form-item>
  497. <el-form-item label="组合价格">
  498. <el-input v-model.trim="orderForm.othersPrice" disabled=""></el-input>
  499. </el-form-item>
  500. </el-form>
  501. <div slot="footer" class="dialog-footer">
  502. <!-- <el-button>取 消</el-button> -->
  503. <el-button type="primary" @click="orderVisible = false"
  504. >确 定</el-button
  505. >
  506. </div>
  507. </el-dialog>
  508. <el-dialog
  509. title="开始缴费"
  510. :visible.sync="paymentStatus"
  511. width="400px"
  512. destroy-on-close
  513. >
  514. <el-form
  515. ref="paymentForm"
  516. class="paymentForm"
  517. :model="paymentForm"
  518. label-position="top"
  519. :rules="paymentRules"
  520. >
  521. <el-form-item label="请设置缴费截止日期" prop="paymentExpireDate">
  522. <el-date-picker
  523. v-model.trim="paymentForm.paymentExpireDate"
  524. type="date"
  525. value-format="yyyy-MM-dd"
  526. :picker-options="payDate()"
  527. style="width: 100%"
  528. placeholder="选择日期"
  529. >
  530. </el-date-picker>
  531. </el-form-item>
  532. <!-- <el-form-item label="是否排乐团网管课"
  533. :rules="[{ required: true, message: '请选择是否排乐团网管课'}]"
  534. prop="feeType">
  535. <el-select v-model="paymentForm.feeType"
  536. style="width: 100%!imoprtant">
  537. <el-option label="需要排线上课"
  538. value="ONLINE"></el-option>
  539. <el-option label="只排线下课"
  540. value="OFFLINE"></el-option>
  541. </el-select>
  542. </el-form-item> -->
  543. </el-form>
  544. <div slot="footer" class="dialog-footer">
  545. <el-button @click="paymentStatus = false">取 消</el-button>
  546. <el-button type="primary" @click="onStartPayment('paymentForm')"
  547. >确 定</el-button
  548. >
  549. </div>
  550. </el-dialog>
  551. <!-- <el-dialog title="报名二维码" :visible.sync="qrcodeStatus" width="300px">
  552. <div class="left-code">
  553. <h2>学员报名连接</h2>
  554. <div id="qrcode" class="qrcode code" ref="qrCodeUrl"></div>
  555. <p class="code-url" v-show="codeUrl">{{ codeUrl }}</p>
  556. </div>
  557. </el-dialog>
  558. <el-dialog
  559. title="缴费详情二维码"
  560. :visible.sync="qrcodeStatus2"
  561. width="300px"
  562. >
  563. <div class="right-code">
  564. <h2>报名缴费详情</h2>
  565. <div id="qrcode2" class="qrcode code" ref="qrCodeUrl"></div>
  566. <p class="code-url" v-show="codeUrl2">{{ codeUrl2 }}</p>
  567. </div>
  568. </el-dialog> -->
  569. <!-- 预报名连接 -->
  570. <qr-code v-model="codeStatus" :title="codeTitle" :codeUrl="qrCodeUrl" />
  571. <!-- 退团弹窗 -->
  572. <el-dialog
  573. title="退团信息确认"
  574. :destroy-on-close="true"
  575. width="640px"
  576. :visible.sync="quitVisible"
  577. >
  578. <el-form :model="quitForm" ref="quitForm" :rules="quitRules">
  579. <el-form-item label="退还课程费用" prop="isRefundCourseFee">
  580. <el-radio v-model.trim="quitForm.isRefundCourseFee" :label="true"
  581. >是</el-radio
  582. >
  583. <el-radio v-model.trim="quitForm.isRefundCourseFee" :label="false"
  584. >否</el-radio
  585. >
  586. </el-form-item>
  587. <el-form-item label="退还乐器费用" prop="isRefundInstrumentFee">
  588. <el-radio v-model.trim="quitForm.isRefundInstrumentFee" :label="true"
  589. >是</el-radio
  590. >
  591. <el-radio v-model.trim="quitForm.isRefundInstrumentFee" :label="false"
  592. >否</el-radio
  593. >
  594. </el-form-item>
  595. <el-form-item label="退还教辅费用" prop="isRefundTeachingAssistantsFee">
  596. <el-radio
  597. v-model.trim="quitForm.isRefundTeachingAssistantsFee"
  598. :label="true"
  599. >是</el-radio
  600. >
  601. <el-radio
  602. v-model.trim="quitForm.isRefundTeachingAssistantsFee"
  603. :label="false"
  604. >否</el-radio
  605. >
  606. </el-form-item>
  607. <el-form-item label="退团原因" prop="reason">
  608. <el-input type="textarea" v-model.trim="quitForm.reason"></el-input>
  609. </el-form-item>
  610. </el-form>
  611. <span slot="footer" class="dialog-footer question">
  612. <div>
  613. <el-popover placement="right" width="500" trigger="click">
  614. <div class="popoverWrap">
  615. <p>乐团退团退费规则:</p>
  616. <p>退还课程费用:缴费总额-已结束课时单价之和</p>
  617. <p>退还乐器费用:报名缴费时缴纳的乐器费用(团购、租金)</p>
  618. <p>退还教辅费用:报名缴费时缴费的教辅费用</p>
  619. </div>
  620. <el-button
  621. type="text"
  622. icon="el-icon-question"
  623. slot="reference"
  624. style="color: red"
  625. >退团退费说明</el-button
  626. >
  627. </el-popover>
  628. </div>
  629. <div>
  630. <el-button @click="quitVisible = false">取 消</el-button>
  631. <el-button type="primary" @click="chioseType">确 定</el-button>
  632. </div>
  633. </span>
  634. </el-dialog>
  635. <!-- 回访记录 -->
  636. <el-dialog
  637. title="新增回访"
  638. width="500px"
  639. destroy-on-close
  640. :close-on-click-modal="false"
  641. :visible.sync="visitVisiable"
  642. >
  643. <visit
  644. v-if="visitVisiable && detail"
  645. :detail="detail"
  646. @close="visitVisiable = false"
  647. @submited="getList"
  648. />
  649. </el-dialog>
  650. <el-dialog
  651. title="更改声部"
  652. :visible.sync="changeVoiceVisible"
  653. @close="closeChangeVoice"
  654. :destroy-on-close="true"
  655. width="600px"
  656. >
  657. <changeVoice
  658. @close="closeChangeVoice"
  659. @submited="getList"
  660. :detail.sync="rowDetail"
  661. :musicGroupId="id"
  662. :voiceList="leftList"
  663. />
  664. </el-dialog>
  665. </div>
  666. </template>
  667. <script>
  668. import pagination from "@/components/Pagination/index";
  669. import qrCode from "@/components/QrCode/index";
  670. import {
  671. getintoClass,
  672. getStudentList,
  673. findSound,
  674. musicGroupOpenPay,
  675. openPayment,
  676. musicGroupFound,
  677. extensionPayment,
  678. extensionApplyExpire,
  679. resetPlanNum,
  680. cancelMusicGroup,
  681. getTeamBaseInfo,
  682. studentApplyDetailExport,
  683. StudentQuit,
  684. getMusicGroupGradeList
  685. } from "@/api/buildTeam";
  686. import mergeMusic from "./components/merge-music";
  687. import forecastList from "./components/forecast-list";
  688. import { resetStudentSubject, getStudentFeeDetail } from "@/api/studentManager";
  689. import { vaildStudentUrl, vaildTeacherUrl } from "@/utils/validate";
  690. import { addVisit } from "@/views/returnVisitManager/api.js";
  691. import QRCode from "qrcodejs2";
  692. import { visitChiose } from "@/utils/searchArray";
  693. import axios from "axios";
  694. import { getToken } from "@/utils/auth";
  695. import load from "@/utils/loading";
  696. import qs from "qs";
  697. import { permission } from "@/utils/directivePage";
  698. import cleanDeep from "clean-deep";
  699. import changeVoice from "./modals/change-voice";
  700. import visit from "@/views/withdrawal-application/modals/visit";
  701. export default {
  702. name: "signupList",
  703. components: {
  704. pagination,
  705. qrCode,
  706. changeVoice,
  707. mergeMusic,
  708. forecastList,
  709. visit,
  710. },
  711. data() {
  712. return {
  713. multipleSelection: [], //
  714. forecastVisible: false, // 预报名状态
  715. isEdit: false,
  716. rowDetail: null,
  717. mergeVisible: false,
  718. changeVoiceVisible: false,
  719. subjectVisible: false,
  720. orderVisible: false,
  721. quitVisible: false,
  722. leftList: [],
  723. rightList: [],
  724. searchFrom: {
  725. name: "",
  726. subject: "", // 专业
  727. isAllowAdjust: "", // 是否允许调剂
  728. currentGrade: null, // 入学年级
  729. },
  730. quitForm: {
  731. // 退团信息确认
  732. isRefundCourseFee: null,
  733. isRefundInstrumentFee: null,
  734. isRefundTeachingAssistantsFee: null,
  735. reason: "",
  736. },
  737. stepImgs: {
  738. APPLY: require("@/assets/images/base/clock.png"),
  739. PAY: require("@/assets/images/base/pay.png"),
  740. },
  741. status: "",
  742. id: "",
  743. rules: {
  744. // 分页规则
  745. limit: 10, // 限制显示条数
  746. page: 1, // 当前页
  747. total: 0, // 总条数
  748. page_size: [10, 20, 30, 40], // 选择限制显示条数
  749. },
  750. teamName: "",
  751. maskForm: {
  752. subject: "",
  753. },
  754. activeId: "",
  755. soundList: [],
  756. orderForm: {
  757. name: "",
  758. totalAmount: "",
  759. subject: "",
  760. subjectFee: "",
  761. axe: "",
  762. axePrice: "",
  763. others: "",
  764. othersPrice: "",
  765. },
  766. paymentStatus: false,
  767. paymentForm: {
  768. paymentExpireDate: null,
  769. // feeType: null
  770. },
  771. paymentRules: {
  772. paymentExpireDate: [
  773. { required: true, message: "请设置缴费截止日期", trigger: "blur" },
  774. ],
  775. },
  776. paymentNum: 0, // 缴费了多少人
  777. qrcodeStatus: false, // 生成二维码
  778. qrcodes: true,
  779. qrcode: null,
  780. codeUrl: null,
  781. qrcodeStatus2: false, // 生成二维码
  782. qrcodes2: true,
  783. qrcode2: null,
  784. codeUrl2: null,
  785. codeStatus: false,
  786. codeTitle: null,
  787. qrCodeUrl: null,
  788. organId: "",
  789. extendPaymentStatus: false,
  790. extendForm: {
  791. expireDate: null,
  792. },
  793. extendRule: {
  794. expireDate: [
  795. { required: true, message: "请选择延长时间", trigger: "change" },
  796. ],
  797. },
  798. quitRules: {
  799. isRefundCourseFee: [
  800. { required: true, message: "请选择是否退还课程费用" },
  801. ],
  802. isRefundInstrumentFee: [
  803. { required: true, message: "选择是否退还乐器费用" },
  804. ],
  805. isRefundTeachingAssistantsFee: [
  806. { required: true, message: "选择是否退还教辅费用" },
  807. ],
  808. reason: [{ required: true, message: "请填写退团退费原因" }],
  809. },
  810. applyExpireDate: "",
  811. paymentExpireDate: "",
  812. activeRow: null,
  813. visitVisiable: false,
  814. visitForm: {
  815. musicGroupId: "",
  816. overview: "",
  817. purpose: "",
  818. studentId: "",
  819. type: "",
  820. visitTime: "",
  821. visitType: "",
  822. feedback: "",
  823. studentName: "",
  824. },
  825. visitChiose,
  826. visitRules: {
  827. overview: [{ required: true, message: "请输入学生近况" }],
  828. feedback: [{ required: true, message: "请输入家长反馈" }],
  829. visitTime: [{ required: true, message: "请输入回访时间" }],
  830. visitType: [{ required: true, message: "请选择回访类型" }],
  831. },
  832. isPay: false,
  833. applyDates: this.applyDate(),
  834. detail:null,
  835. gradeList: []
  836. };
  837. },
  838. created() {},
  839. mounted() {
  840. // 通过乐团状态判断显示隐藏的东西
  841. this.init();
  842. },
  843. activated() {
  844. this.init();
  845. },
  846. methods: {
  847. permission(str) {
  848. return permission(str);
  849. },
  850. init() {
  851. this.status = this.$route.query.team_status;
  852. // 通过乐团id 获取乐团招生状态
  853. this.id = this.$route.query.id;
  854. this.teamName = this.$route.query.name;
  855. // 判断是否带缓存参数
  856. this.pickerOptions = this.beginDate(new Date());
  857. getMusicGroupGradeList({ musicGroupId: this.id }).then(res => {
  858. let result = res.data
  859. if(res.code == 200 && result) {
  860. for(let i in result) {
  861. this.gradeList.push({
  862. value: i,
  863. label: result[i]
  864. })
  865. }
  866. }
  867. })
  868. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  869. if (res.code == 200) {
  870. this.organId = res.data.musicGroup.organId;
  871. this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  872. this.paymentExpireDate = res.data.musicGroup.paymentExpireDate;
  873. }
  874. });
  875. // 根据乐团id获乐团声部
  876. findSound({ musicGroupId: this.id }).then((res) => {
  877. if (res.code == 200) {
  878. this.soundList = res.data;
  879. }
  880. });
  881. // 通过乐团id获取乐团学生列表
  882. this.getList();
  883. },
  884. search() {
  885. this.rules.page = 1;
  886. this.getList();
  887. },
  888. onReset() {
  889. this.rules.page = 1;
  890. this.rules.limit = 10;
  891. this.searchFrom = {
  892. name: null,
  893. subject: null, // 专业
  894. isAllowAdjust: null, // 是否允许调剂
  895. currentGrade: null
  896. };
  897. this.getList();
  898. },
  899. onCancel() {
  900. this.$store.dispatch("delVisitedViews", this.$route);
  901. this.$router.push({ path: "/teamList" });
  902. },
  903. payStart() {
  904. this.paymentStatus = true;
  905. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  906. if (res.code == 200) {
  907. this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  908. this.paymentExpireDate = res.data.musicGroup.paymentExpireDate;
  909. }
  910. });
  911. },
  912. getList() {
  913. let obj = {
  914. musicGroupId: this.id,
  915. actualSubjectId: this.searchFrom.subject || null,
  916. isAllowAdjust: this.searchFrom.isAllowAdjust || null,
  917. name: this.searchFrom.name || null,
  918. currentGrade: this.searchFrom.currentGrade || null,
  919. page: this.rules.page,
  920. rows: this.rules.limit,
  921. };
  922. // 根据乐团id获取学团情况
  923. getintoClass({ musicGroupId: this.id }).then((res) => {
  924. if (res.code == 200) {
  925. this.leftList = res.data;
  926. }
  927. });
  928. return getStudentList(obj).then((res) => {
  929. if (res.code == 200) {
  930. res.data.rows.forEach((item) => {
  931. // '未开启缴费', '开启缴费', '已缴费'
  932. if (item.paymentStatus == 2) {
  933. this.paymentNum += 1;
  934. }
  935. });
  936. this.rightList = res.data.rows;
  937. this.rules.total = res.data.total;
  938. return res;
  939. }
  940. });
  941. },
  942. onStartPayment(formName) {
  943. // 开启缴费
  944. this.$refs[formName].validate((valid) => {
  945. if (valid) {
  946. musicGroupOpenPay({
  947. musicGroupId: this.id,
  948. expireDate: this.paymentForm.paymentExpireDate,
  949. // feeType: this.paymentForm.feeType
  950. }).then((res) => {
  951. if (res.code == 200) {
  952. this.$message.success("开启成功");
  953. this.paymentStatus = false;
  954. this.$router.push({
  955. path: "/business/signupList",
  956. query: {
  957. status: "PAY",
  958. id: this.$route.query.id,
  959. name: this.$route.query.name,
  960. },
  961. });
  962. this.status = "PAY";
  963. this.paymentExpireDate = this.paymentForm.paymentExpireDate;
  964. this.getList();
  965. }
  966. });
  967. } else {
  968. return false;
  969. }
  970. });
  971. },
  972. onSelectAll() {
  973. // 选中全部
  974. this.$refs.multipleTable.toggleAllSelection();
  975. },
  976. onPartPayment() {
  977. // 部分缴费
  978. let selection = this.multipleSelection;
  979. if (selection.length <= 0) {
  980. this.$message.error("您还没有选择学生");
  981. return false;
  982. }
  983. let ids = [];
  984. selection.forEach((item) => {
  985. ids.push(item.id);
  986. });
  987. this.$confirm(`是否确认开启缴费?`, "提示", {
  988. confirmButtonText: "确定",
  989. cancelButtonText: "取消",
  990. type: "warning",
  991. })
  992. .then(() => {
  993. openPayment({
  994. ids: ids.join(","),
  995. }).then((res) => {
  996. if (res.code == 200) {
  997. this.$message.success("开启成功");
  998. this.getList();
  999. } else {
  1000. this.$message.error(res.msg);
  1001. }
  1002. });
  1003. })
  1004. .catch(() => {});
  1005. },
  1006. onCreateQRCode(type) {
  1007. // 生成报名二维码
  1008. let id = this.id;
  1009. this.codeStatus = true;
  1010. if (type == "payment") {
  1011. this.codeTitle = "学员报名连接";
  1012. this.qrCodeUrl = vaildStudentUrl() + "/#/login?musicGroupId=" + id;
  1013. } else if (type == "detail") {
  1014. let teamName = this.$route.query.name;
  1015. this.codeTitle = "报名缴费详情";
  1016. this.qrCodeUrl =
  1017. vaildTeacherUrl() +
  1018. "/#/order?musicGroupId=" +
  1019. id +
  1020. "&musicGroupName=" +
  1021. teamName;
  1022. } else if (type == "rePayment") {
  1023. this.codeTitle = "学生报名链接(无乐器)";
  1024. this.qrCodeUrl =
  1025. vaildStudentUrl() + "/#/login?musicGroupId=" + id + "&instrument=1";
  1026. }
  1027. },
  1028. onCreateQRCode2() {
  1029. // 生成报名二维码
  1030. this.qrcodeStatus2 = true;
  1031. let id = this.id;
  1032. let teamName = this.$route.query.name;
  1033. setTimeout(() => {
  1034. document.getElementById("qrcode2").innerHTML = "";
  1035. this.qrcode2 = new QRCode("qrcode2", {
  1036. width: 200,
  1037. height: 200,
  1038. colorDark: "#000000",
  1039. colorLight: "#ffffff",
  1040. correctLevel: QRCode.CorrectLevel.H,
  1041. });
  1042. this.qrcode2.makeCode(
  1043. vaildTeacherUrl() +
  1044. "/#/order?musicGroupId=" +
  1045. id +
  1046. "&musicGroupName=" +
  1047. teamName
  1048. );
  1049. this.codeUrl2 =
  1050. vaildTeacherUrl() +
  1051. "/#/order?musicGroupId=" +
  1052. id +
  1053. "&musicGroupName=" +
  1054. teamName;
  1055. }, 500);
  1056. },
  1057. onDownLoadExecl() {
  1058. // 报表导出
  1059. let url = "/api-web/studentRegistration/queryStudentApplyDetailExport";
  1060. let data = {
  1061. musicGroupId: this.$route.query.id,
  1062. page: 1,
  1063. rows: 9999,
  1064. };
  1065. const options = {
  1066. method: "POST",
  1067. headers: {
  1068. Authorization: getToken(),
  1069. },
  1070. data: qs.stringify(data),
  1071. url,
  1072. responseType: "blob",
  1073. };
  1074. this.$confirm("您确定导出吗?", "提示", {
  1075. confirmButtonText: "确定",
  1076. cancelButtonText: "取消",
  1077. type: "warning",
  1078. })
  1079. .then(() => {
  1080. load.startLoading();
  1081. axios(options)
  1082. .then((res) => {
  1083. let blob = new Blob([res.data], {
  1084. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
  1085. type: "application/vnd.ms-excel;charset=utf-8",
  1086. //word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  1087. });
  1088. let text = new Response(blob).text();
  1089. text.then((res) => {
  1090. // 判断是否报错
  1091. if (res.indexOf("code") != -1) {
  1092. let json = JSON.parse(res);
  1093. this.$message.error(json.msg);
  1094. } else {
  1095. let objectUrl = URL.createObjectURL(blob);
  1096. let link = document.createElement("a");
  1097. let nowTime = new Date();
  1098. let ymd =
  1099. nowTime.getFullYear() +
  1100. "" +
  1101. (nowTime.getMonth() + 1) +
  1102. "" +
  1103. nowTime.getDate() +
  1104. "" +
  1105. nowTime.getHours() +
  1106. "" +
  1107. nowTime.getMinutes();
  1108. let fname = this.$route.query.id + "-" + ymd + ".xls"; //下载文件的名字
  1109. link.href = objectUrl;
  1110. link.setAttribute("download", fname);
  1111. document.body.appendChild(link);
  1112. link.click();
  1113. }
  1114. });
  1115. load.endLoading();
  1116. })
  1117. .catch((error) => {
  1118. this.$message.error("导出数据失败,请联系管理员");
  1119. load.endLoading();
  1120. });
  1121. })
  1122. .catch(() => {});
  1123. },
  1124. onGoHome() {
  1125. // 确认开团
  1126. // 判断是否有学生缴费
  1127. if (this.paymentNum <= 0) {
  1128. this.$message.error("当前缴费人数为0,无法开团");
  1129. return;
  1130. }
  1131. this.$confirm(`是否确认开团?`, "提示", {
  1132. confirmButtonText: "确定",
  1133. cancelButtonText: "取消",
  1134. type: "warning",
  1135. })
  1136. .then(() => {
  1137. musicGroupFound({
  1138. musicGroupId: this.$route.query.id,
  1139. }).then((res) => {
  1140. if (res.code == 200) {
  1141. // let query = this.$route.query;
  1142. // this.$message.success("开启成功");
  1143. // this.$router.push({
  1144. // path: "/teamList",
  1145. // query: {
  1146. // ...query,
  1147. // },
  1148. // });
  1149. this.onCancel();
  1150. }
  1151. });
  1152. })
  1153. .catch(() => {});
  1154. },
  1155. onClose() {
  1156. // 停止乐团
  1157. this.$confirm("您确定停止乐团吗?", "提示", {
  1158. confirmButtonText: "确定",
  1159. cancelButtonText: "取消",
  1160. type: "warning",
  1161. })
  1162. .then(() => {
  1163. cancelMusicGroup({
  1164. musicGroupId: this.$route.query.id,
  1165. }).then((res) => {
  1166. if (res.code == 200) {
  1167. this.$message.success("停止成功");
  1168. this.$router.push({
  1169. path: "/teamList",
  1170. });
  1171. }
  1172. });
  1173. })
  1174. .catch(() => {});
  1175. },
  1176. handleSelectionChange(val) {
  1177. this.multipleSelection = val;
  1178. },
  1179. // 修改专业
  1180. resetSubject(row) {
  1181. this.activeId = row.studentId;
  1182. this.subjectVisible = true;
  1183. // resetStudentSubject().then(res=>{]})
  1184. },
  1185. // 确认修改
  1186. okReset() {
  1187. if (!this.maskForm.subject) {
  1188. this.$message.error("请选择调剂专业");
  1189. return;
  1190. }
  1191. resetStudentSubject({
  1192. musicGroupId: this.id,
  1193. userId: this.activeId,
  1194. subId: this.maskForm.subject,
  1195. }).then((res) => {
  1196. if (res.code == 200) {
  1197. this.$message.success("修改成功");
  1198. this.subjectVisible = false;
  1199. this.maskForm.subject = "";
  1200. getintoClass({ musicGroupId: this.id }).then((res) => {
  1201. if (res.code == 200) {
  1202. this.leftList = res.data;
  1203. }
  1204. });
  1205. this.getList();
  1206. }
  1207. });
  1208. },
  1209. onExtendPayment(formName, isPay) {
  1210. this.$refs[formName].validate((valid) => {
  1211. if (valid) {
  1212. if (!isPay) {
  1213. extensionApplyExpire({
  1214. musicGroupId: this.id,
  1215. expireDate: this.extendForm.expireDate,
  1216. }).then((res) => {
  1217. if (res.code == 200) {
  1218. this.$message.success("延长报名成功");
  1219. this.extendPaymentStatus = false;
  1220. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  1221. if (res.code == 200) {
  1222. this.applyExpireDate = res.data.musicGroup.applyExpireDate;
  1223. }
  1224. });
  1225. } else {
  1226. this.$message.error(res.msg);
  1227. }
  1228. });
  1229. } else {
  1230. extensionPayment({
  1231. musicGroupId: this.id,
  1232. expireDate: this.extendForm.expireDate,
  1233. }).then((res) => {
  1234. if (res.code == 200) {
  1235. this.$message.success("延长缴费成功");
  1236. this.extendPaymentStatus = false;
  1237. getTeamBaseInfo({ musicGroupId: this.id }).then((res) => {
  1238. if (res.code == 200) {
  1239. this.paymentExpireDate =
  1240. res.data.musicGroup.paymentExpireDate;
  1241. }
  1242. });
  1243. } else {
  1244. this.$message.error(res.msg);
  1245. }
  1246. });
  1247. }
  1248. }
  1249. });
  1250. },
  1251. lookdetail(row) {
  1252. this.orderVisible = true;
  1253. this.activeId = row.studentId;
  1254. this.orderForm.name = row.studentName;
  1255. this.orderForm.subject = row.subjectName;
  1256. getStudentFeeDetail({
  1257. musicGroupId: this.id,
  1258. studentId: row.studentId,
  1259. }).then((res) => {
  1260. if (res.code == 200) {
  1261. if (res.data) {
  1262. this.orderForm.totalAmount = res.data.totalAmount;
  1263. // this.orderForm.subjectFee = res.data.courseFee;
  1264. let goodStr = "";
  1265. let goodPrice = 0;
  1266. let otherStr = "";
  1267. let othersPrice = 0;
  1268. for (let i in res.data.goods) {
  1269. if (res.data.goods[i].goodsType == "INSTRUMENT") {
  1270. goodStr += res.data.goods[i].goodsName + ",";
  1271. goodPrice += parseFloat(res.data.goods[i].musicalFee);
  1272. // this.orderForm.axe = res.data.goods[i].goodsName;
  1273. // this.orderForm.axePrice = res.data.goods[i].musicalFee;
  1274. } else if (res.data.goods[i].goodsType == "ACCESSORIES") {
  1275. otherStr += res.data.goods[i].goodsName + ",";
  1276. othersPrice += parseFloat(res.data.goods[i].musicalFee);
  1277. // this.orderForm.others = res.data.goods[i].goodsName;
  1278. // this.orderForm.othersPrice = res.data.goods[i].musicalFee;
  1279. } else if (res.data.goods[i].goodsType == "COURSE") {
  1280. this.orderForm.subjectFee = res.data.goods[i].musicalFee;
  1281. }
  1282. }
  1283. this.orderForm.others = otherStr.substring(0, otherStr.length - 1);
  1284. this.orderForm.othersPrice = othersPrice;
  1285. this.orderForm.axe = goodStr.substring(0, goodStr.length - 1);
  1286. this.orderForm.axePrice = goodPrice;
  1287. }
  1288. }
  1289. });
  1290. },
  1291. saveIsEdit() {
  1292. // 提交数据
  1293. this.isEdit = false;
  1294. resetPlanNum(this.leftList).then((res) => {});
  1295. },
  1296. quitTeam(row) {
  1297. this.activeRow = row;
  1298. this.quitVisible = true;
  1299. },
  1300. quieTeams(row) {
  1301. this.$prompt("请输入退团原因", "提示", {
  1302. confirmButtonText: "确定",
  1303. cancelButtonText: "取消",
  1304. inputPattern: /\S/,
  1305. inputErrorMessage: "请输入退团原因",
  1306. type: "warning",
  1307. })
  1308. .then((val) => {
  1309. // 发请求 退团
  1310. StudentQuit({
  1311. musicGroupId: this.id,
  1312. userId: row.studentId,
  1313. reason: val.value,
  1314. isRefundCourseFee: false,
  1315. isRefundInstrumentFee: false,
  1316. isRefundTeachingAssistantsFee: false,
  1317. }).then((res) => {
  1318. this.quitForm = {
  1319. // 退团信息确认
  1320. isRefundCourseFee: null,
  1321. isRefundInstrumentFee: null,
  1322. isRefundTeachingAssistantsFee: null,
  1323. reason: "",
  1324. };
  1325. if (res.code == 200) {
  1326. this.$message.success("退团成功");
  1327. this.getList();
  1328. this.quitVisible = false;
  1329. }
  1330. });
  1331. })
  1332. .catch(() => {});
  1333. },
  1334. chioseType() {
  1335. this.$refs["quitForm"].validate((res) => {
  1336. if (res) {
  1337. this.$confirm("确定退团?", "提示", {
  1338. confirmButtonText: "确定",
  1339. cancelButtonText: "取消",
  1340. type: "warning",
  1341. })
  1342. .then(() => {
  1343. let row = this.activeRow;
  1344. // 发请求 退团
  1345. StudentQuit({
  1346. musicGroupId: this.id,
  1347. userId: row.studentId,
  1348. reason: this.quitForm.reason,
  1349. isRefundCourseFee: this.quitForm.isRefundCourseFee,
  1350. isRefundInstrumentFee: this.quitForm.isRefundInstrumentFee,
  1351. isRefundTeachingAssistantsFee: this.quitForm
  1352. .isRefundTeachingAssistantsFee,
  1353. }).then((res) => {
  1354. this.quitForm = {
  1355. // 退团信息确认
  1356. isRefundCourseFee: null,
  1357. isRefundInstrumentFee: null,
  1358. isRefundTeachingAssistantsFee: null,
  1359. reason: "",
  1360. };
  1361. if (res.code == 200) {
  1362. this.$message.success("退团成功");
  1363. this.getList();
  1364. this.quitVisible = false;
  1365. }
  1366. });
  1367. })
  1368. .catch(() => {});
  1369. } else {
  1370. }
  1371. });
  1372. // row.typeVisible = false;
  1373. },
  1374. addVisit(row) {
  1375. // this.visitForm.studentName = row.studentName;
  1376. // this.visitForm.musicGroupId = this.teamid;
  1377. // this.visitForm.studentId = row.studentId;
  1378. row.userId = row.studentId;
  1379. this.detail = row;
  1380. this.detail.musicGroupId = this.$route.query.id;
  1381. this.visitVisiable = true;
  1382. },
  1383. openChangeVoice(row) {
  1384. this.getList().then((res) => {
  1385. for (const item of res.data.rows) {
  1386. if (item.id === row.id) {
  1387. this.rowDetail = { ...item };
  1388. this.changeVoiceVisible = true;
  1389. }
  1390. }
  1391. });
  1392. },
  1393. closeChangeVoice() {
  1394. this.changeVoiceVisible = false;
  1395. // this.rowDetail = null
  1396. },
  1397. handleChange(val) {
  1398. this.visitForm.type = val[0];
  1399. this.visitForm.purpose = val[1];
  1400. },
  1401. submitAddVisit() {
  1402. this.$refs.visitForm.validate((res) => {
  1403. if (res) {
  1404. this.visitForm.visitType = null;
  1405. this.visitForm.musicGroupId = this.id;
  1406. addVisit(cleanDeep(this.visitForm)).then((res) => {
  1407. if (res.code === 200) {
  1408. this.$message.success("新增成功");
  1409. this.visitVisiable = false;
  1410. }
  1411. });
  1412. }
  1413. });
  1414. },
  1415. beginDate(date) {
  1416. let self = this;
  1417. return {
  1418. firstDayOfWeek: 1,
  1419. disabledDate(time) {
  1420. return time.getTime() >= date.getTime(); //开始时间不选时,结束时间最大值小于等于当天
  1421. },
  1422. };
  1423. },
  1424. extendTime(isPay) {
  1425. this.isPay = isPay;
  1426. if (isPay) {
  1427. // 点击的延长缴费
  1428. this.extendForm.expireDate = this.paymentExpireDate;
  1429. } else {
  1430. // 点击的延长报名
  1431. this.extendForm.expireDate = this.applyExpireDate;
  1432. }
  1433. this.extendPaymentStatus = true;
  1434. },
  1435. applyDate() {
  1436. let self = this;
  1437. return {
  1438. firstDayOfWeek: 1,
  1439. disabledDate(time) {
  1440. if (self.paymentExpireDate) {
  1441. return (
  1442. time.getTime() >
  1443. new Date(self.paymentExpireDate.replace(/-/g, "/")).getTime()
  1444. );
  1445. } else {
  1446. return false;
  1447. }
  1448. },
  1449. };
  1450. },
  1451. payDate() {
  1452. let self = this;
  1453. return {
  1454. firstDayOfWeek: 1,
  1455. disabledDate(time) {
  1456. if (self.applyExpireDate) {
  1457. return (
  1458. time.getTime() <=
  1459. new Date(self.applyExpireDate.replace(/-/g, "/")).getTime()
  1460. );
  1461. } else {
  1462. return false;
  1463. }
  1464. },
  1465. };
  1466. },
  1467. checkboxSelect(row) {
  1468. return row.paymentStatus == 0;
  1469. },
  1470. },
  1471. watch: {
  1472. orderVisible(val) {
  1473. if (!val) {
  1474. this.orderForm = {
  1475. name: "",
  1476. totalAmount: "",
  1477. subject: "",
  1478. subjectFee: "",
  1479. axe: "",
  1480. axePrice: "",
  1481. others: "",
  1482. othersPrice: "",
  1483. };
  1484. }
  1485. },
  1486. qrcodeStatus(val) {
  1487. if (!val) {
  1488. this.qrcode.clear();
  1489. }
  1490. },
  1491. qrcodeStatus2(val) {
  1492. if (!val) {
  1493. this.qrcode2.clear();
  1494. }
  1495. },
  1496. paymentStatus(val) {
  1497. if (!val) {
  1498. this.paymentForm = {
  1499. paymentExpireDate: null,
  1500. // feeType: null
  1501. };
  1502. }
  1503. },
  1504. quitVisible(val) {
  1505. if (!val) {
  1506. this.quitForm = {
  1507. // 退团信息确认
  1508. isRefundCourseFee: null,
  1509. isRefundInstrumentFee: null,
  1510. isRefundTeachingAssistantsFee: null,
  1511. reason: "",
  1512. };
  1513. this.$refs["quitForm"].resetFields();
  1514. }
  1515. },
  1516. // visitVisiable(val) {
  1517. // if (!val) {
  1518. // this.$refs["visitForm"].resetFields();
  1519. // }
  1520. // },
  1521. },
  1522. };
  1523. </script>
  1524. <style lang="scss" scoped>
  1525. .auth {
  1526. display: inline-block;
  1527. & + .auth {
  1528. margin-left: 0px;
  1529. }
  1530. }
  1531. .dialog-footer.question {
  1532. display: flex;
  1533. flex-direction: row;
  1534. justify-content: space-between;
  1535. }
  1536. .sigup-container {
  1537. margin-left: 12px;
  1538. .topWrap {
  1539. padding: 18px 58px 18px 0;
  1540. // height: 136px;
  1541. background-color: #fff;
  1542. // display: flex;
  1543. // flex-direction: row;
  1544. // justify-content: space-between;
  1545. .msg.pay {
  1546. color: #f85043;
  1547. }
  1548. .msg {
  1549. text-align: right;
  1550. color: #f97215;
  1551. font-size: 32px;
  1552. font-weight: bold;
  1553. padding-top: 30px;
  1554. box-sizing: border-box;
  1555. img {
  1556. width: 36px;
  1557. height: 36px;
  1558. position: relative;
  1559. top: 5px;
  1560. margin-right: 8px;
  1561. }
  1562. }
  1563. h2 {
  1564. height: 48px;
  1565. line-height: 48px;
  1566. position: relative;
  1567. // padding-left: 30px;
  1568. font-size: 32px;
  1569. font-weight: 600;
  1570. margin-bottom: 10px;
  1571. display: flex;
  1572. flex-direction: row;
  1573. justify-content: flex-start;
  1574. align-items: center;
  1575. .term {
  1576. height: 32px;
  1577. line-height: 32px;
  1578. border-radius: 24px;
  1579. width: 100px;
  1580. color: #14928a;
  1581. border: 1px solid rgba(20, 146, 138, 1);
  1582. font-size: 14px;
  1583. text-align: center;
  1584. margin-right: 12px;
  1585. &:nth-child(1) {
  1586. margin-left: 47px;
  1587. }
  1588. }
  1589. .term.active {
  1590. color: #fff;
  1591. background-color: #14928a;
  1592. }
  1593. .squrt {
  1594. position: absolute;
  1595. left: -25px;
  1596. top: 8px;
  1597. height: 34px;
  1598. width: 8px;
  1599. background-color: #14928a;
  1600. }
  1601. }
  1602. .btnList {
  1603. display: flex;
  1604. flex-direction: row;
  1605. justify-content: flex-start;
  1606. align-items: center;
  1607. flex-wrap: wrap;
  1608. & > div {
  1609. margin-right: 15px;
  1610. margin-bottom: 10px;
  1611. }
  1612. }
  1613. .newBand.close {
  1614. background-color: #777;
  1615. border: 1px solid #777;
  1616. }
  1617. }
  1618. .searchList {
  1619. background-color: #fff;
  1620. padding: 0 58p 0 0px;
  1621. }
  1622. .sigup-core {
  1623. margin-top: 12px;
  1624. display: flex;
  1625. flex-direction: row;
  1626. justify-content: flex-start;
  1627. .left {
  1628. width: 340px;
  1629. background-color: #fff;
  1630. height: 80vh;
  1631. overflow: auto;
  1632. }
  1633. .right {
  1634. width: calc(100% - 340px);
  1635. margin-left: 12px;
  1636. flex-grow: 1;
  1637. }
  1638. }
  1639. }
  1640. .el-dialog__body {
  1641. overflow: hidden;
  1642. }
  1643. .left-code,
  1644. .right-code {
  1645. // width: 50%;
  1646. // float: left;
  1647. h2 {
  1648. font-size: 18px;
  1649. text-align: center;
  1650. padding-bottom: 8px;
  1651. }
  1652. .qrcode {
  1653. display: flex;
  1654. flex-direction: column;
  1655. align-items: center;
  1656. img {
  1657. width: 200px;
  1658. height: 200px;
  1659. margin: 0 auto;
  1660. }
  1661. }
  1662. .code-url {
  1663. font-size: 18px;
  1664. text-align: center;
  1665. padding: 15px 15px 0 15px;
  1666. }
  1667. }
  1668. .newBand {
  1669. margin-bottom: 0;
  1670. max-width: inherit;
  1671. }
  1672. /deep/.el-button--danger {
  1673. background: #f85043;
  1674. }
  1675. .paymentForm {
  1676. /deep/.el-input__inner,
  1677. /deep/.el-input.el-input--suffix {
  1678. width: 360px !important;
  1679. }
  1680. }
  1681. .popoverWrap {
  1682. p {
  1683. line-height: 25px;
  1684. }
  1685. }
  1686. </style>