ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserAddressClientFallbackFactory.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.UserAddressClient; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FallbackFactory; /** * @author zhibing.pu * @Date 2024/11/29 11:55 */ public class UserAddressClientFallbackFactory implements FallbackFactory<UserAddressClient> { @Override public UserAddressClient create(Throwable cause) { return new UserAddressClient(){ @Override public R<UserAddress> getDefaultUserAddress(Long userId) { return R.fail("获取用户默认地址失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserCouponClientFallbackFactory.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.UserCouponClient; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FallbackFactory; import java.util.List; /** * @author zhibing.pu * @Date 2024/11/29 14:23 */ public class UserCouponClientFallbackFactory implements FallbackFactory<UserCouponClient> { @Override public UserCouponClient create(Throwable cause) { return new UserCouponClient() { @Override public R<List<CouponInfoVo>> getPaymentUserCoupon(PaymentUserCoupon paymentUserCoupon) { return R.fail("根据id获取优惠券数据失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserAddressClient.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.factory.UserAddressClientFallbackFactory; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/11/29 11:54 */ @FeignClient(contextId = "UserAddressClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = UserAddressClientFallbackFactory.class) public interface UserAddressClient { /** * 获取用户默认地址 * @param userId * @return */ @PostMapping("/user-address/getDefaultUserAddress") R<UserAddress> getDefaultUserAddress(@RequestParam("userId") Long userId); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserCouponClient.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.factory.UserCouponClientFallbackFactory; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; /** * @author zhibing.pu * @Date 2024/11/29 14:22 */ @FeignClient(contextId = "UserCouponClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = UserCouponClientFallbackFactory.class) public interface UserCouponClient { /** * 根据id获取优惠券数据 * @param paymentUserCoupon * @return */ @PostMapping("/user-coupon/getPaymentUserCoupon") R<List<CouponInfoVo>> getPaymentUserCoupon(@RequestBody PaymentUserCoupon paymentUserCoupon); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponInfoVo.java
File was renamed from ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/CouponInfoVo.java @@ -1,4 +1,4 @@ package com.ruoyi.order.vo; package com.ruoyi.account.api.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/PaymentUserCoupon.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.account.api.vo; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/11/29 14:32 */ @Data public class PaymentUserCoupon { /** * 用户id */ private Long userId; /** * 订单金额 */ private BigDecimal orderMoney; /** * 商品类型(1=服务,2=实体商品) */ private Integer type; } ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1,3 @@ com.ruoyi.account.api.factory.AppUserClientFallbackFactory com.ruoyi.account.api.factory.UserAddressClientFallbackFactory com.ruoyi.account.api.factory.UserCouponClientFallbackFactory ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/BaseSettingClientFallbackFactory.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.other.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.BaseSetting; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.feignClient.BaseSettingClient; import com.ruoyi.other.api.feignClient.ShopClient; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @Slf4j public class BaseSettingClientFallbackFactory implements FallbackFactory<BaseSettingClient> { @Override public BaseSettingClient create(Throwable cause) { return new BaseSettingClient(){ @Override public R<BaseSetting> getBaseSetting(Integer id) { return R.fail("获取基础配置失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/CouponInfoClientFallbackFactory.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.other.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.CouponInfo; import com.ruoyi.other.api.feignClient.CouponInfoClient; import org.springframework.cloud.openfeign.FallbackFactory; import java.util.List; /** * @author zhibing.pu * @Date 2024/11/29 14:37 */ public class CouponInfoClientFallbackFactory implements FallbackFactory<CouponInfoClient> { @Override public CouponInfoClient create(Throwable cause) { return new CouponInfoClient() { @Override public R<List<CouponInfo>> getCouponInfoList(List<Integer> ids) { return R.fail("根据id集合获取优惠券数据失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/GoodsClientFallbackFactory.java
@@ -24,6 +24,11 @@ public R<List<Goods>> getGoodsByType(Integer type) { return R.fail("根据类型(1=服务商品,2=单品商品)获取商品数据失败:" + cause.getMessage()); } @Override public R<Goods> getGoodsById(Integer id) { return R.fail("根据id获取商品详情失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OrderActivityInfoClientFallbackFactory.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.other.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.OrderActivityInfo; import com.ruoyi.other.api.feignClient.OrderActivityInfoClient; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @Slf4j public class OrderActivityInfoClientFallbackFactory implements FallbackFactory<OrderActivityInfoClient> { @Override public OrderActivityInfoClient create(Throwable cause) { return new OrderActivityInfoClient(){ @Override public R<OrderActivityInfo> getNowOrderActivityInfo(Integer vip) { return R.fail("获取当前生效的活动失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/SeckillActivityInfoClientFallbackFactory.java
@@ -5,9 +5,10 @@ import com.ruoyi.other.api.feignClient.SeckillActivityInfoClient; import com.ruoyi.other.api.vo.GetSeckillActivityInfo; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @Slf4j public class SeckillActivityInfoClientFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<SeckillActivityInfoClient> { public class SeckillActivityInfoClientFallbackFactory implements FallbackFactory<SeckillActivityInfoClient> { @Override public SeckillActivityInfoClient create(Throwable cause) { return new SeckillActivityInfoClient(){ ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/ShopClientFallbackFactory.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.other.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.feignClient.ShopClient; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; @Slf4j public class ShopClientFallbackFactory implements FallbackFactory<ShopClient> { @Override public ShopClient create(Throwable cause) { return new ShopClient(){ @Override public R<Shop> getShopById(Integer id) { return R.fail("根据id获取门店信息失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/SystemConfigClientFallbackFactory.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.other.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.SystemConfig; import com.ruoyi.other.api.feignClient.SystemConfigClient; import org.springframework.cloud.openfeign.FallbackFactory; /** * @author zhibing.pu * @Date 2024/11/29 15:58 */ public class SystemConfigClientFallbackFactory implements FallbackFactory<SystemConfigClient> { @Override public SystemConfigClient create(Throwable cause) { return new SystemConfigClient() { @Override public R<SystemConfig> getSystemConfig(Integer type) { return R.fail("根据类型获取系统配置失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/BaseSettingClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.other.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.BaseSetting; import com.ruoyi.other.api.factory.BaseSettingClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/11/29 11:34 */ @FeignClient(contextId = "BaseSettingClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = BaseSettingClientFallbackFactory.class) public interface BaseSettingClient { /** * 获取基础配置 * @param id * @return */ @PostMapping("/base-setting/getBaseSetting") R<BaseSetting> getBaseSetting(@RequestParam("id") Integer id); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/CouponInfoClient.java
New file @@ -0,0 +1,28 @@ package com.ruoyi.other.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.CouponInfo; import com.ruoyi.other.api.factory.CouponInfoClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * @author zhibing.pu * @Date 2024/11/29 14:36 */ @FeignClient(contextId = "CouponInfoClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = CouponInfoClientFallbackFactory.class) public interface CouponInfoClient { /** * 根据id集合获取优惠券数据 * @param ids * @return */ @PostMapping("/coupon-info/getCouponInfoList") R<List<CouponInfo>> getCouponInfoList(@RequestParam("ids") List<Integer> ids); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/GoodsClient.java
@@ -26,4 +26,12 @@ @PostMapping("/goods/getGoodsByType") R<List<Goods>> getGoodsByType(@RequestParam("type") Integer type); /** * 根据id获取商品详情 * @param id * @return */ @PostMapping("/goods/getGoodsById") R<Goods> getGoodsById(@RequestParam("id") Integer id); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OrderActivityInfoClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.other.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.OrderActivityInfo; import com.ruoyi.other.api.factory.OrderActivityInfoClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/11/29 10:55 */ @FeignClient(contextId = "OrderActivityInfoClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = OrderActivityInfoClientFallbackFactory.class) public interface OrderActivityInfoClient { /** * 获取当前生效的活动 * @param vip * @return */ @PostMapping("/order-activity-info/getNowOrderActivityInfo") R<OrderActivityInfo> getNowOrderActivityInfo(@RequestParam("vip") Integer vip); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/ShopClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.other.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.factory.ShopClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/11/29 10:28 */ @FeignClient(contextId = "ShopClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = ShopClientFallbackFactory.class) public interface ShopClient { /** * 根据id获取门店信息 * @param id * @return */ @PostMapping("/shop/getShopById") R<Shop> getShopById(@RequestParam("id") Integer id); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/SystemConfigClient.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.other.api.feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.SystemConfig; import com.ruoyi.other.api.factory.SystemConfigClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/11/29 15:58 */ @FeignClient(contextId = "SystemConfigClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = SystemConfigClientFallbackFactory.class) public interface SystemConfigClient { /** * 根据类型获取系统配置 * @param type * @return */ @PostMapping("/system-config/getSystemConfig") R<SystemConfig> getSystemConfig(@RequestParam("type") Integer type); } ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -5,3 +5,8 @@ com.ruoyi.other.api.factory.SeckillActivityInfoClientFallbackFactory com.ruoyi.other.api.factory.GoodsBargainPriceClientFallbackFactory com.ruoyi.other.api.factory.RemoteVipSettingFallbackFactory com.ruoyi.other.api.factory.ShopClientFallbackFactory com.ruoyi.other.api.factory.OrderActivityInfoClientFallbackFactory com.ruoyi.other.api.factory.BaseSettingClientFallbackFactory com.ruoyi.other.api.factory.CouponInfoClientFallbackFactory com.ruoyi.other.api.factory.SystemConfigClientFallbackFactory ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/web/domain/AjaxResult.java
@@ -4,28 +4,24 @@ import java.util.Objects; import com.ruoyi.common.core.constant.HttpStatus; import com.ruoyi.common.core.utils.StringUtils; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; /** * 操作消息提醒 * * @author ruoyi */ @ApiModel public class AjaxResult<T> extends HashMap { public class AjaxResult<T> extends HashMap<String, Object> { private static final long serialVersionUID = 1L; /** 状态码 */ @ApiModelProperty("状态码") private int code; public static final String CODE_TAG = "code"; /** 返回内容 */ @ApiModelProperty("描述内容") private String msg = ""; public static final String MSG_TAG = "msg"; /** 数据对象 */ @ApiModelProperty("结果集") private T data; public static final String DATA_TAG = "data"; /** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 @@ -42,8 +38,8 @@ */ public AjaxResult(int code, String msg) { this.code = code; this.msg = msg; super.put(CODE_TAG, code); super.put(MSG_TAG, msg); } /** @@ -53,12 +49,12 @@ * @param msg 返回内容 * @param data 数据对象 */ public AjaxResult(int code, String msg, T data) public AjaxResult(int code, String msg, Object data) { this.code = code; this.msg = msg; super.put(CODE_TAG, code); super.put(MSG_TAG, msg); if (StringUtils.isNotNull(data)) { this.data = data; super.put(DATA_TAG, data); } } @@ -185,7 +181,7 @@ */ public boolean isSuccess() { return Objects.equals(HttpStatus.SUCCESS, this.code); return Objects.equals(HttpStatus.SUCCESS, this.get(CODE_TAG)); } /** @@ -199,4 +195,19 @@ } /** * 方便链式调用 * * @param key * @param value * @return */ @Override public AjaxResult put(String key, Object value) { super.put(key, value); return this; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -4,8 +4,8 @@ import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.vo.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.TableDataInfo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; @@ -39,7 +39,7 @@ @ResponseBody @PostMapping("/appletLogin") @ApiOperation(value = "小程序一键登录") public AjaxResult<LoginVo> appletLogin(@RequestBody AppletLogin appletLogin){ public R<LoginVo> appletLogin(@RequestBody AppletLogin appletLogin){ return appUserService.appletLogin(appletLogin); } @@ -47,7 +47,7 @@ @ResponseBody @PostMapping("/mobileLogin") @ApiOperation(value = "手机号登录") public AjaxResult<LoginVo> mobileLogin(@RequestBody MobileLogin mobileLogin){ public R<LoginVo> mobileLogin(@RequestBody MobileLogin mobileLogin){ return appUserService.mobileLogin(mobileLogin); } @@ -56,7 +56,7 @@ @ResponseBody @PostMapping("/getSMSCode") @ApiOperation(value = "获取短信验证码") public AjaxResult getSMSCode(@RequestBody SMSCode smsCode){ public R getSMSCode(@RequestBody SMSCode smsCode){ return appUserService.getSMSCode(smsCode); } @@ -65,7 +65,7 @@ @ResponseBody @PostMapping("/registerAccount") @ApiOperation(value = "注册新账号") public AjaxResult<LoginVo> registerAccount(@RequestBody RegisterAccount registerAccount){ public R<LoginVo> registerAccount(@RequestBody RegisterAccount registerAccount){ return appUserService.registerAccount(registerAccount); } @@ -76,11 +76,11 @@ @ApiImplicitParams({ @ApiImplicitParam(name = "id", value = "推荐人id", required = true, dataType = "long") }) public AjaxResult<String> getReferrer(@PathVariable("id") Long id){ public R<String> getReferrer(@PathVariable("id") Long id){ AppUser appUser = appUserService.getById(id); String phone = appUser.getPhone(); phone = phone.substring(0, 3) + "****" + phone.substring(7); return AjaxResult.success(appUser.getName() + "-" + phone); return R.ok(appUser.getName() + "-" + phone); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserAddressController.java
@@ -1,8 +1,14 @@ package com.ruoyi.account.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.service.UserAddressService; import com.ruoyi.common.core.domain.R; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> @@ -16,5 +22,28 @@ @RequestMapping("/user-address") public class UserAddressController { @Resource private UserAddressService userAddressService; /** * 获取用户默认地址 * @param userId * @return */ @ResponseBody @PostMapping("/getDefaultUserAddress") public R<UserAddress> getDefaultUserAddress(@RequestParam("userId") Long userId){ List<UserAddress> list = userAddressService.list(new LambdaQueryWrapper<UserAddress>().eq(UserAddress::getAppUserId, userId).eq(UserAddress::getDelFlag, 0)); if(list.size() == 0){ return R.ok(); } UserAddress userAddress = list.stream().filter(s -> s.getIsDefault() == 1).findFirst().get(); if(null == userAddress){ userAddress = list.get(0); } return R.ok(userAddress); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCouponController.java
@@ -1,9 +1,15 @@ package com.ruoyi.account.controller; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.account.service.UserCouponService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> @@ -17,9 +23,21 @@ @RequestMapping("/user-coupon") public class UserCouponController { @Resource private UserCouponService userCouponService; /** * 获取支付页面用户优惠券列表数据 * @param paymentUserCoupon * @return */ @ResponseBody @PostMapping("/getPaymentUserCoupon") public R<List<CouponInfoVo>> getPaymentUserCoupon(@RequestBody PaymentUserCoupon paymentUserCoupon){ List<CouponInfoVo> userCoupon = userCouponService.getUserCoupon(paymentUserCoupon.getUserId(), paymentUserCoupon.getOrderMoney(), paymentUserCoupon.getType()); return R.ok(userCoupon); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserService.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.vo.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import java.util.List; @@ -23,7 +24,7 @@ * @param appletLogin * @return */ AjaxResult appletLogin(AppletLogin appletLogin); R appletLogin(AppletLogin appletLogin); /** @@ -31,7 +32,7 @@ * @param mobileLogin * @return */ AjaxResult<LoginVo> mobileLogin(MobileLogin mobileLogin); R<LoginVo> mobileLogin(MobileLogin mobileLogin); /** @@ -39,7 +40,7 @@ * @param smsCode * @return */ AjaxResult getSMSCode(SMSCode smsCode); R getSMSCode(SMSCode smsCode); /** @@ -47,7 +48,7 @@ * @param registerAccount * @return */ AjaxResult<LoginVo> registerAccount(RegisterAccount registerAccount); R<LoginVo> registerAccount(RegisterAccount registerAccount); /** ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserCouponService.java
@@ -2,6 +2,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.UserCoupon; import com.ruoyi.account.api.vo.CouponInfoVo; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.util.List; /** * <p> @@ -13,4 +18,10 @@ */ public interface UserCouponService extends IService<UserCoupon> { /** * 获取用户支付页面的优惠券列表 * @param userId * @return */ List<CouponInfoVo> getUserCoupon(Long userId, BigDecimal orderMoney, Integer type); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -7,6 +7,7 @@ import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.util.weChat.WeChatUtil; import com.ruoyi.account.vo.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.common.security.service.TokenService; @@ -47,12 +48,12 @@ * @return */ @Override public AjaxResult appletLogin(AppletLogin appletLogin) { public R appletLogin(AppletLogin appletLogin) { //使用jscode获取微信openid Map<String, Object> map = weChatUtil.code2Session(appletLogin.getJscode()); Integer errcode = Integer.valueOf(map.get("errcode").toString()); if(0 != errcode){ return AjaxResult.error(map.get("msg").toString()); return R.fail(map.get("msg").toString()); } String openid = map.get("openid").toString(); //查询用户是否注册,没有注册则跳转到注册页面 @@ -60,11 +61,11 @@ if(null == appUser){ LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(2); return AjaxResult.success(loginVo); return R.ok(loginVo); } //账户被冻结,给出提示 if(2 == appUser.getStatus()){ return AjaxResult.error("账户已被冻结,请联系管理员!"); return R.fail("账户已被冻结,请联系管理员!"); } LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(1); @@ -77,7 +78,7 @@ Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser); loginVo.setToken(tokenApplet.get("access_token").toString()); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); return AjaxResult.success(loginVo); return R.ok(loginVo); } @@ -87,11 +88,11 @@ * @return */ @Override public AjaxResult<LoginVo> mobileLogin(MobileLogin mobileLogin) { public R<LoginVo> mobileLogin(MobileLogin mobileLogin) { //校验验证码 String code = redisService.getCacheObject(mobileLogin.getPhone()); if(null == code || !code.equals(mobileLogin.getCode())){ return AjaxResult.error("验证码错误"); return R.fail("验证码错误"); } //查询用户是否注册,没有注册则跳转到注册页面 @@ -99,11 +100,11 @@ if(null == appUser){ LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(2); return AjaxResult.success(loginVo); return R.ok(loginVo); } //账户被冻结,给出提示 if(2 == appUser.getStatus()){ return AjaxResult.error("账户已被冻结,请联系管理员!"); return R.fail("账户已被冻结,请联系管理员!"); } LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(1); @@ -116,7 +117,7 @@ Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser); loginVo.setToken(tokenApplet.get("access_token").toString()); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); return AjaxResult.success(loginVo); return R.ok(loginVo); } @@ -126,7 +127,7 @@ * @return */ @Override public AjaxResult getSMSCode(SMSCode smsCode) { public R getSMSCode(SMSCode smsCode) { //校验验证码获取评率(1分钟5次) String key = smsCode.getType() + "&" + smsCode.getPhone(); Map<String, Object> cacheMap = redisService.getCacheMap(key); @@ -134,7 +135,7 @@ Integer number = Integer.valueOf(cacheMap.get("number").toString()) + 1; Long startTime = Long.valueOf(cacheMap.get("startTime").toString()); if(number > 5 && (System.currentTimeMillis() - startTime) < 60000){ return AjaxResult.error("获取验证码太频繁,请稍后重试!"); return R.fail("获取验证码太频繁,请稍后重试!"); } if(number <= 5){ cacheMap.put("number", number); @@ -156,7 +157,7 @@ code += Double.valueOf(Math.random() * 10).intValue(); } //发送短信 todo 待对接短信 return AjaxResult.success(); return R.ok(); } @@ -166,27 +167,27 @@ * @return */ @Override public AjaxResult<LoginVo> registerAccount(RegisterAccount registerAccount) { public R<LoginVo> registerAccount(RegisterAccount registerAccount) { //校验验证码 String code = redisService.getCacheObject(registerAccount.getPhone()); if(null == code || !code.equals(registerAccount.getCode())){ return AjaxResult.error("验证码错误"); return R.fail("验证码错误"); } //使用jscode获取微信openid Map<String, Object> map = weChatUtil.code2Session(registerAccount.getJscode()); Integer errcode = Integer.valueOf(map.get("errcode").toString()); if(0 != errcode){ return AjaxResult.error(map.get("msg").toString()); return R.fail(map.get("msg").toString()); } String openid = map.get("openid").toString(); //查询用户是否注册 AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getWxOpenid, openid).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0)); if(null != appUser){ return AjaxResult.error("此微信号已注册,请直接登录!"); return R.fail("此微信号已注册,请直接登录!"); } AppUser appUser1 = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, registerAccount.getPhone()).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0)); if(null != appUser1){ return AjaxResult.error("手机号已注册,请直接登录!"); return R.fail("手机号已注册,请直接登录!"); } if(null == appUser){ appUser = new AppUser(); @@ -242,7 +243,7 @@ Map<String, Object> tokenApplet = tokenService.createTokenApplet(loginUser); loginVo.setToken(tokenApplet.get("access_token").toString()); loginVo.setFailureTime(Long.valueOf(tokenApplet.get("expires_in").toString())); return AjaxResult.success(loginVo); return R.ok(loginVo); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserCouponServiceImpl.java
@@ -1,10 +1,21 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.mapper.UserCouponMapper; import com.ruoyi.account.api.model.UserCoupon; import com.ruoyi.account.service.UserCouponService; import com.ruoyi.other.api.domain.CouponInfo; import com.ruoyi.other.api.feignClient.CouponInfoClient; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -17,4 +28,56 @@ @Service public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService { @Resource private CouponInfoClient couponInfoClient; /** * 获取支付页面的优惠券列表数据 * @param userId * @param orderMoney * @return */ @Override public List<CouponInfoVo> getUserCoupon(Long userId, BigDecimal orderMoney, Integer type) { List<UserCoupon> list = this.list(new LambdaQueryWrapper<UserCoupon>().eq(UserCoupon::getAppUserId, userId).eq(UserCoupon::getDelFlag, 0) .last(" and now() between start_time and end_time")); List<Integer> couponIds = list.stream().map(UserCoupon::getCouponId).collect(Collectors.toList()); if(couponIds.size() == 0){ return null; } List<CouponInfo> couponInfoList = couponInfoClient.getCouponInfoList(couponIds).getData(); //构建返回数据 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); List<CouponInfoVo> infoVoList = new ArrayList<>(); for (UserCoupon userCoupon : list) { CouponInfo couponInfo = couponInfoList.stream().filter(s -> s.getId().equals(userCoupon.getCouponId())).findFirst().get(); CouponInfoVo couponInfoVo = new CouponInfoVo(); couponInfoVo.setId(userCoupon.getId()); couponInfoVo.setName(couponInfo.getCouponName()); couponInfoVo.setCouponType(couponInfo.getCouponType()); couponInfoVo.setConditionAmount(couponInfo.getConditionAmount()); couponInfoVo.setDiscountAmount(couponInfo.getDiscountAmount()); couponInfoVo.setMoneyAmount(couponInfo.getMoneyAmount()); couponInfoVo.setDiscount(couponInfo.getDiscount()); couponInfoVo.setPeriodEndTime(couponInfo.getPeriodStartTime().format(formatter)); couponInfoVo.setPeriodEndTime(couponInfo.getPeriodEndTime().format(formatter)); couponInfoVo.setAvailable(false); //满减券 if(1 == couponInfo.getCouponType() && orderMoney.compareTo(couponInfo.getConditionAmount()) >= 0){ couponInfoVo.setAvailable(true); } //代金券和折扣券 if(2 == couponInfo.getCouponType() || 3 == couponInfo.getCouponType()){ couponInfoVo.setAvailable(true); } //商品券 if(4 == couponInfo.getCouponType() && 2 == type){ couponInfoVo.setAvailable(true); } infoVoList.add(couponInfoVo); } return infoVoList; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/LoginVo.java
@@ -9,7 +9,7 @@ * @Date 2024/11/25 9:39 */ @Data @ApiModel @ApiModel("登录结果") public class LoginVo { @ApiModelProperty("token") private String token; ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/NearbyReferrerVo.java
@@ -11,7 +11,7 @@ * @Date 2024/11/25 10:42 */ @Data @ApiModel @ApiModel("附近推荐人") public class NearbyReferrerVo { @ApiModelProperty("id") private String id; @@ -21,6 +21,6 @@ private String name; @ApiModelProperty("会员类型名称") private String vip; @ApiModelProperty("距离(km)") @ApiModelProperty("距离(m)") private BigDecimal distance; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/ShoppingCartController.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.TableDataInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.service.ShoppingCartService; import com.ruoyi.order.vo.*; import io.swagger.annotations.Api; @@ -22,6 +23,12 @@ @Resource private ShoppingCartService shoppingCartService; @Resource private TokenService tokenService; @ResponseBody @@ -47,27 +54,43 @@ @ResponseBody @PostMapping("/setGoodsNumber") @ApiOperation(value = "修改购物车数量", tags = {"商城-购物车-小程序"}) public AjaxResult setGoodsNumber(@RequestBody SetGoodsNumber setGoodsNumber){ public R setGoodsNumber(@RequestBody SetGoodsNumber setGoodsNumber){ return shoppingCartService.setGoodsNumber(setGoodsNumber); } @ResponseBody @DeleteMapping("/delShoppingCart") @ApiOperation(value = "删除购物车", tags = {"商城-购物车-小程序"}) public R delShoppingCart(Long id){ Long userid = tokenService.getLoginUserApplet().getUserid(); ShoppingCart shoppingCart = shoppingCartService.getById(id); if(!userid.equals(shoppingCart.getAppUserId())){ return R.fail("权限不足,不允许此操作"); } shoppingCartService.removeById(id); return R.ok(); } @ResponseBody @PostMapping("/confirmOrder") @ApiOperation(value = "确定购物车订单", tags = {"商城-购物车-小程序"}) public AjaxResult<ConfirmOrderVo> confirmOrder(@RequestBody ConfirmOrder confirmOrder){ // todo 待完善 pu return AjaxResult.success(); public R<ConfirmOrderVo> confirmOrder(@RequestBody ConfirmOrder confirmOrder){ ConfirmOrderVo confirmOrderVo = shoppingCartService.confirmOrder(confirmOrder); return R.ok(confirmOrderVo); } @ResponseBody @PostMapping("/shoppingCartPayment") @ApiOperation(value = "购物车订单支付", tags = {"商城-购物车-小程序"}) public AjaxResult<Void> shoppingCartPayment(@RequestBody ShoppingCartPayment shoppingCartPayment){ // todo 待完善 pu return AjaxResult.success(); public R<Void> shoppingCartPayment(@RequestBody ShoppingCartPayment shoppingCartPayment){ return shoppingCartService.shoppingCartPayment(shoppingCartPayment); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/ShoppingCartService.java
@@ -1,9 +1,9 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.order.vo.MyShoppingCartVo; import com.ruoyi.order.vo.SetGoodsNumber; import com.ruoyi.order.vo.*; import model.ShoppingCart; import org.springframework.web.bind.annotation.RequestBody; @@ -32,5 +32,21 @@ * @param setGoodsNumber * @return */ AjaxResult setGoodsNumber(SetGoodsNumber setGoodsNumber); R setGoodsNumber(SetGoodsNumber setGoodsNumber); /** * 确认购物车订单 * @param confirmOrder * @return */ ConfirmOrderVo confirmOrder(ConfirmOrder confirmOrder); /** * 购物车支付操作 * @param shoppingCartPayment * @return */ R shoppingCartPayment(ShoppingCartPayment shoppingCartPayment); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java
@@ -1,26 +1,41 @@ package com.ruoyi.order.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; 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.feignClient.UserAddressClient; import com.ruoyi.account.api.feignClient.UserCouponClient; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.mapper.ShoppingCartMapper; import com.ruoyi.order.service.OrderGoodService; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.service.ShoppingCartService; import com.ruoyi.order.vo.MyShoppingCartVo; import com.ruoyi.order.vo.SetGoodsNumber; import com.ruoyi.order.vo.*; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.other.api.vo.GetGoodsBargainPrice; import com.ruoyi.other.api.vo.GetSeckillActivityInfo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import model.Order; import model.OrderGood; import model.ShoppingCart; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @@ -52,6 +67,30 @@ @Resource private GoodsBargainPriceClient goodsBargainPriceClient; @Resource private OrderService orderService; @Resource private OrderGoodService orderGoodService; @Resource private ShopClient shopClient; @Resource private OrderActivityInfoClient orderActivityInfoClient; @Resource private BaseSettingClient baseSettingClient; @Resource private UserAddressClient userAddressClient; @Resource private UserCouponClient userCouponClient; @Resource private SystemConfigClient systemConfigClient; @@ -75,44 +114,8 @@ List<Long> goodsIds = data.stream().map(Goods::getId).collect(Collectors.toList()); //查询符合商品类型的商品数据 List<ShoppingCart> list = this.list(new LambdaQueryWrapper<ShoppingCart>().eq(ShoppingCart::getAppUserId, userid).in(ShoppingCart::getGoodsId, goodsIds)); List<MyShoppingCartVo> page = new ArrayList<>(); //构建返回数据 for (ShoppingCart shoppingCart : list) { Goods goods = data.stream().filter(s -> s.getId().equals(shoppingCart.getGoodsId())).findFirst().get(); MyShoppingCartVo vo = new MyShoppingCartVo(); vo.setId(shoppingCart.getId()); vo.setHomePicture(goods.getHomePagePicture()); vo.setName(goods.getName()); //获取支付价格 Price price = getPrice(appUser, shoppingCart.getGoodsId(), shopId); if(null == price){ //使用商品的基础价格 price.setCash(1 == goods.getCashPayment() ? goods.getSellingPrice() : null); price.setPoint(1 == goods.getPointPayment() ? goods.getIntegral() : null); } //构建价格展示内容 String sellingPrice = ""; if(null != price.getCash() && null != price.getPoint()){ sellingPrice = price.getCash() + "或" + price.getPoint() + "积分"; } if(null != price.getCash() && null == price.getPoint()){ sellingPrice = price.getCash() + ""; } if(null == price.getCash() && null != price.getPoint()){ sellingPrice = price.getPoint() + "积分"; } vo.setSellingPrice(sellingPrice); vo.setEndTime(price.getEndTime()); vo.setOriginalPrice(goods.getOriginalPrice().toString()); vo.setNumber(shoppingCart.getNumber()); GoodsShop goodsShop = new GoodsShop(); goodsShop.setGoodsId(shoppingCart.getGoodsId()); goodsShop.setShopId(shopId); GoodsShop goodsShop1 = goodsShopClient.getGoodsShop(goodsShop).getData(); vo.setVerifiable(null == goodsShop1 ? false : true); page.add(vo); } List<MyShoppingCartVo> page = buildDetail(appUser, shopId, list, null); return page; } @@ -157,14 +160,30 @@ }else{ price.setCash(goodsVip.getSellingPrice()); price.setPoint(goodsVip.getIntegral()); price.setCashPayment(goodsVip.getCashPayment() == 1 ? true : false); price.setPointPayment(goodsVip.getPointPayment() == 1 ? true : false); price.setEarnSpendingPoints(goodsVip.getEarnSpendingPoints()); } }else{ price.setCash(goodsArea.getSellingPrice()); price.setPoint(goodsArea.getIntegral()); price.setCashPayment(goodsArea.getCashPayment() == 1 ? true : false); price.setPointPayment(goodsArea.getPointPayment() == 1 ? true : false); price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); } }else{ price.setCash(bargainPriceDetail.getSellingPrice()); price.setPoint(bargainPriceDetail.getIntegral()); price.setCashPayment(bargainPriceDetail.getSellingPrice() != null ? true : false); price.setPointPayment(bargainPriceDetail.getIntegral() != null ? true : false); //门店特价,消费积分使用会员等级的消费积分 GoodsArea area = new GoodsArea(); area.setDistrictsCode(appUser.getDistrictCode()); area.setCityCode(appUser.getCityCode()); area.setProvinceCode(appUser.getProvinceCode()); area.setVip(appUser.getVipId()); GoodsArea goodsArea = goodsAreaClient.getGoodsArea(area).getData(); price.setEarnSpendingPoints(goodsArea.getEarnSpendingPoints()); } }else{ //构建价格数据 @@ -178,7 +197,10 @@ if(goodsSeckill.getCashPayment() == 0 && goodsSeckill.getPointPayment() == 1){ price.setPoint(goodsSeckill.getIntegral()); } price.setCashPayment(goodsSeckill.getCashPayment() == 1 ? true : false); price.setPointPayment(goodsSeckill.getPointPayment() == 1 ? true : false); price.setEndTime(goodsSeckill.getEndTime()); price.setEarnSpendingPoints(goodsSeckill.getEarnSpendingPoints()); } return price; } @@ -198,6 +220,18 @@ * 获取结束时间 */ private Long endTime; /** * 现金支付 */ private Boolean cashPayment; /** * 积分支付 */ private Boolean pointPayment; /** * 可获得消费积分 */ private Integer earnSpendingPoints; } @@ -215,15 +249,204 @@ * @return */ @Override public AjaxResult setGoodsNumber(SetGoodsNumber setGoodsNumber) { public R setGoodsNumber(SetGoodsNumber setGoodsNumber) { if(0 >= setGoodsNumber.getNumber()){ return AjaxResult.error("修改数量不能小于等于0"); return R.fail("修改数量不能小于等于0"); } ShoppingCart shoppingCart = this.getById(setGoodsNumber.getId()); Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit() && goods.getPurchaseLimit() < setGoodsNumber.getNumber()){ return R.fail("修改数量不能大于限购数量"); } if(null != shoppingCart){ shoppingCart.setNumber(setGoodsNumber.getNumber()); this.updateById(shoppingCart); } return AjaxResult.success(); return R.ok(); } /** * 确认购物车订单 * @param confirmOrder * @return */ @Override public ConfirmOrderVo confirmOrder(ConfirmOrder confirmOrder) { Long userid = tokenService.getLoginUserApplet().getUserid(); AppUser appUser = appUserClient.getAppUserById(userid); Integer shopId = confirmOrder.getShopId(); Shop shop = shopClient.getShopById(shopId).getData(); String goodsJson = confirmOrder.getGoodsJson(); List<Long> ids = new ArrayList<>(); JSONArray objects = JSON.parseArray(goodsJson); for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); ids.add(id); } List<ShoppingCart> list = this.listByIds(ids); ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo(); //构建商品明细列表 List<MyShoppingCartVo> goodsList = buildDetail(appUser, shopId, list, objects); confirmOrderVo.setGoodsList(goodsList); confirmOrderVo.setShopId(confirmOrder.getShopId()); confirmOrderVo.setShopName(shop.getName()); //现金支付 if(confirmOrder.getPaymentType() == 1){ BigDecimal bigDecimal = goodsList.stream().map(MyShoppingCartVo::getCash).reduce(BigDecimal::add).get(); confirmOrderVo.setOrderMoney(bigDecimal); }else{ int sum = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); confirmOrderVo.setOrderPoint(sum); } //查询当前是否有订单活动 OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); BigDecimal orderMoney = confirmOrderVo.getOrderMoney(); BigDecimal paymentMoney = orderMoney; //满XX才打折,只有现金才能优惠 if(null != orderActivityInfo && confirmOrder.getPaymentType() == 1 && orderActivityInfo.getConditionAmount().compareTo(orderMoney) <= 0){ confirmOrderVo.setActivityName(orderActivityInfo.getActivityName()); paymentMoney = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(orderMoney); confirmOrderVo.setDiscountAmount(orderMoney.subtract(paymentMoney).setScale(2, RoundingMode.HALF_EVEN)); } BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); confirmOrderVo.setUseSimultaneously(baseSetting.getContent().equals("1") ? true : false); int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); confirmOrderVo.setEarnPoint(earnPoint); //支付金额,订单金额-订单优惠 confirmOrderVo.setPayMoney(paymentMoney); confirmOrderVo.setResidualPoint(appUser.getLavePoint().intValue()); //获取默认收货地址 UserAddress userAddress = userAddressClient.getDefaultUserAddress(userid).getData(); confirmOrderVo.setUserAddress(userAddress); confirmOrderVo.setPaymentType(confirmOrder.getPaymentType()); //获取用户优惠券,用户全部优惠券,不能使用的需要标识出来置灰展示 PaymentUserCoupon paymentUserCoupon = new PaymentUserCoupon(); paymentUserCoupon.setUserId(userid); paymentUserCoupon.setOrderMoney(orderMoney); paymentUserCoupon.setType(confirmOrder.getType()); List<CouponInfoVo> data = userCouponClient.getPaymentUserCoupon(paymentUserCoupon).getData(); confirmOrderVo.setCoupon(data); //获取快递策略 SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData(); JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); confirmOrderVo.setExpressFee(jsonObject.getBigDecimal("expressFee")); List<Integer> vip = jsonObject.getJSONArray("vip").toList(Integer.class); //包邮条件(所有会员或者满足条件的会员) if(vip.get(0) == -1 || vip.contains(appUser.getVipId())){ if(confirmOrder.getPaymentType() == 1){ //现金支付,支付金额满足包邮条件 BigDecimal cash = jsonObject.getBigDecimal("cash"); if(confirmOrderVo.getPayMoney().compareTo(cash) >= 0){ confirmOrderVo.setExpressFee(BigDecimal.ZERO); } }else{ //积分支付,支付积分是否满足包邮条件 Integer point = jsonObject.getInteger("point"); if(confirmOrderVo.getOrderPoint().compareTo(point) >= 0){ confirmOrderVo.setExpressFee(BigDecimal.ZERO); } } } return confirmOrderVo; } /** * 构建购物车商品列表 * @param appUser * @param shopId * @param list * @param objects * @return */ private List<MyShoppingCartVo> buildDetail(AppUser appUser, Integer shopId, List<ShoppingCart> list, JSONArray objects){ List<MyShoppingCartVo> page = new ArrayList<>(); for (ShoppingCart shoppingCart : list) { Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); MyShoppingCartVo vo = new MyShoppingCartVo(); vo.setId(shoppingCart.getId()); vo.setHomePicture(goods.getHomePagePicture()); vo.setName(goods.getName()); int num = shoppingCart.getNumber(); if(null != objects){ for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); if(id.equals(shoppingCart.getId())){ num = objects.getJSONObject(i).getInteger("num"); break; } } } //获取支付价格 Price price = getPrice(appUser, shoppingCart.getGoodsId(), shopId); if(null == price){ //使用商品的基础价格 price.setCash(1 == goods.getCashPayment() ? goods.getSellingPrice() : null); price.setPoint(1 == goods.getPointPayment() ? goods.getIntegral() : null); price.setCashPayment(goods.getCashPayment() == 1 ? true : false); price.setPointPayment(goods.getPointPayment() == 1 ? true : false); } vo.setCash(price.getCash()); vo.setPoint(price.getPoint()); vo.setCashPayment(price.getCashPayment()); vo.setPointPayment(price.getPointPayment()); vo.setEndTime(price.getEndTime()); vo.setOriginalPrice(goods.getOriginalPrice().toString()); vo.setNumber(num); GoodsShop goodsShop = new GoodsShop(); goodsShop.setGoodsId(shoppingCart.getGoodsId()); goodsShop.setShopId(shopId); GoodsShop goodsShop1 = goodsShopClient.getGoodsShop(goodsShop).getData(); vo.setVerifiable(null == goodsShop1 ? false : true); //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) if(null == goods.getPurchaseLimit() || -1 == goods.getPurchaseLimit()){ vo.setPurchaseLimit(false); }else{ List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getAppUserId, appUser.getId()).eq(Order::getDelFlag, 0).in(Order::getOrderStatus, Arrays.asList(4, 8))); List<Long> orderIds = orders.stream().map(Order::getId).collect(Collectors.toList()); int sum = 0; if(orderIds.size() > 0){ List<OrderGood> orderGoodList = orderGoodService.list(new LambdaQueryWrapper<OrderGood>().in(OrderGood::getOrderId, orderIds) .eq(OrderGood::getGoodsId, shoppingCart.getGoodsId()).eq(OrderGood::getDelFlag, 0)); sum = orderGoodList.stream().mapToInt(OrderGood::getNum).sum(); } vo.setPurchaseLimit((num + sum) > goods.getPurchaseLimit() ? true : false); } vo.setEarnSpendingPoints(price.getEarnSpendingPoints()); vo.setDistributionMode(goods.getDistributionMode()); page.add(vo); } return page; } /** * 购物车支付操作 * @param shoppingCartPayment * @return */ @Override public R shoppingCartPayment(ShoppingCartPayment shoppingCartPayment) { Long userid = tokenService.getLoginUserApplet().getUserid(); AppUser appUser = appUserClient.getAppUserById(userid); Integer shopId = shoppingCartPayment.getShopId(); Shop shop = shopClient.getShopById(shopId).getData(); String goodsJson = shoppingCartPayment.getGoodsJson(); List<Long> ids = new ArrayList<>(); JSONArray objects = JSON.parseArray(goodsJson); for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); ids.add(id); } List<ShoppingCart> list = this.listByIds(ids); ConfirmOrderVo confirmOrderVo = new ConfirmOrderVo(); //构建商品明细列表 List<MyShoppingCartVo> goodsList = buildDetail(appUser, shopId, list, objects); return null; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ConfirmOrder.java
@@ -11,10 +11,12 @@ @Data @ApiModel public class ConfirmOrder { @ApiModelProperty(value = "购物商品id JSON", required = true) @ApiModelProperty(value = "购物车数据id,数量 JSON[{id:1212,num:2}]", required = true) private String goodsJson; @ApiModelProperty(value = "支付方式(1=现金,2=积分)", required = true) private Integer paymentType; @ApiModelProperty(value = "核销门店id", required = true) private Integer shopId; @ApiModelProperty(value = "商品类型(1=服务商品,2=单品商品)", required = true) private Integer type; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ConfirmOrderVo.java
@@ -1,6 +1,7 @@ package com.ruoyi.order.vo; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.api.vo.CouponInfoVo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -31,14 +32,18 @@ private Integer earnPoint; @ApiModelProperty("支付金额") private BigDecimal payMoney; @ApiModelProperty("订单总金额") @ApiModelProperty("订单总积分") private Integer orderPoint; @ApiModelProperty("剩余积分") private Integer residualPoint; @ApiModelProperty("收货地址") private UserAddress userAddress; @ApiModelProperty("快递费") private BigDecimal expressFee; @ApiModelProperty("支付方式(1=现金,2=积分)") private Integer paymentType; @ApiModelProperty("活动是否可以和优惠券同时使用") private Boolean useSimultaneously; @ApiModelProperty("优惠券列表") private List<CouponInfoVo> coupon; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/MyShoppingCartVo.java
@@ -4,6 +4,8 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/11/25 11:51 @@ -17,8 +19,10 @@ private String homePicture; @ApiModelProperty("商品名称") private String name; @ApiModelProperty("售价") private String sellingPrice; @ApiModelProperty("售价现金") private BigDecimal cash; @ApiModelProperty("售价积分") private Integer point; @ApiModelProperty("原价") private String originalPrice; @ApiModelProperty("购买数量") @@ -27,4 +31,16 @@ private Long endTime; @ApiModelProperty("是否可核销(0=否,1=是)") private Boolean verifiable; @ApiModelProperty("是否超出限购数量") private Boolean purchaseLimit; @ApiModelProperty("现金支付") private Boolean cashPayment; @ApiModelProperty("积分支付") private Boolean pointPayment; @ApiModelProperty("配送方式(1=自提,2=快递)") private Integer distributionMode; /** * 可获得消费积分 */ private Integer earnSpendingPoints; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ShoppingCartPayment.java
@@ -11,7 +11,7 @@ @Data @ApiModel public class ShoppingCartPayment { @ApiModelProperty(value = "购物商品id JSON", required = true) @ApiModelProperty(value = "购物车数据id,数量 JSON[{id:1212,num:2}]", required = true) private String goodsJson; @ApiModelProperty(value = "支付方式(1=现金,2=积分)", required = true) private Integer paymentType; @@ -19,4 +19,8 @@ private Integer shopId; @ApiModelProperty(value = "优惠券id", required = false) private String userCouponId; @ApiModelProperty(value = "配送方式(1=自提,2=快递)", required = false) private Integer distributionMode; @ApiModelProperty(value = "配送地址id", required = false) private Integer userAddressId; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BaseSettingController.java
@@ -1,8 +1,12 @@ package com.ruoyi.other.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.BaseSetting; import com.ruoyi.other.service.BaseSettingService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * <p> @@ -16,5 +20,24 @@ @RequestMapping("/base-setting") public class BaseSettingController { @Resource private BaseSettingService baseSettingService; /** * 获取基础配置 * @param id * @return */ @ResponseBody @PostMapping("/getBaseSetting") public R<BaseSetting> getBaseSetting(@RequestParam("id") Integer id){ BaseSetting baseSetting = baseSettingService.getById(id); return R.ok(baseSetting); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/CouponInfoController.java
@@ -1,8 +1,13 @@ package com.ruoyi.other.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.CouponInfo; import com.ruoyi.other.service.CouponInfoService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> @@ -16,5 +21,21 @@ @RequestMapping("/coupon-info") public class CouponInfoController { @Resource private CouponInfoService couponInfoService; /** * 根据id获取优惠券数据 * @param ids * @return */ @ResponseBody @PostMapping("/getCouponInfoList") public R<List<CouponInfo>> getCouponInfoList(@RequestParam("ids") List<Integer> ids){ List<CouponInfo> couponInfos = couponInfoService.listByIds(ids); return R.ok(couponInfos); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/GoodsController.java
@@ -74,5 +74,18 @@ return R.ok(list); } /** * 根据id获取商品信息 * @param id * @return */ @ResponseBody @PostMapping("/getGoodsById") public R<Goods> getGoodsById(@RequestParam("id") Integer id){ Goods goods = goodsService.getById(id); return R.ok(goods); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/OrderActivityInfoController.java
@@ -1,8 +1,13 @@ package com.ruoyi.other.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.OrderActivityInfo; import com.ruoyi.other.service.OrderActivityInfoService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * <p> @@ -16,5 +21,23 @@ @RequestMapping("/order-activity-info") public class OrderActivityInfoController { @Resource private OrderActivityInfoService orderActivityInfoService; /** * 获取当前生效的活动 * @param vip * @return */ @ResponseBody @PostMapping("/getNowOrderActivityInfo") public R<OrderActivityInfo> getNowOrderActivityInfo(@RequestParam("vip") Integer vip){ OrderActivityInfo one = orderActivityInfoService.getOne(new LambdaQueryWrapper<OrderActivityInfo>().eq(OrderActivityInfo::getDelFlag, 0) .last(" and now() between start_time and end_time and FIND_IN_SET(" + vip + ", vip_ids) limit 0, 1")); return R.ok(one); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java
@@ -93,5 +93,18 @@ // todo 待完善 pu return R.ok(); } /** * 根据id获取门店信息 * @param id * @return */ @ResponseBody @PostMapping("/getShopById") public R<Shop> getShopById(@RequestParam("id") Integer id){ Shop shop = shopService.getById(id); return R.ok(shop); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java
@@ -4,9 +4,7 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.SystemConfig; import com.ruoyi.other.service.SystemConfigService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -31,5 +29,18 @@ SystemConfig one = systemConfigService.lambdaQuery().eq(SystemConfig::getType, type).last("limit 1").one(); return R.ok(one); } /** * 根据类型获取系统配置 * @param type * @return */ @ResponseBody @PostMapping("/getSystemConfig") public R<SystemConfig> getSystemConfig(@RequestParam("type") Integer type){ SystemConfig one = systemConfigService.lambdaQuery().eq(SystemConfig::getType, type).last("limit 1").one(); return R.ok(one); } }