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 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().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 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().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() .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().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 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().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("结算失败"); } } }