index.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <!-- 优惠码 -->
  3. <div class="discountCodePage flex-col">
  4. <s-header :name="$t('discountCode.discountCode')" :noback="false"></s-header>
  5. <div class="discountCodeBox flex-col">
  6. <van-list v-model:loading="loading" v-model:error="error" :error-text="$t('public.requestFailed')"
  7. :finished="finished" :finished-text="$t('public.noMore')" offset="300" :immediate-check="false" @load="onLoad">
  8. <div class="searchRow flex-row justify-between">
  9. <div class="flex-col">
  10. <div class="flex-row justify-between bd3">
  11. <div class="flex-col outer4"></div>
  12. <span class="flex-col txt2">{{ $t('discountCode.total') }}<span class="discountNumber">{{ discountCodeTotal
  13. }}</span>{{ $t('discountCode.discountCodesInTotal') }}</span>
  14. </div>
  15. </div>
  16. <div class="flex-col">
  17. <div class="main5 flex-row justify-between" @click="searchClick">
  18. <img class="label2" src="../../assets/device/searchIcon.png" />
  19. <div class="TextGroup2 flex-col">
  20. <span class="txt3">{{ $t('discountCode.search') }}</span>
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. <div class="tabButtomBox flex-row">
  26. <div class="tabBox flex-row">
  27. <span :class="{ active: isUse === '0' }" @click="setIsUse('0')">{{ $t('discountCode.notUsed') }}</span>
  28. <span :class="{ active: isUse === '1' }" @click="setIsUse('1')">{{ $t('discountCode.used') }}</span>
  29. </div>
  30. <div class="buttomBox flex-row">
  31. <div class="buttonItem" @click="exportClick()">{{ $t('discountCode.export') }}&gt;</div>
  32. <div class="buttonItem" @click="payCode()">{{ $t('discountCode.apply') }}&gt;</div>
  33. </div>
  34. </div>
  35. <div class="intervalRow"></div>
  36. <div class="listBox">
  37. <div v-for="(item, index) in discountCodeList" :key="index" class="listItem" @click="disCountCodeClick(item)">
  38. <div class="itemBox">
  39. <div class="itemRow"><span class="itemTitle">{{ $t('discountCode.discountCode') }}:&nbsp;</span>{{ item.code
  40. }}<span class="itemTitle discount">{{ $t('discountCode.discount') }}:&nbsp;</span>{{ item.discount }}
  41. </div>
  42. <div class="itemRow"><span class="itemTitle">{{ $t('discountCode.creationTime') }}:&nbsp;</span>{{
  43. showDateTime(item.createDate) }}</div>
  44. <div class="itemRow" v-if="item.isUse !== '0'"><span class="itemTitle">{{ $t('discountCode.usageTime') }}:&nbsp;</span>{{
  45. showDateTime(item.useDate) }}</div>
  46. <div class="itemRow"><span class="itemTitle">{{ $t('discountCode.termOfValidity') }}:&nbsp;</span>{{
  47. showDate(item.lastUseDate) }} <span v-if="item.isUse === '0' && isExpired(item.lastUseDate)">{{ $t('discountCode.expired') }}</span></div>
  48. <div class="itemRow" v-if="item.isUse !== '0'"><span class="itemTitle">{{ $t('discountCode.usingTheMachine') }}:&nbsp;</span>{{
  49. item.useBy }}</div>
  50. </div>
  51. <div class="tipBox" v-if="item.isUse === '0'">{{ $t('discountCode.notUsed') }}</div>
  52. <div class="tipBox isUseTip" v-if="item.isUse === '1'">{{ $t('discountCode.used') }}</div>
  53. </div>
  54. </div>
  55. </van-list>
  56. </div>
  57. <codeSearch ref="searchRef" @search="search($event)"></codeSearch>
  58. </div>
  59. </template>
  60. <script>
  61. import { onMounted, reactive, toRefs, ref } from "vue";
  62. import sHeader from "@/components/SimpleHeader";
  63. import { getdiscountCodeList, discountCodeExport } from "@/service/discountCode";
  64. import { showFailToast } from "vant";
  65. import { getLoginUser, $M_ExportFile, styleUrl } from "@/common/js/utils";
  66. import codeSearch from './codeSearch.vue';
  67. import dateUtil from "@/utils/dateUtil";
  68. import { useRouter } from "vue-router";
  69. export default {
  70. setup() {
  71. const router = useRouter();
  72. const searchRef = ref(null);
  73. const loading = ref(false); // 加载状态
  74. const error = ref(false); // 错误状态
  75. const finished = ref(false); // 结束翻页状态
  76. const discountCodeList = ref([]); // 列表集合
  77. const discountCodeTotal = ref(0); // 列表总数
  78. let searchParams = reactive({
  79. adminId: "", // 用户账户id
  80. current: 1, // 页数
  81. size: 20, // 页大小
  82. isUse: '0', // 是否使用,0:未使用;1:已使用
  83. // type: null // 优惠码类型 0或null:折扣优惠码;1:抵扣价优惠码
  84. });
  85. // 初始化页面获取列表
  86. onMounted(async () => {
  87. //加载样式
  88. styleUrl('discountCode');
  89. // 初始化列表及页码
  90. const user = getLoginUser();
  91. if (user) {
  92. searchParams.adminId = user.id;
  93. searchGetList();
  94. }
  95. });
  96. // 搜索弹窗触发搜索
  97. const search = (data) => {
  98. searchParams = Object.assign(searchParams, data);
  99. searchGetList();
  100. };
  101. // 查询列表
  102. const searchGetList = () => {
  103. discountCodeList.value = [];
  104. searchParams.current = 1;
  105. getList();
  106. }
  107. // 滚动加载
  108. const onLoad = () => { if (!finished.value) { searchParams.current = searchParams.current + 1; getList(); } };
  109. // 获取设备列表数据
  110. const getList = async () => {
  111. const { data } = await getdiscountCodeList(Object.assign({}, searchParams));
  112. if (data.code === "00000") {
  113. // 列表值叠加
  114. discountCodeList.value = discountCodeList.value.concat(data.data.records);
  115. discountCodeTotal.value = data.data.total;
  116. if (discountCodeList.value.length === data.data.total) { finished.value = true; }
  117. loading.value = false;
  118. } else { showFailToast(data.message); }
  119. };
  120. // 搜索点击
  121. const searchClick = () => { searchRef.value.showSearch(); };
  122. // 切换tab
  123. const setIsUse = (data) => { searchParams.isUse = data; searchGetList(); }
  124. // 点击优惠码
  125. const disCountCodeClick = (data) => { console.log('disCountCodeClick', data); }
  126. // 时间格式化
  127. const showDate = (date) => { return date ? dateUtil.formateDate(new Date(date), "yyyy-MM-dd") : ''; }
  128. const showDateTime = (date) => { return date ? dateUtil.formateDate(new Date(date), "yyyy-MM-dd hh:mm:ss") : ''; }
  129. // 优惠码导出
  130. const exportClick = async () => {
  131. searchParams.size = 1000;
  132. const { headers, data } = await discountCodeExport(Object.assign({}, searchParams));
  133. $M_ExportFile(data, headers);
  134. }
  135. const payCode = () => { router.push({ path: '/payCode' }); };
  136. const isExpired = ref((lastUseDate) => {
  137. const currentDate = new Date();
  138. const lastUseDateTime = new Date(lastUseDate);
  139. return currentDate > lastUseDateTime;
  140. });
  141. return {
  142. searchRef,
  143. loading,
  144. error,
  145. finished,
  146. discountCodeList,
  147. discountCodeTotal,
  148. ...toRefs(searchParams),
  149. onLoad,
  150. searchClick,
  151. search,
  152. setIsUse,
  153. disCountCodeClick,
  154. showDate,
  155. showDateTime,
  156. exportClick,
  157. payCode,
  158. isExpired,
  159. };
  160. },
  161. components: { sHeader, codeSearch },
  162. };
  163. </script>
  164. <style lang="less" scoped>
  165. @import "../../common/style/common.less";
  166. </style>