diff --git a/src/main/java/com/greenorange/promotion/constant/SystemConstant.java b/src/main/java/com/greenorange/promotion/constant/SystemConstant.java index de21752..c8d4ebe 100644 --- a/src/main/java/com/greenorange/promotion/constant/SystemConstant.java +++ b/src/main/java/com/greenorange/promotion/constant/SystemConstant.java @@ -33,4 +33,16 @@ public interface SystemConstant { */ BigDecimal SECOND_LEVEL_COMMISSION_RATE = new BigDecimal("0.03"); + + /** + * 退款比例 + */ + BigDecimal REFUND_RATE = new BigDecimal("0.8"); + + + /** + * 手续费比例 + */ + BigDecimal FEE_RATE = new BigDecimal("0.2"); + } diff --git a/src/main/java/com/greenorange/promotion/controller/userInfo/AdvancementApplyController.java b/src/main/java/com/greenorange/promotion/controller/userInfo/AdvancementApplyController.java index 46aa8eb..134ac54 100644 --- a/src/main/java/com/greenorange/promotion/controller/userInfo/AdvancementApplyController.java +++ b/src/main/java/com/greenorange/promotion/controller/userInfo/AdvancementApplyController.java @@ -19,6 +19,7 @@ import com.greenorange.promotion.model.enums.UserRoleEnum; import com.greenorange.promotion.model.vo.advancementApply.AdvancementApplyApproveVO; import com.greenorange.promotion.model.vo.advancementApply.AdvancementApplyVOPlus; import com.greenorange.promotion.model.vo.advancementApply.AdvancementApplyVO; +import com.greenorange.promotion.model.vo.userInfo.SupervisorUserInfoVO; import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.userInfo.AdvancementApplyService; import com.greenorange.promotion.service.userInfo.UserInfoService; @@ -216,4 +217,19 @@ public class AdvancementApplyController { voPage.setTotal(page.getTotal()); return ResultUtils.success(voPage); } + + + /** + * Web端管理员查询主管信息列表 + * @return 主管信息列表 + */ + @PostMapping("query/supervisor") + @Operation(summary = "Web端管理员查询主管信息列表", description = "参数:无,权限:管理员,方法名:listSupervisorUserInfo") + @RequiresPermission(mustRole = UserConstant.ADMIN_ROLE) + @SysLog(title = "晋升申请管理", content = "Web端管理员分页查询晋升申请") + public BaseResponse> listSupervisorUserInfo(@Valid @RequestBody AdvancementApplyQueryRequest advancementApplyQueryRequest) { + List userInfoList = commonService.findByFieldEqTargetField(UserInfo::getUserRole, UserConstant.SUPERVISOR_ROLE, userInfoService); + List supervisorUserInfoVOS = commonService.convertList(userInfoList, SupervisorUserInfoVO.class); + return ResultUtils.success(supervisorUserInfoVOS); + } } \ No newline at end of file diff --git a/src/main/java/com/greenorange/promotion/model/entity/UserPerformanceSummary.java b/src/main/java/com/greenorange/promotion/model/entity/UserPerformanceSummary.java index e09fbac..bc86d77 100644 --- a/src/main/java/com/greenorange/promotion/model/entity/UserPerformanceSummary.java +++ b/src/main/java/com/greenorange/promotion/model/entity/UserPerformanceSummary.java @@ -4,10 +4,16 @@ import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * 用户绩效汇总表 @@ -15,11 +21,14 @@ import lombok.Data; */ @TableName(value ="user_performance_summary") @Data +@NoArgsConstructor +@AllArgsConstructor +@Builder public class UserPerformanceSummary implements Serializable { /** * 用户ID */ - @TableId + @TableId(type = IdType.AUTO) private Long id; /** @@ -92,6 +101,7 @@ public class UserPerformanceSummary implements Serializable { */ private Date updateTime; + @Serial @TableField(exist = false) private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/src/main/java/com/greenorange/promotion/model/vo/userInfo/SupervisorUserInfoVO.java b/src/main/java/com/greenorange/promotion/model/vo/userInfo/SupervisorUserInfoVO.java new file mode 100644 index 0000000..2654449 --- /dev/null +++ b/src/main/java/com/greenorange/promotion/model/vo/userInfo/SupervisorUserInfoVO.java @@ -0,0 +1,30 @@ +package com.greenorange.promotion.model.vo.userInfo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 主管列表信息 视图对象 + */ +@Data +@Schema(description = "主管列表信息 视图对象") +public class SupervisorUserInfoVO implements Serializable { + + /** + * 用户表 ID + */ + @Schema(description = "用户ID", example = "1") + private Long id; + + /** + * 用户昵称 + */ + @Schema(description = "用户昵称", example = "chenxinzhi") + private String nickName; + + @Serial + private static final long serialVersionUID = 1L; +} diff --git a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java index 20f9595..0ae73ec 100644 --- a/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/userInfo/impl/UserInfoServiceImpl.java @@ -176,6 +176,10 @@ public class UserInfoServiceImpl extends ServiceImpl myUserInfo.setUserAvatar(UserConstant.USER_DEFAULT_AVATAR); this.save(myUserInfo); + // 添加用户绩效记录 + UserPerformanceSummary userPerformanceSummary = UserPerformanceSummary.builder().userId(myUserInfo.getId()).build(); + userPerformanceSummaryService.save(userPerformanceSummary); + // 更新上级用户的数量 updateParentUserInfoEmpCount(myUserInfo.getId(), userRoleEnum); @@ -383,6 +387,10 @@ public class UserInfoServiceImpl extends ServiceImpl .build(); this.save(myUserInfo); + // 添加用户绩效记录 + UserPerformanceSummary userPerformanceSummary = UserPerformanceSummary.builder().userId(myUserInfo.getId()).build(); + userPerformanceSummaryService.save(userPerformanceSummary); + // 更新上级主管用户的员工数量和经理用户的员工数量 updateParentUserInfoEmpCount(myUserInfo.getId(), UserRoleEnum.STAFF); @@ -406,6 +414,7 @@ public class UserInfoServiceImpl extends ServiceImpl */ private void updateParentUserInfoEmpCount(Long userId, UserRoleEnum userRoleEnum) { List pathToRoot = findPathToRoot(userId); + pathToRoot.remove(pathToRoot.size() - 1); List userPerformanceSummaryList = commonService.findByFieldInTargetField(pathToRoot, userPerformanceSummaryService, Function.identity(), UserPerformanceSummary::getUserId); for (UserPerformanceSummary userPerformanceSummary : userPerformanceSummaryList) { if (userRoleEnum.equals(UserRoleEnum.USER)) { diff --git a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java index 948cdf1..d6a32dd 100644 --- a/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java +++ b/src/main/java/com/greenorange/promotion/service/wechat/impl/WechatPayServiceImpl.java @@ -7,11 +7,9 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.greenorange.promotion.common.ErrorCode; import com.greenorange.promotion.config.WxPayConfig; import com.greenorange.promotion.constant.OrderStatusConstant; +import com.greenorange.promotion.constant.SystemConstant; import com.greenorange.promotion.exception.ThrowUtils; -import com.greenorange.promotion.model.entity.Course; -import com.greenorange.promotion.model.entity.CourseOrder; -import com.greenorange.promotion.model.entity.CoursePromotionCommissionPending; -import com.greenorange.promotion.model.entity.RefundRecord; +import com.greenorange.promotion.model.entity.*; import com.greenorange.promotion.model.enums.CommissionStatusEnum; import com.greenorange.promotion.service.common.CommonService; import com.greenorange.promotion.service.course.CourseOrderService; @@ -19,6 +17,7 @@ import com.greenorange.promotion.service.course.CoursePromotionCommissionPending import com.greenorange.promotion.service.course.CourseService; import com.greenorange.promotion.service.refund.RefundRecordService; import com.greenorange.promotion.service.userInfo.UserInfoService; +import com.greenorange.promotion.service.userInfo.UserPerformanceSummaryService; import com.greenorange.promotion.service.wechat.WechatPayService; import com.greenorange.promotion.utils.RefundUtils; import com.wechat.pay.java.core.notification.NotificationParser; @@ -41,6 +40,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.math.BigDecimal; import java.util.List; +import java.util.function.Function; /** * @author 陈新知 @@ -73,6 +73,10 @@ public class WechatPayServiceImpl implements WechatPayService { private UserInfoService userInfoService; + @Resource + private UserPerformanceSummaryService userPerformanceSummaryService; + + @Resource private CoursePromotionCommissionPendingService coursePromotionCommissionPendingService; @@ -143,25 +147,47 @@ public class WechatPayServiceImpl implements WechatPayService { courseService.updateById(course); } - // 添加课程推广待提成记录 + // 更新主管和员工的绩效记录 Long userId = courseOrder.getUserId(); List pathToRoot = userInfoService.findPathToRoot(userId); - Long firstUserId = pathToRoot.get(0); - Long secondUserId = pathToRoot.get(1); - CoursePromotionCommissionPending coursePromotionCommissionPending = CoursePromotionCommissionPending.builder() - .firstUserId(firstUserId) - .secondUserId(secondUserId) - .courseId(courseId) - .name(courseOrder.getName()) - .type(courseOrder.getType()) - .image(courseOrder.getImage()) - .orderId(courseOrder.getId()) - .userId(userId) - .totalAmount(courseOrder.getTotalAmount()) - .commissionStatus(CommissionStatusEnum.PENDING.getValue()) - .orderCreateTime(courseOrder.getCreateTime()) - .build(); - coursePromotionCommissionPendingService.save(coursePromotionCommissionPending); + List superUserIdList = pathToRoot.subList(1, 3); + List userPerformanceSummaryList = commonService.findByFieldInTargetField(superUserIdList, userPerformanceSummaryService, Function.identity(), UserPerformanceSummary::getUserId); + BigDecimal rate; + for (int i = 0; i < userPerformanceSummaryList.size(); i ++ ) { + if (i == 0) rate = SystemConstant.FIRST_LEVEL_COMMISSION_RATE; + else rate = SystemConstant.SECOND_LEVEL_COMMISSION_RATE; + // 计算理论上获得的最大提成奖励 + BigDecimal rakeRewards = courseOrder.getTotalAmount().multiply(rate); + UserPerformanceSummary userPerformanceSummary = userPerformanceSummaryList.get(i); + + userPerformanceSummary.setTotalAmount(userPerformanceSummary.getTotalAmount().add(courseOrder.getTotalAmount())); + userPerformanceSummary.setNetAmount(userPerformanceSummary.getNetAmount().add(courseOrder.getTotalAmount().multiply(SystemConstant.FEE_RATE))); + userPerformanceSummary.setOrderCount(userPerformanceSummary.getOrderCount() + 1); + userPerformanceSummary.setToRelease(userPerformanceSummary.getToRelease().add(rakeRewards.multiply(SystemConstant.REFUND_RATE))); + userPerformanceSummary.setToSettle(userPerformanceSummary.getToSettle().add(rakeRewards.multiply(SystemConstant.FEE_RATE))); + } + userPerformanceSummaryService.updateBatchById(userPerformanceSummaryList); + + +// // 添加课程推广待提成记录 +// Long userId = courseOrder.getUserId(); +// List pathToRoot = userInfoService.findPathToRoot(userId); +// Long firstUserId = pathToRoot.get(0); +// Long secondUserId = pathToRoot.get(1); +// CoursePromotionCommissionPending coursePromotionCommissionPending = CoursePromotionCommissionPending.builder() +// .firstUserId(firstUserId) +// .secondUserId(secondUserId) +// .courseId(courseId) +// .name(courseOrder.getName()) +// .type(courseOrder.getType()) +// .image(courseOrder.getImage()) +// .orderId(courseOrder.getId()) +// .userId(userId) +// .totalAmount(courseOrder.getTotalAmount()) +// .commissionStatus(CommissionStatusEnum.PENDING.getValue()) +// .orderCreateTime(courseOrder.getCreateTime()) +// .build(); +// coursePromotionCommissionPendingService.save(coursePromotionCommissionPending); System.out.println("---------------------------微信支付回调(结束)-------------------------------"); @@ -246,11 +272,32 @@ public class WechatPayServiceImpl implements WechatPayService { courseService.updateById(course); } - // 修改课程推广待提成状态为"已失效" - LambdaUpdateWrapper coursePromotionUpdateWrapper = new LambdaUpdateWrapper<>(); - coursePromotionUpdateWrapper.eq(CoursePromotionCommissionPending::getOrderId, courseOrder.getId()) - .set(CoursePromotionCommissionPending::getCommissionStatus, CommissionStatusEnum.EXPIRED.getValue()); - coursePromotionCommissionPendingService.update(coursePromotionUpdateWrapper); + // 更新主管和员工的绩效记录 + Long userId = courseOrder.getUserId(); + List pathToRoot = userInfoService.findPathToRoot(userId); + List superUserIdList = pathToRoot.subList(1, 3); + List userPerformanceSummaryList = commonService.findByFieldInTargetField(superUserIdList, userPerformanceSummaryService, Function.identity(), UserPerformanceSummary::getUserId); + BigDecimal rate; + for (int i = 0; i < userPerformanceSummaryList.size(); i ++ ) { + if (i == 0) rate = SystemConstant.FIRST_LEVEL_COMMISSION_RATE; + else rate = SystemConstant.SECOND_LEVEL_COMMISSION_RATE; + // 计算理论上获得的最大提成奖励 + BigDecimal rakeRewards = courseOrder.getTotalAmount().multiply(rate); + UserPerformanceSummary userPerformanceSummary = userPerformanceSummaryList.get(i); + + userPerformanceSummary.setTotalAmount(userPerformanceSummary.getTotalAmount().add(courseOrder.getTotalAmount())); + userPerformanceSummary.setNetAmount(userPerformanceSummary.getNetAmount().add(courseOrder.getTotalAmount().multiply(SystemConstant.FEE_RATE))); + userPerformanceSummary.setOrderCount(userPerformanceSummary.getOrderCount() + 1); + userPerformanceSummary.setToRelease(userPerformanceSummary.getToRelease().subtract(rakeRewards.multiply(SystemConstant.REFUND_RATE))); + userPerformanceSummary.setRefunded(userPerformanceSummary.getRefunded().add(courseOrder.getTotalAmount().multiply(SystemConstant.REFUND_RATE))); + } + userPerformanceSummaryService.updateBatchById(userPerformanceSummaryList); + +// // 修改课程推广待提成状态为"已失效" +// LambdaUpdateWrapper coursePromotionUpdateWrapper = new LambdaUpdateWrapper<>(); +// coursePromotionUpdateWrapper.eq(CoursePromotionCommissionPending::getOrderId, courseOrder.getId()) +// .set(CoursePromotionCommissionPending::getCommissionStatus, CommissionStatusEnum.EXPIRED.getValue()); +// coursePromotionCommissionPendingService.update(coursePromotionUpdateWrapper); System.out.println("---------------------------微信退款回调(结束)-------------------------------"); return true; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7193913..88c01ff 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -62,14 +62,13 @@ mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: false -# log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: isDelete #全局逻辑删除的实体字段名 logic-delete-value: 1 #逻辑已删除值(默认为1) logic-not-delete-value: 0 #逻辑未删除值(默认为0) - type-handlers-package: com.cultural.heritage.handler