signupList.vue 48 KB

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