index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  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. <el-button
  47. v-waves
  48. v-has="'promotion:update'"
  49. class="filter-item"
  50. type="primary"
  51. icon="el-icon-circle-plus-outline"
  52. @click="showDialog('', false)"
  53. >{{ $t("view.create") }}
  54. </el-button>
  55. </div>
  56. <el-table
  57. v-loading="listLoading"
  58. :key="tableKey"
  59. :data="list"
  60. stripe
  61. border
  62. fit
  63. highlight-current-row
  64. style="width: 100%;"
  65. >
  66. <el-table-column type="index" width="40"></el-table-column>
  67. <el-table-column
  68. :label="$t('label.promotionEventName')"
  69. width="220"
  70. show-overflow-tooltip
  71. prop="title"
  72. />
  73. <el-table-column
  74. :label="$t('label.promotionId')"
  75. align="center"
  76. width="220"
  77. show-overflow-tooltip
  78. prop="id"
  79. />
  80. <el-table-column
  81. :label="$t('label.participateType')"
  82. align="center"
  83. width="220"
  84. >
  85. <template v-slot="{ row }">
  86. <span>{{ ruleTypeLabel(row.ruleType) }}</span>
  87. </template>
  88. </el-table-column>
  89. <el-table-column
  90. :label="$t('label.promotionLevel')"
  91. align="center"
  92. width="220"
  93. >
  94. <template v-slot="{ row }">
  95. <span>{{ row.promotionStartTime }}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column
  99. :label="$t('label.applicationMethod')"
  100. align="center"
  101. width="220"
  102. >
  103. <template v-slot="{ row }">
  104. <span>{{ applicationMethod(row.discountMethod) }}</span>
  105. </template>
  106. </el-table-column>
  107. <el-table-column
  108. :label="$t('label.minimumPurchaseRequirement')"
  109. align="center"
  110. width="160"
  111. >
  112. <template v-slot="{ row }">
  113. <span>{{ purchaseRequire(row) }}</span>
  114. </template>
  115. </el-table-column>
  116. <el-table-column
  117. :label="$t('label.discountValue')"
  118. align="center"
  119. width="220"
  120. >
  121. <template v-slot="{ row }">
  122. {{ discountVal(row) }}
  123. </template>
  124. </el-table-column>
  125. <el-table-column
  126. :label="$t('label.priority')"
  127. align="center"
  128. width="120"
  129. >
  130. <template v-slot="{ row }">
  131. <span>{{ row.participateWeight }}</span>
  132. </template>
  133. </el-table-column>
  134. <el-table-column
  135. :label="$t('label.stackableType')"
  136. align="center"
  137. width="150"
  138. >
  139. <template v-slot="{ row }">
  140. <span>{{ row.participateWeight }}</span>
  141. </template>
  142. </el-table-column>
  143. <el-table-column
  144. :label="$t('label.promotionStartTime')"
  145. align="center"
  146. prop="startTime"
  147. width="220"
  148. />
  149. <el-table-column
  150. :label="$t('label.promotionEndTime')"
  151. align="center"
  152. width="220"
  153. prop="endTime"
  154. />
  155. <el-table-column
  156. :label="$t('label.status')"
  157. align="center"
  158. width="120"
  159. prop="status"
  160. >
  161. <template v-slot="{ row }">{{ statusVal(row.status) }}</template>
  162. </el-table-column>
  163. <el-table-column
  164. :label="$t('label.version')"
  165. align="center"
  166. width="120"
  167. >
  168. <template v-slot="{ row }">{{
  169. row.version ? "V" + row.version : ""
  170. }}</template>
  171. </el-table-column>
  172. <el-table-column
  173. :label="$t('label.operation')"
  174. min-width="180"
  175. align="center"
  176. fixed="right"
  177. >
  178. <template v-slot="{ row }">
  179. <el-tooltip
  180. class="item"
  181. effect="dark"
  182. :content="$t('label.version')"
  183. placement="top-start"
  184. >
  185. <el-button
  186. v-has="'priceRule:version'"
  187. type="primary"
  188. circle
  189. size="mini"
  190. icon="el-icon-more"
  191. @click="handleLog(row.id)"
  192. >
  193. </el-button>
  194. </el-tooltip>
  195. </template>
  196. </el-table-column>
  197. </el-table>
  198. <!-- 分页 -->
  199. <swPage
  200. v-if="total > 0"
  201. key="2"
  202. :listQuery="listQuery"
  203. :total="total"
  204. pos="btmRight"
  205. @retPage="getList"
  206. />
  207. </el-main>
  208. </el-container>
  209. <promotion-form ref="promotionFormRef" @refresh-table="getList" />
  210. <promotion-log-list
  211. ref="logListRef"
  212. @show="({ id, version }) => showDialog(id, true, version)"
  213. />
  214. </div>
  215. </template>
  216. <script>
  217. import waves from "@/directive/waves"; // 水波纹指令
  218. import SwPage from "@/views/common/swPage.vue";
  219. import ElContainer from "element-ui/packages/container/src/main";
  220. import PromotionForm from "@/views/oms/promotion/buyXGetYDiscount/promotionForm.vue";
  221. import PromotionLogList from "@/views/oms/promotion/buyXGetYDiscount/promotionLogList.vue";
  222. import { fetchList } from "@/api/oms/order/multiBuyDiscount";
  223. import { deleteById } from "@/api/oms/order/promotion";
  224. import { getToken } from "@/utils/auth";
  225. export default {
  226. inject: ["reload"], //刷新
  227. components: {
  228. SwPage,
  229. ElContainer,
  230. PromotionForm,
  231. PromotionLogList
  232. },
  233. name: "multiBuyDiscount",
  234. directives: {
  235. waves
  236. },
  237. data() {
  238. return {
  239. activeName: "productIndex",
  240. iconSize: "mini",
  241. //右侧列表
  242. tableKey: 0,
  243. list: null,
  244. total: null,
  245. listLoading: false,
  246. listQuery: {
  247. discountMethod: null,
  248. title: null,
  249. requireValue: null,
  250. page: 1,
  251. limit: 10,
  252. ruleType: 3
  253. },
  254. storeList: []
  255. };
  256. },
  257. created() {
  258. this.getList();
  259. },
  260. computed: {
  261. headers: function() {
  262. return { "X-Token": getToken() };
  263. }
  264. },
  265. methods: {
  266. // 折扣类型
  267. applicationMethod(val) {
  268. const data = i18n
  269. .t("label.applicationMethodList")
  270. .find(item => item.value === val);
  271. return val && data ? data.label : "";
  272. },
  273. // 最低购买条件
  274. purchaseRequire(row) {
  275. let { purchaseRequire, requireValue } = row;
  276. if (purchaseRequire === 2) {
  277. return "$" + requireValue;
  278. } else if (purchaseRequire === 3) {
  279. return requireValue + i18n.t("label.item");
  280. } else {
  281. return i18n.t("label.noRequirement");
  282. }
  283. },
  284. // 折扣内容
  285. discountVal(row) {
  286. let { valueType, numericValue } = row;
  287. if (valueType === 1) {
  288. return numericValue * 100 + "% off";
  289. } else if (valueType === 2) {
  290. return numericValue;
  291. } else {
  292. return i18n.t("label.free");
  293. }
  294. },
  295. // 折扣类型
  296. ruleTypeLabel(val) {
  297. const obj = i18n.t("label.ruleTypeList").find(item => item.value === val);
  298. return val && obj ? obj.label : "";
  299. },
  300. // 状态
  301. statusVal(val) {
  302. const data = i18n.t("label.statusList").find(item => item.value === val);
  303. return val && data ? data.label : "";
  304. },
  305. getList() {
  306. this.listLoading = true;
  307. fetchList(this.listQuery)
  308. .then(response => {
  309. if (response.code === 200) {
  310. this.list = response.data.list;
  311. this.total = response.data.total;
  312. setTimeout(() => {
  313. this.listLoading = false;
  314. }, 0.5 * 1000);
  315. }
  316. })
  317. .catch(() => {
  318. setTimeout(() => {
  319. this.listLoading = false;
  320. }, 0.5 * 1000);
  321. });
  322. },
  323. retPage() {
  324. this.listQuery.page = 1;
  325. this.getList();
  326. },
  327. showDialog(id, edit) {
  328. this.$refs.promotionFormRef.showDialog(id, edit);
  329. },
  330. // changePromotionStatus(id, status) {
  331. // this.$confirm(status ? "是否确认禁用?" : "是否确认启用?", "提示", {
  332. // confirmButtonText: "确定",
  333. // cancelButtonText: "取消",
  334. // type: "warning"
  335. // }).then(() => {
  336. // changeStatus(id).then(res => {
  337. // if (res.code === 200) {
  338. // this.$message({
  339. // message: "操作成功",
  340. // type: "success"
  341. // });
  342. // this.getList();
  343. // }
  344. // });
  345. // });
  346. // },
  347. handleLog(id) {
  348. this.$refs.logListRef.handleOpen(id);
  349. }
  350. }
  351. };
  352. </script>
  353. <style scoped></style>