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 { // 因数据库不在存入缓存数据,所以直接从缓存中获取 // 数据库移除令牌存入,所以直接从缓存中获取