|
|
@@ -0,0 +1,184 @@
|
|
|
+package com.cyksj.service.distribute.equipment.impl;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateField;
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.cyksj.common.constant.Constant;
|
|
|
+import com.cyksj.common.util.Jsons;
|
|
|
+import com.cyksj.mapper.GroupsRelationMapper;
|
|
|
+import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserChanceMapper;
|
|
|
+import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserChanceRecordMapper;
|
|
|
+import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserDistributeInviteRecordMapper;
|
|
|
+import com.cyksj.mapper.manage.distribute.equipment.EquipmentUserReceiveBenefitsRecordMapper;
|
|
|
+import com.cyksj.model.dto.EquipmentConfigDto;
|
|
|
+import com.cyksj.model.entity.*;
|
|
|
+import com.cyksj.redis.RedisService;
|
|
|
+import com.cyksj.service.distribute.equipment.EquipmentDistributeService;
|
|
|
+import com.cyksj.service.mange.coupon.CouponCommonService;
|
|
|
+import com.cyksj.service.relation.GroupRelationClearService;
|
|
|
+import com.cyksj.service.sys.SysConfigService;
|
|
|
+import lombok.RequiredArgsConstructor;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.dao.DuplicateKeyException;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+/*
|
|
|
+ *项目名: netflix
|
|
|
+ *文件名: EquipmentDistributeServiceImpl
|
|
|
+ *创建者: JavaZou
|
|
|
+ *创建时间:2023/2/23 13:42
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@RequiredArgsConstructor
|
|
|
+@Slf4j
|
|
|
+public class EquipmentDistributeServiceImpl implements EquipmentDistributeService {
|
|
|
+
|
|
|
+ private final EquipmentUserDistributeInviteRecordMapper inviteRecordMapper;
|
|
|
+
|
|
|
+ private final EquipmentUserChanceMapper equipmentUserChanceMapper;
|
|
|
+
|
|
|
+ private final EquipmentUserChanceRecordMapper equipmentUserChanceRecordMapper;
|
|
|
+
|
|
|
+ private final EquipmentUserReceiveBenefitsRecordMapper equipmentUserReceiveBenefitsRecordMapper;
|
|
|
+
|
|
|
+ private final GroupsRelationMapper groupsRelationMapper;
|
|
|
+
|
|
|
+ private final GroupRelationClearService groupRelationClearService;
|
|
|
+
|
|
|
+ private final SysConfigService sysConfigService;
|
|
|
+
|
|
|
+ private final CouponCommonService couponCommonService;
|
|
|
+
|
|
|
+ private final RedisService redisService;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveDistributionInvitation(Long sharedId, Boolean isNewUser, Long userId) {
|
|
|
+ EquipmentUserDistributeInviteRecord exists = inviteRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeInviteRecord.class)
|
|
|
+ .eq(EquipmentUserDistributeInviteRecord::getUserId, userId).last("limit 1"));
|
|
|
+ if (exists == null) {
|
|
|
+ EquipmentUserDistributeInviteRecord record = new EquipmentUserDistributeInviteRecord();
|
|
|
+ record.setShareId(sharedId);
|
|
|
+ //存在分销
|
|
|
+ record.setUserId(userId);
|
|
|
+ try {
|
|
|
+ inviteRecordMapper.insert(record);
|
|
|
+ //发放新用户福利优惠券
|
|
|
+ if (isNewUser) {
|
|
|
+ sendInvitedUserEquipmentCoupon(userId);
|
|
|
+ }
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ log.info("实物分销被邀请人id:{}重复插入", userId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void addDistributeBenefitsChance(Long userId, Long orderId) {
|
|
|
+ EquipmentUserDistributeInviteRecord record = getDistributeRecord(userId);
|
|
|
+ if (record != null) {
|
|
|
+ Long sharId = record.getShareId();
|
|
|
+ if (saveInviteRecord(sharId, userId, orderId, EquipmentUserChanceRecord.Status.hasPayment)) {
|
|
|
+ EquipmentUserChance chance = equipmentUserChanceMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserChance.class)
|
|
|
+ .eq(EquipmentUserChance::getUserId, sharId)
|
|
|
+ .last("limit 1"));
|
|
|
+ if (chance == null) {
|
|
|
+ try {
|
|
|
+ chance = new EquipmentUserChance();
|
|
|
+ chance.setUserId(sharId);
|
|
|
+ chance.setNum(1);
|
|
|
+ equipmentUserChanceMapper.insert(chance);
|
|
|
+ } catch (DuplicateKeyException e) {
|
|
|
+ equipmentUserChanceMapper.addUserChance(sharId);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ equipmentUserChanceMapper.addUserChance(sharId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void subDistributeBenefitsChance(Long userId, Long orderId) {
|
|
|
+ EquipmentUserDistributeInviteRecord record = getDistributeRecord(userId);
|
|
|
+ if (record != null) {
|
|
|
+ Long sharId = record.getShareId();
|
|
|
+ if (saveInviteRecord(sharId, userId, orderId, EquipmentUserChanceRecord.Status.refund)) {
|
|
|
+ Integer update = equipmentUserChanceMapper.subUserChance(sharId);
|
|
|
+ if (update == 1) {
|
|
|
+ //扣除权益
|
|
|
+ deductUserBenefits(sharId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public EquipmentUserDistributeInviteRecord getDistributeRecord(Long userId) {
|
|
|
+ //是否有实物分销邀请记录
|
|
|
+ EquipmentUserDistributeInviteRecord record = inviteRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserDistributeInviteRecord.class)
|
|
|
+ .eq(EquipmentUserDistributeInviteRecord::getUserId, userId)
|
|
|
+ .last("limit 1"));
|
|
|
+ if (record == null) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return record;
|
|
|
+ }
|
|
|
+
|
|
|
+ public Boolean saveInviteRecord(Long sharId, Long userId, Long orderId, EquipmentUserChanceRecord.Status status) {
|
|
|
+ EquipmentUserChanceRecord record = equipmentUserChanceRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserChanceRecord.class)
|
|
|
+ .eq(EquipmentUserChanceRecord::getUserId, userId)
|
|
|
+ .eq(EquipmentUserChanceRecord::getStatus, status)
|
|
|
+ .eq(EquipmentUserChanceRecord::getOrderId, orderId));
|
|
|
+ if (record != null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ record = new EquipmentUserChanceRecord();
|
|
|
+ record.setShareId(sharId);
|
|
|
+ record.setUserId(userId);
|
|
|
+ record.setStatus(status);
|
|
|
+ record.setOrderId(orderId);
|
|
|
+ equipmentUserChanceRecordMapper.insert(record);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void deductUserBenefits(Long userId) {
|
|
|
+ EquipmentUserReceiveBenefitsRecord receiveBenefitsRecord = equipmentUserReceiveBenefitsRecordMapper.selectOne(Wrappers.lambdaQuery(EquipmentUserReceiveBenefitsRecord.class)
|
|
|
+ .eq(EquipmentUserReceiveBenefitsRecord::getStatusCode, 1)
|
|
|
+ .eq(EquipmentUserReceiveBenefitsRecord::getUserId, userId)
|
|
|
+ .orderByDesc(EquipmentUserReceiveBenefitsRecord::getId).last("limit 1"));
|
|
|
+ if (receiveBenefitsRecord == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ Integer months = receiveBenefitsRecord.getNum();
|
|
|
+ Long relationId = receiveBenefitsRecord.getRelationId();
|
|
|
+ GroupsRelation relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
|
|
|
+ .eq(GroupsRelation::getUserId, userId)
|
|
|
+ .eq(GroupsRelation::getId, relationId).eq(GroupsRelation::getStatus, GroupsRelation.Status.validity).last("limit 1"));
|
|
|
+ Date expiryTime = relation.getExpiryTime();
|
|
|
+ if (relation == null || expiryTime == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ DateTime now = DateTime.now();
|
|
|
+ Date finalDate = DateUtil.offset(expiryTime, DateField.MONTH, -months);
|
|
|
+ if (now.isAfter(finalDate)) {
|
|
|
+ //过期 直接清除车票
|
|
|
+ groupRelationClearService.clearTicket(relation);
|
|
|
+ } else {
|
|
|
+ relation.setExpiryTime(finalDate);
|
|
|
+ groupsRelationMapper.updateById(relation);
|
|
|
+ }
|
|
|
+ relation.setStartTime(relation.getStartTime() == null ? new Date() : null);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void sendInvitedUserEquipmentCoupon(Long userId) {
|
|
|
+ SysConfig config = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
|
|
|
+ .eq(SysConfig::getSysKey, Constant.EQUIPMENT_DISTRIBUTE_KEY).last("limit 1"));
|
|
|
+ EquipmentConfigDto equipmentConfigDto = Jsons.parseObject(config, EquipmentConfigDto.class);
|
|
|
+ equipmentConfigDto.getCouponIds().forEach(couponId->{
|
|
|
+ couponCommonService.sendCouponToUser(userId, couponId, null, null, null, CouponUser.Channel.equipment);
|
|
|
+ });
|
|
|
+ redisService.set(RedisService.key.EQUIPMENT_DISTRIBUTE_COUPON_KEY.getNameFormat(userId), userId, RedisService.key.EQUIPMENT_DISTRIBUTE_COUPON_KEY.getTimeout());
|
|
|
+ }
|
|
|
+}
|