ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -1,6 +1,8 @@ package com.ruoyi.system.api.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.annotation.Excel; import com.ruoyi.common.core.annotation.Excel.ColumnType; @@ -31,7 +33,7 @@ /** 用户ID */ @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号") @TableField("user_id") @TableId(value = "user_id", type = IdType.AUTO) private Long userId; /** 部门ID */ ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/inner/AuctionGoodsController.java
@@ -8,7 +8,12 @@ import com.ruoyi.system.api.domain.AuctionGoods; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> @@ -34,7 +39,7 @@ } @PutMapping("/auction-goods/end/{id}") @PutMapping("/end/{id}") R<?> endAuctionGoods(@PathVariable("id") Long id) { try { auctionGoodsService.endAuctionGoods(id); @@ -45,7 +50,7 @@ return R.ok(); } @PutMapping("/auction-goods/start/{id}") @PutMapping("/start/{id}") R<?> startAuctionGoods(@PathVariable("id") Long id) { try { auctionGoodsService.startAuctionGoods(id); ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/controller/management/MgtAuctionScreenController.java
@@ -125,7 +125,7 @@ * @param id 拍卖场商品id */ @PutMapping("/stop-current/{id}") @ApiOperation("停止当前拍品") @ApiOperation("结束当前拍卖商品") public R<?> stopCurrentGoods( @ApiParam(name = "id", value = "拍卖场商品id", required = true) @PathVariable("id") Long id) { auctionSalesroomService.stopCurrentGoods(id); @@ -157,7 +157,12 @@ return R.ok(); } @PostMapping("/stop-play/{auctionSalesroomId}") /** * 结束播放 * * @param auctionSalesroomId 拍卖场id */ @PutMapping("/stop-play/{auctionSalesroomId}") @ApiOperation("结束播放") public R<?> stopPlay( @ApiParam(name = "auctionSalesroomId", value = "拍卖场id", required = true) @@ -165,4 +170,32 @@ auctionSalesroomService.stopPlay(auctionSalesroomId); return R.ok(); } /** * 开始当前拍卖场 * * @param auctionSalesroomId 拍卖场id */ @PutMapping("/start-auction/{auctionSalesroomId}") @ApiOperation("开始当前拍卖场") public R<?> startCurrentAuctionSalesroom( @ApiParam(name = "auctionSalesroomId", value = "拍卖场id", required = true) @PathVariable("auctionSalesroomId") Long auctionSalesroomId) { auctionSalesroomService.startCurrentAuctionSalesroom(auctionSalesroomId); return R.ok(); } /** * 结束当前拍卖场 * * @param auctionSalesroomId 拍卖场id */ @PutMapping("/stop-auction/{auctionSalesroomId}") @ApiOperation("结束当前拍卖场") public R<?> stopCurrentAuctionSalesroom( @ApiParam(name = "auctionSalesroomId", value = "拍卖场id", required = true) @PathVariable("auctionSalesroomId") Long auctionSalesroomId) { auctionSalesroomService.stopCurrentAuctionSalesroom(auctionSalesroomId); return R.ok(); } } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/IAuctionSalesroomService.java
@@ -175,5 +175,19 @@ */ void play(MgtScreenVideoDTO dto); /** * 结束播放 * * @param auctionSalesroomId 拍卖场id */ void stopPlay(Long auctionSalesroomId); /** * 开始当前拍卖场 * * @param auctionSalesroomId 拍卖场id */ void startCurrentAuctionSalesroom(Long auctionSalesroomId); void stopCurrentAuctionSalesroom(Long auctionSalesroomId); } ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/async/AuctionAsyncMethodService.java
@@ -13,6 +13,7 @@ import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,7 +29,7 @@ private final RedisService redisService; private final SysUserClient sysUserClient; // @Async @Async @Transactional(rollbackFor = Exception.class) public void auctionGoodsScheduleTask(List<AuctionGoods> auctionGoodsList) { for (AuctionGoods auctionGoods : auctionGoodsList) { ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionGoodsServiceImpl.java
@@ -567,14 +567,14 @@ AuctionGoods auctionGoods = this.getById(id); if (StringUtils.isNotNull(auctionGoods) && auctionGoods.getListingStatus().equals( ListingStatusEnum.ON_SHELVES) && auctionGoods.getStartStatus() .equals(AuctionStartStatusEnum.IN_PREVIEW)) { this.lambdaUpdate().set(AuctionGoods::getStartStatus, AuctionStartStatusEnum.IN_AUCTION) .equals(AuctionStartStatusEnum.IN_AUCTION)) { this.lambdaUpdate().set(AuctionGoods::getStartStatus, AuctionStartStatusEnum.ENDED) .eq(AuctionGoods::getId, id); Map<String, Object> map = new ConcurrentHashMap<>(); map.put("notification_type", NotificationTypeConstant.AUCTION_GOODS); map.put("notification_time", LocalDateTime.now()); map.put("target_id", id); map.put("message_type", "start"); map.put("message_type", "end"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByText(msg); log.info("===================>发送websocket通知,消息体{}", msg); @@ -586,14 +586,14 @@ AuctionGoods auctionGoods = this.getById(id); if (StringUtils.isNotNull(auctionGoods) && auctionGoods.getListingStatus().equals( ListingStatusEnum.ON_SHELVES) && auctionGoods.getStartStatus() .equals(AuctionStartStatusEnum.IN_AUCTION)) { this.lambdaUpdate().set(AuctionGoods::getStartStatus, AuctionStartStatusEnum.ENDED) .equals(AuctionStartStatusEnum.IN_PREVIEW)) { this.lambdaUpdate().set(AuctionGoods::getStartStatus, AuctionStartStatusEnum.IN_AUCTION) .eq(AuctionGoods::getId, id); Map<String, Object> map = new ConcurrentHashMap<>(); map.put("notification_type", NotificationTypeConstant.AUCTION_GOODS); map.put("notification_time", LocalDateTime.now()); map.put("target_id", id); map.put("message_type", "end"); map.put("message_type", "start"); String msg = objectMapper.writeValueAsString(map); WebSocketUsers.sendMessageToUsersByText(msg); log.info("===================>发送websocket通知,消息体{}", msg); ruoyi-modules/ruoyi-auction/src/main/java/com/ruoyi/auction/service/impl/AuctionSalesroomServiceImpl.java
@@ -72,6 +72,7 @@ import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomBondDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomDTO; import com.ruoyi.system.api.domain.dto.MemberAuctionSalesroomWdDTO; import com.ruoyi.system.api.domain.dto.OrderAuctionBondDTO; import com.ruoyi.system.api.domain.dto.RefundDTO; import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomGoodsVO; import com.ruoyi.system.api.domain.vo.ForepartAuctionSalesroomVO; @@ -841,7 +842,7 @@ MgtAuctionSalesroomVO.class); List<AuctionSalesroomGoods> list; if (isScreen) { list = getAuctionSalesroomGoods(id, Boolean.TRUE); list = getAuctionSalesroomGoods(id, Boolean.FALSE); } else { list = getAuctionSalesroomGoods(id, null); } @@ -1184,9 +1185,82 @@ iAuctionVideoService.save(auctionVideo); } /** * 结束播放 * * @param auctionSalesroomId 拍卖场id */ @Override public void stopPlay(Long auctionSalesroomId) { iAuctionVideoService.remove(Wrappers.<AuctionVideo>lambdaQuery().eq (AuctionVideo::getAuctionSalesroomId, 1L)); } /** * 开始当前拍卖场 * * @param auctionSalesroomId 拍卖场id */ @Override public void startCurrentAuctionSalesroom(Long auctionSalesroomId) { // 修改拍卖场开始状态 AuctionSalesroom auctionSalesroom = this.getById(auctionSalesroomId); auctionSalesroom.setStatus(AuctionStartStatusEnum.IN_AUCTION); auctionSalesroom.setStartTime(LocalDateTime.now()); auctionSalesroomMapper.updateById(auctionSalesroom); // 修改拍卖商品开始状态 LambdaQueryWrapper<AuctionSalesroomGoods> wrapper = Wrappers.lambdaQuery(); wrapper.eq(AuctionSalesroomGoods::getStatus, AuctionGoodsStatusEnum.WAITING); wrapper.eq(AuctionSalesroomGoods::getAuctionSalesroomId, auctionSalesroomId); wrapper.orderByDesc(AuctionSalesroomGoods::getSortNum); wrapper.last("limit 1"); AuctionSalesroomGoods auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectOne( wrapper); auctionSalesroomGoods.setStatus(AuctionGoodsStatusEnum.IN_PROGRESS); auctionSalesroomGoods.setStartTime(LocalDateTime.now()); auctionSalesroomGoodsMapper.updateById(auctionSalesroomGoods); } @Override @GlobalTransactional(rollbackFor = Exception.class) @Transactional public void stopCurrentAuctionSalesroom(Long auctionSalesroomId) { // 修改拍卖场开始状态 AuctionSalesroom auctionSalesroom = this.getById(auctionSalesroomId); auctionSalesroom.setStatus(AuctionStartStatusEnum.ENDED); auctionSalesroom.setEndTime(LocalDateTime.now()); auctionSalesroomMapper.updateById(auctionSalesroom); LambdaQueryWrapper<AuctionSalesroomGoods> wrapper = Wrappers.lambdaQuery(); wrapper.eq(AuctionSalesroomGoods::getStatus, AuctionGoodsStatusEnum.WAITING); wrapper.eq(AuctionSalesroomGoods::getAuctionSalesroomId, auctionSalesroomId); wrapper.orderByDesc(AuctionSalesroomGoods::getSortNum); List<AuctionSalesroomGoods> auctionSalesroomGoods = auctionSalesroomGoodsMapper.selectList( wrapper); if (StringUtils.isNotEmpty(auctionSalesroomGoods)) { List<GoodsStockUpdDTO> dtoList = new ArrayList<>(); for (AuctionSalesroomGoods salesroomGoods : auctionSalesroomGoods) { salesroomGoods.setStatus(AuctionGoodsStatusEnum.ENDED); GoodsStockUpdDTO goodsStockUpdDTO = new GoodsStockUpdDTO(); goodsStockUpdDTO.setGoodsSkuId(salesroomGoods.getGoodsSkuId()); goodsStockUpdDTO.setAuctionStock(salesroomGoods.getSalesroomStock()); dtoList.add(goodsStockUpdDTO); } // 批量更新商品库存 auctionSalesroomGoodsMapper.updateBatchById(auctionSalesroomGoods); goodsSkuClient.updGoodsStock(dtoList, SecurityConstants.INNER); } // 退保证金 List<AuctionBidRecord> auctionBidRecordList = auctionBidRecordMapper.selectList( Wrappers.<AuctionBidRecord>lambdaQuery() .eq(AuctionBidRecord::getAuctionSalesroomId, auctionSalesroomId) .eq(AuctionBidRecord::getStatus, BidStatusEnum.ELIMINATE)); List<Long> memberIdlist = auctionBidRecordList.stream().map(AuctionBidRecord::getMemberId) .collect(Collectors.toList()); if (StringUtils.isNotEmpty(memberIdlist)) { OrderAuctionBondDTO orderAuctionBondDTO = new OrderAuctionBondDTO(); orderAuctionBondDTO.setAuctionSalesroomId(auctionSalesroom.getId()); orderAuctionBondDTO.setUserList(memberIdlist); orderClient.getOrderAuctionBond(orderAuctionBondDTO, SecurityConstants.INNER); } } } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/domain/MemberLevel.java
@@ -11,6 +11,7 @@ import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -28,6 +29,7 @@ @Accessors(chain = true) @TableName("t_member_level") @ApiModel(value = "MemberLevel对象", description = "会员等级表") @Builder public class MemberLevel implements Serializable { private static final long serialVersionUID = 1L; ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/async/AsyncMethodService.java
@@ -1,7 +1,11 @@ package com.ruoyi.member.service.async; import com.google.common.collect.Lists; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.member.domain.MemberLevel; import com.ruoyi.member.service.IMemberService; import com.ruoyi.system.api.domain.Member; import java.math.BigDecimal; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -26,6 +30,79 @@ */ @Async public void handleMemberLevel(List<MemberLevel> memberLevels) { memberService.list(); List<Member> list = memberService.list(); if (StringUtils.isEmpty(memberLevels)) { // 如果memberLevels为空或为null,则无需进一步处理 return; } List<Member> members = memberService.list(); if (StringUtils.isEmpty(members)) { // 如果成员列表为空或为null,则无需进一步处理 return; } for (Member member : members) { BigDecimal money = member.getMoney(); member.setLevel(findAppropriateLevel(memberLevels, money)); } } private static int findAppropriateLevel(List<MemberLevel> memberLevels, BigDecimal money) { // 对于最开始的level,设置为0(假设0是最低等级) int level = 0; for (int i = 0; i < memberLevels.size(); i++) { MemberLevel currentLevel = memberLevels.get(i); BigDecimal currentCumulativeConsumption = currentLevel.getCumulativeConsumption(); // 如果当前成员的消费额小于等于当前等级的累积消费额 if (money.compareTo(currentCumulativeConsumption) < 0) { return level; } // 更新level为当前等级,准备下一次比较 level = currentLevel.getLevel(); } // 如果遍历完成后还没有返回,说明该成员的消费额高于所有已定义等级的累积消费额 level = memberLevels.get(memberLevels.size() - 1).getLevel(); return level; } public static void main(String[] args) { MemberLevel build1 = MemberLevel.builder().id(1L).level(1) .cumulativeConsumption(BigDecimal.valueOf(100)) .build(); MemberLevel build2 = MemberLevel.builder().id(2L).level(2) .cumulativeConsumption(BigDecimal.valueOf(200)) .build(); MemberLevel build3 = MemberLevel.builder().id(3L).level(3) .cumulativeConsumption(BigDecimal.valueOf(300)) .build(); MemberLevel build4 = MemberLevel.builder().id(4L).level(4) .cumulativeConsumption(BigDecimal.valueOf(500)) .build(); MemberLevel build5 = MemberLevel.builder().id(5L).level(5) .cumulativeConsumption(BigDecimal.valueOf(500)) .build(); MemberLevel build6 = MemberLevel.builder().id(6L).level(6) .cumulativeConsumption(BigDecimal.valueOf(600)) .build(); MemberLevel build7 = MemberLevel.builder().id(7L).level(7) .cumulativeConsumption(BigDecimal.valueOf(700)) .build(); MemberLevel build8 = MemberLevel.builder().id(8L).level(8) .cumulativeConsumption(BigDecimal.valueOf(800)) .build(); MemberLevel build9 = MemberLevel.builder().id(9L).level(9) .cumulativeConsumption(BigDecimal.valueOf(900)) .build(); MemberLevel build10 = MemberLevel.builder().id(10L).level(10) .cumulativeConsumption(BigDecimal.valueOf(1000)) .build(); List<MemberLevel> memberLevels = Lists.newArrayList(build1, build2, build3, build4, build5, build6, build7, build8, build9, build10); System.out.println(findAppropriateLevel(memberLevels, BigDecimal.valueOf(50))); } } ruoyi-modules/ruoyi-member/src/main/java/com/ruoyi/member/service/impl/MemberLevelServiceImpl.java
@@ -1,6 +1,5 @@ package com.ruoyi.member.service.impl; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; @@ -43,16 +42,23 @@ public List<MgtMemberLevelVO> getMemberLevelList() { List<MemberLevel> list = this.lambdaQuery().orderByAsc(MemberLevel::getLevel).list(); List<MgtMemberLevelVO> mgtMemberLevelVOS = BeanUtils.copyList(list, MgtMemberLevelVO.class); List<Member> memberList = memberService.list(); Integer level = 0; if (StringUtils.isNotEmpty(mgtMemberLevelVOS)) { for (MgtMemberLevelVO vo : mgtMemberLevelVOS) { long count = memberService.count( Wrappers.<Member>lambdaQuery().eq(Member::getLevel, vo.getLevel())); vo.setCurrentNumber((int) count); vo.setCurrentNumber(getMemberCountByLevel(memberList, vo.getLevel())); } } return mgtMemberLevelVOS; } private static int getMemberCountByLevel(List<Member> memberList, Integer level) { return (int) memberList.stream().filter(member -> member.getLevel().equals(level)).count(); } /** * 保存会员等级配置 * ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/MgtPromotionVideoController.java
@@ -8,8 +8,11 @@ import com.ruoyi.promotion.service.IPromotionVideoService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -43,4 +46,17 @@ MgtPromotionVideoQuery query) { return R.ok(promotionVideoService.getPromotionVideoPage(query)); } /** * 删除视频 * * @param id 视频id */ @ApiOperation("删除视频") @DeleteMapping("/{id}") public R<?> delPromotionVideo( @ApiParam(name = "id", value = "视频id", required = true) @PathVariable("id") Long id) { promotionVideoService.removeById(id); return R.ok(); } } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/controller/management/dto/MgtPromotionVideoDTO.java
New file @@ -0,0 +1,29 @@ package com.ruoyi.promotion.controller.management.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import java.io.Serializable; import javax.validation.constraints.NotBlank; import lombok.Data; /** * @author mitao * @date 2024/6/3 */ @Data @ApiModel(value = "大屏视频视图对象", description = "大屏视频视图对象") public class MgtPromotionVideoDTO implements Serializable { private static final long serialVersionUID = -1717120548273715375L; @ApiModelProperty(value = "视频id", notes = "更新必传") private Long id; @ApiModelProperty(value = "视频名称") @NotBlank(message = "视频名称不能为空") private String videoName; @ApiModelProperty(value = "视频链接") @NotBlank(message = "视频链接不能为空") private String videoUrl; } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/IPromotionVideoService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionVideoDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionVideoQuery; import com.ruoyi.promotion.controller.management.vo.MgtPromotionVideoVO; import com.ruoyi.system.api.domain.PromotionVideo; @@ -23,4 +24,6 @@ * @return PageDTO<MgtPromotionVideoVO> */ PageDTO<MgtPromotionVideoVO> getPromotionVideoPage(MgtPromotionVideoQuery query); void saveOrUpdatePromotionVideo(MgtPromotionVideoDTO dto); } ruoyi-modules/ruoyi-promotion/src/main/java/com/ruoyi/promotion/service/impl/PromotionVideoServiceImpl.java
@@ -2,8 +2,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.page.BeanUtils; import com.ruoyi.common.core.utils.page.PageDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionVideoDTO; import com.ruoyi.promotion.controller.management.dto.MgtPromotionVideoQuery; import com.ruoyi.promotion.controller.management.vo.MgtPromotionVideoVO; import com.ruoyi.promotion.mapper.PromotionVideoMapper; @@ -39,4 +42,18 @@ } return PageDTO.of(page, MgtPromotionVideoVO.class); } @Override public void saveOrUpdatePromotionVideo(MgtPromotionVideoDTO dto) { PromotionVideo promotionVideo = BeanUtils.copyBean(dto, PromotionVideo.class); if (StringUtils.isNull(dto.getId())) { this.save(promotionVideo); } else { PromotionVideo video = this.getById(dto.getId()); if (StringUtils.isNull(video)) { throw new ServiceException("视频不存在"); } this.updateById(promotionVideo); } } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -599,23 +599,30 @@ */ @Override public void saveSupplier(SupplierDTO dto) { SysUser user = BeanUtils.copyBean(dto, SysUser.class); boolean b = checkPhoneUnique(user); if (!b) { throw new ServiceException("该手机号已存在"); } // 添加 if (StringUtils.isNull(dto.getUserId())) { SysUser user = BeanUtils.copyBean(dto, SysUser.class); user.setUserName(dto.getPhonenumber()); user.setPassword(SecurityUtils.encryptPassword(dto.getPassword())); user.setUserType("03"); this.save(user); } else { // 编辑 SysUser user = this.getById(dto.getUserId()); user = this.getById(dto.getUserId()); if (StringUtils.isNull(user)) { throw new ServiceException("供应商不存在"); } user.setNickName(dto.getNickName()); user.setPhonenumber(dto.getPhonenumber()); user.setUserName(dto.getPhonenumber()); user.setPassword(SecurityUtils.encryptPassword(dto.getPassword())); if (StringUtils.isNotBlank(dto.getPassword())) { user.setPassword(SecurityUtils.encryptPassword(dto.getPassword())); } this.updateById(user); } }