1、账户明细接口增加非管理端只能查当前组织数据逻辑;2、产品时长单位和正常年月日单位枚举区分;

This commit is contained in:
gaoqr
2025-09-15 12:08:19 +08:00
parent 4cd5869b81
commit 40b23a78d1
12 changed files with 155 additions and 21 deletions
@@ -7,6 +7,7 @@ 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.controller.admin.funds.balancedetails.vo.BalanceDetailsPageReqVO; import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsPageReqVO;
import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsRespVO; import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsRespVO;
import com.cf.imes.module.system.service.funds.incomeandexpense.IncomeExpenseService; import com.cf.imes.module.system.service.funds.incomeandexpense.IncomeExpenseService;
@@ -29,7 +30,7 @@ import static com.cf.imes.framework.operatelog.core.enums.OperateTypeEnum.EXPORT
/** /**
* @author 组织余额明细 * @author 组织余额明细
*/ */
@Tag(name = "管理后台 - 组织余额明细") @Tag(name = "管理后台 - 组织账户明细")
@RestController @RestController
@RequestMapping("/system/balance") @RequestMapping("/system/balance")
@Validated @Validated
@@ -42,6 +43,10 @@ public class BalanceDetailsController {
@GetMapping("") @GetMapping("")
@Operation(summary = "查询组织账户明细分页") @Operation(summary = "查询组织账户明细分页")
public CommonResult<PageResult<BalanceDetailsRespVO>> getBalanceDetailsPage(@Valid BalanceDetailsPageReqVO pageReqVO) { public CommonResult<PageResult<BalanceDetailsRespVO>> getBalanceDetailsPage(@Valid BalanceDetailsPageReqVO pageReqVO) {
boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint();
if (!manageEndPoint) {
pageReqVO.setOrganId(SecurityFrameworkUtils.getUserOrganId());
}
return success(incomeExpenseService.getBalanceDetailsPage(pageReqVO)); return success(incomeExpenseService.getBalanceDetailsPage(pageReqVO));
} }
@@ -50,6 +55,10 @@ public class BalanceDetailsController {
@OperateLog(type = EXPORT) @OperateLog(type = EXPORT)
public void balanceDetailsExport(@Valid BalanceDetailsPageReqVO pageReqVO, public void balanceDetailsExport(@Valid BalanceDetailsPageReqVO pageReqVO,
HttpServletResponse response) throws IOException { HttpServletResponse response) throws IOException {
boolean manageEndPoint = SecurityFrameworkUtils.isManageEndPoint();
if (!manageEndPoint) {
pageReqVO.setOrganId(null);
}
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<BalanceDetailsRespVO> list = incomeExpenseService.getBalanceDetailsPage(pageReqVO).getList(); List<BalanceDetailsRespVO> list = incomeExpenseService.getBalanceDetailsPage(pageReqVO).getList();
// 导出 Excel // 导出 Excel
@@ -1,8 +1,8 @@
package com.cf.imes.module.system.controller.admin.funds.products.vo.productDetails; package com.cf.imes.module.system.controller.admin.funds.products.vo.productDetails;
import com.cf.imes.framework.common.validation.NumberValid; import com.cf.imes.framework.common.validation.NumberValid;
import com.cf.imes.module.system.validation.products.ProductDurationUnitValid;
import com.cf.imes.module.system.validation.products.ProductType; import com.cf.imes.module.system.validation.products.ProductType;
import com.cf.imes.module.system.validation.products.TimeUnitValid;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMax; import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.DecimalMin;
@@ -31,7 +31,7 @@ public class ProductDetailsSaveReqVO {
private String duration; private String duration;
@Schema(description = "产品时长单位,0:年、1:月", example = "1") @Schema(description = "产品时长单位,0:年、1:月", example = "1")
@TimeUnitValid @ProductDurationUnitValid
private Integer durationUnit; private Integer durationUnit;
@Schema(description = "产品产量", requiredMode = Schema.RequiredMode.REQUIRED, example = "") @Schema(description = "产品产量", requiredMode = Schema.RequiredMode.REQUIRED, example = "")
@@ -41,7 +41,7 @@ public class ProductDetailsSaveReqVO {
private String giftDuration; private String giftDuration;
@Schema(description = "赠送时长单位,0:年、1:月", example = "1") @Schema(description = "赠送时长单位,0:年、1:月", example = "1")
@TimeUnitValid @ProductDurationUnitValid
private Integer giftDurationUnit; private Integer giftDurationUnit;
@Schema(description = "赠送产量", requiredMode = Schema.RequiredMode.REQUIRED, example = "") @Schema(description = "赠送产量", requiredMode = Schema.RequiredMode.REQUIRED, example = "")
@@ -8,7 +8,7 @@ import com.cf.imes.framework.excel.core.convert.DictConvert;
import com.cf.imes.framework.excel.core.convert.EnumConvert; import com.cf.imes.framework.excel.core.convert.EnumConvert;
import com.cf.imes.module.system.enums.DictTypeConstants; import com.cf.imes.module.system.enums.DictTypeConstants;
import com.cf.imes.module.system.enums.pay.InvoiceStatusEnum; import com.cf.imes.module.system.enums.pay.InvoiceStatusEnum;
import com.cf.imes.module.system.enums.pay.DurationUnitEnum; import com.cf.imes.module.system.enums.pay.ProductDurationUnitEnum;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@@ -52,7 +52,7 @@ public class PurchaseRecordRespVO {
@Schema(description = "购买时长单位,0:年、1:月", example = "1") @Schema(description = "购买时长单位,0:年、1:月", example = "1")
@ExcelProperty(value = "购买时长单位", converter = EnumConvert.class) @ExcelProperty(value = "购买时长单位", converter = EnumConvert.class)
@EnumFormat(value = DurationUnitEnum.class) @EnumFormat(value = ProductDurationUnitEnum.class)
private Integer purchaseDurationUnit; private Integer purchaseDurationUnit;
@Schema(description = "赠送时长", example = "1") @Schema(description = "赠送时长", example = "1")
@@ -61,7 +61,7 @@ public class PurchaseRecordRespVO {
@Schema(description = "赠送时长单位,0:年、1:月", example = "1") @Schema(description = "赠送时长单位,0:年、1:月", example = "1")
@ExcelProperty(value = "赠送时长单位", converter = EnumConvert.class) @ExcelProperty(value = "赠送时长单位", converter = EnumConvert.class)
@EnumFormat(value = DurationUnitEnum.class) @EnumFormat(value = ProductDurationUnitEnum.class)
private Integer giftDurationUnit; private Integer giftDurationUnit;
@Schema(description = "支付方式") @Schema(description = "支付方式")
@@ -18,7 +18,8 @@ import java.util.Objects;
public enum DurationUnitEnum implements IntArrayValuable, BaseEnum { public enum DurationUnitEnum implements IntArrayValuable, BaseEnum {
YEAR(0, ""), YEAR(0, ""),
MONTH(1, ""),; MONTH(1, ""),
DAY(2, "");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DurationUnitEnum::getCode).toArray(); public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(DurationUnitEnum::getCode).toArray();
@@ -44,6 +45,10 @@ public enum DurationUnitEnum implements IntArrayValuable, BaseEnum {
return Objects.equals(MONTH.code, name); return Objects.equals(MONTH.code, name);
} }
public static boolean isDay(String name) {
return Objects.equals(DAY.code, name);
}
public static DurationUnitEnum fromStatus(Integer status) { public static DurationUnitEnum fromStatus(Integer status) {
return Arrays.stream(values()) return Arrays.stream(values())
.filter(bean -> Objects.equals(bean.code, status)) .filter(bean -> Objects.equals(bean.code, status))
@@ -0,0 +1,64 @@
package com.cf.imes.module.system.enums.pay;
import com.cf.imes.framework.common.core.IntArrayValuable;
import com.cf.imes.framework.excel.core.convert.BaseEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.Objects;
/**
* 时长单位态枚举
*
* @author 晨丰科技
*/
@Getter
@AllArgsConstructor
public enum ProductDurationUnitEnum implements IntArrayValuable, BaseEnum {
YEAR(0, ""),
MONTH(1, "");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(ProductDurationUnitEnum::getCode).toArray();
/**
* 状态值
*/
private final Integer code;
/**
* 状态名
*/
private final String desc;
@Override
public int[] array() {
return ARRAYS;
}
public static boolean isYear(String name) {
return Objects.equals(YEAR.code, name);
}
public static boolean isMonth(String name) {
return Objects.equals(MONTH.code, name);
}
public static ProductDurationUnitEnum fromStatus(Integer status) {
return Arrays.stream(values())
.filter(bean -> Objects.equals(bean.code, status))
.findFirst()
.orElse(null);
}
/**
* 获取描述desc,否则返回null
*
* @param status
* @return
*/
public static String getDesc(Integer status) {
ProductDurationUnitEnum unit = fromStatus(status);
return unit != null ? unit.getDesc() : null;
}
}
@@ -3,7 +3,6 @@ package com.cf.imes.module.system.service.funds.incomeandexpense;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.pojo.PageResult;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsPageReqVO; import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsPageReqVO;
import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsRespVO; import com.cf.imes.module.system.controller.admin.funds.balancedetails.vo.BalanceDetailsRespVO;
import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO; import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO;
@@ -43,10 +42,6 @@ public class IncomeExpenseServiceImpl implements IncomeExpenseService {
@Override @Override
public PageResult<BalanceDetailsRespVO> getBalanceDetailsPage(BalanceDetailsPageReqVO pageReqVO) { public PageResult<BalanceDetailsRespVO> getBalanceDetailsPage(BalanceDetailsPageReqVO pageReqVO) {
if (ObjectUtil.isNull(pageReqVO.getOrganId())) {
pageReqVO.setOrganId(SecurityFrameworkUtils.getUserOrganId());
}
PageResult<IncomeExpenseDetailsDO> pageResult = incomeExpenseDetailsMapper.selectDetailsPage(pageReqVO); PageResult<IncomeExpenseDetailsDO> pageResult = incomeExpenseDetailsMapper.selectDetailsPage(pageReqVO);
List<IncomeExpenseDetailsDO> pageResultList = pageResult.getList(); List<IncomeExpenseDetailsDO> pageResultList = pageResult.getList();
if(CollUtil.isEmpty(pageResultList)){ if(CollUtil.isEmpty(pageResultList)){
@@ -12,7 +12,7 @@ import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDO;
import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDetailDO; import com.cf.imes.module.system.dal.dataobject.funds.products.ProductsDetailDO;
import com.cf.imes.module.system.dal.mysql.funds.products.ProductsDetailMapper; import com.cf.imes.module.system.dal.mysql.funds.products.ProductsDetailMapper;
import com.cf.imes.module.system.dal.mysql.funds.products.ProductsMapper; import com.cf.imes.module.system.dal.mysql.funds.products.ProductsMapper;
import com.cf.imes.module.system.enums.pay.DurationUnitEnum; import com.cf.imes.module.system.enums.pay.ProductDurationUnitEnum;
import com.cf.imes.module.system.enums.products.ProductStatusEnum; import com.cf.imes.module.system.enums.products.ProductStatusEnum;
import com.cf.imes.module.system.enums.products.ProductsPurchaseTypeEnum; import com.cf.imes.module.system.enums.products.ProductsPurchaseTypeEnum;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -197,7 +197,7 @@ public class ProductsDetailServiceImpl implements ProductsDetailService {
// 时长去重 // 时长去重
count = productDetailsMapper.selectCountByDuration(createReqVO.getProductId(), createReqVO.getId(), duration, durationUnit); count = productDetailsMapper.selectCountByDuration(createReqVO.getProductId(), createReqVO.getId(), duration, durationUnit);
if (count > 0) { if (count > 0) {
throw ServiceExceptionUtil.exception(PRODUCTS_DETAIL_DURATION_EXIST, duration, DurationUnitEnum.getDesc(durationUnit)); throw ServiceExceptionUtil.exception(PRODUCTS_DETAIL_DURATION_EXIST, duration, ProductDurationUnitEnum.getDesc(durationUnit));
} }
} else if (createReqVO.getPurchaseType() == 1) { } else if (createReqVO.getPurchaseType() == 1) {
//产量去重 //产量去重
@@ -5,7 +5,6 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.exception.ServiceException;
import com.cf.imes.framework.common.util.date.LocalDateTimeUtils; import com.cf.imes.framework.common.util.date.LocalDateTimeUtils;
import com.cf.imes.framework.id.core.util.SnowflakeIdWorker3rd;
import com.cf.imes.framework.pay.config.ChenfengPayConfig; import com.cf.imes.framework.pay.config.ChenfengPayConfig;
import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils;
import com.cf.imes.module.system.controller.admin.funds.products.vo.product.ProductProcessorRespVO; import com.cf.imes.module.system.controller.admin.funds.products.vo.product.ProductProcessorRespVO;
@@ -21,8 +20,8 @@ import com.cf.imes.module.system.enums.pay.PayChannelCodeEnum;
import com.cf.imes.module.system.enums.pay.PayConstants; import com.cf.imes.module.system.enums.pay.PayConstants;
import com.cf.imes.module.system.enums.pay.PayOrderStatusEnum; import com.cf.imes.module.system.enums.pay.PayOrderStatusEnum;
import com.cf.imes.module.system.enums.pay.PayProductChannelCodeEnum; import com.cf.imes.module.system.enums.pay.PayProductChannelCodeEnum;
import com.cf.imes.module.system.enums.pay.ProductDurationUnitEnum;
import com.cf.imes.module.system.enums.pay.TradeTypeEnum; import com.cf.imes.module.system.enums.pay.TradeTypeEnum;
import com.cf.imes.module.system.enums.pay.DurationUnitEnum;
import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties; import com.cf.imes.module.system.framework.snowflake.config.MybatisIdProperties;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -644,7 +643,7 @@ public class PayProductProcessor {
* @return * @return
*/ */
private static LocalDate addTime(LocalDate time, int duration, int unit) { private static LocalDate addTime(LocalDate time, int duration, int unit) {
switch (DurationUnitEnum.fromStatus(unit)) { switch (ProductDurationUnitEnum.fromStatus(unit)) {
case YEAR: case YEAR:
return time.plusYears(duration); return time.plusYears(duration);
case MONTH: case MONTH:
@@ -21,9 +21,9 @@ import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@Documented @Documented
@Constraint( @Constraint(
validatedBy = {TimeUnitValidator.class} validatedBy = {DurationUnitValidator.class}
) )
public @interface TimeUnitValid { public @interface DurationUnitValid {
String message() default "时长单位不合法"; String message() default "时长单位不合法";
Class<?>[] groups() default {}; Class<?>[] groups() default {};
@@ -13,7 +13,7 @@ import java.util.Objects;
* @author Gqr * @author Gqr
* @since 2025/8/11 14:19 * @since 2025/8/11 14:19
*/ */
public class TimeUnitValidator implements ConstraintValidator<TimeUnitValid, Integer> { public class DurationUnitValidator implements ConstraintValidator<DurationUnitValid, Integer> {
@Override @Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) { public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
@@ -0,0 +1,32 @@
package com.cf.imes.module.system.validation.products;
import jakarta.validation.Constraint;
import jakarta.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 产品时长单位校验注解
*
* @author Gqr
* @since 2025/8/11 14:18
*/
@Target({
ElementType.FIELD,
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {ProductDurationUnitValidator.class}
)
public @interface ProductDurationUnitValid {
String message() default "时长单位不合法";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
@@ -0,0 +1,30 @@
package com.cf.imes.module.system.validation.products;
import cn.hutool.core.util.ObjectUtil;
import com.cf.imes.module.system.enums.pay.ProductDurationUnitEnum;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.Objects;
/**
* 产品时长单位校验器
*
* @author Gqr
* @since 2025/8/11 14:19
*/
public class ProductDurationUnitValidator implements ConstraintValidator<ProductDurationUnitValid, Integer> {
@Override
public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
if (ObjectUtil.isNull(value)) {
return true;
}
for (ProductDurationUnitEnum unitEnum : ProductDurationUnitEnum.values()) {
if (Objects.equals(unitEnum.getCode(), value)) {
return true;
}
}
return false;
}
}