package com.stylefeng.guns.modular.system.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.service.impl.ServiceImpl; import com.stylefeng.guns.core.util.DateUtil; import com.stylefeng.guns.core.util.RequestSeqUtil; import com.stylefeng.guns.modular.account.service.UserWithdrawalService; import com.stylefeng.guns.modular.huifu.biz.DouGongWithdrawBiz; import com.stylefeng.guns.modular.huifu.biz.FenZhangUtil; import com.stylefeng.guns.modular.system.dao.UserInfoMapper; import com.stylefeng.guns.modular.system.dao.WithdrawalMapper; import com.stylefeng.guns.modular.system.model.Driver; import com.stylefeng.guns.modular.system.model.UserInfo; import com.stylefeng.guns.modular.system.model.UserWithdrawal; import com.stylefeng.guns.modular.system.model.Withdrawal; import com.stylefeng.guns.modular.system.service.IDriverService; import com.stylefeng.guns.modular.system.service.ISysWithdrawalPoundageService; import com.stylefeng.guns.modular.system.service.IWithdrawalService; import com.stylefeng.guns.modular.system.util.PayMoneyUtil; import com.stylefeng.guns.modular.system.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.*; @Service @Transactional(isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public class WithdrawalServiceImpl extends ServiceImpl implements IWithdrawalService { @Resource private WithdrawalMapper withdrawalMapper; @Resource private UserInfoMapper userInfoMapper; @Autowired private IDriverService driverService; @Autowired private PayMoneyUtil payMoneyUtil; @Autowired private RestTemplate internalRestTemplate; @Autowired private ISysWithdrawalPoundageService sysWithdrawalPoundageService; @Autowired private DouGongWithdrawBiz douGongWithdrawBiz; @Autowired private UserWithdrawalService userWithdrawalService; private Map timerMap = new HashMap<>(); /** * 提现操作 * @param money * @param code * @param name * @param uid * @throws Exception */ @Override public ResultUtil withdrawal(Double money, String bankName, String code, String name, Integer uid, Integer type) throws Exception { if(money.compareTo(0D) <= 0){ return ResultUtil.error("提现金额必须大于0"); } Driver driver = driverService.selectById(uid); if(null == type){ type = 1; } Withdrawal withdrawal = new Withdrawal(); if(type == 1){ if(null == driver.getLaveActivityMoney()){ return ResultUtil.error("账户没有余额,不能提现"); } // if(driver.getLaveActivityMoney().compareTo(money) < 0){ // return ResultUtil.error("提现金额必须小于账户余额"); // } withdrawal.setBalance(driver.getLaveActivityMoney()); } if(type == 2){ if(null == driver.getLaveBusinessMoney()){ return ResultUtil.error("账户没有余额,不能提现"); } if(driver.getLaveBusinessMoney().compareTo(money) < 0){ return ResultUtil.error("提现金额必须小于账户余额"); } withdrawal.setBalance(driver.getLaveBusinessMoney()); } withdrawal.setBankName(bankName); withdrawal.setCode(code); withdrawal.setFlag(1); withdrawal.setInsertTime(new Date()); withdrawal.setMoney(money); withdrawal.setName(name); withdrawal.setState(1); withdrawal.setUserId(uid); withdrawal.setUserType(2); withdrawal.setType(type); withdrawal.setWithdrawalType(1);//线上 withdrawal.setRealGetMoney(money - (money*(sysWithdrawalPoundageService.selectOne(null).getPercentage()/100))); if(type == 1){ double v = new BigDecimal(driver.getLaveActivityMoney()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); driver.setLaveActivityMoney(v); v = new BigDecimal(driver.getBalance()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); driver.setBalance(v); } if(type == 2){ double v = new BigDecimal(driver.getLaveBusinessMoney()).subtract(new BigDecimal(money)).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue(); driver.setLaveBusinessMoney(v); } this.insert(withdrawal); driverService.updateById(driver); return ResultUtil.success(); } /** * 获取历史提交数 * @param uid * @param pageNum * @param size * @return * @throws Exception */ @Override public List> queryWithdrawal(Integer uid, Integer type, Integer pageNum, Integer size) throws Exception { pageNum = (pageNum - 1) * size; return withdrawalMapper.queryWithdrawal(uid, 2, type, pageNum, size); } /** * 提交审核处理 * @param id * @param state * @return * @throws Exception */ @Override public ResultUtil withdrawalAudit(Integer id, Integer state) throws Exception { Withdrawal withdrawal = this.selectById(id); if(withdrawal.getState() == 2){ return ResultUtil.error("申请已审核通过,不能重复提交"); } if(withdrawal.getState() == 3){ return ResultUtil.error("申请已审核拒绝,不能重复提交"); } if(withdrawal.getUserType() == 1){//用户 if(state == 2){//审核拒绝 UserInfo userInfo = userInfoMapper.selectById(withdrawal.getUserId()); userInfo.setBalance(new BigDecimal(userInfo.getBalance()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); userInfoMapper.updateById(userInfo); withdrawal.setState(3); this.updateById(withdrawal); }else{ //调用银行转账申请(客户要求提交申请就成功了,剩下的他们自己处理) Map map = payMoneyUtil.wxPayBank("用户提现", withdrawal.getMoney().toString(), withdrawal.getId().toString(), withdrawal.getCode(), withdrawal.getName(), withdrawal.getBankName()); if("SUCCESS".equals(map.get("return_code"))){ withdrawal.setSerialNo(map.get("payment_no"));//交易序列号 withdrawal.setState(2); this.updateById(withdrawal); }else{ return ResultUtil.error(map.get("err_code_des")); } // TimerTask timerTask = new TimerTask() { // @Override // public void run() { // Integer integer = icbcPayUtil.queryTransfer(withdrawal.getSerialNo()); // if(integer == 0){//交易成功 // withdrawal.setState(2); // WithdrawalServiceImpl.this.updateById(withdrawal); // // Timer timer = timerMap.get(withdrawal.getSerialNo()); // timer.cancel(); // } // if(integer == 2){//交易拒绝/失败 // //还原余额 // if(withdrawal.getUserType() == 1){//用户 // withdrawal.setState(3); // WithdrawalServiceImpl.this.updateById(withdrawal); // // UserInfo userInfo = userInfoMapper.selectById(withdrawal.getUserId()); // userInfo.setBalance(new BigDecimal(userInfo.getBalance()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); // userInfoMapper.updateById(userInfo); // // Timer timer = timerMap.get(withdrawal.getSerialNo()); // timer.cancel(); // } // // } // } // }; // Timer timer = new Timer(); // timer.schedule(timerTask, 1000, 10000);//1秒钟后间隔10秒钟查询交易结果 // timerMap.put(withdrawal.getSerialNo(), timer); } }else{//司机 if(state == 2){//拒绝 Driver driver = driverService.selectById(withdrawal.getUserId()); driver.setBalance(new BigDecimal(driver.getBalance()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driver.setLaveActivityMoney(new BigDecimal(driver.getLaveActivityMoney()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); driverService.updateById(driver); }else{ //调用银行转账申请(客户要求提交申请就成功了,剩下的他们自己处理) Map map = payMoneyUtil.wxPayBank("司机提现", withdrawal.getMoney().toString(), withdrawal.getId().toString(), withdrawal.getCode(), withdrawal.getName(), withdrawal.getBankName()); if("SUCCESS".equals(map.get("return_code"))){ withdrawal.setSerialNo(map.get("payment_no"));//交易序列号 withdrawal.setState(2); this.updateById(withdrawal); }else{ return ResultUtil.error(map.get("err_code_des")); } // TimerTask timerTask = new TimerTask() { // @Override // public void run() { // Integer integer = icbcPayUtil.queryTransfer(withdrawal.getSerialNo()); // if(integer == 0){//交易成功 // withdrawal.setState(2); // WithdrawalServiceImpl.this.updateById(withdrawal); // // Timer timer = timerMap.get(withdrawal.getSerialNo()); // timer.cancel(); // } // if(integer == 2){//交易拒绝/失败 // withdrawal.setState(3); // WithdrawalServiceImpl.this.updateById(withdrawal); // // //还原余额 // Driver driver = driverService.selectById(withdrawal.getUserId()); // driver.setBalance(new BigDecimal(driver.getBalance()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); // driver.setLaveActivityMoney(new BigDecimal(driver.getLaveActivityMoney()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue()); // driverService.updateById(driver); // // Timer timer = timerMap.get(withdrawal.getSerialNo()); // timer.cancel(); // } // } // }; // Timer timer = new Timer(); // timer.schedule(timerTask, 1000, 10000);//1秒钟后间隔10秒钟查询交易结果 // timerMap.put(withdrawal.getSerialNo(), timer); } } return ResultUtil.success(); } @Override public void taskDayFenzhang() throws Exception { List withdrawals = selectList(new EntityWrapper().eq("userType", 2).eq("state", 1).isNotNull("reqSeqId")); if (CollUtil.isNotEmpty(withdrawals)) { for (Withdrawal withdrawal : withdrawals) { Map map = null; try { map = FenZhangUtil.queryFenzhang(withdrawal.getReqSeqId(), DateUtil.format(withdrawal.getInsertTime(), "yyyyMMdd")); } catch (Exception e) { throw new RuntimeException(e); } Driver driver = driverService.selectById(withdrawal.getUserId()); if (Objects.nonNull(driver)) { UserWithdrawal userWithdrawal = userWithdrawalService.selectOne(new EntityWrapper() .eq("phone", driver.getPhone()).eq("type", 1).last("limit 1")); System.out.println("分账定时查询:" + map.toString()); if ("00000000".equals(map.get("resp_code")) && "S".equals(map.get("trans_stat").toString())) { String txReqSeqId = RequestSeqUtil.generate("TX"); withdrawal.setReqSeqId(txReqSeqId); Map tx = douGongWithdrawBiz.encashment(txReqSeqId, BigDecimal.valueOf(withdrawal.getMoney()), userWithdrawal.getHuifuId(), userWithdrawal.getTokenNo(), 2); withdrawal.setHfSeqId(tx.get("huifu_id").toString()); if ("00000000".equals(tx.get("resp_code")) && "S".equals(tx.get("trans_stat"))) { withdrawal.setState(2); this.updateById(withdrawal); } } } } } } }