vipActiveList.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882
  1. <template >
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 活动管理
  6. </h2>
  7. <div class="m-core">
  8. <div class="btnList" style="margin-bottom: 20px">
  9. <el-button
  10. type="primary"
  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. >活动导出</el-button
  21. > -->
  22. <!-- <el-button
  23. type="primary"
  24. style="margin-bottom: 20px"
  25. v-permission="'export/vipGroupActivity'"
  26. @click="onActiveExport"
  27. >活动资格导出</el-button
  28. > -->
  29. </div>
  30. <save-form
  31. :inline="true"
  32. class="searchForm"
  33. ref="searchForm"
  34. @submit="search"
  35. @reset="onReset"
  36. :model="searchForm"
  37. >
  38. <el-form-item prop="search">
  39. <el-input
  40. v-model.trim="searchForm.search"
  41. clearable
  42. placeholder="活动编号/名称"
  43. ></el-input>
  44. </el-form-item>
  45. <el-form-item prop="organId">
  46. <el-select
  47. class="multiple"
  48. filterable
  49. style="width: 180px !important"
  50. v-model.trim="searchForm.organId"
  51. clearable
  52. placeholder="请选择分部"
  53. >
  54. <el-option
  55. v-for="(item, index) in selects.branchs"
  56. :key="index"
  57. :label="item.name"
  58. :value="item.id"
  59. ></el-option>
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item prop="activityChannel">
  63. <el-select
  64. filterable
  65. style="width: 180px !important"
  66. v-model="searchForm.activityChannel"
  67. clearable
  68. placeholder="活动渠道"
  69. >
  70. <el-option label="乐团小课" :value="'1'"></el-option>
  71. <el-option label="常规小课" :value="'2'"></el-option>
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item prop="status">
  75. <el-select
  76. filterable
  77. style="width: 180px !important"
  78. v-model="searchForm.status"
  79. clearable
  80. placeholder="活动状态"
  81. >
  82. <el-option label="草稿" :value="'DRAFT'"></el-option>
  83. <el-option label="正式" :value="'PROGRESS'"></el-option>
  84. </el-select>
  85. </el-form-item>
  86. <el-form-item prop="enable">
  87. <el-select
  88. filterable
  89. style="width: 180px !important"
  90. v-model="searchForm.enable"
  91. clearable
  92. @clear="resetEnable"
  93. placeholder="是否启用"
  94. >
  95. <el-option label="是" :value="true"></el-option>
  96. <el-option label="否" :value="false"></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item prop="allowOnlineToOffline">
  100. <el-select
  101. v-model.trim="searchForm.allowOnlineToOffline"
  102. placeholder="请选择课程调整方式"
  103. clearable
  104. >
  105. <el-option
  106. :label="item.label"
  107. :value="item.value"
  108. v-for="item in vipResetTypeList"
  109. :key="item.value"
  110. ></el-option>
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item prop="applyToStudentType">
  114. <el-select
  115. filterable
  116. style="width: 180px !important"
  117. v-model="searchForm.applyToStudentType"
  118. clearable
  119. placeholder="适用学员"
  120. >
  121. <el-option label="新学员" value="1"></el-option>
  122. <el-option label="老学员" value="0"></el-option>
  123. <el-option label="会员" value="2"></el-option>
  124. <el-option label="非会员" value="3"></el-option>
  125. </el-select>
  126. </el-form-item>
  127. <el-form-item>
  128. <el-button native-type="submit" type="danger">搜索</el-button>
  129. </el-form-item>
  130. <el-form-item>
  131. <el-button type="primary" native-type="reset">重置</el-button>
  132. </el-form-item>
  133. </save-form>
  134. <div class="tableWrap">
  135. <el-table
  136. :data="tableList"
  137. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  138. >
  139. <el-table-column align="center" prop="id" label="活动编号">
  140. <template slot-scope="scope">
  141. <copy-text>{{ scope.row.id }}</copy-text>
  142. </template>
  143. </el-table-column>
  144. <el-table-column align="center" prop="name" label="活动名称">
  145. <template slot-scope="scope">
  146. <copy-text>{{ scope.row.name }}</copy-text>
  147. </template>
  148. </el-table-column>
  149. <el-table-column align="center" prop="activityType" label="活动渠道">
  150. <template slot-scope="scope">
  151. <div>
  152. {{ scope.row.activityChannel == 1 ? "乐团小课" : "常规小课" }}
  153. </div>
  154. </template>
  155. </el-table-column>
  156. <el-table-column align="center" prop="activityType" label="活动类型">
  157. <template slot-scope="scope">
  158. <div>
  159. {{ scope.row.activityType ? "会员活动" : "课程活动" }}
  160. </div>
  161. </template>
  162. </el-table-column>
  163. <el-table-column align="center" prop="type" label="活动购买">
  164. <template slot-scope="scope">
  165. <div>
  166. <p v-if="scope.row.activityType">会员</p>
  167. <p v-else>{{ scope.row.courseType | courseTypeFormat }}</p>
  168. </div>
  169. </template>
  170. </el-table-column>
  171. <!-- <el-table-column
  172. align="center"
  173. prop="type"
  174. :formatter="fommatterType"
  175. label="是否赠送"
  176. ></el-table-column> -->
  177. <el-table-column align="center" prop="type" label="赠送类型">
  178. <template slot-scope="scope">
  179. <div>
  180. <p v-if="scope.row.giveCourseType">
  181. {{ scope.row.giveCourseType | courseTypeFormat }}
  182. </p>
  183. <p v-else>--</p>
  184. </div>
  185. </template>
  186. </el-table-column>
  187. <el-table-column align="center" width="150px" label="活动持续时间">
  188. <template slot-scope="scope">
  189. <div>
  190. <p>{{ scope.row.startTime }}</p>
  191. <p>{{ scope.row.endTime }}</p>
  192. </div>
  193. </template>
  194. </el-table-column>
  195. <el-table-column
  196. align="center"
  197. label="活动状态"
  198. prop="status"
  199. :formatter="fommatterStatus"
  200. ></el-table-column>
  201. <!-- <el-table-column
  202. align="center"
  203. prop="vipGroupCategoryNames"
  204. label="适用课程形式"
  205. ></el-table-column> -->
  206. <!-- <el-table-column
  207. align="center"
  208. label="适用课时类型"
  209. :formatter="fommatterCourseType"
  210. ></el-table-column>
  211. <el-table-column
  212. width="135"
  213. align="center"
  214. label="课程调整方式"
  215. :formatter="fommatterResetType"
  216. ></el-table-column>
  217. <el-table-column
  218. align="center"
  219. label="使用学员"
  220. :formatter="formatStudentType"
  221. ></el-table-column> -->
  222. <!-- <el-table-column label="结算标准">
  223. <template slot-scope="scope">
  224. <div>
  225. <p>{{ scope.row.salarySettlementJson | onlineDesc }}</p>
  226. <p>{{ scope.row.salarySettlementJson | unonlineDesc }}</p>
  227. </div>
  228. </template>
  229. </el-table-column> -->
  230. <!-- <el-table-column align="center" label="结算说明">
  231. <template slot-scope="scope">
  232. <div>
  233. <p>{{ scope.row.salarySettlementJson | onlineDesc }}</p>
  234. <p>{{ scope.row.salarySettlementJson | unonlineDesc }}</p>
  235. </div>
  236. </template>
  237. </el-table-column> -->
  238. <el-table-column
  239. align="center"
  240. label="是否启用"
  241. prop="enable"
  242. :formatter="fommatterEnable"
  243. ></el-table-column>
  244. <!-- <el-table-column align="center" width="150px" label="课程安排时间">
  245. <template slot-scope="scope">
  246. <div>
  247. <p>{{ scope.row.coursesStartTime }}</p>
  248. <p>{{ scope.row.coursesEndTime }}</p>
  249. </div>
  250. </template>
  251. </el-table-column> -->
  252. <el-table-column align="center" label="操作">
  253. <template slot-scope="scope">
  254. <div>
  255. <!-- v-if="scope.row.enable > 0" -->
  256. <el-button
  257. type="text"
  258. v-permission="'vipGroupActivity/update'"
  259. @click="look(scope.row)"
  260. >查看</el-button
  261. >
  262. <el-button
  263. v-if="
  264. scope.row.status == 'PROGRESS' &&
  265. scope.row.maxCourseNum &&
  266. scope.row.minCourseNum &&
  267. scope.row.maxCourseNum > 0 &&
  268. scope.row.minCourseNum > 0 &&
  269. scope.row.minCourseNum == scope.row.maxCourseNum
  270. "
  271. type="text"
  272. v-permission="'/activeSenior'"
  273. @click="activeManager(scope.row)"
  274. >资格管理</el-button
  275. >
  276. <el-button
  277. style="margin-left: 0px"
  278. type="text"
  279. v-permission="'vipGroupActivity/update'"
  280. @click="reset(scope.row)"
  281. >修改</el-button
  282. >
  283. <!-- <el-button
  284. style="margin-left: 0px"
  285. v-if="!scope.row.enable && scope.row.status == 'PROGRESS'"
  286. type="text"
  287. v-permission="'vipGroupActivity/enable'"
  288. @click="resetStatus(scope.row)"
  289. >启用</el-button
  290. >
  291. <el-button
  292. v-if="scope.row.enable && scope.row.status == 'PROGRESS'"
  293. style="margin-left: 0px"
  294. type="text"
  295. v-permission="'vipGroupActivity/enable'"
  296. @click="resetStatus(scope.row)"
  297. >停用</el-button
  298. > -->
  299. <!-- <el-button type='text'
  300. @click="remove(scope.row)">删除</el-button>-->
  301. <el-popover
  302. placement="top"
  303. width="160"
  304. v-permission="'vipGroupActivity/delete'"
  305. :ref="scope.$index"
  306. v-if="scope.row.status != 'PROGRESS'"
  307. >
  308. <p>确定删除?</p>
  309. <div style="text-align: right; margin: 0">
  310. <el-button
  311. type="text"
  312. @click="scope._self.$refs[scope.$index].doClose()"
  313. >取消</el-button
  314. >
  315. <el-button type="primary" @click="remove(scope)"
  316. >确定</el-button
  317. >
  318. </div>
  319. <el-button type="text" slot="reference">删除</el-button>
  320. </el-popover>
  321. </div>
  322. </template>
  323. </el-table-column>
  324. </el-table>
  325. <!-- 分页器 -->
  326. <pagination
  327. :total.sync="rules.total"
  328. sync
  329. :page.sync="rules.page"
  330. :limit.sync="rules.limit"
  331. :page-sizes="rules.page_size"
  332. @pagination="getList"
  333. />
  334. </div>
  335. </div>
  336. </div>
  337. </template>
  338. <script>
  339. const MIN_NUMBER = 1;
  340. const MAX_NUMBER = 999;
  341. import pagination from "@/components/Pagination/index";
  342. import {
  343. vipGroupActivity,
  344. removeVipActive,
  345. enableVipGroupActivity,
  346. } from "@/api/vipSeting";
  347. import ExportChiose from "@/components/Export-chiose";
  348. import qs from "qs";
  349. import { Export } from "@/utils/downLoadFile";
  350. import cleanDeep from "clean-deep";
  351. import { vipResetTypeList } from "@/utils/searchArray";
  352. export default {
  353. name: "vipActiveList",
  354. components: { pagination, ExportChiose },
  355. data() {
  356. return {
  357. vipResetTypeList,
  358. labelPosition: "right",
  359. tableList: [],
  360. rules: {
  361. // 分页规则
  362. limit: 10, // 限制显示条数
  363. page: 1, // 当前页
  364. total: 0, // 总条数
  365. page_size: [10, 20, 40, 50], // 选择限制显示条数
  366. },
  367. searchForm: {
  368. organId: null,
  369. enable: null,
  370. search: "",
  371. applyToStudentType: null,
  372. allowOnlineToOffline: null,
  373. status: null,
  374. activityChannel: null,
  375. },
  376. dialogVisible: false,
  377. };
  378. },
  379. // created() {
  380. // this.init();
  381. // },
  382. // activated() {
  383. // this.init();
  384. // },
  385. mounted() {
  386. this.init();
  387. },
  388. filters: {
  389. onlinePip(val) {
  390. let obj = JSON.parse(val);
  391. // debugger;
  392. if (
  393. obj &&
  394. obj.onlineSalarySettlement &&
  395. obj.onlineSalarySettlement.salarySettlementType
  396. ) {
  397. switch (obj.onlineSalarySettlement.salarySettlementType) {
  398. case "RATIO_DISCOUNT": {
  399. return "线上:比例结算";
  400. break;
  401. }
  402. case "TEACHER_DEFAULT": {
  403. return "线上:老师默认";
  404. break;
  405. }
  406. case "FIXED_SALARY": {
  407. return "线上:固定课酬";
  408. break;
  409. }
  410. }
  411. }
  412. },
  413. unonlinePip(val) {
  414. let obj = JSON.parse(val);
  415. if (
  416. obj &&
  417. obj.offlineSalarySettlement &&
  418. obj.offlineSalarySettlement.salarySettlementType
  419. ) {
  420. switch (obj.offlineSalarySettlement.salarySettlementType) {
  421. case "RATIO_DISCOUNT": {
  422. return "线下:比例结算";
  423. break;
  424. }
  425. case "TEACHER_DEFAULT": {
  426. return "线下:老师默认";
  427. break;
  428. }
  429. case "FIXED_SALARY": {
  430. return "线下:固定课酬";
  431. break;
  432. }
  433. }
  434. }
  435. },
  436. onlineDesc(val) {
  437. let obj = JSON.parse(val);
  438. // debugger;
  439. if (
  440. obj &&
  441. obj.onlineSalarySettlement &&
  442. obj.onlineSalarySettlement.salarySettlementType
  443. ) {
  444. switch (obj.onlineSalarySettlement.salarySettlementType) {
  445. case "RATIO_DISCOUNT": {
  446. if (obj.onlineSalarySettlement.settlementValue) {
  447. return `线上:比例结算${obj.onlineSalarySettlement.settlementValue}%`;
  448. } else {
  449. return "线上:比例结算";
  450. }
  451. break;
  452. }
  453. case "TEACHER_DEFAULT": {
  454. return "线上:默认课酬";
  455. break;
  456. }
  457. case "FIXED_SALARY": {
  458. if (obj.onlineSalarySettlement.settlementValue) {
  459. return `线上:固定课酬${obj.onlineSalarySettlement.settlementValue}/次`;
  460. } else {
  461. return "线上:固定课酬";
  462. }
  463. break;
  464. }
  465. }
  466. }
  467. },
  468. unonlineDesc(val) {
  469. let obj = JSON.parse(val);
  470. if (
  471. obj &&
  472. obj.offlineSalarySettlement &&
  473. obj.offlineSalarySettlement.salarySettlementType
  474. ) {
  475. switch (obj.offlineSalarySettlement.salarySettlementType) {
  476. case "RATIO_DISCOUNT": {
  477. if (obj.offlineSalarySettlement.settlementValue) {
  478. return `线下:比例结算${obj.offlineSalarySettlement.settlementValue}%`;
  479. } else {
  480. return "线下:比例结算";
  481. }
  482. break;
  483. }
  484. case "TEACHER_DEFAULT": {
  485. return "线下:默认课酬";
  486. break;
  487. }
  488. case "FIXED_SALARY": {
  489. if (obj.offlineSalarySettlement.settlementValue) {
  490. return `线下:固定课酬${obj.offlineSalarySettlement.settlementValue}/次`;
  491. } else {
  492. return "线下:固定课酬";
  493. }
  494. break;
  495. }
  496. }
  497. }
  498. },
  499. },
  500. methods: {
  501. async init() {
  502. // 获取类型
  503. await this.$store.dispatch("setVipGroupCategory");
  504. // 获取分部
  505. await this.$store.dispatch("setBranchs");
  506. this.getList();
  507. },
  508. // 导出
  509. async onExport() {
  510. const { ...rest } = this.searchForm;
  511. let obj = {
  512. ...rest,
  513. page: this.rules.page,
  514. rows: this.rules.limit,
  515. };
  516. await Export(
  517. this,
  518. {
  519. url: "/api-web/export/vipGroupActivity",
  520. fileName: "活动列表.xls",
  521. method: "post",
  522. params: qs.stringify(cleanDeep(obj)),
  523. },
  524. "您确定活动列表?"
  525. );
  526. },
  527. loadNumber(event) {
  528. var el = event.currentTarget;
  529. var elValue = el.value;
  530. var reg = /^((?!0)\d{1,2}|100)$/;
  531. if (!elValue.match(reg)) {
  532. elValue = "";
  533. return false;
  534. } else {
  535. return true;
  536. }
  537. },
  538. onCheckAllBranch() {
  539. // 适用所有分部
  540. this.resetForm.organ = [];
  541. this.organList.forEach((item) => {
  542. this.resetForm.organ.push(item.id);
  543. });
  544. },
  545. search() {
  546. this.rules.page = 1;
  547. this.getList();
  548. },
  549. onReset() {
  550. // this.searchForm = {
  551. // enable: null,
  552. // search: null,
  553. // organId: null,
  554. // }
  555. this.$refs["searchForm"].resetFields();
  556. this.search();
  557. },
  558. getList() {
  559. let enable = this.searchForm.enable;
  560. let search = this.searchForm.search;
  561. vipGroupActivity({
  562. organId: this.searchForm.organId,
  563. applyToStudentType: this.searchForm.applyToStudentType,
  564. allowOnlineToOffline: this.searchForm.allowOnlineToOffline,
  565. rows: this.rules.limit,
  566. page: this.rules.page,
  567. status: this.searchForm.status,
  568. activityChannel: this.searchForm.activityChannel,
  569. enable,
  570. search,
  571. }).then((res) => {
  572. if (res.code == 200) {
  573. this.tableList = res.data.rows;
  574. this.rules.total = res.data.total;
  575. }
  576. });
  577. },
  578. resetEnable(val) {
  579. val = null;
  580. },
  581. // 格式化活动类型
  582. fommatterType(row, column) {
  583. switch (row.type) {
  584. case "BASE_ACTIVITY": {
  585. return "基础";
  586. break;
  587. }
  588. case "DISCOUNT": {
  589. return "折扣";
  590. break;
  591. }
  592. case "GIVE_CLASS": {
  593. if (row.giveClassPaySalaryFlag) {
  594. return "买赠(赠课结算)";
  595. } else {
  596. return "买赠(不结算)";
  597. }
  598. break;
  599. }
  600. }
  601. },
  602. // 格式化课时类型
  603. fommatterCourseType(row) {
  604. let date = JSON.parse(row.salarySettlementJson);
  605. let str = "";
  606. if (date && date.onlineSalarySettlement) {
  607. str += "线上 ";
  608. }
  609. if (date && date.offlineSalarySettlement) {
  610. str += "线下";
  611. }
  612. return str;
  613. },
  614. fommatterResetType(row) {
  615. let str = null;
  616. if (row.allowOnlineToOffline == 1) {
  617. str = "无限制";
  618. }
  619. if (row.allowOnlineToOffline == 0) {
  620. str = "线上不可转线下";
  621. }
  622. if (row.allowOnlineToOffline == 2) {
  623. str = "线下不可调为线上";
  624. }
  625. if (row.allowOnlineToOffline == 3) {
  626. str = "线上线下不可互调";
  627. }
  628. return str;
  629. },
  630. formatStudentType(row) {
  631. let str = null;
  632. if (row.applyToStudentType == -1) {
  633. str = "所有学员";
  634. }
  635. if (row.applyToStudentType == 0) {
  636. str = "老学员";
  637. }
  638. if (row.applyToStudentType == 1) {
  639. str = "新学员";
  640. }
  641. return str;
  642. },
  643. // 格式化启用状态
  644. fommatterEnable(row) {
  645. switch (row.enable) {
  646. case false: {
  647. return "否";
  648. break;
  649. }
  650. case true: {
  651. return "是";
  652. break;
  653. }
  654. }
  655. },
  656. // 格式化Status
  657. fommatterStatus(row) {
  658. switch (row.status) {
  659. case "PROGRESS": {
  660. return "正式";
  661. break;
  662. }
  663. case "DRAFT": {
  664. return "草稿";
  665. break;
  666. }
  667. }
  668. },
  669. // 点击列表修改同步状态
  670. reset(row) {
  671. this.$router.push(
  672. {
  673. path: "/operateManager/vipNewActive?type=reset",
  674. query: { id: row.id },
  675. },
  676. (router) => {
  677. router.meta.title = "修改活动方案";
  678. }
  679. );
  680. },
  681. look(row) {
  682. this.$router.push({
  683. path: "/operateManager/vipNewActive?type=look",
  684. query: { id: row.id },
  685. });
  686. },
  687. // 活动资格管理
  688. activeManager(row) {
  689. this.$router.push({
  690. path: "/operateManager/activeSenior",
  691. query: { id: row.id },
  692. });
  693. },
  694. // 点击确认按钮发送修改请求
  695. remove(scope) {
  696. let id = scope.row.id;
  697. removeVipActive({ id }).then((res) => {
  698. if (res.code == 200) {
  699. this.$message.success("恭喜您删除成功");
  700. this.getList();
  701. }
  702. scope._self.$refs[scope.$index].doClose();
  703. });
  704. },
  705. gotoNewActive() {
  706. // 带参数 searchForm: { organId: null } 搜索条件
  707. // let rules = JSON.stringify(this.rules);
  708. // let searchForm = JSON.stringify(this.searchForm);
  709. this.$router.push(
  710. {
  711. path: "/operateManager/vipNewActive?type=create",
  712. // query: { rules, searchForm },
  713. },
  714. (router) => {
  715. router.meta.title = "新建活动方案";
  716. }
  717. );
  718. },
  719. closeVipform() {
  720. this.$refs["vipform"].resetFields();
  721. this.dialogVisible = false;
  722. },
  723. resetForms() {
  724. this.$refs.form.resetFields();
  725. },
  726. handleMinChange() {
  727. this.$refs.form.validateField("maxCourseNum");
  728. },
  729. handleMaxChange() {
  730. this.$refs.form.validateField("minCourseNum");
  731. },
  732. validateCom(rule, value, callback) {
  733. const one = Number(value);
  734. if (Number.isInteger(one)) {
  735. if (one < MIN_NUMBER) {
  736. return callback(new Error("输入值必须大于0"));
  737. } else if (one > MAX_NUMBER) {
  738. return callback(new Error("输入值必须小于999"));
  739. }
  740. return callback();
  741. }
  742. return callback(new Error("输入值必须为正整数"));
  743. },
  744. validateMin(rule, value, callback) {
  745. const one = Number(value);
  746. const max = Number(this.courseNumForm.maxCourseNum);
  747. if (!max || one <= max) {
  748. return callback();
  749. }
  750. return callback(new Error("输入值不得大于最大课时数"));
  751. },
  752. validateMax(rule, value, callback) {
  753. const one = Number(value);
  754. const min = Number(this.courseNumForm.minCourseNum);
  755. if (!min || one >= min) {
  756. return callback();
  757. }
  758. return callback(new Error("输入值不得小于最小课时数"));
  759. },
  760. resetStatus(row) {
  761. let tempString = row.enable ? "停用" : "启用";
  762. this.$confirm(`是否${tempString}该活动?`, "提示", {
  763. confirmButtonText: "确定",
  764. cancelButtonText: "取消",
  765. type: "warning",
  766. })
  767. .then(() => {
  768. enableVipGroupActivity({ id: row.id }).then((res) => {
  769. if (res.code == 200) {
  770. this.$message.success("操作成功");
  771. this.getList();
  772. }
  773. });
  774. })
  775. .catch(() => {});
  776. },
  777. },
  778. };
  779. </script>
  780. <style lang="scss" scoped>
  781. .btnList {
  782. display: flex;
  783. flex-direction: row;
  784. align-items: center;
  785. }
  786. .activeType {
  787. .right {
  788. .el-input {
  789. width: 150px !important;
  790. }
  791. }
  792. }
  793. .activeRange {
  794. display: flex;
  795. flex-direction: row;
  796. justify-content: flex-start;
  797. .left {
  798. height: 72px;
  799. line-height: 72px;
  800. }
  801. .right {
  802. .chioseWrap {
  803. display: flex;
  804. flex-direction: row;
  805. justify-content: flex-start;
  806. height: 72px;
  807. line-height: 72px;
  808. align-items: center;
  809. .el-checkbox {
  810. margin-right: 20px;
  811. }
  812. .el-select {
  813. margin-right: 20px;
  814. }
  815. }
  816. }
  817. }
  818. .activeType {
  819. display: flex;
  820. flex-direction: row;
  821. justify-content: flex-start;
  822. .left {
  823. margin-right: 20px;
  824. p {
  825. height: 40px;
  826. line-height: 40px;
  827. }
  828. }
  829. .right {
  830. > div {
  831. display: flex;
  832. flex-direction: row;
  833. justify-content: flex-start;
  834. height: 40px;
  835. line-height: 40px;
  836. margin-bottom: 20px;
  837. .head {
  838. width: 120px;
  839. height: 40px;
  840. line-height: 40px;
  841. border: 1px solid #ccc;
  842. text-align: center;
  843. border-radius: 5px;
  844. cursor: pointer;
  845. margin-right: 10px;
  846. }
  847. > .head.active {
  848. background-color: var(--color-primary);
  849. color: #fff;
  850. border: none;
  851. }
  852. .title {
  853. line-height: 40px;
  854. height: 40px;
  855. }
  856. }
  857. }
  858. }
  859. .vipform {
  860. .el-select {
  861. width: 400px !important;
  862. .el-input__inner {
  863. width: 400px;
  864. }
  865. }
  866. }
  867. .ishidden {
  868. visibility: hidden;
  869. }
  870. </style>