Browse Source

feat:优惠券

Joburgess 4 năm trước cách đây
mục cha
commit
c457b7db29

+ 12 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponCodeDao.java

@@ -2,8 +2,19 @@ package com.ym.mec.biz.dal.dao;
 
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
+import org.apache.ibatis.annotations.Param;
 
 public interface SysCouponCodeDao extends BaseDAO<Long, SysCouponCode> {
 
+    /**
+     * @describe 统计指定用户指定优惠券的数量
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param userId:
+     * @param couponId:
+     * @return int
+     */
+    int countWithUserAndCoupon(@Param("userId") Integer userId,
+                               @Param("couponId") Integer couponId);
 	
-}
+}

+ 12 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCoupon.java

@@ -1,6 +1,7 @@
 package com.ym.mec.biz.dal.entity;
 
 import com.ym.mec.biz.dal.enums.CouponTypeEnum;
+import com.ym.mec.biz.dal.enums.EffectiveTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
@@ -38,6 +39,9 @@ public class SysCoupon {
 	@ApiModelProperty("期限(单位:天)")
 	private Integer deadline;
 
+	@ApiModelProperty("有效期类型")
+	private EffectiveTypeEnum effectiveType;
+
 	@ApiModelProperty("有效起始时间")
 	private java.util.Date effectiveStartTime;
 
@@ -127,6 +131,14 @@ public class SysCoupon {
 		this.limitExchangeNum = limitExchangeNum;
 	}
 
+	public EffectiveTypeEnum getEffectiveType() {
+		return effectiveType;
+	}
+
+	public void setEffectiveType(EffectiveTypeEnum effectiveType) {
+		this.effectiveType = effectiveType;
+	}
+
 	public Integer getDeadline() {
 		return deadline;
 	}

+ 7 - 7
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SysCouponCode.java

@@ -16,8 +16,8 @@ public class SysCouponCode {
 	/** 优惠码 */
 	private String code;
 	
-	/** 使用状态 */
-	private String usageStatus;
+	/** 使用状态:0未使用,1已使用 */
+	private Integer usageStatus;
 	
 	/** 用户编号 */
 	private Integer userId;
@@ -32,7 +32,7 @@ public class SysCouponCode {
 	private java.util.Date useDeadlineDate;
 	
 	/** 关联的订单号 */
-	private String paymentOrderId;
+	private Long paymentOrderId;
 	
 	/**  */
 	private java.util.Date createTime;
@@ -64,11 +64,11 @@ public class SysCouponCode {
 		return this.code;
 	}
 			
-	public void setUsageStatus(String usageStatus){
+	public void setUsageStatus(Integer usageStatus){
 		this.usageStatus = usageStatus;
 	}
 	
-	public String getUsageStatus(){
+	public Integer getUsageStatus(){
 		return this.usageStatus;
 	}
 			
@@ -104,11 +104,11 @@ public class SysCouponCode {
 		return this.useDeadlineDate;
 	}
 			
-	public void setPaymentOrderId(String paymentOrderId){
+	public void setPaymentOrderId(Long paymentOrderId){
 		this.paymentOrderId = paymentOrderId;
 	}
 	
-	public String getPaymentOrderId(){
+	public Long getPaymentOrderId(){
 		return this.paymentOrderId;
 	}
 			

+ 34 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/EffectiveTypeEnum.java

@@ -0,0 +1,34 @@
+package com.ym.mec.biz.dal.enums;
+
+import com.ym.mec.common.enums.BaseEnum;
+
+public enum EffectiveTypeEnum implements BaseEnum<String, EffectiveTypeEnum> {
+
+    DAYS("DAYS","天数"),
+    TIME_BUCKET("TIME_BUCKET","时间段");
+
+    private String code;
+
+    private String msg;
+
+    EffectiveTypeEnum(String code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }}

+ 12 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponCodeService.java

@@ -5,4 +5,15 @@ import com.ym.mec.common.service.BaseService;
 
 public interface SysCouponCodeService extends BaseService<Long, SysCouponCode> {
 
-}
+    /**
+     * @describe 兑换优惠券
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param userId: 用户编号
+     * @param couponId: 优惠券编号
+     * @param paymentOrderId: 订单编号
+     * @return boolean
+     */
+    boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId);
+
+}

+ 56 - 1
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -1,22 +1,77 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.biz.dal.dao.SysCouponDao;
+import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.util.date.DateUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
 import com.ym.mec.biz.service.SysCouponCodeService;
 import com.ym.mec.biz.dal.dao.SysCouponCodeDao;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.Objects;
 
 @Service
 public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode>  implements SysCouponCodeService {
 	
 	@Autowired
 	private SysCouponCodeDao sysCouponCodeDao;
+	@Autowired
+	private SysCouponDao sysCouponDao;
+	@Autowired
+	private IdGeneratorService idGeneratorService;
 
 	@Override
 	public BaseDAO<Long, SysCouponCode> getDAO() {
 		return sysCouponCodeDao;
 	}
-	
+
+	@Override
+	@Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+	public boolean exchangeCoupon(Integer userId, Integer couponId, Long paymentOrderId) {
+		if(Objects.isNull(userId)||Objects.isNull(couponId)||Objects.isNull(paymentOrderId)){
+			return false;
+		}
+		SysCoupon sysCoupon = sysCouponDao.lockCoupon(couponId);
+		Date now = new Date();
+		//如果优惠券不存在,或者已停用,或者不在领取有效期内,或者已消耗完,则此优惠券无效
+		boolean invalid = Objects.isNull(sysCoupon)||0==sysCoupon.getStatus()||now.compareTo(sysCoupon.getStartDate())<0||now.compareTo(sysCoupon.getEndDate())>0||sysCoupon.getConsumeNum()>sysCoupon.getStockCount();
+		if(invalid){
+			return false;
+		}
+		if(sysCoupon.getLimitExchangeNum()!=-1){
+			int userUserNum = sysCouponCodeDao.countWithUserAndCoupon(userId, couponId);
+			invalid = userUserNum>=sysCoupon.getLimitExchangeNum();
+		}
+		//如果用户使用数量超过优惠券限制则领取无效
+		if(invalid){
+			return false;
+		}
+		SysCouponCode sysCouponCode = new SysCouponCode();
+		sysCouponCode.setUserId(userId);
+		sysCouponCode.setCouponId(couponId);
+		sysCouponCode.setPaymentOrderId(paymentOrderId);
+		sysCouponCode.setCode(String.valueOf(idGeneratorService.generatorId("coupon")));
+		sysCouponCode.setUsageStatus(0);
+		switch (sysCoupon.getEffectiveType()){
+			case DAYS:
+				sysCouponCode.setUseStartDate(now);
+				sysCouponCode.setUseDeadlineDate(DateUtil.addDays(now, sysCoupon.getDeadline()));
+				break;
+			case TIME_BUCKET:
+				sysCouponCode.setUseStartDate(sysCoupon.getStartDate());
+				sysCouponCode.setUseDeadlineDate(sysCoupon.getEndDate());
+				break;
+			default:
+				return false;
+		}
+		sysCouponCodeDao.insert(sysCouponCode);
+		return true;
+	}
 }

+ 39 - 38
mec-biz/src/main/resources/config/mybatis/SysCouponCodeMapper.xml

@@ -33,50 +33,47 @@
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCouponCode" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
 		<!--
-		<selectKey resultClass="int" keyProperty="id" >
-		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL
+		<selectKey resultClass="int" keyProperty="id" > 
+		SELECT SEQ_WSDEFINITION_ID.nextval AS ID FROM DUAL 
 		</selectKey>
 		-->
-		INSERT INTO sys_coupon_code (id_,coupon_id_,code_,usage_status_,user_id_,used_time_,use_start_date_,use_deadline_date_,payment_order_id_,create_time_,update_time_) VALUES(#{id},#{couponId},#{code},#{usageStatus},#{userId},#{usedTime},#{useStartDate},#{useDeadlineDate},#{paymentOrderId},#{createTime},#{updateTime})
+		INSERT INTO sys_coupon_code (id_,coupon_id_,code_,usage_status_,user_id_,used_time_,use_start_date_,use_deadline_date_,
+		                             payment_order_id_,create_time_,update_time_)
+							 VALUES(#{id},#{couponId},#{code},#{usageStatus},#{userId},#{usedTime},#{useStartDate},#{useDeadlineDate},
+									#{paymentOrderId},NOW(),NOW())
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysCouponCode">
-		UPDATE sys_coupon_code <set>
-		<if test="couponId != null">
-			coupon_id_ = #{couponId},
-		</if>
-		<if test="usageStatus != null">
-			usage_status_ = #{usageStatus},
-		</if>
-		<if test="useStartDate != null">
-			use_start_date_ = #{useStartDate},
-		</if>
-		<if test="userId != null">
-			user_id_ = #{userId},
-		</if>
-		<if test="usedTime != null">
-			used_time_ = #{usedTime},
-		</if>
-		<if test="id != null">
-			id_ = #{id},
-		</if>
-		<if test="code != null">
-			code_ = #{code},
-		</if>
-		<if test="updateTime != null">
-			update_time_ = #{updateTime},
-		</if>
-		<if test="paymentOrderId != null">
-			payment_order_id_ = #{paymentOrderId},
-		</if>
-		<if test="useDeadlineDate != null">
-			use_deadline_date_ = #{useDeadlineDate},
-		</if>
-		<if test="createTime != null">
-			create_time_ = #{createTime},
-		</if>
-	</set> WHERE id_ = #{id}
+		UPDATE sys_coupon_code
+		<set>
+			<if test="couponId != null">
+				coupon_id_ = #{couponId},
+			</if>
+			<if test="usageStatus != null">
+				usage_status_ = #{usageStatus},
+			</if>
+			<if test="useStartDate != null">
+				use_start_date_ = #{useStartDate},
+			</if>
+			<if test="userId != null">
+				user_id_ = #{userId},
+			</if>
+			<if test="code != null">
+				code_ = #{code},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="paymentOrderId != null">
+				payment_order_id_ = #{paymentOrderId},
+			</if>
+			<if test="useDeadlineDate != null">
+				use_deadline_date_ = #{useDeadlineDate},
+			</if>
+				used_time_ = NOW()
+		</set>
+		WHERE id_ = #{id}
 	</update>
 
 	<!-- 根据主键删除一条记录 -->
@@ -93,4 +90,8 @@
 	<select id="queryCount" resultType="int">
 		SELECT COUNT(*) FROM sys_coupon_code
 	</select>
+
+	<select id="countWithUserAndCoupon" resultType="int">
+		SELECT COUNT(id_) FROM sys_coupon_code WHERE user_id_=#{userId} AND coupon_id_=#{couponId}
+	</select>
 </mapper>

+ 7 - 3
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -13,9 +13,9 @@
 		<result column="status_" property="status" />
 		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="face_value_" property="faceValue" />
-		<result column="is_enabled_" property="isEnabled" />
 		<result column="full_amount_" property="fullAmount" />
 		<result column="limit_exchange_num_" property="limitExchangeNum" />
+		<result column="effective_type_" property="effectiveType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
 		<result column="deadline_" property="deadline" />
 		<result column="effective_start_time_" property="effectiveStartTime" />
 		<result column="effective_expire_time_" property="effectiveExpireTime" />
@@ -40,10 +40,11 @@
 
 	<!-- 向数据库增加一条记录 -->
 	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.SysCoupon" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
-		INSERT INTO sys_coupon (id_,name_,description_,status_,type_,face_value_,is_enabled_,full_amount_,limit_exchange_num_,deadline_,
+		INSERT INTO sys_coupon (id_,name_,description_,status_,type_,face_value_,is_enabled_,full_amount_,limit_exchange_num_,effective_type_,deadline_,
 		                        effective_start_time_, effective_expire_time_,end_date_,start_date_,stock_count_,consume_num_,warning_stock_num_,
 		                        create_time_,update_time_)
-		                        VALUES(#{id},#{name},#{description},#{status},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{faceValue},#{isEnabled},#{fullAmount},#{limitExchangeNum},#{deadline},
+		                        VALUES(#{id},#{name},#{description},#{status},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{faceValue},#{isEnabled},#{fullAmount},#{limitExchangeNum},
+		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
 		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
 		                               NOW(), NOW())
 	</insert>
@@ -73,6 +74,9 @@
 			<if test="fullAmount != null">
 				full_amount_ = #{fullAmount},
 			</if>
+			<if test="effectiveType != null">
+				effective_type_ = #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
 			<if test="deadline != null">
 				deadline_ = #{deadline},
 			</if>