ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/PointSetting.java
@@ -105,7 +105,7 @@ @ApiModelProperty(value = "门店业绩积分") @TableField("shop_point") private BigDecimal shopPoint; private Integer shopPoint; @ApiModelProperty(value = "门店业绩积分 1开0关") @TableField("shop_point_open") @@ -129,7 +129,7 @@ @ApiModelProperty(value = "拉新人积分") @TableField("get_new_point") private BigDecimal getNewPoint; private Integer getNewPoint; @ApiModelProperty(value = "拉新人积分 1开0关") @TableField("get_new_point_open") ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/PhoneNumberValidator.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.common.core.utils; public class PhoneNumberValidator { // 定义一个匹配中国手机号的正则表达式 private static final String CHINA_PHONE_REGEX = "^1[3-9]\\d{9}$"; /** * 验证给定的字符串是否符合中国手机号的格式. * * @param phoneNumber 要验证的手机号 * @return 如果手机号格式正确返回true,否则返回false */ public static boolean isValidChinaPhoneNumber(String phoneNumber) { if (phoneNumber == null || phoneNumber.isEmpty()) { return false; } return phoneNumber.matches(CHINA_PHONE_REGEX); } public static void main(String[] args) { // 测试几个号码 String[] phoneNumbers = {"13800138000", "15912345678", "18612345678", "110", "12345678901", "19912345678"}; for (String phoneNumber : phoneNumbers) { System.out.println("Phone number: " + phoneNumber + " is valid: " + isValidChinaPhoneNumber(phoneNumber)); } } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
@@ -1,10 +1,7 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.UserPointService; import com.ruoyi.account.vo.UserPointDetailVO; import com.ruoyi.account.vo.UserPointVO; @@ -40,8 +37,6 @@ public class UserPointController extends BaseController { @Resource private UserPointService userPointService; @Resource private AppUserService appUserService; /** @@ -86,15 +81,8 @@ */ @PostMapping("/transferPoint") @ApiOperation("转赠积分") public R<Void> transferPoint(@ApiParam("积分") BigDecimal point, @ApiParam("手机号") Long phone) { AppUser appUser = appUserService.getOne(new LambdaQueryWrapper<AppUser>() .eq(AppUser::getPhone, phone)); if (null == appUser) { return R.fail("用户不存在"); } public R<Void> transferPoint(@ApiParam("积分") @RequestParam BigDecimal point, @ApiParam("手机号") @RequestParam String phone) { userPointService.transferPoint(point, phone); return R.ok(); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/VipCenter.java
New file @@ -0,0 +1,14 @@ package com.ruoyi.account.controller; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/vipCenter") @Api(tags = "小程序-会员中心") public class VipCenter { } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
@@ -24,5 +24,5 @@ List<UserPointDetailVO> getUserPointDetail(Long userId, LocalDateTime startTime, LocalDateTime endTime, Integer type); void transferPoint(BigDecimal point, Long phone); void transferPoint(BigDecimal point, String phone); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/PointSettingServiceImpl.java
@@ -20,7 +20,10 @@ @Override public PointSetting getPointSettingByAppUserId(Long appUserId) { AppUser appUser = appUserService.getById(appUserId); R<PointSetting> pointSetting = pointSettingClient.getPointSetting(appUser.getVipId()); return null; R<PointSetting> r = pointSettingClient.getPointSetting(appUser.getVipId()); if (!R.isSuccess(r)){ throw new RuntimeException("获取积分设置失败"); } return r.getData(); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
@@ -3,23 +3,25 @@ import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.enums.PointChangeType; import com.ruoyi.account.mapper.UserPointMapper; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.PointSettingService; import com.ruoyi.account.service.UserPointService; import com.ruoyi.account.service.VipSettingService; import com.ruoyi.account.vo.UserPointDetailVO; import com.ruoyi.account.vo.UserPointVO; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.PhoneNumberValidator; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.other.api.domain.PointSetting; import com.ruoyi.other.api.domain.VipSetting; import com.ruoyi.other.api.feignClient.RemoteVipSettingClient; import com.ruoyi.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -27,6 +29,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; /** @@ -38,6 +41,7 @@ * @since 2024-11-21 */ @Service @Slf4j public class UserPointServiceImpl extends ServiceImpl<UserPointMapper, UserPoint> implements UserPointService { @Resource private AppUserService appUserService; @@ -45,6 +49,8 @@ private TokenService tokenService; @Resource private VipSettingService vipSettingService; @Resource private PointSettingService pointSettingService; @Override public UserPointVO getUserPoint(Long userId) { @@ -89,14 +95,66 @@ @Override public void transferPoint(BigDecimal point, Long phone) { AppUser appUserForPhoe = appUserService.getOne(new LambdaQueryWrapper<AppUser>() .eq(AppUser::getPhone, phone)); @Transactional public void transferPoint(BigDecimal point, String phone) { if (!PhoneNumberValidator.isValidChinaPhoneNumber(phone)) { throw new ServiceException("无效的电话号码"); } LoginUser loginUserApplet = tokenService.getLoginUserApplet(); Long userid = loginUserApplet.getUserid(); VipSetting vipSetting = vipSettingService.getVipSettingByUserId(userid); if (vipSetting == null) { throw new ServiceException("VIP 设置未找到"); } if (vipSetting.getVipGiftRole() == 0) { throw new ServiceException("转赠积分权限未开启"); } AppUser appUser = appUserService.getById(userid); if (appUser == null) { throw new ServiceException("用户未找到"); } Integer totalPoint = appUser.getLavePoint(); PointSetting pointSetting = pointSettingService.getPointSettingByAppUserId(userid); if (pointSetting == null) { throw new ServiceException("积分设置未找到"); } Integer buyPointOpen = pointSetting.getBuyPointOpen(); List<UserPoint> userPointList = list(new LambdaQueryWrapper<UserPoint>() .eq(UserPoint::getAppUserId, userid)); Map<Integer, Integer> userBalanceMap = userPointList.stream() .collect(Collectors.toMap(UserPoint::getType, UserPoint::getBalance)); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.CONSUME.getCode(), buyPointOpen == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.COMMISSION_RETURN.getCode(), pointSetting.getSharePointOpen() == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.STORE_COMMISSION_RETURN.getCode(), pointSetting.getShopSharePointOpen() == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.STORE_PERFORMANCE.getCode(), pointSetting.getShopPointOpen() == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.TECHNICIAN_PERFORMANCE.getCode(), pointSetting.getPersonPointOpen() == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.NEW_USER_REFERRAL.getCode(), pointSetting.getGetNewPointOpen() == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.REGISTRATION.getCode(), pointSetting.getGetRegisPointOpen() == 0); totalPoint -= getAdjustedPoint(userBalanceMap, PointChangeType.WORK_PERFORMANCE.getCode(), pointSetting.getWorkPointOpen() == 0); if (point.compareTo(new BigDecimal(totalPoint)) > 0) { throw new ServiceException("转赠积分不足"); } AppUser appUserForPhoe = appUserService.getOne(new LambdaQueryWrapper<AppUser>() .eq(AppUser::getPhone, phone)); if (appUserForPhoe == null) { throw new ServiceException("目标用户未找到"); } appUserForPhoe.setLavePoint(appUserForPhoe.getLavePoint() + point.intValue()); appUserService.updateById(appUserForPhoe); log.info("积分转赠完成,用户ID: {}, 新积分: {}", appUserForPhoe.getId(), appUserForPhoe.getLavePoint()); } private int getAdjustedPoint(Map<Integer, Integer> userBalanceMap, int pointTypeCode, boolean isOpen) { return isOpen ? 0 : Optional.ofNullable(userBalanceMap.get(pointTypeCode)).orElse(0); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/Describe.java
New file @@ -0,0 +1,10 @@ package com.ruoyi.account.vo.vip; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; public class Describe { @ApiModelProperty(value = "会员专属权益") private String vipInfo; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/vip/Level.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.account.vo.vip; public class Level { /** * 会员名称 */ private String name; } ruoyi-service/ruoyi-order/src/main/resources/mapper/order/OrderMapper.xml
@@ -28,9 +28,11 @@ o.id, o.order_number, o.order_status, o.good_name, o.good_pics, o.num, o.point, o.payment_amount, o.create_time o.payment_amount ORDER BY o.create_time DESC </select>