signupList.vue 52 KB

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