couponUpdate.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <template>
  2. <div class="m-container">
  3. <el-page-header @back="onCancel" :content="title"></el-page-header>
  4. <!-- <h3 class="infoTitle">优惠券信息</h3>
  5. <el-divider></el-divider> -->
  6. <el-form :model="form" ref="form" class="form">
  7. <el-row>
  8. <el-col style="width: 500px">
  9. <el-form-item
  10. label="优惠券名称"
  11. prop="name"
  12. :rules="[{ required: true, message: '请输入优惠卷名称' }]"
  13. >
  14. <el-input
  15. :disabled="isDisabled"
  16. v-model="form.name"
  17. placeholder="请输入优惠卷名称"
  18. ></el-input>
  19. </el-form-item>
  20. </el-col>
  21. </el-row>
  22. <el-row>
  23. <el-col style="width: 500px">
  24. <el-form-item
  25. label="描述"
  26. prop="description"
  27. :rules="[{ required: true, message: '请输入优惠卷描述' }]"
  28. >
  29. <el-input
  30. :disabled="isDisabled"
  31. v-model="form.description"
  32. maxlength="20"
  33. type="textarea"
  34. :rows="3"
  35. show-word-limit
  36. placeholder="请输入优惠券描述,该描述会在优惠券上展示"
  37. ></el-input>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. <el-row :gutter="20">
  42. <!-- <el-col style="width: 395px">
  43. <el-form-item
  44. label="优惠券类型"
  45. prop="type"
  46. :rules="[{ required: true, message: '请选择优惠卷类型' }]"
  47. >
  48. <el-select
  49. :disabled="isDisabled"
  50. placeholder="优惠券类型"
  51. v-model.trim="form.type"
  52. filterable
  53. clearable
  54. @change="changeType"
  55. style="width: 355px !important"
  56. >
  57. <el-option
  58. v-for="item in couponTypeList"
  59. :key="item.value"
  60. :value="item.value"
  61. :label="item.label"
  62. ></el-option>
  63. </el-select>
  64. </el-form-item>
  65. </el-col> -->
  66. <el-col style="width: 395px" v-if="form.type == 'FULL_REDUCTION'">
  67. <el-form-item
  68. label="面值"
  69. prop="faceValue"
  70. :rules="[{ required: true, message: '请输入面值' }]"
  71. >
  72. <el-input
  73. v-model="form.faceValue"
  74. placeholder="请输入面值"
  75. :disabled="isDisabled"
  76. >
  77. <template slot="append">元</template>
  78. </el-input>
  79. </el-form-item>
  80. </el-col>
  81. <el-col style="width: 395px" v-if="form.type == 'FULL_REDUCTION'">
  82. <el-form-item
  83. label="达标金额"
  84. prop="fullAmount"
  85. :rules="[{ required: true, message: '请输入达标金额' }]"
  86. >
  87. <el-input
  88. v-model="form.fullAmount"
  89. placeholder="请输入达标金额"
  90. :disabled="isDisabled"
  91. >
  92. <template slot="append">元</template>
  93. </el-input>
  94. </el-form-item>
  95. </el-col>
  96. <el-col style="width: 395px" v-if="form.type == 'DISCOUNT'">
  97. <el-form-item
  98. label="折扣"
  99. prop="faceValue"
  100. :rules="[{ required: true, message: '请输入折扣' }]"
  101. >
  102. <el-input
  103. v-model="form.faceValue"
  104. placeholder="请输入折扣"
  105. :disabled="isDisabled"
  106. >
  107. <template slot="append">%</template>
  108. </el-input>
  109. </el-form-item>
  110. </el-col>
  111. </el-row>
  112. <el-row :gutter="20">
  113. <el-col style="width: 395px">
  114. <el-form-item
  115. label="有效期类型"
  116. prop="effectiveType"
  117. :rules="[{ required: true, message: '请选择有效期类型' }]"
  118. >
  119. <el-select
  120. style="width: 355px !important"
  121. placeholder="优惠券类型"
  122. v-model.trim="form.effectiveType"
  123. filterable
  124. clearable
  125. @change="changeEffectiveType"
  126. :disabled="isDisabled"
  127. >
  128. <el-option label="固定有效期天数" value="DAYS"></el-option>
  129. <el-option label="固定时间段" value="TIME_BUCKET"></el-option>
  130. </el-select>
  131. </el-form-item>
  132. </el-col>
  133. <el-col style="width: 395px" v-if="form.effectiveType == 'DAYS'">
  134. <el-form-item
  135. prop="deadline"
  136. :rules="[{ required: true, message: '请输入有效期天数' }]"
  137. >
  138. <span style="color: #606266"
  139. ><span style="color:#F56C6C">*</span>有效期天数
  140. <el-tooltip placement="top" popper-class="mTooltip">
  141. <div slot="content">自领取之日起多少天有效</div>
  142. <i
  143. class="el-icon-question"
  144. style="font-size: 18px; color: #f56c6c"
  145. ></i> </el-tooltip
  146. ></span>
  147. <el-input v-model="form.deadline" placeholder="请输入有效期天数" :disabled="isDisabled">
  148. <template slot="append">天</template>
  149. </el-input>
  150. </el-form-item>
  151. </el-col>
  152. <el-col style="width: 395px" v-if="form.effectiveType == 'TIME_BUCKET'">
  153. <el-form-item
  154. prop="effectiveTime"
  155. :rules="[{ required: true, message: '请选择有效期' }]"
  156. >
  157. <span style="color: #606266"
  158. ><span style="color:#F56C6C">*</span>有效期
  159. <el-tooltip placement="top" popper-class="mTooltip">
  160. <div slot="content">优惠券可使用时间段</div>
  161. <i
  162. class="el-icon-question"
  163. style="font-size: 18px; color: #f56c6c"
  164. ></i> </el-tooltip
  165. ></span>
  166. <el-date-picker
  167. style="width: 100%"
  168. v-model="form.effectiveTime"
  169. :picker-options="{ firstDayOfWeek: 1 }"
  170. type="datetimerange"
  171. :default-time="['00:00:00', '23:59:59']"
  172. range-separator="-"
  173. start-placeholder="活动开始日期"
  174. end-placeholder="活动结束日期"
  175. :disabled="isDisabled"
  176. >
  177. </el-date-picker>
  178. </el-form-item>
  179. </el-col>
  180. </el-row>
  181. <el-row :gutter="20">
  182. <el-col style="width: 395px">
  183. <el-form-item
  184. label="库存总量(-1为不限制)"
  185. prop="stockCount"
  186. :rules="[{ required: true, message: '请输入库存总量' }]"
  187. >
  188. <el-input v-model="form.stockCount" placeholder="请输入库存总量">
  189. <template slot="append">张</template>
  190. </el-input>
  191. </el-form-item>
  192. </el-col>
  193. <el-col style="width: 395px">
  194. <el-form-item
  195. label="预警值(-1为不限制)"
  196. prop="warningStockNum"
  197. :rules="[{ required: true, message: '请输入预警值' }]"
  198. >
  199. <el-input v-model="form.warningStockNum" placeholder="请输入预警值">
  200. <template slot="append">张</template>
  201. </el-input>
  202. </el-form-item>
  203. </el-col>
  204. <el-col style="width: 395px">
  205. <el-form-item
  206. prop="limitExchangeNum"
  207. :rules="[{ required: true, message: '请输入领取上限' }]"
  208. >
  209. <span style="color: #606266"
  210. >
  211. <span style="color:#F56C6C">*</span> 领取上限
  212. <el-tooltip placement="top" popper-class="mTooltip">
  213. <div slot="content">用户可领取最大张数</div>
  214. <i
  215. class="el-icon-question"
  216. style="font-size: 18px; color: #f56c6c"
  217. ></i> </el-tooltip
  218. ></span>
  219. <el-input
  220. :disabled="isDisabled"
  221. v-model="form.limitExchangeNum"
  222. placeholder="请输入领取上限"
  223. >
  224. <template slot="append">张</template>
  225. </el-input>
  226. </el-form-item>
  227. </el-col>
  228. </el-row>
  229. <el-row :gutter="20">
  230. <el-col style="width: 395px">
  231. <el-form-item label="领取时间" prop="getTime" :rules="[{ required: true, message: '请输入领取时间' }]">
  232. <el-date-picker
  233. style="width: 100%"
  234. v-model="form.getTime"
  235. :picker-options="{ firstDayOfWeek: 1 }"
  236. type="datetimerange"
  237. :default-time="['00:00:00', '23:59:59']"
  238. range-separator="-"
  239. start-placeholder="活动开始日期"
  240. end-placeholder="活动结束日期"
  241. >
  242. </el-date-picker>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. <el-form-item>
  247. <el-button type="primary" v-if="activeRow" @click="resetCoupon"
  248. >保存</el-button
  249. >
  250. <el-button type="primary" v-else @click="addCoupon">提交</el-button>
  251. <el-button type="danger" @click="resetForm">重置</el-button>
  252. </el-form-item>
  253. </el-form>
  254. </div>
  255. </template>
  256. <script>
  257. import { addSysCoupon, resetSysCoupon } from "./api.js";
  258. import { couponTypeList } from "@/utils/searchArray";
  259. import { getTimes } from "@/utils";
  260. export default {
  261. data() {
  262. return {
  263. couponTypeList,
  264. form: {
  265. name: "",
  266. description: "",
  267. type: "FULL_REDUCTION",
  268. faceValue: "",
  269. fullAmount: "",
  270. effectiveType: "",
  271. effectiveTime: [],
  272. stockCount: "",
  273. warningStockNum: "",
  274. limitExchangeNum: "",
  275. getTime: [],
  276. },
  277. activeRow: null,
  278. isDisabled: false,
  279. title: "新增优惠券",
  280. };
  281. },
  282. mounted() {
  283. if (this.$route.query.row) {
  284. this.activeRow = JSON.parse(this.$route.query.row);
  285. this.form = { ...this.activeRow };
  286. // 优惠券只能时满减
  287. this.form.type = 'FULL_REDUCTION'
  288. let effectiveStartTime = this.activeRow.effectiveStartTime;
  289. let effectiveExpireTime = this.activeRow.effectiveExpireTime;
  290. let startDate = this.activeRow.startDate;
  291. let endDate = this.activeRow.endDate;
  292. this.$set(this.form, "effectiveTime", [
  293. effectiveStartTime,
  294. effectiveExpireTime,
  295. ]);
  296. this.$set(this.form, "getTime", [startDate, endDate]);
  297. this.title = this.activeRow.name;
  298. if (this.activeRow?.consumeNum > 0) {
  299. this.isDisabled = true;
  300. }
  301. }
  302. },
  303. methods: {
  304. changeType(val) {
  305. this.form.faceValue = "";
  306. this.form.fullAmount = "";
  307. },
  308. changeEffectiveType() {
  309. // this.form.effectiveTime = [];
  310. this.$set(this.form,'effectiveTime',[])
  311. this.$set(this.form,'deadline',null)
  312. // this.form.deadline = "";
  313. },
  314. onCancel() {
  315. this.$router.push("/couponManager");
  316. },
  317. resetForm() {
  318. this.$refs.form.resetFields();
  319. if (this.activeRow) {
  320. this.form = { ...this.activeRow };
  321. let effectiveStartTime = this.activeRow.effectiveStartTime;
  322. let effectiveExpireTime = this.activeRow.effectiveExpireTime;
  323. let startDate = this.activeRow.startDate;
  324. let endDate = this.activeRow.endDate;
  325. this.$set(this.form, "effectiveTime", [
  326. effectiveStartTime,
  327. effectiveExpireTime,
  328. ]);
  329. this.$set(this.form, "getTime", [startDate, endDate]);
  330. }
  331. },
  332. async addCoupon() {
  333. this.$refs.form.validate(async (some) => {
  334. if (some) {
  335. this.$confirm("您确定新增优惠券?", "提示", {
  336. confirmButtonText: "确定",
  337. cancelButtonText: "取消",
  338. type: "warning",
  339. })
  340. .then(async () => {
  341. try {
  342. let { effectiveTime, getTime, ...rest } = this.form;
  343. let params = {
  344. ...rest,
  345. ...getTimes(effectiveTime, [
  346. "effectiveStartTime",
  347. "effectiveExpireTime",
  348. ],'YYYY-MM-DD HH:mm:ss'),
  349. ...getTimes(getTime, ["startDate", "endDate"],'YYYY-MM-DD HH:mm:ss'),
  350. };
  351. const res = await addSysCoupon(params);
  352. this.$message.success("新增成功");
  353. this.onCancel();
  354. } catch (e) {
  355. console.log(e);
  356. }
  357. })
  358. .catch(() => {});
  359. }
  360. });
  361. },
  362. resetCoupon() {
  363. this.$refs.form.validate(async (some) => {
  364. if (some) {
  365. this.$confirm("您确定修改优惠券?", "提示", {
  366. confirmButtonText: "确定",
  367. cancelButtonText: "取消",
  368. type: "warning",
  369. })
  370. .then(async () => {
  371. try {
  372. let { effectiveTime, getTime, ...rest } = this.form;
  373. let params = {
  374. ...rest,
  375. ...getTimes(effectiveTime, [
  376. "effectiveStartTime",
  377. "effectiveExpireTime",
  378. ],'YYYY-MM-DD HH:mm:ss'),
  379. ...getTimes(getTime, ["startDate", "endDate"],'YYYY-MM-DD HH:mm:ss'),
  380. };
  381. const res = await resetSysCoupon(params);
  382. this.$message.success("新增成功");
  383. this.onCancel();
  384. } catch (e) {
  385. console.log(e);
  386. }
  387. })
  388. .catch(() => {});
  389. }
  390. });
  391. },
  392. },
  393. };
  394. </script>
  395. <style lang="scss" scoped>
  396. .form {
  397. margin-top: 30px;
  398. }
  399. .infoTitle {
  400. font-weight: 400;
  401. margin-top: 30px;
  402. font-size: 18px;
  403. }
  404. /deep/label {
  405. font-weight: 400;
  406. }
  407. </style>