Ver Fonte

fix: 优惠券管理修正部分问题

Sun há 3 anos atrás
pai
commit
a6355d529f

+ 0 - 2
.env.development

@@ -7,7 +7,5 @@ ENV = 'development'
 # 云管铺/开发环境
 VUE_APP_BASE_API = '/dev-api'
 
-VUE_APP_IMG_URL = 'https://mp-public-test-1307117429.cos.ap-shanghai.myqcloud.com/'
-
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 0 - 2
.env.production

@@ -6,5 +6,3 @@ ENV = 'production'
 
 # 云管铺/生产环境
 VUE_APP_BASE_API = '/prod-api'
-
-VUE_APP_IMG_URL = 'https://mp-public-test-1307117429.cos.ap-shanghai.myqcloud.com/'

+ 75 - 24
src/views/business/coupon/add.vue

@@ -4,8 +4,8 @@
     <el-row>
       <el-col :span="23">
         <el-form ref="addItem" :model="addData" :rules="rules" label-width="160px">
-          <el-form-item label="代金券名称:" prop="title">
-            <el-input v-model="addData.title" placeholder="请输入代金券名称" :maxlength="32" show-word-limit />
+          <el-form-item label="券名称:" prop="title">
+            <el-input v-model="addData.title" placeholder="请输入券名称" :maxlength="32" show-word-limit />
           </el-form-item>
           <el-form-item label="使用场景:" prop="type">
             <el-radio-group v-model="addData.type">
@@ -14,27 +14,29 @@
             </el-radio-group>
           </el-form-item>
           <el-form-item label="面值:" prop="discount">
-            <el-input v-model.number="addData.discount" type="number" placeholder="请输入代金券面值">
+            <el-input v-model.number="addData.discount" type="number" :min="0" placeholder="请输入券面值">
               <template slot="append">元</template>
             </el-input>
           </el-form-item>
-          <el-form-item label="数量:" prop="quantity">
-            <el-input v-model.number="addData.quantity" type="number" placeholder="请输入代金券数量">
+          <!-- <el-form-item label="数量:" prop="quantity">
+            <el-input v-model.number="addData.quantity" type="number" :min="0" placeholder="请输入券数量">
               <template slot="append">元</template>
             </el-input>
-          </el-form-item>
-          <el-form-item label="图片:" prop="picUrl">
+          </el-form-item> -->
+          <!-- <el-form-item label="图片:" prop="picUrl">
             <Upload :value="addData.picUrl ? [{ fileName: addData.picUrl }] : []" @input="addData.picUrl = $event[0] ? $event[0].fileName : ''" :limit="1" />
-          </el-form-item>
-          <el-form-item label="门店默认承担比例:" prop="channelSharedRate">
-            <el-input v-model.number="addData.channelSharedRate" type="number" placeholder="请输入面值">
+          </el-form-item> -->
+          <el-form-item v-if="addData.type === 1" label="门店默认承担比例:" prop="channelSharedRate">
+            <el-input v-model.number="addData.channelSharedRate" type="number" placeholder="请输入门店默认承担比例">
               <template slot="append">%</template>
             </el-input>
+            <div class="tip">若门店承担100%,则核销后公司不需要打款给门店,依此类推。</div>
           </el-form-item>
           <el-form-item label="最低消费金额:" prop="minOrderAmt">
             <el-input v-model.number="addData.minOrderAmt" type="number" placeholder="请输入可使用的最低消费金额">
               <template slot="append">元</template>
             </el-input>
+            <div class="tip">最低消费金额小于等于面值则为无门槛券</div>
           </el-form-item>
           <el-form-item label="有效期:" prop="dueDays">
             <el-input v-model.number="addData.dueDays" placeholder="请输入有效期">
@@ -45,14 +47,43 @@
           <el-form-item label="使用说明:" prop="description">
             <el-input type="textarea" rows="4" v-model="addData.description" placeholder="请输入使用说明 对用户可见"/>
           </el-form-item>
-          <el-form-item label="使用范围:" prop="boxIds">
-            <el-radio-group v-model="addData.boxIds">
-              <el-radio :label="1">进票门店</el-radio>
-              <el-radio :label="2">所有盲票</el-radio>
-              <el-radio :label="3">制定盲票</el-radio>
+          <el-form-item v-if="addData.type === 1" label="使用范围:" prop="useArea">进票门店</el-form-item>
+          <el-form-item v-else label="使用范围:" prop="useArea">
+            <el-radio-group v-model="useArea" @change="$event === 'all' ? this.addData.boxIdList = [] : ''">
+              <el-radio label="all">所有盲票</el-radio>
+              <el-radio label="spec">指定盲票</el-radio>
             </el-radio-group>
           </el-form-item>
         </el-form>
+        <div v-if="useArea === 'spec'" style="padding: 0 20px">
+          <el-table :data="addData.boxIdList" height="300px">
+            <el-table-column label="盲票图片" prop="picUrl" align="center" width="80">
+              <template slot-scope="{row}">
+                <a target="_black" v-if="row.picUrl && row.picUrl.split(',').length > 0" :href="`${IMG_URL + row.picUrl}`"><img :src="`${IMG_URL + row.picUrl.split(',')[0]}`" style="max-height: 37px;max-width: 54px"></a>
+                <span v-else>-</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="盲票名称" prop="title" />
+            <el-table-column label="盲票面值" prop="facePrice" />
+            <el-table-column label="盲票类型" prop="type">
+              <template slot-scope="{row}">
+                {{ JSON.parse(row.type).desc }}
+              </template>
+            </el-table-column>
+            <el-table-column label="盲票状态" prop="status">
+              <template slot-scope="{row}">
+                <el-tag :type="JSON.parse(row.status).value === 'on' ? 'success' : 'info'">{{ JSON.parse(row.status).desc }}</el-tag>
+              </template>
+            </el-table-column>
+            <el-table-column prop="date" label="操作">
+              <template slot-scope="{ $index }">
+                <el-button type="text" class="del" @click="addData.boxIdList.splice($index, 1)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <br>
+          <el-button type="primary" size="small" plain @click="$refs.select.show()">选择盲票</el-button> <span style="margin-left: 10px">已选盲票({{ addData.boxIdList.length }})</span>
+        </div>
       </el-col>
     </el-row>
     <el-row>
@@ -61,39 +92,51 @@
         <el-button :loading="addIng" type="primary" @click="update()">保存</el-button>
       </el-col>
     </el-row>
+
+    <!-- 弹出层 -->
+    <SelectTicket ref="select" v-model="addData.boxIdList" />
   </div>
 </template>
 <script>
 import Upload from '@/components/ImageUpload'
+import SelectTicket from './components/selectTicket'
+import { publicFileGetUrl } from "@/api/common"
 import { getCouponDetail, addCoupon } from '@/api/business/coupon'
 export default {
   name: 'CouponAdd',
   components: {
-    Upload
+    Upload,
+    SelectTicket
   },
   data() {
     return {
+      IMG_URL: publicFileGetUrl,
       id: this.$route.query.id,
+      readonly: this.$route.name === 'View',
       addData: {},
       addIng: false,
       rules: {
-        title: [{ required: true, message: '请输入代金券名称', trigger: 'blur' }],
-        type: [{ required: true, message: '请输入代金券类型', trigger: 'blur' }],
-        quantity: [{ required: true, message: '请输入代金券类型', trigger: 'blur' }],
-        picUrl: [{ required: true, message: '请输入代金券类型', trigger: 'blur' }],
-        discount: [{ required: true, message: '请输入代金券面值', trigger: 'blur' }],
+        title: [{ required: true, message: '请输入券名称', trigger: 'blur' }],
+        type: [{ required: true, message: '请输入券类型', trigger: 'blur' }],
+        quantity: [{ required: true, message: '请输入券类型', trigger: 'blur' }],
+        picUrl: [{ required: true, message: '请输入券类型', trigger: 'blur' }],
+        discount: [{ required: true, message: '请输入券面值', trigger: 'blur' }],
         channelSharedRate: [{ required: true, message: '请输入门店默认承担比例', trigger: 'blur' }],
         minOrderAmt: [{ required: true, message: '请输入最低消费金额', trigger: 'blur' }],
         dueDays: [{ required: true, message: '请输入有效期', trigger: 'blur' }],
-        description: [{ required: true, message: '请输入使用说明', trigger: 'blur' }],
-        boxIds: [{ required: true, message: '请选择使用范围', trigger: 'blur' }]
-      }
+        description: [{ required: true, message: '请输入使用说明', trigger: 'blur' }]
+      },
+      useArea: 'all'
     }
   },
   created() {
     if (this.id) {
       getCouponDetail(this.id).then(res => {
         this.addData = res.data
+        this.addData.type = JSON.parse(res.data.type).value
+        if (res.data.boxIdList instanceof Array && res.data.boxIdList.length > 0) {
+          this.useArea = 'spec'
+        }
       })
     }
   },
@@ -102,6 +145,7 @@ export default {
       this.$refs.addItem.validate((valid, items) => {
         if (valid) {
           this.addIng = true
+          this.addData.boxIds = this.addData.boxIdList.map(item => { return item.boxId }).toString()
           addCoupon(this.addData).then(res => {
             this.addIng = false
             if (res.code === 0) {
@@ -127,3 +171,10 @@ export default {
   }
 }
 </script>
+
+<style lang="scss" scoped>
+.tip {
+  font-size: 12px;
+  color: #888;
+}
+</style>

+ 125 - 0
src/views/business/coupon/components/selectTicket.vue

@@ -0,0 +1,125 @@
+<template>
+  <el-dialog title="选择盲票" :visible.sync="selectShow" width="800px" :close-on-click-modal="false" :destroy-on-close="true">
+    <el-form :model="queryParams" ref="queryForm" label-width="80px" size="small">
+      <el-row :gutter="10">
+        <el-col :span="7">
+          <el-form-item label="盲票名称">
+            <el-input
+              v-model="queryParams.title"
+              placeholder="请输入盲票名称"
+              clearable
+              @keyup.enter.native="queryParams.pageNum = 1;getList()"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="7">
+          <el-form-item label="盲票类型">
+            <el-select v-model="queryParams.type" placeholder="请选择盲票类型" clearable>
+              <el-option label="全部" value="" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="7">
+          <el-form-item label="上架状态">
+            <el-select v-model="queryParams.status" placeholder="请选择上架状态" clearable>
+              <el-option label="全部" value="" />
+              <!-- <el-option label="待上架" value="init" /> -->
+              <el-option label="已上架" value="on" />
+              <el-option label="已下架" value="off" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="3">
+          <el-form-item label-width="0">
+            <el-button type="primary" icon="el-icon-search" @click="queryParams.pageNum = 1;getList()">搜索</el-button>
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+    <el-table v-loading="loading" :data="tableData" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+      <el-table-column label="盲票ID" prop="boxId" width="80" />
+      <el-table-column label="盲票图片" prop="picUrl" align="center" width="80">
+        <template slot-scope="{row}">
+          <a target="_black" v-if="row.picUrl && row.picUrl.split(',').length > 0" :href="`${IMG_URL + row.picUrl}`"><img :src="`${IMG_URL + row.picUrl.split(',')[0]}`" style="max-height: 37px;max-width: 54px"></a>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="盲票名称" prop="title" />
+      <el-table-column label="盲票面值" prop="facePrice" />
+      <el-table-column label="盲票类型" prop="type">
+        <template slot-scope="{row}">
+          {{ JSON.parse(row.type).desc }}
+        </template>
+      </el-table-column>
+      <el-table-column label="盲票状态" prop="status">
+        <template slot-scope="{row}">
+          <el-tag :type="JSON.parse(row.status).value === 'on' ? 'success' : 'info'">{{ JSON.parse(row.status).desc }}</el-tag>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList()" />
+    <span slot="footer">
+      <el-button type="info" plain @click="selectShow = false">取消</el-button>
+      <el-button type="primary" @click="update">确定</el-button>
+    </span>
+  </el-dialog>
+</template>
+<script>
+import { getTicketList } from "@/api/business/ticket"
+import { publicFileGetUrl } from "@/api/common"
+export default {
+  name: "SelectTicket",
+  props: {
+    value: {
+      type: Array,
+      default: []
+    }
+  },
+  data() {
+    return {
+      IMG_URL: publicFileGetUrl,
+      loading: false,
+      selectShow: false,
+      tableData: [],
+      queryParams: {},
+      total: 0,
+      selection: []
+    }
+  },
+  methods: {
+    show() {
+      this.getList(true)
+      this.selectShow = true
+      this.selection = this.value
+      // this.$refs.table.toggleRowSelection(this.selection)
+    },
+    getList(reset) {
+      if (this.loading) {
+        return
+      }
+      this.loading = true
+      if (reset) {
+        this.queryParams = { pageNum: 1, pageSize: 20 }
+      }
+      getTicketList('pageNum='+this.queryParams.pageNum + '&pageSize='+this.queryParams.pageSize+'&', this.queryParams).then(res => {
+        this.loading = false
+        if (res.code === 0) {
+          this.tableData = res.rows
+          
+          this.total = res.total
+        }
+      }).catch(() => {
+        this.loading = false
+      })
+    },
+    handleSelectionChange(val) {
+      this.selection = val
+    },
+    update() {
+      this.$emit('input', this.selection)
+      this.selectShow = false
+    }
+  }
+}
+</script>

+ 30 - 17
src/views/business/coupon/index.vue

@@ -1,18 +1,27 @@
 <template>
   <div class="app-container coupon-list">
     <el-form v-show="showSearch" :model="queryParams" ref="queryForm" :inline="true" size="small">
-      <el-form-item label="优惠券名称" prop="title">
+      <el-form-item label="券名称">
         <el-input
           v-model="queryParams.title"
-          placeholder="请输入优惠券名称"
+          placeholder="请输入券名称"
           clearable
           @keyup.enter.native="queryParams.pageNum = 1;getList()"
         />
       </el-form-item>
-      <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择优惠券状态" clearable>
-          <el-option label="上架" value="on" />
-          <el-option label="下架" value="off" />
+      <el-form-item label="使用场景">
+        <el-select v-model="queryParams.type" placeholder="请选择券状态" clearable>
+          <el-option label="全部" value="" />
+          <el-option label="盲票购买" :value="1" />
+          <el-option label="门店消费" :value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="状态">
+        <el-select v-model="queryParams.status" placeholder="请选择券状态" clearable>
+          <el-option label="全部" value="" />
+          <el-option label="待上架" value="init" />
+          <el-option label="已上架" value="on" />
+          <el-option label="已下架" value="off" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -28,22 +37,25 @@
           size="mini"
           @click="$router.push('/coupon/add')"
           v-hasPermi="['business:coupon:add']"
-        >添加门店优惠券</el-button>
+        >添加券</el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     <el-table v-loading="loading" :data="tableData">
-      <el-table-column label="优惠券ID" prop="couponId" width="80" />
-      <el-table-column label="优惠券名称" prop="title" />
-      <el-table-column label="优惠券金额" prop="discount" />
-      <el-table-column label="优惠券类型" prop="type">
+      <el-table-column label="券ID" prop="couponId" width="80" />
+      <el-table-column label="券名称" prop="title" />
+      <el-table-column label="券金额" prop="discount" />
+      <el-table-column label="券类型" prop="type">
         <template slot-scope="{row}">
-          <span v-if="row.type === 1">门店消费</span>
-          <span v-if="row.type === 2">盲票购买</span>
+          {{ JSON.parse(row.type).desc }}
         </template>
       </el-table-column>
       <el-table-column label="已领取数量" prop="quantity" />
-      <el-table-column label="有效期限(天)" prop="dueDays" />
+      <el-table-column label="有效期限(天)" prop="dueDays">
+        <template slot-scope="{row}">
+          领取后{{ row.dueDays }}天内有效
+        </template>
+      </el-table-column>
       <el-table-column label="状态" prop="status">
         <template slot-scope="{row}">
           <el-tag :type="JSON.parse(row.status).value === 'on' ? 'success' : 'info'">{{ JSON.parse(row.status).desc }}</el-tag>
@@ -51,7 +63,8 @@
       </el-table-column>
       <el-table-column fixed="right" align="right" label="操作" width="150">
         <template slot-scope="{row}">
-          <el-button v-hasPermi="['business:coupon:edit']" type="text" @click="$router.push('/coupon/edit?id=' + row.couponId)">编辑</el-button>
+          <el-button v-hasPermi="['business:coupon:query']" type="text" @click="$router.push('/coupon/view?id=' + row.couponId)">查看</el-button>
+          <el-button v-if="JSON.parse(row.status).value === 'init'" v-hasPermi="['business:coupon:edit']" type="text" @click="$router.push('/coupon/edit?id=' + row.couponId)">编辑</el-button>
           <el-button v-if="JSON.parse(row.status).value === 'off'" v-hasPermi="['business:coupon:on']" type="text" @click="setStatus(row, 'on')">上架</el-button>
           <el-button v-if="JSON.parse(row.status).value === 'on'" v-hasPermi="['business:coupon:off']" type="text" @click="setStatus(row, 'off')">下架</el-button>
           <el-button v-if="JSON.parse(row.status).value === 'off'" v-hasPermi="['business:coupon:remove']" class="del" type="text" @click="del(row)">删除</el-button>
@@ -97,7 +110,7 @@ export default {
       })
     },
     setStatus(item, status) {
-      this.$confirm(`确认${status === 'on' ? '上架' : '下架'}代金券 “${item.title}” 吗?`, `${status === 'on' ? '上架' : '下架'}代金券`, {
+      this.$confirm(`确认${status === 'on' ? '上架' : '下架'}券 “${item.title}” 吗?`, `${status === 'on' ? '上架' : '下架'}券`, {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'
@@ -114,7 +127,7 @@ export default {
       })
     },
     del(item) {
-      this.$confirm(`确认删除代金券 “${item.title}” 吗?`, '删除代金券', {
+      this.$confirm(`确认删除券 “${item.title}” 吗?`, '删除券', {
         confirmButtonText: '确定',
         cancelButtonText: '取消',
         type: 'warning'