|  | @@ -2,7 +2,6 @@ package com.ym.mec.biz.service.impl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.math.BigDecimal;
 | 
	
		
			
				|  |  |  import java.util.Date;
 | 
	
		
			
				|  |  | -import java.util.HashMap;
 | 
	
		
			
				|  |  |  import java.util.List;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
	
		
			
				|  | @@ -11,6 +10,7 @@ import org.slf4j.Logger;
 | 
	
		
			
				|  |  |  import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  |  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.MemberRankPrivilegesDao;
 | 
	
	
		
			
				|  | @@ -24,7 +24,6 @@ import com.ym.mec.biz.dal.entity.SysUserCashAccount;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.enums.DealStatusEnum;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.enums.GroupType;
 | 
	
		
			
				|  |  | -import com.ym.mec.biz.dal.enums.MessageTypeEnum;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.enums.OrderTypeEnum;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.enums.PeriodEnum;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum;
 | 
	
	
		
			
				|  | @@ -38,7 +37,7 @@ import com.ym.mec.biz.service.SysUserCashAccountService;
 | 
	
		
			
				|  |  |  import com.ym.mec.common.dal.BaseDAO;
 | 
	
		
			
				|  |  |  import com.ym.mec.common.exception.BizException;
 | 
	
		
			
				|  |  |  import com.ym.mec.common.service.impl.BaseServiceImpl;
 | 
	
		
			
				|  |  | -import com.ym.mec.thirdparty.message.MessageSenderPluginContext;
 | 
	
		
			
				|  |  | +import com.ym.mec.util.date.DateUtil;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  @Service
 | 
	
		
			
				|  |  |  public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, MemberRankSetting> implements MemberRankSettingService {
 | 
	
	
		
			
				|  | @@ -59,14 +58,14 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Autowired
 | 
	
		
			
				|  |  |  	private SysUserCashAccountService sysUserCashAccountService;
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    @Autowired
 | 
	
		
			
				|  |  | -    private ContractService contractService;
 | 
	
		
			
				|  |  | +	@Autowired
 | 
	
		
			
				|  |  | +	private SysUserCashAccountDetailService sysUserCashAccountDetailService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Autowired
 | 
	
		
			
				|  |  | +	private ContractService contractService;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 | 
	
		
			
				|  |  | +	private final Logger logger = LoggerFactory.getLogger(this.getClass());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Override
 | 
	
		
			
				|  |  |  	public BaseDAO<Integer, MemberRankSetting> getDAO() {
 | 
	
	
		
			
				|  | @@ -112,6 +111,7 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Override
 | 
	
		
			
				|  |  | +	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |  	public Map buy(Integer userId, Integer memberRankId, PeriodEnum periodEnum, BigDecimal amount, boolean isUseBalance) throws Exception {
 | 
	
		
			
				|  |  |  		Student student = studentService.get(userId);
 | 
	
		
			
				|  |  |  		if (student == null) {
 | 
	
	
		
			
				|  | @@ -123,6 +123,11 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  			throw new BizException("学生没有分部编号");
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +		MemberRankSetting memberRankSetting = memberRankSettingDao.get(memberRankId);
 | 
	
		
			
				|  |  | +		if (memberRankSetting == null) {
 | 
	
		
			
				|  |  | +			throw new BizException("会员等级错误");
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  		MemberFeeSetting memberFeeSetting = memberFeeSettingService.findByRankIdAndOrganId(organId, memberRankId);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if (memberFeeSetting == null) {
 | 
	
	
		
			
				|  | @@ -171,8 +176,9 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  		studentPaymentOrder.setGroupType(GroupType.MEMBER);
 | 
	
		
			
				|  |  |  		studentPaymentOrder.setRemitFee(BigDecimal.ZERO);
 | 
	
		
			
				|  |  |  		studentPaymentOrder.setCourseRemitFee(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setMemo("会员购买");
 | 
	
		
			
				|  |  | +		studentPaymentOrder.setMemo(memberRankSetting.getName());
 | 
	
		
			
				|  |  |  		studentPaymentOrder.setPaymentChannel("BALANCE");
 | 
	
		
			
				|  |  | +		studentPaymentOrder.setMusicGroupId(memberRankId + "");
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if (isUseBalance) {
 | 
	
		
			
				|  |  |  			SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
 | 
	
	
		
			
				|  | @@ -185,9 +191,11 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  				studentPaymentOrder.setBalancePaymentAmount(amount);
 | 
	
		
			
				|  |  |  				studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
 | 
	
		
			
				|  |  |  				sysUserCashAccountService.updateBalance(userId, amount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "购买会员");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				orderCallback(studentPaymentOrder);
 | 
	
		
			
				|  |  |  			} else {
 | 
	
		
			
				|  |  |  				if (userCashAccount.getBalance().doubleValue() > 0) {
 | 
	
		
			
				|  |  | -					sysUserCashAccountService.updateBalance(userId, userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "乐团续费");
 | 
	
		
			
				|  |  | +					sysUserCashAccountService.updateBalance(userId, userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, "购买会员");
 | 
	
		
			
				|  |  |  					studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
 | 
	
		
			
				|  |  |  					studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount().subtract(userCashAccount.getBalance()));
 | 
	
		
			
				|  |  |  				}
 | 
	
	
		
			
				|  | @@ -198,72 +206,92 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Override
 | 
	
		
			
				|  |  | +	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
 | 
	
		
			
				|  |  |  	public boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
 | 
	
		
			
				|  |  |  		Date nowDate = new Date();
 | 
	
		
			
				|  |  | -        //更新订单信息
 | 
	
		
			
				|  |  | -        studentPaymentOrder.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | -        int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
 | 
	
		
			
				|  |  | -        if (updateCount <= 0) {
 | 
	
		
			
				|  |  | -            throw new BizException("订单更新失败");
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Integer userId = studentPaymentOrder.getUserId();
 | 
	
		
			
				|  |  | -        
 | 
	
		
			
				|  |  | -        if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | -                sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(), PlatformCashAccountDetailTypeEnum.REFUNDS, "购买会员支付失败");
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -            
 | 
	
		
			
				|  |  | -            return true;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        //支付成功
 | 
	
		
			
				|  |  | -        if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
 | 
	
		
			
				|  |  | -        	
 | 
	
		
			
				|  |  | -        	//添加会员有效时长
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            //插入交易明细
 | 
	
		
			
				|  |  | -            BigDecimal amount = studentPaymentOrder.getActualAmount();
 | 
	
		
			
				|  |  | -            if (amount.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | -                SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
 | 
	
		
			
				|  |  | -                //充值
 | 
	
		
			
				|  |  | -                SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
 | 
	
		
			
				|  |  | -                rechargeDetail.setAmount(amount);
 | 
	
		
			
				|  |  | -                rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
 | 
	
		
			
				|  |  | -                rechargeDetail.setComment("缴费前充值");
 | 
	
		
			
				|  |  | -                rechargeDetail.setCreateTime(nowDate);
 | 
	
		
			
				|  |  | -                rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
 | 
	
		
			
				|  |  | -                rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
 | 
	
		
			
				|  |  | -                rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
 | 
	
		
			
				|  |  | -                rechargeDetail.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | -                rechargeDetail.setUserId(userId);
 | 
	
		
			
				|  |  | -                rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
 | 
	
		
			
				|  |  | -                rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
 | 
	
		
			
				|  |  | -                rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
 | 
	
		
			
				|  |  | -                sysUserCashAccountDetailService.insert(rechargeDetail);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                //缴费
 | 
	
		
			
				|  |  | -                SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
 | 
	
		
			
				|  |  | -                paymentDetail.setAmount(amount.negate());
 | 
	
		
			
				|  |  | -                paymentDetail.setBalance(cashAccount.getBalance());
 | 
	
		
			
				|  |  | -                paymentDetail.setComment("购买会员");
 | 
	
		
			
				|  |  | -                paymentDetail.setCreateTime(nowDate);
 | 
	
		
			
				|  |  | -                paymentDetail.setStatus(DealStatusEnum.SUCCESS);
 | 
	
		
			
				|  |  | -                paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
 | 
	
		
			
				|  |  | -                paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
 | 
	
		
			
				|  |  | -                paymentDetail.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | -                paymentDetail.setUserId(userId);
 | 
	
		
			
				|  |  | -                rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
 | 
	
		
			
				|  |  | -                sysUserCashAccountDetailService.insert(paymentDetail);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -            try {
 | 
	
		
			
				|  |  | -                contractService.transferProduceContract(userId, null);
 | 
	
		
			
				|  |  | -            } catch (Exception e) {
 | 
	
		
			
				|  |  | -                logger.error("产品协议生成失败", e);
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        return true;
 | 
	
		
			
				|  |  | +		// 更新订单信息
 | 
	
		
			
				|  |  | +		studentPaymentOrder.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | +		int updateCount = studentPaymentOrderService.update(studentPaymentOrder);
 | 
	
		
			
				|  |  | +		if (updateCount <= 0) {
 | 
	
		
			
				|  |  | +			throw new BizException("订单更新失败");
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		Integer userId = studentPaymentOrder.getUserId();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			if (studentPaymentOrder.getBalancePaymentAmount() != null && studentPaymentOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +				sysUserCashAccountService.updateBalance(studentPaymentOrder.getUserId(), studentPaymentOrder.getBalancePaymentAmount(),
 | 
	
		
			
				|  |  | +						PlatformCashAccountDetailTypeEnum.REFUNDS, "购买会员支付失败");
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			return true;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		// 支付成功
 | 
	
		
			
				|  |  | +		if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// 添加会员有效时长
 | 
	
		
			
				|  |  | +			Student student = studentService.get(userId);
 | 
	
		
			
				|  |  | +			if (student == null) {
 | 
	
		
			
				|  |  | +				throw new BizException("学员信息不存在");
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			student.setMemberRankSettingId(Integer.parseInt(studentPaymentOrder.getMusicGroupId()));
 | 
	
		
			
				|  |  | +			if (student.getMemberRankSettingId() == null) {
 | 
	
		
			
				|  |  | +				student.setMembershipEndTime(DateUtil.addMonths(nowDate, 6));
 | 
	
		
			
				|  |  | +				student.setMembershipStartTime(nowDate);
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				if (nowDate.after(student.getMembershipEndTime())) {
 | 
	
		
			
				|  |  | +					student.setMembershipEndTime(DateUtil.addMonths(nowDate, 6));
 | 
	
		
			
				|  |  | +				} else {
 | 
	
		
			
				|  |  | +					student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), 6));
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			student.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | +			studentService.update(student);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			// 插入交易明细
 | 
	
		
			
				|  |  | +			BigDecimal amount = studentPaymentOrder.getActualAmount();
 | 
	
		
			
				|  |  | +			if (amount.compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +				SysUserCashAccount cashAccount = sysUserCashAccountService.get(userId);
 | 
	
		
			
				|  |  | +				// 充值
 | 
	
		
			
				|  |  | +				SysUserCashAccountDetail rechargeDetail = new SysUserCashAccountDetail();
 | 
	
		
			
				|  |  | +				rechargeDetail.setAmount(amount);
 | 
	
		
			
				|  |  | +				rechargeDetail.setBalance(cashAccount.getBalance().add(amount));
 | 
	
		
			
				|  |  | +				rechargeDetail.setComment("缴费前充值");
 | 
	
		
			
				|  |  | +				rechargeDetail.setCreateTime(nowDate);
 | 
	
		
			
				|  |  | +				rechargeDetail.setStatus(DealStatusEnum.SUCCESS);
 | 
	
		
			
				|  |  | +				rechargeDetail.setTransNo(studentPaymentOrder.getTransNo());
 | 
	
		
			
				|  |  | +				rechargeDetail.setType(PlatformCashAccountDetailTypeEnum.RECHARGE);
 | 
	
		
			
				|  |  | +				rechargeDetail.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | +				rechargeDetail.setUserId(userId);
 | 
	
		
			
				|  |  | +				rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
 | 
	
		
			
				|  |  | +				rechargeDetail.setComAmount(studentPaymentOrder.getComAmount());
 | 
	
		
			
				|  |  | +				rechargeDetail.setPerAmount(studentPaymentOrder.getPerAmount());
 | 
	
		
			
				|  |  | +				sysUserCashAccountDetailService.insert(rechargeDetail);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +				// 缴费
 | 
	
		
			
				|  |  | +				SysUserCashAccountDetail paymentDetail = new SysUserCashAccountDetail();
 | 
	
		
			
				|  |  | +				paymentDetail.setAmount(amount.negate());
 | 
	
		
			
				|  |  | +				paymentDetail.setBalance(cashAccount.getBalance());
 | 
	
		
			
				|  |  | +				paymentDetail.setComment("购买会员");
 | 
	
		
			
				|  |  | +				paymentDetail.setCreateTime(nowDate);
 | 
	
		
			
				|  |  | +				paymentDetail.setStatus(DealStatusEnum.SUCCESS);
 | 
	
		
			
				|  |  | +				paymentDetail.setTransNo(studentPaymentOrder.getTransNo());
 | 
	
		
			
				|  |  | +				paymentDetail.setType(PlatformCashAccountDetailTypeEnum.PAY_FEE);
 | 
	
		
			
				|  |  | +				paymentDetail.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | +				paymentDetail.setUserId(userId);
 | 
	
		
			
				|  |  | +				rechargeDetail.setChannel(studentPaymentOrder.getPaymentChannel());
 | 
	
		
			
				|  |  | +				sysUserCashAccountDetailService.insert(paymentDetail);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +			try {
 | 
	
		
			
				|  |  | +				contractService.transferProduceContract(userId, null);
 | 
	
		
			
				|  |  | +			} catch (Exception e) {
 | 
	
		
			
				|  |  | +				logger.error("产品协议生成失败", e);
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return true;
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  }
 |