1、修复组织产品过期无法购买产品;2、修复组织更新会校验产品列表;3、优化token中产品id不存在时的提示;

This commit is contained in:
gaoqr
2025-09-24 16:35:45 +08:00
parent 8a4a300c3b
commit 3c094e41c0
8 changed files with 52 additions and 10 deletions
@@ -26,6 +26,7 @@ public class GlobalErrorCodeConstants {
public static final ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 public static final ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许
public static final ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); public static final ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试");
public static final ErrorCode ORG_PRODUCT_EXPIRED = new ErrorCode(410, "组织产品套餐已过期,请续费后继续使用"); public static final ErrorCode ORG_PRODUCT_EXPIRED = new ErrorCode(410, "组织产品套餐已过期,请续费后继续使用");
public static final ErrorCode USER_PRODUCTID_NOT_EXIST = new ErrorCode(411, "账号登录异常,套餐信息不存在,请重新登陆");
// ========== 服务端错误段 ========== // ========== 服务端错误段 ==========
@@ -128,9 +128,16 @@ public class OrganSecurityWebFilter extends ApiRequestFilter {
* @param request * @param request
*/ */
private void validOrgnProduct(LoginUser user, HttpServletRequest request) { private void validOrgnProduct(LoginUser user, HttpServletRequest request) {
Long productId = user.getProductId();
boolean isManageEndPoint = Objects.equals(user.getUserType(), UserTypeEnum.ADMIN.getValue());
// 非管理端校验产品的有效性 // 非管理端校验产品的有效性
if (!Objects.equals(user.getUserType(), UserTypeEnum.ADMIN.getValue()) && !isProductIgnoreUrl(request)) { if (!isManageEndPoint) {
organFrameworkService.validOrgProduct(user.getOrganId(), user.getProductId()); if (ObjectUtil.isNull(productId)) {
throw new ServiceException(GlobalErrorCodeConstants.UNAUTHORIZED.getCode(), GlobalErrorCodeConstants.USER_PRODUCTID_NOT_EXIST.getMsg());
}
if (!isProductIgnoreUrl(request)) {
organFrameworkService.validOrgProduct(user.getOrganId(), productId);
}
} }
} }
@@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -81,7 +82,7 @@ public class OrganController {
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建组织") @Operation(summary = "创建组织")
@PreAuthorize("@ss.hasPermission('organizationLIst:create')") @PreAuthorize("@ss.hasPermission('organizationLIst:create')")
public CommonResult<Long> createOrgan(@Valid @RequestBody OrganSaveReqVO createReqVO) { public CommonResult<Long> createOrgan(@Validated(OrganSaveCreateGroup.class) @RequestBody OrganSaveReqVO createReqVO) {
return success(organService.createOrgan(createReqVO)); return success(organService.createOrgan(createReqVO));
} }
@@ -13,22 +13,22 @@ import java.time.LocalDate;
@Schema(description = "管理后台 - 组织创建购买产品 Request VO") @Schema(description = "管理后台 - 组织创建购买产品 Request VO")
@Data @Data
public class OrganCreateProductPurchaseReqVO { public class OrganCreateProductPurchaseReqVO {
@Schema(description = "产品编号",example = "1") @Schema(description = "产品编号", example = "1")
@NotNull(message = "产品编号不能为空") @NotNull(message = "产品编号不能为空", groups = {OrganSaveCreateGroup.class})
private Long productId; private Long productId;
@Schema(description = "定价规则编号",example = "1") @Schema(description = "定价规则编号", example = "1")
@NotNull(message = "定价规则编号不能为空") @NotNull(message = "定价规则编号不能为空", groups = {OrganSaveCreateGroup.class})
private Long productDetailsId; private Long productDetailsId;
@Schema(description = "产品购买金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Schema(description = "产品购买金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@NotNull(message = "产品购买金额不能为空") @NotNull(message = "产品购买金额不能为空", groups = {OrganSaveCreateGroup.class})
@DecimalMin(value = "0.01", message = "产品购买金额必须大于零") @DecimalMin(value = "0.01", message = "产品购买金额必须大于零")
@DecimalMax(value = "100000", message = "产品购买金额不能超过十万") @DecimalMax(value = "100000", message = "产品购买金额不能超过十万")
@Digits(integer = 6, fraction = 2, message = "产品购买金额格式不正确") @Digits(integer = 6, fraction = 2, message = "产品购买金额格式不正确")
private BigDecimal price; private BigDecimal price;
@Schema(description = "产品有效时间") @Schema(description = "产品有效时间")
@NotNull(message = "产品有效时间不能为空") @NotNull(message = "产品有效时间不能为空", groups = {OrganSaveCreateGroup.class})
private LocalDate productExpireDate; private LocalDate productExpireDate;
} }
@@ -0,0 +1,10 @@
package com.cf.imes.module.system.controller.admin.organ.vo.organ;
/**
* 组织新增请求校验组
*
* @author Gqr
* @since 2025/9/24 16:28
*/
public interface OrganSaveCreateGroup {
}
@@ -10,6 +10,7 @@ import com.cf.imes.framework.common.pojo.PageParam;
import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.common.util.date.LocalDateTimeUtils; import com.cf.imes.framework.common.util.date.LocalDateTimeUtils;
import com.cf.imes.framework.common.util.object.BeanUtils; import com.cf.imes.framework.common.util.object.BeanUtils;
import com.cf.imes.module.system.controller.admin.funds.delay.vo.ProductDelayRespVO;
import com.cf.imes.module.system.controller.admin.funds.organamount.vo.TotalSalesAmountRespVO; import com.cf.imes.module.system.controller.admin.funds.organamount.vo.TotalSalesAmountRespVO;
import com.cf.imes.module.system.controller.admin.funds.products.vo.productDetails.ProductDetailsPageReqVO; import com.cf.imes.module.system.controller.admin.funds.products.vo.productDetails.ProductDetailsPageReqVO;
import com.cf.imes.module.system.controller.admin.funds.purchase.vo.OrgEarliestPurchaseProductRespVO; import com.cf.imes.module.system.controller.admin.funds.purchase.vo.OrgEarliestPurchaseProductRespVO;
@@ -30,6 +31,7 @@ import com.cf.imes.module.system.enums.pay.ProductDurationUnitEnum;
import com.cf.imes.module.system.enums.pay.PurchaseRecordStatusEnum; import com.cf.imes.module.system.enums.pay.PurchaseRecordStatusEnum;
import com.cf.imes.module.system.enums.pay.TradeTypeEnum; import com.cf.imes.module.system.enums.pay.TradeTypeEnum;
import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties; import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties;
import com.cf.imes.module.system.service.funds.delay.ProductDelayService;
import com.cf.imes.module.system.service.funds.products.ProductsDetailService; import com.cf.imes.module.system.service.funds.products.ProductsDetailService;
import com.cf.imes.module.system.service.organ.OrganService; import com.cf.imes.module.system.service.organ.OrganService;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
@@ -70,6 +72,10 @@ public class PurchaseServiceImpl implements PurchaseService {
@Lazy @Lazy
private OrganService organService; private OrganService organService;
@Resource
@Lazy
private ProductDelayService productDelayService;
@Override @Override
public PurchaseRecordDO getRecord(Long id) { public PurchaseRecordDO getRecord(Long id) {
return purchaseRecordMapper.selectById(id); return purchaseRecordMapper.selectById(id);
@@ -119,12 +125,17 @@ public class PurchaseServiceImpl implements PurchaseService {
// 查询购买记录中还有效的最晚一条 // 查询购买记录中还有效的最晚一条
PurchaseRecordDO purchaseRecordDO = purchaseRecordMapper.selectOne(new LambdaQueryWrapper<PurchaseRecordDO>() PurchaseRecordDO purchaseRecordDO = purchaseRecordMapper.selectOne(new LambdaQueryWrapper<PurchaseRecordDO>()
.eq(PurchaseRecordDO::getOrganId, organId) .eq(PurchaseRecordDO::getOrganId, organId)
.gt(PurchaseRecordDO::getEndTime, LocalDateTime.now())
.eq(PurchaseRecordDO::getDeleted, false) .eq(PurchaseRecordDO::getDeleted, false)
.eq(PurchaseRecordDO::getStatus, PurchaseRecordStatusEnum.ACTIVE.getStatus()) .eq(PurchaseRecordDO::getStatus, PurchaseRecordStatusEnum.ACTIVE.getStatus())
.orderByDesc(PurchaseRecordDO::getCreateTime) .orderByDesc(PurchaseRecordDO::getCreateTime)
.last("limit 1")); .last("limit 1"));
if (ObjectUtil.isNotNull(purchaseRecordDO)) { if (ObjectUtil.isNotNull(purchaseRecordDO)) {
// 查询延期记录
List<ProductDelayRespVO> recordsByPurchaseId = productDelayService.getRecordsByPurchaseId(purchaseRecordDO.getId(), organId);
if(CollUtil.isNotEmpty(recordsByPurchaseId)) {
// 延期记录是按自增id逆序的,第一条的延期后时间作为产品到期时间
purchaseRecordDO.setEndTime(recordsByPurchaseId.get(0).getDelayTime());
}
return new OrgEarliestPurchaseProductRespVO(purchaseRecordDO, productsDetailMapper.selectById(purchaseRecordDO.getProductDetailsId())); return new OrgEarliestPurchaseProductRespVO(purchaseRecordDO, productsDetailMapper.selectById(purchaseRecordDO.getProductDetailsId()));
} }
return null; return null;
@@ -199,6 +199,12 @@ chenfeng:
ignore-product-urls: ignore-product-urls:
- /admin-api/system/auth/get-permission-info - /admin-api/system/auth/get-permission-info
- /admin-api/system/dict-data/list-all-simple - /admin-api/system/dict-data/list-all-simple
- /admin-api/system/amount
- /admin-api/system/organ/get
- /admin-api/system/products/available
- /admin-api/system/product-details/organ/purchase
- /admin-api/system/purchase
- /admin-api/system/pay/product
ignore-tables: ignore-tables:
- system_organization - system_organization
- system_tenant_package - system_tenant_package
@@ -215,6 +215,12 @@ chenfeng:
ignore-product-urls: ignore-product-urls:
- /admin-api/system/auth/get-permission-info - /admin-api/system/auth/get-permission-info
- /admin-api/system/dict-data/list-all-simple - /admin-api/system/dict-data/list-all-simple
- /admin-api/system/amount
- /admin-api/system/organ/get
- /admin-api/system/products/available
- /admin-api/system/product-details/organ/purchase
- /admin-api/system/purchase
- /admin-api/system/pay/product
ignore-tables: ignore-tables:
- system_organization - system_organization
- system_tenant_package - system_tenant_package