|  | @@ -4,6 +4,7 @@ import com.ym.mec.auth.api.client.SysUserFeignService;
 | 
	
		
			
				|  |  |  import com.ym.mec.auth.api.entity.SysUser;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.MemberRankPrivilegesDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dao.MemberRankSettingDao;
 | 
	
		
			
				|  |  | +import com.ym.mec.biz.dal.dao.SysConfigDao;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.dto.MemberPayParamDto;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.entity.*;
 | 
	
		
			
				|  |  |  import com.ym.mec.biz.dal.enums.*;
 | 
	
	
		
			
				|  | @@ -14,8 +15,13 @@ import com.ym.mec.common.entity.HttpResponseResult;
 | 
	
		
			
				|  |  |  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.message.MessageSenderPluginContext;
 | 
	
		
			
				|  |  | +import com.ym.mec.util.date.DateUtil;
 | 
	
		
			
				|  |  |  import org.apache.commons.collections.CollectionUtils;
 | 
	
		
			
				|  |  |  import org.apache.commons.lang3.StringUtils;
 | 
	
		
			
				|  |  | +import org.joda.time.LocalDate;
 | 
	
		
			
				|  |  | +import org.redisson.api.RBucket;
 | 
	
		
			
				|  |  | +import org.redisson.api.RedissonClient;
 | 
	
		
			
				|  |  |  import org.slf4j.Logger;
 | 
	
		
			
				|  |  |  import org.slf4j.LoggerFactory;
 | 
	
		
			
				|  |  |  import org.springframework.beans.factory.annotation.Autowired;
 | 
	
	
		
			
				|  | @@ -26,281 +32,412 @@ import org.springframework.transaction.annotation.Propagation;
 | 
	
		
			
				|  |  |  import org.springframework.transaction.annotation.Transactional;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import java.math.BigDecimal;
 | 
	
		
			
				|  |  | -import java.util.Date;
 | 
	
		
			
				|  |  | -import java.util.List;
 | 
	
		
			
				|  |  | -import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.*;
 | 
	
		
			
				|  |  | +import java.util.concurrent.TimeUnit;
 | 
	
		
			
				|  |  | +import java.util.function.BiPredicate;
 | 
	
		
			
				|  |  |  import java.util.stream.Collectors;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import static com.ym.mec.biz.dal.enums.CouponDetailTypeEnum.MEMBER;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  @Service
 | 
	
		
			
				|  |  |  public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, MemberRankSetting> implements MemberRankSettingService {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private MemberRankSettingDao memberRankSettingDao;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private MemberRankPrivilegesDao memberRankPrivilegesDao;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private StudentService studentService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private StudentPaymentOrderService studentPaymentOrderService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private SysUserCashAccountService sysUserCashAccountService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private SysUserCashAccountDetailService sysUserCashAccountDetailService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private ContractService contractService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private SysUserFeignService sysUserFeignService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private CloudTeacherOrderService cloudTeacherOrderService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private IdGeneratorService idGeneratorService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private SysCouponCodeService sysCouponCodeService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private StudentCloudCoachPaymentDetailsService studentCloudCoachPaymentDetailsService;
 | 
	
		
			
				|  |  | -	@Autowired
 | 
	
		
			
				|  |  | -	private CloudCoachPaymentProgramService cloudCoachPaymentProgramService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private MemberRankSettingDao memberRankSettingDao;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private MemberRankPrivilegesDao memberRankPrivilegesDao;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private StudentService studentService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private StudentPaymentOrderService studentPaymentOrderService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysUserCashAccountService sysUserCashAccountService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysUserCashAccountDetailService sysUserCashAccountDetailService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private ContractService contractService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysUserFeignService sysUserFeignService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private CloudTeacherOrderService cloudTeacherOrderService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private IdGeneratorService idGeneratorService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysCouponCodeService sysCouponCodeService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private StudentCloudCoachPaymentDetailsService studentCloudCoachPaymentDetailsService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private CloudCoachPaymentProgramService cloudCoachPaymentProgramService;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private RedissonClient redissonClient;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysConfigDao sysConfigDao;
 | 
	
		
			
				|  |  | +    @Autowired
 | 
	
		
			
				|  |  | +    private SysMessageService sysMessageService;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private final Logger logger = LoggerFactory.getLogger(this.getClass());
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public BaseDAO<Integer, MemberRankSetting> getDAO() {
 | 
	
		
			
				|  |  | +        return memberRankSettingDao;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void add(MemberRankSetting memberRankSetting) {
 | 
	
		
			
				|  |  | +        memberRankSettingDao.insert(memberRankSetting);
 | 
	
		
			
				|  |  | +        List<Integer> memberPrivilegesItemIdList = memberRankSetting.getMemberPrivilegesItemIdList();
 | 
	
		
			
				|  |  | +        if (memberPrivilegesItemIdList == null || memberPrivilegesItemIdList.size() == 0) {
 | 
	
		
			
				|  |  | +            throw new BizException("操作失败:请配置会员权益");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        memberRankPrivilegesDao.batchInsert(memberRankSetting.getId(), memberPrivilegesItemIdList);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	private final Logger logger = LoggerFactory.getLogger(this.getClass());
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public MemberRankSetting getDetail(Integer memberRankSettingId) {
 | 
	
		
			
				|  |  | +        MemberRankSetting memberRankSetting = memberRankSettingDao.get(memberRankSettingId);
 | 
	
		
			
				|  |  | +        List<MemberRankPrivileges> byRankSettingId = memberRankPrivilegesDao.findByRankSettingId(memberRankSettingId);
 | 
	
		
			
				|  |  | +        if (byRankSettingId != null && byRankSettingId.size() > 0) {
 | 
	
		
			
				|  |  | +            memberRankSetting.setMemberRankPrivileges(byRankSettingId);
 | 
	
		
			
				|  |  | +            memberRankSetting.setMemberPrivilegesItemIdList(byRankSettingId.stream().map(e -> e.getMemberPrivilegesId()).collect(Collectors.toList()));
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return memberRankSetting;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public BaseDAO<Integer, MemberRankSetting> getDAO() {
 | 
	
		
			
				|  |  | -		return memberRankSettingDao;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public void updateSetting(MemberRankSetting memberRankSetting) {
 | 
	
		
			
				|  |  | +        memberRankSettingDao.update(memberRankSetting);
 | 
	
		
			
				|  |  | +        memberRankPrivilegesDao.deleteByRankSettingId(memberRankSetting.getId());
 | 
	
		
			
				|  |  | +        List<Integer> memberPrivilegesItemIdList = memberRankSetting.getMemberPrivilegesItemIdList();
 | 
	
		
			
				|  |  | +        if (memberPrivilegesItemIdList != null && memberPrivilegesItemIdList.size() > 0) {
 | 
	
		
			
				|  |  | +            memberRankPrivilegesDao.batchInsert(memberRankSetting.getId(), memberPrivilegesItemIdList);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -	public void add(MemberRankSetting memberRankSetting) {
 | 
	
		
			
				|  |  | -		memberRankSettingDao.insert(memberRankSetting);
 | 
	
		
			
				|  |  | -		List<Integer> memberPrivilegesItemIdList = memberRankSetting.getMemberPrivilegesItemIdList();
 | 
	
		
			
				|  |  | -		if (memberPrivilegesItemIdList == null || memberPrivilegesItemIdList.size() == 0) {
 | 
	
		
			
				|  |  | -			throw new BizException("操作失败:请配置会员权益");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		memberRankPrivilegesDao.batchInsert(memberRankSetting.getId(), memberPrivilegesItemIdList);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    public List<MemberRankSetting> queryListByIsDefault(Boolean isDefault) {
 | 
	
		
			
				|  |  | +        return memberRankSettingDao.queryListByIsDefault(isDefault);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public MemberRankSetting getDetail(Integer memberRankSettingId) {
 | 
	
		
			
				|  |  | -		MemberRankSetting memberRankSetting = memberRankSettingDao.get(memberRankSettingId);
 | 
	
		
			
				|  |  | -		List<MemberRankPrivileges> byRankSettingId = memberRankPrivilegesDao.findByRankSettingId(memberRankSettingId);
 | 
	
		
			
				|  |  | -		if (byRankSettingId != null && byRankSettingId.size() > 0) {
 | 
	
		
			
				|  |  | -			memberRankSetting.setMemberRankPrivileges(byRankSettingId);
 | 
	
		
			
				|  |  | -			memberRankSetting.setMemberPrivilegesItemIdList(byRankSettingId.stream().map(e -> e.getMemberPrivilegesId()).collect(Collectors.toList()));
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return memberRankSetting;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    //原有购买会员支付接口  思路:分部等于59的时候 修改计算时间的地方 按齐齐哈尔的来
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public HttpResponseResult buy(MemberPayParamDto memberPayParamDto) throws Exception {
 | 
	
		
			
				|  |  | +        logger.info("团练宝购买:memberPayParamDto:{} ", memberPayParamDto);
 | 
	
		
			
				|  |  | +        Long paymentId = memberPayParamDto.getPaymentId();
 | 
	
		
			
				|  |  | +        CloudCoachPaymentProgram cloudCoachPaymentProgram = cloudCoachPaymentProgramService.get(paymentId);
 | 
	
		
			
				|  |  | +        if (cloudCoachPaymentProgram == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("团练宝缴费订单不存在,请联系指导老师");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        SysUser sysUser = sysUserFeignService.queryUserInfo();
 | 
	
		
			
				|  |  | +        StudentCloudCoachPaymentDetails cloudCoachPaymentDetails = studentCloudCoachPaymentDetailsService.findByUserId(paymentId, sysUser.getId());
 | 
	
		
			
				|  |  | +        if (cloudCoachPaymentDetails == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("您不在当前团练宝缴费项目中,请联系指导老师");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (cloudCoachPaymentDetails.getPaymentStatus() == 1) {
 | 
	
		
			
				|  |  | +            throw new BizException("当前团练宝订单已支付,感谢您的支持");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //判断用户是否已存在订单
 | 
	
		
			
				|  |  | +        List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.queryByDealStatus(paymentId.toString(), OrderTypeEnum.MEMBER, DealStatusEnum.ING);
 | 
	
		
			
				|  |  | +        if (CollectionUtils.isNotEmpty(applyOrderList)) {
 | 
	
		
			
				|  |  | +            HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(applyOrderList.get(0), memberPayParamDto.getRepeatPay());
 | 
	
		
			
				|  |  | +            if (result.getCode() != 200) {
 | 
	
		
			
				|  |  | +                return result;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -	public void updateSetting(MemberRankSetting memberRankSetting) {
 | 
	
		
			
				|  |  | -		memberRankSettingDao.update(memberRankSetting);
 | 
	
		
			
				|  |  | -		memberRankPrivilegesDao.deleteByRankSettingId(memberRankSetting.getId());
 | 
	
		
			
				|  |  | -		List<Integer> memberPrivilegesItemIdList = memberRankSetting.getMemberPrivilegesItemIdList();
 | 
	
		
			
				|  |  | -		if (memberPrivilegesItemIdList != null && memberPrivilegesItemIdList.size() > 0) {
 | 
	
		
			
				|  |  | -			memberRankPrivilegesDao.batchInsert(memberRankSetting.getId(), memberPrivilegesItemIdList);
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +        Integer userId = cloudCoachPaymentDetails.getUserId();
 | 
	
		
			
				|  |  | +        Student student = studentService.getLocked(userId);
 | 
	
		
			
				|  |  | +        if (student == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("非法访问");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        SysUser user = sysUserFeignService.queryUserById(userId);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	public List<MemberRankSetting> queryListByIsDefault(Boolean isDefault) {
 | 
	
		
			
				|  |  | -		return memberRankSettingDao.queryListByIsDefault(isDefault);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +        Integer organId = user.getOrganId();
 | 
	
		
			
				|  |  | +        if (organId == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("学生没有分部编号");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        BigDecimal actualAmount = cloudCoachPaymentProgram.getActualAmount();
 | 
	
		
			
				|  |  | +        //优惠券使用范围
 | 
	
		
			
				|  |  | +        String[] checkCoupon = CouponDetailTypeEnum.getAllowType(MEMBER);
 | 
	
		
			
				|  |  | +        //校验优惠券
 | 
	
		
			
				|  |  | +        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(memberPayParamDto.getCouponIdList(), actualAmount, true, checkCoupon);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setMusicGroupId(paymentId.toString());
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setMemo(cloudCoachPaymentProgram.getRemark());
 | 
	
		
			
				|  |  | +        Map<String, Object> result = getMap(memberPayParamDto.getAmount(), memberPayParamDto.getUseBalancePayment(), userId, organId, studentPaymentOrder);
 | 
	
		
			
				|  |  | +        return BaseController.succeed(result);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	@Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | -	public HttpResponseResult buy(MemberPayParamDto memberPayParamDto) throws Exception {
 | 
	
		
			
				|  |  | -		logger.info("团练宝购买:memberPayParamDto:{} ",memberPayParamDto);
 | 
	
		
			
				|  |  | -		Long paymentId = memberPayParamDto.getPaymentId();
 | 
	
		
			
				|  |  | -		CloudCoachPaymentProgram cloudCoachPaymentProgram = cloudCoachPaymentProgramService.get(paymentId);
 | 
	
		
			
				|  |  | -		if(cloudCoachPaymentProgram == null){
 | 
	
		
			
				|  |  | -			throw new BizException("团练宝缴费订单不存在,请联系指导老师");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		SysUser sysUser = sysUserFeignService.queryUserInfo();
 | 
	
		
			
				|  |  | -		StudentCloudCoachPaymentDetails cloudCoachPaymentDetails = studentCloudCoachPaymentDetailsService.findByUserId(paymentId,sysUser.getId());
 | 
	
		
			
				|  |  | -		if(cloudCoachPaymentDetails == null){
 | 
	
		
			
				|  |  | -			throw new BizException("您不在当前团练宝缴费项目中,请联系指导老师");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if(cloudCoachPaymentDetails.getPaymentStatus() == 1){
 | 
	
		
			
				|  |  | -			throw new BizException("当前团练宝订单已支付,感谢您的支持");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		//判断用户是否已存在订单
 | 
	
		
			
				|  |  | -		List<StudentPaymentOrder> applyOrderList = studentPaymentOrderService.queryByDealStatus(paymentId.toString(), OrderTypeEnum.MEMBER,DealStatusEnum.ING);
 | 
	
		
			
				|  |  | -		if (CollectionUtils.isNotEmpty(applyOrderList)) {
 | 
	
		
			
				|  |  | -			HttpResponseResult result = studentPaymentOrderService.checkRepeatPay(applyOrderList.get(0), memberPayParamDto.getRepeatPay());
 | 
	
		
			
				|  |  | -			if (result.getCode() != 200) {
 | 
	
		
			
				|  |  | -				return result;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +    public static final String BUY_2_QQHE_LOCK = "BUY_2_QQHE_LOCK:";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		Integer userId = cloudCoachPaymentDetails.getUserId();
 | 
	
		
			
				|  |  | -		Student student = studentService.getLocked(userId);
 | 
	
		
			
				|  |  | -		if (student == null) {
 | 
	
		
			
				|  |  | -			throw new BizException("非法访问");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		SysUser user = sysUserFeignService.queryUserById(userId);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(rollbackFor = Exception.class)
 | 
	
		
			
				|  |  | +    public HttpResponseResult buy2Qqhe(MemberPayParamDto memberPayParamDto) throws Exception {
 | 
	
		
			
				|  |  | +        Optional<SysUser> sysUserOpt = Optional.ofNullable(sysUserFeignService.queryUserInfo());
 | 
	
		
			
				|  |  | +        SysUser sysUser = sysUserOpt.orElseThrow(() -> new BizException("未查询到学生信息,请重新登录!"));
 | 
	
		
			
				|  |  | +        sysUserOpt.map(SysUser::getId)
 | 
	
		
			
				|  |  | +                .map(studentService::getLocked)
 | 
	
		
			
				|  |  | +                .orElseThrow(() -> new BizException("非法访问"));
 | 
	
		
			
				|  |  | +        //防止重复点击
 | 
	
		
			
				|  |  | +        RBucket<Object> bucket = redissonClient.getBucket(BUY_2_QQHE_LOCK + sysUser.getId());
 | 
	
		
			
				|  |  | +        if (!bucket.trySet(1, 2, TimeUnit.SECONDS)) {
 | 
	
		
			
				|  |  | +            throw new BizException("请勿频繁操作!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        int val = memberPayParamDto.getVal();
 | 
	
		
			
				|  |  | +        if (val < 0) {
 | 
	
		
			
				|  |  | +            throw new BizException("最少购买1个月!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (val > 12) {
 | 
	
		
			
				|  |  | +            throw new BizException("最多购买12个月!");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //获取赠送的月份
 | 
	
		
			
				|  |  | +        BigDecimal giveMonth = getGiveMonth(val);
 | 
	
		
			
				|  |  | +        //转换格式
 | 
	
		
			
				|  |  | +        BigDecimal valDecimal = new BigDecimal(val);
 | 
	
		
			
				|  |  | +        //单价150 固定
 | 
	
		
			
				|  |  | +        BigDecimal price = new BigDecimal("150");
 | 
	
		
			
				|  |  | +        //计算出购买的价格 单价 X 购买的月份
 | 
	
		
			
				|  |  | +        BigDecimal amount = price.multiply(valDecimal);
 | 
	
		
			
				|  |  | +        //获取会员总激活时间
 | 
	
		
			
				|  |  | +        BigDecimal totalMonth = valDecimal.add(giveMonth);
 | 
	
		
			
				|  |  | +        //优惠券使用范围
 | 
	
		
			
				|  |  | +        String[] checkCoupon = CouponDetailTypeEnum.getAllowType(MEMBER);
 | 
	
		
			
				|  |  | +        //使用优惠券
 | 
	
		
			
				|  |  | +        StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(memberPayParamDto.getCouponIdList(), amount, true, checkCoupon);
 | 
	
		
			
				|  |  | +        //创建订单
 | 
	
		
			
				|  |  | +        Map<String, Object> result = getMap(memberPayParamDto.getAmount(), memberPayParamDto.getUseBalancePayment(), sysUser.getId(), sysUser.getOrganId(), studentPaymentOrder);
 | 
	
		
			
				|  |  | +        //写cloud order
 | 
	
		
			
				|  |  | +        LocalDate now = LocalDate.now();
 | 
	
		
			
				|  |  | +        CloudTeacherOrder cto = new CloudTeacherOrder();
 | 
	
		
			
				|  |  | +        cto.setStatus(0);//0 未生效
 | 
	
		
			
				|  |  | +        cto.setOrganId(sysUser.getOrganId());
 | 
	
		
			
				|  |  | +        cto.setStudentId(sysUser.getId());
 | 
	
		
			
				|  |  | +        cto.setType(PeriodEnum.MONTH);
 | 
	
		
			
				|  |  | +        cto.setLevel(1);
 | 
	
		
			
				|  |  | +        cto.setTime(totalMonth.intValue());
 | 
	
		
			
				|  |  | +        cto.setAmount(studentPaymentOrder.getActualAmount().add(studentPaymentOrder.getBalancePaymentAmount()));
 | 
	
		
			
				|  |  | +        cto.setStartTime(now.toDate());
 | 
	
		
			
				|  |  | +        cto.setEndTime(now.plusMonths(totalMonth.intValue()).toDate());
 | 
	
		
			
				|  |  | +        cto.setOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | +        cto.setCreateTime(new Date());
 | 
	
		
			
				|  |  | +        cloudTeacherOrderService.insert(cto);
 | 
	
		
			
				|  |  | +        //写入redis证明是活动购买
 | 
	
		
			
				|  |  | +        RBucket<Object> cache = redissonClient.getBucket(BUY_2_QQHE_LOCK + studentPaymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +        cache.set(memberPayParamDto, 35, TimeUnit.MINUTES);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		Integer organId = user.getOrganId();
 | 
	
		
			
				|  |  | -		if (organId == null) {
 | 
	
		
			
				|  |  | -			throw new BizException("学生没有分部编号");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		BigDecimal actualAmount = cloudCoachPaymentProgram.getActualAmount();
 | 
	
		
			
				|  |  | +        return BaseController.succeed(result);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		Date date = new Date();
 | 
	
		
			
				|  |  | +    private BigDecimal getGiveMonth(int val) {
 | 
	
		
			
				|  |  | +        BigDecimal giveMonth;
 | 
	
		
			
				|  |  | +        //最小数o  最大数s
 | 
	
		
			
				|  |  | +        BiPredicate<Integer, Integer> predicate = (o, s) -> val >= o && val < s;
 | 
	
		
			
				|  |  | +        if (predicate.test(2, 4)) {
 | 
	
		
			
				|  |  | +            //购买2到4(不包含)之间月赠送1个月
 | 
	
		
			
				|  |  | +            giveMonth = BigDecimal.ONE;
 | 
	
		
			
				|  |  | +        } else if (predicate.test(4, 6)) {
 | 
	
		
			
				|  |  | +            //购买4到6(不包含)之间月赠送1个月
 | 
	
		
			
				|  |  | +            giveMonth = new BigDecimal("3");
 | 
	
		
			
				|  |  | +        } else if (val >= 6) {
 | 
	
		
			
				|  |  | +            //购买6(包含)个月以上送6个月
 | 
	
		
			
				|  |  | +            giveMonth = new BigDecimal("6");
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            //默认不赠送
 | 
	
		
			
				|  |  | +            giveMonth = BigDecimal.ZERO;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return giveMonth;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		StudentPaymentOrder studentPaymentOrder = sysCouponCodeService.use(memberPayParamDto.getCouponIdList(),actualAmount,true);
 | 
	
		
			
				|  |  | -		actualAmount = studentPaymentOrder.getActualAmount();
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setUserId(userId);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setOrganId(organId);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setRoutingOrganId(organId);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setCreateTime(date);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setUpdateTime(date);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setBalancePaymentAmount(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setStatus(DealStatusEnum.ING);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setVersion(0);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setType(OrderTypeEnum.MEMBER);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setGroupType(GroupType.MEMBER);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setRemitFee(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setCourseRemitFee(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setMemo(cloudCoachPaymentProgram.getRemark());
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setPaymentChannel("BALANCE");
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setMusicGroupId(paymentId.toString());
 | 
	
		
			
				|  |  | -		// 判断金额是否正确
 | 
	
		
			
				|  |  | -		if (actualAmount.compareTo(memberPayParamDto.getAmount()) != 0) {
 | 
	
		
			
				|  |  | -			throw new BizException("非法请求");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		//使用余额支付
 | 
	
		
			
				|  |  | -		if (memberPayParamDto.getUseBalancePayment()) {
 | 
	
		
			
				|  |  | -			useBalanceAmount(studentPaymentOrder,"购买会员");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		String orderNo = idGeneratorService.generatorId("payment") + "";
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setOrderNo(orderNo);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setCreateTime(date);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setUpdateTime(date);
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setVersion(0);
 | 
	
		
			
				|  |  | -		studentPaymentOrderService.insert(studentPaymentOrder);
 | 
	
		
			
				|  |  | -		Map result = studentPaymentOrderService.createOrder(studentPaymentOrder, null, "BUY_MEMBER");
 | 
	
		
			
				|  |  | -		return BaseController.succeed(result);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    //写入支付数据
 | 
	
		
			
				|  |  | +    private Map<String, Object> getMap(BigDecimal amount, Boolean UseBalance, Integer userId, Integer organId, StudentPaymentOrder studentPaymentOrder) throws Exception {
 | 
	
		
			
				|  |  | +        Date date = new Date();
 | 
	
		
			
				|  |  | +        BigDecimal actualAmount = studentPaymentOrder.getActualAmount();
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setUserId(userId);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setOrganId(organId);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setRoutingOrganId(organId);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setCreateTime(date);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setUpdateTime(date);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setBalancePaymentAmount(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setStatus(DealStatusEnum.ING);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setVersion(0);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setType(OrderTypeEnum.MEMBER);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setGroupType(GroupType.MEMBER);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setRemitFee(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setCourseRemitFee(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setPaymentChannel("BALANCE");
 | 
	
		
			
				|  |  | +        // 判断金额是否正确
 | 
	
		
			
				|  |  | +        if (actualAmount.compareTo(amount) != 0) {
 | 
	
		
			
				|  |  | +            throw new BizException("非法请求");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        //使用余额支付
 | 
	
		
			
				|  |  | +        if (UseBalance) {
 | 
	
		
			
				|  |  | +            useBalanceAmount(studentPaymentOrder, "购买会员");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        String orderNo = idGeneratorService.generatorId("payment") + "";
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setOrderNo(orderNo);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setCreateTime(date);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setUpdateTime(date);
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setVersion(0);
 | 
	
		
			
				|  |  | +        studentPaymentOrderService.insert(studentPaymentOrder);
 | 
	
		
			
				|  |  | +        Map<String, Object> result = studentPaymentOrderService.createOrder(studentPaymentOrder, null, "BUY_MEMBER");
 | 
	
		
			
				|  |  | +        return result;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	public StudentPaymentOrder useBalanceAmount(StudentPaymentOrder studentPaymentOrder,String memo){
 | 
	
		
			
				|  |  | -		Integer userId = studentPaymentOrder.getUserId();
 | 
	
		
			
				|  |  | -		SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
 | 
	
		
			
				|  |  | -		if (userCashAccount == null) {
 | 
	
		
			
				|  |  | -			throw new BizException("用户账户找不到");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		BigDecimal actualAmount = studentPaymentOrder.getActualAmount();
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setPaymentChannel("BALANCE");
 | 
	
		
			
				|  |  | -		if (userCashAccount.getBalance().subtract(actualAmount).doubleValue() >= 0) {
 | 
	
		
			
				|  |  | -			studentPaymentOrder.setActualAmount(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | -			studentPaymentOrder.setBalancePaymentAmount(actualAmount);
 | 
	
		
			
				|  |  | -			sysUserCashAccountService.updateBalance(userId, actualAmount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, memo);
 | 
	
		
			
				|  |  | +    public void useBalanceAmount(StudentPaymentOrder studentPaymentOrder, String memo) {
 | 
	
		
			
				|  |  | +        Integer userId = studentPaymentOrder.getUserId();
 | 
	
		
			
				|  |  | +        SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(userId);
 | 
	
		
			
				|  |  | +        if (userCashAccount == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("用户账户找不到");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        BigDecimal actualAmount = studentPaymentOrder.getActualAmount();
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setPaymentChannel("BALANCE");
 | 
	
		
			
				|  |  | +        if (userCashAccount.getBalance().subtract(actualAmount).doubleValue() >= 0) {
 | 
	
		
			
				|  |  | +            studentPaymentOrder.setActualAmount(BigDecimal.ZERO);
 | 
	
		
			
				|  |  | +            studentPaymentOrder.setBalancePaymentAmount(actualAmount);
 | 
	
		
			
				|  |  | +            sysUserCashAccountService.updateBalance(userId, actualAmount.negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, memo);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		} else {
 | 
	
		
			
				|  |  | -			if (userCashAccount.getBalance().doubleValue() > 0) {
 | 
	
		
			
				|  |  | -				sysUserCashAccountService.updateBalance(userId, userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, memo);
 | 
	
		
			
				|  |  | -				studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
 | 
	
		
			
				|  |  | -				studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount().subtract(userCashAccount.getBalance()));
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return studentPaymentOrder;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +            if (userCashAccount.getBalance().doubleValue() > 0) {
 | 
	
		
			
				|  |  | +                sysUserCashAccountService.updateBalance(userId, userCashAccount.getBalance().negate(), PlatformCashAccountDetailTypeEnum.PAY_FEE, memo);
 | 
	
		
			
				|  |  | +                studentPaymentOrder.setBalancePaymentAmount(userCashAccount.getBalance());
 | 
	
		
			
				|  |  | +                studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount().subtract(userCashAccount.getBalance()));
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 | 
	
		
			
				|  |  | -	public boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
 | 
	
		
			
				|  |  | -		//查询原定的是否已处理
 | 
	
		
			
				|  |  | -		StudentPaymentOrder orignStudentPaymentOrder = studentPaymentOrderService.lockOrder(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | -		if(orignStudentPaymentOrder == null){
 | 
	
		
			
				|  |  | -			return false;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if(orignStudentPaymentOrder.getStatus() != DealStatusEnum.ING){
 | 
	
		
			
				|  |  | -			return false;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		Integer userId = studentPaymentOrder.getUserId();
 | 
	
		
			
				|  |  | -		Student student = studentService.get(userId);
 | 
	
		
			
				|  |  | -		if (student == null) {
 | 
	
		
			
				|  |  | -			throw new BizException("学员信息不存在");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		
 | 
	
		
			
				|  |  | -		Date nowDate = new Date();
 | 
	
		
			
				|  |  | -		// 更新订单信息
 | 
	
		
			
				|  |  | -		studentPaymentOrder.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | -		studentPaymentOrderService.update(studentPaymentOrder);
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 | 
	
		
			
				|  |  | +    public boolean orderCallback(StudentPaymentOrder studentPaymentOrder) {
 | 
	
		
			
				|  |  | +        //查询原定的是否已处理
 | 
	
		
			
				|  |  | +        StudentPaymentOrder orignStudentPaymentOrder = studentPaymentOrderService.lockOrder(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | +        if (orignStudentPaymentOrder == null) {
 | 
	
		
			
				|  |  | +            return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (orignStudentPaymentOrder.getStatus() != DealStatusEnum.ING) {
 | 
	
		
			
				|  |  | +            return false;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Integer userId = studentPaymentOrder.getUserId();
 | 
	
		
			
				|  |  | +        Student student = studentService.get(userId);
 | 
	
		
			
				|  |  | +        if (student == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("学员信息不存在");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        SysUser sysUser = sysUserFeignService.queryUserById(userId);
 | 
	
		
			
				|  |  | +        if (sysUser == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("学员信息不存在");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
 | 
	
		
			
				|  |  | -			//退还优惠券和余额
 | 
	
		
			
				|  |  | -			studentPaymentOrderService.returnBalanceAndCoupon(studentPaymentOrder,"购买会员支付失败");
 | 
	
		
			
				|  |  | -			return true;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | +        Date nowDate = new Date();
 | 
	
		
			
				|  |  | +        // 更新订单信息
 | 
	
		
			
				|  |  | +        studentPaymentOrder.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | +        studentPaymentOrderService.update(studentPaymentOrder);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		// 支付成功
 | 
	
		
			
				|  |  | -		if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
 | 
	
		
			
				|  |  | -			CloudCoachPaymentProgram cloudCoachPaymentProgram = cloudCoachPaymentProgramService.get(Long.parseLong(studentPaymentOrder.getMusicGroupId()));
 | 
	
		
			
				|  |  | -			StudentCloudCoachPaymentDetails coachPaymentDetails = studentCloudCoachPaymentDetailsService.findByUserId(cloudCoachPaymentProgram.getId(),studentPaymentOrder.getUserId());
 | 
	
		
			
				|  |  | -			//保存团练宝数据
 | 
	
		
			
				|  |  | -			CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setLevel(cloudCoachPaymentProgram.getMemberRankSettingId());
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setStatus(1);
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setType(cloudCoachPaymentProgram.getPeriod());
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setTime(cloudCoachPaymentProgram.getMemberNum().intValue());
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setStudentId(coachPaymentDetails.getUserId());
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setOrganId(studentPaymentOrder.getOrganId());
 | 
	
		
			
				|  |  | -			cloudTeacherOrder.setAmount(studentPaymentOrder.getExpectAmount());
 | 
	
		
			
				|  |  | -			cloudTeacherOrderService.insert(cloudTeacherOrder);
 | 
	
		
			
				|  |  | +        if (studentPaymentOrder.getStatus() == DealStatusEnum.CLOSE || studentPaymentOrder.getStatus() == DealStatusEnum.FAILED) {
 | 
	
		
			
				|  |  | +            //退还优惠券和余额
 | 
	
		
			
				|  |  | +            studentPaymentOrderService.returnBalanceAndCoupon(studentPaymentOrder, "购买会员支付失败");
 | 
	
		
			
				|  |  | +            return true;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			//修改缴费状态
 | 
	
		
			
				|  |  | -			coachPaymentDetails.setPaymentStatus(1);
 | 
	
		
			
				|  |  | -			coachPaymentDetails.setPaymentOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | -			studentCloudCoachPaymentDetailsService.update(coachPaymentDetails);
 | 
	
		
			
				|  |  | -			//修改实际缴费人数
 | 
	
		
			
				|  |  | -			cloudCoachPaymentProgram.setPaymentUserNum(cloudCoachPaymentProgram.getPaymentUserNum() + 1);
 | 
	
		
			
				|  |  | -			cloudCoachPaymentProgramService.update(cloudCoachPaymentProgram);
 | 
	
		
			
				|  |  | -			// 插入交易明细
 | 
	
		
			
				|  |  | -			sysUserCashAccountDetailService.saveSysUserCashAccountDetail(studentPaymentOrder,"购买会员");
 | 
	
		
			
				|  |  | +        // 支付成功
 | 
	
		
			
				|  |  | +        if (studentPaymentOrder.getStatus() == DealStatusEnum.SUCCESS) {
 | 
	
		
			
				|  |  | +            //齐齐哈尔购买成功默认激活
 | 
	
		
			
				|  |  | +            // 活动时间:
 | 
	
		
			
				|  |  | +            // 1. 2022年2月8日上线预热
 | 
	
		
			
				|  |  | +            // 2. 2022年2月15日开始销售
 | 
	
		
			
				|  |  | +            // 3. 暂无结束时间,长期有效
 | 
	
		
			
				|  |  | +            //查询redis证明是活动购买
 | 
	
		
			
				|  |  | +            RBucket<Object> cache = redissonClient.getBucket(BUY_2_QQHE_LOCK + studentPaymentOrder.getOrderNo());
 | 
	
		
			
				|  |  | +            //查询活动时间
 | 
	
		
			
				|  |  | +            String activityDateStr = sysConfigDao.findConfigValue("qqhe_2022_buy_member_activity");
 | 
	
		
			
				|  |  | +            //获取活动时间
 | 
	
		
			
				|  |  | +            Date activityDate = DateUtil.stringToDate(activityDateStr, DateUtil.EXPANDED_DATE_TIME_FORMAT);
 | 
	
		
			
				|  |  | +            //分部编号59 并且下单时间大于等于activityDateStr  todo 并且redis能查询到的就算齐齐哈尔活动购买的
 | 
	
		
			
				|  |  | +            if (sysUser.getOrganId() == 59 && studentPaymentOrder.getCreateTime().after(activityDate) && cache.isExists()) {
 | 
	
		
			
				|  |  | +                //修改 cloudTeacherOrderService
 | 
	
		
			
				|  |  | +                CloudTeacherOrder cloudTeacherOrder = cloudTeacherOrderService.queryByOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setStatus(2);
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setUpdateTime(nowDate);
 | 
	
		
			
				|  |  | +                cloudTeacherOrderService.update(cloudTeacherOrder);
 | 
	
		
			
				|  |  | +                //修改student 查询学生现在的会员过期没,如果过期了就按现在时间来,如果没过期就在结束时间上叠加
 | 
	
		
			
				|  |  | +                if (student.getMembershipStartTime().getTime() >= nowDate.getTime()) {
 | 
	
		
			
				|  |  | +                    student.setMembershipEndTime(DateUtil.addMonths(student.getMembershipEndTime(), cloudTeacherOrder.getTime()));
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                    student.setMembershipStartTime(cloudTeacherOrder.getStartTime());
 | 
	
		
			
				|  |  | +                    student.setMembershipEndTime(cloudTeacherOrder.getEndTime());
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                student.setMemberRankSettingId(1);
 | 
	
		
			
				|  |  | +                studentService.update(student);
 | 
	
		
			
				|  |  | +                //发送激活信息
 | 
	
		
			
				|  |  | +                Map<Integer, String> userPhones = new HashMap<>();
 | 
	
		
			
				|  |  | +                userPhones.put(sysUser.getId(), sysUser.getPhone());
 | 
	
		
			
				|  |  | +                sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, MessageTypeEnum.CLOUD_TEACHER_ORDER_SUCCESS, userPhones, null, 0, null, null);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                CloudCoachPaymentProgram cloudCoachPaymentProgram = cloudCoachPaymentProgramService.get(Long.parseLong(studentPaymentOrder.getMusicGroupId()));
 | 
	
		
			
				|  |  | +                StudentCloudCoachPaymentDetails coachPaymentDetails = studentCloudCoachPaymentDetailsService.findByUserId(cloudCoachPaymentProgram.getId(), studentPaymentOrder.getUserId());
 | 
	
		
			
				|  |  | +                //保存团练宝数据
 | 
	
		
			
				|  |  | +                CloudTeacherOrder cloudTeacherOrder = new CloudTeacherOrder();
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setLevel(cloudCoachPaymentProgram.getMemberRankSettingId());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setStatus(1);
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setType(cloudCoachPaymentProgram.getPeriod());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setTime(cloudCoachPaymentProgram.getMemberNum().intValue());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setStudentId(coachPaymentDetails.getUserId());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setOrganId(studentPaymentOrder.getOrganId());
 | 
	
		
			
				|  |  | +                cloudTeacherOrder.setAmount(studentPaymentOrder.getExpectAmount());
 | 
	
		
			
				|  |  | +                cloudTeacherOrderService.insert(cloudTeacherOrder);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -			try {
 | 
	
		
			
				|  |  | -				contractService.transferProduceContract(userId, null, CourseViewTypeEnum.MEMBER_FEE);
 | 
	
		
			
				|  |  | -			} catch (Exception e) {
 | 
	
		
			
				|  |  | -				logger.error("产品协议生成失败", e);
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		return true;
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +                //修改缴费状态
 | 
	
		
			
				|  |  | +                coachPaymentDetails.setPaymentStatus(1);
 | 
	
		
			
				|  |  | +                coachPaymentDetails.setPaymentOrderId(studentPaymentOrder.getId());
 | 
	
		
			
				|  |  | +                studentCloudCoachPaymentDetailsService.update(coachPaymentDetails);
 | 
	
		
			
				|  |  | +                //修改实际缴费人数
 | 
	
		
			
				|  |  | +                cloudCoachPaymentProgram.setPaymentUserNum(cloudCoachPaymentProgram.getPaymentUserNum() + 1);
 | 
	
		
			
				|  |  | +                cloudCoachPaymentProgramService.update(cloudCoachPaymentProgram);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            // 插入交易明细
 | 
	
		
			
				|  |  | +            sysUserCashAccountDetailService.saveSysUserCashAccountDetail(studentPaymentOrder, "购买会员");
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                contractService.transferProduceContract(userId, null, CourseViewTypeEnum.MEMBER_FEE);
 | 
	
		
			
				|  |  | +            } catch (Exception e) {
 | 
	
		
			
				|  |  | +                logger.error("产品协议生成失败", e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        return true;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Override
 | 
	
		
			
				|  |  | -	@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
 | 
	
		
			
				|  |  | -	public HttpResponseResult ActiveBuy(Integer userId, Integer memberRankId, PeriodEnum month, BigDecimal amount, boolean isUseBalance, Integer buyNum, int giveNum, int activeRemark, String remark,boolean repay) throws Exception {
 | 
	
		
			
				|  |  | -		HttpResponseResult result = new HttpResponseResult();
 | 
	
		
			
				|  |  | -		//判断用户是否已存在订单
 | 
	
		
			
				|  |  | -		StudentPaymentOrder applyOrder = studentPaymentOrderService.findByUserAndActive(userId,202109,remark,"ING");
 | 
	
		
			
				|  |  | -		if (applyOrder != null) {
 | 
	
		
			
				|  |  | -			// 查询订单状态
 | 
	
		
			
				|  |  | -			PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
 | 
	
		
			
				|  |  | -			if(payStatus == PayStatus.SUCCESSED){
 | 
	
		
			
				|  |  | -				throw new BizException("订单已支付成功,请勿重复支付");
 | 
	
		
			
				|  |  | -			}/*else if(payStatus == PayStatus.PAYING){
 | 
	
		
			
				|  |  | +    @Override
 | 
	
		
			
				|  |  | +    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
 | 
	
		
			
				|  |  | +    public HttpResponseResult ActiveBuy(Integer userId, Integer memberRankId, PeriodEnum month, BigDecimal amount, boolean isUseBalance, Integer buyNum, int giveNum, int activeRemark, String remark, boolean repay) throws Exception {
 | 
	
		
			
				|  |  | +        HttpResponseResult result = new HttpResponseResult();
 | 
	
		
			
				|  |  | +        //判断用户是否已存在订单
 | 
	
		
			
				|  |  | +        StudentPaymentOrder applyOrder = studentPaymentOrderService.findByUserAndActive(userId, 202109, remark, "ING");
 | 
	
		
			
				|  |  | +        if (applyOrder != null) {
 | 
	
		
			
				|  |  | +            // 查询订单状态
 | 
	
		
			
				|  |  | +            PayStatus payStatus = studentPaymentOrderService.queryPayStatus(applyOrder.getPaymentChannel(), applyOrder.getOrderNo(), applyOrder.getTransNo());
 | 
	
		
			
				|  |  | +            if (payStatus == PayStatus.SUCCESSED) {
 | 
	
		
			
				|  |  | +                throw new BizException("订单已支付成功,请勿重复支付");
 | 
	
		
			
				|  |  | +            }/*else if(payStatus == PayStatus.PAYING){
 | 
	
		
			
				|  |  |  				throw new BizException("订单还在交易中,请稍后重试");
 | 
	
		
			
				|  |  |  			}*/
 | 
	
		
			
				|  |  | -			if(repay){
 | 
	
		
			
				|  |  | -				//处理关闭订单
 | 
	
		
			
				|  |  | -				applyOrder.setStatus(DealStatusEnum.CLOSE);
 | 
	
		
			
				|  |  | -				applyOrder.setMemo("关闭团练宝活动订单");
 | 
	
		
			
				|  |  | -				if (applyOrder.getBalancePaymentAmount() != null && applyOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | -					sysUserCashAccountService.updateBalance(applyOrder.getUserId(), applyOrder.getBalancePaymentAmount(),
 | 
	
		
			
				|  |  | -							PlatformCashAccountDetailTypeEnum.REFUNDS, "购买团练宝活动支付失败");
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				studentPaymentOrderService.update(applyOrder);
 | 
	
		
			
				|  |  | -			}else {
 | 
	
		
			
				|  |  | -				result.setCode(HttpStatus.CONTINUE.value());
 | 
	
		
			
				|  |  | -				result.setMsg("您有待支付的订单");
 | 
	
		
			
				|  |  | -				return result;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | +            if (repay) {
 | 
	
		
			
				|  |  | +                //处理关闭订单
 | 
	
		
			
				|  |  | +                applyOrder.setStatus(DealStatusEnum.CLOSE);
 | 
	
		
			
				|  |  | +                applyOrder.setMemo("关闭团练宝活动订单");
 | 
	
		
			
				|  |  | +                if (applyOrder.getBalancePaymentAmount() != null && applyOrder.getBalancePaymentAmount().compareTo(BigDecimal.ZERO) > 0) {
 | 
	
		
			
				|  |  | +                    sysUserCashAccountService.updateBalance(applyOrder.getUserId(), applyOrder.getBalancePaymentAmount(),
 | 
	
		
			
				|  |  | +                            PlatformCashAccountDetailTypeEnum.REFUNDS, "购买团练宝活动支付失败");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                studentPaymentOrderService.update(applyOrder);
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +                result.setCode(HttpStatus.CONTINUE.value());
 | 
	
		
			
				|  |  | +                result.setMsg("您有待支付的订单");
 | 
	
		
			
				|  |  | +                return result;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		result.setCode(HttpStatus.OK.value());
 | 
	
		
			
				|  |  | -		MemberPayParamDto memberPayParamDto = new MemberPayParamDto();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        result.setCode(HttpStatus.OK.value());
 | 
	
		
			
				|  |  | +        MemberPayParamDto memberPayParamDto = new MemberPayParamDto();
 | 
	
		
			
				|  |  |  //		memberPayParamDto.setMemberRankId(memberRankId);
 | 
	
		
			
				|  |  |  //		memberPayParamDto.setUserId(userId);
 | 
	
		
			
				|  |  |  //		memberPayParamDto.setPeriodEnum(month);
 | 
	
	
		
			
				|  | @@ -309,35 +446,35 @@ public class MemberRankSettingServiceImpl extends BaseServiceImpl<Integer, Membe
 | 
	
		
			
				|  |  |  //		memberPayParamDto.setGiveNum(giveNum);
 | 
	
		
			
				|  |  |  //		memberPayParamDto.setActiveRemark(activeRemark);
 | 
	
		
			
				|  |  |  //		memberPayParamDto.setRemark(remark);
 | 
	
		
			
				|  |  | -		memberPayParamDto.setAmount(amount);
 | 
	
		
			
				|  |  | -		return this.buy(memberPayParamDto);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +        memberPayParamDto.setAmount(amount);
 | 
	
		
			
				|  |  | +        return this.buy(memberPayParamDto);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	//团练宝活动赠送优惠券
 | 
	
		
			
				|  |  | -	public void cloudTeacherActiveGiveCoupon(CloudTeacherOrder cloudTeacherOrder){
 | 
	
		
			
				|  |  | -		Integer activeRemark = cloudTeacherOrder.getActiveRemark();
 | 
	
		
			
				|  |  | -		String remark = cloudTeacherOrder.getRemark();
 | 
	
		
			
				|  |  | -		if(activeRemark == null || StringUtils.isEmpty(remark)){
 | 
	
		
			
				|  |  | -			return;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		Integer studentId = cloudTeacherOrder.getStudentId();
 | 
	
		
			
				|  |  | -		SysUser sysUser = sysUserFeignService.queryUserById(studentId);
 | 
	
		
			
				|  |  | -		if(sysUser == null){
 | 
	
		
			
				|  |  | -			throw new BizException("用户信息获取失败");
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		Integer couponId = 1;
 | 
	
		
			
				|  |  | -		if(sysUser.getOrganId() != null && sysUser.getOrganId() == 4){
 | 
	
		
			
				|  |  | -			couponId = 2;
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -		if(activeRemark.equals(202109)){
 | 
	
		
			
				|  |  | -			switch (remark){
 | 
	
		
			
				|  |  | -				case "2赠1":
 | 
	
		
			
				|  |  | -					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),3,2,null);
 | 
	
		
			
				|  |  | -					break;
 | 
	
		
			
				|  |  | -				case "3赠2":
 | 
	
		
			
				|  |  | -					sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(),couponId,cloudTeacherOrder.getOrderId(),6,2,null);
 | 
	
		
			
				|  |  | -					break;
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		}
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | +    //团练宝活动赠送优惠券
 | 
	
		
			
				|  |  | +    public void cloudTeacherActiveGiveCoupon(CloudTeacherOrder cloudTeacherOrder) {
 | 
	
		
			
				|  |  | +        Integer activeRemark = cloudTeacherOrder.getActiveRemark();
 | 
	
		
			
				|  |  | +        String remark = cloudTeacherOrder.getRemark();
 | 
	
		
			
				|  |  | +        if (activeRemark == null || StringUtils.isEmpty(remark)) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Integer studentId = cloudTeacherOrder.getStudentId();
 | 
	
		
			
				|  |  | +        SysUser sysUser = sysUserFeignService.queryUserById(studentId);
 | 
	
		
			
				|  |  | +        if (sysUser == null) {
 | 
	
		
			
				|  |  | +            throw new BizException("用户信息获取失败");
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        Integer couponId = 1;
 | 
	
		
			
				|  |  | +        if (sysUser.getOrganId() != null && sysUser.getOrganId() == 4) {
 | 
	
		
			
				|  |  | +            couponId = 2;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        if (activeRemark.equals(202109)) {
 | 
	
		
			
				|  |  | +            switch (remark) {
 | 
	
		
			
				|  |  | +                case "2赠1":
 | 
	
		
			
				|  |  | +                    sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(), couponId, cloudTeacherOrder.getOrderId(), 3, 2, null);
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +                case "3赠2":
 | 
	
		
			
				|  |  | +                    sysCouponCodeService.exchangeCoupon(cloudTeacherOrder.getStudentId(), couponId, cloudTeacherOrder.getOrderId(), 6, 2, null);
 | 
	
		
			
				|  |  | +                    break;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |