5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
5 days ago | Administrator | ![]() |
src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java
@@ -31,7 +31,6 @@ @ApiOperation(value = "活动报名-新增报名人", notes = "活动报名-新增报名人") @PostMapping(value = "/addConnect") @Limit(key = "addConnect", period = 60, count = 1, name = "活动报名-新增报名人", prefix = "limit") public FebsResponse addConnect(@RequestBody @Validated ApiOperateRegisterUserDto dto) { return happyActivityService.addConnect(dto); @@ -73,7 +72,6 @@ @ApiOperation(value = "活动报名-报名-创建订单", notes = "活动报名-报名-创建订单") @PostMapping(value = "/createOrder") @Limit(key = "createOrder", period = 60, count = 1, name = "创建订单", prefix = "limit") public FebsResponse createOrder(@RequestBody @Validated ApiCreateOrderDto dto) { return happyActivityService.createOrder(dto); @@ -81,7 +79,6 @@ @ApiOperation(value = "活动报名-报名-支付订单", notes = "活动报名-报名-支付订单") @PostMapping(value = "/payOrder") @Limit(key = "payOrder", period = 60, count = 1, name = "支付订单", prefix = "limit") public FebsResponse payOrder(@RequestBody @Validated ApiPayOrderDto dto) { return happyActivityService.payOrder(dto); src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -22,6 +22,8 @@ void updateHappyActivityOptionLikeCnt(@Param("id")Long sourceOptionId); void updateHappyActivitySurplusCnt(@Param("id")Long activityId, @Param("cnt")Integer cnt); Page<ApiActivityOptionListVo> getVoteOptionInPage(Page<ApiActivityOptionListVo> page, @Param("record")ApiVoteOptionInPageDto dto); Page<HappyActivityOrder> selectOrderInPage(Page<HappyActivityOrder> page, @Param("record")AdminHappyActivityOrderDto dto); src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -2,9 +2,10 @@ import cc.mrbird.febs.common.enumerates.AgentLevelEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper; import cc.mrbird.febs.mall.service.HappyActivityService; @@ -15,6 +16,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; @@ -58,4 +60,15 @@ } /** * 订单失效 * 五分钟运行一次 */ @Scheduled(cron = "0 0/5 * * * ? ") public void overtimeJob() { happyActivityService.overtimeJob(); } } src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -53,8 +53,6 @@ void addLikeCnt(Long sourceOptionId); void substructJoinCnt(Long activityId,Integer cnt); FebsResponse orderList(ApiActivityOrderListDto dto); FebsResponse orderInfo(Long id); @@ -68,4 +66,6 @@ FebsResponse checkOrder(ApiCheckOrderDto dto); void checkActivityItem(Long orderId); void overtimeJob(); } src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
@@ -169,6 +169,8 @@ HappyActivity happyActivity = new HappyActivity(); BeanUtil.copyProperties(dto, happyActivity); happyActivity.setCode(code); happyActivity.setExpectCnt(dto.getJoinCnt()); happyActivity.setSurplusCnt(dto.getJoinCnt()); this.baseMapper.insert(happyActivity); return new FebsResponse().success().message("操作成功"); src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -30,7 +30,6 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; @@ -71,55 +70,33 @@ // 检查分页结果是否包含数据 if(CollUtil.isNotEmpty(happyActivityPage.getRecords())){ List<ApiActivityInfoVo> records = happyActivityPage.getRecords(); // 使用Stream流操作records,获取所有活动的ID List<Long> ids = records.stream().map(ApiActivityInfoVo::getId).collect(Collectors.toList()); // 查询关注点赞转发记录,筛选出关注活动类型且未删除的关注记录,并按ID升序排序,限制结果数量为3 List<HappyFollow> happyFollows = happyFollowMapper.selectList( new LambdaQueryWrapper<HappyFollow>() .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode()) .in(HappyFollow::getSourceId, ids) .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .orderByAsc(HappyFollow::getId) .last("limit 3") ); // 检查关注记录是否不为空 if(CollUtil.isNotEmpty(happyFollows)){ // 使用Stream流操作关注记录,获取所有成员ID的集合 Set<Long> memberIds = happyFollows.stream().collect(Collectors.mapping(HappyFollow::getMemberId, Collectors.toSet())); // 查询成员信息,获取成员的ID和头像 List<MallMember> mallMembers = mallMemberMapper.selectList( new LambdaQueryWrapper<MallMember>() .select(MallMember::getId,MallMember::getAvatar) .in(MallMember::getId, memberIds) // 遍历活动记录,为每个活动添加成员头像信息 records.forEach(record -> { // 查询关注点赞转发记录,筛选出关注活动类型且未删除的关注记录,并按ID升序排序,限制结果数量为3 List<HappyFollow> happyFollows = happyFollowMapper.selectList( new LambdaQueryWrapper<HappyFollow>() .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode()) .eq(HappyFollow::getSourceId, record.getId()) .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .groupBy(HappyFollow::getMemberId) .orderByAsc(HappyFollow::getId) .last("limit 3") ); // 检查关注记录是否不为空 if(CollUtil.isNotEmpty(happyFollows)){ // 使用Stream流操作关注记录,获取所有成员ID的集合 Set<Long> memberIds = happyFollows.stream().collect(Collectors.mapping(HappyFollow::getMemberId, Collectors.toSet())); // 使用Stream流操作成员信息,生成一个以成员ID为键,成员信息为值的Map Map<Long, MallMember> memberMap = mallMembers.stream() .collect(Collectors.toMap(MallMember::getId, member -> member)); // 使用Stream流操作关注记录,生成一个以活动ID为键,成员ID列表为值的Map Map<Long, List<Long>> followMap = happyFollows.stream() .collect(Collectors.groupingBy( HappyFollow::getSourceId, Collectors.mapping(HappyFollow::getMemberId, Collectors.toList()) )); // 遍历活动记录,为每个活动添加成员头像信息 records.forEach(record -> { List<Long> memberIdsForRecord = followMap.get(record.getId()); if (CollUtil.isNotEmpty(memberIdsForRecord)) { List<String> memberAvatars = memberIdsForRecord.stream() .map(memberMap::get) .filter(member -> member != null) .map(MallMember::getAvatar) .collect(Collectors.toList()); record.setMemberAvatars(memberAvatars); } }); } // 查询成员信息,获取成员的ID和头像 List<MallMember> mallMembers = mallMemberMapper.selectList( new LambdaQueryWrapper<MallMember>() .select(MallMember::getAvatar) .in(MallMember::getId, memberIds) ); List<String> memberAvatars = mallMembers.stream().map(MallMember::getAvatar).collect(Collectors.toList()); record.setMemberAvatars(memberAvatars); } }); } // 返回成功响应,包含活动分页数据 return new FebsResponse().success().data(happyActivityPage); @@ -137,6 +114,25 @@ ); if(happyActivity != null){ BeanUtil.copyProperties(happyActivity,apiActivityVo); List<HappyFollow> happyFollows = happyFollowMapper.selectList( new LambdaQueryWrapper<HappyFollow>() .select(HappyFollow::getId, HappyFollow::getType) .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode()) .eq(HappyFollow::getSourceId, happyActivity.getId()) .in(HappyFollow::getType, Arrays.asList(StateUpDownEnum.LIKE.getCode(), StateUpDownEnum.SHARE.getCode())) .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) ); if(CollUtil.isNotEmpty(happyFollows)){ // 使用Stream流操作happyFollows,按照type分类,返回每一个不同type的总数量,并返回一个Map Map<Integer, Long> typeCountMap = happyFollows.stream() .collect(Collectors.groupingBy(HappyFollow::getType, Collectors.counting())); Long zanCnt = ObjectUtil.defaultIfNull(typeCountMap.get(StateUpDownEnum.LIKE.getCode()), 0L); apiActivityVo.setZanCnt(Math.toIntExact(zanCnt)); Long sendCnt = ObjectUtil.defaultIfNull(typeCountMap.get(StateUpDownEnum.SHARE.getCode()), 0L); apiActivityVo.setSendCnt(Math.toIntExact(sendCnt)); } } return new FebsResponse().success().data(apiActivityVo); } @@ -221,16 +217,18 @@ throw new FebsException("活动不存在"); } if (StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() == happyActivity.getType()) { Long sourceOptionId = dto.getSourceOptionId(); if (sourceOptionId == null) { throw new FebsException("选项ID不能为空"); } this.operateDoVote(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, sourceOptionId, type); this.addLikeCnt(sourceOptionId); } else { this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, type); } this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, type); // if (StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() == happyActivity.getType()) { // Long sourceOptionId = dto.getSourceOptionId(); // if (sourceOptionId == null) { // throw new FebsException("选项ID不能为空"); // } // this.operateDoVote(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, sourceOptionId, type); // this.addLikeCnt(sourceOptionId); // } else { // this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode(), sourceId, type); // } } else if (StateUpDownEnum.SOURCE_TYPE_SOCIAL_CIRCLE.getCode() == sourceType) { // 朋友圈点赞或关注 this.operateDo(memberId, StateUpDownEnum.SOURCE_TYPE_SOCIAL_CIRCLE.getCode(), sourceId, type); @@ -491,9 +489,9 @@ throw new FebsException("活动已结束"); } Integer joinCnt = happyActivity.getJoinCnt(); if(joinCnt < numCnt){ throw new FebsException("报名额度剩下"+joinCnt+",请减少报名人数"); Integer surplusCnt = happyActivity.getSurplusCnt(); if(surplusCnt < numCnt){ throw new FebsException("报名额度剩下"+surplusCnt+",请减少报名人数"); } //支付总金额 BigDecimal amount = happyActivity.getPayAmount().multiply(new BigDecimal(dto.getNumCnt())).setScale(2, RoundingMode.DOWN); @@ -526,7 +524,8 @@ happyActivityOrderItemMapper.insert(happyActivityOrderItem); } this.substructJoinCnt(activityId, happyActivityOrder.getNumCnt()); this.baseMapper.updateHappyActivitySurplusCnt(activityId, happyActivityOrder.getNumCnt() * (-1)); HashMap<String, Object> stringObjectHashMap = new HashMap<>(); stringObjectHashMap.put("orderId",happyActivityOrder.getId()); stringObjectHashMap.put("amount",amount); @@ -613,17 +612,6 @@ happyActivityOption.setLikesCnt(happyActivityOption.getLikesCnt() + 1); happyActivityOptionMapper.updateById(happyActivityOption); } @Override public void substructJoinCnt(Long activityId, Integer numCnt) { HappyActivity happyActivity = this.baseMapper.selectById(activityId); if(ObjectUtil.isNotEmpty(happyActivity)){ happyActivity.setJoinCnt(happyActivity.getJoinCnt() -numCnt); this.baseMapper.updateById(happyActivity); } } // 处理无需支付订单 private void processNoPayOrder(HappyActivityOrder order, Long orderId) { @@ -920,6 +908,26 @@ } @Override public void overtimeJob() { List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList( new LambdaQueryWrapper<HappyActivityOrder>() .eq(HappyActivityOrder::getState, StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode()) .lt(HappyActivityOrder::getCreatedTime, DateUtil.offsetMinute(new Date(), -10)) ); if(CollUtil.isNotEmpty(happyActivityOrders)){ happyActivityOrders.forEach(happyActivityOrder -> { Long activityId = happyActivityOrder.getActivityId(); Integer numCnt = happyActivityOrder.getNumCnt(); this.baseMapper.updateHappyActivitySurplusCnt(activityId,numCnt); happyActivityOrder.setDeleteFlag(StateUpDownEnum.UP.getCode()); happyActivityOrderMapper.updateById(happyActivityOrder); }); } } @Override public FebsResponse voteActivityHot(Long id) { ApiVoteActivityHotVo apiVoteActivityHotVo = new ApiVoteActivityHotVo(); src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java
@@ -44,6 +44,9 @@ @ApiModelProperty(value = "参与人数") private Integer joinCnt; @ApiModelProperty(value = "热度") private Integer hotCnt; @ApiModelProperty(value = "参与头像") private List<String> memberAvatars; src/main/java/cc/mrbird/febs/mall/vo/ApiActivityVo.java
@@ -14,6 +14,15 @@ @ApiModelProperty(value = "ID") private Long id; @ApiModelProperty(value = "点赞数") private Integer zanCnt; // @ApiModelProperty(value = "关注数") // private Integer followCnt; @ApiModelProperty(value = "转发数") private Integer sendCnt; @ApiModelProperty(value = "编码") private String code; src/main/resources/application-prod.yml
@@ -15,20 +15,20 @@ datasource: # 数据源-1,名称为 base base: username: blnka password: blnka!@#123 username: happy_community_365 password: happy_community_365!@# driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/db_blnka?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8 url: jdbc:mysql://127.0.0.1:3306/happy_community_365?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8 redis: # Redis数据库索引(默认为 0) database: 1 database: 2 # Redis服务器地址 host: 127.0.0.1 # Redis服务器连接端口 port: 6279 port: 6379 # Redis 密码 password: blnka!@#123 password: 1234!@#$!QAZ lettuce: pool: # 连接池中的最小空闲连接 @@ -44,8 +44,8 @@ rabbitmq: host: 127.0.0.1 port: 5672 username: blnka password: blnka123 username: xc_rabbit password: xuncong123 publisher-confirm-type: correlated pay: @@ -61,15 +61,16 @@ xcx: wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code xcx_appid: wxad2fdb2fcad10fb2 xcx_secret: 9bb58d655bff419feec3a6d948ca8b8d xcx_appid: wxe8454293f5c4c143 xcx_secret: 33c3ad513344cf6c16904e5d528b70ea debug: false wecharPaynotifyUrl: http://api.blnka.cn/api/xcxPay/wxpayCallback wecharRechargePaynotifyUrl: http://api.blnka.cn/api/xcxPay/rechargeCallBack certLocalPath: /home/blnkaCert/apiclient_cert.p12 wecharpayMchid: 1658958205 wecharpaySecret: daL341aN5orDt13puXadsAf2rpuXdq4r wecharpaySecretV3: daL341aN5orDt13puXadsAf2rpuX12v3 wecharPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/wxpayCallback wecharActivityPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/activityOrderCallback wecharRechargePaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/rechargeCallBack certLocalPath: /home/cert/apiclient_cert.p12 wecharpayMchid: 1714199495 wecharpaySecret: kKUSYkP73JiCAzDGu2ZfecJNfhvh3sSc wecharpaySecretV3: 1234567hnggcmyxgs731907666310878 gaodeKey: 95ede7157929f5f6b6c758971be924b1 serviceName: yiyuanshucai src/main/resources/application-test.yml
@@ -73,9 +73,9 @@ xcx_appid: wxe8454293f5c4c143 xcx_secret: 33c3ad513344cf6c16904e5d528b70ea debug: true wecharPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback wecharActivityPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/activityOrderCallback wecharRechargePaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/rechargeCallBack wecharPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/wxpayCallback wecharActivityPaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/activityOrderCallback wecharRechargePaynotifyUrl: http://happy.csxuncong.com/api/xcxPay/rechargeCallBack certLocalPath: /home/cert/apiclient_cert.p12 wecharpayMchid: 1714199495 wecharpaySecret: kKUSYkP73JiCAzDGu2ZfecJNfhvh3sSc src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -11,7 +11,7 @@ a.type, a.name, a.state, a.join_cnt, (select count(z.id) from happy_follow z where z.source_id = a.id) as join_cnt, a.start_time, a.end_time from happy_activity a @@ -30,7 +30,13 @@ </if> </if> </where> order by a.order_cnt asc, a.id desc <if test="record.hotState != null"> order by (select count(y.id) from happy_follow y where y.source_id = a.id and type in (2,3)) desc,a.order_cnt asc </if> <if test="record.hotState == null"> order by a.order_cnt asc,a.id desc </if> </select> <select id="getVoteRecordInPage" resultType="cc.mrbird.febs.mall.vo.ApiVoteRecordInPageVo"> @@ -49,6 +55,11 @@ update happy_activity_option set likes_cnt = likes_cnt + 1 where id = #{id} </update> <update id="updateHappyActivitySurplusCnt" > update happy_activity set surplus_cnt = likes_cnt + #{cnt} where id = #{id} </update> <select id="getVoteOptionInPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityOptionListVo"> select a.id as id, src/main/resources/templates/febs/views/modules/votesActivity/add.html
@@ -49,6 +49,7 @@ <label class="layui-form-label febs-form-item-require">推荐首页:</label> <div class="layui-input-block"> <select name="hotState" class="activity-type"> <option value="">请选择</option> <option value="0">不推荐</option> <option value="1">推荐</option> </select> @@ -83,7 +84,8 @@ <div class="layui-col-lg6"> <label class="layui-form-label febs-form-item-require">自主报名:</label> <div class="layui-input-block"> <select name="hotState" class="activity-type"> <select name="addState" class="activity-type"> <option value="">请选择</option> <option value="0">不允许</option> <option value="1">允许</option> </select> @@ -115,6 +117,7 @@ <label class="layui-form-label febs-form-item-require">门票售卖:</label> <div class="layui-input-block"> <select name="payState" class="activity-type"> <option value="">请选择</option> <option value="0">关闭</option> <option value="1">开启</option> </select> src/main/resources/templates/febs/views/modules/votesActivity/discountUpdate.html
@@ -389,7 +389,7 @@ form.on('submit(activity-discount-update-form-submit)', function (data) { data.field.groupId = activityGroup.getValue('valueStr'); data.field.introduce = editor.txt.html(); data.field.textRemark = editor.txt.html(); $.ajax({ 'url':ctx + 'admin/happyActivity/activityUpdate', 'type':'post',