signupList.vue 48 KB

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