| 
					
				 | 
			
			
				@@ -1,17 +1,41 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package com.ym.mec.biz.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.common.collect.Lists; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.auth.api.client.SysUserFeignService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.auth.api.entity.SysUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.dto.CashAccountDetail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.dto.WithdrawDto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.dto.WithdrawInfoDto; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.entity.SysUserCashAccount; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.entity.SysUserCashAccountDetail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.enums.PlatformCashAccountDetailTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.service.SysUserCashAccountDetailService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.service.SysUserCashAccountService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.biz.dal.enums.TransTypeEnum; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.common.exception.BizException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.common.page.PageInfo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.common.utils.DateUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ym.mec.util.string.IdWorker; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.Logger; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.slf4j.LoggerFactory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.BeanUtils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.beans.factory.annotation.Autowired; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.beans.factory.annotation.Qualifier; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.dao.StudentWithdrawDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.dal.entity.StudentWithdraw; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.biz.service.StudentWithdrawService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.common.dal.BaseDAO; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ym.mec.common.service.impl.BaseServiceImpl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.transaction.annotation.Transactional; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.math.BigDecimal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.locks.Lock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.concurrent.locks.ReentrantLock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @Service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentWithdraw>  implements StudentWithdrawService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private StudentWithdrawDao studentWithdrawDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -19,5 +43,111 @@ public class StudentWithdrawServiceImpl extends BaseServiceImpl<String, StudentW 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public BaseDAO<String, StudentWithdraw> getDAO() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return studentWithdrawDao; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private static final Logger log = LoggerFactory.getLogger(StudentWithdrawServiceImpl.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//	@Qualifier("auth-server") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//	private SysUserFeignService sysUserFeignService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private SysUserCashAccountService cashAccountService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private SysUserCashAccountDetailService cashAccountDetailService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private SysUserCashAccountDetailService accountDetailService; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private Lock lock = new ReentrantLock(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Transactional(rollbackFor = Exception.class) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public boolean confirmWithdraw(WithdrawDto withdrawDto) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			SysUser sysUser = sysUserFeignService.queryUserInfo(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			if (Objects.isNull(sysUser)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//				throw new BizException("请重新登录"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lock.lock(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			SysUserCashAccount sysUserCashAccount = cashAccountService.get(withdrawDto.getUserId().intValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (Objects.isNull(sysUserCashAccount)){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("账户不存在!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//校验银行账户余额 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if (sysUserCashAccount.getBalance().compareTo(withdrawDto.getAmount()) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				throw new BizException("余额不足,提现失败!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//第三方提现到用户银行卡 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//用户个人虚拟账户金额减少 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			updateCashAccount(sysUserCashAccount, withdrawDto); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//生成提现记录(缺少银行流水号,交易状态,用户承担的费用,平台承担的费用) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			saveStudentWithdraw(withdrawDto); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} catch (Exception e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			log.error("用户提现出现异常 {}", e.getMessage(), e); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			throw new BizException(e.getMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			lock.unlock(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public PageInfo<WithdrawInfoDto> queryWithdrawPage(CashAccountDetail cashAccountDetail) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		PageInfo<WithdrawInfoDto> result = new PageInfo<>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW.getCode()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		PageInfo<SysUserCashAccountDetail> accountDetailPageInfo = accountDetailService.queryPage(cashAccountDetail); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		List<WithdrawInfoDto> dataList = Lists.newArrayList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		accountDetailPageInfo.getRows().forEach(data ->{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			WithdrawInfoDto withdrawInfoDto = new WithdrawInfoDto(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			StudentWithdraw studentWithdraw = studentWithdrawDao.getByUserId(data.getUserId().longValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setWithdrawId(studentWithdraw.getId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setDateTime(DateUtils.date2ChineseDate(studentWithdraw.getCreateTime())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setAmount(data.getAmount()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setBalance(data.getBalance()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setTransTypeName(TransTypeEnum.getDescriptionByCode(data.getTransType().getCode())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setAccountNo(studentWithdraw.getBankCardNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			withdrawInfoDto.setWithdrawStatus(studentWithdraw.getStatus().getMsg()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			//支付账号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			dataList.add(withdrawInfoDto); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BeanUtils.copyProperties(accountDetailPageInfo, result); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		result.setRows(dataList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 修改用户账户余额,保存账户明细 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param withdrawDto 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void updateCashAccount(SysUserCashAccount sysUserCashAccount, WithdrawDto withdrawDto) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BigDecimal balance = sysUserCashAccount.getBalance().subtract(withdrawDto.getAmount()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SysUserCashAccount account = new SysUserCashAccount(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		account.setUserId(sysUserCashAccount.getUserId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		account.setBalance(balance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		account.setUpdateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountService.update(account); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SysUserCashAccountDetail cashAccountDetail = new SysUserCashAccountDetail(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetail.setUserId(withdrawDto.getUserId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetail.setType(PlatformCashAccountDetailTypeEnum.WITHDRAW); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetail.setAmount(withdrawDto.getAmount()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetail.setBalance(balance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetail.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		cashAccountDetailService.insert(cashAccountDetail); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	/** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 保存提现记录 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 * @param withdrawDto 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	 */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	private void saveStudentWithdraw(WithdrawDto withdrawDto) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		IdWorker idWorker = new IdWorker(0, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		StudentWithdraw studentWithdraw = new StudentWithdraw(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		studentWithdraw.setId(idWorker.nextId()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		studentWithdraw.setUserId(withdrawDto.getUserId().longValue()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		studentWithdraw.setBankCardNo(withdrawDto.getBankCardNo()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		studentWithdraw.setAmount(withdrawDto.getAmount()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		studentWithdraw.setCreateTime(new Date()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		insert(studentWithdraw); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |