1、新增组织产品有效期时间查询接口;2、组织查询、分页的超期时间修改为Date类型;

This commit is contained in:
gaoqr
2025-10-13 11:27:54 +08:00
parent 3b628e9d91
commit 23f8a2f2c8
9 changed files with 91 additions and 11 deletions
@@ -76,6 +76,11 @@ public class DateUtils {
return now.isAfter(time); return now.isAfter(time);
} }
public static boolean isExpired(LocalDate time) {
LocalDate now = LocalDate.now();
return now.isAfter(time);
}
public static long diff(Date endTime, Date startTime) { public static long diff(Date endTime, Date startTime) {
return endTime.getTime() - startTime.getTime(); return endTime.getTime() - startTime.getTime();
} }
@@ -0,0 +1,24 @@
package com.cf.imes.framework.jackson.core.databind;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.time.LocalDate;
import java.time.ZoneId;
/**
* LocalDate序列化规则
* <p>
* 会将LocalDateTime序列化为毫秒级时间戳
*/
public class LocalDateSerializer extends JsonSerializer<LocalDate> {
public static final LocalDateSerializer INSTANCE = new LocalDateSerializer();
@Override
public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeNumber(value.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli());
}
}
@@ -139,6 +139,7 @@ public class ErrorCodeConstants {
public static final ErrorCode ORGAN_ALREADY_EXISTS = new ErrorCode(1_002_015_007, "该新增组织已授权机台数量无需重复新增!"); public static final ErrorCode ORGAN_ALREADY_EXISTS = new ErrorCode(1_002_015_007, "该新增组织已授权机台数量无需重复新增!");
public static final ErrorCode ORGAN_USER_OPER_NOT_ALLOW = new ErrorCode(1_002_015_008, "不允许操作用户自身组织"); public static final ErrorCode ORGAN_USER_OPER_NOT_ALLOW = new ErrorCode(1_002_015_008, "不允许操作用户自身组织");
public static final ErrorCode ORGAN_CONTACTMOBILE_DUPLICATE = new ErrorCode(1_002_015_009, "手机号为【{}】的组织已存在"); public static final ErrorCode ORGAN_CONTACTMOBILE_DUPLICATE = new ErrorCode(1_002_015_009, "手机号为【{}】的组织已存在");
public static final ErrorCode ORGAN_EXPIRETIME_PRODUCTID_LACK = new ErrorCode(1_002_015_010, "请选择要购买的产品");
// ========== 组织套餐 1-002-016-000 ========== // ========== 组织套餐 1-002-016-000 ==========
public static final ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1_002_016_000, "组织套餐不存在"); public static final ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1_002_016_000, "组织套餐不存在");
@@ -2,6 +2,7 @@ package com.cf.imes.module.system.controller.admin.organ;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.pojo.CommonResult; import com.cf.imes.framework.common.pojo.CommonResult;
import com.cf.imes.framework.common.pojo.PageParam; import com.cf.imes.framework.common.pojo.PageParam;
@@ -9,6 +10,7 @@ import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.framework.excel.core.util.ExcelUtils; import com.cf.imes.framework.excel.core.util.ExcelUtils;
import com.cf.imes.framework.operatelog.core.annotations.OperateLog; import com.cf.imes.framework.operatelog.core.annotations.OperateLog;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.system.api.user.dto.OrganAdminUserRespDTO; import com.cf.imes.module.system.api.user.dto.OrganAdminUserRespDTO;
import com.cf.imes.module.system.controller.admin.funds.delay.vo.ProductDelayRespVO; import com.cf.imes.module.system.controller.admin.funds.delay.vo.ProductDelayRespVO;
import com.cf.imes.module.system.controller.admin.organ.vo.organ.*; import com.cf.imes.module.system.controller.admin.organ.vo.organ.*;
@@ -37,9 +39,11 @@ import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.hutool.core.date.DatePattern.NORM_DATE_FORMATTER;
import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception; import static com.cf.imes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.cf.imes.framework.common.pojo.CommonResult.success; import static com.cf.imes.framework.common.pojo.CommonResult.success;
import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORGAN_EXPIRETIME_PRODUCTID_LACK;
import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORGAN_NOT_EXISTS; import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORGAN_NOT_EXISTS;
@Tag(name = "管理后台 - 组织") @Tag(name = "管理后台 - 组织")
@@ -105,9 +109,8 @@ public class OrganController {
} }
@GetMapping("/get") @GetMapping("/get")
@Operation(summary = "获得组织") @Operation(summary = "查询组织信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024") @Parameter(name = "id", description = "编号", required = true, example = "1024")
// @PreAuthorize("@ss.hasPermission('organizationLIst:query')")
public CommonResult<OrganRespVO> getOrgan(@RequestParam("id") Long id) { public CommonResult<OrganRespVO> getOrgan(@RequestParam("id") Long id) {
OrganizationDO organ = organService.getOrgan(id); OrganizationDO organ = organService.getOrgan(id);
if (ObjectUtil.isNull(organ)) { if (ObjectUtil.isNull(organ)) {
@@ -135,8 +138,50 @@ public class OrganController {
return success(bean); return success(bean);
} }
@GetMapping("/product/expireTime")
@Operation(summary = "查询组织产品有效时间")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@Parameter(name = "productId", description = "产品编号", required = true, example = "1024")
public CommonResult<String> getOrganProductExpireTime(@RequestParam("id") Long id, @RequestParam(value = "productId", required = false) Long productId) {
String expireTime = "";
OrganizationDO organ = organService.getOrgan(id);
if (ObjectUtil.isNull(organ)) {
throw exception(ORGAN_NOT_EXISTS);
}
OrganRespVO bean = BeanUtils.toBean(organ, OrganRespVO.class);
// 是否管理端,管理端要选了产品后展示有效时间
boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint();
if (manageEndPoint) {
if (ObjectUtil.isNull(productId)) {
throw exception(ORGAN_EXPIRETIME_PRODUCTID_LACK);
}
} else {
// 生产端从token中获取产品
productId = SecurityFrameworkUtils.getProductId();
}
Long organId = bean.getId();
// 查询当前列表组织下的选择productId产品的记录
Long finalProductId = productId;
List<OrganPagePurchaseRespVO> orgPurchaseList = BeanUtil.copyToList(
purchaseService.getOrgPurchaseList(Set.of(organId)).stream().filter(p -> finalProductId.equals(p.getProductId())).collect(Collectors.toList()), OrganPagePurchaseRespVO.class
);
if (CollUtil.isNotEmpty(orgPurchaseList)) {
OrganPagePurchaseRespVO currentProduct = orgPurchaseList.get(0);
List<ProductDelayRespVO> delayRecordsByPurchaseId = productDelayService.getRecordsByPurchaseId(currentProduct.getId(), organId);
if (CollUtil.isNotEmpty(delayRecordsByPurchaseId)) {
// 产品有效时间展示为延期时间
return success(LocalDateTimeUtil.format(delayRecordsByPurchaseId.get(0).getDelayTime(), NORM_DATE_FORMATTER));
}
// 没有延期记录返回最新的购买记录的结束时间
expireTime = LocalDateTimeUtil.format(orgPurchaseList.get(0).getEndTime(), NORM_DATE_FORMATTER);
}
return success(expireTime);
}
@GetMapping("/page") @GetMapping("/page")
@Operation(summary = "获得组织分页") @Operation(summary = "查询组织分页")
@PreAuthorize("@ss.hasAnyPermissions('organizationLIst:query','machine-auth::create','base:plate:query')") @PreAuthorize("@ss.hasAnyPermissions('organizationLIst:query','machine-auth::create','base:plate:query')")
public CommonResult<PageResult<OrganRespVO>> getOrganPage(@Valid OrganPageReqVO pageVO) { public CommonResult<PageResult<OrganRespVO>> getOrganPage(@Valid OrganPageReqVO pageVO) {
PageResult<OrganizationDO> pageResult = organService.getOrganPage(pageVO); PageResult<OrganizationDO> pageResult = organService.getOrganPage(pageVO);
@@ -3,12 +3,15 @@ package com.cf.imes.module.system.controller.admin.organ.vo.organ;
import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelIgnore;
import com.cf.imes.framework.excel.core.annotations.DictFormat; import com.cf.imes.framework.excel.core.annotations.DictFormat;
import com.cf.imes.framework.excel.core.convert.DictConvert; import com.cf.imes.framework.excel.core.convert.DictConvert;
import com.cf.imes.framework.jackson.core.databind.LocalDateSerializer;
import com.cf.imes.module.system.enums.DictTypeConstants; import com.cf.imes.module.system.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@@ -54,7 +57,8 @@ public class OrganRespVO {
private String packageName; private String packageName;
@Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime expireTime; @JsonSerialize(using = LocalDateSerializer.class)
private LocalDate expireTime;
@Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer accountCount; private Integer accountCount;
@@ -8,7 +8,8 @@ import jakarta.validation.Valid;
import lombok.Data; import lombok.Data;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import java.time.LocalDateTime;
import java.time.LocalDate;
import java.util.List; import java.util.List;
@Schema(description = "管理后台 - 组织创建/修改 Request VO") @Schema(description = "管理后台 - 组织创建/修改 Request VO")
@@ -48,7 +49,7 @@ public class OrganSaveReqVO {
@Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "过期时间不能为空") @NotNull(message = "过期时间不能为空")
private LocalDateTime expireTime; private LocalDate expireTime;
@Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") @Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "账号数量不能为空") @NotNull(message = "账号数量不能为空")
@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*; import lombok.*;
import java.time.LocalDateTime; import java.time.LocalDate;
/** /**
* 组织 DO * 组织 DO
@@ -92,7 +92,7 @@ public class OrganizationDO extends BaseDO {
/** /**
* 过期时间 * 过期时间
*/ */
private LocalDateTime expireTime; private LocalDate expireTime;
/** /**
* 账号数量 * 账号数量
*/ */
@@ -269,7 +269,8 @@ public class PurchaseServiceImpl implements PurchaseService {
public List<PurchaseRecordDO> getOrgPurchaseList(Set<Long> organIds) { public List<PurchaseRecordDO> getOrgPurchaseList(Set<Long> organIds) {
return purchaseRecordMapper.selectList(new LambdaQueryWrapper<PurchaseRecordDO>() return purchaseRecordMapper.selectList(new LambdaQueryWrapper<PurchaseRecordDO>()
.in(PurchaseRecordDO::getOrganId, organIds) .in(PurchaseRecordDO::getOrganId, organIds)
.eq(PurchaseRecordDO::getDeleted, false)); .eq(PurchaseRecordDO::getDeleted, false)
.orderByDesc(PurchaseRecordDO::getCreateTime));
} }
@Override @Override
@@ -147,12 +147,11 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
accessTokenDO.setUserId(organizationDO.getContactUserId()); accessTokenDO.setUserId(organizationDO.getContactUserId());
accessTokenDO.setUserType(2); accessTokenDO.setUserType(2);
accessTokenDO.setClientId("default"); accessTokenDO.setClientId("default");
accessTokenDO.setExpiresTime(organizationDO.getExpireTime());
accessTokenDO.setDataCode(useDataCode); accessTokenDO.setDataCode(useDataCode);
accessTokenDO.setNickname(organizationDO.getName()); accessTokenDO.setNickname(organizationDO.getName());
accessTokenDO.setIsSupAdmin(true); accessTokenDO.setIsSupAdmin(true);
}else { } else {
// 因数据库不在存入缓存数据,所以直接从缓存中获取 // 因数据库不在存入缓存数据,所以直接从缓存中获取
// 数据库移除令牌存入,所以直接从缓存中获取 // 数据库移除令牌存入,所以直接从缓存中获取