create.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. <template>
  2. <div class="app-container coupon-add">
  3. <el-row :gutter="10">
  4. <el-col :xs="{span: 22, offset: 0}" :sm=" {span: 18, offset: 0}" :lg="{span: 10, offset: 0}">
  5. <el-form ref="addItem" :model="addData" :rules="rules" label-width="100px">
  6. <el-form-item label="券包名称:" prop="title">
  7. <el-input v-model="addData.title" :readonly="readonly" placeholder="请输入券包名称" :maxlength="32" show-word-limit />
  8. </el-form-item>
  9. </el-form>
  10. </el-col>
  11. </el-row>
  12. <br>
  13. <el-button v-if="!readonly" type="primary" size="small" plain @click="couponTableVisible = true">添加优惠券</el-button>
  14. <br>
  15. <br>
  16. <span style="font-size: 14px; line-height: 40px">面值总额:¥{{ $numberFormat(totalPrice) }}</span>
  17. <span style="margin-left: 80px;font-size: 14px; line-height: 40px">优惠券数量:{{ totalCouponNum }}</span>
  18. <el-table :data="couponPkgItemList">
  19. <el-table-column label="券编号" prop="couponId" align="center" />
  20. <el-table-column label="券名称" prop="title" />
  21. <el-table-column label="券金额" min-width="85">
  22. <template slot-scope="{ row }">
  23. <div>¥{{ $numberFormat(row.discount) }}</div>
  24. </template>
  25. </el-table-column>
  26. <el-table-column label="门店承担比例" prop="channelSharedRate">
  27. <template slot-scope="{row}">
  28. {{row.channelSharedRate}}%
  29. </template>
  30. </el-table-column>
  31. <el-table-column label="使用场景" prop="type">
  32. <template slot-scope="{ row }">
  33. <div>{{ row.type.desc }}</div>
  34. </template>
  35. </el-table-column>
  36. <el-table-column label="数量" align="center">
  37. <template slot-scope="{ row }">
  38. <div>
  39. <el-input-number
  40. :disabled="readonly"
  41. v-model="row.couponNum"
  42. controls-position="right"
  43. :min="1"
  44. size="small"
  45. @change="changeCouponNum"
  46. ></el-input-number>
  47. </div>
  48. </template>
  49. </el-table-column>
  50. <el-table-column label="有效期限" min-width="85" align="center">
  51. <template slot-scope="{ row }">
  52. <div>领取后{{ row.dueDays }}天有效</div>
  53. </template>
  54. </el-table-column>
  55. <el-table-column v-if="!readonly" prop="date" label="操作" align="center">
  56. <template slot-scope="{ $index }">
  57. <el-button type="text" class="del" @click="couponPkgItemList.splice($index, 1);getIds();getPrice();getCouponNum()">删除</el-button>
  58. </template>
  59. </el-table-column>
  60. </el-table>
  61. <br>
  62. <el-row v-if="!readonly">
  63. <el-col :span="23" style="text-align: right">
  64. <el-button type="info" @click="$router.go(-1)">取消</el-button>
  65. <el-button :loading="addIng" type="primary" @click="update()">保存</el-button>
  66. </el-col>
  67. </el-row>
  68. <!-- 添加券 -->
  69. <coupon-add :dialog-visible="couponTableVisible" :ids="ids" @close="couponTableVisible = false" @confirmCoupon="confirmCoupon" v-if="couponTableVisible" />
  70. </div>
  71. </template>
  72. <script>
  73. import { couponPkgCreate, couponPkgDetail, couponPkgUpdate } from "@/api/business/couponPkg";
  74. import CouponAdd from "./components/CouponAdd"
  75. import { accMul } from '@/utils/util'
  76. export default {
  77. name: 'CouponPkgAdd',
  78. components: {
  79. CouponAdd
  80. },
  81. data() {
  82. return {
  83. id: this.$route.query.id,
  84. readonly: this.$route.name === 'CouponPkgQuery',
  85. addData: {},
  86. couponTableVisible: false,
  87. couponPkgItemList: [],
  88. totalPrice: 0,
  89. totalCouponNum: 0,
  90. ids: [],
  91. addIng: false,
  92. rules: {
  93. title: [{ required: true, message: '请输入券包名称', trigger: 'blur' }]
  94. }
  95. };
  96. },
  97. created() {
  98. if(this.id) {
  99. couponPkgDetail(this.id).then(res => {
  100. const { couponPkgItemVOList, facePrice, title, couponNum } = res.data
  101. this.addData = { title }
  102. this.totalPrice = facePrice
  103. this.totalCouponNum = couponNum
  104. this.ids = couponPkgItemVOList.map(item => item.couponId)
  105. this.couponPkgItemList = couponPkgItemVOList.map(item => {
  106. return {
  107. ... item,
  108. type: item.type && JSON.parse(item.type)
  109. }
  110. })
  111. })
  112. }
  113. },
  114. methods: {
  115. confirmCoupon(arr) {
  116. this.couponPkgItemList = this.couponPkgItemList.concat(arr)
  117. this.getIds()
  118. this.getPrice()
  119. this.getCouponNum()
  120. },
  121. changeCouponNum(e) {
  122. let rule = /^([1-9]\d*)$/;
  123. if(!rule.test(e)) {
  124. this.$message.error('优惠券数量格式错误');
  125. return
  126. }
  127. this.getPrice()
  128. this.getCouponNum()
  129. },
  130. getPrice() {
  131. let num = 0
  132. this.couponPkgItemList.forEach(item => {
  133. num = (accMul(item.discount, item.couponNum)) + num
  134. })
  135. this.totalPrice = num
  136. },
  137. getIds() {
  138. this.ids = this.couponPkgItemList.map(item => item.couponId)
  139. },
  140. getCouponNum() {
  141. let num = 0
  142. this.couponPkgItemList.forEach(item => {
  143. num = item.couponNum + num
  144. })
  145. this.totalCouponNum = num
  146. },
  147. update() {
  148. const subForm = this.$refs["addItem"];
  149. subForm.validate((valid) => {
  150. if (valid) {
  151. if(!this.couponPkgItemList.length) {
  152. this.$message.error('请添加优惠券');
  153. return
  154. }
  155. let couponIndex = this.couponPkgItemList.findIndex((item) => {
  156. let rule = /^([1-9]\d*)$/;
  157. return !rule.test(item.couponNum);
  158. });
  159. // 判断优惠券数量格式
  160. if (couponIndex != -1) {
  161. this.$message.error(
  162. `券${this.couponPkgItemList[couponIndex].title}的数量格式错误!`
  163. );
  164. return;
  165. }
  166. this.addIng = true
  167. let data = {
  168. title: this.addData.title,
  169. couponPkgItemList: this.couponPkgItemList,
  170. facePrice: this.totalPrice,
  171. couponNum: this.totalCouponNum
  172. }
  173. if(this.id){
  174. data.id = this.id
  175. }
  176. let request = this.id ? couponPkgUpdate : couponPkgCreate
  177. request(data).then(res => {
  178. this.addIng = false
  179. if (res.code === 0) {
  180. this.$message({
  181. message: this.id ? '修改成功!' : '添加成功!',
  182. type: 'success'
  183. })
  184. this.$store.dispatch('tagsView/delView', this.$route)
  185. this.$router.go(-1)
  186. }
  187. }).catch(() => {
  188. this.addIng = false
  189. })
  190. }
  191. });
  192. }
  193. },
  194. };
  195. </script>
  196. <style>
  197. </style>