package com.nq.service.impl; import com.nq.common.lanage.MessageLocaleResolver; import com.nq.dao.UserRechargeMapper; import com.nq.service.*; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.nq.common.ServerResponse; import com.nq.dao.AgentUserMapper; import com.nq.dao.UserCashDetailMapper; import com.nq.dao.UserMapper; import com.nq.pojo.AgentUser; import com.nq.pojo.SiteInfo; import com.nq.pojo.SiteSetting; import com.nq.pojo.User; import com.nq.pojo.UserCashDetail; import com.nq.pojo.UserRecharge; import com.nq.utils.DateTimeUtil; import com.nq.utils.KeyUtils; import com.nq.utils.redis.RedisShardedPoolUtils; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service("iUserRechargeService") public class UserRechargeServiceImpl implements IUserRechargeService { private static final Logger log = LoggerFactory.getLogger(UserRechargeServiceImpl.class); @Resource UserRechargeMapper userRechargeMapper; @Autowired IUserService iUserService; @Resource UserMapper userMapper; @Autowired IAgentUserService iAgentUserService; @Resource AgentUserMapper agentUserMapper; @Autowired ISiteSettingService iSiteSettingService; @Resource UserCashDetailMapper userCashDetailMapper; @Autowired ISiteInfoService iSiteInfoService; public ServerResponse checkInMoney(int maxOrder, Integer userId,HttpServletRequest request) { int count = this.userRechargeMapper.checkInMoney(0, userId); if (count > maxOrder) { return ServerResponse.createByErrorMsg("Can only be initiated within one hour" + maxOrder + "deposit",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createBySuccess(); } public ServerResponse inMoney(String amt, String payType, HttpServletRequest request) { if (StringUtils.isBlank(amt) || StringUtils.isBlank(payType)) { return ServerResponse.createByErrorMsg("The parameter cannot be null",request.getHeader(MessageLocaleResolver.LANG)); } SiteSetting siteSetting = this.iSiteSettingService.getSiteSetting(); if (siteSetting == null) { return ServerResponse.createByErrorMsg("set is not initialized",request.getHeader(MessageLocaleResolver.LANG)); } if ((new BigDecimal(siteSetting.getChargeMinAmt() + "")).compareTo(new BigDecimal(amt)) == 1) { return ServerResponse.createByErrorMsg("The top-up amount shall not be less than" + siteSetting.getChargeMinAmt(),request.getHeader(MessageLocaleResolver.LANG)); } SiteInfo siteInfo = null; ServerResponse serverResponseInfo = this.iSiteInfoService.getInfo(); if (serverResponseInfo.isSuccess()) { siteInfo = (SiteInfo) serverResponseInfo.getData(); /*if (StringUtils.isBlank(siteInfo.getSiteHost()) || StringUtils.isBlank(siteInfo.getSiteEmailTo())) { return ServerResponse.createByErrorMsg("请先设置Host and ToEmail"); }*/ } else { return serverResponseInfo; } User user = this.iUserService.getCurrentRefreshUser(request); if (user.getIsActive().intValue() != 2) { return ServerResponse.createByErrorMsg("Recharge cannot be initiated without real-name authentication",request.getHeader(MessageLocaleResolver.LANG)); } ServerResponse serverResponse = checkInMoney(10, user.getId(),request); if (!serverResponse.isSuccess()) { return serverResponse; } UserRecharge userRecharge = new UserRecharge(); userRecharge.setUserId(user.getId()); userRecharge.setNickName(user.getRealName()); userRecharge.setAgentId(user.getAgentId()); String ordersn = KeyUtils.getRechargeOrderSn(); userRecharge.setOrderSn(ordersn); userRecharge.setPayChannel(payType); userRecharge.setPayAmt(new BigDecimal(amt)); userRecharge.setOrderStatus(Integer.valueOf(0)); userRecharge.setAddTime(new Date()); int insertCount = this.userRechargeMapper.insert(userRecharge); if (insertCount > 0) { String email_token = KeyUtils.getUniqueKey(); String redisSetExResult = RedisShardedPoolUtils.setEx(email_token, email_token, 300); log.info("用户充值,保存redis token成功,redisSetExResult = {}", redisSetExResult); /*SendHTMLMail.send(user, userRecharge, email_token, siteInfo .getSiteHost(), siteInfo.getSiteEmailTo()); log.info("用户充值,发送审核邮件成功");*/ return ServerResponse.createBySuccessMsg("Creating a payment order succeeded!",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createByErrorMsg("Failed to create a payment order",request.getHeader(MessageLocaleResolver.LANG)); } public ServerResponse findUserRechargeByOrderSn(String orderSn,HttpServletRequest request) { UserRecharge userRecharge = this.userRechargeMapper.findUserRechargeByOrderSn(orderSn); if (userRecharge != null) { return ServerResponse.createBySuccess(userRecharge); } return ServerResponse.createByErrorMsg("Recharge order not found",request.getHeader(MessageLocaleResolver.LANG)); } @Transactional public ServerResponse chargeSuccess(UserRecharge userRecharge,HttpServletRequest request) throws Exception { log.info("充值订单 确认成功操作 id = {}", userRecharge.getId()); if (userRecharge.getOrderStatus().intValue() != 0) { return ServerResponse.createByErrorMsg("Order status cannot be modified repeatedly",request.getHeader(MessageLocaleResolver.LANG)); } User user = this.userMapper.selectByPrimaryKey(userRecharge.getUserId()); if (user == null) { return ServerResponse.createByErrorMsg("User does not exist",request.getHeader(MessageLocaleResolver.LANG)); } BigDecimal userAmt_before = user.getUserAmt(); BigDecimal enableAmt_before = user.getEnableAmt(); user.setUserAmt(userAmt_before.add(userRecharge.getPayAmt())); user.setEnableAmt(enableAmt_before.add(userRecharge.getPayAmt())); int updateCount = this.userMapper.updateByPrimaryKeySelective(user); if (updateCount > 0) { log.info("1.修改用户资金成功"); } else { return ServerResponse.createByErrorMsg("Failed, failed to modify user funds",request.getHeader(MessageLocaleResolver.LANG)); } userRecharge.setOrderStatus(Integer.valueOf(1)); userRecharge.setPayTime(new Date()); int updateCCount = this.userRechargeMapper.updateByPrimaryKeySelective(userRecharge); if (updateCCount > 0) { log.info("2.修改订单状态成功"); } else { throw new Exception("2. 修改订单状态失败!"); } UserCashDetail ucd = new UserCashDetail(); ucd.setAgentId(user.getAgentId()); ucd.setAgentName(user.getAgentName()); ucd.setUserId(user.getId()); ucd.setUserName(user.getRealName()); ucd.setDeType("用户充值"); ucd.setDeAmt(userRecharge.getPayAmt()); ucd.setDeSummary("用户充值成功,充值前总金额:" + userAmt_before + ",充值后总金额:" + user.getUserAmt() + ",充值前可用:" + enableAmt_before + ",充值后可用:" + user .getEnableAmt()); ucd.setAddTime(new Date()); ucd.setIsRead(Integer.valueOf(0)); int insertCount = this.userCashDetailMapper.insert(ucd); if (insertCount > 0) { return ServerResponse.createBySuccessMsg("Recharge successful!",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createByErrorMsg("Recharge failed",request.getHeader(MessageLocaleResolver.LANG)); } public ServerResponse chargeFail(UserRecharge userRecharge,HttpServletRequest request) throws Exception { if (userRecharge.getOrderStatus().intValue() != 0) { return ServerResponse.createByErrorMsg("Order status cannot be modified repeatedly",request.getHeader(MessageLocaleResolver.LANG)); } userRecharge.setOrderStatus(Integer.valueOf(2)); int updateCCount = this.userRechargeMapper.updateByPrimaryKeySelective(userRecharge); if (updateCCount > 0) { return ServerResponse.createBySuccessMsg("The order has been modified to fail",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createByErrorMsg("Exception occurred during modification",request.getHeader(MessageLocaleResolver.LANG)); } public ServerResponse chargeCancel(UserRecharge userRecharge,HttpServletRequest request) throws Exception { if (userRecharge.getOrderStatus().intValue() != 0) { return ServerResponse.createByErrorMsg("Order status cannot be modified repeatedly",request.getHeader(MessageLocaleResolver.LANG)); } userRecharge.setOrderStatus(Integer.valueOf(3)); int updateCCount = this.userRechargeMapper.updateByPrimaryKeySelective(userRecharge); if (updateCCount > 0) { return ServerResponse.createBySuccessMsg("Order canceled successfully",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createByErrorMsg("An exception occurred when canceling the order",request.getHeader(MessageLocaleResolver.LANG)); } public ServerResponse findUserChargeList(String payChannel, String orderStatus, HttpServletRequest request, int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); User user = this.iUserService.getCurrentUser(request); List userRecharges = this.userRechargeMapper.findUserChargeList(user.getId(), payChannel, orderStatus); log.info("充值列表,增加用户 {} ,payChannel = {} , orderStatus = {}, 数量 = {}", new Object[]{user.getId(), payChannel, orderStatus, userRecharges.size()}); PageInfo pageInfo = new PageInfo(userRecharges); return ServerResponse.createBySuccess(pageInfo); } public ServerResponse listByAgent(Integer agentId, String realName, String payChannel, Integer state, HttpServletRequest request, int pageNum, int pageSize) { AgentUser currentAgent = this.iAgentUserService.getCurrentAgent(request); if (agentId != null) { AgentUser agentUser = this.agentUserMapper.selectByPrimaryKey(agentId); if (agentUser.getParentId() != currentAgent.getId()) { return ServerResponse.createByErrorMsg("Unable to query non-subordinate agent records",request.getHeader(MessageLocaleResolver.LANG)); } } Integer searchId = null; if (agentId == null) { searchId = currentAgent.getId(); } else { searchId = agentId; } PageHelper.startPage(pageNum, pageSize); List userRecharges = this.userRechargeMapper.listByAgent(searchId, realName, payChannel, state); PageInfo pageInfo = new PageInfo(userRecharges); return ServerResponse.createBySuccess(pageInfo); } public ServerResponse listByAdmin(Integer agentId, Integer userId, String realName, Integer state, String beginTime, String endTime, HttpServletRequest request, int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); Timestamp begin_time = null; if (StringUtils.isNotBlank(beginTime)) { begin_time = DateTimeUtil.searchStrToTimestamp(beginTime); } Timestamp end_time = null; if (StringUtils.isNotBlank(endTime)) { end_time = DateTimeUtil.searchStrToTimestamp(endTime); } List userRecharges = this.userRechargeMapper.listByAdmin(agentId, userId, realName, state, begin_time, end_time); PageInfo pageInfo = new PageInfo(userRecharges); return ServerResponse.createBySuccess(pageInfo); } @Transactional public ServerResponse updateState(Integer chargeId, Integer state,HttpServletRequest request) throws Exception { UserRecharge userRecharge = this.userRechargeMapper.selectByPrimaryKey(chargeId); if (userRecharge == null) { return ServerResponse.createByErrorMsg("The recharge order does not exist",request.getHeader(MessageLocaleResolver.LANG)); } if (userRecharge.getOrderStatus().intValue() != 0) { return ServerResponse.createByErrorMsg("The order status is not the order status and cannot be changed.",request.getHeader(MessageLocaleResolver.LANG)); } if (state.intValue() == 1) { User user = this.userMapper.selectByPrimaryKey(userRecharge.getUserId()); if (user == null) { return ServerResponse.createByErrorMsg("User does not exist",request.getHeader(MessageLocaleResolver.LANG)); } BigDecimal user_amt = user.getUserAmt().add(userRecharge.getPayAmt()); log.info("管理员确认订单成功,增加用户 {} 总资金,原金额 = {} , 增加后 = {}", new Object[]{user.getId(), user.getUserAmt(), user_amt}); user.setUserAmt(user_amt); BigDecimal user_enable_amt = user.getEnableAmt().add(userRecharge.getPayAmt()); log.info("管理员确认订单成功,增加用户 {} 可用资金,原金额 = {} , 增加后 = {}", new Object[]{user.getId(), user.getEnableAmt(), user_enable_amt}); user.setEnableAmt(user_enable_amt); int updateCount = this.userMapper.updateByPrimaryKeySelective(user); if (updateCount > 0) { log.info("修改用户资金成功!"); } else { log.error("修改用户资金出错,抛出异常"); throw new Exception("修改用户资金出错,抛出异常"); } } userRecharge.setOrderStatus(Integer.valueOf((state.intValue() == 1) ? 1 : 2)); userRecharge.setPayTime(new Date()); int updateCount = this.userRechargeMapper.updateByPrimaryKeySelective(userRecharge); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("Order status modified successfully!",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createByErrorMsg("Failed to modify order status!",request.getHeader(MessageLocaleResolver.LANG)); } public ServerResponse createOrder(Integer userId, Integer state, Integer amt, String payChannel,HttpServletRequest request) { if (userId == null || state == null || amt == null) { return ServerResponse.createByErrorMsg("Parameter cannot be empty",request.getHeader(MessageLocaleResolver.LANG)); } User user = this.userMapper.selectByPrimaryKey(userId); if (user == null) { return ServerResponse.createByErrorMsg("User not found",request.getHeader(MessageLocaleResolver.LANG)); } UserRecharge userRecharge = new UserRecharge(); userRecharge.setUserId(user.getId()); userRecharge.setNickName(user.getRealName()); userRecharge.setAgentId(user.getAgentId()); String ordersn = KeyUtils.getRechargeOrderSn(); userRecharge.setOrderSn(ordersn); userRecharge.setPayChannel(payChannel); userRecharge.setPayAmt(new BigDecimal(amt.intValue())); userRecharge.setAddTime(new Date()); userRecharge.setPayTime(new Date()); if (state.intValue() == 0) { userRecharge.setOrderStatus(Integer.valueOf(0)); } else if (state.intValue() == 1) { userRecharge.setOrderSn(payChannel); userRecharge.setPayChannel("2"); userRecharge.setOrderStatus(Integer.valueOf(1)); user.setUserAmt(user.getUserAmt().add(new BigDecimal(amt.intValue()))); user.setEnableAmt(user.getEnableAmt().add(new BigDecimal(amt.intValue()))); this.userMapper.updateByPrimaryKeySelective(user); } else if (state.intValue() == 2) { userRecharge.setOrderStatus(Integer.valueOf(2)); } else { return ServerResponse.createByErrorMsg("Order status is incorrect",request.getHeader(MessageLocaleResolver.LANG)); } int insertCount = this.userRechargeMapper.insert(userRecharge); if (insertCount > 0) { return ServerResponse.createBySuccessMsg("Order generated successfully!",request.getHeader(MessageLocaleResolver.LANG)); } return ServerResponse.createByErrorMsg("Failed to generate order, please try again",request.getHeader(MessageLocaleResolver.LANG)); } public ServerResponse del(Integer cId) { if (cId == null) { return ServerResponse.createByErrorMsg("id不能为空","zh"); } int updateCount = this.userRechargeMapper.deleteByPrimaryKey(cId); if (updateCount > 0) { return ServerResponse.createBySuccessMsg("删除成功","zh"); } return ServerResponse.createByErrorMsg("删除失败","zh"); } public int deleteByUserId(Integer userId) { return this.userRechargeMapper.deleteByUserId(userId); } public BigDecimal CountChargeSumAmt(Integer chargeState) { return this.userRechargeMapper.CountChargeSumAmt(chargeState); } public BigDecimal CountTotalRechargeAmountByTime(Integer chargeState) { return this.userRechargeMapper.CountTotalRechargeAmountByTime(chargeState); } @Override public List exportByAdmin(Integer agentId, Integer userId, String realName, Integer state, String beginTime, String endTime, HttpServletRequest request) { Timestamp begin_time = null; if (StringUtils.isNotBlank(beginTime)) { begin_time = DateTimeUtil.searchStrToTimestamp(beginTime); } Timestamp end_time = null; if (StringUtils.isNotBlank(endTime)) { end_time = DateTimeUtil.searchStrToTimestamp(endTime); } List userRecharges = this.userRechargeMapper.listByAdmin(agentId, userId, realName, state, begin_time, end_time); return userRecharges; } }