Browse Source

Merge branch 'dev_v1.3.4_20220902'

Eric 3 years ago
parent
commit
7074522cfc
37 changed files with 1895 additions and 113 deletions
  1. 94 11
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponInfoController.java
  2. 68 8
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java
  3. 29 9
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInfoVO.java
  4. 226 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInventoryVO.java
  5. 301 45
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponIssueVo.java
  6. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserParam.java
  7. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityReward.java
  8. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CouponInfo.java
  9. 65 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CouponInventory.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MK.java
  11. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponInventoryEnum.java
  12. 33 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponValidTypeEnum.java
  13. 17 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponInfoMapper.java
  14. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponInventoryMapper.java
  15. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponIssueMapper.java
  16. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java
  17. 0 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponInfoQuery.java
  18. 46 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponInventoryQuery.java
  19. 47 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponIssueQueryInfo.java
  20. 19 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInfoService.java
  21. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInventoryService.java
  22. 26 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponIssueService.java
  23. 85 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInfoServiceImp.java
  24. 20 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInventoryServiceImp.java
  25. 104 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponIssueServiceImp.java
  26. 70 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CouponIssueUserVo.java
  27. 8 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/coupon/CouponInfoWrapper.java
  28. 264 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/coupon/CouponIssueWrapper.java
  29. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/coupon/CouponInventoryWrapper.java
  30. 48 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInfoMapper.xml
  31. 22 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInventoryMapper.xml
  32. 42 9
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponIssueMapper.xml
  33. 30 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml
  34. 36 3
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/coupon/CouponInfoController.java
  35. 8 2
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/CouponInfoVO.java
  36. 36 3
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/coupon/CouponInfoController.java
  37. 6 2
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/io/request/CouponInfoVO.java

+ 94 - 11
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponInfoController.java

@@ -4,30 +4,32 @@ package com.yonge.cooleshow.admin.controller.coupon;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponInfoVO;
+import com.yonge.cooleshow.admin.io.request.coupon.CouponInventoryVO;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
+import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
 import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
-import org.springframework.stereotype.Controller;
 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.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
@@ -58,7 +60,7 @@ public class CouponInfoController extends BaseController {
      * @return HttpResponseResult<PageInfo<CouponInfoVO.ResponseInfo>>
      */
     @PostMapping(value = "/page", consumes="application/json", produces="application/json")
-    @ApiOperation(value = "查询优惠券分页", notes = "传入CouponInfoVO.PageRequest")
+    @ApiOperation(value = "查询优惠券分页", notes = "CouponInfoVO.PageRequest")
     public HttpResponseResult<PageInfo<CouponInfoVO.CouponPageInfo>> queryCouponPageInfo(@RequestBody CouponInfoVO.PageRequest request) {
 
         // 优惠券信息
@@ -122,11 +124,9 @@ public class CouponInfoController extends BaseController {
     /**
      * 启用/停用 优惠券
      */
-    @GetMapping("/updateState")
+    @PostMapping("/updateState")
     @ApiOperation(value = "优惠券状态启/停用")
-    public HttpResponseResult<Boolean> updateCouponStateInfo(
-            @ApiParam(value = "优惠券ID", required = true) @RequestParam("couponId") Long couponId,
-            @ApiParam(value = "状态 0 停用 1 启用", required = true) @RequestParam("state") Integer state) {
+    public HttpResponseResult<Boolean> updateCouponStateInfo(@RequestBody CouponInfoVO.CouponInfo request) {
 
         // 获取当前登录用户信息
         SysUser user = sysUserFeignService.queryUserInfo();
@@ -134,10 +134,16 @@ public class CouponInfoController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
 
+        if (Objects.isNull(request)
+                || Objects.isNull(request.getId())
+                || EStatus.invalid(request.getStatus())) {
+            throw new BizException("无效请求参数");
+        }
+
         // 更新数据信息
         CouponInfoVO.CouponInfo info = CouponInfoVO.CouponInfo.builder()
-                .id(couponId)
-                .status(state)
+                .id(request.getId())
+                .status(request.getStatus())
                 .updatedBy(user.getId())
                 .updateTime(DateTime.now().getMillis())
                 .build();
@@ -145,8 +151,85 @@ public class CouponInfoController extends BaseController {
         CouponInfo couponInfo = couponInfoService.saveOrUpdateCouponInfo(JSON.parseObject(info.jsonString(), CouponInfo.class));
 
         // 校验状态更新结果
-        return status(couponInfo.getStatus().intValue() == state);
+        return status(couponInfo.getStatus().intValue() == request.getStatus());
+    }
+
+    /**
+     * 优惠券库存量信息
+     * @param request CouponInventoryVO.PageRequest
+     * @return HttpResponseResult<PageInfo<CouponInventoryVO.PageInfo>>
+     */
+    @PostMapping(value = "/inventory/page", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "查询库存量调整分页信息", notes = "CouponInventoryVO.PageRequest")
+    public HttpResponseResult<PageInfo<CouponInventoryVO.PageInfo>> queryCouponInventoryPageInfo(@RequestBody CouponInventoryVO.PageRequest request) {
+
+        // 校验请求参数
+        if (request.invalidRequestParam()) {
+            throw new BizException("无效的优惠券ID");
+        }
+
+        // 优惠券信息
+        IPage<CouponInventoryWrapper> wrapper = couponInfoService.queryCouponInventoryPageInfo(PageUtil.getPage(request),
+                CouponInventoryQuery.from(request.jsonString()));
+
+        // 数据转换
+        List<CouponInventoryVO.PageInfo> pageInfos = JSON.parseArray(JSON.toJSONString(wrapper.getRecords()),
+                CouponInventoryVO.PageInfo.class);
+
+        // 分页数据信息
+        return succeed(PageUtil.getPageInfo(wrapper, pageInfos));
+    }
+
+    /**
+     * 调整新优惠券库存量信息
+     * @param info CouponInfoVO.CouponInfo
+     * @return HttpResponseResult<CouponInfoVO.CouponInfo>
+     */
+    @PostMapping(value = "/inventory/update", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "优惠券库存量更新", notes = "CouponInventoryVO.InventoryInfo")
+    public HttpResponseResult<Boolean> saveOrUpdate(@Valid @RequestBody CouponInventoryVO.InventoryInfo info) {
+
+        // 获取当前登录用户信息
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user) || Objects.isNull(user.getId())) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        // 校验参数合法性
+        if (info.invalidRequestParam(user.getId())) {
+            throw new BizException("无效的请求参数");
+        }
+
+        // 新增或更新信息
+        int rows = couponInfoService.saveOrUpdateCouponInventoryInfo(JSON.parseObject(info.jsonString(),
+                CouponInventory.class));
+
+        return status(rows > 0);
     }
 
+    /**
+     * 库存调整用户信息
+     * @param request CouponInventoryVO.PageRequest
+     * @return HttpResponseResult<PageInfo<CouponInventoryVO.PageInfo>>
+     */
+    @PostMapping(value = "/inventory/user", consumes="application/json", produces="application/json")
+    @ApiOperation(value = "查询库存调整用户信息分页", notes = "CouponInventoryVO.PageRequest")
+    public HttpResponseResult<PageInfo<CouponInventoryVO.PageUserInfo>> queryInventoryUserPageInfo(@RequestBody CouponInventoryVO.PageRequest request) {
+
+        // 校验请求参数
+        if (Objects.isNull(request) || Objects.isNull(request.getCouponId())) {
+            throw new BizException("无效的优惠券ID");
+        }
+
+        // 优惠券信息
+        IPage<CouponInventoryWrapper> wrapper = couponInfoService.queryCouponInventoryPageInfo(PageUtil.getPage(request),
+                CouponInventoryQuery.from(request.jsonString()).groupByUser(true));
 
+        // 数据转换
+        List<CouponInventoryVO.PageUserInfo> pageInfos = JSON.parseArray(JSON.toJSONString(wrapper.getRecords()),
+                CouponInventoryVO.PageUserInfo.class);
+
+        // 分页数据信息
+        return succeed(PageUtil.getPageInfo(wrapper, pageInfos));
+    }
 }

+ 68 - 8
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java

@@ -1,19 +1,34 @@
 package com.yonge.cooleshow.admin.controller.coupon;
 
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.admin.io.request.coupon.CouponInfoVO;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.CouponIssueService;
+import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.time.Instant;
+import java.util.List;
+
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
 
 /**
  * <p>
@@ -26,11 +41,15 @@ import java.time.Instant;
 @RestController
 @RequestMapping("/couponIssue")
 @Api(value = "优惠券发放信息", tags = "优惠券发放信息")
+@Validated
 public class CouponIssueController {
 
     @Autowired
     private CouponIssueService couponIssueService;
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
     /**
      * 优惠券发放分页信息
      */
@@ -38,7 +57,18 @@ public class CouponIssueController {
     @ApiOperation(value = "查询优惠券发放分页")
     public HttpResponseResult<PageInfo<CouponIssueVo.CouponIssuePageInfo>> queryCouponIssuePageInfo(@RequestBody @Valid CouponIssueVo.PageRequest request) {
 
-        return null;
+        if (request.getCouponId() == null) {
+            return failed("优惠券id不能为空");
+        }
+        IPage<CouponIssueWrapper> couponIssueWrapperIPage = couponIssueService.queryCouponIssueInfo(
+                PageUtil.getPage(request), CouponIssueQueryInfo.from(request.jsonString()));
+
+
+        // 数据转换
+        List<CouponIssueVo.CouponIssuePageInfo> pageInfos = JSON.parseArray(JSON.toJSONString(couponIssueWrapperIPage.getRecords()),
+                                                                    CouponIssueVo.CouponIssuePageInfo.class);
+
+        return succeed(PageUtil.getPageInfo(couponIssueWrapperIPage,pageInfos));
     }
 
 
@@ -47,18 +77,28 @@ public class CouponIssueController {
      */
     @PostMapping("/userPage")
     @ApiOperation(value = "优惠券发放用户分页信息")
-    public HttpResponseResult<PageInfo<CouponIssueVo.CouponIssueUserPageInfo>> queryCouponIssueUserPageInfo(@RequestBody @Valid CouponIssueVo.CouponIssueUserRequest request) {
+    public HttpResponseResult<PageInfo<CouponIssueUserVo>> queryCouponIssueUserPageInfo(@RequestBody @Valid CouponIssueVo.CouponIssueUserRequest request) {
+
+        IPage<CouponIssueUserVo> couponIssueUserVoIPage = couponIssueService.queryUser(PageUtil.getPage(request),
+                                                                                       request.getCouponId(),
+                                                                                       request.getClient(),
+                                                                                       request.getKeyword());
+
 
-        return null;
+        return succeed(PageUtil.pageInfo(couponIssueUserVoIPage));
     }
 
 
     @PostMapping("/issueUser")
     @ApiOperation(value = "发送优惠券")
     public HttpResponseResult<Boolean> issueCoupon(@RequestBody @Valid CouponIssueVo.CouponIssueUserParam param) {
-        couponIssueService.issueCoupon(param.getCouponId(),param.getUserParam());
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null  || sysUser.getId() == null) {
+            return failed("用户信息获取失败");
+        }
+        couponIssueService.issueCoupon(param.getCouponId(),param.getUserParam(),sysUser.getId(),param.getRemark());
 
-        return null;
+        return succeed();
     }
 
     @PostMapping("/withdraw/{couponIssueId}")
@@ -66,13 +106,33 @@ public class CouponIssueController {
     public HttpResponseResult<Boolean> withdrawCoupon(@PathVariable Long couponIssueId) {
         CouponIssue couponIssue = couponIssueService.getById(couponIssueId);
         if (couponIssue == null) {
-            return HttpResponseResult.failed("未找到数据");
+            return failed("未找到数据");
         }
         if (couponIssue.getUseState().equals(CouponUseStateEnum.USED)) {
-            return HttpResponseResult.failed("优惠券已被使用");
+            return failed("优惠券已被使用");
         }  else if(couponIssue.getEndTime().compareTo(Instant.now().getEpochSecond()) <0) {
-            return HttpResponseResult.failed("优惠券已过期");
+            return failed("优惠券已过期");
         }
         return HttpResponseResult.status(couponIssueService.withdrawCoupon(couponIssueId));
     }
+
+
+    /**
+     * 优惠券发放分页信息
+     */
+    @PostMapping("/user/page")
+    @ApiOperation(value = "查询用户(老师/学生)优惠券发放分页")
+    public HttpResponseResult<PageInfo<CouponIssueVo.UserCouponIssuePageInfo>> queryCouponIssuePageInfo(@RequestBody @Valid CouponIssueVo.UserCouponIssuePageRequest request) {
+
+        IPage<CouponIssueWrapper> couponIssueWrapperIPage = couponIssueService.queryCouponIssueInfo(
+                PageUtil.getPage(request), CouponIssueQueryInfo.from(request.jsonString()));
+
+
+        // 数据转换
+        List<CouponIssueVo.UserCouponIssuePageInfo> pageInfos = JSON.parseArray(JSON.toJSONString(couponIssueWrapperIPage.getRecords()),
+                                                                            CouponIssueVo.UserCouponIssuePageInfo.class);
+
+        return succeed(PageUtil.getPageInfo(couponIssueWrapperIPage,pageInfos));
+    }
+
 }

+ 29 - 9
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInfoVO.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponValidTypeEnum;
 import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.QueryInfo;
@@ -34,7 +35,7 @@ public class CouponInfoVO {
     @Data
     @NoArgsConstructor
     @AllArgsConstructor
-    @ApiModel(value = "优惠券信息分页请求", description = "优惠券信息分页")
+    @ApiModel("优惠券信息分页请求信息")
     public static class PageRequest extends QueryInfo {
 
         @ApiModelProperty("优惠券名称")
@@ -68,7 +69,7 @@ public class CouponInfoVO {
     @Data
     @NoArgsConstructor
     @AllArgsConstructor
-    @ApiModel(value = "优惠券信息分页信息", description = "优惠券信息分页信息")
+    @ApiModel("优惠券信息分页响应信息")
     public static class CouponPageInfo implements Serializable {
 
         @ApiModelProperty("优惠券ID")
@@ -89,7 +90,7 @@ public class CouponInfoVO {
         @ApiModelProperty("优惠券类型: FULL_DISCOUNT(满减券) VOUCHER(代金券) ")
         private String couponType;
 
-        @ApiModelProperty("可以库存")
+        @ApiModelProperty("当前库存量")
         private Integer inventory;
 
         @ApiModelProperty("领取次数限制")
@@ -107,11 +108,22 @@ public class CouponInfoVO {
         @ApiModelProperty("最后更新人")
         private String updatedUser;
 
-        @ApiModelProperty("最后更新时间")
+        @ApiModelProperty(value = "最后更新时间", hidden = true)
         private Long updateTime;
 
+        @ApiModelProperty("最后更新时间")
+        private Date updatedTime;
+
         @ApiModelProperty("创建时间")
         private Date createdTime;
+
+        public Date getUpdatedTime() {
+
+            if (Optional.ofNullable(getUpdateTime()).orElse(0L) > 0) {
+                return new DateTime(getUpdateTime()).toDate();
+            }
+            return updatedTime;
+        }
     }
 
     /**
@@ -146,6 +158,9 @@ public class CouponInfoVO {
         @ApiModelProperty("优惠券类型")
         private CouponTypeEnum couponType;
 
+        @ApiModelProperty("有效期类型: DAY(固定有效天数) TIME_PERIOD(固定时间段)")
+        private CouponValidTypeEnum validType;
+
         @ApiModelProperty("有效天数")
         private Integer validDay;
 
@@ -214,6 +229,9 @@ public class CouponInfoVO {
         @ApiModelProperty("优惠券类型: FULL_DISCOUNT(满减券) VOUCHER(代金券) ")
         private CouponTypeEnum couponType;
 
+        @ApiModelProperty("有效期类型: DAY(固定有效天数) TIME_PERIOD(固定时间段)")
+        private CouponValidTypeEnum validType;
+
         @ApiModelProperty("有效天数")
         private Integer validDay;
 
@@ -229,7 +247,7 @@ public class CouponInfoVO {
         @ApiModelProperty("领取次数限制")
         private Integer quantityLimit;
 
-        @ApiModelProperty(value = "启禁状态", hidden = true)
+        @ApiModelProperty(value = "启禁状态, 0 停用 1 启用")
         private Integer status;
 
         @ApiModelProperty(value = "更新用户", hidden = true)
@@ -271,6 +289,10 @@ public class CouponInfoVO {
                     throw new BizException("满减金额未设置");
                 }
 
+                if (Objects.isNull(getValidType())) {
+                    throw new BizException("有效期类型不能为空");
+                }
+
                 if (Optional.ofNullable(getValidDay()).orElse(0) <= 0
                         && (Optional.ofNullable(getStartTime()).orElse(0L) == 0
                             || Optional.ofNullable(getEndTime()).orElse(0L) == 0)) {
@@ -278,11 +300,9 @@ public class CouponInfoVO {
                 }
 
                 this.createdBy(userId).initSaveParam();
-            } else {
-
-                // 更新参数
-                this.updatedBy(userId).setUpdateTime(DateTime.now().getMillis());
             }
+            // 更新用户参数
+            this.updatedBy(userId).setUpdateTime(DateTime.now().getMillis());
 
             return false;
         }

+ 226 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponInventoryVO.java

@@ -0,0 +1,226 @@
+package com.yonge.cooleshow.admin.io.request.coupon;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.MK;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
+import com.yonge.cooleshow.common.enums.EStatus;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.format.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * 优惠券库存量
+ * Created by Eric.Shang on 2022/9/5.
+ */
+public class CouponInventoryVO {
+
+
+    /**
+     * 优惠券库存调整分页请求信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(value = "优惠券库存调整分页请求", description = "优惠券库存调整分页")
+    public static class PageRequest extends QueryInfo {
+
+        @ApiModelProperty("优惠券ID")
+        private Long couponId;
+
+        @ApiModelProperty("操作人")
+        private Long userId;
+
+        @ApiModelProperty("数据类型: ADDITION(添加) REDUCE(减少)")
+        private CouponInventoryEnum dataType;
+
+        @ApiModelProperty("开始时间, yyyy-MM-dd HH:mm:ss")
+        private String startQueryTime;
+
+        @ApiModelProperty("结束时间, yyyy-MM-dd HH:mm:ss")
+        private String endQueryTime;
+
+        @ApiModelProperty(value = "结束时间", hidden = true)
+        private Long startTime;
+        @ApiModelProperty(value = "结束时间", hidden = true)
+        private Long endTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public boolean invalidRequestParam() {
+
+            // 优惠券ID不能为空
+            return Optional.ofNullable(getCouponId()).orElse(0L) <= 0;
+        }
+
+        public Long getUserId() {
+
+            if (Optional.ofNullable(this.userId).orElse(0L) > 0) {
+                return this.userId;
+            }
+
+            return null;
+        }
+
+        public Long getStartTime() {
+            if (StringUtils.isNotEmpty(getStartQueryTime())) {
+                return DateTimeFormat.forPattern(MK.TIME_FORMAT).parseDateTime(getStartQueryTime()).getMillis() / 1000;
+            }
+            return startTime;
+        }
+
+        public Long getEndTime() {
+            if (StringUtils.isNotEmpty(getEndQueryTime())) {
+                return DateTimeFormat.forPattern(MK.TIME_FORMAT).parseDateTime(getEndQueryTime()).getMillis() / 1000;
+            }
+            return endTime;
+        }
+    }
+
+    /**
+     * 库存量调整分页数据
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class PageInfo implements Serializable {
+
+        @ApiModelProperty("发放ID")
+        private Long id;
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("操作人")
+        private String username;
+
+        @ApiModelProperty("优惠券ID")
+        private Long couponId;
+
+        @ApiModelProperty("数据类型: ADDITION(添加) REDUCE(减少)")
+        private CouponInventoryEnum dataType;
+
+        @ApiModelProperty("变化量")
+        private Integer number;
+
+        @ApiModelProperty("备注")
+        private String remark;
+
+        @ApiModelProperty("创建时间")
+        private Date createdTime;
+
+    }
+
+    /**
+     * 库存量调整记录
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class InventoryInfo implements Serializable {
+
+        @ApiModelProperty(value = "发放ID", hidden = true)
+        private Long id;
+
+        @ApiModelProperty(value = "用户ID", hidden = true)
+        private Long userId;
+
+        @ApiModelProperty("优惠券ID")
+        private Long couponId;
+
+        @ApiModelProperty("数据类型: ADDITION(添加) REDUCE(减少)")
+        private CouponInventoryEnum dataType;
+
+        @ApiModelProperty("变化量")
+        private Integer number;
+
+        @ApiModelProperty(value = "备注", hidden = true)
+        private String remark;
+
+        @ApiModelProperty(value = "启/禁状态", hidden = true)
+        private Integer status;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public boolean invalidRequestParam(Long userId) {
+
+            if (Optional.ofNullable(getCouponId()).orElse(0L) <= 0) {
+                throw new BizException("优惠券ID不能为空");
+            }
+
+            if (Objects.isNull(getDataType())) {
+                throw new BizException("类型不能为空");
+            }
+
+            if (Optional.ofNullable(getNumber()).orElse(0) <= 0) {
+                throw new BizException("变化量不能为空");
+            }
+
+            // 设置保存参数
+            this.userId(userId).initSaveParam();
+
+            return false;
+        }
+
+        public InventoryInfo initSaveParam() {
+
+            return this.remark("").status(EStatus.ENABLE.getValue());
+        }
+
+
+        public InventoryInfo id(Long id) {
+            this.id = id;
+            return this;
+        }
+
+        public InventoryInfo userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public InventoryInfo remark(String remark) {
+            this.remark = remark;
+            return this;
+        }
+
+        public InventoryInfo status(Integer status) {
+            this.status = status;
+            return this;
+        }
+    }
+
+    /**
+     * 库存量调整用户分页数据
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class PageUserInfo implements Serializable {
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("操作人")
+        private String username;
+
+        @ApiModelProperty("优惠券ID")
+        private Long couponId;
+
+    }
+}

+ 301 - 45
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/coupon/CouponIssueVo.java

@@ -5,6 +5,8 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.dto.UserParam;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SendTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
@@ -28,20 +30,22 @@ import java.util.List;
  */
 public class CouponIssueVo {
 
-    @ApiModel(value = "优惠券发放信息分页请求", description = "优惠券发放信息分页请求")
+    @ApiModel("优惠券发放信息分页请求")
     public static class PageRequest extends QueryInfo {
 
         @ApiModelProperty(value = "优惠券id",required = true)
-        @NotNull(message = "优惠券id不能为空")
         private Long couponId;
 
         // 真实姓名/昵称/手机号/编号
         @ApiModelProperty("真实姓名/昵称/手机号/编号")
         private String keyword;
 
+        @ApiModelProperty("用户id")
+        private Long userId;
+
         // 客户端 TEACHER  STUDENT
         @ApiModelProperty("客户端 TEACHER  STUDENT")
-        private ClientEnum client;
+        private ClientEnum clientType;
 
         // 发放方式 PLATFORM AVTIVITY
         @ApiModelProperty("发放方式 PLATFORM:后台发放 AVTIVITY:活动领取")
@@ -75,6 +79,14 @@ public class CouponIssueVo {
         @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
         private Date usedEndTime;
 
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
         public Long getCouponId() {
             return couponId;
         }
@@ -91,12 +103,12 @@ public class CouponIssueVo {
             this.keyword = keyword;
         }
 
-        public ClientEnum getClient() {
-            return client;
+        public ClientEnum getClientType() {
+            return clientType;
         }
 
-        public void setClient(ClientEnum client) {
-            this.client = client;
+        public void setClientType(ClientEnum clientType) {
+            this.clientType = clientType;
         }
 
         public SendTypeEnum getIssueWay() {
@@ -158,7 +170,7 @@ public class CouponIssueVo {
     @Data
     @NoArgsConstructor
     @AllArgsConstructor
-    @ApiModel(value = "优惠券信息分页信息", description = "优惠券信息分页信息")
+    @ApiModel("优惠券发放信息分页信息")
     public static class CouponIssuePageInfo implements Serializable {
 
         @ApiModelProperty("用户id")
@@ -252,46 +264,105 @@ public class CouponIssueVo {
         }
     }
 
-    @ApiModel("发放优惠券用户分页数据")
-    public static class CouponIssueUserPageInfo {
+    @ApiModel("发送优惠券")
+    public static class CouponIssueUserParam {
+
+        @ApiModelProperty(value = "优惠券id",required = true)
+        @NotNull(message = "优惠券id不能为空")
+        private Long couponId;
+
+        @ApiModelProperty("用户信息")
+        @Size(min = 1,message = "请选择发送优惠券用户")
+        private List<UserParam> userParam;
+
+
+        @ApiModelProperty(value = "发放原因",required = true)
+        private String remark;
+
+        public String getRemark() {
+            return remark;
+        }
+
+        public void setRemark(String remark) {
+            this.remark = remark;
+        }
+
+        public Long getCouponId() {
+            return couponId;
+        }
+
+        public void setCouponId(Long couponId) {
+            this.couponId = couponId;
+        }
+
+        public List<UserParam> getUserParam() {
+            return userParam;
+        }
+
+        public void setUserParam(List<UserParam> userParam) {
+            this.userParam = userParam;
+        }
+
+
+    }
+
+    @ApiModel("用户查询优惠券分页请求")
+    public static class UserCouponIssuePageRequest extends QueryInfo{
+
 
         @ApiModelProperty("用户id")
+        @NotNull(message = "用户id不能为空")
         private Long userId;
 
-        @ApiModelProperty("实名")
-        private String realName;
-
-        @ApiModelProperty("昵称")
-        private String username;
 
-        @ApiModelProperty("客户端")
+        @ApiModelProperty("用户类型")
+        @NotNull(message = "用户类型不能为空")
         private ClientEnum clientType;
 
-        @ApiModelProperty("手机号")
-        private String phone;
+        @ApiModelProperty("优惠券编号/名称")
+        private String couponKeyword;
 
-        public Long getUserId() {
-            return userId;
+        @ApiModelProperty("优惠券类型 ")
+        private CouponTypeEnum couponType;
+
+        @ApiModelProperty("可用品类 UNIVERSAL:全场通用 VIP:小酷Ai PIANO:云酷琴房 MALL:商场购物券 MUSIC:单曲点播券 SPARRING:陪练课购买券 LIVE:直播课购买券  VIDEO:视频课购买券")
+        private CouponCategoryEnum couponCategory;
+
+        @ApiModelProperty("获取途径 PLATFORM:平台,ACTIVITY:活动")
+        private SendTypeEnum issueWay;
+
+        @ApiModelProperty("使用状态 USED:已使用 USABLE:未使用 EXPIRED:过期")
+        private CouponUseStateEnum useState;
+
+        @ApiModelProperty("领取开始时间")
+        private Date issueStartTime;
+
+        @ApiModelProperty("领取结束时间")
+        private Date issueEndTime;
+
+
+        public SendTypeEnum getIssueWay() {
+            return issueWay;
         }
 
-        public void setUserId(Long userId) {
-            this.userId = userId;
+        public void setIssueWay(SendTypeEnum issueWay) {
+            this.issueWay = issueWay;
         }
 
-        public String getRealName() {
-            return realName;
+        public CouponUseStateEnum getUseState() {
+            return useState;
         }
 
-        public void setRealName(String realName) {
-            this.realName = realName;
+        public void setUseState(CouponUseStateEnum useState) {
+            this.useState = useState;
         }
 
-        public String getUsername() {
-            return username;
+        public Long getUserId() {
+            return userId;
         }
 
-        public void setUsername(String username) {
-            this.username = username;
+        public void setUserId(Long userId) {
+            this.userId = userId;
         }
 
         public ClientEnum getClientType() {
@@ -302,25 +373,108 @@ public class CouponIssueVo {
             this.clientType = clientType;
         }
 
-        public String getPhone() {
-            return phone;
+        public String getCouponKeyword() {
+            return couponKeyword;
+        }
+
+        public void setCouponKeyword(String couponKeyword) {
+            this.couponKeyword = couponKeyword;
+        }
+
+        public CouponTypeEnum getCouponType() {
+            return couponType;
         }
 
-        public void setPhone(String phone) {
-            this.phone = phone;
+        public void setCouponType(CouponTypeEnum couponType) {
+            this.couponType = couponType;
+        }
+
+        public CouponCategoryEnum getCouponCategory() {
+            return couponCategory;
+        }
+
+        public void setCouponCategory(CouponCategoryEnum couponCategory) {
+            this.couponCategory = couponCategory;
+        }
+
+        public Date getIssueStartTime() {
+            return issueStartTime;
+        }
+
+        public void setIssueStartTime(Date issueStartTime) {
+            this.issueStartTime = issueStartTime;
+        }
+
+        public Date getIssueEndTime() {
+            return issueEndTime;
+        }
+
+        public void setIssueEndTime(Date issueEndTime) {
+            this.issueEndTime = issueEndTime;
+        }
+        public String jsonString() {
+            return JSON.toJSONString(this);
         }
     }
 
-    @ApiModel("发送优惠券")
-    public static class CouponIssueUserParam {
+    @ApiModel("老师学生查看领取过的优惠券信息分页数据")
+    public static class UserCouponIssuePageInfo {
 
-        @ApiModelProperty(value = "优惠券id",required = true)
-        @NotNull(message = "优惠券id不能为空")
+        @ApiModelProperty("用户id")
+        private Long userId;
+
+        @ApiModelProperty("优惠券id")
         private Long couponId;
 
-        @ApiModelProperty("用户信息")
-        @Size(min = 1,message = "请选择发送优惠券用户")
-        private List<UserParam> userParam;
+        @ApiModelProperty("优惠券名称")
+        private String couponName;
+
+        @ApiModelProperty("优惠券类型 ")
+        private CouponTypeEnum couponType;
+
+        @ApiModelProperty("可用品类 UNIVERSAL:全场通用 VIP:小酷Ai PIANO:云酷琴房 MALL:商场购物券 MUSIC:单曲点播券 SPARRING:陪练课购买券 LIVE:直播课购买券  VIDEO:视频课购买券")
+        private CouponCategoryEnum couponCategory;
+
+        @ApiModelProperty("使用状态 USED:已使用 USABLE:未使用 EXPIRED:过期")
+        private CouponUseStateEnum useState;
+
+        @ApiModelProperty("订单号")
+        private String orderNo;
+
+        @ApiModelProperty("有效期开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("有效期结束时间")
+        private Date endTime;
+
+        @ApiModelProperty("发放时间")
+        private Date issueTime;
+
+        @ApiModelProperty("使用时间")
+        private Date useTime;
+
+        @ApiModelProperty("发放途径PLATFORM:后台发放 ACTIVITY:活动领取")
+        private SendTypeEnum issueWay;
+
+        @ApiModelProperty("发放人id")
+        private Long issuer;
+
+        @ApiModelProperty("发放人昵称")
+        private String issueUsername;
+
+        @ApiModelProperty("发放人实名")
+        private String issueRealName;
+
+        @ApiModelProperty("备注")
+        private String remark;
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
 
         public Long getCouponId() {
             return couponId;
@@ -330,14 +484,116 @@ public class CouponIssueVo {
             this.couponId = couponId;
         }
 
-        public List<UserParam> getUserParam() {
-            return userParam;
+        public String getCouponName() {
+            return couponName;
         }
 
-        public void setUserParam(List<UserParam> userParam) {
-            this.userParam = userParam;
+        public void setCouponName(String couponName) {
+            this.couponName = couponName;
         }
 
+        public CouponTypeEnum getCouponType() {
+            return couponType;
+        }
 
+        public void setCouponType(CouponTypeEnum couponType) {
+            this.couponType = couponType;
+        }
+
+        public CouponCategoryEnum getCouponCategory() {
+            return couponCategory;
+        }
+
+        public void setCouponCategory(CouponCategoryEnum couponCategory) {
+            this.couponCategory = couponCategory;
+        }
+
+        public CouponUseStateEnum getUseState() {
+            return useState;
+        }
+
+        public void setUseState(CouponUseStateEnum useState) {
+            this.useState = useState;
+        }
+
+        public String getOrderNo() {
+            return orderNo;
+        }
+
+        public void setOrderNo(String orderNo) {
+            this.orderNo = orderNo;
+        }
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+
+        public Date getIssueTime() {
+            return issueTime;
+        }
+
+        public void setIssueTime(Date issueTime) {
+            this.issueTime = issueTime;
+        }
+
+        public Date getUseTime() {
+            return useTime;
+        }
+
+        public void setUseTime(Date useTime) {
+            this.useTime = useTime;
+        }
+
+        public SendTypeEnum getIssueWay() {
+            return issueWay;
+        }
+
+        public void setIssueWay(SendTypeEnum issueWay) {
+            this.issueWay = issueWay;
+        }
+
+        public Long getIssuer() {
+            return issuer;
+        }
+
+        public void setIssuer(Long issuer) {
+            this.issuer = issuer;
+        }
+
+        public String getIssueUsername() {
+            return issueUsername;
+        }
+
+        public void setIssueUsername(String issueUsername) {
+            this.issueUsername = issueUsername;
+        }
+
+        public String getIssueRealName() {
+            return issueRealName;
+        }
+
+        public void setIssueRealName(String issueRealName) {
+            this.issueRealName = issueRealName;
+        }
+
+        public String getRemark() {
+            return remark;
+        }
+
+        public void setRemark(String remark) {
+            this.remark = remark;
+        }
     }
 }

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/UserParam.java

@@ -4,6 +4,8 @@ import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * Description
  *
@@ -14,9 +16,11 @@ import io.swagger.annotations.ApiModelProperty;
 public class UserParam{
 
     @ApiModelProperty("用户id")
+    @NotNull(message = "用户id不能为空")
     private Long userId;
 
     @ApiModelProperty("客户端类型 TEACHER :老师 STUDENT:学生")
+    @NotNull(message = "客户端类型不能为空")
     private ClientEnum clientType;
 
     public Long getUserId() {

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityReward.java

@@ -45,6 +45,11 @@ public class ActivityReward implements Serializable {
     @TableField(value = "reward_type_")
     @NotNull(message = "奖品类型不能为空")
     private RewardTypeEnum rewardType;
+
+    @ApiModelProperty("关联优惠券ID ")
+    @TableField(value = "coupon_id_")
+    private Long couponId;
+
     @ApiModelProperty("奖品描述 ")
     @TableField(value = "reward_describe_")
     private String rewardDescribe;

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CouponInfo.java

@@ -8,6 +8,7 @@ import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
 
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponValidTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -65,6 +66,10 @@ public class CouponInfo implements Serializable {
     @TableField("coupon_type_")
     private String couponType;
 
+    @ApiModelProperty("有效期类型")
+    @TableField("valid_type_")
+    private CouponValidTypeEnum validType;
+
     @ApiModelProperty("有效天数")
     @TableField("valid_day_")
     private Integer validDay;

+ 65 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CouponInventory.java

@@ -0,0 +1,65 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 优惠券库存变化
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-05
+ */
+@Getter
+@Setter
+@TableName("coupon_inventory")
+@ApiModel(value = "CouponInventory对象", description = "优惠券库存变化")
+public class CouponInventory implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("发放ID")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("用户ID")
+    @TableField("user_id_")
+    private Long userId;
+
+    @ApiModelProperty("优惠券ID")
+    @TableField("coupon_id_")
+    private Long couponId;
+
+    @ApiModelProperty("数据类型")
+    @TableField("data_type_")
+    private CouponInventoryEnum dataType;
+
+    @ApiModelProperty("变化量")
+    @TableField("number_")
+    private Integer number;
+
+    @ApiModelProperty("备注")
+    @TableField("remark_")
+    private String remark;
+
+    @ApiModelProperty("启禁状态")
+    @TableField("status_")
+    private Integer status;
+
+    @ApiModelProperty("创建时间")
+    @TableField("created_time_")
+    private Date createdTime;
+
+
+}

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MK.java

@@ -10,4 +10,6 @@ public interface MK {
     String EXP_MOBILE_NUMBER = "^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$";
     // 正型
     String EXP_INT = "^\\d+$";
+    // 时间格式
+    String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
 }

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponInventoryEnum.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.biz.dal.enums.coupon;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 优惠券库存调整类型
+ * @author: Eric
+ * @date: 2022-03-30
+ */
+public enum CouponInventoryEnum implements BaseEnum<String, CouponInventoryEnum> {
+
+    ADDITION("添加"),
+    REDUCE("减少"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CouponInventoryEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 33 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/coupon/CouponValidTypeEnum.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.biz.dal.enums.coupon;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 优惠券有效期类型
+ * @author: Eric
+ * @date: 2022-03-30
+ */
+public enum CouponValidTypeEnum implements BaseEnum<String, CouponValidTypeEnum> {
+
+    DAY("固定有效天数"),
+    TIME_PERIOD("固定时间段"),
+    ;
+
+    @EnumValue
+    private String code;
+    private String msg;
+
+    CouponValidTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+}

+ 17 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponInfoMapper.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
@@ -38,4 +40,19 @@ public interface CouponInfoMapper extends BaseMapper<CouponInfo> {
      * @return List<StatGroupWrapper>
      */
     List<StatGroupWrapper> selectCouponIssueStatInfo(@Param("couponIds") List<Long> couponIds, @Param("record") CouponInfoQuery.IssueStatQuery query);
+
+    /**
+     * 优惠券库存量调整信息
+     * @param page IPage<CouponInventoryWrapper>
+     * @param query CouponInventoryQuery
+     * @return List<CouponInventoryWrapper>
+     */
+    List<CouponInventoryWrapper> selectCouponInventoryPageInfo(@Param("page") IPage<CouponInventoryWrapper> page, @Param("record") CouponInventoryQuery query);
+
+    /**
+     * 活动优惠券统计
+     * @param couponIds 优惠券ID
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectActivityCouponStatInfo(@Param("couponIds") List<Long> couponIds);
 }

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponInventoryMapper.java

@@ -0,0 +1,16 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 优惠券库存变化 Mapper 接口
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-05
+ */
+public interface CouponInventoryMapper extends BaseMapper<CouponInventory> {
+
+}

+ 5 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CouponIssueMapper.java

@@ -1,11 +1,15 @@
 package com.yonge.cooleshow.biz.dal.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * <p>
  * 优惠券发放 Mapper 接口
@@ -17,5 +21,5 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface CouponIssueMapper extends BaseMapper<CouponIssue> {
 
-    void queryCouponIssueInfo(@Param("query") CouponIssueQueryInfo query);
+    List<CouponIssueWrapper> queryCouponIssueInfo(IPage<CouponIssueWrapper> page, @Param("query") CouponIssueQueryInfo query);
 }

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SysUserMapper.java

@@ -1,9 +1,15 @@
 package com.yonge.cooleshow.biz.dal.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 /**
  * <p>
  * 用户表 Mapper 接口
@@ -15,4 +21,14 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface SysUserMapper extends BaseMapper<SysUser> {
 
+    /**
+     * 获取能发放优惠券的用户信息
+     *
+     * @param iPage
+     * @param client  客户端类型
+     * @param keyword 查询条件
+     * @return
+     */
+    List<CouponIssueUserVo> queryCouponIssueUser(@Param("iPage") IPage<CouponIssueUserVo> iPage, @Param(
+            "client") ClientEnum client, @Param("keyword") String keyword);
 }

+ 0 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponInfoQuery.java

@@ -11,7 +11,6 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
-import java.util.List;
 
 /**
  * 优惠券查询条件

+ 46 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponInventoryQuery.java

@@ -0,0 +1,46 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 优惠券查询条件
+ * Created by Eric.Shang on 2022/9/2.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponInventoryQuery implements Serializable {
+
+    // 优惠券ID
+    private Long couponId;
+    // 操作人ID
+    private Long userId;
+    // 调整类型
+    private CouponInventoryEnum dataType;
+    // 按用户分组
+    private Boolean groupByUser;
+
+    // 开始时间
+    private Long startTime;
+    // 结束时间
+    private Long endTime;
+
+    public static CouponInventoryQuery from(String recv) {
+
+        return JSON.parseObject(recv, CouponInventoryQuery.class);
+    }
+
+
+    public CouponInventoryQuery groupByUser(Boolean groupByUser) {
+        this.groupByUser = groupByUser;
+        return this;
+    }
+}

+ 47 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/CouponIssueQueryInfo.java

@@ -1,7 +1,10 @@
 package com.yonge.cooleshow.biz.dal.queryInfo;
 
+import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.SendTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 
 import java.io.Serializable;
@@ -30,7 +33,7 @@ public class CouponIssueQueryInfo implements Serializable {
     private SendTypeEnum issueWay;
 
     // 使用状态 USED USABLE EXPIRED
-    private CouponUseStateEnum useStatus;
+    private CouponUseStateEnum useState;
 
     //  发放开始时间
     private Date issueStartTime;
@@ -44,6 +47,45 @@ public class CouponIssueQueryInfo implements Serializable {
     // 使用结束时间
     private Date usedEndTime;
 
+
+    // 优惠券编号/名称
+    private String couponKeyword;
+
+    // 优惠券类型
+    private CouponTypeEnum couponType;
+
+    // 可用品类 UNIVERSAL:全场通用 VIP:小酷Ai PIANO:云酷琴房 MALL:商场购物券 MUSIC:单曲点播券 SPARRING:陪练课购买券 LIVE:直播课购买券  VIDEO:视频课购买券
+    private CouponCategoryEnum couponCategory;
+
+    public static CouponIssueQueryInfo from(String recv) {
+
+        return JSON.parseObject(recv, CouponIssueQueryInfo.class);
+    }
+
+    public String getCouponKeyword() {
+        return couponKeyword;
+    }
+
+    public void setCouponKeyword(String couponKeyword) {
+        this.couponKeyword = couponKeyword;
+    }
+
+    public CouponTypeEnum getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(CouponTypeEnum couponType) {
+        this.couponType = couponType;
+    }
+
+    public CouponCategoryEnum getCouponCategory() {
+        return couponCategory;
+    }
+
+    public void setCouponCategory(CouponCategoryEnum couponCategory) {
+        this.couponCategory = couponCategory;
+    }
+
     public Long getUserId() {
         return userId;
     }
@@ -84,12 +126,12 @@ public class CouponIssueQueryInfo implements Serializable {
         this.couponId = couponId;
     }
 
-    public CouponUseStateEnum getUseStatus() {
-        return useStatus;
+    public CouponUseStateEnum getUseState() {
+        return useState;
     }
 
-    public void setUseStatus(CouponUseStateEnum useStatus) {
-        this.useStatus = useStatus;
+    public void setUseState(CouponUseStateEnum useState) {
+        this.useState = useState;
     }
 
     public Date getIssueStartTime() {

+ 19 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInfoService.java

@@ -3,8 +3,11 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
 
 /**
  * <p>
@@ -18,7 +21,7 @@ public interface CouponInfoService extends IService<CouponInfo> {
 
     /**
      * 分页查询优惠券信息
-     * @param page IPage<Object>
+     * @param page IPage<CouponInfoWrapper>
      * @param query CouponInfoQuery
      * @return IPage<CouponInfoWrapper>
      */
@@ -37,4 +40,19 @@ public interface CouponInfoService extends IService<CouponInfo> {
      * @return CouponInfo
      */
     CouponInfo saveOrUpdateCouponInfo(CouponInfo couponInfo);
+
+    /**
+     * 优惠券库存量调整信息
+     * @param page IPage<CouponInventoryWrapper>
+     * @param query CouponInventoryQuery
+     * @return IPage<CouponInventoryWrapper>
+     */
+    IPage<CouponInventoryWrapper> queryCouponInventoryPageInfo(IPage<CouponInventoryWrapper> page, CouponInventoryQuery query);
+
+    /**
+     * 新增优惠券库存量调整信息
+     * @param inventory CouponInventory
+     * @return int 入库行数
+     */
+    int saveOrUpdateCouponInventoryInfo(CouponInventory inventory);
 }

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInventoryService.java

@@ -0,0 +1,16 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 优惠券库存变化 服务类
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-05
+ */
+public interface CouponInventoryService extends IService<CouponInventory> {
+
+}

+ 26 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponIssueService.java

@@ -1,8 +1,13 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.UserParam;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
+import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 
 import java.util.List;
 
@@ -17,6 +22,15 @@ import java.util.List;
 public interface CouponIssueService extends IService<CouponIssue> {
 
     /**
+     * 优惠券发放记录分页
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<CouponIssueWrapper> queryCouponIssueInfo(IPage<CouponIssueWrapper> page, CouponIssueQueryInfo query);
+
+    /**
      * 撤销优惠券
      *
      * @param couponIssueId 优惠券发放记录id
@@ -26,9 +40,19 @@ public interface CouponIssueService extends IService<CouponIssue> {
 
     /**
      * 发放优惠券
-     *
      * @param couponId 优惠券id
      * @param userParam 用户信息
+     * @param issuer
+     * @param reason
+     */
+    void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason);
+
+    /**
+     * 查询能发放优惠券的用户列表
+     *
+     * @param couponId 优惠券id
+     * @param client 客户端
+     * @param keyword 真实姓名/昵称/手机号/编号
      */
-    void issueCoupon(Long couponId, List<UserParam> userParam);
+    IPage<CouponIssueUserVo> queryUser(IPage<CouponIssueUserVo> iPage, Long couponId, ClientEnum client, String keyword);
 }

+ 85 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInfoServiceImp.java

@@ -1,23 +1,30 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
+import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
 import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
+import com.yonge.cooleshow.biz.dal.mapper.CouponInventoryMapper;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
 import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper;
 import com.yonge.toolset.base.exception.BizException;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.DateTime;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 import java.util.Map;
@@ -37,6 +44,8 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
 
     @Autowired
     private SysUserMapper sysUserMapper;
+    @Autowired
+    private CouponInventoryMapper couponInventoryMapper;
 
     /**
      * 分页查询优惠券信息
@@ -66,7 +75,9 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
                                 .useState(CouponUseStateEnum.USABLE).build()).stream()
                 .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
 
-        // TODO:关联奖品数
+        // 关联奖品数
+        Map<Long, Integer> rewardNumMap = getBaseMapper().selectActivityCouponStatInfo(couponIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
 
         // 更新用户信息
         List<Long> userIds = wrappers.stream().map(CouponInfoWrapper::getUpdatedBy).distinct().collect(Collectors.toList());
@@ -82,8 +93,8 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
 
         for (CouponInfoWrapper item : wrappers) {
 
-            item.rewardNum(0)
-                    .updateUser(userNameMap.getOrDefault(item.getUpdatedBy(), ""))
+            item.rewardNum(rewardNumMap.getOrDefault(item.getId(), 0))
+                    .updatedUser(userNameMap.getOrDefault(item.getUpdatedBy(), ""))
                     .setIssueNum(issueNumMap.getOrDefault(item.getId(), 0));
         }
 
@@ -133,4 +144,74 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
 
         return getById(couponInfo.getId());
     }
+
+    /**
+     * 优惠券库存量调整信息
+     *
+     * @param page  IPage<CouponInventoryWrapper>
+     * @param query CouponInventoryQuery
+     * @return IPage<CouponInventoryWrapper>
+     */
+    @Override
+    public IPage<CouponInventoryWrapper> queryCouponInventoryPageInfo(IPage<CouponInventoryWrapper> page, CouponInventoryQuery query) {
+
+        // 优惠券库存调整信息
+        List<CouponInventoryWrapper> wrappers = getBaseMapper().selectCouponInventoryPageInfo(page, query);
+
+        if (CollectionUtils.isEmpty(wrappers)) {
+            // 没有数据,直接返回
+            return page.setRecords(Lists.newArrayList());
+        }
+
+        return page.setRecords(wrappers);
+    }
+
+    /**
+     * 新增优惠券库存量调整信息
+     *
+     * @param inventory CouponInventory
+     * @return int 入库行数
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public int saveOrUpdateCouponInventoryInfo(CouponInventory inventory) {
+
+        // 优惠券信息
+        CouponInfo couponInfo = getBaseMapper().selectById(inventory.getCouponId());
+
+        if (Objects.isNull(couponInfo)) {
+            throw new BizException("无效的优惠券ID");
+        }
+
+        // 比较当前库存量是否有效
+        if (CouponInventoryEnum.REDUCE == inventory.getDataType()
+                && couponInfo.getInventory() < inventory.getNumber()) {
+
+            throw new BizException("当前优惠券库存为: " + couponInfo.getInventory());
+        }
+
+        int ret = couponInfo.getInventory();
+        switch (inventory.getDataType()) {
+            case ADDITION:
+                ret += inventory.getNumber();
+                break;
+            case REDUCE:
+                 ret -= inventory.getNumber();
+                break;
+            default:
+                break;
+        }
+
+        // 调整优惠券库存量信息
+        CouponInfoWrapper wrapper = CouponInfoWrapper.builder()
+                .id(couponInfo.getId())
+                .inventory(ret)
+                .updatedBy(inventory.getUserId())
+                .updateTime(DateTime.now().getMillis())
+                .build();
+        getBaseMapper().updateById(JSON.parseObject(wrapper.jsonString(), CouponInfo.class));
+
+        // 新增优惠券库存量记录
+        return couponInventoryMapper.insert(inventory);
+    }
 }

+ 20 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInventoryServiceImp.java

@@ -0,0 +1,20 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
+import com.yonge.cooleshow.biz.dal.mapper.CouponInventoryMapper;
+import com.yonge.cooleshow.biz.dal.service.CouponInventoryService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 优惠券库存变化 服务实现类
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-05
+ */
+@Service
+public class CouponInventoryServiceImp extends ServiceImpl<CouponInventoryMapper, CouponInventory> implements CouponInventoryService {
+
+}

+ 104 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponIssueServiceImp.java

@@ -1,18 +1,35 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.biz.dal.dto.UserParam;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SendTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.mapper.CouponIssueMapper;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
 import com.yonge.cooleshow.biz.dal.service.CouponIssueService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 import com.yonge.cooleshow.common.enums.EStatus;
+import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -27,13 +44,40 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
 
     @Autowired
     private CouponInfoService couponInfoService;
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+
+    @Override
+    public IPage<CouponIssueWrapper> queryCouponIssueInfo(IPage<CouponIssueWrapper> page, CouponIssueQueryInfo query) {
+        List<CouponIssueWrapper> couponIssueWrappers = baseMapper.queryCouponIssueInfo(page, query);
+
+        // 获取发放人信息
+        List<Long> issuerIdList = couponIssueWrappers.stream()
+                                                .map(CouponIssueWrapper::getIssuer)
+                                                .collect(Collectors.toList());
+        List<SysUser> sysUsers = new ArrayList<>();
+        if (!CollectionUtils.isEmpty(issuerIdList)) {
+            sysUsers = sysUserMapper.selectBatchIds(issuerIdList);
+        }
+
+        Map<Long, List<SysUser>> userIdMap = sysUsers.stream().collect(Collectors.groupingBy(SysUser::getId));
+
+
+        for (CouponIssueWrapper couponIssueWrapper : couponIssueWrappers) {
+            List<SysUser> issuerList = userIdMap.get(couponIssueWrapper.getIssuer());
+            if (!CollectionUtils.isEmpty(issuerList)) {
+                couponIssueWrapper.setIssueRealName(issuerList.get(0).getRealName());
+                couponIssueWrapper.setIssueUsername(issuerList.get(0).getUsername());
+            }
+        }
+        return page.setRecords(couponIssueWrappers);
 
 
-    public void queryCouponIssueInfo(CouponIssueQueryInfo query) {
-        baseMapper.queryCouponIssueInfo(query);
     }
 
     @Override
+    @Transactional
     public Boolean withdrawCoupon(Long couponIssueId) {
         return this.lambdaUpdate()
                 .eq(CouponIssue::getId,couponIssueId)
@@ -42,9 +86,66 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
     }
 
     @Override
-    public void issueCoupon(Long couponId, List<UserParam> userParam) {
+    @Transactional
+    public void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason) {
         CouponInfo couponInfo = couponInfoService.queryCouponInfoById(couponId);
+        if (couponInfo.getInventory() < userParam.size()) {
+            throw new BizException("库存不足");
+        }
         // 判断优惠券类型 设置优惠券时间
+        Long startTime = null;
+        Long endTime = null;
+        if (couponInfo.getValidDay() != null && couponInfo.getValidDay() >0) {
+            startTime = LocalDateTime.now().atZone(ZoneId.systemDefault()).toEpochSecond();
+            endTime = LocalDateTime.now().plusDays(couponInfo.getValidDay()).atZone(ZoneId.systemDefault()).toEpochSecond();
+        } else {
+            startTime = couponInfo.getStartTime();
+            endTime = couponInfo.getEndTime();
+        }
+        List<CouponIssue> couponIssueList = new ArrayList<>();
+        for (UserParam param : userParam) {
+            if (param.getUserId() == null) {
+                throw new BizException("发放用户id不能为空");
+            }
+            if (param.getClientType() == null) {
+                throw new BizException("发放客户端不能为空");
+            }
+            CouponIssue couponIssue = new CouponIssue();
+            couponIssue.setCouponId(couponId);
+            couponIssue.setIssuer(issuer);
+            couponIssue.setIssueTime(new Date().getTime());
+            couponIssue.setIssueWay(SendTypeEnum.PLATFORM.getCode());
+            couponIssue.setRemark(reason);
+            couponIssue.setStartTime(startTime);
+            couponIssue.setEndTime(endTime);
+            couponIssue.setUseState(CouponUseStateEnum.USABLE);
+            couponIssue.setClientType(param.getClientType().getCode());
+            couponIssue.setUserId(param.getUserId());
+            couponIssue.setStatus(1);
+            couponIssueList.add(couponIssue);
+        }
+        this.saveBatch(couponIssueList);
+
+        //  优惠券扣减库存
+        // couponInfoService.updateStock()
+
+
+    }
+
+    @Override
+    public IPage<CouponIssueUserVo> queryUser(IPage<CouponIssueUserVo> iPage, Long couponId, ClientEnum client, String keyword) {
+        CouponInfo couponInfo = couponInfoService.getById(couponId);
+        if (couponInfo == null) {
+            throw new BizException("未找到优惠券信息");
+        }
+        if (client == null) {
+            client = ClientEnum.valueOf(couponInfo.getClientType());
+        }
+
+        List<CouponIssueUserVo> list = sysUserMapper.queryCouponIssueUser(iPage,client, keyword);
+
+        return iPage.setRecords(list);
+
 
     }
 }

+ 70 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/CouponIssueUserVo.java

@@ -0,0 +1,70 @@
+package com.yonge.cooleshow.biz.dal.vo;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-05
+ */
+@ApiModel("发放优惠券用户分页数据")
+public class CouponIssueUserVo {
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("实名")
+    private String realName;
+
+    @ApiModelProperty("昵称")
+    private String username;
+
+    @ApiModelProperty("客户端")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+}

+ 8 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/coupon/CouponInfoWrapper.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo.coupon;
 
+import com.alibaba.fastjson.JSON;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -23,6 +24,7 @@ public class CouponInfoWrapper implements Serializable {
     private String clientType;
     private String category;
     private String couponType;
+    private Integer inventory;
     private Integer status;
     private Long updatedBy;
     private Long updateTime;
@@ -34,16 +36,19 @@ public class CouponInfoWrapper implements Serializable {
     // 关联奖品数
     private Integer rewardNum;
     // 更新用户
-    private String updateUser;
+    private String updatedUser;
 
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
 
     public CouponInfoWrapper rewardNum(Integer rewardNum) {
         this.rewardNum = rewardNum;
         return this;
     }
 
-    public CouponInfoWrapper updateUser(String updateUser) {
-        this.updateUser = updateUser;
+    public CouponInfoWrapper updatedUser(String updateUser) {
+        this.updatedUser = updateUser;
         return this;
     }
 }

+ 264 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/coupon/CouponIssueWrapper.java

@@ -0,0 +1,264 @@
+package com.yonge.cooleshow.biz.dal.vo.coupon;
+
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SendTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponCategoryEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-09-05
+ */
+public class CouponIssueWrapper {
+
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ApiModelProperty("优惠券发放id")
+    private Long couponIssueId;
+
+    @ApiModelProperty("优惠券id")
+    private Long couponId;
+
+
+    @ApiModelProperty("优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty("优惠券类型 ")
+    private CouponTypeEnum couponType;
+
+    @ApiModelProperty("可用品类 UNIVERSAL:全场通用 VIP:小酷Ai PIANO:云酷琴房 MALL:商场购物券 MUSIC:单曲点播券 SPARRING:陪练课购买券 LIVE:直播课购买券  VIDEO:视频课购买券")
+    private CouponCategoryEnum couponCategory;
+
+
+    @ApiModelProperty("用户实名")
+    private String realName;
+
+    @ApiModelProperty("用户昵称")
+    private String username;
+
+    @ApiModelProperty("客户端类型 TEACHER :老师端 STUDENT:学生端")
+    private ClientEnum clientType;
+
+    @ApiModelProperty("使用状态 USED:已使用 USABLE:未使用 EXPIRED:过期")
+    private CouponUseStateEnum useState;
+
+    @ApiModelProperty("订单号")
+    private String orderNo;
+
+    @ApiModelProperty("有效期开始时间")
+    private Date startTime;
+
+    @ApiModelProperty("有效期结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("发放时间")
+    private Date issueTime;
+
+    @ApiModelProperty("使用时间")
+    private Date useTime;
+
+    @ApiModelProperty("发放途径PLATFORM:后台发放 ACTIVITY:活动领取")
+    private SendTypeEnum issueWay;
+
+    @ApiModelProperty("发放人id")
+    private Long issuer;
+
+    @ApiModelProperty("发放人昵称")
+    private String issueUsername;
+
+    @ApiModelProperty("发放人实名")
+    private String issueRealName;
+
+    @ApiModelProperty("使用门槛")
+    private BigDecimal useLimit;
+
+    @ApiModelProperty("优惠金额")
+    private BigDecimal discountPrice;
+
+    @ApiModelProperty("备注")
+    private String remark;
+
+    public BigDecimal getUseLimit() {
+        return useLimit;
+    }
+
+    public void setUseLimit(BigDecimal useLimit) {
+        this.useLimit = useLimit;
+    }
+
+    public BigDecimal getDiscountPrice() {
+        return discountPrice;
+    }
+
+    public void setDiscountPrice(BigDecimal discountPrice) {
+        this.discountPrice = discountPrice;
+    }
+
+    public CouponTypeEnum getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(CouponTypeEnum couponType) {
+        this.couponType = couponType;
+    }
+
+    public CouponCategoryEnum getCouponCategory() {
+        return couponCategory;
+    }
+
+    public void setCouponCategory(CouponCategoryEnum couponCategory) {
+        this.couponCategory = couponCategory;
+    }
+
+    public Long getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Long couponId) {
+        this.couponId = couponId;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Long getIssuer() {
+        return issuer;
+    }
+
+    public void setIssuer(Long issuer) {
+        this.issuer = issuer;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getCouponIssueId() {
+        return couponIssueId;
+    }
+
+    public void setCouponIssueId(Long couponIssueId) {
+        this.couponIssueId = couponIssueId;
+    }
+
+    public String getRealName() {
+        return realName;
+    }
+
+    public void setRealName(String realName) {
+        this.realName = realName;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public ClientEnum getClientType() {
+        return clientType;
+    }
+
+    public void setClientType(ClientEnum clientType) {
+        this.clientType = clientType;
+    }
+
+    public CouponUseStateEnum getUseState() {
+        return useState;
+    }
+
+    public void setUseState(CouponUseStateEnum useState) {
+        this.useState = useState;
+    }
+
+    public String getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(String orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Date getIssueTime() {
+        return issueTime;
+    }
+
+    public void setIssueTime(Date issueTime) {
+        this.issueTime = issueTime;
+    }
+
+    public Date getUseTime() {
+        return useTime;
+    }
+
+    public void setUseTime(Date useTime) {
+        this.useTime = useTime;
+    }
+
+    public SendTypeEnum getIssueWay() {
+        return issueWay;
+    }
+
+    public void setIssueWay(SendTypeEnum issueWay) {
+        this.issueWay = issueWay;
+    }
+
+    public String getIssueUsername() {
+        return issueUsername;
+    }
+
+    public void setIssueUsername(String issueUsername) {
+        this.issueUsername = issueUsername;
+    }
+
+    public String getIssueRealName() {
+        return issueRealName;
+    }
+
+    public void setIssueRealName(String issueRealName) {
+        this.issueRealName = issueRealName;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/coupon/CouponInventoryWrapper.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.wrapper.coupon;
+
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponInventoryEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 优惠券库存量调整
+ * Created by Eric.Shang on 2022/9/5.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponInventoryWrapper implements Serializable {
+
+    private Long id;
+    private Long userId;
+    private Long couponId;
+    private CouponInventoryEnum dataType;
+    private Integer number;
+    private String remark;
+    private Integer status;
+    private Date createdTime;
+
+    private String username;
+    private String realName;
+
+    public String getUsername() {
+        if (StringUtils.isEmpty(this.username)
+                && StringUtils.isNotEmpty(getRealName())) {
+
+            return getRealName();
+        }
+        return username;
+    }
+}

+ 48 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInfoMapper.xml

@@ -60,10 +60,57 @@
                 AND t1.use_state_ = #{record.useState}
             </if>
             <if test="record.timestamp != null">
-                AND t1.start_time_ &lt;= #{record.timestamp} AND #{record.timestamp} &lt;= t1.end_time_ GROUP BY t1.coupon_id_
+                AND (t1.start_time_ &lt;= #{record.timestamp} AND #{record.timestamp} &lt;= t1.end_time_)
             </if>
         </where>
+        GROUP BY t1.coupon_id_
     </select>
     <!--优惠券分页查询-->
 
+    <!--优惠券库存调整信息-->
+    <resultMap id="CouponInventoryPageInfoResultMap" type="com.yonge.cooleshow.biz.dal.wrapper.coupon.CouponInventoryWrapper">
+        <id column="id_" property="id" />
+        <result column="user_id_" property="userId" />
+        <result column="coupon_id_" property="couponId" />
+        <result column="data_type_" property="dataType" />
+        <result column="number_" property="number" />
+        <result column="remark_" property="remark" />
+        <result column="created_time_" property="createdTime" />
+
+        <result column="username_" property="username" />
+        <result column="real_name_" property="realName" />
+    </resultMap>
+    <select id="selectCouponInventoryPageInfo" resultMap="CouponInventoryPageInfoResultMap">
+        SELECT t1.id_, t1.user_id_, t1.coupon_id_, t1.data_type_, t1.number_, t1.remark_, t1.created_time_, t2.username_, t2.real_name_
+        FROM coupon_inventory t1 JOIN sys_user t2 ON t1.user_id_ = t2.id_
+        <where>
+            <if test="record.couponId != null">
+                AND t1.coupon_id_ = #{record.couponId}
+            </if>
+            <if test="record.dataType != null">
+                AND t1.data_type_ = #{record.dataType}
+            </if>
+            <if test="record.userId != null">
+                AND t1.user_id_ = #{record.userId}
+            </if>
+            <if test="record.startTime != null and record.endTime != null">
+                AND (#{record.startTime} &lt;= UNIX_TIMESTAMP(t1.created_time_) AND UNIX_TIMESTAMP(t1.created_time_) &lt;= #{record.endTime})
+            </if>
+        </where>
+        <if test="record.groupByUser != null">GROUP BY t1.user_id_</if>
+    </select>
+    <!--优惠券库存调整信息-->
+
+    <!--活动优惠券统计-->
+    <select id="selectActivityCouponStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.coupon_id_ AS id, COUNT(DISTINCT t1.id_) AS total FROM activity_reward t1
+        <where>
+            <if test="couponIds != null">
+                AND t1.coupon_id_ IN (<foreach collection="couponIds" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+        GROUP BY t1.coupon_id_
+    </select>
+    <!--活动优惠券统计-->
 </mapper>

+ 22 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInventoryMapper.xml

@@ -0,0 +1,22 @@
+<?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="com.yonge.cooleshow.biz.dal.mapper.CouponInventoryMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.CouponInventory">
+        <id column="id_" property="id" />
+        <result column="user_id_" property="userId" />
+        <result column="coupon_id_" property="couponId" />
+        <result column="data_type_" property="dataType" />
+        <result column="number_" property="number" />
+        <result column="remark_" property="remark" />
+        <result column="status_" property="status" />
+        <result column="created_time_" property="createdTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id_, user_id_, coupon_id_, data_type_, number_, remark_, status_, created_time_
+    </sql>
+
+</mapper>

+ 42 - 9
cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponIssueMapper.xml

@@ -26,7 +26,7 @@
         id_, user_id_, coupon_id_, client_type_, use_state_, use_time_, order_no_, start_time_, end_time_, issue_way_, issuer_, issue_time_, remark_, status_, created_time_
     </sql>
 
-    <select id="queryCouponIssueInfo" >
+    <select id="queryCouponIssueInfo" resultType="com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper">
         select
             su.id_ as userId,
             ci.id_ as couponIssueId,
@@ -35,13 +35,22 @@
             ci.client_type_ as clientType,
             ci.use_state_ as useState,
             ci.order_no_ as orderNo,
-            ci.start_time_ as startTime,
-            ci.end_time_ as endTime,
-            ci.issue_time_ as issueTime,
-            ci.use_time_ as useTime,
-            ci.issue_way_ as issueWay
+        from_unixtime(ci.start_time_) as startTime,
+        from_unixtime(ci.end_time_) as endTime,
+        from_unixtime(ci.issue_time_) as issueTime,
+        from_unixtime(ci.use_time_) as useTime,
+            if( ci.end_time_ &lt; unix_timestamp(now()) and ci.issue_way_  = 'USABLE','EXPIRED',ci.issue_way_) as issueWay,
+            ci.issuer_ as issuer,
+            ci.remark_ as remark,
+            cou.name_ as couponName,
+            cou.id_ as couponId,
+            cou.coupon_type_ as couponType,
+            cou.category_ as couponCategory,
+            cou.use_limit_ as useLimit,
+            cou.discount_price_ as discountPrice
         from coupon_issue ci
         left join sys_user su on ci.user_id_ = su.id_
+        left join coupon_info cou on cou.id_ = ci.coupon_id_
         <where>
             <if test="query.userId != null">
                 and #{query.userId} = ci.user_id_
@@ -52,11 +61,33 @@
             <if test="query.clientType != null">
                 and #{query.clientType} = ci.client_type_
             </if>
+            <if test="query.couponCategory != null">
+                and #{query.couponCategory} = cou.category_
+            </if>
+            <if test="query.couponType != null">
+                and #{query.couponType} = cou.coupon_type_
+            </if>
+            <if test="query.couponKeyword != null and query.couponKeyword != ''">
+                and (
+                    cou.id_ like concat('%',#{query.couponKeyword},'%')
+                    or cou.name_ like concat('%',#{query.couponKeyword},'%')
+                )
+            </if>
             <if test="query.issueWay != null">
-                and #{query.issueWay}  = ci.issue_way_
+                <choose>
+                    <when test="query.issueWay.code == 'EXPIRED'">
+                        and ci.end_time_ &lt; unix_timestamp(now()) and ci.issue_way_  = 'USABLE'
+                    </when>
+                    <when test="query.issueWay.code == 'USABLE'">
+                        and ci.end_time_ &gt;= unix_timestamp(now()) and ci.issue_way_ = 'USABLE'
+                    </when>
+                    <otherwise>
+                        and ci.issue_way_ = #{query.issueWay}
+                    </otherwise>
+                </choose>
             </if>
-            <if test="query.useStatus != null">
-                and #{query.useStatus} = ci.use_state_
+            <if test="query.useState != null">
+                and #{query.useState} = ci.use_state_
             </if>
             <if test="query.issueStartTime != null">
                 and unix_timestamp( #{query.issueStartTime}) &lt;= ci.issue_time_
@@ -80,6 +111,8 @@
             </if>
         </where>
 
+        order by ci.id_ desc
+
 
     </select>
 </mapper>

+ 30 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml

@@ -35,4 +35,34 @@
         id_, username_, password_, salt_, phone_, avatar_, create_time_, update_time_, lock_flag_, wx_openid_, qq_openid_, user_type_, gender_, nation_, birthdate_, email_, im_token_, real_name_, id_card_no_, certificate_type_, is_super_admin_, wechat_id_, del_flag_, last_username_time_
     </sql>
 
+    <select id="queryCouponIssueUser" resultType="com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo">
+
+        select
+            su.id_ as userId,
+            su.username_ as username,
+            su.real_name_ as realName,
+            #{client} as clientType,
+            su.phone_ as phone
+        from
+        <choose>
+            <when test="client.code == 'TEACHER'">
+                teacher t
+            </when>
+            <when test="client.code == 'STUDENT'">
+                student t
+            </when>
+        </choose>
+        left join sys_user su on su.id_ = t.user_id_
+        <where>
+            <if test="keyword != null and keyword != ''">
+                and (
+                su.real_name_ like concat('%',#{keyword},'%')
+                or su.username_ like concat('%',#{keyword},'%')
+                or su.phone_ like concat('%',#{keyword},'%')
+                or su.id_ like concat('%',#{keyword},'%')
+                )
+            </if>
+        </where>
+
+    </select>
 </mapper>

+ 36 - 3
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/coupon/CouponInfoController.java

@@ -1,25 +1,44 @@
 package com.yonge.cooleshow.student.controller.coupon;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.CouponIssueService;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.student.io.request.CouponInfoVO;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.stereotype.Controller;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
 
 /**
  * 优惠券信息
  * Created by Eric.Shang on 2022/9/2.
  */
-@Controller
+@RestController
 @RequestMapping("/couponInfo")
 @Api(value = "优惠券信息", tags = "优惠券信息")
 public class CouponInfoController extends BaseController {
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private CouponIssueService couponIssueService;
+
     /**
      * 优惠券信息
      * @param request CouponInfoVO.RequestInfo
@@ -28,7 +47,21 @@ public class CouponInfoController extends BaseController {
     @PostMapping("/page")
     @ApiOperation(value = "查询优惠券分页", notes = "传入CouponInfoVO.PageRequest")
     public HttpResponseResult<PageInfo<CouponInfoVO.CouponPageInfo>> queryCouponPageInfo(@RequestBody CouponInfoVO.PageRequest request) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        request.setUserId(user.getId());
+        request.setClientType(ClientEnum.STUDENT.getCode());
+        IPage<CouponIssueWrapper> couponIssueWrapperIPage = couponIssueService.queryCouponIssueInfo(
+                PageUtil.getPage(request), CouponIssueQueryInfo.from(request.jsonString()));
+
+
+        // 数据转换
+        List<CouponInfoVO.CouponPageInfo> pageInfos = JSON.parseArray(JSON.toJSONString(couponIssueWrapperIPage.getRecords()),
+                                                                      CouponInfoVO.CouponPageInfo.class);
 
-        return null;
+        return succeed(PageUtil.getPageInfo(couponIssueWrapperIPage,pageInfos));
     }
 }

+ 8 - 2
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/CouponInfoVO.java

@@ -1,6 +1,9 @@
 package com.yonge.cooleshow.student.io.request;
 
 import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,6 +29,9 @@ public class CouponInfoVO {
     @ApiModel(value = "优惠券信息分页请求", description = "优惠券信息分页")
     public static class PageRequest extends QueryInfo {
 
+        @ApiModelProperty(value = "用户id",hidden = true)
+        private Long userId;
+
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
         private String clientType;
 
@@ -53,7 +59,7 @@ public class CouponInfoVO {
         private Long id;
 
         @ApiModelProperty("优惠券名称")
-        private String name;
+        private String couponName;
 
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
         private String clientType;
@@ -74,7 +80,7 @@ public class CouponInfoVO {
         private Long couponId;
 
         @ApiModelProperty("使用状态: EXPIRED(已失效) USABLE(可使用) USED(已使用) ")
-        private String useState;
+        private CouponUseStateEnum useState;
 
         @ApiModelProperty("使用时间")
         private Long useTime;

+ 36 - 3
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/coupon/CouponInfoController.java

@@ -1,25 +1,44 @@
 package com.yonge.cooleshow.teacher.controller.coupon;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.CouponIssueService;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.teacher.io.request.CouponInfoVO;
 import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import org.springframework.stereotype.Controller;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
 
 /**
  * 优惠券信息
  * Created by Eric.Shang on 2022/9/2.
  */
-@Controller
+@RestController
 @RequestMapping("/couponInfo")
 @Api(value = "优惠券信息", tags = "优惠券信息")
 public class CouponInfoController extends BaseController {
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private CouponIssueService couponIssueService;
+
     /**
      * 优惠券信息
      * @param request CouponInfoVO.RequestInfo
@@ -28,7 +47,21 @@ public class CouponInfoController extends BaseController {
     @PostMapping("/page")
     @ApiOperation(value = "查询优惠券分页", notes = "传入CouponInfoVO.PageRequest")
     public HttpResponseResult<PageInfo<CouponInfoVO.CouponPageInfo>> queryCouponPageInfo(@RequestBody CouponInfoVO.PageRequest request) {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        request.setUserId(user.getId());
+        request.setClientType(ClientEnum.TEACHER.getCode());
+        IPage<CouponIssueWrapper> couponIssueWrapperIPage = couponIssueService.queryCouponIssueInfo(
+                PageUtil.getPage(request), CouponIssueQueryInfo.from(request.jsonString()));
+
+
+        // 数据转换
+        List<CouponInfoVO.CouponPageInfo> pageInfos = JSON.parseArray(JSON.toJSONString(couponIssueWrapperIPage.getRecords()),
+                                                                      CouponInfoVO.CouponPageInfo.class);
 
-        return null;
+        return succeed(PageUtil.getPageInfo(couponIssueWrapperIPage,pageInfos));
     }
 }

+ 6 - 2
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/io/request/CouponInfoVO.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.teacher.io.request;
 
 import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -26,6 +27,9 @@ public class CouponInfoVO {
     @ApiModel(value = "优惠券信息分页请求", description = "优惠券信息分页")
     public static class PageRequest extends QueryInfo {
 
+        @ApiModelProperty(value = "用户id",hidden = true)
+        private Long userId;
+
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
         private String clientType;
 
@@ -53,7 +57,7 @@ public class CouponInfoVO {
         private Long id;
 
         @ApiModelProperty("优惠券名称")
-        private String name;
+        private String couponName;
 
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
         private String clientType;
@@ -74,7 +78,7 @@ public class CouponInfoVO {
         private Long couponId;
 
         @ApiModelProperty("使用状态: EXPIRED(已失效) USABLE(可使用) USED(已使用) ")
-        private String useState;
+        private CouponUseStateEnum useState;
 
         @ApiModelProperty("使用时间")
         private Long useTime;