signupList.vue 53 KB

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