package cn.jeesoft.mvc.services;
import java.util.Date;
import org.springframework.stereotype.Service;
import cn.jeesoft.core.exception.DbException;
import cn.jeesoft.core.utils.StringUtils;
import cn.jeesoft.mvc.bean.Balance;
import cn.jeesoft.mvc.bean.BalanceChange;
import cn.jeesoft.mvc.bean.SysTrade;
import cn.jeesoft.mvc.helper.GenerateSN;
import cn.jeesoft.mvc.model.TradeState;
import cn.jeesoft.mvc.model.TradeType;
@Service("tradeBalanceService")
public class TradeBalanceService extends BaseService<BalanceChange> {
/**
* 余额变动完成
* @param sn
* @return
*/
public int finish(String sn) {
BalanceChange change = new BalanceChange();
change.setSn(sn);
return getDao().update(getTablename()+".finish", change);
}
/**
* 扣款
* @param change
* @return
*/
public int deduct(BalanceChange change) {
if (change.getMoney() == 0) {
return 1;
}
SysTrade sys = new SysTrade();
sys.setSn(change.getSn());
sys.setFromId(change.getFromId());
sys.setToId(0);
sys.setMoney(change.getMoney());
sys.setName("扣款"+((double)change.getMoney()/100)+"元");
sys.setCreateTime(change.getCreateTime());
sys.setEndTime(change.getCreateTime());
// sys.setRemark(remark);
sys.setState(TradeState.SUCCESS);
sys.setType(TradeType.WITHDRAW);
sys.setIsInstant(true);
// 创建系统订单
int insertSys = getDao().insert("sys_trade.insert", sys);
if (insertSys <= 0) {
throw new DbException("插入记录失败");
}
// 创建收益订单
change.setIsArrival(true);
int insertChange = insert(change);
if (insertChange <= 0) {
throw new DbException("插入记录失败");
}
// 余额变动(入账)
int changeUpdate = update(change);
if (changeUpdate <= 0) {
throw new DbException("插入记录失败");
}
return 1;
}
/**
* 收益
* @return
*/
public int profit(int usersId, Integer money, String linkSn) {
if (money == null || money == 0) {
return 1;
}
BalanceChange change = new BalanceChange();
change.setFromId(usersId);
change.setCreateTime(new Date());
change.setSn(GenerateSN.create(TradeType.PROFIT));
change.setMoney(money);
change.setIsAdd(true);
change.setLinkSn(linkSn);
change.setIsArrival(true);
SysTrade sys = new SysTrade();
sys.setSn(change.getSn());
sys.setFromId(change.getFromId());
sys.setToId(0);
sys.setMoney(change.getMoney());
sys.setName("收益"+((double)change.getMoney()/100)+"元");
sys.setCreateTime(change.getCreateTime());
sys.setEndTime(change.getCreateTime());
// sys.setRemark(remark);
sys.setState(TradeState.SUCCESS);
sys.setType(TradeType.PROFIT);
sys.setIsInstant(true);
// 创建系统订单
int insertSys = getDao().insert("sys_trade.insert", sys);
if (insertSys <= 0) {
throw new DbException("插入记录失败");
}
// 创建收益订单
change.setIsArrival(true);
int insertChange = insert(change);
if (insertChange <= 0) {
throw new DbException("插入记录失败");
}
// 余额变动(入账)
int changeUpdate = update(change);
if (changeUpdate <= 0) {
throw new DbException("插入记录失败");
}
return 1;
}
/**
* 转账
* @param fromId 付款方
* @param toId 收款方
* @param money 交易金额
* @param fees 手续费
* @param linkSn 关联订单
* @return
*/
public int transfer(int fromId, int toId, int money, int fees, String linkSn) {
if (fromId <= 0 || toId <= 0 || money <= 0 || StringUtils.isEmpty(linkSn)) {
throw new DbException("参数不正确");
}
Date createTime = new Date();
/*
* 扣款
*/
SysTrade sys = new SysTrade();
sys.setSn(GenerateSN.create(TradeType.WITHDRAW));
sys.setFromId(fromId);
sys.setToId(0);
sys.setMoney(money+fees);
sys.setName("扣款"+((money+fees)*0.01)+"元");
sys.setCreateTime(createTime);
sys.setEndTime(createTime);
sys.setState(TradeState.SUCCESS);
sys.setType(TradeType.WITHDRAW);
sys.setIsInstant(true);
// 创建系统订单
int insertSys = getDao().insert("sys_trade.insert", sys);
if (insertSys <= 0) {
throw new DbException("插入记录失败");
}
// 创建扣款订单
BalanceChange change = new BalanceChange();
change.setCreateTime(createTime);
change.setFromId(fromId);
change.setLinkSn(linkSn);
change.setMoney(money+fees);
change.setSn(sys.getSn());
change.setIsAdd(false);
change.setIsArrival(true);
int insertChange = insert(change);
if (insertChange <= 0) {
throw new DbException("插入记录失败");
}
// 余额变动(扣款)
change.setLinkSn(null);
int changeUpdate = update(change);
if (changeUpdate <= 0) {
throw new DbException("插入记录失败");
}
/*
* 入账
*/
sys.setMoney(money);
sys.setFromId(toId);
sys.setToId(0);
sys.setSn(GenerateSN.create(TradeType.RECHARGE));
sys.setName("入账"+(money*0.01)+"元");
sys.setState(TradeState.SUCCESS);
sys.setType(TradeType.RECHARGE);
// 创建系统订单
insertSys = getDao().insert("sys_trade.insert", sys);
if (insertSys <= 0) {
throw new DbException("插入记录失败");
}
// 创建扣款订单
change.setMoney(money);
change.setFromId(toId);
change.setSn(sys.getSn());
change.setLinkSn(linkSn);
change.setIsAdd(true);
insertChange = insert(change);
if (insertChange <= 0) {
throw new DbException("插入记录失败");
}
// 余额变动(扣款)
change.setLinkSn(null);
changeUpdate = update(change);
if (changeUpdate <= 0) {
throw new DbException("插入记录失败");
}
return 1;
}
/**
* 锁定余额(从可用变为不可用)
* @param usersId
* @param money
* @return
*/
public int lockBalance(int usersId, int money) {
if (usersId <= 0 || money <= 0) {
return -1;
}
BalanceChange balance = new BalanceChange();
balance.setFromId(usersId);
balance.setMoney(money);
return getDao().update(getTablename()+".lock", balance);
}
/**
* 释放余额(从不可用变为可用)
* @param usersId
* @param money
* @return
*/
public int releaseBalance(int usersId, int money) {
if (usersId <= 0 || money <= 0) {
return -1;
}
BalanceChange balance = new BalanceChange();
balance.setFromId(usersId);
balance.setMoney(money);
return getDao().update(getTablename()+".release", balance);
}
/**
* 查询余额
* @param usersId
* @return
*/
public Balance queryBalance(Integer usersId) {
if (usersId == null || usersId <= 0) {
return null;
}
Balance balance = new Balance();
balance.setUsersId(usersId);
balance = getDao().selectOne(getTablename()+".queryOne", balance);
return balance;
}
/**
* 查询提现金额
* @param usersId
* @return 提现金额
*/
public Integer queryWithdraw(Integer usersId) {
if (usersId == null || usersId <= 0) {
return null;
}
Balance balance = new Balance();
balance.setUsersId(usersId);
balance = getDao().selectOne(getTablename()+".queryWithdraw", balance);
if (balance != null) {
return balance.getMoney();
}
return 0;
}
@Override
public String getTablename() {
return "trade_balance";
}
}