Sfoglia il codice sorgente

直播优惠券添加

yuhongqi 2 settimane fa
parent
commit
e85ea5937c

+ 1 - 1
.env.development

@@ -16,4 +16,4 @@ VUE_APP_VIDEO_LINE_1 = https://cos.his.cdwjyyh.com
 # 线路二地址
 VUE_APP_VIDEO_LINE_2 = https://zkzhobs.ylrztop.com
 
-VUE_APP_LIVE_WS_URL = wss://api.fhhx.runtzh.com
+VUE_APP_LIVE_WS_URL = wss://api.fhhx.runtzh.com/ws

+ 57 - 0
src/api/live/liveCoupon.js

@@ -68,3 +68,60 @@ export function exportStoreCoupon(query) {
     params: query
   })
 }
+
+export function listLiveCoupon(query) {
+  return request({
+    url: '/live/coupon/listLiveCoupon',
+    method: 'get',
+    params: query
+  })
+}
+
+export function listCoupon(query) {
+  return request({
+    url: '/live/coupon/listCoupon',
+    method: 'get',
+    params: query
+  })
+}
+export function addLiveCoupon(data) {
+  return request({
+    url: '/live/coupon/addLiveCoupon',
+    method: 'post',
+    data: data
+  })
+}
+
+export function handleDeleteSelected(data) {
+  return request({
+    url: '/live/coupon/handleDeleteSelected',
+    method: 'post',
+    data: data
+  })
+}
+
+export function handleIsShowChange(data) {
+  return request({
+    url: '/live/coupon/handleIsShowChange',
+    method: 'post',
+    data: data
+  })
+}
+
+// 删除直播商品
+export function delLiveCoupon(data) {
+  return request({
+    url: '/live/coupon/delLiveCoupon',
+    method: 'post',
+    data: data
+  })
+}
+// 删除直播商品
+export function updateLiveCouponBind(data) {
+  return request({
+    url: '/live/coupon/updateLiveCouponBind',
+    method: 'post',
+    data: data
+  })
+}
+

+ 3 - 0
src/views/live/liveConfig/index.vue

@@ -108,6 +108,7 @@ import LiveRedConf from './liveRedConf.vue'
 import LiveLotteryConf from './liveLotteryConf.vue'
 import LiveReplay from './liveReplay.vue'
 import Preview from './preview.vue'
+import LiveCoupon from './liveCoupon.vue'
 import { listLive, getLive, delLive, addLive, updateLive, exportLive,selectCompanyTalent,handleShelfOrUn,handleDeleteSelected } from "@/api/live/live";
 
 
@@ -122,6 +123,7 @@ export default {
     Goods,
     IdCard,
     Task,
+    LiveCoupon,
     Preview
   },
   data() {
@@ -135,6 +137,7 @@ export default {
         { name: '直播预告', label: '直播预告', index: 'preview'},
         { name: '红包配置', label: '红包配置', index: 'liveRedConf'},
         { name: '抽奖配置', label: '抽奖配置', index: 'liveLotteryConf'},
+        { name: '优惠券配置', label: '优惠券配置', index: 'liveCoupon'},
         // { name: '答题', label: '答题', index: 'answer'},
         { name: '直播商品', label: '直播商品', index: 'goods'},
         { name: '回放设置', label: '回放设置', index: 'liveReplay'},

+ 550 - 0
src/views/live/liveConfig/liveCoupon.vue

@@ -0,0 +1,550 @@
+<template>
+  <div class="el-container-md">
+
+    <div class="selection-toolbar">
+      <el-checkbox :indeterminate="isIndeterminate" v-model="allChecked" @change="toggleSelectAll">
+        {{ multipleSelection.length > 0 ? `已选 ${multipleSelection.length} 条` : '选中本页' }}
+      </el-checkbox>
+<!--      <el-button  plain size="mini" @click="handleShelf">上架</el-button>-->
+<!--      <el-button  plain size="mini" @click="handleUnshelf">下架</el-button>-->
+      <el-button  plain size="mini" @click="handleDeleteSelected">删除</el-button>
+      <el-button  plain type="mini" icon="el-icon-plus" @click="handleAddLiveCoupon">添加优惠券</el-button>
+    </div>
+    <el-table
+      ref="couponTable"
+      :data="couponLiveList"
+      style="width: 100%"
+      v-loading="loading"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55"></el-table-column>
+      <!-- 题干列:显示试题的主要内容 -->
+      <el-table-column
+        prop="couponId"
+        label="优惠券id"
+        show-overflow-tooltip
+      ></el-table-column>
+
+      <el-table-column
+        prop="title"
+        label="优惠券名称"
+      ></el-table-column>
+
+      <el-table-column
+        prop="couponPrice"
+        label="优惠券价格"
+      ></el-table-column>
+
+      <el-table-column
+        prop="useMinPrice"
+        label="优惠券使用最低价格"
+      ></el-table-column>
+
+      <el-table-column
+        prop="couponTime"
+        label="优惠券有效时间"
+      ></el-table-column>
+      <el-table-column
+        prop="productName"
+        label="绑定直播商品"
+      ></el-table-column>
+
+      <el-table-column
+        prop="isShow"
+        label="显示状态"
+      >
+        <template slot-scope="scope">
+            <el-switch
+              v-model="scope.row.isShow == 1"
+              @click.native.capture.prevent="handleSwitchClick(scope.row)"
+              active-color="#13ce66"
+              inactive-color="#ff4949">
+            </el-switch>
+        </template>
+      </el-table-column>
+
+
+
+      <!-- 操作列:包含编辑和删除按钮 -->
+      <el-table-column
+        label="操作"
+        width="180"
+        fixed="right"
+      >
+        <template slot-scope="scope">
+          <el-button
+            type="text"
+            size="small"
+            style="color: #0fae11;"
+            @click="handleCouponBind(scope.row)"
+          >绑定商品</el-button>
+          <el-button
+            type="text"
+            size="small"
+            style="color: #F56C6C;"
+            @click="handleCouponDelete(scope.row)"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页组件:用于分页展示试题列表 -->
+    <pagination
+      v-show="couponLiveTotal > 0"
+      :total="couponLiveTotal"
+      :page.sync="couponParams.pageNum"
+      :limit.sync="couponParams.pageSize"
+      @pagination="getLiveCouponList"
+      style="margin-top: 20px;"
+    />
+
+    <!-- 添加优惠券弹窗 -->
+    <el-dialog
+      title="添加优惠券"
+      :visible.sync="couponDialogVisible"
+      width="800px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <div class="dialog-content">
+        <div style="text-align: right; margin-bottom: 20px;">
+          <el-input
+            v-model="searchTitle"
+            placeholder="请输入优惠券名称"
+            style="width: 300px;"
+            @input="handleCouponSearch"
+          ></el-input>
+        </div>
+
+        <el-table
+          :data="couponList"
+          style="width: 100%"
+          v-loading="couponLoading"
+          @selection-change="handleCouponChange"
+          @row-click="handleCouponRowClick"
+          row-key="id"
+        >
+          <el-table-column
+            type="selection"
+            width="55"
+          >
+          </el-table-column>
+          <el-table-column
+            prop="title"
+            label="优惠券名称"
+            class-name="clickable-column"
+          ></el-table-column>
+          <el-table-column
+            prop="couponPrice"
+            label="优惠券价格"
+            class-name="clickable-column"
+          ></el-table-column>
+          <el-table-column
+            prop="useMinPrice"
+            label="优惠券使用最低价格"
+            class-name="clickable-column"
+          ></el-table-column>
+          <el-table-column
+            prop="couponTime"
+            label="优惠券有效时间"
+            class-name="clickable-column"
+          ></el-table-column>
+        </el-table>
+
+        <pagination
+          v-show="couponTotal > 0"
+          :total="couponTotal"
+          :page.sync="queryCouponParams.pageNum"
+          :limit.sync="queryCouponParams.pageSize"
+          @pagination="getCouponLists"
+          style="margin-top: 20px;"
+        />
+      </div>
+      <div slot="footer" class="dialog-footer">
+        <div style="display: flex; justify-content: space-between; align-items: center;">
+          <span class="selected-count">当前已选择 <span style="color: #00BFFF; font-style: italic;">{{ selectedCoupon.length }}</span> 优惠券</span>
+          <div>
+            <el-button @click="couponDialogVisible = false">取 消</el-button>
+            <el-button type="primary" @click="confirmAddCoupon">确 定</el-button>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+
+
+    <el-dialog
+      title="绑定商品"
+      :visible.sync="goodsDialogVisible"
+      width="400px"
+      :close-on-click-modal="false"
+      :close-on-press-escape="false"
+    >
+      <el-form :model="goodsForm" ref="goodsForm" :rules="salesRules">
+        <!-- 新增商品下拉选择 -->
+        <el-form-item label="选择商品" prop="goodsId">
+          <el-select
+            v-model="goodsForm.goodsId"
+            placeholder="请选择商品"
+            style="width: 100%;"
+            @change="handleGoodsChange"
+          >
+          <el-option
+            v-for="goods in goodsList"
+            :key="goods.goodsId"
+            :label="goods.productName"
+            :value="goods.goodsId"
+          ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="goodsDialogVisible = false">取 消</el-button>
+        <el-button type="primary" @click="confirmGoodChange">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  listLiveCoupon,
+  addLiveCoupon,
+  handleIsShowChange,
+  handleDeleteSelected,
+  delLiveCoupon,
+  updateLiveCouponBind,
+  listCoupon
+} from "@/api/live/liveCoupon";
+import { listLiveGoods} from "@/api/live/liveGoods";
+
+
+export default {
+  data() {
+    return {
+      liveId: '',
+      loading: true,
+      searchTitle: '',
+      queryCouponParams: {
+        pageNum: 1,
+        pageSize: 10,
+        couponName: '',
+        liveId: null,
+      },
+      couponLiveList: [],
+      couponLiveTotal: 0,
+      couponParams: {
+        pageNum: 1,
+        pageSize: 10,
+        liveId: null
+      },
+      couponList: [],
+      couponTotal: 0,
+      selectedCoupon: [],
+      couponLoading: false,
+      couponDialogVisible: false,
+      multipleSelection: [],
+      allChecked: false,
+      isIndeterminate: false,
+      socket: null,
+      stockDialogVisible: false,
+      goodsDialogVisible: false,
+      goodsList: [],
+      stockForm: {
+        goodsId: '',
+        stock: 0,
+        productId: 0,
+      },
+      goodsForm: {
+        goodsId: '',
+        sales: 0,
+        productId: 0,
+      },
+      stockRules: {
+        stock: [
+        { required: true, message: '请输入库存数量', trigger: 'blur' },
+        { type: 'number', min: 0, message: '库存数量不能小于0', trigger: 'blur' }
+      ]
+      },
+      salesRules: {
+        sales: [
+          { required: true, message: '请输入销量数量', trigger: 'blur' },
+          { type: 'number', min: 0, message: '库存数量不能小于0', trigger: 'blur' }
+        ]
+      }
+    };
+  },
+  watch: {
+     '$route.query': {
+      handler(newQuery) {
+        if (this.$route.params.liveId) {
+          this.liveId = this.$route.params.liveId;
+        }else {
+          this.liveId = this.$route.query.liveId;
+        }
+        this.couponParams.liveId = this.liveId
+        if(this.liveId == null) {
+          return;
+        }
+        this.getLiveCouponList();
+        this.socket = this.$store.state.liveWs[this.liveId]
+      },
+      // 初始化时立即执行一次
+      immediate: true
+    }
+  },
+  created() {
+    // if (this.$route.params.liveId) {
+    //   this.liveId = this.$route.params.liveId;
+    // }else {
+    //   this.liveId = this.$route.query.liveId;
+    // }
+    // this.goodsParams.liveId = this.liveId
+    // this.getLiveGoodsList();
+    // this.socket = this.$store.state.liveWs[this.liveId]
+  },
+  methods: {
+    handleGoodsChange(row){
+
+    },
+    getLiveGoodsList() {
+      listLiveGoods({"liveId":this.liveId,"pageNum":1,"pageSize":50}).then(response => {
+        this.goodsList = response.rows
+        this.goodsDialogVisible = true;
+      })
+    },
+    handleRouteChange(to, from) {
+      // 处理路由变化逻辑
+      console.log('路由变化:', from.path, '->', to.path);
+    },
+    handleSwitchClick(row) {
+      // 1. 获取「即将切换到的目标状态」(当前状态取反)
+      const targetStatus = !row.isShow
+      const couponList = row.id;
+      if (this.socket == null) {
+        this.$message.error("请从直播间开启展示状态!");
+        return;
+      }
+      handleIsShowChange({"couponId":couponList,"isShow":targetStatus,"liveId":this.liveId}).then(res=>{
+        if(res.code == 200){
+          row.isShow = targetStatus
+          if (res.msg == "目前仅支持单一优惠券推送") {
+            this.$message.error(res.msg)
+            return;
+          }
+          const msg = {
+            cmd: 'coupon',
+            data: {"liveId":this.liveId,"couponIssueId":row.id,"status":targetStatus ? 1 : 0,"goodsId":row.goodsId,"couponName":row.title,
+              "couponPrice":row.couponPrice,"useMinPrice":row.useMinPrice, "couponTime":row.couponTime}
+          }
+          this.socket.send(JSON.stringify(msg));
+
+        }
+      })
+    },
+
+    handleDeleteSelected(){
+      if (this.multipleSelection.length > 0) {
+        const goodsList = this.getSelectedList();
+        handleDeleteSelected({"couponIds":goodsList,"liveId":this.liveId}).then(res=>{
+          this.dealResult(res)
+        })
+      } else {
+        this.$message.info("请选择被删除的优惠券!")
+      }
+    },
+    dealResult(res){
+      if (res.code == 200) {
+        this.getLiveCouponList();
+        this.$refs.couponTable.clearSelection();
+      } else {
+        this.$message.error(res.msg);
+      }
+    },
+    getSelectedList(){
+      var couponList = []
+      this.multipleSelection.forEach(item => {
+        couponList.push(item.id);
+      })
+      return couponList;
+    },
+    // 全选或取消全选
+    toggleSelectAll(val) {
+      this.checked = val; // 更新 checkbox 的状态
+      if (val) {
+        // 如果 checkbox 被选中,则全选
+        this.toggleSelection(this.couponLiveList);
+      } else {
+        // 如果 checkbox 被取消选中,则取消全选
+        this.toggleSelection();
+      }
+    },
+    toggleSelection(rows) {
+      if (rows && !this.isIndeterminate) {
+        rows.forEach(row => {
+          this.$refs.couponTable.toggleRowSelection(row);
+        });
+      } else {
+        this.$refs.couponTable.clearSelection();
+      }
+    },
+    // 多选框选中数据
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+      // 根据选择项的数量更新 checkbox 的状态
+      this.allChecked = val.length === this.couponLiveList.length;
+      this.isIndeterminate = val.length > 0 && val.length < this.couponLiveList.length;
+    },
+
+    getLiveCouponList() {
+      this.loading = true
+      listLiveCoupon(this.couponParams).then(response => {
+        this.couponLiveList = response.rows
+        this.couponLiveTotal = response.total
+        this.loading = false
+      })
+    },
+
+    // // 添加确认修改库存方法
+    // goodsDialogVisible() {
+    //   this.$refs.couponForm.validate((valid) => {
+    //     if (valid) {
+    //       updateLiveCouponBind({
+    //         goodsId: this.goodsForm.goodsId,
+    //         couponId: this.goodsForm.sales,
+    //         productId: this.goodsForm.productId
+    //       }).then(response => {
+    //         if (response.code === 200) {
+    //           this.$message.success('销量修改成功');
+    //           this.salesDialogVisible = false;
+    //           this.getLiveCouponList(); // 重新获取列表数据
+    //         } else {
+    //           this.$message.error(response.msg || '销量修改失败');
+    //         }
+    //       });
+    //     }
+    //   });
+    // },
+    /** 处理行点击事件 */
+    handleCouponRowClick(row, column) {
+      // 如果点击的是复选框列,不进行处理
+      if (column.type === 'selection') {
+        return
+      }
+
+      // 获取表格实例
+      const table = this.$refs.couponTable[0]
+      if (!table) {
+        return
+      }
+
+      // 判断当前行是否已经被选中
+      const isSelected = this.selectedCoupon.some(item => item.id === row.id)
+
+      // 切换选中状态
+      table.toggleRowSelection(row, !isSelected)
+    },
+    getCouponLists() {
+      this.queryCouponParams.liveId = this.liveId
+      listCoupon(this.queryCouponParams).then(response => {
+        this.couponList = response.rows
+        this.couponTotal = response.total
+        this.loading = false
+      })
+    },
+    handleAddLiveCoupon(){
+      this.couponDialogVisible = true;
+      this.getCouponLists()
+    },
+    handleCouponSearch(){
+      this.queryCouponParams.pageNum = 1
+      this.queryCouponParams.couponName = this.searchTitle
+      this.getCouponLists()
+    },
+    handleCouponChange(coupon) {
+      this.selectedCoupon = coupon
+    },
+    confirmAddCoupon(){
+      if (this.selectedCoupon.length === 0) {
+        this.$message({
+          message: '请选择要添加的优惠券',
+          type: 'warning'
+        })
+        return
+      }
+      addLiveCoupon({
+        liveId: this.liveId,
+        couponIds: this.selectedCoupon.map(item => item.id).join(',')
+      }).then(response => {
+        if (response.code !== 200) {
+          this.$message({
+            message: response.msg,
+            type: 'warning'
+          });
+          return;
+        }
+        this.couponDialogVisible = false;
+        this.getLiveCouponList()
+      })
+    },
+    handleCouponDelete(row){
+      var couponList = []
+      couponList.push(row.id);
+      delLiveCoupon({"couponIds":couponList,"liveId":this.liveId}).then(response => {
+        this.getLiveCouponList()
+      })
+    },
+    handleCouponBind(row){
+      this.goodsForm.couponId = row.id;
+      this.goodsForm.goodsId = row.goodsId;
+      this.getLiveGoodsList()
+    },
+
+
+    handleGoodStock(row){
+      this.stockForm.goodsId = row.goodsId;
+      this.stockForm.stock = row.stock;
+      this.stockForm.productId = row.productId;
+      this.stockDialogVisible = true;
+    },
+    // 绑定商品
+    confirmGoodChange() {
+      this.$refs.goodsForm.validate((valid) => {
+        if (valid) {
+          updateLiveCouponBind({
+            goodsId: this.goodsForm.goodsId,
+            couponId: this.goodsForm.couponId,
+            liveId: this.liveId
+          }).then(response => {
+            if (response.code === 200) {
+              this.$message.success('商品修改成功');
+              this.goodsDialogVisible = false;
+              this.getLiveCouponList(); // 重新获取列表数据
+            } else {
+              this.$message.error(response.msg || '商品修改失败');
+            }
+          });
+        }
+      });
+    },
+
+  }
+};
+</script>
+
+<style scoped>
+.selection-toolbar {
+  display: flex;
+  align-items: center;
+  margin-bottom: 10px;
+  padding-left: 10px;
+}
+
+.selection-toolbar .el-checkbox {
+  margin-right: 10px;
+}
+
+/* 调整 checkbox 内部输入框的对齐 */
+.selection-toolbar .el-checkbox .el-checkbox__inner {
+  top: 8px; /* 根据实际需求调整 */
+}
+</style>