| 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<String,Object>  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;  | 
|     }  | 
| }  |