diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AdvertRoundController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AdvertRoundController.java index aa72eb3d5..7513c834a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AdvertRoundController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/AdvertRoundController.java @@ -106,7 +106,7 @@ public class AdvertRoundController extends XktBaseController { } @PreAuthorize("@ss.hasAnyRoles('admin,general_admin,store')||@ss.hasSupplierSubRole()") - @ApiOperation(value = "退订", httpMethod = "POST", response = R.class) + @ApiOperation(value = "退订", httpMethod = "PUT", response = R.class) @Log(title = "退订", businessType = BusinessType.UPDATE) @PutMapping("/unsubscribe/{storeId}/{advertRoundId}") public R unsubscribe(@PathVariable("storeId") Long storeId, @PathVariable("advertRoundId") Long advertRoundId) { diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreMemberController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreMemberController.java index c0144e342..b612b7ae6 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreMemberController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/StoreMemberController.java @@ -1,10 +1,12 @@ package com.ruoyi.web.controller.xkt; +import cn.hutool.core.bean.BeanUtil; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.XktBaseController; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.web.controller.xkt.vo.storeMember.StoreMemberCreateVO; +import com.ruoyi.xkt.dto.storeMember.StoreMemberCreateDTO; import com.ruoyi.xkt.service.IStoreMemberService; import io.swagger.annotations.Api; import lombok.RequiredArgsConstructor; @@ -33,7 +35,7 @@ public class StoreMemberController extends XktBaseController { @Log(title = "", businessType = BusinessType.INSERT) @PostMapping public R create(@Validated @RequestBody StoreMemberCreateVO createVO) { - return R.ok(storeMemberService.create(createVO.getStoreId())); + return R.ok(storeMemberService.create(BeanUtil.toBean(createVO, StoreMemberCreateDTO.class))); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeMember/StoreMemberCreateVO.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeMember/StoreMemberCreateVO.java index 0e1e046e2..8b0a42f11 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeMember/StoreMemberCreateVO.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/xkt/vo/storeMember/StoreMemberCreateVO.java @@ -21,8 +21,11 @@ public class StoreMemberCreateVO { @NotNull(message = "档口ID不能为空!") @ApiModelProperty(value = "档口ID", required = true) private Long storeId; - @NotNull(message = "会员金额不能为空!") - @ApiModelProperty(value = "会员金额") - private BigDecimal amount; + @NotNull(message = "支付金额不能为空!") + @ApiModelProperty(value = "支付金额", required = true) + private BigDecimal payPrice; + @NotNull(message = "交易密码不能为空!") + @ApiModelProperty(value = "交易密码") + private String transactionPassword; } diff --git a/xkt/src/main/java/com/ruoyi/xkt/dto/storeMember/StoreMemberCreateDTO.java b/xkt/src/main/java/com/ruoyi/xkt/dto/storeMember/StoreMemberCreateDTO.java new file mode 100644 index 000000000..7a49946a4 --- /dev/null +++ b/xkt/src/main/java/com/ruoyi/xkt/dto/storeMember/StoreMemberCreateDTO.java @@ -0,0 +1,27 @@ +package com.ruoyi.xkt.dto.storeMember; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; + +/** + * @author liujiang + * @version v1.0 + * @date 2025/3/27 15:12 + */ +@ApiModel("档口购买会员") +@Data +@Accessors(chain = true) +public class StoreMemberCreateDTO { + + @ApiModelProperty(value = "档口ID") + private Long storeId; + @ApiModelProperty(value = "支付金额") + private BigDecimal payPrice; + @ApiModelProperty(value = "交易密码") + private String transactionPassword; + +} diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreMemberService.java b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreMemberService.java index 043bc4f49..db414aceb 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/IStoreMemberService.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/IStoreMemberService.java @@ -1,5 +1,7 @@ package com.ruoyi.xkt.service; +import com.ruoyi.xkt.dto.storeMember.StoreMemberCreateDTO; + /** * 推广营销Service接口 * @@ -11,8 +13,8 @@ public interface IStoreMemberService { /** * 档口购买会员 * - * @param storeId 档口ID + * @param createDTO 新增入参 * @return Integer */ - Integer create(Long storeId); + Integer create(StoreMemberCreateDTO createDTO); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java index 6bc2407f7..45fd2df24 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/AdvertRoundServiceImpl.java @@ -584,9 +584,9 @@ public class AdvertRoundServiceImpl implements IAdvertRoundService { @Transactional public Integer create(AdRoundStoreCreateDTO createDTO) { // 判断截止时间是否超时,并且只会处理马上播放的这一轮。比如 5.1-5.3,当前为4.30,处理这一轮;当前为5.2,处理这一轮;当前为5.3(最后一天),处理下一轮。 - /*if (DateUtils.getTime().compareTo(this.getDeadline(createDTO.getSymbol())) > 0) { + if (DateUtils.getTime().compareTo(this.getDeadline(createDTO.getSymbol())) > 0) { throw new ServiceException("竞价失败,已过系统截止时间!", HttpStatus.ERROR); - }*/ + } Store store = redisCache.getCacheObject(CacheConstants.STORE_KEY + createDTO.getStoreId()); if (ObjectUtils.isEmpty(store)) { throw new ServiceException("档口不存在!", HttpStatus.ERROR); @@ -687,8 +687,8 @@ public class AdvertRoundServiceImpl implements IAdvertRoundService { List idList = list.stream().map(AdvertRoundStorePageResDTO::getProdIdStr) .filter(StringUtils::isNotBlank).flatMap(str -> StrUtil.split(str, ",").stream()) .distinct().collect(Collectors.toList()); - List storeProdList = this.storeProdMapper.selectByIds(idList); - Map storeProdMap = storeProdList.stream().collect(Collectors.toMap(x -> x.getId().toString(), x -> x)); + Map storeProdMap = CollectionUtils.isEmpty(idList) ? new HashMap<>() + : this.storeProdMapper.selectByIds(idList).stream().collect(Collectors.toMap(x -> x.getId().toString(), x -> x)); list.forEach(item -> { final List prodArtNumList = StringUtils.isEmpty(item.getProdIdStr()) ? new ArrayList<>() : StrUtil.split(item.getProdIdStr(), ",").stream() .map(storeProdMap::get).filter(Objects::nonNull).map(StoreProduct::getProdArtNum).collect(Collectors.toList()); @@ -889,13 +889,14 @@ public class AdvertRoundServiceImpl implements IAdvertRoundService { advertRound.setProdIdStr(picDTO.getProdIdStr()); // 修改推广图 if (ObjectUtils.isNotEmpty(picDTO.getFile())) { - SysFile file = BeanUtil.toBean(picDTO, SysFile.class); + SysFile file = BeanUtil.toBean(picDTO.getFile(), SysFile.class); this.fileMapper.insert(file); advertRound.setPicId(file.getId()) // 设置推广图审核状态 为待审核 因为有可能是 审核驳回后再次提交图片 .setPicSetType(AdPicSetType.SET.getValue()) // 设置推广图状态为 待审核,有可能是审核驳回后再次提交图片 - .setPicAuditStatus(AdPicAuditStatus.UN_AUDIT.getValue()); + .setPicAuditStatus(AdPicAuditStatus.UN_AUDIT.getValue()) + .setUpdateTime(new Date()); } return this.advertRoundMapper.updateById(advertRound); } diff --git a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreMemberServiceImpl.java b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreMemberServiceImpl.java index 1368d2000..5e5e35dbe 100644 --- a/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreMemberServiceImpl.java +++ b/xkt/src/main/java/com/ruoyi/xkt/service/impl/StoreMemberServiceImpl.java @@ -4,8 +4,14 @@ import com.ruoyi.common.constant.CacheConstants; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.xkt.domain.StoreMember; +import com.ruoyi.xkt.dto.storeMember.StoreMemberCreateDTO; +import com.ruoyi.xkt.enums.NoticeOwnerType; +import com.ruoyi.xkt.enums.NoticeType; import com.ruoyi.xkt.enums.StoreMemberLevel; +import com.ruoyi.xkt.enums.UserNoticeType; import com.ruoyi.xkt.mapper.StoreMemberMapper; +import com.ruoyi.xkt.service.IAssetService; +import com.ruoyi.xkt.service.INoticeService; import com.ruoyi.xkt.service.IStoreMemberService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,19 +32,22 @@ public class StoreMemberServiceImpl implements IStoreMemberService { final StoreMemberMapper storeMemberMapper; final RedisCache redisCache; + final IAssetService assetService; + final INoticeService noticeService; /** * 档口购买会员 * - * @param storeId 档口ID + * @param createDTO 新增入参 * @return Integer */ @Override @Transactional - public Integer create(Long storeId) { - Optional.ofNullable(storeId).orElseThrow(() -> new RuntimeException("档口ID不能为空")); + public Integer create(StoreMemberCreateDTO createDTO) { + Optional.ofNullable(createDTO.getStoreId()).orElseThrow(() -> new RuntimeException("档口ID不能为空!")); + Optional.ofNullable(createDTO.getPayPrice()).orElseThrow(() -> new RuntimeException("购买金额不能为空!")); StoreMember storeMember = new StoreMember(); - storeMember.setStoreId(storeId); + storeMember.setStoreId(createDTO.getStoreId()); // 最低等级会员:实力质造 storeMember.setLevel(StoreMemberLevel.STRENGTH_CONSTRUCT.getValue()); storeMember.setStartTime(java.sql.Date.valueOf(LocalDate.now())); @@ -47,7 +56,12 @@ public class StoreMemberServiceImpl implements IStoreMemberService { storeMember.setCreateBy(SecurityUtils.getUsername()); int count = this.storeMemberMapper.insert(storeMember); // 将档口会员信息添加到 redis 中 - redisCache.setCacheObject(CacheConstants.STORE_MEMBER + storeId, StoreMemberLevel.STRENGTH_CONSTRUCT.getValue()); + redisCache.setCacheObject(CacheConstants.STORE_MEMBER + createDTO.getStoreId(), StoreMemberLevel.STRENGTH_CONSTRUCT.getValue()); + // 新增订购成功的消息通知 + this.noticeService.createSingleNotice(SecurityUtils.getUserId(), "购买会员成功!", NoticeType.NOTICE.getValue(), NoticeOwnerType.SYSTEM.getValue(), + createDTO.getStoreId(), UserNoticeType.SYSTEM_MSG.getValue(), "恭喜您!购买:实力质造 会员成功!"); + // 扣除推广费 + assetService.payAdvertFee(createDTO.getStoreId(), createDTO.getPayPrice(), createDTO.getTransactionPassword()); return count; }