| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554 |
- <template>
- <div class="app-container">
- <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="请选择商品"
- filterable
- 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>
- </div>
- </template>
- <script>
- import {
- listLiveCoupon,
- addLiveCoupon,
- handleIsShowChange,
- handleDeleteSelected,
- delLiveCoupon,
- updateLiveCouponBind,
- listCoupon
- } from "@/api/live/liveCoupon";
- import { listLiveGoods} from "@/api/live/liveGoods";
- export default {
- name: "LiveLiveCoupon",
- 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>
|