vipActiveList.vue 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392
  1. <template >
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. VIP活动管理
  6. </h2>
  7. <div class="m-core">
  8. <el-button
  9. type="primary"
  10. style="margin-bottom: 20px"
  11. v-permission="'/vipNewActive'"
  12. @click="gotoNewActive"
  13. >新建</el-button
  14. >
  15. <el-button
  16. type="primary"
  17. style="margin-bottom: 20px"
  18. v-permission="'export/vipGroupActivity'"
  19. @click="onExport"
  20. >VIP活动导出</el-button
  21. >
  22. <save-form
  23. :inline="true"
  24. class="searchForm"
  25. ref="searchForm"
  26. @submit="search"
  27. @reset="onReset"
  28. :model="searchForm"
  29. >
  30. <el-form-item prop="search">
  31. <el-input
  32. v-model.trim="searchForm.search"
  33. clearable
  34. placeholder="活动编号、名称"
  35. ></el-input>
  36. </el-form-item>
  37. <el-form-item prop="organId">
  38. <el-select
  39. class="multiple"
  40. filterable
  41. style="width: 180px !important"
  42. v-model.trim="searchForm.organId"
  43. clearable
  44. placeholder="请选择分部"
  45. >
  46. <el-option
  47. v-for="(item, index) in selects.branchs"
  48. :key="index"
  49. :label="item.name"
  50. :value="item.id"
  51. ></el-option>
  52. </el-select>
  53. </el-form-item>
  54. <el-form-item prop="enable">
  55. <el-select
  56. filterable
  57. style="width: 180px !important"
  58. v-model="searchForm.enable"
  59. clearable
  60. @clear="resetEnable"
  61. placeholder="活动状态"
  62. >
  63. <el-option label="开启" :value="true"></el-option>
  64. <el-option label="关闭" :value="false"></el-option>
  65. </el-select>
  66. </el-form-item>
  67. <el-form-item prop="allowOnlineToOffline">
  68. <el-select
  69. v-model.trim="searchForm.allowOnlineToOffline"
  70. placeholder="请选择课程调整方式"
  71. clearable
  72. >
  73. <el-option
  74. :label="item.label"
  75. :value="item.value"
  76. v-for="item in vipResetTypeList"
  77. :key="item.value"
  78. ></el-option>
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item prop="applyToStudentType">
  82. <el-select
  83. filterable
  84. style="width: 180px !important"
  85. v-model="searchForm.applyToStudentType"
  86. clearable
  87. placeholder="适用学员"
  88. >
  89. <el-option label="新学员" :value="1"></el-option>
  90. <el-option label="老学员" :value="0"></el-option>
  91. <el-option label="所有学员" :value="-1"></el-option>
  92. </el-select>
  93. </el-form-item>
  94. <el-form-item>
  95. <el-button native-type="submit" type="danger">搜索</el-button>
  96. </el-form-item>
  97. <el-form-item>
  98. <el-button type="primary" native-type="reset">重置</el-button>
  99. </el-form-item>
  100. </save-form>
  101. <div class="tableWrap">
  102. <el-table
  103. :data="tableList"
  104. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  105. >
  106. <el-table-column align="center" prop="id" label="活动编号">
  107. <template slot-scope="scope">
  108. <copy-text>{{ scope.row.id }}</copy-text>
  109. </template>
  110. </el-table-column>
  111. <el-table-column
  112. align="center"
  113. prop="type"
  114. :formatter="fommatterType"
  115. label="活动类型"
  116. ></el-table-column>
  117. <el-table-column align="center" prop="name" label="活动名称">
  118. <template slot-scope="scope">
  119. <copy-text>{{ scope.row.name }}</copy-text>
  120. </template>
  121. </el-table-column>
  122. <el-table-column
  123. align="center"
  124. prop="vipGroupCategoryNames"
  125. label="适用课程形式"
  126. ></el-table-column>
  127. <el-table-column
  128. align="center"
  129. label="适用课时类型"
  130. :formatter="fommatterCourseType"
  131. ></el-table-column>
  132. <el-table-column
  133. width="135"
  134. align="center"
  135. label="课程调整方式"
  136. :formatter="fommatterResetType"
  137. ></el-table-column>
  138. <el-table-column
  139. align="center"
  140. label="使用学员"
  141. :formatter="formatStudentType"
  142. ></el-table-column>
  143. <el-table-column label="结算标准">
  144. <template slot-scope="scope">
  145. <div>
  146. <p>{{ scope.row.salarySettlementJson | onlineDesc }}</p>
  147. <p>{{ scope.row.salarySettlementJson | unonlineDesc }}</p>
  148. </div>
  149. </template>
  150. </el-table-column>
  151. <!-- <el-table-column align="center" label="结算说明">
  152. <template slot-scope="scope">
  153. <div>
  154. <p>{{ scope.row.salarySettlementJson | onlineDesc }}</p>
  155. <p>{{ scope.row.salarySettlementJson | unonlineDesc }}</p>
  156. </div>
  157. </template>
  158. </el-table-column> -->
  159. <el-table-column
  160. align="center"
  161. label="启用状态"
  162. prop="enable"
  163. :formatter="fommatterEnable"
  164. ></el-table-column>
  165. <el-table-column align="center" width="150px" label="活动持续时间">
  166. <template slot-scope="scope">
  167. <div>
  168. <p>{{ scope.row.startTime }}</p>
  169. <p>{{ scope.row.endTime }}</p>
  170. </div>
  171. </template>
  172. </el-table-column>
  173. <el-table-column align="center" width="150px" label="课程安排时间">
  174. <template slot-scope="scope">
  175. <div>
  176. <p>{{ scope.row.coursesStartTime }}</p>
  177. <p>{{ scope.row.coursesEndTime }}</p>
  178. </div>
  179. </template>
  180. </el-table-column>
  181. <el-table-column align="center" label="操作">
  182. <template slot-scope="scope">
  183. <div>
  184. <!-- v-if="scope.row.enable > 0" -->
  185. <el-button
  186. type="text"
  187. v-permission="'vipGroupActivity/update'"
  188. @click="reset(scope.row)"
  189. >修改</el-button
  190. >
  191. <!-- <el-button type='text'
  192. @click="remove(scope.row)">删除</el-button>-->
  193. <el-popover
  194. placement="top"
  195. width="160"
  196. v-permission="'vipGroupActivity/delete'"
  197. :ref="scope.$index"
  198. >
  199. <p>确定删除?</p>
  200. <div style="text-align: right; margin: 0">
  201. <el-button
  202. size="mini"
  203. type="text"
  204. @click="scope._self.$refs[scope.$index].doClose()"
  205. >取消</el-button
  206. >
  207. <el-button type="primary" size="mini" @click="remove(scope)"
  208. >确定</el-button
  209. >
  210. </div>
  211. <el-button type="text" slot="reference">删除</el-button>
  212. </el-popover>
  213. </div>
  214. </template>
  215. </el-table-column>
  216. </el-table>
  217. <!-- 分页器 -->
  218. <pagination
  219. :total.sync="rules.total"
  220. sync
  221. :page.sync="rules.page"
  222. :limit.sync="rules.limit"
  223. :page-sizes="rules.page_size"
  224. @pagination="getList"
  225. />
  226. </div>
  227. </div>
  228. <el-dialog
  229. title="修改VIP/乐理课活动"
  230. width="800px"
  231. v-if="dialogVisible"
  232. :visible.sync="dialogVisible"
  233. >
  234. <div>
  235. <el-form
  236. :label-position="labelPosition"
  237. :model="resetForm"
  238. ref="vipform"
  239. :rules="resetFormRules"
  240. class="vipform"
  241. >
  242. <el-form-item label="活动名称" label-width="120px" prop="name">
  243. <el-input v-model.trim="resetForm.name"></el-input>
  244. </el-form-item>
  245. <el-form-item label="适用分部" label-width="120px" prop="organ">
  246. <select-all
  247. v-model.trim="resetForm.organ"
  248. filterable
  249. disabled
  250. multiple
  251. clearable
  252. >
  253. <el-option
  254. v-for="(item, index) in selects.branchs"
  255. :key="index"
  256. :label="item.name"
  257. :value="item.id"
  258. ></el-option>
  259. </select-all>
  260. <!-- <el-button @click="onCheckAllBranch">适用所有分部</el-button> -->
  261. </el-form-item>
  262. <el-form-item label="课程形式" label-width="120px" prop="stauts">
  263. <select-all
  264. v-model.trim="resetForm.stauts"
  265. filterable
  266. clearable
  267. multiple
  268. disabled
  269. >
  270. <el-option
  271. v-for="(item, index) in selects.vipGroupCategory"
  272. :key="index"
  273. :value="item.id"
  274. :label="item.name"
  275. ></el-option>
  276. </select-all>
  277. </el-form-item>
  278. <el-form-item
  279. label="课程调整方式"
  280. label-width="120px"
  281. prop="allowOnlineToOffline"
  282. >
  283. <el-select
  284. style="width: 100% !important"
  285. v-model.trim="resetForm.allowOnlineToOffline"
  286. placeholder="请选择课程调整方式"
  287. clearable
  288. >
  289. <el-option
  290. :label="item.label"
  291. :value="item.value"
  292. v-for="item in vipResetTypeList"
  293. :key="item.value"
  294. ></el-option>
  295. </el-select>
  296. </el-form-item>
  297. <el-form-item
  298. label="使用学员"
  299. label-width="120px"
  300. prop="applyToStudentType"
  301. >
  302. <el-select
  303. v-model.trim="resetForm.applyToStudentType"
  304. style="width: 100% !important"
  305. placeholder="请选择使用学员"
  306. clearable
  307. >
  308. <el-option label="新学员" :value="1"></el-option>
  309. <el-option label="老学员" :value="0"></el-option>
  310. <el-option label="所有学员" :value="-1"></el-option>
  311. </el-select>
  312. </el-form-item>
  313. <el-form-item label="活动描述" label-width="120px" prop="desc">
  314. <el-input
  315. type="textarea"
  316. v-model.trim="resetForm.desc"
  317. :rows="5"
  318. placeholder="请输入活动说明"
  319. ></el-input>
  320. </el-form-item>
  321. <el-form-item label="活动时间" label-width="120px" prop="activeTime">
  322. <el-date-picker
  323. v-model.trim="resetForm.activeTime"
  324. style="width: 100%"
  325. type="datetimerange"
  326. range-separator="至"
  327. value-format="yyyy-MM-dd HH:mm:ss"
  328. :picker-options="{
  329. firstDayOfWeek: 1,
  330. }"
  331. start-placeholder="开始日期"
  332. end-placeholder="结束日期"
  333. ></el-date-picker>
  334. </el-form-item>
  335. <el-form-item label="课程时间" label-width="120px" prop="courseTime">
  336. <el-date-picker
  337. v-model.trim="resetForm.courseTime"
  338. style="width: 100%"
  339. type="datetimerange"
  340. :picker-options="{
  341. firstDayOfWeek: 1,
  342. }"
  343. range-separator="至"
  344. value-format="yyyy-MM-dd HH:mm:ss"
  345. start-placeholder="开始日期"
  346. end-placeholder="结束日期"
  347. ></el-date-picker>
  348. </el-form-item>
  349. </el-form>
  350. <el-alert
  351. title="活动适用范围&结算标准"
  352. type="info"
  353. :closable="false"
  354. class="alert"
  355. >
  356. </el-alert>
  357. <div class="activeRange">
  358. <!-- <div class="left">
  359. <p>活动适用范围&结算标准:</p>
  360. </div> -->
  361. <div class="right">
  362. <div class="chioseWrap">
  363. <el-checkbox label="线上课" v-model.trim="online"></el-checkbox>
  364. <el-select v-model.trim="onlineSalary" clearable filterable>
  365. <el-option
  366. label="老师默认课酬"
  367. value="TEACHER_DEFAULT"
  368. ></el-option>
  369. <el-option
  370. label="实际课程单价比例折扣"
  371. value="RATIO_DISCOUNT"
  372. ></el-option>
  373. <el-option label="固定课酬" value="FIXED_SALARY"></el-option>
  374. </el-select>
  375. <!-- v-show='onlineSalary!= "TEACHER_DEFAULT"' -->
  376. <el-input
  377. placeholder="请输入"
  378. style="width: 150px"
  379. type="number"
  380. @mousewheel.native.prevent
  381. v-if="onlineSalary == 'FIXED_SALARY'"
  382. v-model.trim="onlineprice"
  383. >
  384. <template slot="append">元</template>
  385. </el-input>
  386. <el-input
  387. placeholder="请输入"
  388. style="width: 150px"
  389. type="number"
  390. @mousewheel.native.prevent
  391. v-else-if="onlineSalary == 'RATIO_DISCOUNT'"
  392. v-model.trim="onlineprice"
  393. >
  394. <template slot="append">%</template>
  395. </el-input>
  396. <el-checkbox
  397. label="是否参加梯度"
  398. style="margin-left: 20px"
  399. v-model.trim="onlineClassJoinGradientRewards"
  400. ></el-checkbox>
  401. </div>
  402. <div class="chioseWrap">
  403. <el-checkbox label="线下课" v-model.trim="unonline"></el-checkbox>
  404. <el-select v-model.trim="unonlineSalary" filterable clearable>
  405. <el-option
  406. label="老师默认课酬"
  407. value="TEACHER_DEFAULT"
  408. ></el-option>
  409. <el-option
  410. label="实际课程单价比例折扣"
  411. value="RATIO_DISCOUNT"
  412. ></el-option>
  413. <el-option label="固定课酬" value="FIXED_SALARY"></el-option>
  414. </el-select>
  415. <!-- unonlineSalary -->
  416. <el-input
  417. placeholder="请输入"
  418. style="width: 150px"
  419. type="number"
  420. @mousewheel.native.prevent
  421. v-if="unonlineSalary == 'FIXED_SALARY'"
  422. v-model.trim="unonlineprice"
  423. >
  424. <template slot="append">元</template>
  425. </el-input>
  426. <el-input
  427. placeholder="请输入"
  428. style="width: 150px"
  429. type="number"
  430. @mousewheel.native.prevent
  431. v-else-if="unonlineSalary == 'RATIO_DISCOUNT'"
  432. v-model.trim="unonlineprice"
  433. >
  434. <template slot="append">%</template>
  435. </el-input>
  436. <el-checkbox
  437. label="是否参加梯度"
  438. style="margin-left: 20px"
  439. v-model.trim="offlineClassJoinGradientRewards"
  440. ></el-checkbox>
  441. </div>
  442. <div class="chioseWrap">
  443. <el-checkbox
  444. v-model.trim="paymentReadonlyFlag"
  445. label="可自定义单价"
  446. ></el-checkbox>
  447. <!-- <el-checkbox v-model.trim="salaryReadonlyFlag"
  448. disabled
  449. label="可自定义课酬"></el-checkbox> -->
  450. </div>
  451. </div>
  452. </div>
  453. <el-alert
  454. title="活动类型"
  455. type="info"
  456. :closable="false"
  457. style="margin-bottom: 15px"
  458. class="alert"
  459. >
  460. </el-alert>
  461. <div class="activeType">
  462. <!-- <div class="left">
  463. <p style="width: 60px">活动类型</p>
  464. </div> -->
  465. <div class="right">
  466. <div>
  467. <div
  468. class="head"
  469. @click="
  470. () => {
  471. this.$refs['form'].resetFields();
  472. activeType = 'BASE_ACTIVITY';
  473. courseNumForm = {
  474. minCourseNum: '',
  475. maxCourseNum: '',
  476. studentMaxUsedTimes: '',
  477. };
  478. attribute1 = '';
  479. attribute2 = '';
  480. }
  481. "
  482. :class="activeType == 'BASE_ACTIVITY' ? 'active' : ''"
  483. >
  484. 基础活动
  485. </div>
  486. <p class="title" v-if="activeType == 'BASE_ACTIVITY'">课程原价</p>
  487. </div>
  488. <div>
  489. <div
  490. class="head"
  491. @click="activeType = 'DISCOUNT'"
  492. :class="activeType == 'DISCOUNT' ? 'active' : ''"
  493. >
  494. 折扣
  495. </div>
  496. <el-input
  497. v-if="activeType == 'DISCOUNT'"
  498. v-model.trim="attribute1"
  499. type="number"
  500. placeholder="请输入折扣数值"
  501. >
  502. <template slot="append">%</template>
  503. </el-input>
  504. <el-form
  505. :model="courseNumForm"
  506. :inline="true"
  507. ref="form"
  508. :rules="activeType == 'DISCOUNT' ? courseNumrules : {}"
  509. v-show="activeType == 'DISCOUNT'"
  510. >
  511. <el-form-item prop="minCourseNum">
  512. <el-input
  513. @change="handleMinChange"
  514. v-model.number="courseNumForm.minCourseNum"
  515. type="number"
  516. style="margin-left: 10px; width: 120px !important"
  517. placeholder="最小课时数"
  518. >
  519. </el-input>
  520. </el-form-item>
  521. <el-form-item prop="maxCourseNum">
  522. <el-input
  523. @change="handleMaxChange"
  524. v-model.number="courseNumForm.maxCourseNum"
  525. type="number"
  526. style="margin-left: 10px; width: 120px !important"
  527. placeholder="最大课时数"
  528. >
  529. </el-input>
  530. </el-form-item>
  531. <el-form-item>
  532. <el-input
  533. v-model.number="courseNumForm.studentMaxUsedTimes"
  534. type="number"
  535. style="margin-left: 10px; width: 120px !important"
  536. placeholder="学员购买次数"
  537. >
  538. </el-input>
  539. </el-form-item>
  540. </el-form>
  541. </div>
  542. <div>
  543. <div
  544. class="head"
  545. @click="
  546. () => {
  547. this.$refs['form'].resetFields();
  548. activeType = 'GIVE_CLASS';
  549. courseNumForm.minCourseNum = '';
  550. courseNumForm.maxCourseNum = '';
  551. attribute1 = '';
  552. attribute2 = '';
  553. }
  554. "
  555. :class="activeType == 'GIVE_CLASS' ? 'active' : ''"
  556. >
  557. 赠送课时
  558. </div>
  559. <el-input
  560. placeholder="多少节开始赠"
  561. v-if="activeType == 'GIVE_CLASS'"
  562. v-model.trim="attribute1"
  563. type="number"
  564. style="margin-right: 10px"
  565. ></el-input>
  566. <span v-if="activeType == 'GIVE_CLASS'">赠</span>
  567. <el-input
  568. v-if="activeType == 'GIVE_CLASS'"
  569. placeholder="请输入赠送课时数"
  570. v-model.trim="attribute2"
  571. type="number"
  572. style="margin: 0 10px"
  573. ></el-input>
  574. <el-input
  575. v-show="activeType == 'GIVE_CLASS'"
  576. v-model.number="courseNumForm.studentMaxUsedTimes"
  577. type="number"
  578. style="margin-left: 10px; width: 120px !important"
  579. placeholder="学员购买次数"
  580. >
  581. </el-input>
  582. <!-- <el-checkbox v-if="activeType=='GIVE_CLASS'"
  583. v-model.trim="giveClassPaySalaryFlag"
  584. label="赠送课时结算课酬"></el-checkbox> -->
  585. </div>
  586. </div>
  587. </div>
  588. </div>
  589. <span slot="footer" class="dialog-footer">
  590. <el-button @click="dialogVisible = false">取 消</el-button>
  591. <el-button type="primary" @click="resetRow">确 定</el-button>
  592. </span>
  593. </el-dialog>
  594. </div>
  595. </template>
  596. <script>
  597. const MIN_NUMBER = 1;
  598. const MAX_NUMBER = 999;
  599. import pagination from "@/components/Pagination/index";
  600. import {
  601. vipGroupActivity,
  602. vipGroupCategory,
  603. addVipActive,
  604. resetVipActive,
  605. removeVipActive,
  606. } from "@/api/vipSeting";
  607. import qs from "qs";
  608. import { Export } from "@/utils/downLoadFile";
  609. import cleanDeep from "clean-deep";
  610. import { vipResetTypeList } from "@/utils/searchArray";
  611. export default {
  612. name: "vipActiveList",
  613. components: { pagination },
  614. data() {
  615. return {
  616. vipResetTypeList,
  617. labelPosition: "right",
  618. tableList: [],
  619. rules: {
  620. // 分页规则
  621. limit: 10, // 限制显示条数
  622. page: 1, // 当前页
  623. total: 0, // 总条数
  624. page_size: [10, 20, 40, 50], // 选择限制显示条数
  625. },
  626. searchForm: {
  627. organId: null,
  628. enable: null,
  629. search: "",
  630. applyToStudentType: null,
  631. allowOnlineToOffline: null,
  632. },
  633. dialogVisible: false,
  634. resetForm: {
  635. name: "",
  636. desc: "",
  637. activeTime: [],
  638. courseTime: [],
  639. stauts: [],
  640. applyToStudentType: null,
  641. allowOnlineToOffline: null,
  642. organ: [],
  643. }, // 修改信息
  644. resetFormRules: {
  645. name: [
  646. { required: true, message: "请输入活动名称", trigger: "blur" },
  647. {
  648. min: 1,
  649. max: 25,
  650. message: "长度在 1 到 25 个字符",
  651. trigger: "blur",
  652. },
  653. ],
  654. desc: [
  655. { required: false, message: "请输入文字描述", trigger: "blur" },
  656. {
  657. min: 1,
  658. max: 200,
  659. message: "长度在 1 到 200 个字符",
  660. trigger: "blur",
  661. },
  662. ],
  663. activeTime: [
  664. { required: false, message: "请选择活动时间", trigger: "blur" },
  665. ],
  666. courseTime: [
  667. { required: false, message: "请选择课程时间", trigger: "blur" },
  668. ],
  669. organ: [{ required: true, message: "请选择分部", trigger: "blur" }],
  670. stauts: [
  671. { required: true, message: "请选择活动形式", trigger: "blur" },
  672. ],
  673. applyToStudentType: [
  674. { required: true, message: "请选择是否新生专享", trigger: "change" },
  675. ],
  676. allowOnlineToOffline: [
  677. { required: true, message: "请选择课程调整方式" },
  678. ],
  679. },
  680. courseStatusList: [],
  681. activeType: "",
  682. online: true,
  683. unonline: true,
  684. onlineClassJoinGradientRewards: false,
  685. offlineClassJoinGradientRewards: false,
  686. onlineSalary: "TEACHER_DEFAULT",
  687. unonlineSalary: "TEACHER_DEFAULT",
  688. onlineprice: "",
  689. unonlineprice: "",
  690. salaryReadonlyFlag: false,
  691. paymentReadonlyFlag: true,
  692. attribute1: "",
  693. attribute2: "",
  694. giveClassPaySalaryFlag: false,
  695. activeId: "",
  696. isReset: false,
  697. courseNumForm: {
  698. minCourseNum: "",
  699. maxCourseNum: "",
  700. studentMaxUsedTimes: "",
  701. },
  702. courseNumrules: {
  703. minCourseNum: [
  704. { required: true, message: "请输入最小课时数", trigger: "blur" },
  705. { validator: this.validateCom, trigger: "blur" },
  706. { validator: this.validateMin, trigger: "blur" },
  707. ],
  708. maxCourseNum: [
  709. { required: true, message: "请输入最大课时数", trigger: "blur" },
  710. { validator: this.validateCom, trigger: "blur" },
  711. { validator: this.validateMax, trigger: "blur" },
  712. ],
  713. },
  714. };
  715. },
  716. // created() {
  717. // this.init();
  718. // },
  719. // activated() {
  720. // this.init();
  721. // },
  722. mounted() {
  723. this.init();
  724. },
  725. filters: {
  726. onlinePip(val) {
  727. let obj = JSON.parse(val);
  728. // debugger;
  729. if (
  730. obj &&
  731. obj.onlineSalarySettlement &&
  732. obj.onlineSalarySettlement.salarySettlementType
  733. ) {
  734. switch (obj.onlineSalarySettlement.salarySettlementType) {
  735. case "RATIO_DISCOUNT": {
  736. return "线上:比例结算";
  737. break;
  738. }
  739. case "TEACHER_DEFAULT": {
  740. return "线上:老师默认";
  741. break;
  742. }
  743. case "FIXED_SALARY": {
  744. return "线上:固定课酬";
  745. break;
  746. }
  747. }
  748. }
  749. },
  750. unonlinePip(val) {
  751. let obj = JSON.parse(val);
  752. if (
  753. obj &&
  754. obj.offlineSalarySettlement &&
  755. obj.offlineSalarySettlement.salarySettlementType
  756. ) {
  757. switch (obj.offlineSalarySettlement.salarySettlementType) {
  758. case "RATIO_DISCOUNT": {
  759. return "线下:比例结算";
  760. break;
  761. }
  762. case "TEACHER_DEFAULT": {
  763. return "线下:老师默认";
  764. break;
  765. }
  766. case "FIXED_SALARY": {
  767. return "线下:固定课酬";
  768. break;
  769. }
  770. }
  771. }
  772. },
  773. onlineDesc(val) {
  774. let obj = JSON.parse(val);
  775. // debugger;
  776. if (
  777. obj &&
  778. obj.onlineSalarySettlement &&
  779. obj.onlineSalarySettlement.salarySettlementType
  780. ) {
  781. switch (obj.onlineSalarySettlement.salarySettlementType) {
  782. case "RATIO_DISCOUNT": {
  783. if (obj.onlineSalarySettlement.settlementValue) {
  784. return `线上:比例结算${obj.onlineSalarySettlement.settlementValue}%`;
  785. } else {
  786. return "线上:比例结算";
  787. }
  788. break;
  789. }
  790. case "TEACHER_DEFAULT": {
  791. return "线上:默认课酬";
  792. break;
  793. }
  794. case "FIXED_SALARY": {
  795. if (obj.onlineSalarySettlement.settlementValue) {
  796. return `线上:固定课酬${obj.onlineSalarySettlement.settlementValue}/次`;
  797. } else {
  798. return "线上:固定课酬";
  799. }
  800. break;
  801. }
  802. }
  803. }
  804. },
  805. unonlineDesc(val) {
  806. let obj = JSON.parse(val);
  807. if (
  808. obj &&
  809. obj.offlineSalarySettlement &&
  810. obj.offlineSalarySettlement.salarySettlementType
  811. ) {
  812. switch (obj.offlineSalarySettlement.salarySettlementType) {
  813. case "RATIO_DISCOUNT": {
  814. if (obj.offlineSalarySettlement.settlementValue) {
  815. return `线下:比例结算${obj.offlineSalarySettlement.settlementValue}%`;
  816. } else {
  817. return "线下:比例结算";
  818. }
  819. break;
  820. }
  821. case "TEACHER_DEFAULT": {
  822. return "线下:默认课酬";
  823. break;
  824. }
  825. case "FIXED_SALARY": {
  826. if (obj.offlineSalarySettlement.settlementValue) {
  827. return `线下:固定课酬${obj.offlineSalarySettlement.settlementValue}/次`;
  828. } else {
  829. return "线下:固定课酬";
  830. }
  831. break;
  832. }
  833. }
  834. }
  835. },
  836. },
  837. methods: {
  838. async init() {
  839. // 获取类型
  840. await this.$store.dispatch("setVipGroupCategory");
  841. // 获取分部
  842. await this.$store.dispatch("setBranchs");
  843. this.getList();
  844. },
  845. // 导出
  846. async onExport() {
  847. const { ...rest } = this.searchForm;
  848. let obj = {
  849. ...rest,
  850. page: this.rules.page,
  851. rows: this.rules.limit,
  852. };
  853. await Export(
  854. this,
  855. {
  856. url: "/api-web/export/vipGroupActivity",
  857. fileName: "活动列表.xls",
  858. method: "post",
  859. params: qs.stringify(cleanDeep(obj)),
  860. },
  861. "您确定活动列表?"
  862. );
  863. },
  864. loadNumber(event) {
  865. var el = event.currentTarget;
  866. var elValue = el.value;
  867. var reg = /^((?!0)\d{1,2}|100)$/;
  868. if (!elValue.match(reg)) {
  869. elValue = "";
  870. return false;
  871. } else {
  872. return true;
  873. }
  874. },
  875. onCheckAllBranch() {
  876. // 适用所有分部
  877. this.resetForm.organ = [];
  878. this.organList.forEach((item) => {
  879. this.resetForm.organ.push(item.id);
  880. });
  881. },
  882. search() {
  883. this.rules.page = 1;
  884. this.getList();
  885. },
  886. onReset() {
  887. // this.searchForm = {
  888. // enable: null,
  889. // search: null,
  890. // organId: null,
  891. // }
  892. this.$refs["searchForm"].resetFields();
  893. this.search();
  894. },
  895. getList() {
  896. let enable = this.searchForm.enable;
  897. let search = this.searchForm.search;
  898. vipGroupActivity({
  899. organId: this.searchForm.organId,
  900. applyToStudentType: this.searchForm.applyToStudentType,
  901. allowOnlineToOffline: this.searchForm.allowOnlineToOffline,
  902. rows: this.rules.limit,
  903. page: this.rules.page,
  904. enable,
  905. search,
  906. }).then((res) => {
  907. if (res.code == 200) {
  908. this.tableList = res.data.rows;
  909. this.rules.total = res.data.total;
  910. }
  911. });
  912. },
  913. resetEnable(val) {
  914. val = null;
  915. },
  916. // 格式化活动类型
  917. fommatterType(row, column) {
  918. switch (row.type) {
  919. case "BASE_ACTIVITY": {
  920. return "基础";
  921. break;
  922. }
  923. case "DISCOUNT": {
  924. return "折扣";
  925. break;
  926. }
  927. case "GIVE_CLASS": {
  928. if (row.giveClassPaySalaryFlag) {
  929. return "买赠(赠课结算)";
  930. } else {
  931. return "买赠(不结算)";
  932. }
  933. break;
  934. }
  935. }
  936. },
  937. // 格式化课时类型
  938. fommatterCourseType(row) {
  939. let date = JSON.parse(row.salarySettlementJson);
  940. let str = "";
  941. if (date && date.onlineSalarySettlement) {
  942. str += "线上 ";
  943. }
  944. if (date && date.offlineSalarySettlement) {
  945. str += "线下";
  946. }
  947. return str;
  948. },
  949. fommatterResetType(row) {
  950. let str = null;
  951. if (row.allowOnlineToOffline == 1) {
  952. str = "无限制";
  953. }
  954. if (row.allowOnlineToOffline == 0) {
  955. str = "线上不可转线下";
  956. }
  957. if (row.allowOnlineToOffline == 2) {
  958. str = "线下不可调为线上";
  959. }
  960. if (row.allowOnlineToOffline == 3) {
  961. str = "线上线下不可互调";
  962. }
  963. return str;
  964. },
  965. formatStudentType(row) {
  966. let str = null;
  967. if (row.applyToStudentType == -1) {
  968. str = "所有学员";
  969. }
  970. if (row.applyToStudentType == 0) {
  971. str = "老学员";
  972. }
  973. if (row.applyToStudentType == 1) {
  974. str = "新学员";
  975. }
  976. return str;
  977. },
  978. // 格式化启用状态
  979. fommatterEnable(row) {
  980. switch (row.enable) {
  981. case 0: {
  982. return "关闭";
  983. break;
  984. }
  985. case 1: {
  986. return "开启";
  987. break;
  988. }
  989. }
  990. },
  991. // 点击列表修改同步状态
  992. reset(row) {
  993. this.isReset = true;
  994. this.activeId = row.id;
  995. this.dialogVisible = true;
  996. this.resetForm = {
  997. name: "",
  998. desc: "",
  999. activeTime: [],
  1000. courseTime: [],
  1001. stauts: [],
  1002. applyToStudentType: null,
  1003. allowOnlineToOffline: null,
  1004. organ: [],
  1005. }
  1006. this.resetForm.name = row.name;
  1007. this.resetForm.applyToStudentType = row.applyToStudentType;
  1008. this.resetForm.allowOnlineToOffline = row.allowOnlineToOffline + "";
  1009. this.resetForm.desc = row.description;
  1010. if (row.organId) {
  1011. this.resetForm.organ = row.organId.split(",").map((res) => {
  1012. return parseInt(res);
  1013. });
  1014. }
  1015. if (row.vipGroupCategoryIdList) {
  1016. this.resetForm.stauts = row.vipGroupCategoryIdList
  1017. .split(",")
  1018. .map((res) => {
  1019. return parseInt(res);
  1020. });
  1021. }
  1022. // 同步活动时间
  1023. if (row.startTime && row.endTime) {
  1024. this.resetForm.activeTime = [row.startTime, row.endTime];
  1025. }
  1026. if (row.coursesStartTime && row.coursesEndTime) {
  1027. this.resetForm.courseTime = [row.coursesStartTime, row.coursesEndTime];
  1028. }
  1029. // 同步适用范围
  1030. let obj = JSON.parse(row.salarySettlementJson);
  1031. // 同步线上课状态
  1032. obj.onlineSalarySettlement ? (this.online = true) : (this.online = false);
  1033. if (obj.onlineSalarySettlement) {
  1034. this.onlineSalary = obj.salarySettlementType;
  1035. if (obj.onlineSalarySettlement.settlementValue) {
  1036. this.onlineprice = obj.onlineSalarySettlement.settlementValue;
  1037. }
  1038. if (obj.onlineSalarySettlement.salarySettlementType)
  1039. this.onlineSalary = obj.onlineSalarySettlement.salarySettlementType;
  1040. } else {
  1041. this.onlineSalary = "TEACHER_DEFAULT";
  1042. this.onlineprice = "";
  1043. }
  1044. // 同步线下课状态
  1045. obj.offlineSalarySettlement
  1046. ? (this.unonline = true)
  1047. : (this.unonline = false);
  1048. if (obj.offlineSalarySettlement) {
  1049. this.unonlineSalary = obj.offlineSalarySettlement;
  1050. if (obj.offlineSalarySettlement.settlementValue) {
  1051. this.unonlineprice = obj.offlineSalarySettlement.settlementValue;
  1052. }
  1053. if (obj.offlineSalarySettlement.salarySettlementType)
  1054. this.unonlineSalary =
  1055. obj.offlineSalarySettlement.salarySettlementType;
  1056. } else {
  1057. this.unonlineSalary = "TEACHER_DEFAULT";
  1058. this.unonlineprice = "";
  1059. }
  1060. //
  1061. this.salaryReadonlyFlag = !!parseInt(row.salaryReadonlyFlag);
  1062. this.paymentReadonlyFlag = !!parseInt(row.paymentReadonlyFlag);
  1063. this.offlineClassJoinGradientRewards = !!parseInt(
  1064. row.offlineClassJoinGradientRewards
  1065. );
  1066. this.onlineClassJoinGradientRewards = !!parseInt(
  1067. row.onlineClassJoinGradientRewards
  1068. );
  1069. this.activeType = row.type;
  1070. this.attribute1 = row.attribute1;
  1071. this.attribute2 = row.attribute2;
  1072. let studentMaxUsedTimes =
  1073. row.studentMaxUsedTimes == -1 ? null : row.studentMaxUsedTimes;
  1074. let minCourseNum = row.minCourseNum == -1 ? null : row.minCourseNum;
  1075. let maxCourseNum = row.maxCourseNum == -1 ? null : row.maxCourseNum;
  1076. this.$set(this.courseNumForm, "studentMaxUsedTimes", studentMaxUsedTimes);
  1077. this.$set(this.courseNumForm, "minCourseNum", minCourseNum);
  1078. this.$set(this.courseNumForm, "maxCourseNum", maxCourseNum);
  1079. this.giveClassPaySalaryFlag =
  1080. row.giveClassPaySalaryFlag == 1 ? true : false;
  1081. },
  1082. // 点击确认按钮发送修改请求
  1083. resetRow() {
  1084. this.$refs.form.validate((isok) => {
  1085. if (isok) {
  1086. this.$refs["vipform"].validate((valid) => {
  1087. if (valid) {
  1088. // 验证通过
  1089. let coursesStartTime;
  1090. let coursesEndTime;
  1091. let startTime;
  1092. let endTime;
  1093. if (!this.resetForm.courseTime) {
  1094. this.resetForm.courseTime = [];
  1095. // coursesStartTime = null;
  1096. // coursesEndTime = null;
  1097. }
  1098. if (!this.resetForm.activeTime) {
  1099. this.resetForm.activeTime = [];
  1100. // startTime = null;
  1101. // endTime = null;
  1102. }
  1103. let id = this.activeId;
  1104. coursesStartTime = this.resetForm.courseTime[0] || null;
  1105. coursesEndTime = this.resetForm.courseTime[1] || null;
  1106. startTime = this.resetForm.activeTime[0] || null;
  1107. endTime = this.resetForm.activeTime[1] || null;
  1108. let organId = this.resetForm.organ.join(",");
  1109. let type = this.activeType;
  1110. if (!type) {
  1111. this.$message.error("请选择活动类型");
  1112. return;
  1113. }
  1114. // 判断适用范围
  1115. if (!this.online && !this.unonline) {
  1116. this.$message.error("请选择活动适用范围");
  1117. return;
  1118. }
  1119. if (type == "DISCOUNT") {
  1120. if (!this.attribute1 || this.attribute1 < 0) {
  1121. this.$message.error("折扣必须大于等于0");
  1122. return;
  1123. }
  1124. } else if (type == "GIVE_CLASS") {
  1125. if (!this.attribute1) {
  1126. this.$message.error("请输入多少节开始赠");
  1127. return;
  1128. }
  1129. if (!this.attribute2) {
  1130. this.$message.error("请输入赠送课时数");
  1131. return;
  1132. }
  1133. }
  1134. let vipGroupCategoryIdList = this.resetForm.stauts.join(",");
  1135. let onlineSalarySettlement;
  1136. let offlineSalarySettlement;
  1137. if (this.online) {
  1138. // 勾选线上
  1139. // 判断勾选的是折扣还是现金
  1140. if (this.onlineSalary == "RATIO_DISCOUNT") {
  1141. if (this.onlineprice < 0 || this.onlineprice > 100) {
  1142. this.$message.error("折扣比必须大于0且小于100");
  1143. return;
  1144. }
  1145. } else if (this.onlineSalary == "TEACHER_DEFAULT") {
  1146. this.onlineprice = 0;
  1147. }
  1148. onlineSalarySettlement = {
  1149. salarySettlementType: this.onlineSalary,
  1150. settlementValue: this.onlineprice,
  1151. };
  1152. } else {
  1153. onlineSalarySettlement = null;
  1154. }
  1155. if (this.unonline) {
  1156. // 勾选线下
  1157. if (this.unonlineSalary == "RATIO_DISCOUNT") {
  1158. if (this.unonlineprice < 0 || this.unonlineprice > 100) {
  1159. this.$message.error("折扣比必须大于0且小于100");
  1160. return;
  1161. }
  1162. } else if (this.unonlineSalary == "TEACHER_DEFAULT") {
  1163. this.unonlineprice = 0;
  1164. }
  1165. offlineSalarySettlement = {
  1166. salarySettlementType: this.unonlineSalary,
  1167. settlementValue: this.unonlineprice,
  1168. };
  1169. } else {
  1170. offlineSalarySettlement = null;
  1171. }
  1172. let salaryReadonlyFlag = this.salaryReadonlyFlag * 1;
  1173. let paymentReadonlyFlag = this.paymentReadonlyFlag * 1;
  1174. // let giveClassPaySalaryFlag = this.giveClassPaySalaryFlag * 1;
  1175. let vipGroupSalarySettlement = {
  1176. onlineSalarySettlement,
  1177. offlineSalarySettlement,
  1178. };
  1179. if (type == "BASE_ACTIVITY") {
  1180. this.courseNumForm.studentMaxUsedTimes = -1;
  1181. this.courseNumForm.minCourseNum = -1;
  1182. this.courseNumForm.maxCourseNum = -1;
  1183. } else if (type == "GIVE_CLASS") {
  1184. this.courseNumForm.minCourseNum = -1;
  1185. this.courseNumForm.maxCourseNum = -1;
  1186. }
  1187. // 发请求创建活动
  1188. resetVipActive({
  1189. paymentReadonlyFlag,
  1190. id,
  1191. coursesStartTime,
  1192. coursesEndTime,
  1193. startTime,
  1194. endTime,
  1195. name: this.resetForm.name,
  1196. description: this.resetForm.desc,
  1197. applyToStudentType: this.resetForm.applyToStudentType,
  1198. allowOnlineToOffline: this.resetForm.allowOnlineToOffline,
  1199. organId,
  1200. type,
  1201. vipGroupCategoryIdList,
  1202. vipGroupSalarySettlement,
  1203. salaryReadonlyFlag,
  1204. giveClassPaySalaryFlag: 1,
  1205. attribute1: this.attribute1,
  1206. attribute2: this.attribute2,
  1207. minCourseNum: this.courseNumForm.minCourseNum,
  1208. maxCourseNum: this.courseNumForm.maxCourseNum,
  1209. studentMaxUsedTimes: this.courseNumForm.studentMaxUsedTimes
  1210. ? this.courseNumForm.studentMaxUsedTimes
  1211. : -1,
  1212. onlineClassJoinGradientRewards:
  1213. this.onlineClassJoinGradientRewards * 1,
  1214. offlineClassJoinGradientRewards:
  1215. this.offlineClassJoinGradientRewards * 1,
  1216. }).then((res) => {
  1217. if (res.code == 200) {
  1218. this.$message.success("恭喜你,活动修改成功");
  1219. this.dialogVisible = false;
  1220. this.getList();
  1221. }
  1222. });
  1223. } else {
  1224. this.$message.error("请填写必要参数");
  1225. }
  1226. });
  1227. }
  1228. });
  1229. },
  1230. remove(scope) {
  1231. let id = scope.row.id;
  1232. removeVipActive({ id }).then((res) => {
  1233. if (res.code == 200) {
  1234. this.$message.success("恭喜您删除成功");
  1235. this.getList();
  1236. }
  1237. scope._self.$refs[scope.$index].doClose();
  1238. });
  1239. },
  1240. gotoNewActive() {
  1241. // 带参数 searchForm: { organId: null } 搜索条件
  1242. // let rules = JSON.stringify(this.rules);
  1243. // let searchForm = JSON.stringify(this.searchForm);
  1244. this.$router.push({
  1245. path: "/operateManager/vipNewActive?type=create",
  1246. // query: { rules, searchForm },
  1247. });
  1248. },
  1249. closeVipform() {
  1250. this.$refs["vipform"].resetFields();
  1251. this.dialogVisible = false;
  1252. },
  1253. resetForms() {
  1254. this.$refs.form.resetFields();
  1255. },
  1256. handleMinChange() {
  1257. this.$refs.form.validateField("maxCourseNum");
  1258. },
  1259. handleMaxChange() {
  1260. this.$refs.form.validateField("minCourseNum");
  1261. },
  1262. validateCom(rule, value, callback) {
  1263. const one = Number(value);
  1264. if (Number.isInteger(one)) {
  1265. if (one < MIN_NUMBER) {
  1266. return callback(new Error("输入值必须大于0"));
  1267. } else if (one > MAX_NUMBER) {
  1268. return callback(new Error("输入值必须小于999"));
  1269. }
  1270. return callback();
  1271. }
  1272. return callback(new Error("输入值必须为正整数"));
  1273. },
  1274. validateMin(rule, value, callback) {
  1275. const one = Number(value);
  1276. const max = Number(this.courseNumForm.maxCourseNum);
  1277. if (!max || one <= max) {
  1278. return callback();
  1279. }
  1280. return callback(new Error("输入值不得大于最大课时数"));
  1281. },
  1282. validateMax(rule, value, callback) {
  1283. const one = Number(value);
  1284. const min = Number(this.courseNumForm.minCourseNum);
  1285. if (!min || one >= min) {
  1286. return callback();
  1287. }
  1288. return callback(new Error("输入值不得小于最小课时数"));
  1289. },
  1290. },
  1291. };
  1292. </script>
  1293. <style lang="scss" scoped>
  1294. .activeType {
  1295. .right {
  1296. .el-input {
  1297. width: 150px !important;
  1298. }
  1299. }
  1300. }
  1301. .activeRange {
  1302. display: flex;
  1303. flex-direction: row;
  1304. justify-content: flex-start;
  1305. .left {
  1306. height: 72px;
  1307. line-height: 72px;
  1308. }
  1309. .right {
  1310. .chioseWrap {
  1311. display: flex;
  1312. flex-direction: row;
  1313. justify-content: flex-start;
  1314. height: 72px;
  1315. line-height: 72px;
  1316. align-items: center;
  1317. .el-checkbox {
  1318. margin-right: 20px;
  1319. }
  1320. .el-select {
  1321. margin-right: 20px;
  1322. }
  1323. }
  1324. }
  1325. }
  1326. .activeType {
  1327. display: flex;
  1328. flex-direction: row;
  1329. justify-content: flex-start;
  1330. .left {
  1331. margin-right: 20px;
  1332. p {
  1333. height: 40px;
  1334. line-height: 40px;
  1335. }
  1336. }
  1337. .right {
  1338. > div {
  1339. display: flex;
  1340. flex-direction: row;
  1341. justify-content: flex-start;
  1342. height: 40px;
  1343. line-height: 40px;
  1344. margin-bottom: 20px;
  1345. .head {
  1346. width: 120px;
  1347. height: 40px;
  1348. line-height: 40px;
  1349. border: 1px solid #ccc;
  1350. text-align: center;
  1351. border-radius: 5px;
  1352. cursor: pointer;
  1353. margin-right: 10px;
  1354. }
  1355. > .head.active {
  1356. background-color: #13817a;
  1357. color: #fff;
  1358. border: none;
  1359. }
  1360. .title {
  1361. line-height: 40px;
  1362. height: 40px;
  1363. }
  1364. }
  1365. }
  1366. }
  1367. .vipform {
  1368. .el-select {
  1369. width: 400px !important;
  1370. .el-input__inner {
  1371. width: 400px;
  1372. }
  1373. }
  1374. }
  1375. .ishidden {
  1376. visibility: hidden;
  1377. }
  1378. </style>