package com.stylefeng.guns.modular.system.service.impl;
|
|
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
|
import com.stylefeng.guns.core.util.DateUtil;
|
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.Withdrawal;
|
import com.stylefeng.guns.modular.system.service.IDriverService;
|
import com.stylefeng.guns.modular.system.service.IWithdrawalService;
|
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 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<WithdrawalMapper, Withdrawal> implements IWithdrawalService {
|
|
@Resource
|
private WithdrawalMapper withdrawalMapper;
|
|
@Resource
|
private UserInfoMapper userInfoMapper;
|
|
@Autowired
|
private IDriverService driverService;
|
|
|
|
/**
|
* 提现操作
|
* @param money
|
* @param uid
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil withdrawal(Double money, Integer uid, Integer type, String remark, Integer language) throws Exception {
|
if(money.compareTo(0D) <= 0){
|
return ResultUtil.error(language == 1 ? "提现金额必须大于0" : language == 2 ? "Withdrawal amount must be greater than zero." : "Le montant du retrait doit être supérieur à zéro.");
|
}
|
Driver driver = driverService.selectById(uid);
|
Integer withdrawalRule = driverService.getWithdrawalRule();
|
if(withdrawalRule==null){
|
return ResultUtil.error(language == 1 ? "暂未设置提现时间,请联系平台" : language == 2 ? "Withdrawal time is not set yet, please contact the platform." : "L’heure de retrait n’est pas encore fixée, veuillez contacter la plateforme.");
|
}
|
int weeks = DateUtil.getNowWeekDay();
|
|
if(weeks != withdrawalRule){
|
return ResultUtil.error((language == 1 ? "每周" : language == 2 ? "Apply for withdrawal every " : "Faites une demande de retrait tous les ") +(withdrawalRule==1? (language == 1 ? "一" : language == 2 ? "Monday" : "lundi") :
|
withdrawalRule==2?(language == 1 ? "二" : language == 2 ? "Tuesday" : "mardi"):
|
withdrawalRule==3?(language == 1 ? "三" : language == 2 ? "Wednesday" : "mercredi"):
|
withdrawalRule==4?(language == 1 ? "四" : language == 2 ? "Thursday" : "jeudi"):
|
withdrawalRule==5?(language == 1 ? "五" : language == 2 ? "Friday" : "vendredi"):
|
withdrawalRule==6?(language == 1 ? "六" : language == 2 ? "Saturday" : "samedi"):(language == 1 ? "日" : language == 2 ? "Sunday" : "dimanche")) +
|
(language == 1 ? "统一申请提现,平台统一处理。" : language == 2 ? ", the platform will handle them together." : ", la plateforme les traitera ensemble."));
|
}
|
if(null == type){
|
type = 1;
|
}
|
|
Withdrawal withdrawal = new Withdrawal();
|
if(type == 1){
|
if(null == driver.getLaveActivityMoney()){
|
return ResultUtil.error(language == 1 ? "账户没有余额,不能提现" : language == 2 ? "Insufficient balance, unable to withdraw." : "Solde insuffisant, impossibilité de retirer.");
|
}
|
if(driver.getLaveActivityMoney().compareTo(money) < 0){
|
return ResultUtil.error(language == 1 ? "提现金额必须小于账户余额" : language == 2 ? "Withdrawal amount must be less than account balance." : "Le montant du retrait doit être inférieur au solde du compte.");
|
}
|
withdrawal.setBalance(driver.getLaveActivityMoney());
|
}
|
if(type == 2){
|
if(null == driver.getLaveBusinessMoney()){
|
return ResultUtil.error(language == 1 ? "账户没有余额,不能提现" : language == 2 ? "Insufficient balance, unable to withdraw." : "Solde insuffisant, impossibilité de retirer.");
|
}
|
|
Double money1 = driverService.getThisWeekMoney(uid);
|
Double laveBusinessMoney =driver.getLaveBusinessMoney()-(money1==null?0d:money1);
|
if(laveBusinessMoney.compareTo(money) < 0){
|
return ResultUtil.error(language == 1 ? "提现金额必须小于账户余额" : language == 2 ? "Withdrawal amount must be less than account balance." : "Le montant du retrait doit être inférieur au solde du compte.");
|
}
|
withdrawal.setBalance(driver.getLaveBusinessMoney()-(money1==null?0d:money1));
|
}
|
withdrawal.setCode(driver.getPhone());// TODO: 2023/7/5 第三方支支持手机号提现
|
withdrawal.setBankName(driver.getPhoneOperator());
|
withdrawal.setFlag(1);
|
withdrawal.setInsertTime(new Date());
|
withdrawal.setMoney(money);
|
withdrawal.setName(driver.getFirstName() + " " + driver.getLastName());
|
withdrawal.setState(1);
|
withdrawal.setUserId(uid);
|
withdrawal.setUserType(2);
|
withdrawal.setType(type);
|
withdrawal.setRemark(remark);
|
this.insert(withdrawal);
|
|
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);
|
}
|
driverService.updateById(driver);
|
return ResultUtil.success();
|
}
|
|
|
/**
|
* 获取历史提交数
|
* @param uid
|
* @param pageNum
|
* @param size
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public List<Map<String, Object>> queryWithdrawal(Integer language, Integer uid, Integer type, Integer pageNum, Integer size) throws Exception {
|
pageNum = (pageNum - 1) * size;
|
List<Map<String, Object>> list = withdrawalMapper.queryWithdrawal(uid, 2, type, pageNum, size);
|
for (Map<String, Object> map : list) {
|
if(null != map.get("insertTime")){
|
String insertTime = map.get("insertTime").toString();
|
map.put("insertTime", com.stylefeng.guns.modular.system.util.DateUtil.conversionFormat(language, insertTime));
|
}
|
}
|
return list;
|
}
|
|
|
/**
|
* 提交审核处理
|
* @param id
|
* @param state
|
* @return
|
* @throws Exception
|
*/
|
@Override
|
public ResultUtil withdrawalAudit(Integer id, Integer state, Integer language) throws Exception {
|
Withdrawal withdrawal = this.selectById(id);
|
if(withdrawal.getState() == 2){
|
return ResultUtil.error(language == 1 ? "申请已审核通过,不能重复提交" : language == 2 ? "Application was approved, do not resubmit." : "La demande a été approuvée, ne pas la soumettre à nouveau.");
|
}
|
if(withdrawal.getState() == 3){
|
return ResultUtil.error(language == 1 ? "车牌号已经使用" : language == 2 ? "Plate number is already in use" : "Le numéro de plaque est déjà utilisé");
|
}
|
|
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{
|
//调用银行转账申请(客户要求提交申请就成功了,剩下的他们自己处理)
|
// ResultUtil<String> transfer = icbcPayUtil.transfer(Double.valueOf(withdrawal.getMoney() * 100).longValue(), withdrawal.getCode(), withdrawal.getName());
|
// if(transfer.getCode() == 200){
|
// withdrawal.setSerialNo(transfer.getData());//交易序列号
|
withdrawal.setState(2);
|
this.updateById(withdrawal);
|
// }else{
|
// return transfer;
|
// }
|
|
|
// 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){//拒绝
|
if(withdrawal.getType()==1){
|
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{
|
Driver driver = driverService.selectById(withdrawal.getUserId());
|
driver.setLaveBusinessMoney(new BigDecimal(driver.getLaveBusinessMoney()).add(new BigDecimal(withdrawal.getMoney())).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue());
|
driverService.updateById(driver);
|
}
|
|
|
withdrawal.setState(3);
|
this.updateById(withdrawal);
|
}else{
|
//调用银行转账申请(客户要求提交申请就成功了,剩下的他们自己处理)
|
//ResultUtil<String> transfer = icbcPayUtil.transfer(Double.valueOf(withdrawal.getMoney() * 100).longValue(), withdrawal.getCode(), withdrawal.getName());
|
//if(transfer.getCode() == 200){
|
// withdrawal.setSerialNo(transfer.getData());//交易序列号
|
withdrawal.setState(2);
|
this.updateById(withdrawal);
|
/*}else{
|
return transfer;
|
}*/
|
|
// 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();
|
}
|
}
|