signupList.vue 52 KB

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