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 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 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().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().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; } }