yonge 5 سال پیش
والد
کامیت
4bafc7f933
19فایلهای تغییر یافته به همراه1281 افزوده شده و 118 حذف شده
  1. 1 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysTenantAccountDao.java
  2. 35 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantPaymentOrderDao.java
  3. 110 66
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantEntryActivities.java
  4. 281 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantPaymentOrder.java
  5. 2 1
      mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java
  6. 11 0
      mec-biz/src/main/java/com/ym/mec/biz/dal/page/TenantEntryActivitesQueryInfo.java
  7. 14 0
      mec-biz/src/main/java/com/ym/mec/biz/service/SysTenantAccountService.java
  8. 0 7
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantEntryActivitiesService.java
  9. 29 0
      mec-biz/src/main/java/com/ym/mec/biz/service/TenantPaymentOrderService.java
  10. 54 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysTenantAccountServiceImpl.java
  11. 0 21
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantEntryActivitiesServiceImpl.java
  12. 321 0
      mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java
  13. 4 0
      mec-biz/src/main/resources/config/mybatis/SysTenantAccountMapper.xml
  14. 14 3
      mec-biz/src/main/resources/config/mybatis/TenantEntryActivitiesMapper.xml
  15. 158 0
      mec-biz/src/main/resources/config/mybatis/TenantPaymentOrderMapper.xml
  16. 9 2
      mec-teacher/src/main/java/com/ym/mec/teacher/config/ResourceServerConfig.java
  17. 172 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherOrderController.java
  18. 40 0
      mec-teacher/src/main/java/com/ym/mec/teacher/controller/TenantPaymentOrderController.java
  19. 26 18
      mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

+ 1 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/SysTenantAccountDao.java

@@ -4,4 +4,5 @@ import com.ym.mec.biz.dal.entity.SysTenantAccount;
 
 public interface SysTenantAccountDao extends com.ym.mec.common.dal.BaseDAO<Integer, SysTenantAccount> {
 
+	SysTenantAccount getLocked(Integer userId);
 }

+ 35 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/TenantPaymentOrderDao.java

@@ -0,0 +1,35 @@
+package com.ym.mec.biz.dal.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.common.dal.BaseDAO;
+
+public interface TenantPaymentOrderDao extends BaseDAO<Long, TenantPaymentOrder> {
+
+	/**
+	 * 查询用户所有订单
+	 * @param userId
+	 * @return
+	 */
+	List<TenantPaymentOrder> queryByUserId(Integer userId);
+
+	/**
+	 * 根据订单号查询订单
+	 *
+	 * @param orderNo
+	 * @return
+	 */
+	TenantPaymentOrder findOrderByOrderNo(@Param("orderNo") String orderNo);
+
+	/**
+	 * 查询支付中订单
+	 *
+	 * @param status
+	 * @return
+	 */
+	List<TenantPaymentOrder> findOrdersByStatus(@Param("status") DealStatusEnum status, @Param("paymentChannel") String paymentChannel);
+}

+ 110 - 66
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantEntryActivities.java

@@ -2,100 +2,128 @@ package com.ym.mec.biz.dal.entity;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
+import com.ym.mec.common.enums.BaseEnum;
+
 /**
  * 对应数据库表(tenant_entry_activites):
  */
 public class TenantEntryActivities {
 
+	public enum SuitableUser implements BaseEnum<String, SuitableUser> {
+		NEW("NEW", "新手"), ALL("ALL", "全部");
+
+		private String code;
+
+		private String desc;
+
+		SuitableUser(String code, String desc) {
+			this.code = code;
+			this.desc = desc;
+		}
+
+		@Override
+		public String getCode() {
+			return code;
+		}
+
+		public String getDesc() {
+			return desc;
+		}
+	}
+
 	/**  */
 	private Integer id;
-	
+
 	/**  */
 	private String name;
-	
+
 	/**  */
 	private String coverImg;
-	
+
 	/**  */
 	private String detail;
-	
+
+	private SuitableUser suitableUser;
+
+	private String tag;
+
 	/**  */
 	private java.math.BigDecimal totalPrice;
-	
+
 	/**  */
 	private java.math.BigDecimal discountPrice;
-	
+
 	private Integer purchaseMinutes;
-	
+
 	/**  */
 	private Integer giveMinutes;
-	
+
 	/**  */
 	private java.util.Date startDate;
-	
+
 	/**  */
 	private java.util.Date endDate;
-	
+
 	/**  */
 	private String condition;
-	
+
 	/**  */
 	private Boolean delFlag;
-	
+
 	/**  */
 	private java.util.Date createTime;
-	
+
 	/**  */
 	private java.util.Date updateTime;
-	
-	public void setId(Integer id){
+
+	public void setId(Integer id) {
 		this.id = id;
 	}
-	
-	public Integer getId(){
+
+	public Integer getId() {
 		return this.id;
 	}
-			
-	public void setName(String name){
+
+	public void setName(String name) {
 		this.name = name;
 	}
-	
-	public String getName(){
+
+	public String getName() {
 		return this.name;
 	}
-			
-	public void setCoverImg(String coverImg){
+
+	public void setCoverImg(String coverImg) {
 		this.coverImg = coverImg;
 	}
-	
-	public String getCoverImg(){
+
+	public String getCoverImg() {
 		return this.coverImg;
 	}
-			
-	public void setDetail(String detail){
+
+	public void setDetail(String detail) {
 		this.detail = detail;
 	}
-	
-	public String getDetail(){
+
+	public String getDetail() {
 		return this.detail;
 	}
-			
-	public void setTotalPrice(java.math.BigDecimal totalPrice){
+
+	public void setTotalPrice(java.math.BigDecimal totalPrice) {
 		this.totalPrice = totalPrice;
 	}
-	
-	public java.math.BigDecimal getTotalPrice(){
+
+	public java.math.BigDecimal getTotalPrice() {
 		return this.totalPrice;
 	}
-			
-	public void setDiscountPrice(java.math.BigDecimal discountPrice){
+
+	public void setDiscountPrice(java.math.BigDecimal discountPrice) {
 		this.discountPrice = discountPrice;
 	}
-	
-	public java.math.BigDecimal getDiscountPrice(){
+
+	public java.math.BigDecimal getDiscountPrice() {
 		return this.discountPrice;
 	}
-			
+
 	public Integer getPurchaseMinutes() {
 		return purchaseMinutes;
 	}
@@ -104,62 +132,78 @@ public class TenantEntryActivities {
 		this.purchaseMinutes = purchaseMinutes;
 	}
 
-	public void setGiveMinutes(Integer giveMinutes){
+	public void setGiveMinutes(Integer giveMinutes) {
 		this.giveMinutes = giveMinutes;
 	}
-	
-	public Integer getGiveMinutes(){
+
+	public Integer getGiveMinutes() {
 		return this.giveMinutes;
 	}
-			
-	public void setStartDate(java.util.Date startDate){
+
+	public void setStartDate(java.util.Date startDate) {
 		this.startDate = startDate;
 	}
-	
-	public java.util.Date getStartDate(){
+
+	public java.util.Date getStartDate() {
 		return this.startDate;
 	}
-			
-	public void setEndDate(java.util.Date endDate){
+
+	public void setEndDate(java.util.Date endDate) {
 		this.endDate = endDate;
 	}
-	
-	public java.util.Date getEndDate(){
+
+	public java.util.Date getEndDate() {
 		return this.endDate;
 	}
-			
-	public void setCondition(String condition){
+
+	public void setCondition(String condition) {
 		this.condition = condition;
 	}
-	
-	public String getCondition(){
+
+	public String getCondition() {
 		return this.condition;
 	}
-			
-	public void setDelFlag(Boolean delFlag){
+
+	public void setDelFlag(Boolean delFlag) {
 		this.delFlag = delFlag;
 	}
-	
-	public Boolean getDelFlag(){
+
+	public Boolean getDelFlag() {
 		return this.delFlag;
 	}
-			
-	public void setCreateTime(java.util.Date createTime){
+
+	public void setCreateTime(java.util.Date createTime) {
 		this.createTime = createTime;
 	}
-	
-	public java.util.Date getCreateTime(){
+
+	public java.util.Date getCreateTime() {
 		return this.createTime;
 	}
-			
-	public void setUpdateTime(java.util.Date updateTime){
+
+	public void setUpdateTime(java.util.Date updateTime) {
 		this.updateTime = updateTime;
 	}
-	
-	public java.util.Date getUpdateTime(){
+
+	public java.util.Date getUpdateTime() {
 		return this.updateTime;
 	}
-			
+
+	public SuitableUser getSuitableUser() {
+		return suitableUser;
+	}
+
+	public void setSuitableUser(SuitableUser suitableUser) {
+		this.suitableUser = suitableUser;
+	}
+
+	public String getTag() {
+		return tag;
+	}
+
+	public void setTag(String tag) {
+		this.tag = tag;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 281 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/TenantPaymentOrder.java

@@ -0,0 +1,281 @@
+package com.ym.mec.biz.dal.entity;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.common.enums.BaseEnum;
+
+/**
+ * 对应数据库表(tenant_payment_order):
+ */
+public class TenantPaymentOrder {
+
+	public enum TenantPaymentType implements BaseEnum<String, TenantPaymentType> {
+		RECHARGE("RECHARGE", "充值");
+
+		private String code;
+
+		private String desc;
+
+		TenantPaymentType(String code, String desc) {
+			this.code = code;
+			this.desc = desc;
+		}
+
+		@Override
+		public String getCode() {
+			return code;
+		}
+
+		public String getDesc() {
+			return desc;
+		}
+	}
+
+	/**  */
+	private Long id;
+	
+	private Integer activitiesId;
+
+	/**  */
+	private Integer userId;
+
+	/** 分部id */
+	private Integer organId;
+
+	/** 订单类型(购买) */
+	private TenantPaymentType type;
+
+	/** 预计金额 */
+	private java.math.BigDecimal expectAmount;
+
+	/** 实际金额 */
+	private java.math.BigDecimal actualAmount;
+
+	/** 余额支付金额 */
+	private java.math.BigDecimal balancePaymentAmount;
+
+	/** 公户金额 */
+	private java.math.BigDecimal comAmount;
+
+	/** 私户金额 */
+	private java.math.BigDecimal perAmount;
+
+	/** 减免金额 */
+	private java.math.BigDecimal remitFee;
+
+	/** 交易流水号(第三方支付平台) */
+	private String transNo;
+
+	/** 交易状态 */
+	private DealStatusEnum status;
+
+	/** 备注 */
+	private String memo;
+
+	/** 付款渠道 */
+	private String paymentChannel;
+
+	/** 业务渠道 */
+	private String paymentBusinessChannel;
+
+	/** 渠道收款账户 */
+	private String merNos;
+
+	/** 订单号 */
+	private String orderNo;
+
+	/** 支付时间 */
+	private java.util.Date payTime;
+
+	/** 版本 */
+	private Integer version;
+
+	/**  */
+	private java.util.Date createTime;
+
+	/**  */
+	private java.util.Date updateTime;
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	public Long getId() {
+		return this.id;
+	}
+
+	public Integer getActivitiesId() {
+		return activitiesId;
+	}
+
+	public void setActivitiesId(Integer activitiesId) {
+		this.activitiesId = activitiesId;
+	}
+
+	public void setUserId(Integer userId) {
+		this.userId = userId;
+	}
+
+	public Integer getUserId() {
+		return this.userId;
+	}
+
+	public void setOrganId(Integer organId) {
+		this.organId = organId;
+	}
+
+	public Integer getOrganId() {
+		return this.organId;
+	}
+
+	public void setType(TenantPaymentType type) {
+		this.type = type;
+	}
+
+	public TenantPaymentType getType() {
+		return this.type;
+	}
+
+	public void setExpectAmount(java.math.BigDecimal expectAmount) {
+		this.expectAmount = expectAmount;
+	}
+
+	public java.math.BigDecimal getExpectAmount() {
+		return this.expectAmount;
+	}
+
+	public void setActualAmount(java.math.BigDecimal actualAmount) {
+		this.actualAmount = actualAmount;
+	}
+
+	public java.math.BigDecimal getActualAmount() {
+		return this.actualAmount;
+	}
+
+	public void setBalancePaymentAmount(java.math.BigDecimal balancePaymentAmount) {
+		this.balancePaymentAmount = balancePaymentAmount;
+	}
+
+	public java.math.BigDecimal getBalancePaymentAmount() {
+		return this.balancePaymentAmount;
+	}
+
+	public void setComAmount(java.math.BigDecimal comAmount) {
+		this.comAmount = comAmount;
+	}
+
+	public java.math.BigDecimal getComAmount() {
+		return this.comAmount;
+	}
+
+	public void setPerAmount(java.math.BigDecimal perAmount) {
+		this.perAmount = perAmount;
+	}
+
+	public java.math.BigDecimal getPerAmount() {
+		return this.perAmount;
+	}
+
+	public void setRemitFee(java.math.BigDecimal remitFee) {
+		this.remitFee = remitFee;
+	}
+
+	public java.math.BigDecimal getRemitFee() {
+		return this.remitFee;
+	}
+
+	public void setTransNo(String transNo) {
+		this.transNo = transNo;
+	}
+
+	public String getTransNo() {
+		return this.transNo;
+	}
+
+	public void setStatus(DealStatusEnum status) {
+		this.status = status;
+	}
+
+	public DealStatusEnum getStatus() {
+		return this.status;
+	}
+
+	public void setMemo(String memo) {
+		this.memo = memo;
+	}
+
+	public String getMemo() {
+		return this.memo;
+	}
+
+	public void setPaymentChannel(String paymentChannel) {
+		this.paymentChannel = paymentChannel;
+	}
+
+	public String getPaymentChannel() {
+		return this.paymentChannel;
+	}
+
+	public void setPaymentBusinessChannel(String paymentBusinessChannel) {
+		this.paymentBusinessChannel = paymentBusinessChannel;
+	}
+
+	public String getPaymentBusinessChannel() {
+		return this.paymentBusinessChannel;
+	}
+
+	public void setMerNos(String merNos) {
+		this.merNos = merNos;
+	}
+
+	public String getMerNos() {
+		return this.merNos;
+	}
+
+	public void setOrderNo(String orderNo) {
+		this.orderNo = orderNo;
+	}
+
+	public String getOrderNo() {
+		return this.orderNo;
+	}
+
+	public void setPayTime(java.util.Date payTime) {
+		this.payTime = payTime;
+	}
+
+	public java.util.Date getPayTime() {
+		return this.payTime;
+	}
+
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+
+	public Integer getVersion() {
+		return this.version;
+	}
+
+	public void setCreateTime(java.util.Date createTime) {
+		this.createTime = createTime;
+	}
+
+	public java.util.Date getCreateTime() {
+		return this.createTime;
+	}
+
+	public void setUpdateTime(java.util.Date updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public java.util.Date getUpdateTime() {
+		return this.updateTime;
+	}
+
+	@Override
+	public String toString() {
+		return ToStringBuilder.reflectionToString(this);
+	}
+
+}

+ 2 - 1
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/OrderTypeEnum.java

@@ -13,7 +13,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
 	SMALL_CLASS_TO_BUY("SMALL_CLASS_TO_BUY", "小课购买"),
 	PRACTICE_GROUP_BUY("PRACTICE_GROUP_BUY", "网管课购买"),
 	COURSE_GROUP_BUY("COURSE_GROUP_BUY","对外课程购买"),
-	LUCK("LUCK", "福袋活动");
+	LUCK("LUCK", "福袋活动"),
+	TENANT_RECHARGE("TENANT_RECHARGE","租户充值");
 
 	private String code;
 

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/page/TenantEntryActivitesQueryInfo.java

@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
+import com.ym.mec.biz.dal.entity.TenantEntryActivities.SuitableUser;
 import com.ym.mec.common.page.QueryInfo;
 
 public class TenantEntryActivitesQueryInfo extends QueryInfo {
@@ -13,6 +14,8 @@ public class TenantEntryActivitesQueryInfo extends QueryInfo {
 
 	private Boolean delFlag;
 
+	private SuitableUser suitableUser;
+
 	public Date getStartDate() {
 		return startDate;
 	}
@@ -29,4 +32,12 @@ public class TenantEntryActivitesQueryInfo extends QueryInfo {
 		this.delFlag = delFlag;
 	}
 
+	public SuitableUser getSuitableUser() {
+		return suitableUser;
+	}
+
+	public void setSuitableUser(SuitableUser suitableUser) {
+		this.suitableUser = suitableUser;
+	}
+
 }

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysTenantAccountService.java

@@ -1,8 +1,22 @@
 package com.ym.mec.biz.service;
 
+import java.math.BigDecimal;
+
 import com.ym.mec.biz.dal.entity.SysTenantAccount;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
 import com.ym.mec.common.service.BaseService;
 
 public interface SysTenantAccountService extends BaseService<Integer, SysTenantAccount> {
 
+	/**
+	 * 更新账户
+	 * @param userId 用户编号
+	 * @param minutes 修改的分钟数(正数相加,负数相减)
+	 * @param type 交易类型
+	 * @param transNo 交易流水
+	 * @param cashAmount 交易金额
+	 * @param memo 备注
+	 * @return
+	 */
+	public boolean update(Integer userId, int minutes, TransType type, String transNo, BigDecimal cashAmount, String memo);
 }

+ 0 - 7
mec-biz/src/main/java/com/ym/mec/biz/service/TenantEntryActivitiesService.java

@@ -12,11 +12,4 @@ public interface TenantEntryActivitiesService extends BaseService<Integer, Tenan
 	 */
 	public boolean merge(TenantEntryActivities tenantEntryActivites);
 
-	/**
-	 * 入驻
-	 * @param userId 用户编号
-	 * @param activitiesId 活动编号
-	 * @return
-	 */
-	public boolean enter(Integer userId, Integer activitiesId);
 }

+ 29 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/TenantPaymentOrderService.java

@@ -0,0 +1,29 @@
+package com.ym.mec.biz.service;
+
+import java.util.Map;
+
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.common.service.BaseService;
+
+public interface TenantPaymentOrderService extends BaseService<Long, TenantPaymentOrder> {
+
+	/**
+	 * 下单
+	 * @param userId
+	 * @param activitiesId
+	 * @return
+	 */
+	public Map<String, Object> createOrder(Integer userId, Integer activitiesId);
+
+	/**
+	 * 回调
+	 * @param tenantPaymentOrder
+	 * @return
+	 */
+	public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder);
+
+	/**
+	 * 从第三方查询订单状态
+	 */
+	public void queryOrderStatusFromRemote();
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SysTenantAccountServiceImpl.java

@@ -1,12 +1,24 @@
 package com.ym.mec.biz.service.impl;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 import com.ym.mec.biz.dal.dao.SysTenantAccountDao;
+import com.ym.mec.biz.dal.dao.SysTenantAccountDetailDao;
 import com.ym.mec.biz.dal.entity.SysTenantAccount;
+import com.ym.mec.biz.dal.entity.SysTenantAccount.AccountStatus;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransStatus;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
 import com.ym.mec.biz.service.SysTenantAccountService;
 import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.impl.BaseServiceImpl;
 
 @Service
@@ -15,9 +27,51 @@ public class SysTenantAccountServiceImpl extends BaseServiceImpl<Integer, SysTen
 	@Autowired
 	private SysTenantAccountDao sysTenantAccountDao;
 
+	@Autowired
+	private SysTenantAccountDetailDao sysTenantAccountDetailDao;
+
 	@Override
 	public BaseDAO<Integer, SysTenantAccount> getDAO() {
 		return sysTenantAccountDao;
 	}
 
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public boolean update(Integer userId, int minutes, TransType type, String transNo, BigDecimal cashAmount, String memo) {
+		SysTenantAccount tenantAccount = sysTenantAccountDao.getLocked(userId);
+		if (tenantAccount == null) {
+			throw new BizException("用户[{}]现金账户不存在", userId);
+		}
+
+		if (tenantAccount.getStatus() != AccountStatus.NORMAL) {
+			throw new BizException("账户不可用");
+		}
+		int balance = tenantAccount.getAvailableMinutes() + minutes;
+		if (balance < 0) {
+			throw new BizException("账户[{}]可用时间不足,可用时间剩{}分钟", userId, tenantAccount.getAvailableMinutes());
+		}
+
+		Date date = new Date();
+
+		tenantAccount.setAvailableMinutes(balance);
+		tenantAccount.setUpdateTime(date);
+		sysTenantAccountDao.update(tenantAccount);
+
+		SysTenantAccountDetail detail = new SysTenantAccountDetail();
+		detail.setTransMinutes(minutes);
+		detail.setTotalAvailableMinutes(tenantAccount.getAvailableMinutes());
+		detail.setMemo(memo);
+		detail.setCreateTime(date);
+		detail.setTransStatus(TransStatus.SUCCESS);
+		detail.setTransType(type);
+		detail.setUpdateTime(date);
+		detail.setUserId(userId);
+		detail.setTransNo(transNo);
+		detail.setTransCashAmount(cashAmount);
+
+		sysTenantAccountDetailDao.insert(detail);
+
+		return true;
+	}
+
 }

+ 0 - 21
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantEntryActivitiesServiceImpl.java

@@ -4,8 +4,6 @@ import java.util.Date;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Propagation;
-import org.springframework.transaction.annotation.Transactional;
 
 import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
 import com.ym.mec.biz.dal.entity.TenantEntryActivities;
@@ -50,23 +48,4 @@ public class TenantEntryActivitiesServiceImpl extends BaseServiceImpl<Integer, T
 		return true;
 	}
 
-	@Override
-	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-	public boolean enter(Integer userId, Integer activitiesId) {
-		TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
-		if (tenantEntryActivities == null) {
-			throw new BizException("活动不存在");
-		}
-
-		Date date = new Date();
-		// 判断活动是否有效
-		if (tenantEntryActivities.getDelFlag() == true || date.before(tenantEntryActivities.getStartDate()) || date.after(tenantEntryActivities.getEndDate())) {
-			throw new BizException("活动已结束或未开始");
-		}
-		
-		//是否满足条件
-
-		return true;
-	}
-
 }

+ 321 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/TenantPaymentOrderServiceImpl.java

@@ -0,0 +1,321 @@
+package com.ym.mec.biz.service.impl;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.alibaba.fastjson.JSON;
+import com.huifu.adapay.model.payment.Payment;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dao.TenantEntryActivitiesDao;
+import com.ym.mec.biz.dal.dao.TenantPaymentOrderDao;
+import com.ym.mec.biz.dal.entity.SysTenantAccountDetail.TransType;
+import com.ym.mec.biz.dal.entity.Teacher;
+import com.ym.mec.biz.dal.entity.TenantEntryActivities;
+import com.ym.mec.biz.dal.entity.TenantEntryActivities.SuitableUser;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder.TenantPaymentType;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.service.PayService;
+import com.ym.mec.biz.service.SysTenantAccountService;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.common.dal.BaseDAO;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.common.service.impl.BaseServiceImpl;
+import com.ym.mec.thirdparty.adapay.Pay;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.thirdparty.yqpay.RsqMsg;
+import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
+import com.ym.mec.thirdparty.yqpay.YqPayUtil;
+import com.ym.mec.util.date.DateUtil;
+
+@Service
+public class TenantPaymentOrderServiceImpl extends BaseServiceImpl<Long, TenantPaymentOrder> implements TenantPaymentOrderService {
+
+	@Autowired
+	private TenantPaymentOrderDao tenantPaymentOrderDao;
+
+	@Autowired
+	private TenantEntryActivitiesDao tenantEntryActivitiesDao;
+
+	@Autowired
+	private IdGeneratorService idGeneratorService;
+
+	@Autowired
+	private PayService payService;
+
+	@Autowired
+	private SysConfigDao sysConfigDao;
+
+	@Autowired
+	private TeacherDao teacherDao;
+
+	@Autowired
+	private SysTenantAccountService sysTenantAccountService;
+
+	@Autowired
+	private YqPayFeignService yqPayFeignService;
+
+	@Override
+	public BaseDAO<Long, TenantPaymentOrder> getDAO() {
+		return tenantPaymentOrderDao;
+	}
+
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public Map<String, Object> createOrder(Integer userId, Integer activitiesId) {
+
+		Teacher teacher = teacherDao.get(userId);
+		if (teacher == null) {
+			throw new BizException("用户信息不存在");
+		}
+
+		Integer organId = teacher.getOrganId();
+
+		TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
+		if (tenantEntryActivities == null) {
+			throw new BizException("活动不存在");
+		}
+
+		Date date = new Date();
+		// 判断活动是否有效
+		if (tenantEntryActivities.getDelFlag() == true) {
+			throw new BizException("活动已下架");
+		}
+		if (date.before(tenantEntryActivities.getStartDate())) {
+			throw new BizException("活动未开始");
+		}
+		if (date.after(tenantEntryActivities.getEndDate())) {
+			throw new BizException("活动已结束");
+		}
+
+		int purchaseTimes = 0; // 购买次数
+		// 查询用户订单
+		List<TenantPaymentOrder> orderList = tenantPaymentOrderDao.queryByUserId(userId);
+		if (orderList != null && orderList.size() > 0) {
+			for (TenantPaymentOrder po : orderList) {
+				if (po.getStatus() == DealStatusEnum.ING || po.getStatus() == DealStatusEnum.SUCCESS) {
+					++purchaseTimes;
+				}
+			}
+		}
+
+		// 是否满足条件
+		if (tenantEntryActivities.getSuitableUser() == SuitableUser.NEW) {
+			if (purchaseTimes > 0) {
+				throw new BizException("您已参与过当前活动,每人只能参与一次");
+			}
+		}
+
+		TenantPaymentOrder tenantPaymentOrder = new TenantPaymentOrder();
+		tenantPaymentOrder.setUserId(userId);
+		tenantPaymentOrder.setOrderNo(idGeneratorService.generatorId("tenant_payment") + "");
+		tenantPaymentOrder.setType(TenantPaymentType.RECHARGE);
+		tenantPaymentOrder.setExpectAmount(tenantEntryActivities.getDiscountPrice());
+		tenantPaymentOrder.setStatus(DealStatusEnum.ING);
+		tenantPaymentOrder.setCreateTime(date);
+		tenantPaymentOrder.setUpdateTime(date);
+		tenantPaymentOrder.setVersion(0);
+		tenantPaymentOrder.setOrganId(organId);
+		tenantPaymentOrder.setActivitiesId(activitiesId);
+		tenantPaymentOrderDao.insert(tenantPaymentOrder);
+
+		String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+
+		// 分类费用 course,instrument,accessories,other
+		Map<String, BigDecimal> classFee = new HashMap<>();
+		classFee.put("course", BigDecimal.ZERO);
+		classFee.put("instrument", BigDecimal.ZERO);
+		classFee.put("accessories", BigDecimal.ZERO);
+		classFee.put("other", tenantPaymentOrder.getExpectAmount());
+
+		try {
+
+			Map<String, Object> payMap = payService.getPayMap(tenantPaymentOrder.getExpectAmount(), tenantPaymentOrder.getOrderNo(), baseApiUrl
+					+ "/api-teacher/teacherOrder/notify", baseApiUrl + "/api-teacher/teacherOrder/paymentResult?orderNo=" + tenantPaymentOrder.getOrderNo(),
+					"商户入驻", "商户充值", userId, classFee, organId);
+
+			Map<String, BigDecimal> routingFee = (Map<String, BigDecimal>) payMap.get("routingFee");
+			tenantPaymentOrder.setComAmount(routingFee.get("COM"));
+			tenantPaymentOrder.setPerAmount(routingFee.get("PER"));
+			tenantPaymentOrder.setMerNos((String) payMap.get("routingMerNos"));
+			tenantPaymentOrder.setPaymentChannel((String) payMap.get("type"));
+			tenantPaymentOrder.setUpdateTime(date);
+			tenantPaymentOrderDao.update(tenantPaymentOrder);
+
+			return payMap;
+		} catch (Exception e) {
+			throw new BizException("调用支付接口出错", e);
+		}
+	}
+
+	@Override
+	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+	public boolean paymentForCallback(TenantPaymentOrder tenantPaymentOrder) {
+
+		Integer activitiesId = tenantPaymentOrder.getActivitiesId();
+
+		Date date = new Date();
+		tenantPaymentOrder.setUpdateTime(date);
+		tenantPaymentOrderDao.update(tenantPaymentOrder);
+
+		Integer userId = tenantPaymentOrder.getUserId();
+
+		if (tenantPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
+
+			TenantEntryActivities tenantEntryActivities = tenantEntryActivitiesDao.get(activitiesId);
+			if (tenantEntryActivities == null) {
+				throw new BizException("活动找不到");
+			}
+
+			// 更新账户表信息
+			sysTenantAccountService.update(userId, tenantEntryActivities.getPurchaseMinutes() + tenantEntryActivities.getGiveMinutes(), TransType.RECHARGE, "",
+					tenantEntryActivities.getDiscountPrice(), "");
+		} else {
+
+		}
+
+		return true;
+	}
+
+	@Override
+	public void queryOrderStatusFromRemote() {
+		try {
+			yqPayQuery();
+		} catch (Exception e) {
+			throw new BizException("查询订单状态出现异常");
+		}
+		try {
+			adaPayQuery();
+		} catch (Exception e) {
+			throw new BizException("查询订单状态出现异常");
+		}
+	}
+
+	private void yqPayQuery() throws Exception {
+		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
+
+		if (payingOrders.size() == 0) {
+			return;
+		}
+		List<String> orderNoList = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.toList());
+		String merOrderNos = payingOrders.stream().map(TenantPaymentOrder::getOrderNo).collect(Collectors.joining(","));
+
+		String notifyUrl = ""; // 回调地址
+		Map<String, Object> resultMap = new LinkedHashMap<>();
+		resultMap.put("merOrderNoList", merOrderNos);
+		Map<String, Object> requestMap = YqPayUtil.getRequestMap(notifyUrl, resultMap);
+
+		RsqMsg rsqMsg = new RsqMsg(requestMap);
+
+		Msg queryRs = yqPayFeignService.orderQuery(rsqMsg);
+
+		if (queryRs.getCode().equals("88")) {
+			// 更新订单状态
+			String[] statusArr = { "0", "1", "7" };
+			String responseParameters = queryRs.getResponseParameters();
+			List<Map<String, String>> responseList = JSON.parseObject(responseParameters, List.class);
+			for (Map<String, String> response : responseList) {
+				Map<String, String> rpMap = response;
+				String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+				rpMap.put("channelType", channelType);
+
+				if (orderNoList.contains(rpMap.get("merOrderNo"))) {
+					orderNoList.remove(rpMap.get("merOrderNo"));
+				}
+
+				if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
+					try {
+						DealStatusEnum status = rpMap.get("tradeState").equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+						TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(rpMap.get("merOrderNo"));
+						if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+							continue;
+						}
+
+						if (status.equals(DealStatusEnum.SUCCESS)) {
+							order.setPayTime(new Date());
+						} else {
+							order.setMemo(rpMap.get("remarks"));
+						}
+						order.setStatus(status);
+						order.setTransNo(rpMap.get("orderNo"));
+						order.setPaymentBusinessChannel(channelType);
+						order.setActualAmount(new BigDecimal(rpMap.get("payAmount")));
+						paymentForCallback(order);
+					} catch (Exception e) {
+						e.printStackTrace();
+						continue;
+					}
+				}
+			}
+
+			Date date = new Date();
+			for (TenantPaymentOrder po : payingOrders) {
+				if (orderNoList.contains(po.getOrderNo())) {
+					// 超过30分钟的关闭订单
+					if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
+						po.setStatus(DealStatusEnum.FAILED);
+						po.setMemo("超时未支付关闭");
+						paymentForCallback(po);
+					}
+				}
+			}
+		}
+	}
+
+	private void adaPayQuery() throws Exception {
+		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "ADAPAY");
+		if (payingOrders.size() == 0) {
+			return;
+		}
+
+		List<String> orderNoList = new ArrayList<String>();
+
+		for (TenantPaymentOrder payingOrder : payingOrders) {
+			if (payingOrder.getTransNo() == null) {
+				orderNoList.add(payingOrder.getOrderNo());
+				continue;
+			}
+			Payment payment = new Pay().queryPayment(payingOrder.getTransNo());
+			Map<String, String> rpMap = new HashMap<>();
+			rpMap.put("merOrderNo", payingOrder.getOrderNo());
+			rpMap.put("remarks", payment.getReason());
+			rpMap.put("orderNo", payment.getId());
+			rpMap.put("channelType", payment.getPayChannel());
+			if (payment.getStatus().equals("succeeded")) {
+				rpMap.put("tradeState", "1");
+			}
+			if (payment.getStatus().equals("failed")) {
+				rpMap.put("tradeState", "0");
+			}
+			if (payment.getStatus().equals("pending")) {
+				orderNoList.add(payingOrder.getOrderNo());
+			}
+		}
+
+		Date date = new Date();
+		for (TenantPaymentOrder po : payingOrders) {
+			if (orderNoList.contains(po.getOrderNo())) {
+				// 超过30分钟的关闭订单
+				if (DateUtil.addMinutes(po.getCreateTime(), 30).before(date)) {
+					po.setStatus(DealStatusEnum.FAILED);
+					po.setMemo("超时未支付关闭");
+					paymentForCallback(po);
+				}
+			}
+		}
+	}
+}

+ 4 - 0
mec-biz/src/main/resources/config/mybatis/SysTenantAccountMapper.xml

@@ -17,6 +17,10 @@
 	<select id="get" resultMap="SysTenantAccount">
 		SELECT * FROM sys_tenant_account WHERE user_id_ = #{uesrId}
 	</select>
+	
+	<select id="getLocked" resultMap="SysTenantAccount">
+		SELECT * FROM sys_tenant_account WHERE user_id_ = #{uesrId} for update
+	</select>
 
 	<!-- 全查询 -->
 	<select id="findAll" resultMap="SysTenantAccount">

+ 14 - 3
mec-biz/src/main/resources/config/mybatis/TenantEntryActivitiesMapper.xml

@@ -9,6 +9,8 @@
 		<result column="name_" property="name" />
 		<result column="cover_img_" property="coverImg" />
 		<result column="detail_" property="detail" />
+		<result column="suitable_user_" property="suitableUser" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="tag_" property="tag" />
 		<result column="total_price_" property="totalPrice" />
 		<result column="discount_price_" property="discountPrice" />
 		<result column="purchase_minutes_" property="purchaseMinutes" />
@@ -24,11 +26,14 @@
 	<sql id="queryCondition">
 		<where>
 			<if test="startDate != null">
-				and (start_date_ &gt;= #{startDate} and end_date_ &lt;= #{startDate})
+				and (start_date_ &lt;= #{startDate} and end_date_ &gt;= #{startDate})
 			</if>
 			<if test="delFlag != null">
 				and del_flag_ = #{delFlag}
 			</if>
+			<if test="suitableUser != null">
+				and suitable_user_ = #{suitableUser, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+			</if>
 		</where>
 	</sql>
 
@@ -49,8 +54,8 @@
 		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
 			AS ID FROM DUAL </selectKey> -->
 		INSERT INTO tenant_entry_activities
-		(id_,name_,cover_img_,detail_,total_price_,discount_price_,purchase_minutes_,give_minutes_,start_date_,end_date_,condition_,del_flag_,create_time_,update_time_)
-		VALUES(#{id},#{name},#{coverImg},#{detail},#{totalPrice},#{discountPrice},#{purchaseMinutes},#{giveMinutes},#{startDate},#{endDate},#{condition},#{delFlag},#{createTime},#{updateTime})
+		(id_,name_,cover_img_,detail_,suitable_user_,tag_,total_price_,discount_price_,purchase_minutes_,give_minutes_,start_date_,end_date_,condition_,del_flag_,create_time_,update_time_)
+		VALUES(#{id},#{name},#{coverImg},#{detail},#{suitableUser, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{tag},#{totalPrice},#{discountPrice},#{purchaseMinutes},#{giveMinutes},#{startDate},#{endDate},#{condition},#{delFlag},#{createTime},#{updateTime})
 	</insert>
 
 	<!-- 根据主键查询一条记录 -->
@@ -72,6 +77,12 @@
 			<if test="id != null">
 				id_ = #{id},
 			</if>
+			<if test="suitableUser != null">
+				suitable_user_ = #{suitableUser, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="tag != null">
+				tag_ = #{tag},
+			</if>
 			<if test="purchaseMinutes != null">
 				purchase_minutes_ = #{purchaseMinutes},
 			</if>

+ 158 - 0
mec-biz/src/main/resources/config/mybatis/TenantPaymentOrderMapper.xml

@@ -0,0 +1,158 @@
+<?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.ym.mec.biz.dal.dao.TenantPaymentOrderDao">
+
+	<resultMap type="com.ym.mec.biz.dal.entity.TenantPaymentOrder"
+		id="TenantPaymentOrder">
+		<result column="id_" property="id" />
+		<result column="activities_id_" property="activitiesId" />
+		<result column="user_id_" property="userId" />
+		<result column="organ_id_" property="organId" />
+		<result column="type_" property="type" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="expect_amount_" property="expectAmount" />
+		<result column="actual_amount_" property="actualAmount" />
+		<result column="balance_payment_amount_" property="balancePaymentAmount" />
+		<result column="com_amount_" property="comAmount" />
+		<result column="per_amount_" property="perAmount" />
+		<result column="remit_fee_" property="remitFee" />
+		<result column="trans_no_" property="transNo" />
+		<result column="status_" property="status" typeHandler="com.ym.mec.common.dal.CustomEnumTypeHandler" />
+		<result column="memo_" property="memo" />
+		<result column="payment_channel_" property="paymentChannel" />
+		<result column="payment_business_channel_" property="paymentBusinessChannel" />
+		<result column="mer_nos_" property="merNos" />
+		<result column="order_no_" property="orderNo" />
+		<result column="pay_time_" property="payTime" />
+		<result column="version_" property="version" />
+		<result column="create_time_" property="createTime" />
+		<result column="update_time_" property="updateTime" />
+	</resultMap>
+
+	<!-- 根据主键查询一条记录 -->
+	<select id="get" resultMap="TenantPaymentOrder">
+		SELECT * FROM tenant_payment_order WHERE id_ = #{id}
+	</select>
+
+	<!-- 全查询 -->
+	<select id="findAll" resultMap="TenantPaymentOrder">
+		SELECT * FROM tenant_payment_order ORDER BY id_
+	</select>
+
+	<!-- 向数据库增加一条记录 -->
+	<insert id="insert" parameterType="com.ym.mec.biz.dal.entity.TenantPaymentOrder"
+		useGeneratedKeys="true" keyColumn="id" keyProperty="id">
+		<!-- <selectKey resultClass="int" keyProperty="id" > SELECT SEQ_WSDEFINITION_ID.nextval 
+			AS ID FROM DUAL </selectKey> -->
+		INSERT INTO tenant_payment_order
+		(id_,activities_id_,user_id_,organ_id_,type_,expect_amount_,actual_amount_,balance_payment_amount_,com_amount_,per_amount_,remit_fee_,trans_no_,status_,memo_,payment_channel_,payment_business_channel_,mer_nos_,order_no_,pay_time_,version_,create_time_,update_time_)
+		VALUES(#{id},#{activitiesId},#{userId},#{organId},#{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{expectAmount},#{actualAmount},#{balancePaymentAmount},#{comAmount},#{perAmount},#{remitFee},#{transNo},#{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},#{memo},#{paymentChannel},#{paymentBusinessChannel},#{merNos},#{orderNo},#{payTime},#{version},#{createTime},#{updateTime})
+	</insert>
+
+	<!-- 根据主键查询一条记录 -->
+	<update id="update" parameterType="com.ym.mec.biz.dal.entity.TenantPaymentOrder">
+		UPDATE tenant_payment_order
+		<set>
+			<if test="status != null">
+				status_ = #{status, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="organId != null">
+				organ_id_ = #{organId},
+			</if>
+			<if test="activitiesId != null">
+				activities_id_ = #{activitiesId},
+			</if>
+			<if test="comAmount != null">
+				com_amount_ = #{comAmount},
+			</if>
+			<if test="orderNo != null">
+				order_no_ = #{orderNo},
+			</if>
+			<if test="id != null">
+				id_ = #{id},
+			</if>
+			<if test="perAmount != null">
+				per_amount_ = #{perAmount},
+			</if>
+			<if test="expectAmount != null">
+				expect_amount_ = #{expectAmount},
+			</if>
+			<if test="balancePaymentAmount != null">
+				balance_payment_amount_ = #{balancePaymentAmount},
+			</if>
+			<if test="version != null">
+				version_ = #{version},
+			</if>
+			<if test="memo != null">
+				memo_ = #{memo},
+			</if>
+			<if test="paymentChannel != null">
+				payment_channel_ = #{paymentChannel},
+			</if>
+			<if test="remitFee != null">
+				remit_fee_ = #{remitFee},
+			</if>
+			<if test="createTime != null">
+				create_time_ = #{createTime},
+			</if>
+			<if test="userId != null">
+				user_id_ = #{userId},
+			</if>
+			<if test="paymentBusinessChannel != null">
+				payment_business_channel_ = #{paymentBusinessChannel},
+			</if>
+			<if test="updateTime != null">
+				update_time_ = #{updateTime},
+			</if>
+			<if test="transNo != null">
+				trans_no_ = #{transNo},
+			</if>
+			<if test="actualAmount != null">
+				actual_amount_ = #{actualAmount},
+			</if>
+			<if test="type != null">
+				type_ = #{type, typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler},
+			</if>
+			<if test="merNos != null">
+				mer_nos_ = #{merNos},
+			</if>
+			<if test="payTime != null">
+				pay_time_ = #{payTime},
+			</if>
+		</set>
+		WHERE id_ = #{id}
+	</update>
+
+	<!-- 根据主键删除一条记录 -->
+	<delete id="delete">
+		DELETE FROM tenant_payment_order WHERE id_ = #{id}
+	</delete>
+
+	<!-- 分页查询 -->
+	<select id="queryPage" resultMap="TenantPaymentOrder"
+		parameterType="map">
+		SELECT * FROM tenant_payment_order ORDER BY id_
+		<include refid="global.limit" />
+	</select>
+
+	<!-- 查询当前表的总记录数 -->
+	<select id="queryCount" resultType="int">
+		SELECT COUNT(*) FROM tenant_payment_order
+	</select>
+	
+	<select id="queryByUserId" resultMap="TenantPaymentOrder">
+		SELECT * FROM tenant_payment_order where user_id_ = #{userId} ORDER BY id_
+	</select>
+
+    <!-- 根据订单号查询订单 -->
+    <select id="findOrderByOrderNo" resultMap="TenantPaymentOrder">
+        SELECT * FROM tenant_payment_order WHERE order_no_ = #{orderNo}
+    </select>
+
+    <select id="findOrdersByStatus" resultMap="TenantPaymentOrder">
+        SELECT * FROM tenant_payment_order
+        WHERE status_ = #{status,typeHandler=com.ym.mec.common.dal.CustomEnumTypeHandler}
+          AND payment_channel_ = #{paymentChannel}
+        LIMIT 100
+    </select>
+</mapper>

+ 9 - 2
mec-teacher/src/main/java/com/ym/mec/teacher/config/ResourceServerConfig.java

@@ -24,8 +24,15 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
-		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/v2/api-docs","/code/*","/teacher/queryStudentApply","/teacher/querySubByMusicGroupId","/studentRegistration/updateSubject","/studyReport/createEvaluate").permitAll().anyRequest().authenticated().and().httpBasic();
+		http.csrf()
+				.disable()
+				.exceptionHandling()
+				.accessDeniedHandler(baseAccessDeniedHandler)
+				.authenticationEntryPoint(baseAuthenticationEntryPoint)
+				.and()
+				.authorizeRequests()
+				.antMatchers("/v2/api-docs", "/code/*", "/teacher/queryStudentApply", "/teacher/querySubByMusicGroupId", "/studentRegistration/updateSubject",
+						"/studyReport/createEvaluate", "/teacherOrder/*").permitAll().anyRequest().authenticated().and().httpBasic();
 	}
 
 	@Override

+ 172 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TeacherOrderController.java

@@ -0,0 +1,172 @@
+package com.ym.mec.teacher.controller;
+
+import io.swagger.annotations.Api;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSON;
+import com.ym.mec.biz.dal.dao.SysConfigDao;
+import com.ym.mec.biz.dal.dao.TenantPaymentOrderDao;
+import com.ym.mec.biz.dal.entity.TenantPaymentOrder;
+import com.ym.mec.biz.dal.enums.DealStatusEnum;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.thirdparty.adapay.NotifyEvent;
+import com.ym.mec.thirdparty.yqpay.Msg;
+import com.ym.mec.thirdparty.yqpay.YqPayFeignService;
+
+@RequestMapping("teacherOrder")
+@Api(tags = "订单回调")
+@RestController
+@EnableScheduling
+public class TeacherOrderController extends BaseController {
+	private static final Logger logger = LoggerFactory.getLogger(TeacherOrderController.class);
+	@Autowired
+	private YqPayFeignService yqPayFeignService;
+	@Autowired
+	private TenantPaymentOrderDao tenantPaymentOrderDao;
+	@Autowired
+	private SysConfigDao sysConfigDao;
+	@Autowired
+	private TenantPaymentOrderService tenantPaymentOrderService;
+
+	@PostMapping("/notify")
+	public Msg notify(@ModelAttribute Msg msg) throws Exception {
+		logger.info(msg.toString());
+		Map<String, Object> rqMap = new LinkedHashMap<String, Object>();
+		rqMap.put("code", msg.getCode());
+		rqMap.put("msg", msg.getMsg());
+		rqMap.put("responseType", msg.getResponseType());
+		rqMap.put("responseParameters", msg.getResponseParameters());
+		rqMap.put("sign", msg.getSign());
+		// boolean rs = YqPayUtil.verify(rqMap);
+		msg.setMsg("fail");
+		Map<String, String> notifyMap = new HashMap<>();
+		// if (rs) {
+		notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
+		// }
+		// 支付中订单存在,更新状态
+		if (msg.getResponseType().equals("1") && notifyMap.size() > 0) {
+			String tradeState = msg.getCode().equals("88") ? "1" : "0";
+			String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+			notifyMap.put("tradeState", tradeState);
+			notifyMap.put("totalMoney", notifyMap.get("payAmount"));
+			notifyMap.put("merOrderNo", notifyMap.get("merMerOrderNo"));
+			notifyMap.put("channelType", channelType);
+
+			DealStatusEnum status = tradeState.equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+			TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(notifyMap.get("merMerOrderNo"));
+			if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+				return msg;
+			}
+
+			if (status.equals(DealStatusEnum.SUCCESS)) {
+				order.setPayTime(new Date());
+			} else {
+				order.setMemo(notifyMap.get("remarks"));
+			}
+			order.setStatus(status);
+			order.setTransNo(notifyMap.get("orderNo"));
+			order.setPaymentBusinessChannel(channelType);
+			order.setActualAmount(new BigDecimal(notifyMap.get("payAmount")));
+			tenantPaymentOrderService.paymentForCallback(order);
+			msg.setCode("000000");
+			msg.setMsg("success");
+		}
+		return msg;
+	}
+
+	@PostMapping("/adaNotify")
+	public void adaNotify(@ModelAttribute NotifyEvent notifyEvent) throws Exception {
+		logger.info(notifyEvent.toString());
+		if (notifyEvent.getType().equals("payment.success") && notifyEvent.getType().equals("payment.failed")) {
+			return;
+		}
+
+		Map<String, String> notifyMap = JSON.parseObject(notifyEvent.getData(), Map.class);
+
+		// 支付中订单存在,更新状态
+		if (notifyMap.size() > 0) {
+			String tradeState = notifyEvent.getType().equals("payment.success") ? "1" : "0";
+			notifyMap.put("tradeState", tradeState);
+			notifyMap.put("totalMoney", notifyMap.get("pay_amt"));
+			notifyMap.put("merOrderNo", notifyMap.get("order_no"));
+			notifyMap.put("merOrderNo", notifyMap.get("order_no"));
+			notifyMap.put("remarks", notifyMap.get("description"));
+
+			DealStatusEnum status = tradeState.equals("1") ? DealStatusEnum.SUCCESS : DealStatusEnum.FAILED;
+			TenantPaymentOrder order = tenantPaymentOrderDao.findOrderByOrderNo(notifyMap.get("merMerOrderNo"));
+			if (order == null || !order.getStatus().equals(DealStatusEnum.ING)) {
+				return;
+			}
+
+			if (status.equals(DealStatusEnum.SUCCESS)) {
+				order.setPayTime(new Date());
+			} else {
+				order.setMemo(notifyMap.get("remarks"));
+			}
+			order.setStatus(status);
+			order.setTransNo(notifyMap.get("orderNo"));
+			order.setPaymentBusinessChannel(notifyMap.get("channelType"));
+			order.setActualAmount(new BigDecimal(notifyMap.get("payAmount")));
+			tenantPaymentOrderService.paymentForCallback(order);
+		}
+	}
+
+	@GetMapping("/setSuccessStatus")
+	public void setSuccessStatus() throws Exception {
+		List<TenantPaymentOrder> payingOrders = tenantPaymentOrderDao.findOrdersByStatus(DealStatusEnum.ING, "YQPAY");
+
+		String[] statusArr = { "0", "1", "7" };
+		for (TenantPaymentOrder payingOrder : payingOrders) {
+			Map<String, String> rpMap = new HashMap<>();
+			rpMap.put("tradeState", "1");
+			rpMap.put("remarks", "模拟支付成功");
+			rpMap.put("merOrderNo", payingOrder.getOrderNo());
+			rpMap.put("orderNo", payingOrder.getOrderNo());
+			rpMap.put("channelType", "1");
+
+			String channelType = rpMap.get("channelType").equals("1") ? "WXPay" : (rpMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
+			rpMap.put("channelType", channelType);
+			if (Arrays.asList(statusArr).contains(rpMap.get("tradeState"))) {
+				try {
+					tenantPaymentOrderService.paymentForCallback(payingOrder); // 更新订单
+				} catch (Exception e) {
+					e.printStackTrace();
+					continue;
+				}
+			}
+		}
+
+	}
+
+	@RequestMapping("paymentResult")
+	public void paymentResult(HttpServletResponse response, String orderNo) {
+		try {
+			String baseApiUrl = sysConfigDao.findConfigValue("base_api_url");
+			response.sendRedirect(baseApiUrl + "/#/paymentresult?orderNo=" + orderNo);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+}

+ 40 - 0
mec-teacher/src/main/java/com/ym/mec/teacher/controller/TenantPaymentOrderController.java

@@ -0,0 +1,40 @@
+package com.ym.mec.teacher.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+import java.util.Objects;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.service.TenantPaymentOrderService;
+import com.ym.mec.common.controller.BaseController;
+
+@Api(tags = "租户订单服务")
+@RequestMapping("tenantPaymentOrder")
+@RestController
+public class TenantPaymentOrderController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    
+    @Autowired
+    private TenantPaymentOrderService tenantPaymentOrderService;
+
+    @ApiOperation(value = "下单")
+    @PostMapping("/createOrder")
+    public Object createOrder(Integer activitiesId){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if(Objects.isNull(sysUser)){
+            return failed(HttpStatus.FORBIDDEN,"请登录");
+        }
+        return succeed(tenantPaymentOrderService.createOrder(sysUser.getId(), activitiesId));
+    }
+
+}

+ 26 - 18
mec-web/src/main/java/com/ym/mec/web/controller/TaskController.java

@@ -31,7 +31,7 @@ public class TaskController extends BaseController {
 
 	@Autowired
 	private StudentCourseHomeworkService studentCourseHomeworkService;
-	
+
 	@Autowired
 	private CourseHomeworkService courseHomeworkService;
 
@@ -39,6 +39,9 @@ public class TaskController extends BaseController {
 	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@Autowired
+	private TenantPaymentOrderService tenantPaymentOrderService;
+
+	@Autowired
 	private TeacherCourseStatisticsService teacherCourseStatisticsService;
 
 	@Autowired
@@ -107,7 +110,7 @@ public class TaskController extends BaseController {
 	@GetMapping("/studentCoursesScheduleRemind")
 	// 学生有课提醒
 	public void studentCoursesScheduleRemind() {
-		//courseScheduleService.studentCoursesScheduleRemind();
+		// courseScheduleService.studentCoursesScheduleRemind();
 	}
 
 	@GetMapping("/studentSignInRemind")
@@ -131,7 +134,7 @@ public class TaskController extends BaseController {
 	@GetMapping("/teacherSignInRemind")
 	// 老师上课提醒
 	public void teacherSignInRemind() {
-		//courseScheduleService.teacherSignInRemind();
+		// courseScheduleService.teacherSignInRemind();
 	}
 
 	@GetMapping("/homeworkNoReplyRemind")
@@ -140,45 +143,50 @@ public class TaskController extends BaseController {
 		courseHomeworkService.homeworkNoReplyRemind();
 	}
 
-	//查询订单状态
+	// 查询订单状态
 	@GetMapping("/queryOrderStatus")
-	public void  queryOrderStatus() throws Exception {
-		studentPaymentOrderService.queryOrderStatus();
+	public void queryOrderStatus() throws Exception {
+		try {
+			studentPaymentOrderService.queryOrderStatus();
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+		tenantPaymentOrderService.queryOrderStatusFromRemote();
 	}
 
-	//统计老师课酬
+	// 统计老师课酬
 	@GetMapping("/teacherCourseStatistic")
-	public void  teacherCourseStatisticsService() throws Exception {
+	public void teacherCourseStatisticsService() throws Exception {
 		teacherCourseStatisticsService.teacherCourseStatistic();
 	}
 
-	//更新历史陪练课至已结束
+	// 更新历史陪练课至已结束
 	@GetMapping("/updateHistoryPracticeGroupStatus")
-	public void updateHistoryPracticeGroupStatus(){
+	public void updateHistoryPracticeGroupStatus() {
 		practiceGroupService.updateHistoryPracticeGroupStatus();
 	}
 
-	//练习报告定时推送
+	// 练习报告定时推送
 	@GetMapping("/pushStudyReport")
-	public void pushStudyReport(){
+	public void pushStudyReport() {
 		practiceGroupService.pushStudyReport(null, "JIGUANG");
 	}
 
-	//新增待填写月报定时推送(推送老师)
+	// 新增待填写月报定时推送(推送老师)
 	@GetMapping("/pushNeedPostReport")
-	public void pushNeedPostReport(){
+	public void pushNeedPostReport() {
 		courseScheduleEvaluateService.pushNeedPostReport();
 	}
 
-	//定时预生成待提交月报
+	// 定时预生成待提交月报
 	@GetMapping("/createEvaluate")
-	public void createEvaluate(){
+	public void createEvaluate() {
 		courseScheduleEvaluateService.createEvaluate(new Date());
 	}
 
-	//新增待填写评论定时推送(推送老师)
+	// 新增待填写评论定时推送(推送老师)
 	@GetMapping("/pushNeedReview2Teacher")
-	public void pushNeedReview2Teacher(){
+	public void pushNeedReview2Teacher() {
 		courseReviewService.pushNeedReview2Teacher();
 	}