package com.panzhihua.service_community.service.impl;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.panzhihua.common.model.dtos.community.integral.ComActIntegralCommunityRankDTO;
|
import com.panzhihua.common.model.dtos.community.integral.ComActIntegralCountDTO;
|
import com.panzhihua.common.model.dtos.community.integral.admin.AddComActIntegralUserDTO;
|
import com.panzhihua.common.model.dtos.community.integral.admin.PageComActIntegralTradeDTO;
|
import com.panzhihua.common.model.vos.R;
|
import com.panzhihua.common.model.vos.community.integral.ComActIntegralUserRuleVO;
|
import com.panzhihua.common.model.vos.community.integral.admin.ComActIntegralUserTradeAdminVO;
|
import com.panzhihua.common.model.vos.community.integral.admin.IntegralUserVO;
|
import com.panzhihua.common.utlis.DateUtils;
|
import com.panzhihua.common.utlis.Snowflake;
|
import com.panzhihua.service_community.dao.ComActDiscussDAO;
|
import com.panzhihua.service_community.dao.ComActIntegralUserTradeMapper;
|
import com.panzhihua.service_community.dao.ComActQuestnaireDAO;
|
import com.panzhihua.service_community.model.dos.*;
|
import com.panzhihua.service_community.service.*;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
|
/**
|
* @auther lyq
|
* @create 2021-07-28 16:03:18
|
* @describe 用户积分账户交易记录服务实现类
|
*/
|
@Slf4j
|
@Service
|
public class ComActIntegralUserTradeServiceImpl extends ServiceImpl<ComActIntegralUserTradeMapper, ComActIntegralUserTradeDO> implements ComActIntegralUserTradeService {
|
|
@Resource
|
private ComActIntegralRuleService comActIntegralRuleService;
|
@Resource
|
private ComActIntegralUserService comActIntegralUserService;
|
@Resource
|
private ComActQuestnaireDAO comActQuestnaireDAO;
|
@Resource
|
private ComActIntegralUserChangeService comActIntegralUserChangeService;
|
@Resource
|
private ComActEasyPhotoService comActEasyPhotoService;
|
@Resource
|
private ComActMicroWishService comActMicroWishService;
|
@Resource
|
private ComActDiscussDAO comActDiscussDAO;
|
@Resource
|
private ComActDiscussOptionService comActDiscussOptionService;
|
@Resource
|
private ComActActivityService comActActivityService;
|
|
/**
|
* 查询用户某个时间段交易数量
|
* @param integralCountDTO 请求参数
|
* @return 交易数量
|
*/
|
@Override
|
public Integer getIntegralCount(ComActIntegralCountDTO integralCountDTO){
|
return this.baseMapper.getIntegralCount(integralCountDTO);
|
}
|
|
/**
|
* 添加用户积分交易记录
|
* @param userId 用户id
|
* @param integralId 积分账户id
|
* @param communityId 社区id
|
* @param serviceId 交易业务id
|
* @param serviceType 交易业务类型(1.发布随手拍 2.发布微心愿 3.参与议事投票 4.参与志愿者活动 5.参与社区活动 6.参与党员活动 7.参与调查问卷)
|
* @param amount 交易积分数量
|
* @param changeType 变动类型(1.增加 2.减少)
|
* @param remark 交易备注
|
* @param identityType 交易身份类型(1.居民 2.党员 3.志愿者)
|
* @param createBy 操作人id
|
*/
|
@Override
|
public Long addIntegralTradeRecord(Long userId,Long integralId,Long communityId,Long serviceId
|
,Integer serviceType,Integer amount,Integer changeType,String remark,Integer identityType,Long createBy){
|
ComActIntegralUserTradeDO integralUserTradeDO = new ComActIntegralUserTradeDO();
|
integralUserTradeDO.setId(Snowflake.getId());
|
integralUserTradeDO.setUserId(userId);
|
integralUserTradeDO.setIntegralId(integralId);
|
integralUserTradeDO.setCommunityId(communityId);
|
integralUserTradeDO.setServiceId(serviceId);
|
integralUserTradeDO.setServiceType(serviceType);
|
integralUserTradeDO.setAmount(amount);
|
integralUserTradeDO.setChangeType(changeType);
|
integralUserTradeDO.setRemark(remark);
|
integralUserTradeDO.setIdentityType(identityType);
|
integralUserTradeDO.setCreateBy(createBy);
|
integralUserTradeDO.setCreateAt(new Date());
|
this.baseMapper.insert(integralUserTradeDO);
|
return integralUserTradeDO.getId();
|
}
|
|
/**
|
* 小程序-查询用户社区积分明细
|
* @param communityTradeDTO 请求参数
|
* @return 用户社区积分明细
|
*/
|
@Override
|
public R getIntegralCommunityTradeApplets(ComActIntegralCommunityRankDTO communityTradeDTO){
|
if(communityTradeDTO.getType().equals(ComActIntegralCommunityRankDTO.type.resident)){
|
communityTradeDTO.setIdentityType(ComActIntegralCommunityRankDTO.type.resident);
|
}else if(communityTradeDTO.getType().equals(ComActIntegralCommunityRankDTO.type.party)){
|
communityTradeDTO.setIdentityType(ComActIntegralCommunityRankDTO.type.party);
|
}else if(communityTradeDTO.getType().equals(ComActIntegralCommunityRankDTO.type.volunteer)){
|
communityTradeDTO.setIdentityType(ComActIntegralCommunityRankDTO.type.volunteer);
|
}
|
return R.ok(this.baseMapper.getIntegralCommunityTradeApplets(new Page(communityTradeDTO.getPageNum(),communityTradeDTO.getPageSize()),communityTradeDTO));
|
}
|
|
/**
|
* 社区后台-分页查询社区下积分明细记录
|
* @param integralRuleDTO 请求参数
|
* @return 社区下积分明细记录
|
*/
|
@Override
|
public R getIntegralTradeListAdmin(PageComActIntegralTradeDTO integralRuleDTO){
|
IPage<ComActIntegralUserTradeAdminVO> userTradeAdminIPage = this.baseMapper.getIntegralTradeListAdmin(new Page(integralRuleDTO.getPageNum(),integralRuleDTO.getPageSize()),integralRuleDTO);
|
if(!userTradeAdminIPage.getRecords().isEmpty()){
|
userTradeAdminIPage.getRecords().forEach(userTrade -> {
|
StringBuilder sb = new StringBuilder();
|
sb.append("居民");
|
if(userTrade.getIsVolunteer().equals(ComActIntegralUserTradeAdminVO.isVolunteer.yes)){
|
sb.append(",志愿者");
|
}
|
if(userTrade.getIsPartymember().equals(ComActIntegralUserTradeAdminVO.isPartymember.yes)){
|
sb.append(",党员");
|
}
|
userTrade.setIdentity(sb.toString());
|
});
|
}
|
return R.ok(userTradeAdminIPage);
|
}
|
|
/**
|
* 给用户添加积分
|
* @param integralUserDTO 请求参数
|
* @return 添加积分结果
|
*/
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public R addIntegralTradeAdmin(AddComActIntegralUserDTO integralUserDTO){
|
//判断增加积分类型 积分任务类型(1.发布随手拍 2.发布微心愿 3.参与议事投票 4.参与志愿者活动 5.参与社区活动 6.参与党员活动 7.参与调查问卷)
|
Integer type = integralUserDTO.getIntegralType();
|
//业务id
|
Long serviceId = integralUserDTO.getServiceId();
|
//用户id
|
Long userId = integralUserDTO.getUserId();
|
//社区id
|
Long communityId = integralUserDTO.getCommunityId();
|
//需要给用户增加的积分数量
|
Integer amount = 0;
|
//用户增加积分的身份
|
Integer identityType = 1;
|
//用户交易备注
|
StringBuilder remark = new StringBuilder();
|
//当前时间
|
Date nowDate = new Date();
|
|
//查询随手拍增加积分数量
|
ComActIntegralRuleDO integralRuleDO = comActIntegralRuleService.getOne(new QueryWrapper<ComActIntegralRuleDO>().lambda()
|
.eq(ComActIntegralRuleDO::getIntegralType,type)
|
.eq(ComActIntegralRuleDO::getCommunityId,communityId));
|
if(integralRuleDO == null){
|
log.error("未查询到该社区积分规则,社区id:" + communityId);
|
return R.fail("未查询到该社区积分规则,社区id:" + communityId);
|
}
|
//判断规则是否有次数限制
|
if(integralRuleDO.getIsRestrict().equals(ComActIntegralRuleDO.isRestrict.yes)){
|
Integer count = this.baseMapper.getIntegralCount(getIntegralCountDTO(integralRuleDO.getType(),userId,communityId,integralRuleDO.getIntegralType()));
|
if(count >= integralRuleDO.getCount()){
|
log.error("该用户参加任务次数已达上限");
|
return R.fail("该用户参加任务次数已达上限");
|
}
|
}
|
amount = integralRuleDO.getAmount();
|
|
switch (type){
|
case 1:
|
remark.append("发布随手拍奖励积分");
|
ComActEasyPhotoDO easyPhotoDO = comActEasyPhotoService.getById(serviceId);
|
if(easyPhotoDO != null){
|
remark.append("【");
|
remark.append(easyPhotoDO.getDetail());
|
remark.append("】");
|
}
|
break;
|
case 2:
|
remark.append("发布微心愿奖励积分");
|
ComActMicroWishDO microWishDO = comActMicroWishService.getById(serviceId);
|
if(microWishDO != null){
|
remark.append("【");
|
remark.append(microWishDO.getWishName());
|
remark.append("】");
|
}
|
break;
|
case 3:
|
remark.append("参与议事投票奖励积分");
|
if(integralUserDTO.getIsComment().equals(1)){
|
ComActDiscussDO discussDO = comActDiscussDAO.selectById(serviceId);
|
if(discussDO != null){
|
remark.append("【");
|
remark.append(discussDO.getVoteTitle());
|
remark.append("】");
|
}
|
}else{
|
ComActDiscussOptionDO discussOptionDO = comActDiscussOptionService.getById(serviceId);
|
if(discussOptionDO != null){
|
ComActDiscussDO discussDO = comActDiscussDAO.selectById(discussOptionDO.getDiscussId());
|
if(discussDO != null){
|
remark.append("【");
|
remark.append(discussDO.getVoteTitle());
|
remark.append("】");
|
}
|
}
|
}
|
break;
|
case 4:
|
identityType = 3;
|
remark.append("参与志愿者活动奖励积分");
|
ComActActivityDO actActivityZYZDO = comActActivityService.getById(serviceId);
|
if(actActivityZYZDO != null){
|
remark.append("【");
|
remark.append(actActivityZYZDO.getActivityName());
|
remark.append("】");
|
}
|
break;
|
case 5:
|
remark.append("参与社区活动奖励积分");
|
ComActActivityDO actActivityDO = comActActivityService.getById(serviceId);
|
if(actActivityDO != null){
|
remark.append("【");
|
remark.append(actActivityDO.getActivityName());
|
remark.append("】");
|
}
|
break;
|
case 6:
|
identityType = 2;
|
remark.append("参与党员活动奖励积分");
|
break;
|
case 7:
|
//查询调查问卷
|
ComActQuestnaireDO questnaireDO = comActQuestnaireDAO.selectById(serviceId);
|
if(questnaireDO == null){
|
log.error("未查询到调查问卷记录,记录积分失败");
|
return R.fail("未查询到调查问卷记录,记录积分失败");
|
}
|
//查询当前用户信息
|
IntegralUserVO integralUser = this.baseMapper.getUserInfo(userId);
|
if(integralUser == null){
|
log.error("未查询到用户信息,记录积分失败");
|
return R.fail("未查询到用户信息,记录积分失败");
|
}
|
//判断调查问卷调查的对象是什么身份,如果是党员和志愿者两种身份,则记录志愿者积分
|
if(questnaireDO.getForParty() && integralUser.getIsPartymember().equals(1)){
|
identityType = 2;
|
if(questnaireDO.getForVolunteer() && integralUser.getIsVolunteer().equals(1)){
|
identityType = 3;
|
}
|
}
|
if(questnaireDO.getForVolunteer() && integralUser.getIsVolunteer().equals(1)){
|
identityType = 3;
|
}
|
remark.append("参与调查问卷奖励积分");
|
remark.append("【");
|
remark.append(questnaireDO.getTitle());
|
remark.append("】");
|
break;
|
default:
|
break;
|
}
|
|
//查询用户积分账户
|
ComActIntegralUserDO integralUserDO = comActIntegralUserService.getOne(new QueryWrapper<ComActIntegralUserDO>().lambda()
|
.eq(ComActIntegralUserDO::getUserId,userId).eq(ComActIntegralUserDO::getCommunityId,communityId));
|
if(integralUserDO == null){
|
integralUserDO = new ComActIntegralUserDO();
|
integralUserDO.setCommunityId(communityId);
|
integralUserDO.setUserId(userId);
|
integralUserDO.setCreateAt(nowDate);
|
integralUserDO.setStatus(ComActIntegralUserDO.status.yes);
|
integralUserDO.setIntegralSum(0);
|
integralUserDO.setIntegralAvailableSum(0);
|
integralUserDO.setIntegralFrozenSum(0);
|
integralUserDO.setIntegralParty(0);
|
integralUserDO.setIntegralAvailableParty(0);
|
integralUserDO.setIntegralFrozenParty(0);
|
integralUserDO.setIntegralVolunteer(0);
|
integralUserDO.setIntegralAvailableVolunteer(0);
|
integralUserDO.setIntegralFrozenVolunteer(0);
|
integralUserDO.setIntegralResident(0);
|
integralUserDO.setIntegralAvailableResident(0);
|
integralUserDO.setIntegralFrozenResident(0);
|
comActIntegralUserService.save(integralUserDO);
|
}
|
if(integralUserDO.getStatus().equals(ComActIntegralUserDO.status.no)){
|
log.error("用户钱包已被禁用,记录积分失败,用户id:" + userId);
|
return R.fail("用户钱包已被禁用,记录积分失败,用户id:" + userId);
|
}
|
Long integralId = integralUserDO.getId();
|
//记录变动前钱包金额
|
Integer integralSum = integralUserDO.getIntegralSum();
|
Integer integralAvailableSum = integralUserDO.getIntegralAvailableSum();
|
Integer integralFrozenSum = integralUserDO.getIntegralFrozenSum();
|
Integer integralParty = integralUserDO.getIntegralParty();
|
Integer integralAvailableParty = integralUserDO.getIntegralAvailableParty();
|
Integer integralFrozenParty = integralUserDO.getIntegralFrozenParty();
|
Integer integralVolunteer = integralUserDO.getIntegralVolunteer();
|
Integer integralAvailableVolunteer = integralUserDO.getIntegralAvailableVolunteer();
|
Integer integralFrozenVolunteer = integralUserDO.getIntegralFrozenVolunteer();
|
Integer integralResident = integralUserDO.getIntegralResident();
|
Integer integralAvailableResident = integralUserDO.getIntegralAvailableResident();
|
Integer integralFrozenResident = integralUserDO.getIntegralFrozenResident();
|
|
integralUserDO.setIntegralSum(integralUserDO.getIntegralSum() + amount);
|
integralUserDO.setIntegralAvailableSum(integralUserDO.getIntegralAvailableSum() + amount);
|
integralUserDO.setUpdateAt(nowDate);
|
//根据不同身份,计算钱包金额
|
if(identityType.equals(ComActIntegralUserTradeDO.identityType.jm)){
|
integralUserDO.setIntegralResident(integralUserDO.getIntegralResident() + amount);
|
integralUserDO.setIntegralAvailableResident(integralUserDO.getIntegralAvailableResident() + amount);
|
}else if(identityType.equals(ComActIntegralUserTradeDO.identityType.dy)){
|
integralUserDO.setIntegralParty(integralUserDO.getIntegralParty() + amount);
|
integralUserDO.setIntegralAvailableParty(integralUserDO.getIntegralAvailableParty() + amount);
|
}else if(identityType.equals(ComActIntegralUserTradeDO.identityType.zyz)){
|
integralUserDO.setIntegralVolunteer(integralUserDO.getIntegralVolunteer() + amount);
|
integralUserDO.setIntegralAvailableVolunteer(integralUserDO.getIntegralAvailableVolunteer() + amount);
|
}
|
//更新钱包
|
comActIntegralUserService.updateById(integralUserDO);
|
//增加积分账户交易记录
|
Long tradeId = this.addIntegralTradeRecord(userId,integralId,communityId,serviceId,type,amount
|
,ComActIntegralUserTradeDO.changeType.add,remark.toString(),identityType,2L);
|
//增加积分账户变更记录
|
comActIntegralUserChangeService.addIntegralUserChangeRecord(userId,integralId,communityId,integralSum,integralUserDO.getIntegralSum()
|
,integralAvailableSum,integralUserDO.getIntegralAvailableSum(),integralFrozenSum,integralUserDO.getIntegralFrozenSum()
|
,integralParty,integralUserDO.getIntegralParty(),integralAvailableParty,integralUserDO.getIntegralAvailableParty()
|
,integralFrozenParty,integralUserDO.getIntegralFrozenParty(),integralVolunteer,integralUserDO.getIntegralVolunteer()
|
,integralAvailableVolunteer,integralUserDO.getIntegralAvailableVolunteer(),integralFrozenVolunteer,integralUserDO.getIntegralFrozenVolunteer()
|
,integralResident,integralUserDO.getIntegralResident(),integralAvailableResident,integralUserDO.getIntegralAvailableResident()
|
,integralFrozenResident,integralUserDO.getIntegralFrozenResident(),tradeId);
|
return R.ok();
|
}
|
|
/**
|
* 根据类型、用户id、社区id构建查询请求参数
|
* @param type 类型
|
* @param userId 用户id
|
* @param communityId 社区id
|
* @return 查询请求参数
|
*/
|
private ComActIntegralCountDTO getIntegralCountDTO(Integer type,Long userId,Long communityId,Integer integralType){
|
ComActIntegralCountDTO integralCountDTO = new ComActIntegralCountDTO();
|
integralCountDTO.setUserId(userId);
|
integralCountDTO.setCommunityId(communityId);
|
integralCountDTO.setServiceType(integralType);
|
integralCountDTO.setType(ComActIntegralUserTradeDO.changeType.add);
|
if(type.equals(ComActIntegralRuleDO.type.month)){
|
integralCountDTO.setStartTime(DateUtils.getFirstDayOfMonthString());
|
integralCountDTO.setEndTime(DateUtils.getLastDayOfMonthString());
|
}else if(type.equals(ComActIntegralRuleDO.type.day)){
|
integralCountDTO.setStartTime(DateUtils.getDayOfMonthString() + " 00:00:00");
|
integralCountDTO.setEndTime(DateUtils.getDayOfMonthString() + " 23:59:59");
|
}
|
return integralCountDTO;
|
}
|
|
}
|