package cn.jeesoft.mvc.action.app; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import cn.jeesoft.core.interceptor.Before; import cn.jeesoft.core.model.PagerModel; import cn.jeesoft.core.utils.JsonUtils; import cn.jeesoft.core.utils.ResponseUtils; import cn.jeesoft.core.utils.StringUtils; import cn.jeesoft.interceptor.UsersLoginInterceptor; import cn.jeesoft.interceptor.UsersOrAdminLoginInterceptor; import cn.jeesoft.mvc.Config; import cn.jeesoft.mvc.bean.Balance; import cn.jeesoft.mvc.bean.BalanceChange; import cn.jeesoft.mvc.bean.SysTrade; import cn.jeesoft.mvc.bean.Users; import cn.jeesoft.mvc.bean.UsersAuth; import cn.jeesoft.mvc.helper.GenerateSN; import cn.jeesoft.mvc.helper.LoginUserHolder; import cn.jeesoft.mvc.model.PayType; import cn.jeesoft.mvc.model.ResultCode; import cn.jeesoft.mvc.model.TradeState; import cn.jeesoft.mvc.model.TradeType; import cn.jeesoft.mvc.services.TradeBalanceService; import cn.jeesoft.mvc.services.UsersAuthService; import com.alibaba.fastjson.JSONObject; /** * 用户余额 * @author king */ @RestController("app.balance") @RequestMapping("app/balance") @Before(UsersLoginInterceptor.class) public class BalanceAction extends BaseTradeAction { static class MPagerModel extends PagerModel<BalanceChange, BalanceChange> { } @Autowired private TradeBalanceService tradeBalanceService; @Autowired private UsersAuthService usersAuthService; /** * 创建订单(充值or提现) * 参数:{type}[充值或取现]、money[交易金额]、payType[充值方式]、linkSn[关联订单]、remark[备注] */ @ResponseBody @RequestMapping(value="insert/{type}.do", method=RequestMethod.POST) public String insert(HttpServletRequest request, SysTrade sys, BalanceChange change, @PathVariable String type) { if (StringUtils.isEmpty(type)) { return toFailure(ResultCode.ERROE_PARAMETER, "无效的接口"); } // 关联订单处理 if (!StringUtils.isEmpty(change.getLinkSn())) { BalanceChange queryChange = new BalanceChange(); queryChange.setIsAdd(true); queryChange.setFromId(sys.getFromId()); queryChange.setLinkSn(change.getLinkSn()); // 判断是否重复提交 queryChange = tradeBalanceService.selectOne(change); if (queryChange != null) { return toSuccess(queryChange); } SysTrade querySysTrade = new SysTrade(); querySysTrade.setSn(change.getLinkSn()); // 判断关联订单是否存在 querySysTrade = getService().selectOne(querySysTrade); if (querySysTrade != null) { // 充值金额=交易金额+手续费 sys.setMoney(querySysTrade.getMoney() + querySysTrade.getFeesMoney()); } else { return toFailure(ResultCode.ERROE_PARAMETER, "不存在的订单"); } } Integer usersId = LoginUserHolder.getLoginUser().getId(); TradeType tradeType = null; String sn = null; String name = null; Integer fees = null; if (TradeType.RECHARGE.name().equalsIgnoreCase(type)) { // 充值金额范围 if (sys.getMoney()==null || sys.getMoney()<Config.MIN_MONEY_RECHARGE || sys.getMoney()>Config.MAX_MONEY_RECHARGE) { return toFailure(ResultCode.ERROE_PARAMETER, "无效的金额"); } // 充值 tradeType = TradeType.RECHARGE; sn = GenerateSN.create(TradeType.RECHARGE); name = "余额充值"+((double)sys.getMoney()*0.01)+"元"; // 根据支付方式,计算费率 if (sys.getPayType() == null || sys.getPayType() == PayType.BALANCE || sys.getPayType() == PayType.UNKNOWN) { return toFailure(ResultCode.ERROE_PARAMETER, "请选择正确的支付方式"); } else { // 如果有关联订单,则手续费另计;无关联订单,则手续费从充值金额扣除 if (!StringUtils.isEmpty(change.getLinkSn())) { // TODO 充值金额*费率=手续费,充值金额=交易金额 fees = profitService.getHelper().getPayFees(getLoginUserId(), sys.getMoney(), sys.getPayType()); sys.setMoney(sys.getMoney()); } else { // TODO 交易金额*费率=手续费,充值金额=交易金额-手续费 fees = profitService.getHelper().getPayFees(getLoginUserId(), sys.getMoney(), sys.getPayType()); sys.setMoney(sys.getMoney() - fees); } } } else if (TradeType.WITHDRAW.name().equalsIgnoreCase(type)) { // 取现 tradeType = TradeType.WITHDRAW; sn = GenerateSN.create(TradeType.WITHDRAW); name = "提现"+((double)sys.getMoney()/100)+"元"; fees = profitService.getHelper().getWithdraw(usersId); sys.setMoney(sys.getMoney() - fees); // 最低取现金额 if (sys.getMoney()==null || sys.getMoney()<Config.MIN_MONEY_WITHDRAW) { return toFailure(ResultCode.ERROE_PARAMETER, "无效的金额"); } UsersAuth auth = new UsersAuth(); auth.setUsersId(usersId); auth = usersAuthService.selectOne(auth); sys.setRemark(auth.getBankInfo().toJSONString()); Balance balance = tradeBalanceService.queryBalance(usersId); // 可用余额不足以取现 if (balance == null) { return toFailure(ResultCode.FAILURE, "余额查询失败,无法申请提现"); } else if (balance.getMoney() < sys.getMoney()+fees) { // 可用余额不足以取现 return toFailure(ResultCode.FAILURE, "可用余额不足,无法提现"); } else { // 锁定余额 int updateLock = tradeBalanceService.lockBalance(usersId, sys.getMoney()+fees); if (updateLock <= 0) { return toFailure(ResultCode.FAILURE, "扣款失败,无法申请提现"); } } } if (tradeType != null) { sys.setSn(sn); sys.setType(tradeType); sys.setName(name); sys.setFeesMoney(fees); sys.setFromId(LoginUserHolder.getLoginUser().getId()); sys.setToId(0); sys.setState(TradeState.CREATED); sys.setCreateTime(new Date()); sys.setIsInstant(true); // 执行创建 return doInsert(sys, change, tradeType); } return toFailure(ResultCode.ERROE_PARAMETER, "无效的接口"); } private String doInsert(SysTrade sys, BalanceChange change, TradeType type) { if (isEmptyBean(sys)) { return toFailure(ResultCode.ERROE_PARAMETER, "参数不正确"); } // 创建交易记录 int sysId = getService().insert(sys); if (sysId <= 0) { return toFailure(ResultCode.FAILURE, "创建订单失败"); } else { sys.setId(sysId); } change.setFromId(sys.getFromId()); change.setCreateTime(sys.getCreateTime()); change.setIsAdd(type == TradeType.RECHARGE); change.setMoney(sys.getMoney()); change.setSn(sys.getSn()); // 用户充值记录 int callId = tradeBalanceService.insert(change); if (callId <= 0) { setTransactionRollback(); return toFailure(ResultCode.FAILURE, "创建订单失败"); } else { change.setId(callId); return toSuccess(sys); } } /** * 完成支付 * 参数:sn、payType、paySn */ @ResponseBody @RequestMapping(value = "payoff", method = RequestMethod.POST) public String update(HttpServletRequest request, SysTrade sys) { SysTrade sysTemp = new SysTrade(); sysTemp.setSn(sys.getSn()); sysTemp = getService().selectOne(sysTemp); if (sysTemp == null) { return toFailure(ResultCode.ERROE_PARAMETER, "订单不存在"); } else if (sysTemp.getState() == TradeState.SUCCESS) { return toFailure(ResultCode.ERROE_PARAMETER, "已完成的订单"); } sysTemp.setId(sys.getId()); sysTemp.setSn(sys.getSn()); sysTemp.setState(TradeState.PAYOFF); sysTemp.setEndTime(new Date()); sysTemp.setPayType(sys.getPayType()); sysTemp.setPaySn(sys.getPaySn()); // 完成支付,更新交易记录 int sysId = getService().update(sysTemp); if (sysId <= 0) { return toFailure(ResultCode.FAILURE, "更新订单失败,请联系管理员补单"); } else { return toSuccess("支付成功,订单已完成"); } } /** * 提现完成 * @param sysTrade 【sn\paySn\payType】 * @return */ @Before(UsersOrAdminLoginInterceptor.class) @ResponseBody @RequestMapping(value="withdraw") public String withdraw(SysTrade sysTrade) { if (sysTrade.getState() == null) { return toFailure(ResultCode.ERROE_PARAMETER, "参数不正确"); } if (sysTrade.getState() != TradeState.SUCCESS && sysTrade.getState() != TradeState.FAILED) { System.out.println(sysTrade.getState()); return toFailure(ResultCode.ERROE_PARAMETER, "参数不正确"); } // 查询该订单 BalanceChange change = new BalanceChange(); change.setSn(sysTrade.getSn()); change = tradeBalanceService.selectOne(change); if (change != null) { // 更新订单为到账 SysTrade sys = new SysTrade(); sys.setSn(sysTrade.getSn()); sys = getService().selectOne(sys); if (sys == null) { return toFailure(ResultCode.FAILURE, "订单号找不到"); } else { if (sys.getState() == TradeState.SUCCESS || sys.getState() == TradeState.FAILED) { // 已处理的订单 return ResponseUtils.toSuccess(); } else { // 未处理的订单 sys.setState(sysTrade.getState()); sys.setType(null); if (sysTrade.getState() == TradeState.SUCCESS) { sys.setPaySn(sysTrade.getPaySn()); sys.setPayType(PayType.BALANCE); } sys.setEndTime(new Date()); // 执行更新 int sysUpdate = getService().finish(sys); if (sysUpdate > 0) { change.setMoney(sys.getMoney() + sys.getFeesMoney()); // 变动金额=交易金额+手续费 int changeUpdate; if (sys.getState()==TradeState.SUCCESS) { // 扣除余额:从锁定余额扣除 change.setLinkSn("0000"); // 从锁定余额中扣款 changeUpdate = tradeBalanceService.update(change); } else { // 是否锁定余额:从锁定余额变为可用余额 changeUpdate = tradeBalanceService.releaseBalance(change.getFromId(), change.getMoney()); } if (changeUpdate > 0) { int finish = tradeBalanceService.finish(change.getSn()); System.out.println("更新余额变动状态:"+finish); return ResponseUtils.toSuccess(); } } } } } return toFailure(ResultCode.FAILURE, "处理失败"); } @ResponseBody @RequestMapping("selectList") public String selectList(HttpServletRequest request, BalanceChange bean) { bean.setFromId(LoginUserHolder.getLoginUser().getId()); return toSuccess(tradeBalanceService.selectList(bean)); } @Before(UsersOrAdminLoginInterceptor.class) @ResponseBody @RequestMapping("queryOne") public String queryOne(HttpServletRequest request, Users users) { if (users != null && users.getId() != null && users.getId() > 0) { Balance balance = tradeBalanceService.queryBalance(users.getId()); JSONObject json = (JSONObject) JsonUtils.toJson(balance); json.put("withdrawMoney", tradeBalanceService.queryWithdraw(users.getId())); return toSuccess(json); } else { return toFailure(ResultCode.ERROE_PARAMETER, "用户ID不正确"); } } }