From 92c26cea4de00349b346f71da3cf530b26c31eb0 Mon Sep 17 00:00:00 2001 From: Administrator <15274802129@163.com> Date: Tue, 10 Jun 2025 09:40:59 +0800 Subject: [PATCH] fix(mall): 修复用户重复加入标签的问题 --- src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java | 183 +++++++++++++++++++++++++++++++++++++++------ 1 files changed, 159 insertions(+), 24 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java index 9db2eae..b10d55f 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java @@ -12,6 +12,7 @@ import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; +import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.mall.vo.*; import cc.mrbird.febs.mall.dto.ApiOperateDoDto; import cc.mrbird.febs.mall.vo.activity.*; @@ -26,6 +27,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -57,6 +59,9 @@ private final IApiMallMemberWalletService iApiMallMemberWalletService; private final HappyActivityCategoryMapper happyActivityCategoryMapper; private final AgentProducer agentProducer; + private final DataDictionaryCustomMapper dataDictionaryCustomMapper; + private final HappyMemberLevelMapper happyMemberLevelMapper; + private final IMallMoneyFlowService mallMoneyFlowService; @Override public FebsResponse activityList(ApiActivityInfoDto dto) { @@ -415,6 +420,7 @@ new LambdaQueryWrapper<HappyActivityConnect>() .eq(HappyActivityConnect::getMemberId, memberId) .eq(HappyActivityConnect::getName, dto.getName()) + .eq(HappyActivityConnect::getPhone, dto.getPhone()) ); if(CollUtil.isNotEmpty(happyActivityConnects)){ throw new FebsException("已经添加过该联系人"); @@ -471,6 +477,26 @@ } @Override + public FebsResponse expireOrder(ApiExpireOrderDto dto) { + if(CollUtil.isEmpty(dto.getIds())){ + throw new FebsException("请选择订单"); + } + + dto.getIds().forEach(id -> { + HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id); + if(ObjectUtil.isNotEmpty(happyActivityOrder)){ + Long activityId = happyActivityOrder.getActivityId(); + Integer numCnt = happyActivityOrder.getNumCnt(); + this.baseMapper.updateHappyActivitySurplusCnt(activityId,numCnt); + + happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_OVERTIME.getCode()); + happyActivityOrderMapper.updateById(happyActivityOrder); + } + }); + return new FebsResponse().success(); + } + + @Override public FebsResponse createOrder(ApiCreateOrderDto dto) { Long memberId = LoginUserUtil.getLoginUser().getId(); if(CollUtil.isEmpty(dto.getConnectIds())){ @@ -484,6 +510,24 @@ } Long activityId = dto.getActivityId(); + + List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList( + new LambdaQueryWrapper<HappyActivityOrderItem>() + .eq(HappyActivityOrderItem::getActivityId, activityId) + .in(HappyActivityOrderItem::getConnectId, connectIds) + ); + if(CollUtil.isNotEmpty(happyActivityOrderItems)){ + //stream流操作happyActivityOrderItems,返回一个orderId的Set集合 + Set<Long> orderIdSet = happyActivityOrderItems.stream().map(HappyActivityOrderItem::getOrderId).collect(Collectors.toSet()); + List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList( + new LambdaQueryWrapper<HappyActivityOrder>() + .in(HappyActivityOrder::getId, orderIdSet) + .in(HappyActivityOrder::getState, Arrays.asList(StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode())) + ); + if(CollUtil.isNotEmpty(happyActivityOrders)){ + throw new FebsException("有报名人重复报名了活动,请重新选择"); + } + } HappyActivity happyActivity = this.baseMapper.selectById(activityId); if (ObjectUtil.isEmpty(happyActivity)) { throw new FebsException("活动不存在"); @@ -513,7 +557,11 @@ happyActivityOrder.setNumCnt(dto.getNumCnt()); happyActivityOrder.setAmount(amount); happyActivityOrder.setPayState(StateUpDownEnum.PAY_STATE_NOT_PAY.getCode()); - happyActivityOrder.setPayType(StateUpDownEnum.PAY_METHOD_WECHAT.getCode()); + if(BigDecimal.ZERO.compareTo(amount) == 0){ + happyActivityOrder.setPayType(StateUpDownEnum.PAY_METHOD_NO_PAY.getCode()); + }else{ + happyActivityOrder.setPayType(StateUpDownEnum.PAY_METHOD_WECHAT.getCode()); + } happyActivityOrder.setFailTime(failTime); log.info("创建订单,订单号="+JSONUtil.parse(happyActivityOrder)); happyActivityOrderMapper.insert(happyActivityOrder); @@ -539,6 +587,7 @@ HashMap<String, Object> stringObjectHashMap = new HashMap<>(); stringObjectHashMap.put("orderId",happyActivityOrder.getId()); stringObjectHashMap.put("amount",amount); + stringObjectHashMap.put("payType",happyActivityOrder.getPayType()); stringObjectHashMap.put("failTime",failTime); return new FebsResponse().success().data(stringObjectHashMap); @@ -580,6 +629,7 @@ try { // 根据支付类型处理不同的支付逻辑 if (StateUpDownEnum.PAY_METHOD_NO_PAY.getCode() == payType) { +// if (BigDecimal.ZERO.compareTo(happyActivityOrder.getAmount()) == 0) { // 处理无需支付的订单逻辑 processNoPayOrder(happyActivityOrder, orderId); } else if (StateUpDownEnum.PAY_METHOD_WECHAT.getCode() == payType) { @@ -692,7 +742,7 @@ LambdaQueryWrapper<HappyActivityOrder> happyActivityOrderLambdaQueryWrapper = new LambdaQueryWrapper<>(); happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getMemberId, memberId); - if(ObjectUtil.isNotEmpty(dto.getState())){ + if(ObjectUtil.isNotEmpty(dto.getState()) && dto.getState() != 0){ happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getState, dto.getState()); } happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getDeleteFlag, StateUpDownEnum.DOWN.getCode()); @@ -706,6 +756,7 @@ List<HappyActivity> happyActivities = this.baseMapper.selectList( new LambdaQueryWrapper<HappyActivity>() .select( + HappyActivity::getId, HappyActivity::getCategoryId, HappyActivity::getName, HappyActivity::getStartTime, @@ -755,7 +806,7 @@ List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList( new LambdaQueryWrapper<HappyActivityOrderItem>() - .eq(HappyActivityOrderItem::getOrderId, happyActivityOrder.getActivityId()) + .eq(HappyActivityOrderItem::getOrderId, happyActivityOrder.getId()) .eq(HappyActivityOrderItem::getMemberId, memberId) ); if(CollUtil.isNotEmpty(happyActivityOrderItems)){ @@ -859,31 +910,115 @@ HappyActivityOrderItem happyActivityOrderItem = happyActivityOrderItemMapper.selectOne( new LambdaQueryWrapper<HappyActivityOrderItem>() .eq(HappyActivityOrderItem::getCode, orderItemCode) - .eq(HappyActivityOrderItem::getState, StateUpDownEnum.DOWN.getCode()) .last("limit 1") ); - if(happyActivityOrderItem != null){ - happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode()); - happyActivityOrderItem.setTransferItemId(memberId); - happyActivityOrderItemMapper.updateById(happyActivityOrderItem); - - agentProducer.sendCheckActivityItem(happyActivityOrderItem.getOrderId()); - - HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrderItem.getActivityId()); - ApiCheckOrderVo apiCheckOrderVo = new ApiCheckOrderVo(); - apiCheckOrderVo.setActivityName(happyActivity.getName()); - apiCheckOrderVo.setActivityStartTime(happyActivity.getStartTime()); - apiCheckOrderVo.setActivityEndTime(happyActivity.getEndTime()); - apiCheckOrderVo.setActivityAddress(happyActivity.getAddress()); - apiCheckOrderVo.setCode(happyActivityOrderItem.getCode()); - apiCheckOrderVo.setName(happyActivityOrderItem.getName()); - apiCheckOrderVo.setPhone(happyActivityOrderItem.getPhone()); - apiCheckOrderVo.setPrice(happyActivityOrderItem.getPrice()); - - return new FebsResponse().success().data(apiCheckOrderVo); + if(happyActivityOrderItem == null){ + throw new FebsException("票号不存在!"); } - return new FebsResponse().fail().message("核销失败!"); + HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrderItem.getActivityId()); + ApiCheckOrderVo apiCheckOrderVo = new ApiCheckOrderVo(); + apiCheckOrderVo.setActivityName(happyActivity.getName()); + apiCheckOrderVo.setActivityStartTime(happyActivity.getStartTime()); + apiCheckOrderVo.setActivityEndTime(happyActivity.getEndTime()); + apiCheckOrderVo.setActivityAddress(happyActivity.getAddress()); + apiCheckOrderVo.setCode(happyActivityOrderItem.getCode()); + apiCheckOrderVo.setName(happyActivityOrderItem.getName()); + apiCheckOrderVo.setPhone(happyActivityOrderItem.getPhone()); + apiCheckOrderVo.setPrice(happyActivityOrderItem.getPrice()); + apiCheckOrderVo.setState(happyActivityOrderItem.getState()); + + return new FebsResponse().success().data(apiCheckOrderVo); + } + + @Override + public FebsResponse insureOrder(ApiCheckOrderDto dto) { + // 获取当前登录用户的ID + Long memberId = LoginUserUtil.getLoginUser().getId(); + + MallMember mallMember = mallMemberMapper.selectById(memberId); + + if(StateUpDownEnum.UP.getCode() != mallMember.getCheckOrder()){ + throw new FebsException("您不是核销员!"); + } + + String orderItemCode = dto.getOrderItemCode(); + + HappyActivityOrderItem happyActivityOrderItem = happyActivityOrderItemMapper.selectOne( + new LambdaQueryWrapper<HappyActivityOrderItem>() + .eq(HappyActivityOrderItem::getCode, orderItemCode) + .last("limit 1") + ); + if(happyActivityOrderItem == null){ + throw new FebsException("票号不存在!"); + } + if(StateUpDownEnum.UP.getCode() == happyActivityOrderItem.getState()){ + throw new FebsException("票号已核销!"); + } + + happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode()); + happyActivityOrderItem.setTransferItemId(memberId); + happyActivityOrderItem.setUpdatedTime(DateUtil.date()); + happyActivityOrderItemMapper.updateById(happyActivityOrderItem); + + BigDecimal scorePercent = BigDecimal.ONE; + DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( + DataDictionaryEnum.SCORE_SIGN_SETTING.getType(), + DataDictionaryEnum.SCORE_SIGN_SETTING.getCode()); + if (dic != null) { + ScoreSettingDto scoreSettingDto = JSONObject.parseObject(dic.getValue(), ScoreSettingDto.class); + BigDecimal bigDecimal = ObjectUtil.isEmpty(scoreSettingDto.getScorePercent()) ? BigDecimal.ONE : new BigDecimal(scoreSettingDto.getScorePercent()); + if (bigDecimal.compareTo(BigDecimal.ZERO) > 0) { + scorePercent = bigDecimal; + } + } + BigDecimal bigDecimal = scorePercent.multiply(happyActivityOrderItem.getPrice()).setScale(0, RoundingMode.HALF_DOWN); + if(bigDecimal.compareTo(BigDecimal.ZERO) > 0){ + MallMember member = mallMemberMapper.selectById(happyActivityOrderItem.getMemberId()); + Integer director = member.getDirector(); + // 查询与董事等级代码匹配的会员等级信息 + LambdaQueryWrapper<HappyMemberLevel> happyMemberLevelLambdaQueryWrapper = new LambdaQueryWrapper<HappyMemberLevel>(); + happyMemberLevelLambdaQueryWrapper.eq(HappyMemberLevel::getCode, director); + happyMemberLevelLambdaQueryWrapper.last("limit 1"); + HappyMemberLevel happyMemberLevel = happyMemberLevelMapper.selectOne(happyMemberLevelLambdaQueryWrapper); + log.info("会员等级信息:{}", JSONUtil.toJsonStr(happyMemberLevel)); + if(ObjectUtil.isNotEmpty(happyMemberLevel)){ + BigDecimal amount = happyActivityOrderItem.getPrice(); + // 计算自己获得的积分 + BigDecimal minePercent = happyMemberLevel.getMinePercent(); + BigDecimal mineScore = amount.multiply(minePercent).multiply(scorePercent).setScale(0, RoundingMode.HALF_DOWN); + log.info("下单获得积分:{}", mineScore); + if(mineScore.compareTo(BigDecimal.ZERO) > 0){ + mallMoneyFlowService.addMoneyFlow( + memberId, + mineScore, + ScoreFlowTypeEnum.ACTIVITY_INSURE_PRIZE_SCORE.getValue(), + MallUtils.getOrderNum(), + FlowTypeEnum.PRIZE_SCORE.getValue(), + StrUtil.format( ScoreFlowTypeEnum.ACTIVITY_INSURE_PRIZE_SCORE.getDesc(),mineScore), + 2); + iApiMallMemberWalletService.add(mineScore,memberId , "prizeScore"); + + // 记录会员购买获得的经验 + BigDecimal multiply = amount.multiply(minePercent).setScale(2, RoundingMode.HALF_DOWN); + mallMoneyFlowService.addMoneyFlow( + memberId, + multiply, + ScoreFlowTypeEnum.ACTIVITY_INSURE_SCORE.getValue(), + MallUtils.getOrderNum(), + FlowTypeEnum.SCORE.getValue(), + StrUtil.format(ScoreFlowTypeEnum.ACTIVITY_INSURE_SCORE.getDesc(),multiply), + 2 + ); + // 更新会员钱包中的分数 + iApiMallMemberWalletService.add(multiply, memberId, "score"); + // 发送会员等级升级消息 + agentProducer.sendVipLevelUp(memberId); + } + } + } + agentProducer.sendCheckActivityItem(happyActivityOrderItem.getOrderId()); + return new FebsResponse().success().message("操作成功"); } /** -- Gitblit v1.9.1