Joburgess 4 лет назад
Родитель
Сommit
d125ef28e1

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponDao.java

@@ -6,6 +6,8 @@ import org.apache.ibatis.annotations.Param;
 
 public interface SysCouponDao extends BaseDAO<Integer, SysCoupon> {
 
+    SysCoupon getWithName(@Param("name") String name);
+
     SysCoupon lockCoupon(@Param("id") Integer id);
 	
 }

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

@@ -63,6 +63,8 @@ public class SysCoupon {
 	@ApiModelProperty("预警值")
 	private Integer warningStockNum;
 
+	private Integer warningStatus;
+
 	private java.util.Date createTime;
 
 	private java.util.Date updateTime;
@@ -203,6 +205,14 @@ public class SysCoupon {
 		this.warningStockNum = warningStockNum;
 	}
 
+	public Integer getWarningStatus() {
+		return warningStatus;
+	}
+
+	public void setWarningStatus(Integer warningStatus) {
+		this.warningStatus = warningStatus;
+	}
+
 	public Date getCreateTime() {
 		return createTime;
 	}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/MessageTypeEnum.java

@@ -192,6 +192,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TRAIN_NO_RANK_STUDENT_PUSH("TRAIN_NO_RANK_STUDENT_PUSH", "云教练训练提醒"),
     TRAIN_RANK_STUDENT_PUSH("TRAIN_RANK_STUDENT_PUSH", "云教练训练提醒"),
     NO_TRAIN_STUDENT_PUSH("NO_TRAIN_STUDENT_PUSH", "云教练训练提醒"),
+
+    COUPON_STOCK_WARNING("COUPON_STOCK_WARNING", "优惠券库存预警"),
     ;
 
     MessageTypeEnum(String code, String msg) {

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysCouponService.java

@@ -11,4 +11,13 @@ public interface SysCouponService extends BaseService<Integer, SysCoupon> {
 
     void updateCoupon(SysCoupon sysCoupon);
 
+    /**
+     * @describe 优惠券低库存警告
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param couponId: 优惠券编号
+     * @return void
+     */
+    void stockWarning(Integer couponId, String couponName);
+
 }

+ 24 - 5
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponCodeServiceImpl.java

@@ -1,13 +1,17 @@
 package com.ym.mec.biz.service.impl;
 
+import com.ym.mec.biz.dal.dao.StudentPaymentOrderDao;
 import com.ym.mec.biz.dal.dao.SysCouponCodeDao;
 import com.ym.mec.biz.dal.dao.SysCouponDao;
 import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
+import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
 import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
 import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
 import com.ym.mec.biz.service.SysCouponCodeService;
+import com.ym.mec.biz.service.SysCouponService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.IdGeneratorService;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
@@ -19,6 +23,7 @@ import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 @Service
 public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCode>  implements SysCouponCodeService {
@@ -26,9 +31,13 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 	@Autowired
 	private SysCouponCodeDao sysCouponCodeDao;
 	@Autowired
+	private SysCouponService sysCouponService;
+	@Autowired
 	private SysCouponDao sysCouponDao;
 	@Autowired
 	private IdGeneratorService idGeneratorService;
+	@Autowired
+	private StudentPaymentOrderDao studentPaymentOrderDao;
 
 	@Override
 	public BaseDAO<Long, SysCouponCode> getDAO() {
@@ -39,14 +48,18 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 	@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;
+			throw new BizException("领取失败");
 		}
 		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();
+		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;
+			throw new BizException("无效优惠券");
+		}
+		StudentPaymentOrder studentPaymentOrder = studentPaymentOrderDao.get(paymentOrderId);
+		if(Objects.isNull(studentPaymentOrder)){
+			throw new BizException("无效订单");
 		}
 		if(sysCoupon.getLimitExchangeNum()!=-1){
 			int userUserNum = sysCouponCodeDao.countWithUserAndCoupon(userId, couponId);
@@ -54,7 +67,7 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 		}
 		//如果用户使用数量超过优惠券限制则领取无效
 		if(invalid){
-			return false;
+			throw new BizException("当前优惠券最多可领取{}次", sysCoupon.getLimitExchangeNum());
 		}
 		SysCouponCode sysCouponCode = new SysCouponCode();
 		sysCouponCode.setUserId(userId);
@@ -72,9 +85,15 @@ public class SysCouponCodeServiceImpl extends BaseServiceImpl<Long, SysCouponCod
 				sysCouponCode.setUseDeadlineDate(sysCoupon.getEndDate());
 				break;
 			default:
-				return false;
+				throw new BizException("无效优惠券", sysCoupon.getLimitExchangeNum());
 		}
 		sysCouponCodeDao.insert(sysCouponCode);
+		sysCoupon.setConsumeNum(new AtomicInteger(sysCoupon.getConsumeNum()).incrementAndGet());
+		if(sysCoupon.getStockCount()-sysCoupon.getConsumeNum()>sysCoupon.getWarningStockNum()){
+			sysCoupon.setWarningStatus(1);
+			sysCouponService.stockWarning(sysCoupon.getId(),sysCoupon.getName());
+		}
+		sysCouponDao.update(sysCoupon);
 		return true;
 	}
 

+ 19 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysCouponServiceImpl.java

@@ -2,14 +2,18 @@ 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.biz.dal.enums.MessageTypeEnum;
 import com.ym.mec.biz.dal.page.SysCouponQueryInfo;
 import com.ym.mec.biz.service.SysCouponService;
+import com.ym.mec.biz.service.SysMessageService;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.page.PageInfo;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 import com.ym.mec.util.collection.MapUtil;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -21,6 +25,8 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon>  i
 	
 	@Autowired
 	private SysCouponDao sysCouponDao;
+	@Autowired
+	private SysMessageService sysMessageService;
 
 	@Override
 	public BaseDAO<Integer, SysCoupon> getDAO() {
@@ -56,9 +62,22 @@ public class SysCouponServiceImpl extends BaseServiceImpl<Integer, SysCoupon>  i
 			oldCoupon.setStatus(sysCoupon.getStatus());
 			oldCoupon.setStockCount(sysCoupon.getStockCount());
 			oldCoupon.setWarningStockNum(sysCoupon.getWarningStockNum());
+			if(oldCoupon.getStockCount()-oldCoupon.getConsumeNum()>oldCoupon.getWarningStockNum()){
+				oldCoupon.setWarningStatus(0);
+			}
 			sysCouponDao.update(oldCoupon);
 		}else{
 			sysCouponDao.update(sysCoupon);
 		}
 	}
+
+	@Async
+	@Override
+	public void stockWarning(Integer couponId, String couponName) {
+		Map<Integer, String> teacherPhoneMap = new HashMap<>();
+		teacherPhoneMap.put(2112251, "13618651329");
+		sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.YIMEI, MessageTypeEnum.COUPON_STOCK_WARNING,
+				teacherPhoneMap, null, 0, null, null,
+				couponName);
+	}
 }

+ 10 - 5
mec-biz/src/main/resources/config/mybatis/SysCouponMapper.xml

@@ -24,6 +24,7 @@
 		<result column="stock_count_" property="stockCount" />
 		<result column="consume_num_" property="consumeNum" />
 		<result column="warning_stock_num_" property="warningStockNum" />
+		<result column="warning_status_" property="warningStatus" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
@@ -40,10 +41,10 @@
 
 	<!-- 向数据库增加一条记录 -->
 	<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_,effective_type_,deadline_,
+		INSERT INTO sys_coupon (id_,name_,description_,status_,type_,face_value_,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},
+		                        VALUES(#{id},#{name},#{description},#{status},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{faceValue},#{fullAmount},#{limitExchangeNum},
 		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
 		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
 		                               NOW(), NOW())
@@ -53,9 +54,6 @@
 	<update id="update" parameterType="com.ym.mec.biz.dal.entity.SysCoupon">
 		UPDATE sys_coupon
 		<set>
-			<if test="isEnabled != null">
-				is_enabled_ = #{isEnabled},
-			</if>
 			<if test="status != null">
 				status_ = #{status},
 			</if>
@@ -104,6 +102,9 @@
 			<if test="warningStockNum != null">
 				warning_stock_num_ = #{warningStockNum},
 			</if>
+			<if test="warningStatus != null">
+				warning_status_ = #{warningStatus},
+			</if>
 				update_time_ = NOW()
 		</set>
 		WHERE id_ = #{id}
@@ -145,4 +146,8 @@
 	<select id="lockCoupon" resultMap="SysCoupon">
 		SELECT * FROM sys_coupon WHERE id_ = #{id} FOR UPDATE
 	</select>
+
+	<select id="getWithName" resultMap="SysCoupon">
+		SELECT * FROM sys_coupon WHERE name_ = #{name}
+	</select>
 </mapper>

+ 14 - 0
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponCodeController.java

@@ -1,5 +1,7 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
 import com.ym.mec.biz.service.SysCouponCodeService;
 import com.ym.mec.common.controller.BaseController;
@@ -19,6 +21,8 @@ public class SysCouponCodeController extends BaseController {
 
 	@Autowired
 	private SysCouponCodeService sysCouponCodeService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
 
 	@ApiOperation("分页查询")
 	@PostMapping(value = "queryPage")
@@ -26,4 +30,14 @@ public class SysCouponCodeController extends BaseController {
 	public HttpResponseResult queryPage(SysCouponCodeQueryInfo queryInfo) {
 		return succeed(sysCouponCodeService.querySysCouponUseList(queryInfo));
 	}
+
+	@ApiOperation("兑换优惠券")
+	@PostMapping(value = "exchangeCoupon")
+	public HttpResponseResult exchangeCoupon(Integer couponId, Long paymentOrderId){
+		SysUser sysUser = sysUserFeignService.queryUserInfo();
+		if (sysUser == null) {
+			return failed("用户信息获取失败");
+		}
+		return succeed(sysCouponCodeService.exchangeCoupon(sysUser.getId(), couponId, paymentOrderId));
+	}
 }

+ 46 - 3
mec-web/src/main/java/com/ym/mec/web/controller/SysCouponController.java

@@ -1,5 +1,6 @@
 package com.ym.mec.web.controller;
 
+import com.ym.mec.biz.dal.dao.SysCouponDao;
 import com.ym.mec.biz.dal.entity.SysCoupon;
 import com.ym.mec.biz.dal.page.SysCouponQueryInfo;
 import com.ym.mec.biz.service.SysCouponService;
@@ -10,7 +11,6 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 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;
 
@@ -23,18 +23,61 @@ public class SysCouponController extends BaseController {
 
 	@Autowired
 	private SysCouponService sysCouponService;
+	@Autowired
+	private SysCouponDao sysCouponDao;
 
 	@ApiOperation("新增")
 	@PostMapping(value = "add")
 	@PreAuthorize("@pcs.hasPermissions('sysCoupon/add')")
-	public HttpResponseResult add(@RequestBody SysCoupon sysCoupon) {
+	public HttpResponseResult add(SysCoupon sysCoupon) {
+		sysCoupon.setStatus(0);
+		sysCoupon.setConsumeNum(0);
+		sysCoupon.setWarningStatus(0);
+		if(Objects.isNull(sysCoupon.getType())){
+			return failed("请指定优惠券类型");
+		}
+		switch (sysCoupon.getType()){
+			case DISCOUNT:
+				if(Objects.isNull(sysCoupon.getFaceValue())){
+					return failed("请指定折扣比例");
+				}
+				break;
+			case FULL_REDUCTION:
+				if(Objects.isNull(sysCoupon.getFaceValue())){
+					return failed("请指定优惠金额");
+				}
+				if(Objects.isNull(sysCoupon.getFullAmount())){
+					return failed("请指定达标金额");
+				}
+				break;
+			default:
+				return failed("请指定优惠券类型");
+		}
+		switch (sysCoupon.getEffectiveType()){
+			case DAYS:
+				if(Objects.isNull(sysCoupon.getDeadline())){
+					return failed("请指定有效天数");
+				}
+				break;
+			case TIME_BUCKET:
+				if(Objects.isNull(sysCoupon.getDeadline())){
+					return failed("请指定有效时间段");
+				}
+				break;
+			default:
+				return failed("请指定有效期类型");
+		}
+		SysCoupon sysCouponDaoWithName = sysCouponDao.getWithName(sysCoupon.getName());
+		if(Objects.nonNull(sysCouponDaoWithName)){
+			return failed("优惠券名称重复");
+		}
 		return succeed(sysCouponService.insert(sysCoupon));
 	}
 
 	@ApiOperation("修改")
 	@PostMapping(value = "updateCoupon")
 	@PreAuthorize("@pcs.hasPermissions('sysCoupon/updateCoupon')")
-	public HttpResponseResult updateCoupon(@RequestBody SysCoupon sysCoupon) {
+	public HttpResponseResult updateCoupon(SysCoupon sysCoupon) {
 		sysCouponService.updateCoupon(sysCoupon);
 		return succeed();
 	}