package com.xzx.gc.pay.service; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import com.xzx.gc.common.constant.Constants; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.ExceptionUtils; import com.xzx.gc.common.utils.RedisUtil; import com.xzx.gc.entity.AccountInfo; import com.xzx.gc.entity.AccountLog; import com.xzx.gc.entity.CoreUser; import com.xzx.gc.model.admin.XzxAccountLogModel; import com.xzx.gc.model.comon.account.AllAcountParamDto; import com.xzx.gc.model.user.AccountVo; import com.xzx.gc.order.service.LimitApplyService; import com.xzx.gc.pay.mapper.AccountLogMapper; import com.xzx.gc.pay.mapper.AccountMapper; import com.xzx.gc.service.AccountContext; import com.xzx.gc.util.SessionUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.HashMap; import java.util.Map; @Service @Transactional public class AccountService { @Autowired private AccountMapper accountMapper; @Autowired private AccountLogMapper accountLogMapper; @Autowired private SessionUtil sessionUtil; @Autowired private RedisUtil redisUtil; @Autowired private RestoreLimitService restoreLimitService; @Autowired private LimitApplyService limitApplyService; public void update(AccountInfo accountInfo){ accountMapper.updateByPrimaryKeySelective(accountInfo); } public AccountInfo findByUserId(String userId){ AccountInfo accountInfo=new AccountInfo(); accountInfo.setDelFlag(Constants.DEL_NOT_FLAG); accountInfo.setIsProhibit("0"); accountInfo.setUserId(userId); AccountInfo accountInfo1 = accountMapper.selectOne(accountInfo); return accountInfo1; } public AccountInfo findByUserIdForbidden(String userId){ AccountInfo accountInfo=new AccountInfo(); accountInfo.setDelFlag(Constants.DEL_NOT_FLAG); accountInfo.setUserId(userId); AccountInfo accountInfo1 = accountMapper.selectOne(accountInfo); return accountInfo1; } /** * * @param receiverAccount 操作账户 * @param channelType 操作渠道1:充值 2:提现 3:回收 4入库 5红包 6分享返利 7重量达标返利 * @param channelId 操作ID 如充值 是充值流水号ID * @param channelMoney 操作金额 */ public void addAccount(AccountVo receiverAccount, String channelType, String channelId, String channelMoney){ Map map = new HashMap(); map.put("userId", receiverAccount.getUserId()); String accountId = null; String now= DateUtil.now(); AccountLog accountLog2 = new AccountLog(); accountLog2.setCreateTime(now); accountLog2.setCreateUserId(receiverAccount.getUserId()); accountLog2.setChannelType(Convert.toShort(channelType)); accountLog2.setOrderId(channelId); //额度用完还用了环保金的情况 String storageMoney = channelMoney; int limit = Convert.toInt(receiverAccount.getFixedLimit(),0); String receiverLimit = receiverAccount.getOverdraftLimit(); accountId = receiverAccount.getAccountId(); accountLog2.setAccountId(accountId); String money = receiverAccount.getMoney(); BigDecimal v = NumberUtil.add(Convert.toBigDecimal(storageMoney), Convert.toBigDecimal(receiverLimit,Constants.MONEY_INIT)); //查询账户信息 if (v.compareTo(Convert.toBigDecimal(limit)) > 0) { //将额度填充完 再补money BigDecimal actualMoney = NumberUtil.sub(v, Convert.toBigDecimal(limit)); map.put("money", actualMoney); map.put("limit", Convert.toBigDecimal(limit)); accountLog2.setOldMoney(money); accountLog2.setNewMoney(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(money), Convert.toBigDecimal(actualMoney)))); accountLog2.setOldLimit(Convert.toBigDecimal(receiverLimit,Constants.MONEY_INIT).toString()); accountLog2.setNewLimit(Convert.toStr(limit)); accountLogMapper.insertSelective(accountLog2); accountMapper.updateMoneyAndLimit(map); } else { //直接补额度 map.put("money", Convert.toBigDecimal(storageMoney)); accountLog2.setOldLimit(Convert.toBigDecimal(receiverLimit,Constants.MONEY_INIT).toString()); accountLog2.setNewLimit(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(receiverLimit,Constants.MONEY_INIT), Convert.toBigDecimal(storageMoney)))); accountLogMapper.insertSelective(accountLog2); accountMapper.updateLimitByOrder(map); } } private XzxAccountLogModel getAccountLog(AccountInfo accountInfo,String money){ XzxAccountLogModel model = new XzxAccountLogModel(); model.setOrderId(""); model.setChannelType(9); model.setCreateTime(DateUtil.now()); CoreUser user = sessionUtil.getCurrentUser(); model.setCreateUserId(Long.toString(user.getId())); model.setAccountId(accountInfo.getAccountId()); model.setOldMoney(accountInfo.getMoney()); model.setNewMoney(accountInfo.getMoney()); model.setOldLimit(accountInfo.getOverdraftLimit()); model.setNewLimit(new BigDecimal(accountInfo.getOverdraftLimit()).add(new BigDecimal(money)).toString()); model.setOldFixedLimit(accountInfo.getFixedLimit()); model.setNewFixedLimit(new BigDecimal(accountInfo.getFixedLimit()).add(new BigDecimal(money)).toString()); return model; } public AccountInfo queryById(String accountId) { return accountMapper.selectByPrimaryKey(accountId); } public void updateOverdrawPriceByUserId(String accountId,String money){ //修改账户推送队列 AccountInfo accountInfo = queryById(accountId); XzxAccountLogModel getAccountLog=getAccountLog(accountInfo,money); accountMapper.updateOverdrawPriceByUserId(accountId,money); } /** * 提高额度 * @param userId * @param money */ public void increaseOverdraftLimit(String userId,BigDecimal money,String payOrderId){ if(redisUtil.setnx(Constants.REDIS_USER_KEY+"increaseOverdraftLimit:"+userId,"0")){ try { AllAcountParamDto allAcountParamDto=AllAcountParamDto.builder().type(8).flowNo(payOrderId).userId(userId). money(money).build(); // accountFactory.getService(8).account(allAcountParamDto); new AccountContext(limitApplyService).account(allAcountParamDto); } catch (RestException e){ ExceptionUtils.err(e.getMsg(),e); }catch (Exception e) { ExceptionUtils.err("提升额度失败",e); }finally { redisUtil.del(Constants.REDIS_USER_KEY+"increaseOverdraftLimit:"+userId); } } } /** * 恢复固定额度 * @param userId */ public void restoreFix(String userId,String payOrderId,String auditUserType){ if(redisUtil.setnx(Constants.REDIS_USER_KEY+"restoreFix:"+userId,"0")){ try { AllAcountParamDto allAcountParamDto=AllAcountParamDto.builder().type(1).flowNo(payOrderId) .userId(userId).userRealType(auditUserType).build(); // accountFactory.getService(1).account(allAcountParamDto); new AccountContext(restoreLimitService).account(allAcountParamDto); }catch (RestException e){ ExceptionUtils.err(e.getMsg(),e); }catch (Exception e) { ExceptionUtils.err("恢复额度失败",e); }finally { redisUtil.del(Constants.REDIS_USER_KEY+"restoreFix:"+userId); } } } }