mirror of
http://192.168.1.205:9980/cf_devdept2/cf_imes_server.git
synced 2026-08-14 21:52:07 +08:00
1、移除权限检查中的组织套餐交集检查;2、完善组织产品有效性的检查能力:增加延期记录的范围检查;3、购买记录查询/导出字段修正;4、除创建组织初始化的订购以外的首次订购异常修复,补充其他首次订购的月均单价计算;
This commit is contained in:
+41
-12
@@ -53,35 +53,49 @@ import static com.cf.imes.module.system.enums.ErrorCodeConstants.PRODUCT_PURCHAS
|
|||||||
*/
|
*/
|
||||||
public class PayProductProcessor {
|
public class PayProductProcessor {
|
||||||
|
|
||||||
|
// 当次订购的产品
|
||||||
private ProductsDO productsDO;
|
private ProductsDO productsDO;
|
||||||
|
|
||||||
|
// 当次订购的定价规则
|
||||||
private ProductsDetailDO productsDetailDO;
|
private ProductsDetailDO productsDetailDO;
|
||||||
|
|
||||||
|
// 组织产品的首次订购记录
|
||||||
private PurchaseRecordDO orgInitialPurchaseRecord;
|
private PurchaseRecordDO orgInitialPurchaseRecord;
|
||||||
|
|
||||||
|
// 当前组织资金信息
|
||||||
private OrganAmountDO organAmountDO;
|
private OrganAmountDO organAmountDO;
|
||||||
|
|
||||||
|
// 组织id
|
||||||
private Long organId;
|
private Long organId;
|
||||||
|
|
||||||
|
// 支付配置
|
||||||
private ChenfengPayConfig payConfig;
|
private ChenfengPayConfig payConfig;
|
||||||
|
|
||||||
|
// id生成规则配置
|
||||||
private MybatisIdProperties mybatisIdProperties;
|
private MybatisIdProperties mybatisIdProperties;
|
||||||
|
|
||||||
|
// 标记本次订购是否首次
|
||||||
private boolean initialized = false;
|
private boolean initialized = false;
|
||||||
|
|
||||||
private PreviouProductDelayRespVO previouProductDelayRespVO;
|
// 前序购买记录的延期记录
|
||||||
|
private List<ProductDelayRespVO> delayRespVOList;
|
||||||
|
|
||||||
|
// 前序购买记录
|
||||||
private PurchaseRecordDO previousPurchaseRecord;
|
private PurchaseRecordDO previousPurchaseRecord;
|
||||||
|
|
||||||
|
// 本地订购产品的开始时间
|
||||||
private LocalDate startTime = LocalDate.now();
|
private LocalDate startTime = LocalDate.now();
|
||||||
|
|
||||||
|
// 本地订购产品的月均单价
|
||||||
|
private BigDecimal monthAverageAmount = BigDecimal.ZERO;
|
||||||
|
|
||||||
public PayProductProcessor(ProductsDO productsDO, ProductsDetailDO productsDetailDO, PurchaseRecordDO orgInitialPurchaseRecord, PreviouProductDelayRespVO previouProductDelayRespVO,
|
public PayProductProcessor(ProductsDO productsDO, ProductsDetailDO productsDetailDO, PurchaseRecordDO orgInitialPurchaseRecord, PreviouProductDelayRespVO previouProductDelayRespVO,
|
||||||
OrganAmountDO organAmountDO, Long organId, ChenfengPayConfig payConfig, MybatisIdProperties mybatisIdProperties) {
|
OrganAmountDO organAmountDO, Long organId, ChenfengPayConfig payConfig, MybatisIdProperties mybatisIdProperties) {
|
||||||
this.productsDO = productsDO;
|
this.productsDO = productsDO;
|
||||||
this.productsDetailDO = productsDetailDO;
|
this.productsDetailDO = productsDetailDO;
|
||||||
this.orgInitialPurchaseRecord = orgInitialPurchaseRecord;
|
this.orgInitialPurchaseRecord = orgInitialPurchaseRecord;
|
||||||
this.previouProductDelayRespVO = previouProductDelayRespVO;
|
|
||||||
if (ObjectUtil.isNotNull(previouProductDelayRespVO.getPreviouPurchaseRecord())) {
|
if (ObjectUtil.isNotNull(previouProductDelayRespVO.getPreviouPurchaseRecord())) {
|
||||||
|
delayRespVOList = previouProductDelayRespVO.getDelayRespVOList();
|
||||||
previousPurchaseRecord = previouProductDelayRespVO.getPreviouPurchaseRecord();
|
previousPurchaseRecord = previouProductDelayRespVO.getPreviouPurchaseRecord();
|
||||||
// 如果有前置购买记录,那么新的开始时间是上一次订购的结束时间
|
// 如果有前置购买记录,那么新的开始时间是上一次订购的结束时间
|
||||||
startTime = previousPurchaseRecord.getEndTime();
|
startTime = previousPurchaseRecord.getEndTime();
|
||||||
@@ -105,6 +119,8 @@ public class PayProductProcessor {
|
|||||||
price = computePrice(orgInitialPurchaseRecord, productsDetailDO);
|
price = computePrice(orgInitialPurchaseRecord, productsDetailDO);
|
||||||
} else {
|
} else {
|
||||||
price = productsDetailDO.getCurrentPrice();
|
price = productsDetailDO.getCurrentPrice();
|
||||||
|
// 首次订购计算月均单价
|
||||||
|
monthAverageAmount = computeInitialProductPayMonthAverageAmount(price);
|
||||||
// 首次购买记录是空,那么当前就是首次订购
|
// 首次购买记录是空,那么当前就是首次订购
|
||||||
initialized = true;
|
initialized = true;
|
||||||
}
|
}
|
||||||
@@ -167,7 +183,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.accountBalanceSpent(price)
|
.accountBalanceSpent(price)
|
||||||
.isInvocing(InvoiceStatusEnum.INVOICABLE.getCode())
|
.isInvocing(InvoiceStatusEnum.INVOICABLE.getCode())
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
@@ -225,7 +241,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.accountBalanceSpent(price)
|
.accountBalanceSpent(price)
|
||||||
.isInvocing(InvoiceStatusEnum.INVOICABLE.getCode())
|
.isInvocing(InvoiceStatusEnum.INVOICABLE.getCode())
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
@@ -280,7 +296,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.alipaySpent(price)
|
.alipaySpent(price)
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
||||||
@@ -321,7 +337,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
.paymentMethod(PayProductChannelCodeEnum.BALANCE_ONLY.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.wechatSpent(price)
|
.wechatSpent(price)
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
||||||
@@ -367,7 +383,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayProductChannelCodeEnum.BALANCE_AND_GIFT.getCode())
|
.paymentMethod(PayProductChannelCodeEnum.BALANCE_AND_GIFT.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.isInvocing(InvoiceStatusEnum.INVOICABLE.getCode())
|
.isInvocing(InvoiceStatusEnum.INVOICABLE.getCode())
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
.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())
|
.paymentMethod(PayChannelCodeEnum.ALIPAY_PC.equals(payChannelCodeEnum) ? PayProductChannelCodeEnum.BALANCE_AND_GIFT_AND_ALIPAY.getCode() : PayProductChannelCodeEnum.BALANCE_AND_GIFT_AND_WECHAT.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
||||||
.build();
|
.build();
|
||||||
@@ -525,7 +541,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayChannelCodeEnum.ALIPAY_PC.equals(payChannelCodeEnum) ? PayProductChannelCodeEnum.GIFT_AND_ALIPAY.getCode() : PayProductChannelCodeEnum.GIFT_AND_WECHAT.getCode())
|
.paymentMethod(PayChannelCodeEnum.ALIPAY_PC.equals(payChannelCodeEnum) ? PayProductChannelCodeEnum.GIFT_AND_ALIPAY.getCode() : PayProductChannelCodeEnum.GIFT_AND_WECHAT.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
||||||
.build();
|
.build();
|
||||||
@@ -607,7 +623,7 @@ public class PayProductProcessor {
|
|||||||
.paymentMethod(PayProductChannelCodeEnum.BALANCE_AND_GIFT.getCode())
|
.paymentMethod(PayProductChannelCodeEnum.BALANCE_AND_GIFT.getCode())
|
||||||
.totalAmount(price)
|
.totalAmount(price)
|
||||||
.originalAmount(productsDetailDO.getCurrentPrice())
|
.originalAmount(productsDetailDO.getCurrentPrice())
|
||||||
.monthAverageAmount(orgInitialPurchaseRecord.getMonthAverageAmount())
|
.monthAverageAmount(monthAverageAmount)
|
||||||
.initial(initialized)
|
.initial(initialized)
|
||||||
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
.status(PurchaseRecordStatusEnum.ACTIVE.getStatus())
|
||||||
.build();
|
.build();
|
||||||
@@ -718,7 +734,6 @@ public class PayProductProcessor {
|
|||||||
endTime = addTime(startTime, giftDuration, giftDurationUnit);
|
endTime = addTime(startTime, giftDuration, giftDurationUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ProductDelayRespVO> delayRespVOList = previouProductDelayRespVO.getDelayRespVOList();
|
|
||||||
if (CollUtil.isNotEmpty(delayRespVOList)) {
|
if (CollUtil.isNotEmpty(delayRespVOList)) {
|
||||||
// 根据延期列表计算新的结束时间
|
// 根据延期列表计算新的结束时间
|
||||||
endTime = calculateDelayEndTime(startTime, endTime, delayRespVOList);
|
endTime = calculateDelayEndTime(startTime, endTime, delayRespVOList);
|
||||||
@@ -793,7 +808,7 @@ public class PayProductProcessor {
|
|||||||
*/
|
*/
|
||||||
private BigDecimal computePrice(PurchaseRecordDO orgInitialPurchaseRecord, ProductsDetailDO productsDetailDO) {
|
private BigDecimal computePrice(PurchaseRecordDO orgInitialPurchaseRecord, ProductsDetailDO productsDetailDO) {
|
||||||
// 月均单价
|
// 月均单价
|
||||||
BigDecimal monthAverageAmount = orgInitialPurchaseRecord.getMonthAverageAmount();
|
monthAverageAmount = orgInitialPurchaseRecord.getMonthAverageAmount();
|
||||||
|
|
||||||
// 定价规则的折扣
|
// 定价规则的折扣
|
||||||
BigDecimal discount = productsDetailDO.getDiscount();
|
BigDecimal discount = productsDetailDO.getDiscount();
|
||||||
@@ -848,4 +863,18 @@ public class PayProductProcessor {
|
|||||||
return totalAmount;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-9
@@ -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.PermissionAssignRoleUserReqVO;
|
||||||
import com.cf.imes.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO;
|
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.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.MenuDO;
|
||||||
import com.cf.imes.module.system.dal.dataobject.permission.RoleDO;
|
import com.cf.imes.module.system.dal.dataobject.permission.RoleDO;
|
||||||
import com.cf.imes.module.system.dal.dataobject.permission.RoleMenuDO;
|
import com.cf.imes.module.system.dal.dataobject.permission.RoleMenuDO;
|
||||||
@@ -115,11 +114,11 @@ public class PermissionServiceImpl implements PermissionService {
|
|||||||
if (ObjectUtil.isNull(user)) {
|
if (ObjectUtil.isNull(user)) {
|
||||||
throw new ServiceException(ErrorCodeConstants.USER_NOT_EXISTS);
|
throw new ServiceException(ErrorCodeConstants.USER_NOT_EXISTS);
|
||||||
}
|
}
|
||||||
OrganizationDO organizationDO = organService.validOrgan(user.getOrganId());
|
organService.validOrgan(user.getOrganId());
|
||||||
|
|
||||||
// 情况一:遍历判断每个权限,如果有一满足,说明有权限
|
// 情况一:遍历判断每个权限,如果有一满足,说明有权限
|
||||||
for (String permission : permissions) {
|
for (String permission : permissions) {
|
||||||
if (hasAnyPermission(roles, permission, organizationDO.getPackageId())) {
|
if (hasAnyPermission(roles, permission)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -135,16 +134,13 @@ public class PermissionServiceImpl implements PermissionService {
|
|||||||
* @param permission 权限标识
|
* @param permission 权限标识
|
||||||
* @return 是否拥有
|
* @return 是否拥有
|
||||||
*/
|
*/
|
||||||
private boolean hasAnyPermission(List<RoleDO> roles, String permission, Long packageId) {
|
private boolean hasAnyPermission(List<RoleDO> roles, String permission) {
|
||||||
List<Long> menuIds = menuService.getMenuIdListByPermissionFromCache(permission);
|
List<Long> menuIds = menuService.getMenuIdListByPermissionFromCache(permission);
|
||||||
// 采用严格模式,如果权限找不到对应的 Menu 的话,也认为没有权限
|
// 采用严格模式,如果权限找不到对应的 Menu 的话,也认为没有权限
|
||||||
if (CollUtil.isEmpty(menuIds)) {
|
if (CollUtil.isEmpty(menuIds)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 组织套餐下的菜单
|
|
||||||
Set<Long> tenantPackageMenuIds = tenantPackageService.getTenantPackageMenuIds(packageId);
|
|
||||||
|
|
||||||
// 判断是否有权限
|
// 判断是否有权限
|
||||||
Set<Long> roleIds = convertSet(roles, RoleDO::getId);
|
Set<Long> roleIds = convertSet(roles, RoleDO::getId);
|
||||||
for (Long menuId : menuIds) {
|
for (Long menuId : menuIds) {
|
||||||
@@ -152,8 +148,7 @@ public class PermissionServiceImpl implements PermissionService {
|
|||||||
//Set<Long> menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache(menuId);
|
//Set<Long> menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache(menuId);
|
||||||
Set<Long> menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache1(menuId);
|
Set<Long> menuRoleIds = getSelf().getMenuRoleIdListByMenuIdFromCache1(menuId);
|
||||||
// 如果有交集,说明有权限
|
// 如果有交集,说明有权限
|
||||||
// 角色下菜单id和组织套餐内菜单id必须同时满足
|
if (CollUtil.containsAny(menuRoleIds, roleIds)) {
|
||||||
if (CollUtil.containsAny(menuRoleIds, roleIds) && tenantPackageMenuIds.contains(menuId)) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user