Browse Source

代金券

bihs 3 weeks ago
parent
commit
0416627c07
22 changed files with 1562 additions and 21 deletions
  1. 24 3
      qmjszx-admin/src/main/java/beilv/web/controller/bootacourse/bootACourseController.java
  2. 62 0
      qmjszx-admin/src/main/resources/templates/voucher/add.html
  3. 94 0
      qmjszx-admin/src/main/resources/templates/voucher/coupon.html
  4. 63 0
      qmjszx-admin/src/main/resources/templates/voucher/edit.html
  5. 87 0
      qmjszx-admin/src/main/resources/templates/voucher/member/water.html
  6. 104 0
      qmjszx-admin/src/main/resources/templates/voucher/voucher.html
  7. 0 1
      qmjszx-business/src/main/java/beilv/shopping/controller/QmjsShoppingMallAppController.java
  8. 42 17
      qmjszx-business/src/main/java/beilv/shopping/domain/QmjsShoppingMall.java
  9. 54 0
      qmjszx-business/src/main/java/beilv/voucher/controller/AppVoucherController.java
  10. 138 0
      qmjszx-business/src/main/java/beilv/voucher/controller/BeilvVoucherController.java
  11. 76 0
      qmjszx-business/src/main/java/beilv/voucher/controller/BeilvVoucherMemberController.java
  12. 54 0
      qmjszx-business/src/main/java/beilv/voucher/domain/BeilvVoucher.java
  13. 93 0
      qmjszx-business/src/main/java/beilv/voucher/domain/BeilvVoucherMember.java
  14. 62 0
      qmjszx-business/src/main/java/beilv/voucher/mapper/BeilvVoucherMapper.java
  15. 70 0
      qmjszx-business/src/main/java/beilv/voucher/mapper/BeilvVoucherMemberMapper.java
  16. 69 0
      qmjszx-business/src/main/java/beilv/voucher/service/IBeilvVoucherMemberService.java
  17. 64 0
      qmjszx-business/src/main/java/beilv/voucher/service/IBeilvVoucherService.java
  18. 110 0
      qmjszx-business/src/main/java/beilv/voucher/service/impl/BeilvVoucherMemberServiceImpl.java
  19. 93 0
      qmjszx-business/src/main/java/beilv/voucher/service/impl/BeilvVoucherServiceImpl.java
  20. 72 0
      qmjszx-business/src/main/resources/mapper/voucher/BeilvVoucherMapper.xml
  21. 97 0
      qmjszx-business/src/main/resources/mapper/voucher/BeilvVoucherMemberMapper.xml
  22. 34 0
      qmjszx-quartz/src/main/java/beilv/quartz/task/CouponTask.java

+ 24 - 3
qmjszx-admin/src/main/java/beilv/web/controller/bootacourse/bootACourseController.java

@@ -7,13 +7,18 @@ import beilv.bootacourse.domain.BootACourseBO;
 import beilv.bootacourse.service.IBootACourseService;
 import beilv.common.core.controller.BaseController;
 import beilv.common.core.domain.AjaxResult;
+import beilv.common.core.page.PageDomain;
+import beilv.common.core.page.TableSupport;
 import beilv.common.utils.DictUtils;
 import beilv.common.utils.uuid.IdUtils;
 import beilv.site.domain.BeilvSite;
 import beilv.site.service.IBeilvSiteService;
+import beilv.system.domain.SysNotice;
 import beilv.usermembershipcard.domain.MemberStream;
 import beilv.usermembershipcard.domain.UserMembershipCard;
 import beilv.usermembershipcard.service.IUserMembershipCardService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
 import org.apache.commons.collections4.MapUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
@@ -65,15 +70,31 @@ public class bootACourseController extends BaseController {
      *
      * @param beilvSite venueId(场馆id) 默认值8
      */
-    @PostMapping("/getSiteList")
-    public AjaxResult getSiteList(@RequestBody BeilvSite beilvSite) {
+    @GetMapping("/getSiteList")
+    public Map<String, Object> getSiteList(BeilvSite beilvSite) {
+        // 获取分页参数
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        // 设置分页
+        PageHelper.startPage(pageNum, pageSize);
         beilvSite.setVenueId(8L);
         //获取会员卡集合
         List<BeilvSite> beilvSites = siteService.selectBeilvSiteList(beilvSite);
         beilvSites.forEach(site->{
             site.setCoverList(new ArrayList<>(Arrays.asList(site.getCover().split(","))));
         });
-        return AjaxResult.success(beilvSites);
+        // 获取分页信息
+        PageInfo<BeilvSite> pageInfo = new PageInfo<>(beilvSites);
+        // 返回分页数据
+        Map<String, Object> response = new HashMap<>();
+        response.put("msg", "操作成功");
+        response.put("code", 200);
+        Map<String, Object> data = new HashMap<>();
+        data.put("total", pageInfo.getTotal());
+        data.put("rows", pageInfo.getList());
+        response.put("data", data);
+        return response;
     }
 
     /**

+ 62 - 0
qmjszx-admin/src/main/resources/templates/voucher/add.html

@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('新增代金券')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-voucher-add">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label is-required">代金券名称:</label>
+                    <div class="col-sm-8">
+                        <input name="voucherName" class="form-control" type="text" required>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label is-required">代金券金额:</label>
+                    <div class="col-sm-8">
+                        <input name="voucherPrice" class="form-control" type="text" required>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label is-required">代金券类型:</label>
+                    <div class="col-sm-8">
+                        <select name="voucherType" class="form-control" th:with="type=${@dict.getType('voucher_type')}">
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "voucher"
+        $("#form-voucher-add").validate({
+            focusCleanup: true,
+            rules:{
+                voucherName:{
+                    required:true
+                },
+                voucherPrice:{
+                    double:true
+                },
+                voucherType:{
+                    required:true
+                },
+            },
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/add", $('#form-voucher-add').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 94 - 0
qmjszx-admin/src/main/resources/templates/voucher/coupon.html

@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <th:block th:include="include :: header('发放代金券')"/>
+    <th:block th:include="include :: datetimepicker-css"/>
+</head>
+<body class="white-bg">
+<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+    <form class="form-horizontal m" id="form-coupon">
+        <!-- 隐藏字段,用于传递代金券ID -->
+        <input name="voucherId" th:value="${voucher.id}" type="hidden">
+
+        <!-- 代金券信息 -->
+        <div class="col-xs-12">
+            <div class="form-group">
+                <label class="col-sm-3 control-label">代金券名称:</label>
+                <div class="col-sm-8">
+                    <input name="displayCardNumber" th:value="${voucher.voucherName}" class="form-control" type="text"
+                           disabled>
+                </div>
+            </div>
+        </div>
+        <div class="col-xs-12">
+            <div class="form-group">
+                <label class="col-sm-3 control-label">代金券金额:</label>
+                <div class="col-sm-8">
+                    <input name="displayCardNumber" th:value="${voucher.voucherPrice}" class="form-control" type="text"
+                           disabled>
+                </div>
+            </div>
+        </div>
+        <!-- 有效期 -->
+        <div class="col-xs-12">
+            <div class="form-group">
+                <label class="col-sm-3 control-label is-required">有效期:</label>
+                <div class="col-sm-8">
+                    <input name="validityTime" type="text" class="form-control" id="datetimepicker-demo-2"
+                           placeholder="yyyy-MM-dd" required>
+                </div>
+            </div>
+        </div>
+        <!-- 用户列表 -->
+        <div class="col-xs-12">
+            <div class="form-group">
+                <label class="col-sm-3 control-label is-required">发放用户:</label>
+                <div class="col-sm-8">
+                    <select name="memberId" class="form-control">
+                        <option value="">请选择用户</option>
+                        <option th:each="member : ${members}" th:value="${member.id}" th:text="${member.username}" required></option>
+                    </select>
+                </div>
+            </div>
+        </div>
+        <!-- 隐藏提交按钮 -->
+<!--        <div class="col-xs-12" style="display:none;">-->
+<!--            <div class="form-group">-->
+<!--                <div class="col-sm-8 col-sm-offset-3">-->
+<!--                    <button class="btn btn-primary" type="button" onclick="submitHandler()">发放</button>-->
+<!--                </div>-->
+<!--            </div>-->
+<!--        </div>-->
+    </form>
+</div>
+<th:block th:include="include :: footer"/>
+<th:block th:include="include :: datetimepicker-js"/>
+<script th:inline="javascript">
+    $("#datetimepicker-demo-2").datetimepicker({
+        format: "yyyy-mm-dd",
+        minView: "month",
+        autoclose: true,
+        clearBtn: true
+    });
+
+    var prefix = ctx + "voucher/member";
+    $("#form-coupon").validate({
+        focusCleanup: true,
+        rules: {
+            validityTime: {
+                required: true
+            },
+            memberId: {
+                required: true
+            },
+        }
+    });
+    
+    function submitHandler() {
+        if ($.validate.form()) {
+            $.operate.save(prefix + "/add", $('#form-coupon').serialize());
+        }
+    }
+</script>
+</body>
+</html>

+ 63 - 0
qmjszx-admin/src/main/resources/templates/voucher/edit.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
+<head>
+    <th:block th:include="include :: header('修改代金券')" />
+</head>
+<body class="white-bg">
+    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
+        <form class="form-horizontal m" id="form-voucher-edit" th:object="${beilvVoucher}">
+            <input name="id" th:field="*{id}" type="hidden">
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label is-required">代金券名称:</label>
+                    <div class="col-sm-8">
+                        <input name="voucherName" th:field="*{voucherName}" class="form-control" type="text" required>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label is-required">代金券金额:</label>
+                    <div class="col-sm-8">
+                        <input name="voucherPrice" th:field="*{voucherPrice}" class="form-control" type="text" required>
+                    </div>
+                </div>
+            </div>
+            <div class="col-xs-12">
+                <div class="form-group">
+                    <label class="col-sm-3 control-label is-required">代金券类型:</label>
+                    <div class="col-sm-8">
+                        <select name="voucherType" class="form-control" th:with="type=${@dict.getType('voucher_type')}" required>
+                            <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{voucherType}"></option>
+                        </select>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+    <th:block th:include="include :: footer" />
+    <script th:inline="javascript">
+        var prefix = ctx + "voucher";
+        $("#form-voucher-edit").validate({
+            focusCleanup: true,
+            rules:{
+                voucherName:{
+                    required:true
+                },
+                voucherPrice:{
+                    double:true
+                },
+                voucherType:{
+                    required:true
+                },
+            },
+        });
+
+        function submitHandler() {
+            if ($.validate.form()) {
+                $.operate.save(prefix + "/edit", $('#form-voucher-edit').serialize());
+            }
+        }
+    </script>
+</body>
+</html>

+ 87 - 0
qmjszx-admin/src/main/resources/templates/voucher/member/water.html

@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org">
+<head>
+    <th:block th:include="include :: header('代金券流水')"/>
+</head>
+<body class="white-bg">
+<div class="wrapper wrapper-content animated fadeInRight ibox-content">
+    <form class="form-horizontal m" id="form-water">
+        <!-- 隐藏字段,用于传递代金券ID -->
+        <input name="voucherId" th:value="${voucherId}" type="hidden">
+
+        <div class="col-sm-12 select-table table-striped">
+            <table id="bootstrap-table"></table>
+        </div>
+    </form>
+</div>
+<th:block th:include="include :: footer"/>
+<script th:inline="javascript">
+    var prefix = ctx + "voucher/member";
+    var voucherTypeDatas = /*[[${@dict.getType('voucher_type')}]]*/ [];
+    $(function() {
+        var options = {
+            url: prefix + "/list",
+            modalName: "代金券流水",
+            queryParam: function() {
+                return {
+                    voucherId: $("input[name='voucherId']").val()
+                };
+            },
+            columns: [{
+                checkbox: true
+            },
+                {
+                    field: 'id',
+                    title: 'ID',
+                    visible: false
+                },
+                {
+                    field: 'username',
+                    title: '用户名称',
+                    visible: false
+                },
+                {
+                    field: 'voucherName',
+                    title: '代金券名称',
+                    visible: false
+                },
+                {
+                    field: 'voucherPrice',
+                    title: '代金券金额'
+                },
+                {
+                    field: 'validityTime',
+                    title: '有效期',
+                    formatter: function(value, row, index) {
+                        // 使用 ry-ui.js 中的 dateFormat 方法替代 $.common.formatDate
+                        return $.common.dateFormat(value);
+                    }
+                },
+                {
+                    field: 'voucherType',
+                    title: '代金券类型',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(voucherTypeDatas, value);
+                    }
+                },
+                {
+                    field: 'isValidity',
+                    title: '是否过期',
+                    formatter: function(value, row, index) {
+                        if (value == '1') {
+                            return '未使用';
+                        } else if (value == '2') {
+                            return '已使用';
+                        } else if (value == '3') {
+                            return '已过期';
+                        } else {
+                            return value;
+                        }
+                    }
+                }]
+        };
+        $.table.init(options);
+    });
+</script>
+</body>
+</html>

+ 104 - 0
qmjszx-admin/src/main/resources/templates/voucher/voucher.html

@@ -0,0 +1,104 @@
+<!DOCTYPE html>
+<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
+<head>
+    <th:block th:include="include :: header('代金券列表')"/>
+</head>
+<body class="gray-bg">
+<div class="container-div">
+    <div class="row">
+        <div class="col-sm-12 search-collapse">
+            <form id="formId">
+                <div class="select-list">
+                    <ul>
+                        <li>
+                            <label style="width:85px">代金券名称:</label>
+                            <input type="text" name="voucherName"/>
+                        </li>
+                        <li>
+                            <a class="btn btn-primary btn-rounded btn-sm" onclick="$.table.search()"><i
+                                    class="fa fa-search"></i>&nbsp;搜索</a>
+                            <a class="btn btn-warning btn-rounded btn-sm" onclick="$.form.reset()"><i
+                                    class="fa fa-refresh"></i>&nbsp;重置</a>
+                        </li>
+                    </ul>
+                </div>
+            </form>
+        </div>
+
+        <div class="btn-group-sm" id="toolbar" role="group">
+            <a class="btn btn-success" onclick="$.operate.add()">
+                <i class="fa fa-plus"></i> 添加
+            </a>
+            <a class="btn btn-primary single disabled" onclick="$.operate.edit()">
+                <i class="fa fa-edit"></i> 修改
+            </a>
+            <a class="btn btn-danger multiple disabled" onclick="$.operate.removeAll()">
+                <i class="fa fa-remove"></i> 删除
+            </a>
+        </div>
+        <div class="col-sm-12 select-table table-striped">
+            <table id="bootstrap-table"></table>
+        </div>
+    </div>
+</div>
+<th:block th:include="include :: footer"/>
+<script th:inline="javascript">
+    var prefix = ctx + "voucher";
+    var voucherTypeDatas = [[${@dict.getType('voucher_type')}]];
+    $(function () {
+        var options = {
+            url: prefix + "/list",
+            createUrl: prefix + "/add",
+            updateUrl: prefix + "/edit/{id}",
+            removeUrl: prefix + "/remove",
+            exportUrl: prefix + "/export",
+            modalName: "代金券",
+            columns: [{
+                checkbox: true
+            },
+                {
+                    field: 'id',
+                    title: '${comment}',
+                    visible: false
+                },
+                {
+                    field: 'voucherName',
+                    title: '代金券名称'
+                },
+                {
+                    field: 'voucherPrice',
+                    title: '代金券金额'
+                },
+                {
+                    field: 'voucherType',
+                    title: '代金券类型',
+                    formatter: function (value, row, index) {
+                        return $.table.selectDictLabel(voucherTypeDatas, value);
+                    }
+                },
+                {
+                    title: '操作',
+                    align: 'center',
+                    formatter: function (value, row, index) {
+                        var actions = [];
+                        actions.push('<a class="btn btn-success btn-xs ' + '" href="javascript:void(0)" onclick="$.operate.edit(\'' + row.id + '\')"><i class="fa fa-edit"></i>编辑</a> ');
+                        actions.push('<a class="btn btn-success btn-xs ' + '" href="javascript:void(0)" onclick="issueCoupons(\'' + row.id + '\')"><i class="fa fa-chevron-down"></i>发券</a> ');
+                        actions.push('<a class="btn btn-success btn-xs ' + '" href="javascript:void(0)" onclick="couponWater(\'' + row.id + '\')"><i class="fa fa-shopping-cart"></i>发放流水</a> ');
+                        actions.push('<a class="btn btn-danger btn-xs ' + '" href="javascript:void(0)" onclick="$.operate.remove(\'' + row.id + '\')"><i class="fa fa-remove"></i>删除</a>');
+                        return actions.join('');
+                    }
+                }]
+        };
+        $.table.init(options);
+    });
+
+    function issueCoupons(id) {
+        $.modal.open("发放优惠券", prefix + "/coupon/" + id);
+    }
+    function couponWater(id) {
+        // 使用模态框打开water页面
+        $.modal.open("代金券流水", prefix + "/member/water/" + id);
+    }
+</script>
+</body>
+</html>

+ 0 - 1
qmjszx-business/src/main/java/beilv/shopping/controller/QmjsShoppingMallAppController.java

@@ -36,7 +36,6 @@ public class QmjsShoppingMallAppController extends BaseController
      * 小程序商城列表
      */
     @GetMapping("/shoppingList")
-    @ResponseBody
     public Map<String, Object> shoppingList(QmjsShoppingMall qmjsShoppingMall) {
         // 获取分页参数
         PageDomain pageDomain = TableSupport.buildPageRequest();

+ 42 - 17
qmjszx-business/src/main/java/beilv/shopping/domain/QmjsShoppingMall.java

@@ -11,69 +11,94 @@ import beilv.common.core.domain.BaseEntity;
 
 /**
  * 商城对象 qmjs_shopping_mall
- * 
+ *
  * @author lc
  * @date 2025-01-02
  */
 @Data
-public class QmjsShoppingMall extends BaseEntity
-{
+public class QmjsShoppingMall extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** 主键id */
+    /**
+     * 主键id
+     */
     private Long id;
 
-    /** 商品名称 */
+    /**
+     * 商品名称
+     */
     @Excel(name = "商品名称")
     private String goodsName;
 
-    /** 商品条码 */
+    /**
+     * 商品条码
+     */
     @Excel(name = "商品条码")
     private String goodsCode;
 
-    /** 商品种类 */
+    /**
+     * 商品种类
+     */
     @Excel(name = "商品种类")
     private String goodsType;
 
-    /** 商品图片 */
+    /**
+     * 商品图片
+     */
     @Excel(name = "商品图片")
     private String goodsImg;
 
 //    private String[] imageUrlsArray;
 
-    /** 商品说明 */
+    /**
+     * 商品说明
+     */
     @Excel(name = "商品说明")
     private String goodsDescribe;
 
-    /** 计量单位 */
+    /**
+     * 计量单位
+     */
     @Excel(name = "计量单位")
     private String goodsUnit;
 
-    /** 时价商品(是/否) */
+    /**
+     * 时价商品(是/否)
+     */
     @Excel(name = "时价商品", readConverterExp = "是=/否")
     private String goodsCurrentPrice;
 
-    /** 销售单价 */
+    /**
+     * 销售单价
+     */
     @Excel(name = "销售单价")
     private BigDecimal salePrice;
 
-    /** 建议售价 */
+    /**
+     * 建议售价
+     */
     @Excel(name = "建议售价")
     private BigDecimal suggestionPrice;
 
-    /** 商品库存 */
+    /**
+     * 商品库存
+     */
     @Excel(name = "商品库存")
     private String goodsInventory;
 
-    /** 库存成本 */
+    /**
+     * 库存成本
+     */
     @Excel(name = "库存成本")
     private BigDecimal inventoryCost;
 
-    /** 商品状态(正常/禁用) */
+    /**
+     * 商品状态(正常/禁用)
+     */
     @Excel(name = "商品状态(正常/禁用)")
     private String goodsState;
 
-    @Excel(name="积分兑换")
+    @Excel(name = "积分兑换")
     private BigDecimal goodsScore;
 
 

+ 54 - 0
qmjszx-business/src/main/java/beilv/voucher/controller/AppVoucherController.java

@@ -0,0 +1,54 @@
+package beilv.voucher.controller;
+
+import beilv.common.core.controller.BaseController;
+import beilv.common.core.domain.AjaxResult;
+import beilv.common.core.page.PageDomain;
+import beilv.common.core.page.TableDataInfo;
+import beilv.common.core.page.TableSupport;
+import beilv.site.domain.BeilvSite;
+import beilv.voucher.domain.BeilvVoucher;
+import beilv.voucher.domain.BeilvVoucherMember;
+import beilv.voucher.service.IBeilvVoucherMemberService;
+import beilv.voucher.service.IBeilvVoucherService;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Controller
+@RequestMapping("/app-api/voucher")
+public class AppVoucherController extends BaseController {
+
+    @Autowired
+    private IBeilvVoucherMemberService beilvVoucherMemberService;
+
+    /**
+     * 查询代金券列表
+     */
+    @GetMapping("/selectAppVoucherList")
+    public Map<String, Object> selectAppVoucherList(BeilvVoucherMember beilvVoucherMember) {
+        // 获取分页参数
+        PageDomain pageDomain = TableSupport.buildPageRequest();
+        Integer pageNum = pageDomain.getPageNum();
+        Integer pageSize = pageDomain.getPageSize();
+        // 设置分页
+        PageHelper.startPage(pageNum, pageSize);
+        List<BeilvVoucherMember> list = beilvVoucherMemberService.selectAppVoucherList(beilvVoucherMember);
+        // 获取分页信息
+        PageInfo<BeilvVoucherMember> pageInfo = new PageInfo<>(list);
+        // 返回分页数据
+        Map<String, Object> response = new HashMap<>();
+        response.put("msg", "操作成功");
+        response.put("code", 200);
+        Map<String, Object> data = new HashMap<>();
+        data.put("total", pageInfo.getTotal());
+        data.put("rows", pageInfo.getList());
+        response.put("data", data);
+        return response;
+    }
+}

+ 138 - 0
qmjszx-business/src/main/java/beilv/voucher/controller/BeilvVoucherController.java

@@ -0,0 +1,138 @@
+package beilv.voucher.controller;
+
+import java.util.List;
+
+import beilv.shopping.domain.QmjsShoppingMall;
+import beilv.system.domain.SysMember;
+import beilv.system.service.ISysMemberService;
+import beilv.vipCard.domain.Exchange;
+import beilv.vipCard.domain.VipCard;
+import beilv.voucher.domain.BeilvVoucherMember;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import beilv.common.annotation.Log;
+import beilv.common.enums.BusinessType;
+import beilv.voucher.domain.BeilvVoucher;
+import beilv.voucher.service.IBeilvVoucherService;
+import beilv.common.core.controller.BaseController;
+import beilv.common.core.domain.AjaxResult;
+import beilv.common.utils.poi.ExcelUtil;
+import beilv.common.core.page.TableDataInfo;
+
+/**
+ * 代金券Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+@Controller
+@RequestMapping("/voucher")
+public class BeilvVoucherController extends BaseController {
+    private String prefix = "voucher";
+
+    @Autowired
+    private IBeilvVoucherService beilvVoucherService;
+    @Autowired
+    private ISysMemberService sysMemberService;
+
+
+    @GetMapping()
+    public String voucher() {
+        return prefix + "/voucher";
+    }
+
+    /**
+     * 查询代金券列表
+     */
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo list(BeilvVoucher beilvVoucher) {
+        startPage();
+        List<BeilvVoucher> list = beilvVoucherService.selectBeilvVoucherList(beilvVoucher);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出代金券列表
+     */
+    @Log(title = "代金券", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    @ResponseBody
+    public AjaxResult export(BeilvVoucher beilvVoucher) {
+        List<BeilvVoucher> list = beilvVoucherService.selectBeilvVoucherList(beilvVoucher);
+        ExcelUtil<BeilvVoucher> util = new ExcelUtil<BeilvVoucher>(BeilvVoucher.class);
+        return util.exportExcel(list, "代金券数据");
+    }
+
+    /**
+     * 新增代金券
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存代金券
+     */
+    @Log(title = "代金券", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(BeilvVoucher beilvVoucher) {
+        return toAjax(beilvVoucherService.insertBeilvVoucher(beilvVoucher));
+    }
+
+    /**
+     * 修改代金券
+     */
+    @GetMapping("/edit/{id}")
+    public String edit(@PathVariable("id") Long id, ModelMap mmap) {
+        BeilvVoucher beilvVoucher = beilvVoucherService.selectBeilvVoucherById(id);
+        mmap.put("beilvVoucher", beilvVoucher);
+        return prefix + "/edit";
+    }
+
+    /**
+     * 修改保存代金券
+     */
+    @Log(title = "代金券", businessType = BusinessType.UPDATE)
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(BeilvVoucher beilvVoucher) {
+        return toAjax(beilvVoucherService.updateBeilvVoucher(beilvVoucher));
+    }
+
+    /**
+     * 删除代金券
+     */
+    @Log(title = "代金券", businessType = BusinessType.DELETE)
+    @PostMapping("/remove")
+    @ResponseBody
+    public AjaxResult remove(String ids) {
+        return toAjax(beilvVoucherService.deleteBeilvVoucherByIds(ids));
+    }
+
+    /**
+     * 发放代金券
+     * @param id
+     * @param mmap
+     * @return
+     */
+    @GetMapping("/coupon/{id}")
+    public String exchangeInfo(@PathVariable("id") Long id, ModelMap mmap) {
+        BeilvVoucher beilvVoucher = beilvVoucherService.selectBeilvVoucherById(id);
+        List<SysMember> members = sysMemberService.selectSysMemberList(new SysMember());
+        mmap.put("voucher", beilvVoucher);
+        mmap.put("members", members);
+        return prefix + "/coupon";
+    }
+
+
+}

+ 76 - 0
qmjszx-business/src/main/java/beilv/voucher/controller/BeilvVoucherMemberController.java

@@ -0,0 +1,76 @@
+package beilv.voucher.controller;
+
+import java.util.List;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import beilv.common.annotation.Log;
+import beilv.common.enums.BusinessType;
+import beilv.voucher.domain.BeilvVoucherMember;
+import beilv.voucher.service.IBeilvVoucherMemberService;
+import beilv.common.core.controller.BaseController;
+import beilv.common.core.domain.AjaxResult;
+import beilv.common.utils.poi.ExcelUtil;
+import beilv.common.core.page.TableDataInfo;
+
+/**
+ * 代金券用户关系Controller
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+@Controller
+@RequestMapping("/voucher/member")
+public class BeilvVoucherMemberController extends BaseController {
+    private String prefix = "voucher/member";
+
+    @Autowired
+    private IBeilvVoucherMemberService beilvVoucherMemberService;
+
+    @GetMapping()
+    public String member() {
+        return prefix + "/voucher/member";
+    }
+
+    @GetMapping("/water/{id}")
+    public String openDetails(@PathVariable("id") Long id, ModelMap mmap) {
+        mmap.put("voucherId", id);
+        return prefix + "/water";
+    }
+
+    /**
+     * 查询代金券用户关系列表
+     */
+    @PostMapping("/list")
+    @ResponseBody
+    public TableDataInfo couponWater(BeilvVoucherMember beilvVoucherMember) {
+        startPage();
+        List<BeilvVoucherMember> list = beilvVoucherMemberService.selectBeilvVoucherMemberList(beilvVoucherMember);
+        return getDataTable(list);
+    }
+
+    /**
+     * 新增代金券用户关系
+     */
+    @GetMapping("/add")
+    public String add() {
+        return prefix + "/add";
+    }
+
+    /**
+     * 新增保存代金券用户关系
+     */
+    @Log(title = "代金券用户关系", businessType = BusinessType.INSERT)
+    @PostMapping("/add")
+    @ResponseBody
+    public AjaxResult addSave(BeilvVoucherMember beilvVoucherMember) {
+        return toAjax(beilvVoucherMemberService.insertBeilvVoucherMember(beilvVoucherMember));
+    }
+}

+ 54 - 0
qmjszx-business/src/main/java/beilv/voucher/domain/BeilvVoucher.java

@@ -0,0 +1,54 @@
+package beilv.voucher.domain;
+
+import java.math.BigDecimal;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import beilv.common.annotation.Excel;
+import beilv.common.core.domain.BaseEntity;
+
+/**
+ * 代金券对象 beilv_voucher
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+@Data
+public class BeilvVoucher extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键Id
+     */
+    private Long id;
+
+    /**
+     * 代金券名称
+     */
+    @Excel(name = "代金券名称")
+    private String voucherName;
+
+    /**
+     * 代金券金额
+     */
+    @Excel(name = "代金券金额")
+    private BigDecimal voucherPrice;
+
+    /**
+     * 代金券类型
+     */
+    @Excel(name = "代金券类型")
+    private String voucherType;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 是否过期(1:未使用;2:已使用;3:已过期)
+     */
+    @Excel(name = "是否过期(1:未使用;2:已使用;3:已过期)")
+    private String isValidity;
+}

+ 93 - 0
qmjszx-business/src/main/java/beilv/voucher/domain/BeilvVoucherMember.java

@@ -0,0 +1,93 @@
+package beilv.voucher.domain;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import beilv.common.annotation.Excel;
+import beilv.common.core.domain.BaseEntity;
+
+/**
+ * 代金券用户关系对象 beilv_voucher_member
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+@Data
+public class BeilvVoucherMember extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+
+    /**
+     * 代金券id
+     */
+    @Excel(name = "代金券id")
+    private Long voucherId;
+
+    /**
+     * 用户id
+     */
+    @Excel(name = "用户id")
+    private Long memberId;
+
+    /**
+     * 代金券有效期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @Excel(name = "代金券有效期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date validityTime;
+
+    /**
+     * 是否过期(1:未使用;2:已使用;3:已过期)
+     */
+    @Excel(name = "是否过期(1:未使用;2:已使用;3:已过期)")
+    private String isValidity;
+
+    /**
+     * 是否过期(1:未使用;2:已使用;3:已过期)
+     */
+    @Excel(name = "是否过期(1:未使用;2:已使用;3:已过期)")
+    private String isValidityText;
+
+    /**
+     * 用户名称
+     */
+    private String username;
+
+    /**
+     * 代金券名称
+     */
+    @Excel(name = "代金券名称")
+    private String voucherName;
+
+    /**
+     * 代金券金额
+     */
+    @Excel(name = "代金券金额")
+    private BigDecimal voucherPrice;
+
+    /**
+     * 代金券类型
+     */
+    @Excel(name = "代金券类型")
+    private String voucherType;
+
+    /**
+     * 代金券类型
+     */
+    @Excel(name = "代金券类型")
+    private String voucherTypeText;
+
+    public BeilvVoucherMember() {
+
+    }
+
+    public BeilvVoucherMember(String isValidity) {
+        this.isValidity = isValidity;
+    }
+}

+ 62 - 0
qmjszx-business/src/main/java/beilv/voucher/mapper/BeilvVoucherMapper.java

@@ -0,0 +1,62 @@
+package beilv.voucher.mapper;
+
+import java.util.List;
+
+import beilv.voucher.domain.BeilvVoucher;
+
+/**
+ * 代金券Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+public interface BeilvVoucherMapper {
+    /**
+     * 查询代金券
+     *
+     * @param id 代金券主键
+     * @return 代金券
+     */
+    public BeilvVoucher selectBeilvVoucherById(Long id);
+
+    /**
+     * 查询代金券列表
+     *
+     * @param beilvVoucher 代金券
+     * @return 代金券集合
+     */
+    public List<BeilvVoucher> selectBeilvVoucherList(BeilvVoucher beilvVoucher);
+
+    /**
+     * 新增代金券
+     *
+     * @param beilvVoucher 代金券
+     * @return 结果
+     */
+    public int insertBeilvVoucher(BeilvVoucher beilvVoucher);
+
+    /**
+     * 修改代金券
+     *
+     * @param beilvVoucher 代金券
+     * @return 结果
+     */
+    public int updateBeilvVoucher(BeilvVoucher beilvVoucher);
+
+    /**
+     * 删除代金券
+     *
+     * @param id 代金券主键
+     * @return 结果
+     */
+    public int deleteBeilvVoucherById(Long id);
+
+    /**
+     * 批量删除代金券
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBeilvVoucherByIds(String[] ids);
+
+}

+ 70 - 0
qmjszx-business/src/main/java/beilv/voucher/mapper/BeilvVoucherMemberMapper.java

@@ -0,0 +1,70 @@
+package beilv.voucher.mapper;
+
+import java.util.List;
+
+import beilv.voucher.domain.BeilvVoucher;
+import beilv.voucher.domain.BeilvVoucherMember;
+
+/**
+ * 代金券用户关系Mapper接口
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+public interface BeilvVoucherMemberMapper {
+    /**
+     * 查询代金券用户关系
+     *
+     * @param id 代金券用户关系主键
+     * @return 代金券用户关系
+     */
+    public BeilvVoucherMember selectBeilvVoucherMemberById(Long id);
+
+    /**
+     * 查询代金券用户关系列表
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 代金券用户关系集合
+     */
+    public List<BeilvVoucherMember> selectBeilvVoucherMemberList(BeilvVoucherMember beilvVoucherMember);
+
+    /**
+     * 新增代金券用户关系
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 结果
+     */
+    public int insertBeilvVoucherMember(BeilvVoucherMember beilvVoucherMember);
+
+    /**
+     * 修改代金券用户关系
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 结果
+     */
+    public int updateBeilvVoucherMember(BeilvVoucherMember beilvVoucherMember);
+
+    /**
+     * 删除代金券用户关系
+     *
+     * @param id 代金券用户关系主键
+     * @return 结果
+     */
+    public int deleteBeilvVoucherMemberById(Long id);
+
+    /**
+     * 批量删除代金券用户关系
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteBeilvVoucherMemberByIds(String[] ids);
+
+    /**
+     * 查询App端代金券列表
+     *
+     * @param beilvVoucherMember 代金券
+     * @return 代金券集合
+     */
+    List<BeilvVoucherMember> selectAppVoucherList(BeilvVoucherMember beilvVoucherMember);
+}

+ 69 - 0
qmjszx-business/src/main/java/beilv/voucher/service/IBeilvVoucherMemberService.java

@@ -0,0 +1,69 @@
+package beilv.voucher.service;
+
+import java.util.List;
+
+import beilv.voucher.domain.BeilvVoucher;
+import beilv.voucher.domain.BeilvVoucherMember;
+
+/**
+ * 代金券用户关系Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+public interface IBeilvVoucherMemberService {
+    /**
+     * 查询代金券用户关系
+     *
+     * @param id 代金券用户关系主键
+     * @return 代金券用户关系
+     */
+    public BeilvVoucherMember selectBeilvVoucherMemberById(Long id);
+
+    /**
+     * 查询代金券用户关系列表
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 代金券用户关系集合
+     */
+    public List<BeilvVoucherMember> selectBeilvVoucherMemberList(BeilvVoucherMember beilvVoucherMember);
+
+    /**
+     * 新增代金券用户关系
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 结果
+     */
+    public int insertBeilvVoucherMember(BeilvVoucherMember beilvVoucherMember);
+
+    /**
+     * 修改代金券用户关系
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 结果
+     */
+    public int updateBeilvVoucherMember(BeilvVoucherMember beilvVoucherMember);
+
+    /**
+     * 批量删除代金券用户关系
+     *
+     * @param ids 需要删除的代金券用户关系主键集合
+     * @return 结果
+     */
+    public int deleteBeilvVoucherMemberByIds(String ids);
+
+    /**
+     * 删除代金券用户关系信息
+     *
+     * @param id 代金券用户关系主键
+     * @return 结果
+     */
+    public int deleteBeilvVoucherMemberById(Long id);
+
+    /**
+     * APP端查询代金券列表
+     * @param beilvVoucherMember
+     * @return
+     */
+    List<BeilvVoucherMember> selectAppVoucherList(BeilvVoucherMember beilvVoucherMember);
+}

+ 64 - 0
qmjszx-business/src/main/java/beilv/voucher/service/IBeilvVoucherService.java

@@ -0,0 +1,64 @@
+package beilv.voucher.service;
+
+import java.util.List;
+
+import beilv.common.core.domain.AjaxResult;
+import beilv.voucher.domain.BeilvVoucher;
+import beilv.voucher.domain.BeilvVoucherMember;
+
+/**
+ * 代金券Service接口
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+public interface IBeilvVoucherService {
+    /**
+     * 查询代金券
+     *
+     * @param id 代金券主键
+     * @return 代金券
+     */
+    public BeilvVoucher selectBeilvVoucherById(Long id);
+
+    /**
+     * 查询代金券列表
+     *
+     * @param beilvVoucher 代金券
+     * @return 代金券集合
+     */
+    public List<BeilvVoucher> selectBeilvVoucherList(BeilvVoucher beilvVoucher);
+
+    /**
+     * 新增代金券
+     *
+     * @param beilvVoucher 代金券
+     * @return 结果
+     */
+    public int insertBeilvVoucher(BeilvVoucher beilvVoucher);
+
+    /**
+     * 修改代金券
+     *
+     * @param beilvVoucher 代金券
+     * @return 结果
+     */
+    public int updateBeilvVoucher(BeilvVoucher beilvVoucher);
+
+    /**
+     * 批量删除代金券
+     *
+     * @param ids 需要删除的代金券主键集合
+     * @return 结果
+     */
+    public int deleteBeilvVoucherByIds(String ids);
+
+    /**
+     * 删除代金券信息
+     *
+     * @param id 代金券主键
+     * @return 结果
+     */
+    public int deleteBeilvVoucherById(Long id);
+
+}

+ 110 - 0
qmjszx-business/src/main/java/beilv/voucher/service/impl/BeilvVoucherMemberServiceImpl.java

@@ -0,0 +1,110 @@
+package beilv.voucher.service.impl;
+
+import java.util.List;
+import java.util.Map;
+
+import beilv.common.utils.DictUtils;
+import beilv.usermembershipcard.domain.UserMembershipCard;
+import beilv.voucher.domain.BeilvVoucher;
+import org.apache.commons.collections4.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import beilv.voucher.mapper.BeilvVoucherMemberMapper;
+import beilv.voucher.domain.BeilvVoucherMember;
+import beilv.voucher.service.IBeilvVoucherMemberService;
+import beilv.common.core.text.Convert;
+
+/**
+ * 代金券用户关系Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+@Service
+public class BeilvVoucherMemberServiceImpl implements IBeilvVoucherMemberService {
+    @Autowired
+    private BeilvVoucherMemberMapper beilvVoucherMemberMapper;
+
+    /**
+     * 查询代金券用户关系
+     *
+     * @param id 代金券用户关系主键
+     * @return 代金券用户关系
+     */
+    @Override
+    public BeilvVoucherMember selectBeilvVoucherMemberById(Long id) {
+        return beilvVoucherMemberMapper.selectBeilvVoucherMemberById(id);
+    }
+
+    /**
+     * 查询代金券用户关系列表
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 代金券用户关系
+     */
+    @Override
+    public List<BeilvVoucherMember> selectBeilvVoucherMemberList(BeilvVoucherMember beilvVoucherMember) {
+        return beilvVoucherMemberMapper.selectBeilvVoucherMemberList(beilvVoucherMember);
+    }
+
+    /**
+     * 新增代金券用户关系
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 结果
+     */
+    @Override
+    public int insertBeilvVoucherMember(BeilvVoucherMember beilvVoucherMember) {
+        return beilvVoucherMemberMapper.insertBeilvVoucherMember(beilvVoucherMember);
+    }
+
+    /**
+     * 修改代金券用户关系
+     *
+     * @param beilvVoucherMember 代金券用户关系
+     * @return 结果
+     */
+    @Override
+    public int updateBeilvVoucherMember(BeilvVoucherMember beilvVoucherMember) {
+        return beilvVoucherMemberMapper.updateBeilvVoucherMember(beilvVoucherMember);
+    }
+
+    /**
+     * 批量删除代金券用户关系
+     *
+     * @param ids 需要删除的代金券用户关系主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBeilvVoucherMemberByIds(String ids) {
+        return beilvVoucherMemberMapper.deleteBeilvVoucherMemberByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除代金券用户关系信息
+     *
+     * @param id 代金券用户关系主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBeilvVoucherMemberById(Long id) {
+        return beilvVoucherMemberMapper.deleteBeilvVoucherMemberById(id);
+    }
+
+    /**
+     * APP端查询代金券列表
+     * @param beilvVoucherMember
+     * @return
+     */
+    @Override
+    public List<BeilvVoucherMember> selectAppVoucherList(BeilvVoucherMember beilvVoucherMember) {
+        List<BeilvVoucherMember> voucherMemberList = beilvVoucherMemberMapper.selectAppVoucherList(beilvVoucherMember);
+        Map<String, String> voucherType = DictUtils.getDictCacheToMap("voucher_type");
+        Map<String, String> isValidity = DictUtils.getDictCacheToMap("is_validity");
+        for (BeilvVoucherMember var : voucherMemberList) {
+            var.setVoucherTypeText(MapUtils.getString(voucherType, var.getVoucherType()));
+            var.setIsValidityText(MapUtils.getString(isValidity, var.getIsValidity()));
+        }
+        return voucherMemberList;
+    }
+}

+ 93 - 0
qmjszx-business/src/main/java/beilv/voucher/service/impl/BeilvVoucherServiceImpl.java

@@ -0,0 +1,93 @@
+package beilv.voucher.service.impl;
+
+import java.util.Collections;
+import java.util.List;
+
+import beilv.common.core.domain.AjaxResult;
+import beilv.voucher.domain.BeilvVoucherMember;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import beilv.voucher.mapper.BeilvVoucherMapper;
+import beilv.voucher.domain.BeilvVoucher;
+import beilv.voucher.service.IBeilvVoucherService;
+import beilv.common.core.text.Convert;
+
+/**
+ * 代金券Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2025-11-20
+ */
+@Service
+public class BeilvVoucherServiceImpl implements IBeilvVoucherService {
+    @Autowired
+    private BeilvVoucherMapper beilvVoucherMapper;
+
+    /**
+     * 查询代金券
+     *
+     * @param id 代金券主键
+     * @return 代金券
+     */
+    @Override
+    public BeilvVoucher selectBeilvVoucherById(Long id) {
+        return beilvVoucherMapper.selectBeilvVoucherById(id);
+    }
+
+    /**
+     * 查询代金券列表
+     *
+     * @param beilvVoucher 代金券
+     * @return 代金券
+     */
+    @Override
+    public List<BeilvVoucher> selectBeilvVoucherList(BeilvVoucher beilvVoucher) {
+        return beilvVoucherMapper.selectBeilvVoucherList(beilvVoucher);
+    }
+
+    /**
+     * 新增代金券
+     *
+     * @param beilvVoucher 代金券
+     * @return 结果
+     */
+    @Override
+    public int insertBeilvVoucher(BeilvVoucher beilvVoucher) {
+        return beilvVoucherMapper.insertBeilvVoucher(beilvVoucher);
+    }
+
+    /**
+     * 修改代金券
+     *
+     * @param beilvVoucher 代金券
+     * @return 结果
+     */
+    @Override
+    public int updateBeilvVoucher(BeilvVoucher beilvVoucher) {
+        return beilvVoucherMapper.updateBeilvVoucher(beilvVoucher);
+    }
+
+    /**
+     * 批量删除代金券
+     *
+     * @param ids 需要删除的代金券主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBeilvVoucherByIds(String ids) {
+        return beilvVoucherMapper.deleteBeilvVoucherByIds(Convert.toStrArray(ids));
+    }
+
+    /**
+     * 删除代金券信息
+     *
+     * @param id 代金券主键
+     * @return 结果
+     */
+    @Override
+    public int deleteBeilvVoucherById(Long id) {
+        return beilvVoucherMapper.deleteBeilvVoucherById(id);
+    }
+
+
+}

+ 72 - 0
qmjszx-business/src/main/resources/mapper/voucher/BeilvVoucherMapper.xml

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="beilv.voucher.mapper.BeilvVoucherMapper">
+
+    <resultMap type="BeilvVoucher" id="BeilvVoucherResult">
+        <result property="id" column="id"/>
+        <result property="voucherName" column="voucher_name"/>
+        <result property="voucherPrice" column="voucher_price"/>
+        <result property="voucherType" column="voucher_type"/>
+    </resultMap>
+
+    <sql id="selectBeilvVoucherVo">
+        select id, voucher_name, voucher_price, voucher_type
+        from beilv_voucher
+    </sql>
+
+    <select id="selectBeilvVoucherList" parameterType="BeilvVoucher" resultMap="BeilvVoucherResult">
+        <include refid="selectBeilvVoucherVo"/>
+        <where>
+            <if test="voucherName != null  and voucherName != ''">and voucher_name like concat('%', #{voucherName},
+                '%')
+            </if>
+            <if test="voucherPrice != null ">and voucher_price = #{voucherPrice}</if>
+            <if test="voucherType != null  and voucherType != ''">and voucher_type = #{voucherType}</if>
+        </where>
+    </select>
+
+    <select id="selectBeilvVoucherById" parameterType="Long" resultMap="BeilvVoucherResult">
+        <include refid="selectBeilvVoucherVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBeilvVoucher" parameterType="BeilvVoucher" useGeneratedKeys="true" keyProperty="id">
+        insert into beilv_voucher
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="voucherName != null">voucher_name,</if>
+            <if test="voucherPrice != null">voucher_price,</if>
+            <if test="voucherType != null">voucher_type,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="voucherName != null">#{voucherName},</if>
+            <if test="voucherPrice != null">#{voucherPrice},</if>
+            <if test="voucherType != null">#{voucherType},</if>
+        </trim>
+    </insert>
+
+    <update id="updateBeilvVoucher" parameterType="BeilvVoucher">
+        update beilv_voucher
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="voucherName != null">voucher_name = #{voucherName},</if>
+            <if test="voucherPrice != null">voucher_price = #{voucherPrice},</if>
+            <if test="voucherType != null">voucher_type = #{voucherType},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBeilvVoucherById" parameterType="Long">
+        delete
+        from beilv_voucher
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteBeilvVoucherByIds" parameterType="String">
+        delete from beilv_voucher where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 97 - 0
qmjszx-business/src/main/resources/mapper/voucher/BeilvVoucherMemberMapper.xml

@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="beilv.voucher.mapper.BeilvVoucherMemberMapper">
+
+    <resultMap type="BeilvVoucherMember" id="BeilvVoucherMemberResult">
+        <result property="id" column="id"/>
+        <result property="voucherId" column="voucher_id"/>
+        <result property="memberId" column="member_id"/>
+        <result property="validityTime" column="validity_time"/>
+        <result property="isValidity" column="is_validity"/>
+        <result property="voucherName" column="voucher_name"/>
+        <result property="voucherPrice" column="voucher_price"/>
+        <result property="voucherType" column="voucher_type"/>
+        <result property="isValidityText" column="isValidityText"/>
+        <result property="isValidityText" column="isValidityText"/>
+    </resultMap>
+
+    <sql id="selectBeilvVoucherMemberVo">
+        select id, voucher_id, member_id, validity_time,is_validity
+        from beilv_voucher_member
+    </sql>
+
+    <select id="selectBeilvVoucherMemberList" parameterType="BeilvVoucherMember" resultMap="BeilvVoucherMemberResult">
+        SELECT v.id,
+               v.voucher_name,
+               v.voucher_price,
+               v.voucher_type,
+               m.username,
+               vm.validity_time,
+               vm.is_validity
+        FROM beilv_voucher v
+                 left join beilv_voucher_member vm on v.id = vm.voucher_id
+                 left join sys_member m on vm.member_id = m.id
+        where v.id = #{voucherId}
+    </select>
+
+    <select id="selectBeilvVoucherMemberById" parameterType="Long" resultMap="BeilvVoucherMemberResult">
+        <include refid="selectBeilvVoucherMemberVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertBeilvVoucherMember" parameterType="BeilvVoucherMember" useGeneratedKeys="true" keyProperty="id">
+        insert into beilv_voucher_member
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="voucherId != null">voucher_id,</if>
+            <if test="memberId != null">member_id,</if>
+            <if test="validityTime != null">validity_time,</if>
+            <if test="isValidity != null">is_validity,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="voucherId != null">#{voucherId},</if>
+            <if test="memberId != null">#{memberId},</if>
+            <if test="validityTime != null">#{validityTime},</if>
+            <if test="isValidity != null">#{isValidity},</if>
+        </trim>
+    </insert>
+
+    <update id="updateBeilvVoucherMember" parameterType="BeilvVoucherMember">
+        update beilv_voucher_member
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="voucherId != null">voucher_id = #{voucherId},</if>
+            <if test="memberId != null">member_id = #{memberId},</if>
+            <if test="validityTime != null">validity_time = #{validityTime},</if>
+            <if test="isValidity != null">is_validity = #{isValidity},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteBeilvVoucherMemberById" parameterType="Long">
+        delete
+        from beilv_voucher_member
+        where id = #{id}
+    </delete>
+
+    <delete id="deleteBeilvVoucherMemberByIds" parameterType="String">
+        delete from beilv_voucher_member where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <select id="selectAppVoucherList" parameterType="BeilvVoucherMember" resultMap="BeilvVoucherMemberResult">
+        SELECT v.id,
+        v.voucher_name,
+        v.voucher_price,
+        v.voucher_type,
+        vm.is_validity,
+        vm.validity_time
+        FROM beilv_voucher v
+        left join beilv_voucher_member vm on v.id = vm.voucher_id
+        left join sys_member m on vm.member_id = m.id
+        where m.id = #{memberId}
+        <if test="isValidity != null and isValidity != ''">and vm.is_validity = #{isValidity}</if>
+    </select>
+</mapper>

+ 34 - 0
qmjszx-quartz/src/main/java/beilv/quartz/task/CouponTask.java

@@ -0,0 +1,34 @@
+package beilv.quartz.task;
+
+import beilv.voucher.domain.BeilvVoucherMember;
+import beilv.voucher.mapper.BeilvVoucherMemberMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 定时改变优惠券过期状态任务
+ */
+@Component("couponTask")
+public class CouponTask {
+
+    @Autowired
+    private BeilvVoucherMemberMapper beilvVoucherMemberMapper;
+
+    public void couponIsValidity() {
+        List<BeilvVoucherMember> voucherMemberList = beilvVoucherMemberMapper.selectBeilvVoucherMemberList(new BeilvVoucherMember("1"));
+        // 遍历未过期的代金券用户关系,检查是否过期
+        for (BeilvVoucherMember voucherMember : voucherMemberList) {
+            if (voucherMember.getValidityTime() != null) {
+                long currentTime = System.currentTimeMillis();
+                long validityTime = voucherMember.getValidityTime().getTime();
+                // 如果当前时间超过了有效期时间,更新状态为已过期
+                if (currentTime > validityTime) {
+                    voucherMember.setIsValidity("3"); // 设置为已过期
+                    beilvVoucherMemberMapper.updateBeilvVoucherMember(voucherMember);  // 更新数据库
+                }
+            }
+        }
+    }
+}