Coupon.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. <template>
  2. <ContainerQuery>
  3. <div slot="tip" class="page-tip-div" style="margin-top: 0">
  4. <i class="el-icon-info"></i>
  5. 温馨提示: 1、优惠券新增审核后,无法删除,请慎重审核!
  6. 2、优惠券可进行上下架操作,新增的审核后默认上架状态,下架后已领取的可以继续使用,未领取的就无法领取了,在商城也不显示!
  7. </div>
  8. <div
  9. v-if="$accessCheck($Access.CouponListAdd)"
  10. slot="left"
  11. class="clearfix"
  12. >
  13. <el-button
  14. type="primary"
  15. size="small"
  16. @click="$router.push('/Marketing/MarketingList/AddCoupon')"
  17. >
  18. 新增优惠券
  19. </el-button>
  20. </div>
  21. <div v-if="$accessCheck($Access.CouponListSearch)" slot="more">
  22. <el-form :inline="true" size="small" style="margin-bottom: 0">
  23. <el-form-item>
  24. <el-input
  25. v-model="search_form.name"
  26. placeholder="优惠券名称"
  27. clearable
  28. style="width: 220px"
  29. @keyup.enter.native="pageChange(1)"
  30. @clear="pageChange(1)"
  31. >
  32. <el-button
  33. slot="append"
  34. icon="el-icon-search"
  35. @click="pageChange(1)"
  36. ></el-button>
  37. </el-input>
  38. </el-form-item>
  39. <el-form-item>
  40. <SelectShop
  41. v-model="search_form.useShop"
  42. width="150"
  43. placeholder="选择商铺"
  44. @clear="clearShop"
  45. @change="selShop"
  46. />
  47. </el-form-item>
  48. <el-form-item>
  49. <el-select
  50. v-model="search_form.status"
  51. clearable
  52. style="width: 150px"
  53. placeholder="优惠券状态"
  54. @clear="delSeach('status')"
  55. @change="pageChange(1)"
  56. >
  57. <el-option
  58. v-for="item in Coupon_status"
  59. :key="item.value"
  60. :label="item.label"
  61. :value="item.value"
  62. ></el-option>
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item>
  66. <el-select
  67. v-model="search_form.applyRange"
  68. clearable
  69. style="width: 150px"
  70. placeholder="商品范围"
  71. @clear="delSeach('applyRange')"
  72. @change="pageChange(1)"
  73. >
  74. <el-option
  75. v-for="item in applyList"
  76. :key="item.value"
  77. :label="item.label"
  78. :value="item.value"
  79. ></el-option>
  80. </el-select>
  81. </el-form-item>
  82. <el-form-item>
  83. <el-select
  84. v-model="search_form.grantType"
  85. clearable
  86. style="width: 150px"
  87. placeholder="发放方式"
  88. @clear="delSeach('grantType')"
  89. @change="pageChange(1)"
  90. >
  91. <el-option
  92. v-for="item in typeList"
  93. :key="item.value"
  94. :label="item.label"
  95. :value="item.value"
  96. ></el-option>
  97. </el-select>
  98. </el-form-item>
  99. <el-form-item>
  100. <el-date-picker
  101. v-model="search_form.time"
  102. type="daterange"
  103. range-separator="-"
  104. start-placeholder="开始日期"
  105. end-placeholder="结束日期"
  106. @change="LocationFrom"
  107. ></el-date-picker>
  108. </el-form-item>
  109. </el-form>
  110. </div>
  111. <el-table :data="coupon_list">
  112. <el-table-column
  113. prop="name"
  114. label="名称"
  115. min-width="180"
  116. fixed="left"
  117. ></el-table-column>
  118. <el-table-column prop="startTime" label="领取" min-width="260">
  119. <template slot-scope="scope">
  120. <p class="order-info-p">
  121. <span class="order-info-label">有效期:</span>
  122. <span v-if="scope.row.couponType === 20">领取后30天内有效</span>
  123. <span v-else>
  124. {{ $_common.formatDate(scope.row.startTime, "yyyy/MM/dd") }} -
  125. {{ $_common.formatDate(scope.row.endTime, "yyyy/MM/dd") }}
  126. </span>
  127. </p>
  128. <p class="order-info-p">
  129. <span class="order-info-label">每人领取:</span>
  130. {{ scope.row.allowNum }}张
  131. </p>
  132. </template>
  133. </el-table-column>
  134. <el-table-column prop="grantStartTime" label="发放" min-width="260">
  135. <template slot-scope="scope">
  136. <p class="order-info-p">
  137. <span class="order-info-label">发放日期:</span>
  138. <span v-if="scope.row.couponType === 20">不限时间</span>
  139. <span v-else>
  140. {{ $_common.formatDate(scope.row.grantStartTime, "yyyy/MM/dd") }}
  141. - {{ $_common.formatDate(scope.row.grantEndTime, "yyyy/MM/dd") }}
  142. </span>
  143. </p>
  144. <p class="order-info-p">
  145. <span class="order-info-label">商品范围:</span>
  146. {{
  147. scope.row.applyRange === 10
  148. ? "全部商品"
  149. : scope.row.applyRange === 20
  150. ? "指定分类"
  151. : scope.row.applyRange === 30
  152. ? "指定品牌"
  153. : scope.row.applyRange === 40
  154. ? "指定商品"
  155. : "其他"
  156. }}
  157. </p>
  158. <p class="order-info-p">
  159. <span class="order-info-label">发放方式:</span>
  160. {{
  161. scope.row.grantType === 10
  162. ? "主动领取"
  163. : scope.row.grantType === 20
  164. ? "定向发放"
  165. : scope.row.grantType === 30
  166. ? "注册领取"
  167. : scope.row.grantType === 40
  168. ? "在线支付赠送"
  169. : scope.row.grantType === 50
  170. ? "开卡赠送"
  171. : ""
  172. }}
  173. </p>
  174. </template>
  175. </el-table-column>
  176. <el-table-column
  177. v-if="faceValueFlag"
  178. prop="reducePrice"
  179. label="面值"
  180. min-width="120"
  181. >
  182. <template slot-scope="scope">
  183. {{ $_common.formattedNumber(scope.row.reducePrice) }}
  184. </template>
  185. </el-table-column>
  186. <el-table-column
  187. v-if="mutualExclusionFlag"
  188. prop="isMutex"
  189. label="是否互斥"
  190. min-width="120"
  191. >
  192. <template slot-scope="scope">
  193. <span v-if="scope.row.isMutex === 4" class="info-status">否</span>
  194. <span v-else class="warning-status">是</span>
  195. </template>
  196. </el-table-column>
  197. <el-table-column
  198. v-if="thresholdFlag"
  199. prop="minPrice"
  200. label="使用门槛"
  201. min-width="100"
  202. >
  203. <template slot-scope="scope">
  204. {{
  205. Number(scope.row.minPrice) === 0
  206. ? "无门槛"
  207. : $_common.formattedNumber(scope.row.minPrice)
  208. }}
  209. </template>
  210. </el-table-column>
  211. <el-table-column
  212. v-if="quantityFlag"
  213. prop="totalNum"
  214. label="数量"
  215. min-width="160"
  216. >
  217. <template slot-scope="scope">
  218. <p class="order-info-p">
  219. <span class="order-info-label">合计发放:</span>
  220. {{ scope.row.totalNum || "0" }}张
  221. </p>
  222. <p class="order-info-p">
  223. <span class="order-info-label">已发放:</span>
  224. {{ scope.row.receiveNum }}张
  225. </p>
  226. <p class="order-info-p">
  227. <span class="order-info-label">剩余:</span>
  228. {{ scope.row.couponType === 20 ? "0" : scope.row.usableNum }}张
  229. </p>
  230. </template>
  231. </el-table-column>
  232. <el-table-column
  233. v-if="stateFlag"
  234. align="left"
  235. label="审核状态"
  236. min-width="120"
  237. >
  238. <template slot-scope="scope">
  239. <span v-if="scope.row.auditStatus === 1" class="warning-status">
  240. 待审核
  241. </span>
  242. <span v-else class="success-status">已审核</span>
  243. </template>
  244. </el-table-column>
  245. <el-table-column
  246. v-if="stateFlag"
  247. align="left"
  248. label="启用状态"
  249. min-width="120"
  250. >
  251. <template slot-scope="scope">
  252. <el-switch
  253. v-model="scope.row.enableStatus"
  254. class="switchStyle"
  255. active-color="#36B365"
  256. :active-value="5"
  257. :inactive-value="4"
  258. active-text="启用"
  259. inactive-text="禁用"
  260. @change="updateEnableStatus($event, scope.row)"
  261. ></el-switch>
  262. </template>
  263. </el-table-column>
  264. <el-table-column label="操作" fixed="right" min-width="220">
  265. <template slot="header" slot-scope="scope">
  266. <span v-if="false">{{ scope.$index }}</span>
  267. <span>操作</span>
  268. <el-popover popper-class="custom-table-checkbox" trigger="click">
  269. <el-checkbox-group v-model="checkList">
  270. <el-checkbox
  271. v-for="(item, index) in columns"
  272. :key="index"
  273. :label="item.label"
  274. @change="change"
  275. ></el-checkbox>
  276. </el-checkbox-group>
  277. <el-button
  278. slot="reference"
  279. icon="el-icon-setting"
  280. type="text"
  281. ></el-button>
  282. </el-popover>
  283. </template>
  284. <template slot-scope="scope">
  285. <el-button
  286. v-if="$accessCheck($Access.CouponListUpdateAuditStatus)"
  287. :disabled="scope.row.auditStatus === 2"
  288. type="text"
  289. @click="updateAuditStatusMarket(scope.row)"
  290. >
  291. 审核
  292. </el-button>
  293. <el-button
  294. v-if="$accessCheck($Access.CouponListEdit)"
  295. :disabled="
  296. scope.row.auditStatus === 2 && scope.row.enableStatus === 5
  297. "
  298. type="text"
  299. @click="
  300. $router.push(
  301. `/Marketing/MarketingList/EditCoupon/${scope.row.id}`
  302. )
  303. "
  304. >
  305. 编辑
  306. </el-button>
  307. <el-button
  308. v-if="$accessCheck($Access.CouponListDel)"
  309. :disabled="
  310. scope.row.auditStatus === 2 && scope.row.enableStatus === 5
  311. "
  312. type="text"
  313. @click="delData(scope.row.id)"
  314. >
  315. 删除
  316. </el-button>
  317. </template>
  318. </el-table-column>
  319. </el-table>
  320. <FooterPage
  321. :page-size="pageSize"
  322. :total-page.sync="total"
  323. :current-page.sync="page"
  324. @pageChange="pageChange"
  325. @sizeChange="sizeChange"
  326. ></FooterPage>
  327. </ContainerQuery>
  328. </template>
  329. <script>
  330. import SelectShop from "@/component/goods/SelectShop.vue";
  331. import {
  332. getAll,
  333. searchMarket,
  334. CouponUpdateEnableStatus,
  335. updateAuditStatusMarket,
  336. delMarket,
  337. } from "@/api/Market";
  338. export default {
  339. name: "Coupon",
  340. components: {
  341. SelectShop,
  342. },
  343. data() {
  344. return {
  345. coupon_list: [],
  346. pageSize: 10,
  347. page: 1,
  348. total: 0,
  349. useShopName: "",
  350. typeList: [
  351. { value: 10, label: "主动领取" },
  352. { value: 20, label: "定向发放" },
  353. { value: 30, label: "邀约注册" },
  354. { value: 40, label: "注册既享" },
  355. ],
  356. Coupon_status: [
  357. {
  358. label: "已审核",
  359. value: 2,
  360. },
  361. {
  362. label: "待审核",
  363. value: 1,
  364. },
  365. ],
  366. applyList: [
  367. {
  368. label: "全部商品",
  369. value: 10,
  370. },
  371. {
  372. label: "指定分类",
  373. value: 20,
  374. },
  375. {
  376. label: "指定品牌",
  377. value: 30,
  378. },
  379. {
  380. label: "指定商品",
  381. value: 40,
  382. },
  383. ],
  384. search_form: {
  385. name: "",
  386. shopName: "", // 店铺名称
  387. useShop: "", // 店铺名称
  388. applyRange: "",
  389. grantType: "",
  390. start: "", // 时间
  391. end: "",
  392. status: "",
  393. },
  394. topData: {},
  395. checkList: [
  396. "面值",
  397. "是否互斥",
  398. "使用门槛",
  399. "数量",
  400. "审核状态",
  401. "启用状态",
  402. ],
  403. columns: [
  404. {
  405. label: "面值",
  406. },
  407. {
  408. label: "是否互斥",
  409. },
  410. {
  411. label: "使用门槛",
  412. },
  413. {
  414. label: "数量",
  415. },
  416. {
  417. label: "审核状态",
  418. },
  419. {
  420. label: "启用状态",
  421. },
  422. ],
  423. faceValueFlag: true,
  424. mutualExclusionFlag: true,
  425. thresholdFlag: true,
  426. quantityFlag: true,
  427. stateFlag: true,
  428. grantFlag: true,
  429. };
  430. },
  431. created() {
  432. this.getData();
  433. },
  434. activated() {
  435. if (this.$_isInit()) return;
  436. this.getData();
  437. },
  438. methods: {
  439. delSeach(val) {
  440. if (val === "grantType") {
  441. this.search_form.grantType = "";
  442. this.pageChange(1);
  443. } else if (val === "applyRange") {
  444. this.search_form.applyRange = "";
  445. this.pageChange(1);
  446. } else {
  447. this.search_form.status = "";
  448. this.pageChange(1);
  449. }
  450. },
  451. // 获取列表
  452. async getAll() {
  453. const { data, pageTotal } = await getAll({
  454. page: this.page,
  455. pageSize: this.pageSize,
  456. });
  457. this.coupon_list = data;
  458. this.total = pageTotal;
  459. },
  460. // 搜索
  461. async searchMarket() {
  462. const { data, pageTotal } = await searchMarket({
  463. page: this.page,
  464. pageSize: this.pageSize,
  465. auditStatus: this.search_form.status,
  466. grantType: this.search_form.grantType,
  467. applyRange: this.search_form.applyRange,
  468. useShop: this.search_form.useShop,
  469. name: this.search_form.name,
  470. start: this.search_form.start,
  471. end: this.search_form.end,
  472. });
  473. this.coupon_list = data;
  474. this.total = pageTotal;
  475. },
  476. getData() {
  477. const isKey = this.$_common.isSerch(this.search_form);
  478. if (isKey) {
  479. this.searchMarket();
  480. } else {
  481. this.getAll();
  482. }
  483. },
  484. // 审核
  485. async updateEnableStatus(val, row) {
  486. try {
  487. const data = await CouponUpdateEnableStatus({
  488. id: row.id,
  489. enableStatus: val,
  490. });
  491. this.$message({
  492. type: "success",
  493. message: "操作成功!",
  494. });
  495. } catch (e) {
  496. this.getData();
  497. }
  498. },
  499. // 审核
  500. async updateAuditStatusMarket(row) {
  501. this.$confirm("确定审核此优惠券吗?", "提示", {
  502. confirmButtonText: "确定",
  503. cancelButtonText: "取消",
  504. type: "warning",
  505. }).then(async () => {
  506. const data = await updateAuditStatusMarket({
  507. id: row.id,
  508. auditStatus: 2,
  509. });
  510. this.getData();
  511. this.$message({
  512. type: "success",
  513. message: "审核成功!",
  514. });
  515. });
  516. },
  517. // 删除
  518. async delData(id) {
  519. this.$confirm("确定删除此优惠券吗?", "提示", {
  520. confirmButtonText: "确定",
  521. cancelButtonText: "取消",
  522. type: "warning",
  523. }).then(async () => {
  524. const data = await delMarket(id);
  525. this.getData();
  526. this.$message({
  527. type: "success",
  528. message: "删除成功!",
  529. });
  530. });
  531. },
  532. clearShop() {
  533. this.search_form.useShop = "";
  534. this.pageChange(1);
  535. },
  536. selShop(val, row) {
  537. this.pageChange(1);
  538. },
  539. // 时间
  540. LocationFrom(val) {
  541. if (val && val.length) {
  542. this.search_form.start = val[0] / 1000;
  543. this.search_form.end = val[1] / 1000 + 86399;
  544. } else {
  545. this.search_form.start = "";
  546. this.search_form.end = "";
  547. }
  548. this.pageChange(1);
  549. },
  550. pageChange(page) {
  551. this.page = page;
  552. this.getData();
  553. },
  554. sizeChange(size) {
  555. this.pageSize = size;
  556. this.pageChange(1);
  557. },
  558. change() {
  559. this.faceValueFlag = this.checkList.some((item) => item === "面值");
  560. this.mutualExclusionFlag = this.checkList.some(
  561. (item) => item === "是否互斥"
  562. );
  563. this.thresholdFlag = this.checkList.some((item) => item === "使用门槛");
  564. this.quantityFlag = this.checkList.some((item) => item === "数量");
  565. this.stateFlag = this.checkList.some((item) => item === "审核状态");
  566. this.grantFlag = this.checkList.some((item) => item === "启用状态");
  567. },
  568. },
  569. };
  570. </script>
  571. <style scoped lang="scss">
  572. .num-ul {
  573. padding-bottom: 10px;
  574. padding-left: 10px;
  575. }
  576. .num-ul > li {
  577. padding-right: 10px;
  578. }
  579. .order-info-p {
  580. height: auto;
  581. padding-bottom: 0;
  582. }
  583. .custom-table-checkbox {
  584. .el-checkbox {
  585. display: block !important;
  586. margin: 0 05px 0;
  587. }
  588. }
  589. </style>