Bladeren bron

Merge remote-tracking branch 'origin/cloud_teacher_active_2021_09' into cloud_teacher_active_2021_09

zouxuan 4 jaren geleden
bovenliggende
commit
0821a32422

+ 20 - 2
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysCouponCodeDao.java

@@ -1,9 +1,27 @@
 package com.ym.mec.biz.dal.dao;
 
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import com.ym.mec.common.dal.BaseDAO;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
 
 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);
+
+    List<SysCouponCodeDto> querySysCouponUseList(Map<String, Object> params);
+    int countSysCouponUseList(Map<String, Object> params);
+
+}

+ 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);
 	
 }

+ 178 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/SysCouponCodeDto.java

@@ -0,0 +1,178 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.enums.CouponTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/9/8 0008
+ */
+public class SysCouponCodeDto {
+
+    @ApiModelProperty("分部编号")
+    private Integer organId;
+
+    @ApiModelProperty("分部名称")
+    private String organName;
+
+    @ApiModelProperty("用户编号")
+    private Integer userId;
+
+    @ApiModelProperty("用户名称")
+    private String userName;
+
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("优惠券编号")
+    private Integer couponId;
+
+    @ApiModelProperty("优惠券类型")
+    private CouponTypeEnum couponType;
+
+    @ApiModelProperty("优惠券名称")
+    private String couponName;
+
+    @ApiModelProperty("描述")
+    private String couponDescription;
+
+    @ApiModelProperty("优惠码")
+    private String code;
+
+    @ApiModelProperty("订单编号")
+    private Long paymentOrderId;
+
+    @ApiModelProperty("使用状态:0未使用,1已使用")
+    private Integer usageStatus;
+
+    @ApiModelProperty("实际使用时间")
+    private java.util.Date usedTime;
+
+    @ApiModelProperty("使用开始日期")
+    private java.util.Date useStartDate;
+
+    @ApiModelProperty("使用截止日期")
+    private java.util.Date useDeadlineDate;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getOrganName() {
+        return organName;
+    }
+
+    public void setOrganName(String organName) {
+        this.organName = organName;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public void setUserName(String userName) {
+        this.userName = userName;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Integer getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Integer couponId) {
+        this.couponId = couponId;
+    }
+
+    public CouponTypeEnum getCouponType() {
+        return couponType;
+    }
+
+    public void setCouponType(CouponTypeEnum couponType) {
+        this.couponType = couponType;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public String getCouponDescription() {
+        return couponDescription;
+    }
+
+    public void setCouponDescription(String couponDescription) {
+        this.couponDescription = couponDescription;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public Long getPaymentOrderId() {
+        return paymentOrderId;
+    }
+
+    public void setPaymentOrderId(Long paymentOrderId) {
+        this.paymentOrderId = paymentOrderId;
+    }
+
+    public Integer getUsageStatus() {
+        return usageStatus;
+    }
+
+    public void setUsageStatus(Integer usageStatus) {
+        this.usageStatus = usageStatus;
+    }
+
+    public Date getUsedTime() {
+        return usedTime;
+    }
+
+    public void setUsedTime(Date usedTime) {
+        this.usedTime = usedTime;
+    }
+
+    public Date getUseStartDate() {
+        return useStartDate;
+    }
+
+    public void setUseStartDate(Date useStartDate) {
+        this.useStartDate = useStartDate;
+    }
+
+    public Date getUseDeadlineDate() {
+        return useDeadlineDate;
+    }
+
+    public void setUseDeadlineDate(Date useDeadlineDate) {
+        this.useDeadlineDate = useDeadlineDate;
+    }
+}

+ 22 - 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;
 
@@ -59,6 +63,8 @@ public class SysCoupon {
 	@ApiModelProperty("预警值")
 	private Integer warningStockNum;
 
+	private Integer warningStatus;
+
 	private java.util.Date createTime;
 
 	private java.util.Date updateTime;
@@ -127,6 +133,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;
 	}
@@ -191,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;
 	}

+ 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;
+    }}

+ 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) {

+ 50 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/SysCouponCodeQueryInfo.java

@@ -0,0 +1,50 @@
+package com.ym.mec.biz.dal.page;
+
+import com.ym.mec.common.page.QueryInfo;
+
+/**
+ * @Author Joburgess
+ * @Date 2021/9/8 0008
+ */
+public class SysCouponCodeQueryInfo extends QueryInfo {
+
+    private Integer organId;
+
+    private String couponName;
+
+    private Long paymentOrderId;
+
+    private Integer usageStatus;
+
+    public Integer getOrganId() {
+        return organId;
+    }
+
+    public void setOrganId(Integer organId) {
+        this.organId = organId;
+    }
+
+    public String getCouponName() {
+        return couponName;
+    }
+
+    public void setCouponName(String couponName) {
+        this.couponName = couponName;
+    }
+
+    public Long getPaymentOrderId() {
+        return paymentOrderId;
+    }
+
+    public void setPaymentOrderId(Long paymentOrderId) {
+        this.paymentOrderId = paymentOrderId;
+    }
+
+    public Integer getUsageStatus() {
+        return usageStatus;
+    }
+
+    public void setUsageStatus(Integer usageStatus) {
+        this.usageStatus = usageStatus;
+    }
+}

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

@@ -1,8 +1,31 @@
 package com.ym.mec.biz.service;
 
+import com.ym.mec.biz.dal.dto.SysCouponCodeDto;
 import com.ym.mec.biz.dal.entity.SysCouponCode;
+import com.ym.mec.biz.dal.page.SysCouponCodeQueryInfo;
+import com.ym.mec.common.page.PageInfo;
 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);
+
+    /**
+     * @describe 优惠券领取列表
+     * @author Joburgess
+     * @date 2021/9/8 0008
+     * @param queryInfo:
+     * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.dto.SysCouponCodeDto>
+     */
+    PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo);
+
+}

+ 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);
+
 }

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

@@ -1,22 +1,116 @@
 package com.ym.mec.biz.service.impl;
 
-import com.ym.mec.common.dal.BaseDAO;
-import org.springframework.beans.factory.annotation.Autowired;
-import com.ym.mec.common.service.impl.BaseServiceImpl;
+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.dal.dao.SysCouponCodeDao;
+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;
+import com.ym.mec.util.collection.MapUtil;
+import com.ym.mec.util.date.DateUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+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 {
 	
 	@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() {
 		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)){
+			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();
+		if(invalid){
+			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);
+			invalid = userUserNum>=sysCoupon.getLimitExchangeNum();
+		}
+		//如果用户使用数量超过优惠券限制则领取无效
+		if(invalid){
+			throw new BizException("当前优惠券最多可领取{}次", sysCoupon.getLimitExchangeNum());
+		}
+		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:
+				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;
+	}
+
+	@Override
+	public PageInfo<SysCouponCodeDto> querySysCouponUseList(SysCouponCodeQueryInfo queryInfo) {
+		PageInfo<SysCouponCodeDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<String, Object>();
+		MapUtil.populateMap(params, queryInfo);
+
+		List<SysCouponCodeDto> dataList = new ArrayList<>();
+		int count = sysCouponCodeDao.countSysCouponUseList(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = sysCouponCodeDao.querySysCouponUseList(params);
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
 }

+ 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);
+	}
 }

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

@@ -20,6 +20,24 @@
 		<result column="update_time_" property="updateTime" />
 	</resultMap>
 
+	<resultMap id="SysCouponCodeDto" type="com.ym.mec.biz.dal.dto.SysCouponCodeDto">
+		<result column="organ_id_" property="organId"/>
+		<result column="organ_name_" property="organName"/>
+		<result column="user_id_" property="userId"/>
+		<result column="user_name_" property="userName"/>
+		<result column="phone_" property="phone"/>
+		<result column="coupon_id_" property="couponId"/>
+		<result column="coupon_type_" property="couponType" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler"/>
+		<result column="coupon_name_" property="couponName"/>
+		<result column="coupon_description_" property="couponDescription"/>
+		<result column="code_" property="code"/>
+		<result column="payment_order_id_" property="paymentOrderId"/>
+		<result column="usage_status_" property="usageStatus"/>
+		<result column="used_time_" property="usedTime"/>
+		<result column="use_start_date_" property="useStartDate"/>
+		<result column="use_deadline_date_" property="useDeadlineDate"/>
+	</resultMap>
+
 	<!-- 根据主键查询一条记录 -->
 	<select id="get" resultMap="SysCouponCode" >
 		SELECT * FROM sys_coupon_code WHERE id_ = #{id}
@@ -33,50 +51,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 +108,62 @@
 	<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>
+
+	<sql id="querySysCouponUseListCondition">
+		<where>
+			<if test="couponName!=null and couponName!=''">
+				AND sc.name_ LIKE CONCAT('%', #{couponName}, '%')
+			</if>
+			<if test="paymentOrderId!=null">
+				AND scc.payment_order_id_=#{paymentOrderId}
+			</if>
+			<if test="usageStatus!=null">
+				AND scc.usage_status_=#{usageStatus}
+			</if>
+			<if test="organId!=null">
+				AND su.organ_id_=#{organId}
+			</if>
+			<if test="search!=null and search!=''">
+				AND (scc.user_id_=#{search} OR su.phone_=#{search} OR su.username_ LIKE CONCAT('%', #{search}, '%'))
+			</if>
+		</where>
+	</sql>
+
+	<select id="querySysCouponUseList" resultMap="SysCouponCodeDto">
+		SELECT
+			organ.name_ organ_name_,
+			su.username_,
+			su.phone_,
+			scc.coupon_id_,
+			sc.type_ coupon_type_,
+			sc.name_ coupon_name_,
+			sc.description_ coupon_description_,
+			scc.code_,
+			scc.payment_order_id_,
+			scc.use_start_date_,
+			scc.use_deadline_date_,
+			scc.used_time_,
+			scc.usage_status_
+		FROM sys_coupon_code scc
+			 LEFT JOIN sys_coupon sc ON scc.coupon_id_=sc.id_
+			 LEFT JOIN sys_user su ON scc.user_id_=su.id_
+			 LEFT JOIN organization organ ON su.organ_id_=organ.id_
+		<include refid="querySysCouponUseListCondition"></include>
+		ORDER BY scc.id_ DESC
+		<include refid="global.limit"></include>
+	</select>
+
+	<select id="countSysCouponUseList" resultType="java.lang.Integer">
+		SELECT
+			COUNT(scc.id_)
+		FROM sys_coupon_code scc
+			LEFT JOIN sys_coupon sc ON scc.coupon_id_=sc.id_
+			LEFT JOIN sys_user su ON scc.user_id_=su.id_
+			LEFT JOIN organization organ ON su.organ_id_=organ.id_
+		<include refid="querySysCouponUseListCondition"></include>
+	</select>
 </mapper>

+ 15 - 6
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" />
@@ -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,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_,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},#{fullAmount},#{limitExchangeNum},
+		                               #{effectiveType, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{deadline},
 		                               #{effectiveStartTime},#{effectiveExpireTime},#{endDate},#{startDate},#{stockCount},#{consumeNum},#{warningStockNum},
 		                               NOW(), NOW())
 	</insert>
@@ -52,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>
@@ -73,6 +72,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>
@@ -100,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}
@@ -141,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>

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

@@ -0,0 +1,43 @@
+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;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+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.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RequestMapping("sysCouponCode")
+@Api(tags = "优惠券")
+@RestController
+public class SysCouponCodeController extends BaseController {
+
+	@Autowired
+	private SysCouponCodeService sysCouponCodeService;
+	@Autowired
+	private SysUserFeignService sysUserFeignService;
+
+	@ApiOperation("分页查询")
+	@PostMapping(value = "queryPage")
+	@PreAuthorize("@pcs.hasPermissions('sysCouponCode/queryPage')")
+	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();
 	}