signupList.vue 52 KB

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