package com.panzhihua.service_community.service.impl;
|
|
import java.util.Date;
|
|
import javax.annotation.Resource;
|
|
import com.panzhihua.service_community.dao.ComBpActivityDAO;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
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.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 static java.util.Objects.nonNull;
|
|
/**
|
* @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;
|
@Resource
|
private ComBpActivityDAO comBpActivityDAO;
|
|
/**
|
* 查询用户某个时间段交易数量
|
*
|
* @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.参与调查问卷 8.取消活动 9.参与单位党员活动)
|
* @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.identityType.resident);
|
} else if (communityTradeDTO.getType().equals(ComActIntegralCommunityRankDTO.type.party)) {
|
communityTradeDTO.setIdentityType(ComActIntegralCommunityRankDTO.identityType.party);
|
} else if (communityTradeDTO.getType().equals(ComActIntegralCommunityRankDTO.type.volunteer)) {
|
communityTradeDTO.setIdentityType(ComActIntegralCommunityRankDTO.identityType.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.参与调查问卷 8.取消活动 9.参与单位党员活动)
|
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();
|
|
Integer changeType = ComActIntegralUserTradeDO.changeType.add;
|
|
if (!type.equals(8) && !type.equals(4) && !type.equals(5) && !type.equals(6) && !type.equals(9)) {
|
// 查询随手拍增加积分数量
|
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.getDiscussSubject());
|
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 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().equals(1) && integralUser.getIsPartymember().equals(1)) {
|
identityType = 2;
|
if (questnaireDO.getForVolunteer().equals(1) && integralUser.getIsVolunteer().equals(1)) {
|
identityType = 3;
|
}
|
}
|
if (questnaireDO.getForVolunteer().equals(1) && integralUser.getIsVolunteer().equals(1)) {
|
identityType = 3;
|
}
|
remark.append("参与调查问卷奖励积分");
|
remark.append("【");
|
remark.append(questnaireDO.getTitle());
|
remark.append("】");
|
break;
|
case 8:
|
changeType = ComActIntegralUserTradeDO.changeType.reduce;
|
amount = -integralUserDTO.getIntegral();
|
remark.append(integralUserDTO.getRemark());
|
identityType = integralUserDTO.getSignIdentity();
|
break;
|
case 4:
|
case 5:
|
case 6:
|
case 9:
|
identityType = integralUserDTO.getSignIdentity();
|
remark.append(integralUserDTO.getRemark());
|
amount = integralUserDTO.getIntegral();
|
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();
|
|
// 根据不同身份,计算钱包金额
|
int reduceAmount = 0;
|
if (identityType.equals(ComActIntegralUserTradeDO.identityType.jm)) {
|
int integralResidentNow = addIntegral(integralResident + amount);
|
if (amount < 0) {
|
reduceAmount = integralResident - integralResidentNow;
|
}
|
integralUserDO.setIntegralResident(integralResidentNow);
|
integralUserDO.setIntegralAvailableResident(addIntegral(integralUserDO.getIntegralAvailableResident() + amount));
|
} else if (identityType.equals(ComActIntegralUserTradeDO.identityType.dy)) {
|
int integralPartyNow = addIntegral(integralParty + amount);
|
if (amount < 0) {
|
reduceAmount = integralParty - integralPartyNow;
|
}
|
integralUserDO.setIntegralParty(integralPartyNow);
|
integralUserDO.setIntegralAvailableParty(addIntegral(integralUserDO.getIntegralAvailableParty() + amount));
|
} else if (identityType.equals(ComActIntegralUserTradeDO.identityType.zyz)) {
|
int integralVolunteerNow = addIntegral(integralVolunteer + amount);
|
if (amount < 0) {
|
reduceAmount = integralVolunteer - integralVolunteerNow;
|
}
|
integralUserDO.setIntegralVolunteer(integralVolunteerNow);
|
integralUserDO.setIntegralAvailableVolunteer(addIntegral(integralUserDO.getIntegralAvailableVolunteer() + amount));
|
}
|
if (changeType == ComActIntegralUserTradeDO.changeType.reduce) {
|
amount = reduceAmount;
|
integralUserDO.setIntegralSum(addIntegral(integralSum - reduceAmount));
|
integralUserDO.setIntegralAvailableSum(addIntegral(integralAvailableSum - reduceAmount));
|
} else {
|
integralUserDO.setIntegralSum(addIntegral(integralSum + amount));
|
integralUserDO.setIntegralAvailableSum(addIntegral(integralAvailableSum + amount));
|
}
|
integralUserDO.setUpdateAt(nowDate);
|
|
// 更新钱包
|
comActIntegralUserService.updateById(integralUserDO);
|
// 增加积分账户交易记录
|
Long tradeId = this.addIntegralTradeRecord(userId, integralId, communityId, serviceId, type, amount,
|
changeType, 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();
|
}
|
|
/**
|
* 获取积分详情
|
* @param id
|
* @return
|
*/
|
@Override
|
public R getUserIntegralDetail(Long id) {
|
return R.ok(this.baseMapper.getUserIntegralDetail(id));
|
}
|
|
private int addIntegral(int integral) {
|
return integral > 0 ? integral : 0;
|
}
|
|
/**
|
* 根据类型、用户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;
|
}
|
|
}
|