package com.panzhihua.service_community.service.impl;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.Date;
|
import java.util.Map;
|
|
import javax.annotation.Resource;
|
|
import com.panzhihua.service_community.entity.SysTemplateConfig;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.panzhihua.common.constants.Constants;
|
import com.panzhihua.common.model.dtos.community.wallet.ComActWalletDetailDTO;
|
import com.panzhihua.common.model.dtos.community.wallet.ComActWalletSettlementAdminDTO;
|
import com.panzhihua.common.model.dtos.community.wallet.PageComActWalletAdminDTO;
|
import com.panzhihua.common.model.dtos.community.wallet.PageComActWalletTradeDTO;
|
import com.panzhihua.common.model.vos.R;
|
import com.panzhihua.common.model.vos.community.wallet.ComActWalletVO;
|
import com.panzhihua.common.utlis.StringUtils;
|
import com.panzhihua.common.utlis.WxUtil;
|
import com.panzhihua.common.utlis.WxXCXTempSend;
|
import com.panzhihua.service_community.dao.*;
|
import com.panzhihua.service_community.model.dos.*;
|
import com.panzhihua.service_community.service.ComActUserWalletChangeService;
|
import com.panzhihua.service_community.service.ComActUserWalletService;
|
import com.panzhihua.service_community.service.ComActUserWalletTradeService;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
/**
|
* @auther lyq
|
* @create 2021-06-25 10:35:11
|
* @describe 用户钱包表服务实现类
|
*/
|
@Slf4j
|
@Service
|
public class ComActUserWalletServiceImpl extends ServiceImpl<ComActUserWalletMapper, ComActUserWalletDO>
|
implements ComActUserWalletService {
|
|
@Resource
|
private ComActEasyPhotoDAO comActEasyPhotoDAO;
|
@Resource
|
private ComActEasyPhotoActivityMapper comActEasyPhotoActivityMapper;
|
@Resource
|
private ComActUserWalletMapper comActUserWalletMapper;
|
@Resource
|
private ComActUserWalletTradeService comActUserWalletTradeService;
|
@Resource
|
private ComActUserWalletChangeService comActUserWalletChangeService;
|
@Resource
|
private ComActEasyPhotoRewardMapper comActEasyPhotoRewardMapper;
|
@Resource
|
private ComActActSignDAO comActActSignDAO;
|
@Resource
|
private ComActDAO comActDAO;
|
@Resource
|
private SysTemplateConfigDao sysTemplateConfigDao;
|
|
/**
|
* 查询用户钱包信息
|
*
|
* @param walletDetailDTO
|
* 请求参数
|
* @return 用户钱包信息
|
*/
|
@Override
|
public R getWallet(ComActWalletDetailDTO walletDetailDTO) {
|
ComActWalletVO comActWalletVO = new ComActWalletVO();
|
// 查询用户钱包
|
ComActUserWalletDO userWalletDO = this.baseMapper.selectOne(new QueryWrapper<ComActUserWalletDO>().lambda()
|
.eq(ComActUserWalletDO::getUserId, walletDetailDTO.getUserId())
|
.eq(ComActUserWalletDO::getCommunityId, walletDetailDTO.getCommunityId()));
|
if (userWalletDO == null) {// 若钱包不存在则新建钱包
|
userWalletDO = new ComActUserWalletDO();
|
userWalletDO.setIncomeAmount(BigDecimal.ZERO);
|
userWalletDO.setAvailableAmount(BigDecimal.ZERO);
|
userWalletDO.setSettlementAmount(BigDecimal.ZERO);
|
userWalletDO.setUserId(walletDetailDTO.getUserId());
|
userWalletDO.setCommunityId(walletDetailDTO.getCommunityId());
|
userWalletDO.setEasyCount(0);
|
userWalletDO.setCreateAt(new Date());
|
this.baseMapper.insert(userWalletDO);
|
}
|
BeanUtils.copyProperties(userWalletDO, comActWalletVO);
|
Map<String, String> resultMap = this.baseMapper.getCommunityName(walletDetailDTO.getCommunityId(), 5);
|
if (resultMap != null && !resultMap.isEmpty()) {
|
comActWalletVO.setCommunityName(resultMap.get("name"));
|
if (StringUtils.isEmpty(resultMap.get("content"))) {
|
this.baseMapper.insertSysAgreement(Constants.PROFIT_EXPLAIN, "收益说明", walletDetailDTO.getCommunityId(),
|
5);
|
comActWalletVO.setAgreement(Constants.PROFIT_EXPLAIN);
|
} else {
|
comActWalletVO.setAgreement(resultMap.get("content"));
|
}
|
} else {
|
this.baseMapper.insertSysAgreement(Constants.PROFIT_EXPLAIN, "收益说明", walletDetailDTO.getCommunityId(), 5);
|
comActWalletVO.setAgreement(Constants.PROFIT_EXPLAIN);
|
}
|
|
Integer easyCount = 0;
|
// 查询用户发布随手拍数量
|
easyCount = comActEasyPhotoDAO.selectCount(new QueryWrapper<ComActEasyPhotoDO>().lambda()
|
.eq(ComActEasyPhotoDO::getSponsorId, walletDetailDTO.getUserId())
|
.eq(ComActEasyPhotoDO::getCommunityId, walletDetailDTO.getCommunityId()));
|
comActWalletVO.setEasyCount(easyCount);
|
|
return R.ok(comActWalletVO);
|
}
|
|
/**
|
* 查询用户绑定的社区收益排行榜
|
*
|
* @param walletTradeDTO
|
* 请求参数
|
* @return 社区收益排行榜
|
*/
|
@Override
|
public R getWalletRanking(PageComActWalletTradeDTO walletTradeDTO) {
|
return R.ok(this.baseMapper
|
.getWalletRanking(new Page(walletTradeDTO.getPageNum(), walletTradeDTO.getPageSize()), walletTradeDTO));
|
}
|
|
/**
|
* 随手拍审核通过给用户添加收益
|
*
|
* @param easyPhotoId
|
* 随手拍id
|
*/
|
@Override
|
public void examineAddMoney(Integer activityType, Long easyPhotoId, Long userId, BigDecimal amount) {
|
|
// 查询随手拍信息
|
ComActEasyPhotoDO easyPhotoDO = comActEasyPhotoDAO.selectById(easyPhotoId);
|
if (easyPhotoDO == null) {
|
log.error("给用户添加收益失败,原因:未查到随手拍记录,随手拍id:" + easyPhotoId);
|
return;
|
}
|
|
if (easyPhotoDO.getActivityId() == null) {// 用户未参加活动,无需添加收益
|
log.error("给用户添加收益失败,原因:用户未参加活动,无需添加收益,随手拍id:" + easyPhotoId);
|
return;
|
}
|
|
// 查询随手拍活动
|
ComActEasyPhotoActivityDO photoActivityDO =
|
comActEasyPhotoActivityMapper.selectById(easyPhotoDO.getActivityId());
|
if (photoActivityDO == null) {
|
log.error("给用户添加收益失败,原因:未查到活动记录,活动id:" + easyPhotoDO.getActivityId());
|
return;
|
}
|
|
// if(photoActivityDO.getStatus() != ComActEasyPhotoActivityDO.status.jxz){
|
// log.error("给用户添加收益失败,原因:活动未在进行中,活动id:" + easyPhotoDO.getActivityId());
|
// return;
|
// }
|
|
// 计算收益
|
if (activityType.equals(ComActEasyPhotoDO.activityType.yz)) {
|
amount = photoActivityDO.getGoodReward();
|
} else if (activityType.equals(ComActEasyPhotoDO.activityType.jl)) {
|
amount = photoActivityDO.getExcellentReward();
|
} else if (activityType.equals(ComActEasyPhotoDO.activityType.pt)) {
|
amount = photoActivityDO.getOrdinaryReward();
|
} else if (activityType.equals(ComActEasyPhotoDO.activityType.yb)) {
|
amount = photoActivityDO.getCommonlyReward();
|
}
|
|
// Date nowDate = new Date();
|
// 查询用户钱包
|
ComActUserWalletDO userWalletDO = comActUserWalletMapper.selectOne(new QueryWrapper<ComActUserWalletDO>()
|
.lambda().eq(ComActUserWalletDO::getUserId, easyPhotoDO.getSponsorId())
|
.eq(ComActUserWalletDO::getCommunityId, easyPhotoDO.getCommunityId()));
|
if (userWalletDO == null) {
|
userWalletDO = new ComActUserWalletDO();
|
userWalletDO.setIncomeAmount(BigDecimal.ZERO);
|
userWalletDO.setAvailableAmount(BigDecimal.ZERO);
|
userWalletDO.setSettlementAmount(BigDecimal.ZERO);
|
userWalletDO.setUserId(easyPhotoDO.getSponsorId());
|
userWalletDO.setCommunityId(easyPhotoDO.getCommunityId());
|
userWalletDO.setEasyCount(0);
|
userWalletDO.setCreateAt(new Date());
|
this.baseMapper.insert(userWalletDO);
|
}
|
|
if (amount.compareTo(BigDecimal.ZERO) == 0) {
|
log.error("此次参加活动的随手拍收益为0,不记录本次交易");
|
return;
|
} else {
|
// 记录钱包变动前金额
|
BigDecimal oldIncomeAmount = userWalletDO.getIncomeAmount();
|
BigDecimal oldAvailableAmount = userWalletDO.getAvailableAmount();
|
BigDecimal oldSettlementAmount = userWalletDO.getSettlementAmount();
|
|
// 更新钱包金额
|
userWalletDO.setIncomeAmount(userWalletDO.getIncomeAmount().add(amount));
|
userWalletDO.setAvailableAmount(userWalletDO.getAvailableAmount().add(amount));
|
comActUserWalletMapper.updateById(userWalletDO);
|
|
// 新增钱包资金交易记录
|
Long tradeId = comActUserWalletTradeService.addWalletTrade(easyPhotoDO.getSponsorId(),
|
easyPhotoDO.getCommunityId(), easyPhotoDO.getId(), amount, ComActUserWalletTradeDO.type.fb,
|
easyPhotoDO.getDetail(), userId, userWalletDO.getId(), ComActUserWalletTradeDO.changeType.add);
|
|
// 新增钱包资金变动记录
|
comActUserWalletChangeService.addWalletChange(easyPhotoDO.getSponsorId(), easyPhotoDO.getCommunityId(),
|
userWalletDO.getId(), oldIncomeAmount, userWalletDO.getIncomeAmount(), oldAvailableAmount,
|
userWalletDO.getAvailableAmount(), oldSettlementAmount, userWalletDO.getSettlementAmount(), tradeId);
|
|
// 查询用户未读奖励金额
|
ComActEasyPhotoRewardDO easyPhotoRewardDO =
|
comActEasyPhotoRewardMapper.selectOne(new QueryWrapper<ComActEasyPhotoRewardDO>().lambda()
|
.eq(ComActEasyPhotoRewardDO::getCommunityId, easyPhotoDO.getCommunityId())
|
.eq(ComActEasyPhotoRewardDO::getUserId, easyPhotoDO.getSponsorId())
|
.eq(ComActEasyPhotoRewardDO::getIsRead, ComActEasyPhotoRewardDO.isRead.no));
|
if (easyPhotoRewardDO == null) {
|
easyPhotoRewardDO = new ComActEasyPhotoRewardDO();
|
easyPhotoRewardDO.setCommunityId(easyPhotoDO.getCommunityId());
|
easyPhotoRewardDO.setUserId(easyPhotoDO.getSponsorId());
|
easyPhotoRewardDO.setIsRead(ComActEasyPhotoRewardDO.isRead.no);
|
easyPhotoRewardDO.setCreateAt(new Date());
|
easyPhotoRewardDO.setAmount(amount);
|
comActEasyPhotoRewardMapper.insert(easyPhotoRewardDO);
|
} else {
|
easyPhotoRewardDO.setAmount(easyPhotoRewardDO.getAmount().add(amount));
|
easyPhotoRewardDO.setUpdateAt(new Date());
|
comActEasyPhotoRewardMapper.updateById(easyPhotoRewardDO);
|
}
|
}
|
// 更新随手拍活动信息
|
easyPhotoDO.setActivityType(activityType);
|
easyPhotoDO.setActivityAmount(amount);
|
comActEasyPhotoDAO.updateById(easyPhotoDO);
|
|
String activityTypeName = "";
|
if (easyPhotoDO.getActivityType().equals(ComActEasyPhotoDO.activityType.yz)) {
|
activityTypeName = "优质";
|
} else if (easyPhotoDO.getActivityType().equals(ComActEasyPhotoDO.activityType.jl)) {
|
activityTypeName = "精良";
|
} else if (easyPhotoDO.getActivityType().equals(ComActEasyPhotoDO.activityType.pt)) {
|
activityTypeName = "普通";
|
} else if (easyPhotoDO.getActivityType().equals(ComActEasyPhotoDO.activityType.yb)) {
|
activityTypeName = "一般";
|
}
|
// 发放奖励以后给用户推送消息
|
Map<String, String> map = comActActSignDAO.getUserOpenId(easyPhotoDO.getSponsorId());
|
if (map != null) {
|
String openid = map.get("openid");
|
ComActDO comActDO=comActDAO.selectById(easyPhotoDO.getCommunityId());
|
SysTemplateConfig sysTemplateConfig=sysTemplateConfigDao.selectOne(new QueryWrapper<SysTemplateConfig>().lambda().eq(SysTemplateConfig::getAreaCode, comActDO.getAreaCode()).eq(SysTemplateConfig::getType,7));
|
WxXCXTempSend util = new WxXCXTempSend();
|
try {
|
WxUtil.sendSubscribeJLDZ(openid, util.getAccessToken(), "随手拍有奖活动",
|
amount.setScale(2, RoundingMode.HALF_UP), activityTypeName,sysTemplateConfig.getTemplateId());
|
} catch (Exception e) {
|
log.error("消息推送失败,失败原因:" + e.getMessage());
|
}
|
}
|
}
|
|
/**
|
* 分页查询收益结算列表
|
*
|
* @param pageWalletAdminDTO
|
* 请求参数
|
* @return 收益结算列表
|
*/
|
@Override
|
public R pageUserWalletAdmin(PageComActWalletAdminDTO pageWalletAdminDTO) {
|
return R.ok(this.baseMapper.getUserWalletList(
|
new Page(pageWalletAdminDTO.getPageNum(), pageWalletAdminDTO.getPageSize()), pageWalletAdminDTO));
|
}
|
|
/**
|
* 用户结算收益
|
*
|
* @param settlementAdminDTO
|
* 请求参数
|
* @return 结算结果
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public R userWalletSettlementAdmin(ComActWalletSettlementAdminDTO settlementAdminDTO) {
|
// 查询用户钱包
|
ComActUserWalletDO userWalletDO = this.baseMapper.selectById(settlementAdminDTO.getId());
|
if (userWalletDO == null) {
|
return R.fail("未查询到用户钱包");
|
}
|
if (userWalletDO.getAvailableAmount().compareTo(settlementAdminDTO.getSettlementAmount()) < 0) {
|
return R.fail("结算金额不能高于钱包可结算金额");
|
}
|
try {
|
BigDecimal oldIncomeAmount = userWalletDO.getIncomeAmount();
|
BigDecimal oldAvailableAmount = userWalletDO.getAvailableAmount();
|
BigDecimal oldSettlementAmount = userWalletDO.getSettlementAmount();
|
userWalletDO.setAvailableAmount(
|
userWalletDO.getAvailableAmount().subtract(settlementAdminDTO.getSettlementAmount()));
|
userWalletDO
|
.setSettlementAmount(userWalletDO.getSettlementAmount().add(settlementAdminDTO.getSettlementAmount()));
|
userWalletDO.setUpdateAt(new Date());
|
this.baseMapper.updateById(userWalletDO);
|
// 添加钱包交易记录
|
Long tradeServiceId = comActUserWalletTradeService.addWalletTrade(userWalletDO.getUserId(),
|
userWalletDO.getCommunityId(), null, settlementAdminDTO.getSettlementAmount(),
|
ComActUserWalletTradeDO.type.js, settlementAdminDTO.getRemark(), settlementAdminDTO.getUserId(),
|
userWalletDO.getId(), ComActUserWalletTradeDO.changeType.reduce);
|
// 添加钱包变动记录
|
comActUserWalletChangeService.addWalletChange(userWalletDO.getUserId(), userWalletDO.getCommunityId(),
|
userWalletDO.getId(), oldIncomeAmount, userWalletDO.getIncomeAmount(), oldAvailableAmount,
|
userWalletDO.getAvailableAmount(), oldSettlementAmount, userWalletDO.getSettlementAmount(),
|
tradeServiceId);
|
|
return R.ok();
|
} catch (Exception e) {
|
log.error("给用户结算收益失败,原因:" + e.getMessage());
|
return R.fail("结算失败");
|
}
|
}
|
|
}
|