index.vue 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. <template>
  2. <div class="app-container">
  3. <el-container>
  4. <el-main>
  5. <div class="filter-container">
  6. <el-input
  7. :placeholder="$t('label.promotionName')"
  8. style="width: 200px;"
  9. clearable
  10. class="filter-item"
  11. v-model="listQuery.title"
  12. @keyup.enter.native="retPage"
  13. />
  14. <el-input
  15. :placeholder="$t('label.minimumPurchaseRequirement')"
  16. style="width: 220px;"
  17. clearable
  18. class="filter-item"
  19. v-model="listQuery.requireValue"
  20. @keyup.enter.native="retPage"
  21. />
  22. <el-select
  23. v-model="listQuery.discountMethod"
  24. clearable
  25. class="filter-item"
  26. style="width: 200px;"
  27. :placeholder="$t('label.applicationMethod')"
  28. @keyup.enter.native="retPage"
  29. >
  30. <el-option
  31. :key="index"
  32. v-for="(item, index) in $t('label.applicationMethodList')"
  33. :label="item.label"
  34. :value="item.value"
  35. />
  36. </el-select>
  37. <el-button
  38. v-waves
  39. v-has="'promotion:list'"
  40. class="filter-item"
  41. type="primary"
  42. icon="el-icon-search"
  43. @click="retPage"
  44. >{{ $t("view.search") }}
  45. </el-button>
  46. </div>
  47. <el-table
  48. v-loading="listLoading"
  49. :key="tableKey"
  50. :data="list"
  51. stripe
  52. border
  53. fit
  54. highlight-current-row
  55. style="width: 100%;"
  56. >
  57. <el-table-column type="index" width="40"></el-table-column>
  58. <el-table-column
  59. :label="$t('label.promotionEventName')"
  60. width="220"
  61. show-overflow-tooltip
  62. prop="title"
  63. />
  64. <el-table-column
  65. :label="$t('label.promotionId')"
  66. align="center"
  67. width="220"
  68. show-overflow-tooltip
  69. prop="id"
  70. />
  71. <el-table-column
  72. :label="$t('label.participateType')"
  73. align="center"
  74. width="220"
  75. >
  76. <template v-slot="{ row }">
  77. <span>{{ ruleTypeLabel(row.ruleType) }}</span>
  78. </template>
  79. </el-table-column>
  80. <el-table-column
  81. :label="$t('label.promotionLevel')"
  82. align="center"
  83. width="220"
  84. >
  85. <span>{{ $t("label.product") }}</span>
  86. </el-table-column>
  87. <el-table-column
  88. :label="$t('label.applicationMethod')"
  89. align="center"
  90. width="220"
  91. >
  92. <template v-slot="{ row }">
  93. <span>{{ applicationMethod(row.discountMethod) }}</span>
  94. </template>
  95. </el-table-column>
  96. <el-table-column
  97. :label="$t('label.minimumPurchaseRequirement')"
  98. align="center"
  99. width="160"
  100. >
  101. <template v-slot="{ row }">
  102. <span>{{ purchaseRequire(row) }}</span>
  103. </template>
  104. </el-table-column>
  105. <el-table-column
  106. :label="$t('label.discountValue')"
  107. align="center"
  108. width="220"
  109. >
  110. <template v-slot="{ row }">
  111. {{ discountVal(row) }}
  112. </template>
  113. </el-table-column>
  114. <!-- <el-table-column
  115. :label="$t('label.priority')"
  116. align="center"
  117. width="120"
  118. >
  119. <template v-slot="{ row }">
  120. <span>{{ row.participateWeight }}</span>
  121. </template>
  122. </el-table-column> -->
  123. <el-table-column
  124. :label="$t('label.stackableType')"
  125. align="center"
  126. width="150"
  127. >
  128. <template v-slot="{ row }">
  129. <span>{{ stackableType(row) }}</span>
  130. </template>
  131. </el-table-column>
  132. <el-table-column
  133. :label="$t('label.promotionStartTime')"
  134. align="center"
  135. prop="startTime"
  136. width="220"
  137. />
  138. <el-table-column
  139. :label="$t('label.promotionEndTime')"
  140. align="center"
  141. width="220"
  142. prop="endTime"
  143. />
  144. <!-- <el-table-column
  145. :label="$t('label.status')"
  146. align="center"
  147. width="120"
  148. prop="status"
  149. >
  150. <template v-slot="{ row }">{{ statusVal(row.status) }}</template>
  151. </el-table-column> -->
  152. <el-table-column
  153. :label="$t('label.version')"
  154. align="center"
  155. width="120"
  156. >
  157. <template v-slot="{ row }">{{
  158. row.version ? "V" + row.version : ""
  159. }}</template>
  160. </el-table-column>
  161. <el-table-column
  162. :label="$t('label.operation')"
  163. min-width="180"
  164. align="center"
  165. fixed="right"
  166. >
  167. <template v-slot="{ row }">
  168. <el-tooltip
  169. class="item"
  170. effect="dark"
  171. :content="$t('label.version')"
  172. placement="top-start"
  173. >
  174. <el-button
  175. v-has="'priceRule:version'"
  176. type="primary"
  177. circle
  178. size="mini"
  179. icon="el-icon-more"
  180. @click="handleLog(row.id)"
  181. >
  182. </el-button>
  183. </el-tooltip>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <!-- 分页 -->
  188. <swPage
  189. v-if="total > 0"
  190. key="2"
  191. :listQuery="listQuery"
  192. :total="total"
  193. pos="btmRight"
  194. @retPage="getList"
  195. />
  196. </el-main>
  197. </el-container>
  198. <promotion-form ref="promotionBuyXgetYFormRef" @refresh-table="getList" />
  199. <promotion-log-list
  200. ref="logListRef"
  201. @show="({ id, version }) => showDialog(id, true, version)"
  202. />
  203. </div>
  204. </template>
  205. <script>
  206. import waves from "@/directive/waves"; // 水波纹指令
  207. import SwPage from "@/views/common/swPage.vue";
  208. import ElContainer from "element-ui/packages/container/src/main";
  209. import PromotionForm from "@/views/oms/promotion/freeShipping/promotionForm.vue";
  210. import PromotionLogList from "@/views/oms/promotion/components/promotionLogList.vue";
  211. import { fetchList } from "@/api/oms/order/multiBuyDiscount";
  212. import { getToken } from "@/utils/auth";
  213. import i18n from "@/lang";
  214. export default {
  215. inject: ["reload"], //刷新
  216. components: {
  217. SwPage,
  218. ElContainer,
  219. PromotionForm,
  220. PromotionLogList
  221. },
  222. name: "buyXgetYDiscount",
  223. directives: {
  224. waves
  225. },
  226. data() {
  227. return {
  228. activeName: "productIndex",
  229. iconSize: "mini",
  230. //右侧列表
  231. tableKey: 0,
  232. list: null,
  233. total: null,
  234. listLoading: false,
  235. listQuery: {
  236. discountMethod: null,
  237. title: null,
  238. requireValue: null,
  239. page: 1,
  240. limit: 10,
  241. ruleType: 4 //折扣类型 1 产品降价 2 订单降价 3 买X得Y 4免运费 5 多件多扣'
  242. },
  243. storeList: []
  244. };
  245. },
  246. created() {
  247. this.getList();
  248. },
  249. computed: {
  250. headers: function() {
  251. return { "X-Token": getToken() };
  252. }
  253. },
  254. methods: {
  255. // 可叠加类型
  256. stackableType(row) {
  257. const { combineWithOrder, combineWithProduct, combineWithShipping } = row;
  258. let arr = [];
  259. if (combineWithOrder) {
  260. arr.push(i18n.t("label.combinationList")[1].label);
  261. }
  262. if (combineWithProduct) {
  263. arr.push(i18n.t("label.combinationList")[0].label);
  264. }
  265. if (combineWithShipping) {
  266. arr.push(i18n.t("label.combinationList")[2].label);
  267. }
  268. return arr.join(",");
  269. },
  270. // 折扣类型
  271. applicationMethod(val) {
  272. const data = i18n
  273. .t("label.applicationMethodList")
  274. .find(item => item.value === val);
  275. return val && data ? data.label : "";
  276. },
  277. // 最低购买条件
  278. purchaseRequire(row) {
  279. let { purchaseRequire, requireValue } = row;
  280. if (purchaseRequire === 2) {
  281. return "$ " + requireValue;
  282. } else if (purchaseRequire === 3) {
  283. return requireValue + " " + i18n.t("label.item");
  284. } else {
  285. return i18n.t("label.noRequirement");
  286. }
  287. },
  288. // 折扣内容
  289. discountVal(row) {
  290. let { valueType, numericValue } = row;
  291. if (valueType === 1) {
  292. return numericValue * 100 + "% off";
  293. } else if (valueType === 2) {
  294. return numericValue;
  295. } else {
  296. return i18n.t("label.free");
  297. }
  298. },
  299. // 折扣类型
  300. ruleTypeLabel(val) {
  301. const obj = i18n.t("label.ruleTypeList").find(item => item.value === val);
  302. return val && obj ? obj.label : "";
  303. },
  304. getList() {
  305. this.listLoading = true;
  306. fetchList(this.listQuery)
  307. .then(response => {
  308. if (response.code === 200) {
  309. this.list = response.data.list;
  310. this.total = response.data.total;
  311. setTimeout(() => {
  312. this.listLoading = false;
  313. }, 0.5 * 1000);
  314. }
  315. })
  316. .catch(() => {
  317. setTimeout(() => {
  318. this.listLoading = false;
  319. }, 0.5 * 1000);
  320. });
  321. },
  322. retPage() {
  323. this.listQuery.page = 1;
  324. this.getList();
  325. },
  326. showDialog(id, edit, version) {
  327. this.$refs.promotionBuyXgetYFormRef.showDialog(id, edit, version);
  328. },
  329. handleLog(id) {
  330. this.$refs.logListRef.handleOpen(id);
  331. }
  332. }
  333. };
  334. </script>
  335. <style scoped></style>