package com.xzx.gc.order.service; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.json.JSONUtil; import com.xzx.gc.common.constant.*; import com.xzx.gc.common.exception.RestException; import com.xzx.gc.common.utils.BusinessUtil; import com.xzx.gc.common.utils.IdUtils; import com.xzx.gc.entity.AccountInfo; import com.xzx.gc.entity.AccountLog; import com.xzx.gc.entity.RedPaper; import com.xzx.gc.entity.SysMessage; import com.xzx.gc.model.comon.account.AllAcountParamDto; import com.xzx.gc.order.mapper.*; import com.xzx.gc.service.BaseAccountService; import lombok.extern.slf4j.Slf4j; 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 @Slf4j public class RedpaperRebateService extends BaseAccountService { @Autowired private RedPaperRuleService redPaperRuleService; @Autowired private AccountService accountService; @Autowired private BusinessUtil businessUtil; @Autowired private PayInfoMapper payInfoMapper; @Autowired private SysMessageMapper sysMessageMapper; @Autowired private AccountLogMapper accountLogMapper; @Autowired private IdUtils idUtils; @Autowired private RedPaperMapper redPaperMapper; @Override public Object account(AllAcountParamDto allAcountParamDto) { String now=DateUtil.now(); //判断红包已被领取 RedPaper redPaper3=new RedPaper(); redPaper3.setRuleId(Convert.toInt(allAcountParamDto.getRuleId())); redPaper3.setReceiveUserId(allAcountParamDto.getUserId()); int i = redPaperMapper.selectCount(redPaper3); if(i>0){ throw new RestException(-1,"红包已被领取"); } RedPaper redPaper = redPaperMapper.getOne(Convert.toInt(allAcountParamDto.getRuleId())); if(redPaper==null||redPaper.getMoney()==null||redPaper.getMoney().compareTo(BigDecimal.ZERO)==0){ throw new RestException(-1,"红包已被领完"); } boolean isvalid = redPaperRuleService.isvalid(Convert.toInt(allAcountParamDto.getRuleId())); if(!isvalid){ throw new RestException(-1,"红包已失效"); } //添加账户记录 AccountInfo accountInfo1 = accountService.findByUserId(allAcountParamDto.getUserId()); if(accountInfo1==null){ throw new RestException(-3,"账户不存在"); } allAcountParamDto.setAccountId(accountInfo1.getAccountId()); allAcountParamDto.setOldMoney(Convert.toBigDecimal(accountInfo1.getMoney(),Constants.MONEY_INIT)); allAcountParamDto.setMoney(redPaper.getMoney()); allAcountParamDto.setFlowNo(redPaper.getId().toString()); log.debug("准备进行领取红包操作:{}",JSONUtil.toJsonPrettyStr(allAcountParamDto)); //合伙人扣钱(在红包生成后已经在后台扣除了),用户加钱 String payOrderId=idUtils.generate("ZF",0); AccountLog accountLog=new AccountLog(); accountLog.setCreateTime(now); accountLog.setAccountId(allAcountParamDto.getAccountId()); accountLog.setOldMoney(allAcountParamDto.getOldMoney().toString()); String newMoney=businessUtil.changeMoney(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(accountLog.getOldMoney()),allAcountParamDto.getMoney()))); accountLog.setNewMoney(newMoney); accountLog.setCreateUserId(allAcountParamDto.getUserId()); accountLog.setChannelType(Convert.toShort(CommonEnum.领取红包操作.getValue())); accountLog.setOrderId(payOrderId); accountLogMapper.insertSelective(accountLog); //更新账户余额 AccountInfo accountInfo2=new AccountInfo(); accountInfo2.setAccountId(allAcountParamDto.getAccountId()); accountInfo2.setMoney(newMoney); accountInfo2.setUpdateTime(DateUtil.now()); accountService.update(accountInfo2); //更新红包领取状态 RedPaper redPaper2=new RedPaper(); redPaper2.setId(Convert.toInt(allAcountParamDto.getFlowNo())); redPaper2.setReceiveFlag(Convert.toShort(OrderEnum.已领取红包.getValue())); redPaper2.setReceiveTime(now); redPaper2.setReceiveUserId(allAcountParamDto.getUserId()); redPaperMapper.updateByPrimaryKeySelective(redPaper2); //添加操作记录 我的环保金明细展示 Map payMap = new HashMap(); payMap.put("payOrderId",payOrderId); payMap.put("orderId",allAcountParamDto.getFlowNo()); payMap.put("createUserId",allAcountParamDto.getUserId()); payMap.put("money",allAcountParamDto.getMoney()); payMap.put("accountId",allAcountParamDto.getAccountId()); payMap.put("payType", PayEnum.红包.getValue()); payMap.put("status",PayEnum.已支付.getValue()); payMap.put("createTime",now); payInfoMapper.payInfoAdd(payMap); //消息记录 SysMessage sysMessage = new SysMessage(); sysMessage.setCreateTime(now); sysMessage.setCreateUserId(allAcountParamDto.getUserId()); sysMessage.setFlag(SysEnum.未读.getValue()); sysMessage.setMessage("您收到红包" + allAcountParamDto.getMoney().toString() + "元"); sysMessage.setMessageSubTypeName("红包"); sysMessage.setMessageType(SysEnum.红包.getValue()); sysMessage.setUserId(allAcountParamDto.getUserId()); sysMessageMapper.insertSelective(sysMessage); log.debug("领取红包操作已完成:用户:{},金额:{}",allAcountParamDto.getUserId(),allAcountParamDto.getMoney().toString()); return redPaper; } }