master:系统会员购买体系完善;

pull/1121/head
liujiang 2025-11-05 21:42:10 +08:00
parent d58cc0d78f
commit 3fe665d7a8
11 changed files with 121 additions and 44 deletions

View File

@ -99,6 +99,13 @@ public class StoreController extends XktBaseController {
return R.ok(BeanUtil.toBean(storeService.getInfo(storeId), StoreResVO.class));
}
@ApiOperation(value = "档口过期时间", httpMethod = "GET", response = R.class)
@GetMapping(value = "/expire/{storeId}/{target}")
public R<StoreExpireResVO> getExpireInfo(@PathVariable("storeId") Long storeId, @PathVariable("target") Integer target) {
return R.ok(BeanUtil.toBean(storeService.getExpireInfo(storeId, target), StoreExpireResVO.class));
}
@ApiOperation(value = "PC 商城首页 获取档口基础信息", httpMethod = "GET", response = R.class)
@GetMapping(value = "/simple/{storeId}")
public R<StoreSimpleResVO> getSimpleInfo(@PathVariable("storeId") Long storeId) {

View File

@ -0,0 +1,26 @@
package com.ruoyi.web.controller.xkt.vo.store;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@ApiModel
public class StoreExpireResVO {
@ApiModelProperty(value = "档口ID")
private Long storeId;
@ApiModelProperty(value = "目标 1[正式版] 2[实力质造会员]")
private Integer target;
@ApiModelProperty(value = "试用过期时间 正式版过期时间 会员过期时间")
private Date serviceEndTime;
}

View File

@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author liujiang
@ -43,6 +44,10 @@ public class StoreSimpleResVO {
private SSFileVO logo;
@ApiModelProperty(value = "档口库存系统 1 步橘网 2 天友 3 发货宝")
private Integer stockSys;
@ApiModelProperty(value = "档口状态")
private Integer storeStatus;
@ApiModelProperty(value = "会员等级")
private Integer memberLevel;
@Data
public static class SSFileVO {

View File

@ -3210,7 +3210,7 @@ CREATE TABLE `store`
`prod_scale` tinyint UNSIGNED NULL DEFAULT NULL COMMENT '生产规模',
`integrity_gold` decimal(10, 2) NULL DEFAULT NULL COMMENT '保证金',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
`trial_end_time` date NULL DEFAULT NULL COMMENT '试用截止时间',
`service_end_time` date NULL DEFAULT NULL COMMENT '服务截止时间',
`storage_usage` decimal(10, 3) NULL DEFAULT NULL COMMENT '已使用文件大小',
`template_num` int UNSIGNED NULL DEFAULT NULL COMMENT '档口模板ID',
`store_status` tinyint UNSIGNED NULL DEFAULT NULL COMMENT '档口状态',

View File

@ -106,11 +106,11 @@ public class Store extends XktBaseEntity {
private BigDecimal integrityGold;
/**
*
* storeStatus=3 storeStatus=4
*/
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "试用截止时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date trialEndTime;
@Excel(name = "服务截止时间", width = 30, dateFormat = "yyyy-MM-dd")
private Date serviceEndTime;
/**
* 使

View File

@ -0,0 +1,27 @@
package com.ruoyi.xkt.dto.store;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* @author liujiang
* @version v1.0
* @date 2025/3/27 15:12
*/
@Data
@ApiModel
@Accessors(chain = true)
public class StoreExpireResDTO {
@ApiModelProperty(value = "档口ID")
private Long storeId;
@ApiModelProperty(value = "目标 1[正式版] 2[实力质造会员]")
private Integer target;
@ApiModelProperty(value = "试用过期时间 正式版过期时间 会员过期时间")
private Date serviceEndTime;
}

View File

@ -6,6 +6,7 @@ import lombok.Data;
import lombok.experimental.Accessors;
import java.math.BigDecimal;
import java.util.Date;
/**
* @author liujiang
@ -45,6 +46,10 @@ public class StoreSimpleResDTO {
private SSFileDTO logo;
@ApiModelProperty(value = "档口库存系统 1 步橘网 2 天友 3 发货宝")
private Integer stockSys;
@ApiModelProperty(value = "档口状态")
private Integer storeStatus;
@ApiModelProperty(value = "会员等级")
private Integer memberLevel;
@Data
public static class SSFileDTO {

View File

@ -24,13 +24,6 @@ public interface IStoreService {
*/
int updateStore(StoreUpdateDTO storeUpdateDTO);
/**
*
*
* @return int
*/
int create();
/**
*
*
@ -198,4 +191,13 @@ public interface IStoreService {
* @return Integer
*/
Integer getStockSys(Long storeId);
/**
*
*
* @param storeId ID
* @param target 1[] 2[]
* @return StoreExpireResDTO
*/
StoreExpireResDTO getExpireInfo(Long storeId, Integer target);
}

View File

@ -221,9 +221,9 @@ public class StoreCertificateServiceImpl implements IStoreCertificateService {
store.setStorageUsage(BigDecimal.ZERO);
// 默认使用第一个模板
store.setTemplateNum(1);
// 当前时间往后推1年为试用期时间
Date oneYearAfter = Date.from(LocalDate.now().plusYears(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
store.setTrialEndTime(oneYearAfter);
// 试用期往后推3个月
Date threeMonthAfter = Date.from(LocalDate.now().plusMonths(3).atStartOfDay(ZoneId.systemDefault()).toInstant());
store.setServiceEndTime(threeMonthAfter);
// 设置档口默认权重 0
store.setStoreWeight(Constants.WEIGHT_DEFAULT_ZERO);
// 设置默认的库存系统为 步橘 ,后续可在条码迁移之处修改

View File

@ -79,35 +79,7 @@ public class StoreServiceImpl implements IStoreService {
final SysFileMapper fileMapper;
final IStoreCertificateService storeCertService;
final EsClientWrapper esClientWrapper;
/**
*
*
* @return
*/
@Override
@Transactional
public int create() {
Store store = new Store();
// 初始化注册时只需绑定用户ID即可
store.setUserId(SecurityUtils.getUserId());
// 默认档口状态为:待审核
store.setStoreStatus(StoreStatus.UN_AUDITED.getValue());
// 当前时间往后推1年为试用期时间
Date oneYearAfter = Date.from(LocalDate.now().plusYears(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
store.setTrialEndTime(oneYearAfter);
// 设置档口默认权重 0
store.setStoreWeight(Constants.WEIGHT_DEFAULT_ZERO);
int count = this.storeMapper.insert(store);
// 创建档口账户
assetService.createInternalAccountIfNotExists(store.getId());
// 档口用户绑定
userService.refreshRelStore(store.getUserId(), ESystemRole.SUPPLIER.getId());
// 放到redis中
redisCache.setCacheObject(CacheConstants.STORE_KEY + store.getId(), store);
return count;
}
final StoreMemberMapper storeMemberMapper;
/**
*
@ -458,6 +430,34 @@ public class StoreServiceImpl implements IStoreService {
return store.getStockSys();
}
/**
*
*
* @param storeId ID
* @param target 1[] 2[]
* @return StoreExpireResDTO
*/
@Override
@Transactional(readOnly = true)
public StoreExpireResDTO getExpireInfo(Long storeId, Integer target) {
Store store = Optional.ofNullable(storeMapper.selectById(storeId)).orElseThrow(() -> new ServiceException("档口不存在!", HttpStatus.ERROR));
StoreExpireResDTO expireDTO = new StoreExpireResDTO().setStoreId(storeId).setTarget(target);
// 购买正式版
if (Objects.equals(target, 1)) {
expireDTO.setServiceEndTime(store.getServiceEndTime());
// 购买档口会员
} else if (Objects.equals(target, 2)) {
// 获取档口会员
Date todayStart = Date.from(LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant());
StoreMember storeMember = this.storeMemberMapper.selectOne(new LambdaQueryWrapper<StoreMember>()
.eq(StoreMember::getStoreId, storeId).eq(StoreMember::getDelFlag, Constants.UNDELETED)
.le(StoreMember::getStartTime, todayStart));
expireDTO.setServiceEndTime(ObjectUtils.isNotEmpty(storeMember) ? storeMember.getEndTime() : null);
}
return expireDTO;
}
/**
*
*
@ -556,6 +556,9 @@ public class StoreServiceImpl implements IStoreService {
SysFile logo = this.fileMapper.selectById(simpleDTO.getStoreLogoId());
simpleDTO.setLogo(BeanUtil.toBean(logo, StoreSimpleResDTO.SSFileDTO.class));
}
StoreMember member = this.redisCache.getCacheObject(CacheConstants.STORE_MEMBER + storeId);
// 会员等级
simpleDTO.setMemberLevel(ObjectUtils.isNotEmpty(member) ? member.getLevel() : null);
Long userId = SecurityUtils.getUserIdSafe();
if (ObjectUtils.isEmpty(userId)) {
return simpleDTO;

View File

@ -34,7 +34,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
sc.legal_name,
sc.license_name,
s.store_logo_id,
s.stock_sys
s.stock_sys,
s.store_status,
s.service_end_time
FROM
store s JOIN store_certificate sc ON s.id = sc.store_id
WHERE