master:推广营销完善;

pull/1121/head
liujiang 2025-06-26 22:27:48 +08:00
parent 20c6658a1c
commit 49b8fef8c1
7 changed files with 67 additions and 18 deletions

View File

@ -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<Integer> unsubscribe(@PathVariable("storeId") Long storeId, @PathVariable("advertRoundId") Long advertRoundId) {

View File

@ -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<Integer> create(@Validated @RequestBody StoreMemberCreateVO createVO) {
return R.ok(storeMemberService.create(createVO.getStoreId()));
return R.ok(storeMemberService.create(BeanUtil.toBean(createVO, StoreMemberCreateDTO.class)));
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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<String> idList = list.stream().map(AdvertRoundStorePageResDTO::getProdIdStr)
.filter(StringUtils::isNotBlank).flatMap(str -> StrUtil.split(str, ",").stream())
.distinct().collect(Collectors.toList());
List<StoreProduct> storeProdList = this.storeProdMapper.selectByIds(idList);
Map<String, StoreProduct> storeProdMap = storeProdList.stream().collect(Collectors.toMap(x -> x.getId().toString(), x -> x));
Map<String, StoreProduct> 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<String> 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);
}

View File

@ -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;
}