Ver Fonte

优惠券相关接口

Eric há 3 anos atrás
pai
commit
86255412ae

+ 69 - 5
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponInfoController.java

@@ -1,15 +1,26 @@
 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.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.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+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;
@@ -19,6 +30,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import javax.validation.Valid;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -35,6 +48,8 @@ public class CouponInfoController extends BaseController {
 
     @Autowired
     private CouponInfoService couponInfoService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
 
     /**
      * 优惠券信息
@@ -45,7 +60,16 @@ public class CouponInfoController extends BaseController {
     @ApiOperation(value = "查询优惠券分页", notes = "传入CouponInfoVO.PageRequest")
     public HttpResponseResult<PageInfo<CouponInfoVO.CouponPageInfo>> queryCouponPageInfo(@RequestBody CouponInfoVO.PageRequest request) {
 
-        return null;
+        // 优惠券信息
+        IPage<CouponInfoWrapper> wrapper = couponInfoService.queryCouponPageInfo(PageUtil.getPage(request),
+                CouponInfoQuery.from(request.jsonString()));
+
+        // 数据转换
+        List<CouponInfoVO.CouponPageInfo> pageInfos = JSON.parseArray(JSON.toJSONString(wrapper.getRecords()),
+                CouponInfoVO.CouponPageInfo.class);
+
+        // 分页数据信息
+        return succeed(PageUtil.getPageInfo(wrapper, pageInfos));
     }
 
     /**
@@ -56,7 +80,15 @@ public class CouponInfoController extends BaseController {
     @GetMapping("/detail/{id}")
     @ApiOperation(value = "优惠券详情", notes = "传入优惠券ID")
     public HttpResponseResult<CouponInfoVO.CouponQueryInfo> findCouponById(@PathVariable("id") Long id) {
-        return null;
+
+        if (Objects.isNull(id)) {
+            return failed("无效的优惠券ID");
+        }
+
+        // 优惠券信息
+        CouponInfo couponInfo = couponInfoService.queryCouponInfoById(id);
+
+        return succeed(CouponInfoVO.CouponQueryInfo.from(JSON.toJSONString(couponInfo)));
     }
 
     /**
@@ -67,8 +99,23 @@ public class CouponInfoController extends BaseController {
      */
     @PostMapping("/save")
     @ApiOperation(value = "新增或修改", notes = "CouponInfoVO.CouponInfo")
-    public HttpResponseResult<CouponInfoVO.CouponInfo> saveOrUpdate(@Valid @RequestBody CouponInfoVO.CouponInfo info) {
-        return null;
+    public HttpResponseResult<CouponInfoVO.CouponQueryInfo> saveOrUpdate(@Valid @RequestBody CouponInfoVO.CouponInfo 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("无效的请求参数");
+        }
+
+        // 新增或更新信息
+        CouponInfo couponInfo = couponInfoService.saveOrUpdateCouponInfo(JSON.parseObject(info.jsonString(), CouponInfo.class));
+
+        return succeed(CouponInfoVO.CouponQueryInfo.from(JSON.toJSONString(couponInfo)));
     }
 
     /**
@@ -80,7 +127,24 @@ public class CouponInfoController extends BaseController {
             @ApiParam(value = "优惠券ID", required = true) @RequestParam("couponId") Long couponId,
             @ApiParam(value = "状态 0 停用 1 启用", required = true) @RequestParam("state") Integer state) {
 
-        return null;
+        // 获取当前登录用户信息
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(user) || Objects.isNull(user.getId())) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+
+        // 更新数据信息
+        CouponInfoVO.CouponInfo info = CouponInfoVO.CouponInfo.builder()
+                .id(couponId)
+                .status(state)
+                .updatedBy(user.getId())
+                .updateTime(DateTime.now().getMillis())
+                .build();
+
+        CouponInfo couponInfo = couponInfoService.saveOrUpdateCouponInfo(JSON.parseObject(info.jsonString(), CouponInfo.class));
+
+        // 校验状态更新结果
+        return status(couponInfo.getStatus().intValue() == state);
     }
 
 

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

@@ -1,17 +1,26 @@
 package com.yonge.cooleshow.admin.io.request.coupon;
 
 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.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.DateTime;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
-import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * 优惠券信息
@@ -30,12 +39,15 @@ public class CouponInfoVO {
 
         @ApiModelProperty("优惠券名称")
         private String name;
+
         @ApiModelProperty("客户类型")
-        private String clientType;
+        private ClientEnum clientType;
+
         @ApiModelProperty("优惠券类型")
-        private String couponType;
+        private CouponTypeEnum couponType;
+
         @ApiModelProperty("可用品类")
-        private String category;
+        private CouponCategoryEnum category;
 
         public String jsonString() {
             return JSON.toJSONString(this);
@@ -78,6 +90,12 @@ public class CouponInfoVO {
         @ApiModelProperty("状态")
         private Integer status;
 
+        @ApiModelProperty("发放领取数")
+        private Integer issueNum;
+
+        @ApiModelProperty("关联奖品数")
+        private Integer rewardNum;
+
         @ApiModelProperty("最后更新人")
         private String updatedUser;
 
@@ -85,7 +103,7 @@ public class CouponInfoVO {
         private Long updateTime;
 
         @ApiModelProperty("创建时间")
-        private LocalDateTime createdTime;
+        private Date createdTime;
     }
 
     /**
@@ -102,17 +120,14 @@ public class CouponInfoVO {
         @ApiModelProperty("优惠券名称")
         private String name;
 
-        @ApiModelProperty("优惠券编号")
-        private String serialNum;
-
         @ApiModelProperty("描述")
         private String describe;
 
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
-        private String clientType;
+        private ClientEnum clientType;
 
         @ApiModelProperty("可用品类: UNIVERSAL(全场通用) VIP(小酷Ai) PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) SPARRING(陪练课购买券) LIVE(直播课购买券) VIDEO(视频课购买券) ")
-        private String category;
+        private CouponCategoryEnum category;
 
         @ApiModelProperty("使用门槛")
         private BigDecimal useLimit;
@@ -121,7 +136,7 @@ public class CouponInfoVO {
         private BigDecimal discountPrice;
 
         @ApiModelProperty("优惠券类型")
-        private String couponType;
+        private CouponTypeEnum couponType;
 
         @ApiModelProperty("有效天数")
         private Integer validDay;
@@ -153,8 +168,8 @@ public class CouponInfoVO {
         @ApiModelProperty("创建时间")
         private Date createdTime;
 
-        public String jsonString() {
-            return JSON.toJSONString(this);
+        public static CouponQueryInfo from(String recv) {
+            return JSON.parseObject(recv, CouponQueryInfo.class);
         }
     }
 
@@ -162,6 +177,7 @@ public class CouponInfoVO {
      * 新增或更新优惠券信息
      */
     @Data
+    @Builder
     @NoArgsConstructor
     @AllArgsConstructor
     public static class CouponInfo implements Serializable {
@@ -172,17 +188,14 @@ public class CouponInfoVO {
         @ApiModelProperty("优惠券名称")
         private String name;
 
-        @ApiModelProperty("优惠券编号")
-        private String serialNum;
-
         @ApiModelProperty("描述")
         private String describe;
 
         @ApiModelProperty("客户端类型: TEACHER(老师端), STUDENT(学生端)")
-        private String clientType;
+        private ClientEnum clientType;
 
         @ApiModelProperty("可用品类: UNIVERSAL(全场通用) VIP(小酷Ai) PIANO(云酷琴房) MALL(商场购物券) MUSIC(单曲点播券) SPARRING(陪练课购买券) LIVE(直播课购买券) VIDEO(视频课购买券) ")
-        private String category;
+        private CouponCategoryEnum category;
 
         @ApiModelProperty("使用门槛")
         private BigDecimal useLimit;
@@ -191,7 +204,7 @@ public class CouponInfoVO {
         private BigDecimal discountPrice;
 
         @ApiModelProperty("优惠券类型: FULL_DISCOUNT(满减券) VOUCHER(代金券) ")
-        private String couponType;
+        private CouponTypeEnum couponType;
 
         @ApiModelProperty("有效天数")
         private Integer validDay;
@@ -211,20 +224,140 @@ public class CouponInfoVO {
         @ApiModelProperty("启禁状态")
         private Integer status;
 
-        @ApiModelProperty("更新用户")
+        @ApiModelProperty(value = "更新用户", hidden = true)
         private Long updatedBy;
 
-        @ApiModelProperty("更新时间")
+        @ApiModelProperty(value = "更新时间", hidden = true)
         private Long updateTime;
 
-        @ApiModelProperty("创建用户")
+        @ApiModelProperty(value = "创建用户", hidden = true)
         private Long createdBy;
 
-        @ApiModelProperty("创建时间")
-        private Date createdTime;
-
         public String jsonString() {
             return JSON.toJSONString(this);
         }
+
+        public boolean invalidRequestParam(Long userId) {
+
+            if (Objects.isNull(getId())) {
+
+                // 新增参数
+                if (StringUtils.isEmpty(getName())) {
+                    throw new BizException("优惠券名称不能为空");
+                }
+
+                if (Objects.isNull(getClientType())) {
+                    throw new BizException("客户端不能为空");
+                }
+
+                if (Objects.isNull(getCategory())) {
+                    throw new BizException("可用品类不能为空");
+                }
+
+                if (Objects.isNull(getCouponType())) {
+                    throw new BizException("优惠券类型不能为空");
+                }
+
+                if (CouponTypeEnum.FULL_DISCOUNT == getCouponType()
+                        && Optional.ofNullable(getUseLimit()).map(BigDecimal::intValue).orElse(0) <= 0) {
+                    throw new BizException("满减金额未设置");
+                }
+
+                if (Optional.ofNullable(getValidDay()).orElse(0) <= 0
+                        || (Optional.ofNullable(getStartTime()).orElse(0L) == 0
+                            || Optional.ofNullable(getEndTime()).orElse(0L) == 0)) {
+                    throw new BizException("优惠券时间有效期不合法");
+                }
+
+                this.createdBy(userId).initSaveParam();
+            } else {
+
+                // 更新参数
+                this.updatedBy(userId).setUpdateTime(DateTime.now().getMillis());
+            }
+
+            return false;
+        }
+
+        public CouponInfo initSaveParam() {
+
+            return this.describe("")
+                    .useLimit(BigDecimal.ZERO)
+                    .discountPrice(BigDecimal.ZERO)
+                    .validDay(0)
+                    .startTime(0L)
+                    .endTime(0L)
+                    .inventory(0)
+                    .quantityLimit(0)
+                    .status(EStatus.DISABLE.getValue());
+        }
+
+        public CouponInfo describe(String describe) {
+            if (StringUtils.isEmpty(this.describe)) {
+                this.describe = describe;
+            }
+            return this;
+        }
+
+        public CouponInfo useLimit(BigDecimal useLimit) {
+            if (Objects.isNull(this.useLimit)) {
+                this.useLimit = useLimit;
+            }
+            return this;
+        }
+
+        public CouponInfo discountPrice(BigDecimal discountPrice) {
+            if (Objects.isNull(this.discountPrice)) {
+                this.discountPrice = discountPrice;
+            }
+            return this;
+        }
+
+        public CouponInfo validDay(Integer validDay) {
+            if (Objects.isNull(this.validDay)) {
+                this.validDay = validDay;
+            }
+            return this;
+        }
+
+        public CouponInfo startTime(Long startTime) {
+            if (Objects.isNull(this.startTime)) {
+                this.startTime = startTime;
+            }
+            return this;
+        }
+
+        public CouponInfo endTime(Long endTime) {
+            if (Objects.isNull(this.endTime)) {
+                this.endTime = endTime;
+            }
+            return this;
+        }
+
+        public CouponInfo inventory(Integer inventory) {
+            this.inventory = inventory;
+            return this;
+        }
+
+        public CouponInfo quantityLimit(Integer quantityLimit) {
+            this.quantityLimit = quantityLimit;
+            return this;
+        }
+
+        public CouponInfo status(Integer status) {
+            this.status = status;
+            return this;
+        }
+
+        public CouponInfo createdBy(Long createdBy) {
+            this.createdBy = createdBy;
+            return this;
+        }
+
+        public CouponInfo updatedBy(Long updatedBy) {
+            this.updatedBy = updatedBy;
+            return this;
+        }
+
     }
 }

+ 3 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/CouponIssue.java

@@ -5,7 +5,8 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
-import java.time.LocalDateTime;
+import java.util.Date;
+
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Getter;
@@ -85,7 +86,7 @@ public class CouponIssue implements Serializable {
 
     @ApiModelProperty("创建时间")
     @TableField("created_time_")
-    private LocalDateTime createdTime;
+    private Date createdTime;
 
 
 }

+ 127 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysUser.java

@@ -0,0 +1,127 @@
+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.time.LocalDate;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 用户表
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-02
+ */
+@Getter
+@Setter
+@TableName("sys_user")
+@ApiModel(value = "SysUser对象", description = "用户表")
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id_", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("用户名")
+    @TableField("username_")
+    private String username;
+
+    @TableField("password_")
+    private String password;
+
+    @ApiModelProperty("随机盐")
+    @TableField("salt_")
+    private String salt;
+
+    @ApiModelProperty("手机号")
+    @TableField("phone_")
+    private String phone;
+
+    @ApiModelProperty("头像")
+    @TableField("avatar_")
+    private String avatar;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time_")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("修改时间")
+    @TableField("update_time_")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("0-正常,1-锁定")
+    @TableField("lock_flag_")
+    private Integer lockFlag;
+
+    @ApiModelProperty("微信openid")
+    @TableField("wx_openid_")
+    private String wxOpenid;
+
+    @ApiModelProperty("QQ openid")
+    @TableField("qq_openid_")
+    private String qqOpenid;
+
+    @ApiModelProperty("用户类型(STUDENT/TEACHER/SYSTEM)")
+    @TableField("user_type_")
+    private String userType;
+
+    @ApiModelProperty("性别(0,女  1,男)")
+    @TableField("gender_")
+    private Integer gender;
+
+    @ApiModelProperty("民族")
+    @TableField("nation_")
+    private String nation;
+
+    @ApiModelProperty("出生日期")
+    @TableField("birthdate_")
+    private LocalDate birthdate;
+
+    @ApiModelProperty("邮箱")
+    @TableField("email_")
+    private String email;
+
+    @ApiModelProperty("融云token")
+    @TableField("im_token_")
+    private String imToken;
+
+    @ApiModelProperty("真实姓名")
+    @TableField("real_name_")
+    private String realName;
+
+    @ApiModelProperty("身份证号码")
+    @TableField("id_card_no_")
+    private String idCardNo;
+
+    @ApiModelProperty("证件类型")
+    @TableField("certificate_type_")
+    private String certificateType;
+
+    @ApiModelProperty("是否是超管")
+    @TableField("is_super_admin_")
+    private Boolean superAdmin;
+
+    @ApiModelProperty("微信号")
+    @TableField("wechat_id_")
+    private String wechatId;
+
+    @ApiModelProperty("0-正常,1-删除")
+    @TableField("del_flag_")
+    private Integer delFlag;
+
+    @ApiModelProperty("最近一次修改用户名称时间")
+    @TableField("last_username_time_")
+    private LocalDateTime lastUsernameTime;
+
+
+}

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

@@ -1,9 +1,17 @@
 package com.yonge.cooleshow.biz.dal.mapper;
 
+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.vo.coupon.CouponInfoWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * <p>
  * 优惠券信息 Mapper 接口
@@ -15,4 +23,19 @@ import org.springframework.stereotype.Repository;
 @Repository
 public interface CouponInfoMapper extends BaseMapper<CouponInfo> {
 
+    /**
+     * 分页查询优惠券信息
+     * @param page IPage<CouponInfoWrapper>
+     * @param query CouponInfoQuery
+     * @return List<CouponInfoWrapper>
+     */
+    List<CouponInfoWrapper> selectCouponPageInfo(@Param("page") IPage<CouponInfoWrapper> page, @Param("record") CouponInfoQuery query);
+
+    /**
+     * 优惠券发放未使用统计
+     * @param couponIds 优惠券ID
+     * @param query 统计查询条件
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectCouponIssueStatInfo(@Param("couponIds") List<Long> couponIds, @Param("record") CouponInfoQuery.IssueStatQuery query);
 }

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

@@ -0,0 +1,18 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 用户表 Mapper 接口
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-02
+ */
+@Repository
+public interface SysUserMapper extends BaseMapper<SysUser> {
+
+}

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

@@ -0,0 +1,54 @@
+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.coupon.CouponCategoryEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 优惠券查询条件
+ * Created by Eric.Shang on 2022/9/2.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponInfoQuery implements Serializable {
+
+    // 优惠券名称
+    private String name;
+    // 客户端类型
+    private ClientEnum clientType;
+    // 优惠券类型
+    private CouponTypeEnum couponType;
+    // 可用品类
+    private CouponCategoryEnum category;
+
+    public static CouponInfoQuery from(String recv) {
+
+        return JSON.parseObject(recv, CouponInfoQuery.class);
+    }
+
+    /**
+     * 优惠券发放数统计
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class IssueStatQuery implements Serializable {
+
+        // 当前时间
+        private Long timestamp;
+        // 使用状态
+        private CouponUseStateEnum useState;
+    }
+}

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInfoService.java

@@ -1,7 +1,10 @@
 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.queryInfo.CouponInfoQuery;
+import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 
 /**
  * <p>
@@ -13,4 +16,25 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface CouponInfoService extends IService<CouponInfo> {
 
+    /**
+     * 分页查询优惠券信息
+     * @param page IPage<Object>
+     * @param query CouponInfoQuery
+     * @return IPage<CouponInfoWrapper>
+     */
+    IPage<CouponInfoWrapper> queryCouponPageInfo(IPage<CouponInfoWrapper> page, CouponInfoQuery query);
+
+    /**
+     * 优惠券信息
+     * @param id 优惠券ID
+     * @return CouponInfo
+     */
+    CouponInfo queryCouponInfoById(Long id);
+
+    /**
+     * 新增或更新优惠券信息
+     * @param couponInfo CouponInfo
+     * @return CouponInfo
+     */
+    CouponInfo saveOrUpdateCouponInfo(CouponInfo couponInfo);
 }

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

@@ -1,11 +1,29 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
 import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
+import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
+import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 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.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 java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
 /**
  * <p>
  * 优惠券信息 服务实现类
@@ -17,5 +35,102 @@ import org.springframework.stereotype.Service;
 @Service
 public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponInfo> implements CouponInfoService {
 
+    @Autowired
+    private SysUserMapper sysUserMapper;
+
+    /**
+     * 分页查询优惠券信息
+     *
+     * @param page  IPage<CouponInfoWrapper>
+     * @param query CouponInfoQuery
+     * @return IPage<CouponInfoWrapper>
+     */
+    @Override
+    public IPage<CouponInfoWrapper> queryCouponPageInfo(IPage<CouponInfoWrapper> page, CouponInfoQuery query) {
+
+        // 优惠券信息
+        List<CouponInfoWrapper> wrappers = getBaseMapper().selectCouponPageInfo(page, query);
+
+        if (CollectionUtils.isEmpty(wrappers)) {
+            // 没有数据,直接返回
+            return page.setRecords(Lists.newArrayList());
+        }
+
+        List<Long> couponIds = wrappers.stream()
+                .map(CouponInfoWrapper::getId).distinct().collect(Collectors.toList());
+
+        // 查询优惠券发放人数
+        Map<Long, Integer> issueNumMap = getBaseMapper().selectCouponIssueStatInfo(couponIds,
+                        CouponInfoQuery.IssueStatQuery.builder()
+                                .timestamp(DateTime.now().getMillis())
+                                .useState(CouponUseStateEnum.USABLE).build()).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        // TODO:关联奖品数
+
+        // 更新用户信息
+        List<Long> userIds = wrappers.stream().map(CouponInfoWrapper::getUpdatedBy).distinct().collect(Collectors.toList());
+
+        Map<Long, String> userNameMap = sysUserMapper.selectBatchIds(userIds).stream()
+                .collect(Collectors.toMap(SysUser::getId, x -> {
+
+                    if (StringUtils.isNotEmpty(x.getUsername())) {
+                        return x.getUsername();
+                    }
+                    return x.getRealName();
+                }, (o, n) -> n));
+
+        for (CouponInfoWrapper item : wrappers) {
+
+            item.rewardNum(0)
+                    .updateUser(userNameMap.getOrDefault(item.getUpdatedBy(), ""))
+                    .setIssueNum(issueNumMap.getOrDefault(item.getId(), 0));
+        }
+
+        return page.setRecords(wrappers);
+    }
+
+    /**
+     * 优惠券信息
+     *
+     * @param id 优惠券ID
+     * @return CouponInfo
+     */
+    @Override
+    public CouponInfo queryCouponInfoById(Long id) {
+
+        CouponInfo couponInfo = getBaseMapper().selectById(id);
+        if (Objects.isNull(couponInfo)) {
+            throw new BizException("无效的优惠券ID");
+        }
+
+        return couponInfo;
+    }
+
+    /**
+     * 新增或更新优惠券信息
+     *
+     * @param couponInfo CouponInfo
+     * @return CouponInfo
+     */
+    @Override
+    public CouponInfo saveOrUpdateCouponInfo(CouponInfo couponInfo) {
+
+        if (Objects.isNull(couponInfo.getId())) {
+
+            // 新增优惠券
+            save(couponInfo);
+        } else {
+
+            CouponInfo info = getById(couponInfo.getId());
+            if (Objects.isNull(info)) {
+                throw new BizException("无效的优惠券ID");
+            }
+
+            // 更新优惠券
+            updateById(couponInfo);
+        }
 
+        return getById(couponInfo.getId());
+    }
 }

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

@@ -0,0 +1,49 @@
+package com.yonge.cooleshow.biz.dal.vo.coupon;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *  优惠券信息
+ * Created by Eric.Shang on 2022/9/2.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CouponInfoWrapper implements Serializable {
+
+    private Long id;
+    private String name;
+    private String clientType;
+    private String category;
+    private String couponType;
+    private Integer status;
+    private Long updatedBy;
+    private Long updateTime;
+    private Long createdBy;
+    private Date createdTime;
+
+    // 发放领取数
+    private Integer issueNum;
+    // 关联奖品数
+    private Integer rewardNum;
+    // 更新用户
+    private String updateUser;
+
+
+    public CouponInfoWrapper rewardNum(Integer rewardNum) {
+        this.rewardNum = rewardNum;
+        return this;
+    }
+
+    public CouponInfoWrapper updateUser(String updateUser) {
+        this.updateUser = updateUser;
+        return this;
+    }
+}

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StatGroupWrapper.java

@@ -0,0 +1,24 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 分组统计指标
+ * Created by Eric.Shang on 28/7/17.
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class StatGroupWrapper implements Serializable {
+
+    private Long id;
+    private Integer total;
+    private String gid; // 字符串分组ID
+
+}

+ 36 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CouponInfoMapper.xml

@@ -30,4 +30,40 @@
         id_, name_, serial_num_, describe_, client_type_, category_, use_limit_, discount_price_, coupon_type_, valid_day_, start_time_, end_time_, inventory_, quantity_limit_, status_, updated_by_, update_time_, created_by_, created_time_
     </sql>
 
+    <!--优惠券分页查询-->
+    <select id="selectCouponPageInfo" resultType="com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper">
+        SELECT t1.id_, t1.name_, t1.client_type_, t1.category_, t1.coupon_type_, t1.status_, t1.updated_by_, t1.update_time_, t1.created_time_ FROM coupon_info t1
+        <where>
+            <if test="record.name != null">
+                AND t1.name_ LIKE '%${record.name}%'
+            </if>
+            <if test="record.clientType != null">
+                AND t1.client_type_ = #{record.clientType}
+            </if>
+            <if test="record.couponType != null">
+                AND t1.coupon_type_ = #{record.couponType}
+            </if>
+            <if test="record.category != null">
+                AND t1.category_ = #{record.category}
+            </if>
+        </where>
+    </select>
+
+    <!--优惠券发放统计-->
+    <select id="selectCouponIssueStatInfo" resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.coupon_id_ AS id, COUNT(DISTINCT t1.id_) AS total FROM coupon_issue t1
+        <where>
+            <if test="couponIds != null">
+                AND t1.coupon_id_ IN (<foreach collection="couponIds" separator="," item="item">#{item}</foreach>)
+            </if>
+            <if test="record.useState != null">
+                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_
+            </if>
+        </where>
+    </select>
+    <!--优惠券分页查询-->
+
 </mapper>

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

@@ -0,0 +1,38 @@
+<?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.SysUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.yonge.cooleshow.biz.dal.entity.SysUser">
+        <id column="id_" property="id" />
+        <result column="username_" property="username" />
+        <result column="password_" property="password" />
+        <result column="salt_" property="salt" />
+        <result column="phone_" property="phone" />
+        <result column="avatar_" property="avatar" />
+        <result column="create_time_" property="createTime" />
+        <result column="update_time_" property="updateTime" />
+        <result column="lock_flag_" property="lockFlag" />
+        <result column="wx_openid_" property="wxOpenid" />
+        <result column="qq_openid_" property="qqOpenid" />
+        <result column="user_type_" property="userType" />
+        <result column="gender_" property="gender" />
+        <result column="nation_" property="nation" />
+        <result column="birthdate_" property="birthdate" />
+        <result column="email_" property="email" />
+        <result column="im_token_" property="imToken" />
+        <result column="real_name_" property="realName" />
+        <result column="id_card_no_" property="idCardNo" />
+        <result column="certificate_type_" property="certificateType" />
+        <result column="is_super_admin_" property="superAdmin" />
+        <result column="wechat_id_" property="wechatId" />
+        <result column="del_flag_" property="delFlag" />
+        <result column="last_username_time_" property="lastUsernameTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        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>
+
+</mapper>