subject-preview.vue 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560
  1. <template>
  2. <div style="background: #f3f4f8">
  3. <h2 class="title">注册说明</h2>
  4. <div class="noticeInfo">
  5. 1、您注册时所选择的乐团声部,即为乐团录取最终确认的声部,请您务必仔细填写;<br />
  6. 2、为避免因部分已注册家长放弃名额导致乐团声部失衡,系统设定各声部限额放大20%比例开放注册,系统自动按照完全完成注册的先后顺序确认录取名单,因此,超员后有可能出现无法注册的情况,请您理解。如果其他声部仍有名额,在您孩子的身体条件适合该乐器的前提下,我们将优先予以调配。
  7. </div>
  8. <template v-if="courseViewType == 2">
  9. <h2 class="title">学习工具包</h2>
  10. <div class="yunTrain">
  11. <img :src="trainBg" />
  12. <div class="toolText">
  13. <p class="toolTitle">
  14. 乐器练习云教练
  15. <i class="icon_video" @click="videoStatus = true"></i>
  16. </p>
  17. <p class="toolDate">有效期说明:自开课之日起6个月内有效</p>
  18. </div>
  19. </div>
  20. </template>
  21. <template v-if="courseViewType == 1 && courseShowInfo.length > 0">
  22. <div class="yunTrain" style="margin-top: 12px">
  23. <img :src="trainBg" />
  24. <div class="toolText">
  25. <p class="toolTitle">服务</p>
  26. <p class="toolDate" v-if="serviceValidDate">
  27. 服务有效期:{{ serviceValidDate }}
  28. </p>
  29. </div>
  30. </div>
  31. </template>
  32. <h2 class="titles" style="margin-top: 12px" v-if="courseViewType == 0">
  33. <img :src="trainSmallBg" />
  34. <span>乐团课程</span>
  35. </h2>
  36. <template class="section">
  37. <!-- 所有不可选的课程合集 -->
  38. <div class="section" v-if="courseShowStatus && courseViewType == 1">
  39. <el-row
  40. class="option-row"
  41. v-for="(item, index) in courseShowInfo"
  42. :class="[!item.isStudentOptional ? 'disabled' : '']"
  43. :key="index"
  44. @click.native="onCourseChange(item)"
  45. >
  46. <el-col :span="16">
  47. <i
  48. class="check_default"
  49. :class="[item.isStatus ? 'check_active' : '']"
  50. ></i>
  51. <span style="display: flex; align-items: center">
  52. <template v-if="item.courseType == 'PROJECT'"
  53. >{{ chargeTypeName }} </template
  54. ><template v-else>{{ item.courseType | coursesType }}</template>
  55. </span>
  56. <el-icon
  57. v-if="item.courseType == 'PROJECT'"
  58. class="el-icon-question"
  59. @click.native="onQuestions('amr')"
  60. />
  61. </el-col>
  62. <el-col :span="8">
  63. <span style="color: #1a1a1a"
  64. >¥{{ item.courseCurrentPrice | moneyFormat }}</span
  65. >
  66. </el-col>
  67. </el-row>
  68. </div>
  69. <div class="section" v-if="courseViewType == 2">
  70. <div v-for="(item, index) in toolsPackage" :key="index">
  71. <el-row
  72. class="option-row"
  73. style="padding-top: 0"
  74. @click.native="onTrainChange(item)"
  75. >
  76. <el-col :span="18">
  77. <i
  78. class="check_default"
  79. :class="[item.isStatus ? 'check_active' : '']"
  80. ></i>
  81. <span style="display: flex; align-items: center">
  82. <template>{{ item.name }}</template>
  83. </span>
  84. </el-col>
  85. <el-col :span="6">
  86. <span style="color: #1a1a1a" v-if="courseViewType == 2"
  87. >¥{{ cloudTeacherFee | moneyFormat }}</span
  88. >
  89. </el-col>
  90. </el-row>
  91. <el-row
  92. style="padding-left: 0.24rem"
  93. v-if="item.childGoodsList && courseViewType == 2"
  94. >
  95. <el-col
  96. v-for="(child, index) in item.childGoodsList"
  97. :key="child.name"
  98. >
  99. <span style="font-size: 12px; color: #808080"
  100. >{{ child.name }}
  101. {{ item.childGoodsList.length - 1 == index ? "" : "、" }}</span
  102. >
  103. </el-col>
  104. </el-row>
  105. </div>
  106. </div>
  107. <!-- 可选课程信息集合 -->
  108. <div class="section" v-if="courseViewType == 0">
  109. <el-row class="title-row" v-if="courseViewType == 0">
  110. <el-col :span="12">课程类型</el-col>
  111. <!-- <el-col :span="5" :offset="1" style="text-align: right;">原价</el-col> -->
  112. <el-col :span="11" :offset="1" style="text-align: right">现价</el-col>
  113. </el-row>
  114. <el-row
  115. class="option-row"
  116. v-for="(item, index) in courseInfo"
  117. :key="index"
  118. @click.native="onCourseChange(item)"
  119. >
  120. <el-col :span="12">
  121. <i
  122. class="check_default"
  123. :class="[
  124. item.isStatus ? 'check_active' : '',
  125. !item.isStudentOptional ? 'disabled' : '',
  126. ]"
  127. ></i
  128. ><template v-if="item.courseType == 'PROJECT'">{{
  129. item.name
  130. }}</template
  131. ><template v-else>{{ item.courseType | coursesType }}</template>
  132. </el-col>
  133. <!-- <el-col :span="6">
  134. <del style="color: #AAA; font-size: 12px;">¥{{ item.courseOriginalPrice | moneyFormat }}</del>
  135. </el-col> -->
  136. <el-col :span="11" :offset="1">
  137. <span style="color: #1a1a1a"
  138. >¥{{ item.courseCurrentPrice | moneyFormat }}</span
  139. >
  140. </el-col>
  141. </el-row>
  142. </div>
  143. </template>
  144. <div
  145. class="section"
  146. v-if="
  147. courseInfo &&
  148. courseInfo.length > 0 &&
  149. isClickStatus &&
  150. courseViewType == 1
  151. "
  152. >
  153. <h2 class="title">{{ "乐团课程" }}</h2>
  154. <el-row class="title-row">
  155. <el-col :span="12">课程类型</el-col>
  156. <!-- <el-col :span="5" :offset="1" style="text-align: right;">原价</el-col> -->
  157. <el-col :span="11" :offset="1" style="text-align: right">现价</el-col>
  158. </el-row>
  159. <!-- 可选课程信息集合 -->
  160. <template v-for="(item, index) in courseInfo">
  161. <el-row
  162. class="option-row"
  163. :key="index"
  164. @click.native="onCourseChange(item)"
  165. v-if="item.isStudentOptional"
  166. >
  167. <el-col :span="12">
  168. <i
  169. class="check_default"
  170. :class="[
  171. item.isStatus ? 'check_active' : '',
  172. !item.isStudentOptional ? 'disabled' : '',
  173. ]"
  174. ></i
  175. ><template v-if="item.courseType == 'PROJECT'">{{
  176. item.name
  177. }}</template
  178. ><template v-else>{{ item.courseType | coursesType }}</template>
  179. </el-col>
  180. <!-- <el-col :span="6">
  181. <del style="color: #AAA; font-size: .12rem;">¥{{ item.courseOriginalPrice | moneyFormat }}</del>
  182. </el-col> -->
  183. <el-col :span="11" :offset="1">
  184. <span style="color: #1a1a1a"
  185. >¥{{ item.courseCurrentPrice | moneyFormat }}</span
  186. >
  187. </el-col>
  188. </el-row>
  189. </template>
  190. </div>
  191. <h2
  192. class="titles"
  193. v-if="instrumentResultList && instrumentResultList.length > 0"
  194. >
  195. <img :src="trainSmallBg" />
  196. <span>乐器</span>
  197. </h2>
  198. <div
  199. class="section"
  200. v-if="instrumentResultList && instrumentResult.length > 0"
  201. >
  202. <div v-for="(i, index) in instrumentResultList" :key="index">
  203. <template v-if="leBaoStatus && i[0].kitType == 'owned'">
  204. <!-- <el-row class="title-row">
  205. <el-col :span="12" :offset="1">服务项目</el-col>
  206. <el-col :span="11" style="text-align: right;">现价</el-col>
  207. </el-row> -->
  208. <el-row
  209. class="option-row"
  210. style="
  211. padding-bottom: 10px;
  212. margin-top: 8px;
  213. border-top: 1px solid #f0f0f0;
  214. "
  215. @click.native="onLeBao"
  216. >
  217. <el-col :span="12">
  218. <i
  219. class="check_default"
  220. :class="[buyMaintenance ? 'check_active' : '']"
  221. ></i
  222. >乐器保养(一年)<el-icon
  223. style="padding-left: 0"
  224. name="question"
  225. @click.stop.native="onQuestions('instrument')"
  226. />
  227. </el-col>
  228. <!-- <el-col :span="6">
  229. <del style="color: #AAA; font-size: .12rem;">¥{{ 500 | moneyFormat }}</del>
  230. </el-col> -->
  231. <el-col :span="11" :offset="1">
  232. <span style="color: #1a1a1a">¥{{ 300 | moneyFormat }}</span>
  233. </el-col>
  234. </el-row>
  235. </template>
  236. <el-row class="title-row">
  237. <el-col :span="12">
  238. <template v-if="i[0]['kitType'] == 'GROUP'">
  239. 团购乐器{{ courseViewType == 2 ? "(赠送辅件一套)" : null }}
  240. </template>
  241. <template v-if="i[0]['kitType'] == 'LEASE'">
  242. 乐器租赁{{ courseViewType == 2 ? "(请自行购买辅件)" : null }}
  243. </template>
  244. <template v-if="i[0]['kitType'] == 'FREE'">
  245. 免费乐器{{ courseViewType == 2 ? "(请自行购买辅件)" : null }}
  246. </template>
  247. <template v-if="i[0]['kitType'] == 'owned'">
  248. 自备乐器{{ courseViewType == 2 ? "(请自行购买辅件)" : null }}
  249. </template>
  250. </el-col>
  251. <el-col :span="5" :offset="1" style="text-align: right">
  252. <template
  253. v-if="['GROUP', 'LEASE', 'FREE'].includes(i[0]['kitType'])"
  254. >原价</template
  255. >
  256. </el-col>
  257. <el-col :span="5" :offset="1" style="text-align: right">
  258. <template v-if="['GROUP', 'FREE'].includes(i[0]['kitType'])"
  259. >现价</template
  260. >
  261. <template v-if="i[0]['kitType'] == 'LEASE'">租赁押金</template>
  262. </el-col>
  263. </el-row>
  264. <div v-for="(con, index) in i" :key="index" @click="instrumentF(con)">
  265. <el-row class="option-row" v-if="courseViewType == 2 && organId == 50 && !toolsPackage[0].isStatus">
  266. <el-col :span="12">
  267. <i
  268. class="check_default"
  269. :class="[con.checked ? 'check_active' : '']"
  270. ></i>
  271. <div>
  272. {{ con.name }}
  273. <div
  274. v-if="con.goodsList"
  275. style="font-size: 12px; color: #808080"
  276. >
  277. {{ con.goodsList[0].specification }}
  278. </div>
  279. </div>
  280. </el-col>
  281. <el-col :span="6">
  282. <del
  283. style="color: #808080; font-size: 12px"
  284. v-if="con.kitType != 'owned'"
  285. >¥{{ con.marketPrice | moneyFormat }}</del
  286. >
  287. </el-col>
  288. <el-col :span="6">
  289. <span style="color: #1a1a1a" v-if="con.kitType == 'LEASE'"
  290. >¥{{
  291. Number((con.depositFee - con.coupon).toFixed(2)) | moneyFormat
  292. }}</span
  293. >
  294. <span style="color: #1a1a1a" v-if="con.kitType == 'FREE'"
  295. >¥{{ 0 | moneyFormat }}</span
  296. >
  297. <span style="color: #1a1a1a" v-if="con.kitType == 'GROUP'"
  298. >¥{{
  299. Number((con.marketPrice - con.coupon).toFixed(2)) | moneyFormat
  300. }}</span
  301. >
  302. </el-col>
  303. </el-row>
  304. <el-row class="option-row" v-else>
  305. <el-col :span="12">
  306. <i
  307. class="check_default"
  308. :class="[con.checked ? 'check_active' : '']"
  309. ></i>
  310. <div>
  311. {{ con.name }}
  312. <div
  313. v-if="con.goodsList"
  314. style="font-size: 12px; color: #808080"
  315. >
  316. {{ con.goodsList[0].specification }}
  317. </div>
  318. </div>
  319. </el-col>
  320. <el-col :span="6">
  321. <del
  322. style="color: #808080; font-size: 12px"
  323. v-if="con.kitType != 'owned'"
  324. >¥{{ con.marketPrice | moneyFormat }}</del
  325. >
  326. </el-col>
  327. <el-col :span="6">
  328. <span style="color: #1a1a1a" v-if="con.kitType == 'LEASE'"
  329. >¥{{
  330. Number((con.depositFee - con.coupon).toFixed(2)) | moneyFormat
  331. }}</span
  332. >
  333. <span style="color: #1a1a1a" v-if="con.kitType == 'FREE'"
  334. >¥{{ 0 | moneyFormat }}</span
  335. >
  336. <span style="color: #1a1a1a" v-if="con.kitType == 'GROUP'"
  337. >¥{{
  338. Number((con.price - con.coupon).toFixed(2)) | moneyFormat
  339. }}</span
  340. >
  341. </el-col>
  342. </el-row>
  343. <el-row
  344. style="
  345. padding: 8px 0px 8px 24px;
  346. border-top: 1px solid rgb(240, 240, 240);
  347. "
  348. v-if="con.childGoodsList && con.kitType == 'GROUP'"
  349. >
  350. <el-col
  351. :span="24"
  352. style="font-size: 14px; color: #1a1a1a; padding-bottom: 3px"
  353. >赠送辅件</el-col
  354. >
  355. <el-col>
  356. <span style="font-size: 12px; color: #808080">
  357. {{ con.childGoodsNames }}
  358. </span>
  359. </el-col>
  360. </el-row>
  361. </div>
  362. </div>
  363. </div>
  364. <h2 class="titles" v-if="accessOries.length > 0 && accessIsShowStatus">
  365. <img :src="trainSmallBg" />
  366. <span>辅件</span>
  367. </h2>
  368. <div
  369. class="section"
  370. v-if="accessOries.length > 0 && accessIsShowStatus"
  371. key="accessOries"
  372. >
  373. <el-row class="title-row">
  374. <el-col :span="12">服务项目</el-col>
  375. <el-col :span="5" :offset="1" style="text-align: right">原价</el-col>
  376. <el-col :span="5" :offset="1" style="text-align: right">现价</el-col>
  377. </el-row>
  378. <div v-for="(instr, index) in accessOries" :key="index">
  379. <el-row class="option-row" @click.native="onAuxiliarie(instr)">
  380. <el-col :span="12">
  381. <i
  382. class="check_default"
  383. :class="[instr.checked ? 'check_active' : '']"
  384. ></i
  385. >{{ instr.name }}
  386. </el-col>
  387. <el-col :span="6">
  388. <del style="color: #808080; font-size: 12px"
  389. >¥{{
  390. instr.goodsList[0]
  391. ? instr.goodsList[0].marketPrice
  392. : 0 | moneyFormat
  393. }}</del
  394. >
  395. </el-col>
  396. <el-col :span="6">
  397. <span style="color: #1a1a1a" v-if="instr.price == 0">免费</span>
  398. <span style="color: #1a1a1a" v-else
  399. >¥{{ instr.price | moneyFormat }}</span
  400. >
  401. </el-col>
  402. </el-row>
  403. <el-row style="padding-left: 24px" v-if="instr.childGoodsList">
  404. <el-col>
  405. <span
  406. v-for="(child, index) in instr.childGoodsList"
  407. :key="child.id"
  408. style="font-size: 12px; color: #808080"
  409. >{{ child.name }}
  410. {{ instr.childGoodsList.length - 1 == index ? "" : "," }}</span
  411. >
  412. </el-col>
  413. </el-row>
  414. </div>
  415. </div>
  416. <div class="buy">
  417. <div class="price">
  418. <p class="oldprice">
  419. <del class="text">原价</del>
  420. <del style="font-size: 13px"
  421. >¥{{ orderInfo.marketPrice | moneyFormat }}</del
  422. >
  423. </p>
  424. <p class="now_price">
  425. <span class="text">仅需支付</span>
  426. <span style="font-weight: bold">¥{{ needPrice | moneyFormat }}</span>
  427. </p>
  428. </div>
  429. <a class="btn-submit">购买</a>
  430. </div>
  431. <el-dialog
  432. title="视屏"
  433. :visible.sync="videoStatus"
  434. :modal-append-to-body="false"
  435. :append-to-body="true"
  436. class="videoDialog"
  437. width="30%"
  438. >
  439. <video
  440. style="width: 100%"
  441. v-if="videoStatus"
  442. controls="controls"
  443. class="ql-video"
  444. :src="'https://daya.ks3-cn-beijing.ksyun.com/202105/SWmqmvW.mp4'"
  445. :poster="require('../../../assets/images/musicGroup/video_bg.png')"
  446. />
  447. </el-dialog>
  448. </div>
  449. </template>
  450. <script>
  451. import { permission } from "@/utils/directivePage";
  452. import { getSubjectGoodsAndInfoPreview, getType } from "@/api/buildTeam";
  453. import dayjs from "dayjs";
  454. const paymentPatternType = {
  455. 0: "按月",
  456. 1: "按学期",
  457. 2: "一次性",
  458. };
  459. export default {
  460. props: ["subjectId", "calenderId"],
  461. data() {
  462. const query = this.$route.query;
  463. return {
  464. videoStatus: false,
  465. trainBg: require("../../../assets/images/musicGroup/yunTrain_bg.png"),
  466. trainSmallBg: require("../../../assets/images/musicGroup/yunTrain_small_bg.png"),
  467. musicGroupId: query.id,
  468. organId: null,
  469. result: {}, // 返回结果
  470. instrument: {}, // 乐器类型
  471. baseInfo: {}, // 其它类
  472. money: 580,
  473. balance: 0, // 余额
  474. needPrice: 0, // 还需支付
  475. payType: false, // 是否余额支付
  476. cloudTeacherFee: 0, // 云教练费用
  477. cloudTeacherPlusFee: 0, // 云教练+
  478. orderInfo: {
  479. marketPrice: 0,
  480. amount: 0, // 现价总金额
  481. groupPurchasePrice: 0, // 现价
  482. goodsGroupIds: null,
  483. goodsIds: null,
  484. contractGoodsIds: null, // 选中所有商品ID
  485. couponPrice: 0, //
  486. musicClassFee: 0, // 课程现价
  487. musicMarketClassFee: 0, // 课程原价
  488. accessPrice: 0, // 辅件现价
  489. accessMarketPrice: 0, // 辅件原价
  490. goodsPrice: 0, // 乐器现价
  491. goodsMarketPrice: 0, // 乐器原价
  492. }, // 金额列表,金额计算
  493. toolsPackage: [
  494. {
  495. isStatus: true,
  496. name: "练习系统(六个月)",
  497. childGoodsList: [{ name: "" }],
  498. },
  499. ], // 学习工具包
  500. courseInfo: [], // 课程信息
  501. courseShowInfo: [], // 课程信息显示用
  502. musicGroupSubject: null, // 基本信息
  503. instrumentResult: [], //乐器
  504. accessOries: [], // 辅件(打包)
  505. agreeStatus: true,
  506. authStatus: false,
  507. buyList: [], // 信息列表
  508. ids: [],
  509. instrumentResultList: [],
  510. chargeTypeId: null,
  511. paymentStatus: null,
  512. paymentPattern: null,
  513. serviceValidDate: null, // 服务时间
  514. courseShowStatus: false,
  515. chargeTypeList: [],
  516. chargeTypeName: null,
  517. courseViewType: 0, // 收费模式,0 课程显示,1 AMR系统 2会员
  518. leBaoStatus: false,
  519. buyMaintenance: false, // 是否开启乐保
  520. isClickStatus: false,
  521. accessStatus: false, // 是否有辅件乐保
  522. accessIsShowStatus: false, // 是否显示辅件 true 显示, false 不显示
  523. };
  524. },
  525. mounted() {
  526. this.__init();
  527. },
  528. methods: {
  529. async __init() {
  530. // 获取数据
  531. let params = {
  532. musicGroupId: this.musicGroupId,
  533. subjectId: this.subjectId,
  534. calenderId: this.calenderId,
  535. };
  536. await getType().then((res) => {
  537. let result = res.data;
  538. if (res.code == 200) {
  539. this.chargeTypeList = result.rows || [];
  540. }
  541. });
  542. await getSubjectGoodsAndInfoPreview(params).then((res) => {
  543. let result = res;
  544. if (result.code == 200) {
  545. let tempResult = result.data;
  546. this.courseViewType = tempResult.musicGroup.courseViewType || 0;
  547. this.organId = tempResult.musicGroup.organId;
  548. this.cloudTeacherFee = tempResult.cloudTeacherFee || 0;
  549. this.cloudTeacherPlusFee = tempResult.cloudTeacherPlusFee || 0;
  550. this.paymentPattern = 2;
  551. if (tempResult.musicGroupPaymentCalender) {
  552. this.paymentPattern =
  553. tempResult.musicGroupPaymentCalender.paymentPattern;
  554. this.serviceValidDate =
  555. dayjs(
  556. tempResult.musicGroupPaymentCalender.paymentValidStartDate
  557. ).format("YYYY/MM/DD") +
  558. "~" +
  559. dayjs(
  560. tempResult.musicGroupPaymentCalender.paymentValidEndDate
  561. ).format("YYYY/MM/DD");
  562. }
  563. let tempInfo = tempResult.musicGroupPaymentCalender
  564. ? tempResult.musicGroupPaymentCalender
  565. .musicGroupPaymentCalenderCourseSettingsList
  566. : null;
  567. let memberPrivilegesItemList = tempResult.memberPrivilegesItemList
  568. ? tempResult.memberPrivilegesItemList
  569. : [];
  570. let tempMember = [];
  571. memberPrivilegesItemList.forEach((member) => {
  572. if (
  573. member.memberPrivilegesItems &&
  574. member.memberPrivilegesItems.length > 0
  575. ) {
  576. member.memberPrivilegesItems.forEach((item) => {
  577. tempMember.push(item.name);
  578. });
  579. }
  580. });
  581. this.toolsPackage = [
  582. {
  583. isStatus: true,
  584. name: "练习系统(六个月)",
  585. childGoodsList: [{ name: tempMember.join("、") }],
  586. },
  587. ];
  588. // 判断是否有课程
  589. if (tempInfo && tempInfo.length > 0) {
  590. let tempCourse = {
  591. courseCurrentPrice: 0,
  592. courseOriginalPrice: 0,
  593. courseType: null,
  594. name: "器乐练习系统",
  595. };
  596. tempInfo.forEach((info) => {
  597. if (!info.isStudentOptional) {
  598. this.courseShowStatus = true;
  599. tempCourse = {
  600. courseCurrentPrice:
  601. info.courseCurrentPrice + tempCourse.courseCurrentPrice,
  602. courseOriginalPrice:
  603. info.courseCurrentPrice + tempCourse.courseCurrentPrice,
  604. courseType: "PROJECT",
  605. isStatus: true,
  606. name: "器乐练习系统",
  607. };
  608. }
  609. });
  610. this.courseShowInfo = [tempCourse];
  611. // 默认课程都选中
  612. this.courseInfo = tempInfo;
  613. } else {
  614. // 判断是否有课程,如果没有课程则默认显示0
  615. this.courseInfo = [
  616. {
  617. id: -1,
  618. courseCurrentPrice: 0,
  619. courseOriginalPrice: 0,
  620. isStudentOptional: false,
  621. courseType: "MUSIC",
  622. },
  623. ];
  624. }
  625. this.isClickStatus = false;
  626. this.courseInfo.forEach((item) => {
  627. if (item.isStudentOptional) {
  628. item.isStatus = false;
  629. this.isClickStatus = true;
  630. } else {
  631. item.isStatus = true;
  632. }
  633. });
  634. // console.log(this.isClickStatus)
  635. this.musicGroupSubject = tempResult.musicGroupSubjectPlan;
  636. let instrumentInfo = {};
  637. let tempInstrument = [];
  638. tempResult.musicGroupSubjectGoodsGroupList.forEach((item) => {
  639. if (item.type == "INSTRUMENT") {
  640. // 获取乐器所有提供方式
  641. let KGPTJ = item.kitGroupPurchaseTypeJson
  642. ? JSON.parse(item.kitGroupPurchaseTypeJson)
  643. : {};
  644. for (let single in KGPTJ) {
  645. let tempItem = Object.assign({}, item); // 深拷贝
  646. tempItem.marketPrice = tempItem.goodsList[0].marketPrice;
  647. tempItem.kitType = single; // 优惠模式
  648. tempItem.coupon = KGPTJ[single]; // 优惠金额
  649. if (instrumentInfo.id) {
  650. tempItem.checked = false;
  651. if (single == "GROUP") {
  652. // 团购
  653. if (
  654. (instrumentInfo.kitType == "GROUP" &&
  655. instrumentInfo.price < tempItem.price) ||
  656. instrumentInfo.kitType == "LEASE" ||
  657. instrumentInfo.kitType == "FREE"
  658. ) {
  659. this.instrumentResult.forEach((instrRes) => {
  660. instrRes.checked = false;
  661. });
  662. tempItem.checked = true;
  663. instrumentInfo = {
  664. id: tempItem.id,
  665. price: tempItem.price,
  666. kitType: single,
  667. };
  668. }
  669. } else if (single == "LEASE") {
  670. // 租赁
  671. if (
  672. instrumentInfo.kitType == "LEASE" &&
  673. instrumentInfo.price < tempItem.price
  674. ) {
  675. this.instrumentResult.forEach((instrRes) => {
  676. instrRes.checked = false;
  677. });
  678. tempItem.checked = true;
  679. instrumentInfo = {
  680. id: tempItem.id,
  681. price: tempItem.price,
  682. kitType: single,
  683. };
  684. }
  685. } else if (single == "FREE") {
  686. // 免费
  687. if (
  688. instrumentInfo.kitType == "FREE" &&
  689. instrumentInfo.price < tempItem.price
  690. ) {
  691. this.instrumentResult.forEach((instrRes) => {
  692. instrRes.checked = false;
  693. });
  694. tempItem.checked = true;
  695. instrumentInfo = {
  696. id: tempItem.id,
  697. price: tempItem.price,
  698. kitType: single,
  699. };
  700. }
  701. }
  702. } else {
  703. tempItem.checked = true;
  704. instrumentInfo = {
  705. id: tempItem.id,
  706. price: tempItem.price,
  707. kitType: single,
  708. };
  709. }
  710. let childGoodsNameList = [];
  711. if (
  712. tempItem.childGoodsList &&
  713. tempItem.childGoodsList.length > 0
  714. ) {
  715. tempItem.childGoodsList.forEach((child) => {
  716. if (child.type != "INSTRUMENT" && child.type != "OTHER") {
  717. childGoodsNameList.push(child.name);
  718. }
  719. });
  720. tempItem.childGoodsNames = childGoodsNameList.join("、");
  721. }
  722. this.instrumentResult.push(tempItem);
  723. tempInstrument.push(tempItem);
  724. }
  725. } else if (item.type == "ACCESSORIES") {
  726. item.checked = true;
  727. this.accessOries.push(item);
  728. }
  729. });
  730. // 添加自备选项
  731. if (this.instrumentResult.length > 0) {
  732. // this.instrumentResult.push({
  733. // id: -1,
  734. // kitType: 'owned',
  735. // name: '自备',
  736. // price: 0,
  737. // marketPrice: 0,
  738. // checked: false
  739. // })
  740. let owned = {
  741. id: -1,
  742. kitType: "owned",
  743. name: "自备乐器",
  744. price: 0,
  745. marketPrice: 0,
  746. checked: false,
  747. };
  748. tempInstrument.push(owned);
  749. this.instrumentResult.push(owned);
  750. let sorted = this.groupBy(tempInstrument, (item) => {
  751. return [item.kitType];
  752. });
  753. console.log(sorted);
  754. this.instrumentResultList = sorted;
  755. this.chargeTypeList.forEach((item) => {
  756. if (item.id == tempResult.musicGroup.chargeTypeId) {
  757. this.chargeTypeName = item.description;
  758. }
  759. });
  760. // 判断辅件是否有乐器维护(编号固定76)
  761. let accessStatus = false; // 是否有乐保
  762. this.accessOries.forEach((item) => {
  763. // 判断子商品是否有乐保
  764. if (item.childGoodsList && item.childGoodsList.length > 0) {
  765. item.childGoodsList.forEach((child) => {
  766. if (child.id == 76) {
  767. accessStatus = true;
  768. }
  769. });
  770. }
  771. if (item.goodsIdList == 76) {
  772. accessStatus = true;
  773. }
  774. });
  775. this.accessStatus = accessStatus;
  776. // 所有打击乐声部没有乐保【23】
  777. if (this.subjectId == 23) {
  778. this.accessStatus = true;
  779. accessStatus = true;
  780. }
  781. // 乐保服务初始化
  782. this.instrumentResult.forEach((item) => {
  783. if (item.checked && item.kitType != "owned" && !accessStatus) {
  784. this.leBaoStatus = true;
  785. this.buyMaintenance = true;
  786. }
  787. if (
  788. item.checked &&
  789. item.kitType != "GROUP" &&
  790. this.courseViewType == 2
  791. ) {
  792. this.accessIsShowStatus = true;
  793. }
  794. if (this.courseViewType != 2) {
  795. this.accessIsShowStatus = true;
  796. }
  797. });
  798. }
  799. }
  800. // 初始化计算金额
  801. this.calcPrice();
  802. });
  803. },
  804. onLeBao() {
  805. this.buyMaintenance = !this.buyMaintenance;
  806. this.calcPrice();
  807. },
  808. groupBy(array, f) {
  809. var groups = {};
  810. array.forEach(function (o) {
  811. var group = JSON.stringify(f(o));
  812. groups[group] = groups[group] || [];
  813. groups[group].push(o);
  814. });
  815. return Object.keys(groups).map(function (group) {
  816. return groups[group];
  817. });
  818. },
  819. onQuestions(type) {
  820. if (type == "amr") {
  821. this.$alert(
  822. `<b>革命性的“AMR器乐练习系统”</b><br />它的诞生是基于世界上最优秀的华人管乐指导专家唐嘉宏先生的教育理念,创新开发的一种新型“音乐感官植入程序”,这个程序抛弃了传统的“数线式识谱、机械式节奏、死记式乐理”,它营造出沉浸式可变速演奏过程,采用画面与音乐刺激序列组合而成的特定场景,在趣味性挑战的反复刺激中逐步促进器乐演奏的三核心:“音质→音准→音型”,从而达成演奏各环节水准的均匀提高,产生永久性条件反射式大脑记忆,将多板块知识融会贯通,让抽象的音乐知识刻入脑海里!<br /><br /><b>本练习系统的特点:</b><br /> 1.轻松快速掌握要点,让练习者沉浸其中,远离枯燥!<br /> 2.不假思索就能瞬间唤起反射式记忆,演奏识谱不再慢吞吞!<br /> 3.真正的实践记忆,摆脱纸上谈兵,与实际演奏紧密结合!<br />4.思维+肌肉的双重强化!无缝整合复习系统!<br /> 5.每条练习都经过严谨的编曲,你以为你只是在练习旋律线?其实是整个乐团在为你伴奏!`,
  823. "AMR器乐练习系统",
  824. {
  825. confirmButtonText: "确定",
  826. dangerouslyUseHTMLString: true,
  827. callback: (action) => {},
  828. }
  829. );
  830. } else if (type == "instrument") {
  831. this.$alert(
  832. `<p style="text-align: justify">1.乐器保养是管乐迷针对乐团学员提供的乐器检查、保养及维修优惠特权;<br />2.该特权为包年制,从开通特权之日起365天内有效;<br />3.特权用户可享受管乐迷提供专业的高级乐器维修技师一年不低于两次下校检查乐器使用情况;<br />4.特权有效期内凭该特权绑定的乐器编号可享受保养人工费减免、非返厂维修人工费优惠等特权;<br />感谢您的信任和支持!</p>`,
  833. "乐器保养特权",
  834. {
  835. confirmButtonText: "确定",
  836. dangerouslyUseHTMLString: true,
  837. callback: (action) => {},
  838. }
  839. );
  840. }
  841. },
  842. onCourseChange(item) {
  843. // 判断用户是否可以选择
  844. if (item.isStudentOptional) {
  845. item.isStatus = !item.isStatus;
  846. this.calcPrice();
  847. }
  848. },
  849. onTrainChange(item) {
  850. // 练习系统可选
  851. console.log(item);
  852. item.isStatus = !item.isStatus;
  853. let courseShowInfo = this.courseShowInfo;
  854. courseShowInfo.forEach((course) => {
  855. course.isStatus = item.isStatus;
  856. });
  857. let cif = this.courseInfo;
  858. cif.forEach((c) => {
  859. if (!c.isStudentOptional) {
  860. c.isStatus = item.isStatus;
  861. }
  862. });
  863. this.calcPrice();
  864. },
  865. onClickCheckbox() {
  866. //是否使用余额支付
  867. if (!this.payType) {
  868. if (this.orderInfo.amount >= this.balance) {
  869. this.needPrice = Number(
  870. (this.orderInfo.amount - this.balance).toFixed(2)
  871. );
  872. } else {
  873. this.needPrice = 0;
  874. }
  875. } else {
  876. this.needPrice = this.orderInfo.amount;
  877. }
  878. this.payType = !this.payType;
  879. },
  880. onAuxiliarie(item) {
  881. // 辅件切换状态
  882. item.checked = !item.checked;
  883. // 重新计算金额
  884. this.calcPrice();
  885. },
  886. instrumentF(item) {
  887. // 乐器切换状态
  888. this.instrumentResult.forEach((item) => {
  889. item.checked = false;
  890. });
  891. item.checked = true;
  892. if (!this.accessStatus) {
  893. if (item.kitType != "owned") {
  894. this.leBaoStatus = true;
  895. this.buyMaintenance = true;
  896. } else {
  897. this.leBaoStatus = false;
  898. this.buyMaintenance = false;
  899. }
  900. }
  901. // 云教练且选择自备则不显示辅件
  902. if (this.courseViewType == 2) {
  903. if (item.kitType != "GROUP") {
  904. this.accessIsShowStatus = true;
  905. } else {
  906. this.accessIsShowStatus = false;
  907. }
  908. }
  909. // 重新计算金额
  910. this.calcPrice();
  911. },
  912. calcPrice() {
  913. let buyList = [],
  914. ids = [];
  915. let amount = 0,
  916. marketPrice = 0,
  917. goodsPrice = 0, // 乐器两现价
  918. goodsMarketPrice = 0, // 乐器原价
  919. goodsGroupIds = {},
  920. courseKeys = [],
  921. couponPrice = 0, // 优惠金额
  922. goodsIds = [],
  923. tempCourseFee = 0,
  924. musicClassFee = 0,
  925. musicMarketClassFee = 0,
  926. tempAccessPrice = 0,
  927. tempAccessMarketPrice = 0,
  928. tempGroupRemissionCourseFee = 0, // 乐团减免费用
  929. contractGoodsIds = ""; // 合同所需要的商品Id (只需要乐器编号)
  930. // 课程
  931. let mgs = this.musicGroupSubject;
  932. let csi = this.courseInfo;
  933. // 加上判断是否有课程信息
  934. // 如果为云教练系统则,没有课程费用
  935. if (this.courseViewType == 2 && this.toolsPackage[0].isStatus) {
  936. let tempFee = this.cloudTeacherFee;
  937. musicClassFee += parseFloat(tempFee);
  938. marketPrice += parseFloat(tempFee);
  939. }
  940. if (mgs) {
  941. let tempCourse = this.courseShowInfo;
  942. if (tempCourse.length > 0 && this.courseViewType == 1) {
  943. let m = 0;
  944. tempCourse.forEach((item) => {
  945. m += parseFloat(item.courseCurrentPrice);
  946. // 不可选的课程才会减免课程费用
  947. // if (!item.isStudentOptional) {
  948. // tempGroupRemissionCourseFee += parseFloat(item.courseCurrentPrice)
  949. // }
  950. });
  951. marketPrice += parseFloat(m);
  952. buyList.unshift({
  953. name: this.chargeTypeName,
  954. type: paymentPatternType[this.paymentPattern],
  955. price: Number(m.toFixed(2)),
  956. });
  957. }
  958. csi.forEach((item) => {
  959. if (item.isStatus) {
  960. if (this.courseViewType != 2) {
  961. musicClassFee += parseFloat(item.courseCurrentPrice);
  962. }
  963. // marketPrice += parseFloat(item.courseOriginalPrice)
  964. if (item.id > 0) {
  965. courseKeys.push(item.id);
  966. }
  967. // 不可选的课程才会减免课程费用
  968. if (!item.isStudentOptional) {
  969. tempGroupRemissionCourseFee += parseFloat(
  970. item.courseCurrentPrice
  971. );
  972. } else {
  973. marketPrice += parseFloat(item.courseCurrentPrice);
  974. }
  975. if (this.courseViewType == 0 && !item.isStudentOptional) {
  976. marketPrice += parseFloat(item.courseCurrentPrice);
  977. }
  978. }
  979. });
  980. // }
  981. }
  982. // 乐器
  983. let ir = this.instrumentResult;
  984. if (ir.length > 0) {
  985. ir.forEach((item) => {
  986. if (item.checked) {
  987. if (item.name != "自备乐器") {
  988. contractGoodsIds += item.goodsIdList;
  989. }
  990. if (item.kitType == "FREE") {
  991. amount += 0;
  992. couponPrice = 0; // 优惠金额
  993. } else if (item.kitType == "LEASE") {
  994. couponPrice = item.coupon; // 优惠金额
  995. if (item.name != "自备乐器") {
  996. amount += item.depositFee;
  997. goodsPrice += item.depositFee;
  998. } else {
  999. amount += 0;
  1000. }
  1001. } else {
  1002. // 团购
  1003. if (
  1004. this.courseViewType == 2 &&
  1005. this.organId == 50 &&
  1006. !this.toolsPackage[0].isStatus
  1007. ) {
  1008. amount += parseFloat(item.marketPrice);
  1009. goodsPrice += parseFloat(item.marketPrice);
  1010. couponPrice = item.coupon ? item.coupon : 0;
  1011. } else {
  1012. amount += parseFloat(item.price);
  1013. goodsPrice += parseFloat(item.price);
  1014. couponPrice = item.coupon ? item.coupon : 0;
  1015. }
  1016. }
  1017. if (item.kitType == "LEASE") {
  1018. if (item.name != "自备乐器") {
  1019. marketPrice += parseFloat(item.marketPrice);
  1020. goodsMarketPrice += item.depositFee;
  1021. }
  1022. } else {
  1023. marketPrice += parseFloat(item.marketPrice);
  1024. goodsMarketPrice += parseFloat(item.marketPrice);
  1025. }
  1026. // item.id ? goodsGroupIds[item.id] : null
  1027. if (item.id) {
  1028. goodsGroupIds[item.id] = item.kitType;
  1029. }
  1030. if (item.kitType == "LEASE") {
  1031. buyList.push({
  1032. name: item.name,
  1033. type: "租赁",
  1034. price: item.depositFee,
  1035. });
  1036. } else if (item.kitType == "GROUP") {
  1037. // 50分部的团购费用根据是否选中
  1038. // && parseFloat(item.price - couponPrice) > 0
  1039. if (
  1040. this.courseViewType == 2 &&
  1041. this.organId == 50 &&
  1042. !this.toolsPackage[0].isStatus
  1043. ) {
  1044. buyList.push({
  1045. name: item.name,
  1046. type: "团购",
  1047. price: parseFloat(item.marketPrice - couponPrice),
  1048. });
  1049. } else {
  1050. buyList.push({
  1051. name: item.name,
  1052. type: "团购",
  1053. price: parseFloat(item.price - couponPrice),
  1054. });
  1055. }
  1056. } else if (item.kitType == "FREE") {
  1057. buyList.push({
  1058. name: item.name,
  1059. type: "免费",
  1060. price: 0,
  1061. });
  1062. }
  1063. // 是否减免课程费用,必须团购,并且开启了减免课程费用
  1064. if (item.kitType == "GROUP" && item.groupRemissionCourseFee == 1) {
  1065. musicClassFee = parseFloat(
  1066. musicClassFee - tempGroupRemissionCourseFee
  1067. );
  1068. }
  1069. }
  1070. });
  1071. }
  1072. if (this.leBaoStatus && this.buyMaintenance) {
  1073. // 判断是否使用乐保
  1074. // marketPrice += 500
  1075. marketPrice += 300;
  1076. amount += 300;
  1077. buyList.push({
  1078. name: "乐器保养",
  1079. // time: dayjs().format('YYYY/MM/DD') + '~' + dayjs().add(365, 'day').format('YYYY/MM/DD'),
  1080. time: "有效期:从发货之日起一年内有效",
  1081. type: "包年",
  1082. price: 300,
  1083. });
  1084. }
  1085. amount += parseFloat(tempCourseFee + musicClassFee);
  1086. if (
  1087. parseFloat(tempCourseFee + musicClassFee) > 0 &&
  1088. this.courseViewType == 0
  1089. ) {
  1090. buyList.unshift({
  1091. name: "乐团课",
  1092. type: paymentPatternType[this.paymentPattern],
  1093. price: Number((tempCourseFee + musicClassFee).toFixed(2)),
  1094. });
  1095. }
  1096. // 辅件
  1097. if (this.accessOries.length > 0) {
  1098. this.accessOries.forEach((item) => {
  1099. if (item.checked && this.accessIsShowStatus) {
  1100. tempAccessPrice += parseFloat(item.price);
  1101. amount += parseFloat(item.price);
  1102. if (item.goodsList && item.goodsList.length > 0) {
  1103. item.goodsList.forEach((childGoods) => {
  1104. tempAccessMarketPrice += parseFloat(childGoods.marketPrice);
  1105. marketPrice += parseFloat(childGoods.marketPrice);
  1106. });
  1107. }
  1108. goodsGroupIds[item.id] = "ACCESSORIES";
  1109. buyList.push({
  1110. name: item.name,
  1111. type: "团购",
  1112. price: item.price,
  1113. });
  1114. }
  1115. });
  1116. // if (tempAccessPrice > 0) {
  1117. // buyList.push({
  1118. // name: '辅件',
  1119. // type: '团购',
  1120. // price: tempAccessPrice
  1121. // })
  1122. // }
  1123. }
  1124. let tempGroupPurchasePrice = amount;
  1125. // 判断减去优惠金额,是否大于0(这里有可能出现负数)
  1126. if (amount - couponPrice >= 0) {
  1127. amount = Number((amount - couponPrice).toFixed(2));
  1128. this.errorPrice = false;
  1129. } else {
  1130. amount = 0;
  1131. this.errorPrice = true; // 订单金额是否异常
  1132. }
  1133. // if (amount - tempCourseFee - musicClassFee > 0) {
  1134. // ids.push(1, 2)
  1135. // }
  1136. // if (parseFloat(tempCourseFee + musicClassFee) > 0) {
  1137. // ids.push(3, 4, 5)
  1138. // }
  1139. this.ids = ids;
  1140. // 计算是否使用过余额
  1141. if (this.payType) {
  1142. let tempPrice = Number((amount - this.balance).toFixed(2));
  1143. if (tempPrice > 0) {
  1144. this.needPrice = tempPrice;
  1145. } else {
  1146. this.needPrice = 0;
  1147. }
  1148. } else {
  1149. this.needPrice = Number(amount.toFixed(2));
  1150. }
  1151. this.buyList = buyList;
  1152. this.orderInfo = {
  1153. amount: Number(amount.toFixed(2)),
  1154. marketPrice: Number(marketPrice.toFixed(2)),
  1155. groupPurchasePrice: tempGroupPurchasePrice,
  1156. couponPrice: couponPrice,
  1157. goodsGroupIds: goodsGroupIds,
  1158. goodsIds: goodsIds.join(","),
  1159. contractGoodsIds: contractGoodsIds,
  1160. courseKeys: courseKeys,
  1161. musicClassFee: musicClassFee,
  1162. musicMarketClassFee: musicMarketClassFee,
  1163. accessMarketPrice: tempAccessMarketPrice,
  1164. accessPrice: tempAccessPrice,
  1165. goodsPrice: goodsPrice,
  1166. goodsMarketPrice: goodsMarketPrice,
  1167. };
  1168. },
  1169. permission(str) {
  1170. return permission(str);
  1171. },
  1172. },
  1173. };
  1174. </script>
  1175. <style lang="less" scoped>
  1176. .noticeInfo {
  1177. margin: 0 12px;
  1178. position: relative;
  1179. background: #fff;
  1180. padding: 10px 12px;
  1181. font-size: 14px;
  1182. color: #808080;
  1183. border-radius: 10px;
  1184. line-height: 1.5;
  1185. }
  1186. .yunTrain {
  1187. position: relative;
  1188. font-size: 0;
  1189. margin: 0 12px;
  1190. img {
  1191. width: 100%;
  1192. }
  1193. .toolText {
  1194. position: absolute;
  1195. top: 0;
  1196. left: 0;
  1197. height: 100%;
  1198. display: flex;
  1199. flex-direction: column;
  1200. justify-content: center;
  1201. padding: 0 10px;
  1202. }
  1203. .toolTitle {
  1204. font-size: 16px;
  1205. color: #c1735d;
  1206. display: flex;
  1207. align-items: center;
  1208. padding-top: 2px;
  1209. padding-bottom: 2px;
  1210. .icon_video {
  1211. margin-left: 5px;
  1212. display: inline-block;
  1213. width: 16px;
  1214. height: 16px;
  1215. background: url("../../../assets/images/musicGroup/video_btn.png");
  1216. background-size: contain;
  1217. }
  1218. }
  1219. .toolDate {
  1220. font-size: 12px;
  1221. color: #808080;
  1222. }
  1223. }
  1224. .title {
  1225. font-size: 18px;
  1226. line-height: 28px;
  1227. font-weight: bold;
  1228. padding-bottom: 5px;
  1229. padding: 12px;
  1230. display: flex;
  1231. align-items: center;
  1232. margin-bottom: 0;
  1233. &::before {
  1234. content: " ";
  1235. width: 4px;
  1236. height: 15px;
  1237. background: #01c1b5;
  1238. display: inline-block;
  1239. margin-right: 7px;
  1240. border-radius: 8px;
  1241. }
  1242. }
  1243. .titles {
  1244. position: relative;
  1245. font-size: 0;
  1246. margin: 0 12px;
  1247. img {
  1248. width: 100%;
  1249. }
  1250. & > span {
  1251. position: absolute;
  1252. top: 0;
  1253. left: 0;
  1254. height: 100%;
  1255. display: flex;
  1256. flex-direction: column;
  1257. justify-content: center;
  1258. padding: 0 10px;
  1259. font-size: 16px;
  1260. color: #c1735d;
  1261. font-weight: 500;
  1262. }
  1263. }
  1264. .section {
  1265. margin: 0 12px;
  1266. padding: 12px 12px 10px;
  1267. background: #fff;
  1268. margin-bottom: 12px;
  1269. border-bottom-left-radius: 10px;
  1270. border-bottom-right-radius: 10px;
  1271. }
  1272. .disabled {
  1273. opacity: 0.5;
  1274. .check_active {
  1275. opacity: 0.5;
  1276. }
  1277. }
  1278. .buy {
  1279. height: 60px;
  1280. display: flex;
  1281. align-items: center;
  1282. padding: 0 20px;
  1283. border-top: 1px solid #ffe9e9e9;
  1284. color: #000000;
  1285. font-size: 12px;
  1286. background: #fff;
  1287. .price {
  1288. flex: 1;
  1289. font-size: 16px;
  1290. }
  1291. font-size: 16px;
  1292. span {
  1293. color: #fa101d;
  1294. }
  1295. .text {
  1296. font-size: 12px;
  1297. width: 60px;
  1298. display: inline-block;
  1299. color: #000;
  1300. }
  1301. del {
  1302. color: #b5b5b5;
  1303. &.text {
  1304. color: #b5b5b5;
  1305. }
  1306. }
  1307. .btn-submit {
  1308. display: inline-block;
  1309. font-size: 18px;
  1310. color: #fff;
  1311. background: #01c1b5;
  1312. border-radius: 100px;
  1313. padding: 8px 36px;
  1314. }
  1315. }
  1316. .iframe {
  1317. width: 100%;
  1318. height: 100%;
  1319. -webkit-overflow-scrolling: touch;
  1320. overflow-y: scroll;
  1321. border-top: none !important;
  1322. min-height: calc(100vh - 41px);
  1323. }
  1324. .countDownContent {
  1325. line-height: 40px;
  1326. text-align: center;
  1327. font-size: 14px;
  1328. border-bottom: 1px solid #ccc;
  1329. .van-count-down {
  1330. display: inline;
  1331. color: #f00;
  1332. }
  1333. }
  1334. .loadingOrder {
  1335. width: 90%;
  1336. height: 180px;
  1337. display: flex;
  1338. align-items: center;
  1339. justify-content: center;
  1340. .van-loading__text {
  1341. color: #444;
  1342. }
  1343. }
  1344. .pay-section {
  1345. margin-bottom: 10px;
  1346. padding: 10px 8px;
  1347. }
  1348. .pay-name {
  1349. padding-left: 10px;
  1350. flex: 1 auto;
  1351. font-weight: bold;
  1352. }
  1353. .logo {
  1354. width: 24px;
  1355. height: 24px;
  1356. }
  1357. .van-checkbox {
  1358. float: right;
  1359. /deep/.van-checkbox__icon .van-icon {
  1360. border-color: #e9eaef;
  1361. background-color: #e9eaef;
  1362. }
  1363. /deep/.van-checkbox__icon--checked .van-icon {
  1364. background-color: #2dc7aa;
  1365. border-color: #2dc7aa;
  1366. }
  1367. }
  1368. .needprice {
  1369. display: flex;
  1370. justify-content: space-between;
  1371. padding: 2px 0;
  1372. del {
  1373. font-size: 14px;
  1374. color: #808080;
  1375. font-weight: bold;
  1376. }
  1377. span {
  1378. font-size: 18px;
  1379. color: #f85043;
  1380. font-weight: bold;
  1381. }
  1382. }
  1383. .couponprice {
  1384. display: flex;
  1385. justify-content: space-between;
  1386. }
  1387. .use_price {
  1388. display: flex;
  1389. align-items: center;
  1390. font-size: 14px;
  1391. font-weight: bold;
  1392. img {
  1393. padding-right: 8px;
  1394. }
  1395. span {
  1396. font-size: 16px;
  1397. }
  1398. }
  1399. .check_default {
  1400. margin-right: 8px;
  1401. display: flex;
  1402. align-items: center;
  1403. height: 26px;
  1404. &::before {
  1405. display: block;
  1406. content: " ";
  1407. width: 18px;
  1408. height: 18px;
  1409. background-color: #fff;
  1410. border: 1px solid #e9eaef;
  1411. border-radius: 50%;
  1412. }
  1413. &.check_active {
  1414. &::before {
  1415. display: block;
  1416. content: " ";
  1417. background: url("../../../assets/images/icon_checkbox.png") no-repeat
  1418. center;
  1419. border: 1px solid transparent;
  1420. background-size: contain;
  1421. }
  1422. }
  1423. &.radio_active {
  1424. &::before {
  1425. display: block;
  1426. content: " ";
  1427. background: url("../../../assets/images/icon_radio.png") no-repeat center;
  1428. border: 1px solid transparent;
  1429. background-size: contain;
  1430. }
  1431. }
  1432. }
  1433. // .check_default {
  1434. // margin-right: 8px;
  1435. // display: block;
  1436. // width: 18px;
  1437. // height: 18px;
  1438. // background-color: #e9eaef;
  1439. // border-radius: 50%;
  1440. // &.check_active {
  1441. // background: url("../../../assets/images/icon_checkbox.png") no-repeat center;
  1442. // background-size: contain;
  1443. // }
  1444. // }
  1445. .title-row {
  1446. background: #f3f4f8;
  1447. color: #1a1a1a;
  1448. padding: 5px 5px 3px;
  1449. border-radius: 5px;
  1450. font-size: 14px;
  1451. }
  1452. .option-row {
  1453. line-height: 26px;
  1454. font-size: 14px;
  1455. display: flex;
  1456. // align-items: center;
  1457. position: relative;
  1458. padding: 10px 0 5px;
  1459. box-sizing: border-box;
  1460. cursor: pointer;
  1461. .el-col {
  1462. display: flex;
  1463. // align-items: center;
  1464. }
  1465. .el-col-6,
  1466. .el-col-8,
  1467. .el-col-11 {
  1468. display: flex;
  1469. justify-content: flex-end;
  1470. }
  1471. &.lines {
  1472. margin-top: 5px;
  1473. border-top: 1px solid #ededed;
  1474. }
  1475. }
  1476. .el-icon-question {
  1477. font-size: 16px;
  1478. color: #4d4d4d;
  1479. padding-left: 5px;
  1480. padding-top: 5px;
  1481. }
  1482. .fontBold {
  1483. font-weight: bold;
  1484. }
  1485. .videoDialog {
  1486. /deep/.el-dialog__body {
  1487. padding: 0;
  1488. font-size: 0;
  1489. }
  1490. }
  1491. </style>