From 8a4a300c3b44d985805e82285260af1e1776fa7e Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Wed, 24 Sep 2025 15:36:12 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=A7=BB=E9=99=A4=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E4=B8=AD=E7=9A=84=E7=BB=84=E7=BB=87=E5=A5=97?= =?UTF-8?q?=E9=A4=90=E4=BA=A4=E9=9B=86=E6=A3=80=E6=9F=A5=EF=BC=9B2?= =?UTF-8?q?=E3=80=81=E5=AE=8C=E5=96=84=E7=BB=84=E7=BB=87=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E6=9C=89=E6=95=88=E6=80=A7=E7=9A=84=E6=A3=80=E6=9F=A5=E8=83=BD?= =?UTF-8?q?=E5=8A=9B=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=BB=B6=E6=9C=9F=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E7=9A=84=E8=8C=83=E5=9B=B4=E6=A3=80=E6=9F=A5=EF=BC=9B?= =?UTF-8?q?3=E3=80=81=E8=B4=AD=E4=B9=B0=E8=AE=B0=E5=BD=95=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2/=E5=AF=BC=E5=87=BA=E5=AD=97=E6=AE=B5=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3=EF=BC=9B4=E3=80=81=E9=99=A4=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E7=BB=84=E7=BB=87=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E8=AE=A2?= =?UTF-8?q?=E8=B4=AD=E4=BB=A5=E5=A4=96=E7=9A=84=E9=A6=96=E6=AC=A1=E8=AE=A2?= =?UTF-8?q?=E8=B4=AD=E5=BC=82=E5=B8=B8=E4=BF=AE=E5=A4=8D=EF=BC=8C=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=85=B6=E4=BB=96=E9=A6=96=E6=AC=A1=E8=AE=A2=E8=B4=AD?= =?UTF-8?q?=E7=9A=84=E6=9C=88=E5=9D=87=E5=8D=95=E4=BB=B7=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/pay/PayProductProcessor.java | 53 ++++++++++++++----- .../permission/PermissionServiceImpl.java | 13 ++--- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessor.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessor.java index 8d31f2ef4..564f3047a 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessor.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayProductProcessor.java @@ -53,35 +53,49 @@ import static com.cf.imes.module.system.enums.ErrorCodeConstants.PRODUCT_PURCHAS */ public class PayProductProcessor { + // 当次订购的产品 private ProductsDO productsDO; + // 当次订购的定价规则 private ProductsDetailDO productsDetailDO; + // 组织产品的首次订购记录 private PurchaseRecordDO orgInitialPurchaseRecord; + // 当前组织资金信息 private OrganAmountDO organAmountDO; + // 组织id private Long organId; + // 支付配置 private ChenfengPayConfig payConfig; + // id生成规则配置 private MybatisIdProperties mybatisIdProperties; + // 标记本次订购是否首次 private boolean initialized = false; - private PreviouProductDelayRespVO previouProductDelayRespVO; + // 前序购买记录的延期记录 + private List delayRespVOList; + // 前序购买记录 private PurchaseRecordDO previousPurchaseRecord; + // 本地订购产品的开始时间 private LocalDate startTime = LocalDate.now(); + // 本地订购产品的月均单价 + private BigDecimal monthAverageAmount = BigDecimal.ZERO; + public PayProductProcessor(ProductsDO productsDO, ProductsDetailDO productsDetailDO, PurchaseRecordDO orgInitialPurchaseRecord, PreviouProductDelayRespVO previouProductDelayRespVO, OrganAmountDO organAmountDO, Long organId, ChenfengPayConfig payConfig, MybatisIdProperties mybatisIdProperties) { this.productsDO = productsDO; this.productsDetailDO = productsDetailDO; this.orgInitialPurchaseRecord = orgInitialPurchaseRecord; - this.previouProductDelayRespVO = previouProductDelayRespVO; if (ObjectUtil.isNotNull(previouProductDelayRespVO.getPreviouPurchaseRecord())) { + delayRespVOList = previouProductDelayRespVO.getDelayRespVOList(); previousPurchaseRecord = previouProductDelayRespVO.getPreviouPurchaseRecord(); // 如果有前置购买记录,那么新的开始时间是上一次订购的结束时间 startTime = previousPurchaseRecord.getEndTime(); @@ -105,6 +119,8 @@ public class PayProductProcessor { price = computePrice(orgInitialPurchaseRecord, productsDetailDO); } else { price = productsDetailDO.getCurrentPrice(); + // 首次订购计算月均单价 + monthAverageAmount = computeInitialProductPayMonthAverageAmount(price); // 首次购买记录是空,那么当前就是首次订购 initialized = true; } @@ -167,7 +183,7 @@ public class PayProductProcessor { .paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .accountBalanceSpent(price) .isInvocing(InvoiceStatusEnum.INVOICABLE.getCode()) .initial(initialized) @@ -225,7 +241,7 @@ public class PayProductProcessor { .paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .accountBalanceSpent(price) .isInvocing(InvoiceStatusEnum.INVOICABLE.getCode()) .initial(initialized) @@ -280,7 +296,7 @@ public class PayProductProcessor { .paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .alipaySpent(price) .initial(initialized) .status(PurchaseRecordStatusEnum.ACTIVE.getStatus()) @@ -321,7 +337,7 @@ public class PayProductProcessor { .paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .wechatSpent(price) .initial(initialized) .status(PurchaseRecordStatusEnum.ACTIVE.getStatus()) @@ -367,7 +383,7 @@ public class PayProductProcessor { .paymentMethod(PayProductChannelCodeEnum.BALANCE_AND_GIFT.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .isInvocing(InvoiceStatusEnum.INVOICABLE.getCode()) .initial(initialized) .status(PurchaseRecordStatusEnum.ACTIVE.getStatus()) @@ -445,7 +461,7 @@ public class PayProductProcessor { .paymentMethod(PayChannelCodeEnum.ALIPAY_PC.equals(payChannelCodeEnum) ? PayProductChannelCodeEnum.BALANCE_AND_GIFT_AND_ALIPAY.getCode() : PayProductChannelCodeEnum.BALANCE_AND_GIFT_AND_WECHAT.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .initial(initialized) .status(PurchaseRecordStatusEnum.ACTIVE.getStatus()) .build(); @@ -525,7 +541,7 @@ public class PayProductProcessor { .paymentMethod(PayChannelCodeEnum.ALIPAY_PC.equals(payChannelCodeEnum) ? PayProductChannelCodeEnum.GIFT_AND_ALIPAY.getCode() : PayProductChannelCodeEnum.GIFT_AND_WECHAT.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .initial(initialized) .status(PurchaseRecordStatusEnum.ACTIVE.getStatus()) .build(); @@ -607,7 +623,7 @@ public class PayProductProcessor { .paymentMethod(PayProductChannelCodeEnum.BALANCE_AND_GIFT.getCode()) .totalAmount(price) .originalAmount(productsDetailDO.getCurrentPrice()) - .monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount()) + .monthAverageAmount(monthAverageAmount) .initial(initialized) .status(PurchaseRecordStatusEnum.ACTIVE.getStatus()) .build(); @@ -718,7 +734,6 @@ public class PayProductProcessor { endTime = addTime(startTime, giftDuration, giftDurationUnit); } - List delayRespVOList = previouProductDelayRespVO.getDelayRespVOList(); if (CollUtil.isNotEmpty(delayRespVOList)) { // 根据延期列表计算新的结束时间 endTime = calculateDelayEndTime(startTime, endTime, delayRespVOList); @@ -793,7 +808,7 @@ public class PayProductProcessor { */ private BigDecimal computePrice(PurchaseRecordDO orgInitialPurchaseRecord, ProductsDetailDO productsDetailDO) { // 月均单价 - BigDecimal monthAverageAmount = orgInitialPurchaseRecord.getMonthAverageAmount(); + monthAverageAmount = orgInitialPurchaseRecord.getMonthAverageAmount(); // 定价规则的折扣 BigDecimal discount = productsDetailDO.getDiscount(); @@ -848,4 +863,18 @@ public class PayProductProcessor { return totalAmount; } + /** + * 计算首次订购的月均单价 + */ + private BigDecimal computeInitialProductPayMonthAverageAmount(BigDecimal price) { + Integer duration = productsDetailDO.getDuration(); + BigDecimal monthAverageAmount; + switch (ProductDurationUnitEnum.fromStatus(productsDetailDO.getDurationUnit())) { + case YEAR -> monthAverageAmount = price.divide(new BigDecimal(duration * 12), 2, RoundingMode.DOWN); + case MONTH -> monthAverageAmount = price.divide(new BigDecimal(duration), 2, RoundingMode.DOWN); + default -> throw new ServiceException(PRODUCTS_DETAIL_DURATION_UNIT_NOT_SUPPORT); + } + return monthAverageAmount; + } + } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java index 8dd021faa..c8de591ae 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/permission/PermissionServiceImpl.java @@ -19,7 +19,6 @@ import com.cf.imes.module.system.constants.permission.InternalRoleConstants; import com.cf.imes.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleUserReqVO; import com.cf.imes.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO; import com.cf.imes.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO; -import com.cf.imes.module.system.dal.dataobject.organ.OrganizationDO; import com.cf.imes.module.system.dal.dataobject.permission.MenuDO; import com.cf.imes.module.system.dal.dataobject.permission.RoleDO; import com.cf.imes.module.system.dal.dataobject.permission.RoleMenuDO; @@ -115,11 +114,11 @@ public class PermissionServiceImpl implements PermissionService { if (ObjectUtil.isNull(user)) { throw new ServiceException(ErrorCodeConstants.USER_NOT_EXISTS); } - OrganizationDO organizationDO = organService.validOrgan(user.getOrganId()); + organService.validOrgan(user.getOrganId()); // 情况一:遍历判断每个权限,如果有一满足,说明有权限 for (String permission : permissions) { - if (hasAnyPermission(roles, permission, organizationDO.getPackageId())) { + if (hasAnyPermission(roles, permission)) { return true; } } @@ -135,16 +134,13 @@ public class PermissionServiceImpl implements PermissionService { * @param permission 权限标识 * @return 是否拥有 */ - private boolean hasAnyPermission(List roles, String permission, Long packageId) { + private boolean hasAnyPermission(List roles, String permission) { List menuIds = menuService.getMenuIdListByPermissionFromCache(permission); // 采用严格模式,如果权限找不到对应的 Menu 的话,也认为没有权限 if (CollUtil.isEmpty(menuIds)) { return false; } - // 组织套餐下的菜单 - Set tenantPackageMenuIds = tenantPackageService.getTenantPackageMenuIds(packageId); - // 判断是否有权限 Set roleIds = convertSet(roles, RoleDO::getId); for (Long menuId : menuIds) { @@ -152,8 +148,7 @@ public class PermissionServiceImpl implements PermissionService { //Set menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache(menuId); Set menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache1(menuId); // 如果有交集,说明有权限 - // 角色下菜单id和组织套餐内菜单id必须同时满足 - if (CollUtil.containsAny(menuRoleIds, roleIds) && tenantPackageMenuIds.contains(menuId)) { + if (CollUtil.containsAny(menuRoleIds, roleIds)) { return true; } }