From 23f8a2f2c8882ec1243d6e58ac3ce0083bd8bd2f Mon Sep 17 00:00:00 2001
From: gaoqr <13665037151@163.com>
Date: Mon, 13 Oct 2025 11:27:54 +0800
Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E6=96=B0=E5=A2=9E=E7=BB=84=E7=BB=87?=
=?UTF-8?q?=E4=BA=A7=E5=93=81=E6=9C=89=E6=95=88=E6=9C=9F=E6=97=B6=E9=97=B4?=
=?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=EF=BC=9B2=E3=80=81?=
=?UTF-8?q?=E7=BB=84=E7=BB=87=E6=9F=A5=E8=AF=A2=E3=80=81=E5=88=86=E9=A1=B5?=
=?UTF-8?q?=E7=9A=84=E8=B6=85=E6=9C=9F=E6=97=B6=E9=97=B4=E4=BF=AE=E6=94=B9?=
=?UTF-8?q?=E4=B8=BADate=E7=B1=BB=E5=9E=8B=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../framework/common/util/date/DateUtils.java | 5 ++
.../core/databind/LocalDateSerializer.java | 24 +++++++++
.../system/enums/ErrorCodeConstants.java | 1 +
.../admin/organ/OrganController.java | 51 +++++++++++++++++--
.../admin/organ/vo/organ/OrganRespVO.java | 6 ++-
.../admin/organ/vo/organ/OrganSaveReqVO.java | 5 +-
.../dal/dataobject/organ/OrganizationDO.java | 4 +-
.../funds/purchase/PurchaseServiceImpl.java | 3 +-
.../oauth2/OAuth2TokenServiceImpl.java | 3 +-
9 files changed, 91 insertions(+), 11 deletions(-)
create mode 100644 cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/jackson/core/databind/LocalDateSerializer.java
diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/date/DateUtils.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/date/DateUtils.java
index 1723ddac7..f3dd79b1a 100644
--- a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/date/DateUtils.java
+++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/date/DateUtils.java
@@ -76,6 +76,11 @@ public class DateUtils {
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) {
return endTime.getTime() - startTime.getTime();
}
diff --git a/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/jackson/core/databind/LocalDateSerializer.java b/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/jackson/core/databind/LocalDateSerializer.java
new file mode 100644
index 000000000..a4e42e440
--- /dev/null
+++ b/cf-framework/cf-spring-boot-starter-web/src/main/java/com/cf/imes/framework/jackson/core/databind/LocalDateSerializer.java
@@ -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序列化规则
+ *
+ * 会将LocalDateTime序列化为毫秒级时间戳
+ */
+public class LocalDateSerializer extends JsonSerializer {
+
+ 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());
+ }
+}
diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java
index 7e82afdcd..a1aeac755 100644
--- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java
+++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java
@@ -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_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_EXPIRETIME_PRODUCTID_LACK = new ErrorCode(1_002_015_010, "请选择要购买的产品");
// ========== 组织套餐 1-002-016-000 ==========
public static final ErrorCode TENANT_PACKAGE_NOT_EXISTS = new ErrorCode(1_002_016_000, "组织套餐不存在");
diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/OrganController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/OrganController.java
index da06ac032..b24d21f15 100644
--- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/OrganController.java
+++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/OrganController.java
@@ -2,6 +2,7 @@ package com.cf.imes.module.system.controller.admin.organ;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.pojo.CommonResult;
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.excel.core.util.ExcelUtils;
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.controller.admin.funds.delay.vo.ProductDelayRespVO;
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.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.pojo.CommonResult.success;
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;
@Tag(name = "管理后台 - 组织")
@@ -105,9 +109,8 @@ public class OrganController {
}
@GetMapping("/get")
- @Operation(summary = "获得组织")
+ @Operation(summary = "查询组织信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
-// @PreAuthorize("@ss.hasPermission('organizationLIst:query')")
public CommonResult getOrgan(@RequestParam("id") Long id) {
OrganizationDO organ = organService.getOrgan(id);
if (ObjectUtil.isNull(organ)) {
@@ -135,8 +138,50 @@ public class OrganController {
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 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 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 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")
- @Operation(summary = "获得组织分页")
+ @Operation(summary = "查询组织分页")
@PreAuthorize("@ss.hasAnyPermissions('organizationLIst:query','machine-auth::create','base:plate:query')")
public CommonResult> getOrganPage(@Valid OrganPageReqVO pageVO) {
PageResult pageResult = organService.getOrganPage(pageVO);
diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganRespVO.java
index 3f4a2760e..4413892f3 100644
--- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganRespVO.java
+++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganRespVO.java
@@ -3,12 +3,15 @@ package com.cf.imes.module.system.controller.admin.organ.vo.organ;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.cf.imes.framework.excel.core.annotations.DictFormat;
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.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
+import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
@@ -54,7 +57,8 @@ public class OrganRespVO {
private String packageName;
@Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime expireTime;
+ @JsonSerialize(using = LocalDateSerializer.class)
+ private LocalDate expireTime;
@Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Integer accountCount;
diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java
index a1933ad46..b21ddc814 100644
--- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java
+++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java
@@ -8,7 +8,8 @@ import jakarta.validation.Valid;
import lombok.Data;
import jakarta.validation.constraints.*;
-import java.time.LocalDateTime;
+
+import java.time.LocalDate;
import java.util.List;
@Schema(description = "管理后台 - 组织创建/修改 Request VO")
@@ -48,7 +49,7 @@ public class OrganSaveReqVO {
@Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "过期时间不能为空")
- private LocalDateTime expireTime;
+ private LocalDate expireTime;
@Schema(description = "账号数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "账号数量不能为空")
diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java
index 05cced908..866cab592 100644
--- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java
+++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/organ/OrganizationDO.java
@@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
-import java.time.LocalDateTime;
+import java.time.LocalDate;
/**
* 组织 DO
@@ -92,7 +92,7 @@ public class OrganizationDO extends BaseDO {
/**
* 过期时间
*/
- private LocalDateTime expireTime;
+ private LocalDate expireTime;
/**
* 账号数量
*/
diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java
index f20ad7ea9..0fa347f0a 100644
--- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java
+++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/purchase/PurchaseServiceImpl.java
@@ -269,7 +269,8 @@ public class PurchaseServiceImpl implements PurchaseService {
public List getOrgPurchaseList(Set organIds) {
return purchaseRecordMapper.selectList(new LambdaQueryWrapper()
.in(PurchaseRecordDO::getOrganId, organIds)
- .eq(PurchaseRecordDO::getDeleted, false));
+ .eq(PurchaseRecordDO::getDeleted, false)
+ .orderByDesc(PurchaseRecordDO::getCreateTime));
}
@Override
diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java
index a3a814142..e2fb8e34a 100644
--- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java
+++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/oauth2/OAuth2TokenServiceImpl.java
@@ -147,12 +147,11 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
accessTokenDO.setUserId(organizationDO.getContactUserId());
accessTokenDO.setUserType(2);
accessTokenDO.setClientId("default");
- accessTokenDO.setExpiresTime(organizationDO.getExpireTime());
accessTokenDO.setDataCode(useDataCode);
accessTokenDO.setNickname(organizationDO.getName());
accessTokenDO.setIsSupAdmin(true);
- }else {
+ } else {
// 因数据库不在存入缓存数据,所以直接从缓存中获取
// 数据库移除令牌存入,所以直接从缓存中获取