.gitignore
@@ -18,3 +18,4 @@ *.yaml *.yml *.log *.iml ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserClientFallbackFactory.java
@@ -2,9 +2,13 @@ import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.AppUserShop; import com.ruoyi.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; /** * @author zhibing.pu @@ -19,6 +23,7 @@ public AppUserClient create(Throwable cause) { return new AppUserClient() { @PostMapping("/appUser/getAppUserById") @Override public AppUser getAppUserById(Long id) { log.error("根据id获取用户失败:{}", cause.getMessage()); @@ -38,6 +43,17 @@ } @Override public R<List<AppUserShop>> getAppUserShop(Long userId) { log.error("获取用户门店信息失败:{}", cause.getMessage()); throw new RuntimeException("获取用户门店信息失败"); } @Override public R<List<AppUser>> getUserAncestorList(Long id) { log.error("获取用户祖籍列表失败:{}", cause.getMessage()); throw new RuntimeException("获取用户祖籍列表失败"); } @Override public R<Long> getVipCount(Long userId, Integer vipId) { log.error("获取直推会员数失败:{}", cause.getMessage()); throw new RuntimeException("获取直推会员数失败"); ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/BalanceChangeRecordClientFallbackFactory.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.BalanceChangeRecordClient; import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FallbackFactory; /** * @author zhibing.pu * @Date 2024/12/2 15:35 */ public class BalanceChangeRecordClientFallbackFactory implements FallbackFactory<BalanceChangeRecordClient> { @Override public BalanceChangeRecordClient create(Throwable cause) { return new BalanceChangeRecordClient(){ @Override public R saveBalanceChangeRecord(BalanceChangeRecord balanceChangeRecord) { return R.fail("保存账户流水记录失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserAddressClientFallbackFactory.java
New file @@ -0,0 +1,28 @@ 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()); } @Override public R<UserAddress> getUserAddressById(Integer id) { return R.fail("根据id获取用户地址信息失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserCouponClientFallbackFactory.java
New file @@ -0,0 +1,32 @@ 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.account.api.vo.PaymentUserCouponVo; 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<PaymentUserCouponVo>> getPaymentUserCoupon(PaymentUserCoupon paymentUserCoupon) { return R.fail("根据id获取优惠券数据失败:" + cause.getMessage()); } @Override public R<CouponInfoVo> getCouponInfo(Long userCouponId) { return R.fail("根据用户优惠券id获取优惠券详情失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/UserPointFallbackFactory.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.UserPointClient; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FallbackFactory; /** * @author zhibing.pu * @Date 2024/12/2 15:04 */ public class UserPointFallbackFactory implements FallbackFactory<UserPointClient> { @Override public UserPointClient create(Throwable cause) { return new UserPointClient() { @Override public R saveUserPoint(UserPoint userPoint) { return R.fail("保存积分流水记录失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -2,11 +2,16 @@ import com.ruoyi.account.api.factory.AppUserClientFallbackFactory; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.AppUserShop; 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.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * @author zhibing.pu @@ -20,7 +25,7 @@ * @param id * @return */ @PostMapping("/app-user/getAppUserById") @PostMapping("/appUser/getAppUserById") AppUser getAppUserById(@RequestParam("id") Long id); /** @@ -32,6 +37,19 @@ @PostMapping("/app-user/getCouponCount") R<Long> getCouponCount(@RequestParam("userId")Long userId, @RequestParam("couponId") Integer couponId ); /** * 根据用户id查询用户门店信息 */ @GetMapping("/appUserShop/shop/{userId}") R<List<AppUserShop>> getAppUserShop(@PathVariable("userId") Long userId); /** * 根据用户id获取用户的祖籍列表 */ @GetMapping("/appletLogin/getUserAncestorList") R<List<AppUser>> getUserAncestorList(@RequestParam("id") Long id); @PostMapping("/app-user/getVipCount") R<Long> getVipCount(@RequestParam("userId")Long userId, @RequestParam("vipId") Integer vipId ); ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/BalanceChangeRecordClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.factory.BalanceChangeRecordClientFallbackFactory; import com.ruoyi.account.api.model.BalanceChangeRecord; 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; /** * @author zhibing.pu * @Date 2024/12/2 15:34 */ @FeignClient(contextId = "BalanceChangeRecordClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = BalanceChangeRecordClientFallbackFactory.class) public interface BalanceChangeRecordClient { /** * 保存账户流水记录 * @param balanceChangeRecord * @return */ @PostMapping("/balanceChangeRecord/saveBalanceChangeRecord") R saveBalanceChangeRecord(@RequestBody BalanceChangeRecord balanceChangeRecord); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserAddressClient.java
New file @@ -0,0 +1,34 @@ 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); /** * 根据id获取用户地址信息 * @param id * @return */ @PostMapping("/user-address/getUserAddressById") R<UserAddress> getUserAddressById(@RequestParam("id") Integer id); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserCouponClient.java
New file @@ -0,0 +1,39 @@ 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.account.api.vo.PaymentUserCouponVo; 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 org.springframework.web.bind.annotation.RequestParam; 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<PaymentUserCouponVo>> getPaymentUserCoupon(@RequestBody PaymentUserCoupon paymentUserCoupon); /** * 根据用户优惠券id获取优惠券详情 * @param userCouponId * @return */ @PostMapping("/user-coupon/getCouponInfo") R<CouponInfoVo> getCouponInfo(@RequestParam("userCouponId") Long userCouponId); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/UserPointClient.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.factory.UserPointFallbackFactory; import com.ruoyi.account.api.model.UserPoint; 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; /** * @author zhibing.pu * @Date 2024/12/2 15:04 */ @FeignClient(contextId = "UserPointClient", value = ServiceNameConstants.ACCOUNT_SERVICE, fallbackFactory = UserPointFallbackFactory.class) public interface UserPointClient { /** * 保存积分流水记录 * @param userPoint * @return */ @PostMapping("/user-point/saveUserPoint") R saveUserPoint(@RequestBody UserPoint userPoint); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUser.java
@@ -33,6 +33,9 @@ @TableId("id") private Long id; @ApiModelProperty(value = "用户类型(1-普通用户,2-门店员工)") private Integer userType; @ApiModelProperty(value = "用户") @TableField("name") private String name; @@ -100,19 +103,19 @@ @ApiModelProperty(value = "合伙人积分数") @TableField("part_point") private BigDecimal partPoint; private Integer partPoint; @ApiModelProperty(value = "合伙人培育积分数") @TableField("part_grow_point") private BigDecimal partGrowPoint; private Integer partGrowPoint; @ApiModelProperty(value = "消费积分数") @TableField("shop_point") private BigDecimal shopPoint; private Integer shopPoint; @ApiModelProperty(value = "返佣积分数") @TableField("share_point") private BigDecimal sharePoint; private Integer sharePoint; @ApiModelProperty(value = "消费总金额") @TableField("shop_amount") @@ -121,6 +124,10 @@ @ApiModelProperty(value = "最后消费时间") @TableField("last_shop_time") private LocalDateTime lastShopTime; @ApiModelProperty(value = "账户余额") @TableField("balance") private BigDecimal balance; @ApiModelProperty(value = "可提现金额") @TableField("withdrawable_amount") @@ -142,9 +149,10 @@ @TableField("total_distribution_amount") private BigDecimal totalDistributionAmount; @ApiModelProperty(value = "剩余积分") @TableField("lave_point") private BigDecimal lavePoint; private Integer lavePoint; @ApiModelProperty(value = "是否可更换推广人(0=否,1=是)") @TableField("change_promoter") @@ -183,24 +191,31 @@ private String districtCode; @ApiModelProperty("等级1会员数") @TableField(exist = false) private Long count1; @ApiModelProperty("等级2会员数") @TableField(exist = false) private Long count2; @ApiModelProperty("等级3会员数") @TableField(exist = false) private Long count3; @ApiModelProperty("等级4会员数") @TableField(exist = false) private Long count4; @ApiModelProperty("等级5会员数") @TableField(exist = false) private Long count5; @ApiModelProperty("等级6会员数") @TableField(exist = false) private Long count6; @ApiModelProperty("等级7会员数") @TableField(exist = false) private Long count7; ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/AppUserShop.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.account.api.model; 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 lombok.Data; /** * @author zhibing.pu * @Date 2024/12/2 9:18 */ @Data @TableName("t_app_user_shop") public class AppUserShop { /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 用户id */ @TableField("app_user_id") private Long appUserId; /** * 门店id */ @TableField("shop_id") private Integer shopId; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/BalanceChangeRecord.java
@@ -1,6 +1,7 @@ package com.ruoyi.account.api.model; 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 io.swagger.annotations.ApiModel; @@ -31,7 +32,7 @@ private Long orderId; @ApiModelProperty("类型:1充值2提现3红包4分佣5商城购物") private Integer type; private Integer changeType; @ApiModelProperty("变更前金额") private BigDecimal beforeAmount; @@ -47,4 +48,13 @@ @ApiModelProperty("添加时间") private LocalDateTime createTime; @TableField(exist = false) @ApiModelProperty("消费用户名称") private String userName; @TableField(exist = false) @ApiModelProperty("消费金额") private BigDecimal amount; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/UserPoint.java
@@ -38,11 +38,15 @@ @ApiModelProperty(value = "历史余额") @TableField("historical_point") private BigDecimal historicalPoint; private Integer historicalPoint; @ApiModelProperty(value = "变动金额") @TableField("variable_point") private BigDecimal variablePoint; private Integer variablePoint; @ApiModelProperty(value = "变动后余额") @TableField("balance") private Integer balance; @ApiModelProperty(value = "变动时间") @TableField("create_time") ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponInfoVo.java
@@ -1,5 +1,6 @@ package com.ruoyi.account.api.vo; import com.baomidou.mybatisplus.annotation.*; 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/java/com/ruoyi/account/api/vo/PaymentUserCouponVo.java
File was renamed from ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/CouponInfoVo.java @@ -1,18 +1,19 @@ package com.ruoyi.order.vo; package com.ruoyi.account.api.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; /** * @author zhibing.pu * @Date 2024/11/25 17:59 * @Date 2024/11/29 16:39 */ @Data @ApiModel public class CouponInfoVo { public class PaymentUserCouponVo { @ApiModelProperty("优惠券id") private Long id; @ApiModelProperty("优惠券名称") @@ -31,6 +32,8 @@ private String periodStartTime; @ApiModelProperty("有效期结束时间") private String periodEndTime; @ApiModelProperty("适用商品id集合,为null表示全部适用") private List<Integer> forGoodIds; @ApiModelProperty("是否可用") private Boolean available; } ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1,5 @@ com.ruoyi.account.api.factory.AppUserClientFallbackFactory com.ruoyi.account.api.factory.UserAddressClientFallbackFactory com.ruoyi.account.api.factory.UserCouponClientFallbackFactory com.ruoyi.account.api.factory.UserPointFallbackFactory com.ruoyi.account.api.factory.BalanceChangeRecordClientFallbackFactory ruoyi-api/ruoyi-api-order/src/main/java/factory/RemoteOrderFallbackFactory.java
@@ -1,19 +1,19 @@ package factory; import feignClient.RemoteOrderClient; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; /** * 订单服务降级处理 * @author luofl */ @Component public class RemoteOrderFallbackFactory implements FallbackFactory<RemoteOrderClient> { @Override public RemoteOrderClient create(Throwable cause) { return new RemoteOrderClient() { }; } } //package factory; // //import feignClient.RemoteOrderClient; //import org.springframework.cloud.openfeign.FallbackFactory; //import org.springframework.stereotype.Component; // ///** // * 订单服务降级处理 // * @author luofl // */ //@Component //public class RemoteOrderFallbackFactory implements FallbackFactory<RemoteOrderClient> { // // @Override // public RemoteOrderClient create(Throwable cause) { // return new RemoteOrderClient() { // }; // } //} ruoyi-api/ruoyi-api-order/src/main/java/factory/RemoteOrderGoodsFallbackFactory.java
@@ -3,7 +3,7 @@ import com.ruoyi.common.core.domain.R; import feignClient.RemoteOrderGoodsClient; import lombok.extern.slf4j.Slf4j; import model.OrderGood; import model.Order; import org.springframework.cloud.openfeign.FallbackFactory; import java.util.List; @@ -14,10 +14,17 @@ public RemoteOrderGoodsClient create(Throwable cause) { return new RemoteOrderGoodsClient(){ @Override public R<List<OrderGood>> goodsOrder(List<Long> goodsIds) { log.error("编辑用户信息失败:{}", cause.getMessage()); throw new RuntimeException("编辑用户信息失败"); public R<List<Order>> goodsOrder(List<Long> goodsIds) { log.error("获取订单商品失败:{}", cause.getMessage()); throw new RuntimeException("获取订单商品失败"); } @Override public R<List<Order>> getOrderListByIds(List<Long> orderIds) { log.error("获取订单列表失败:{}", cause.getMessage()); throw new RuntimeException("获取订单列表失败"); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/feignClient/RemoteOrderClient.java
@@ -1,17 +1,24 @@ package feignClient; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import factory.RemoteOrderFallbackFactory; import model.Order; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; /** * 订单远程调用接口 * @author luofl */ @FeignClient(contextId = "RemoteOrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteOrderFallbackFactory.class) public interface RemoteOrderClient { } //package feignClient; // //import com.ruoyi.common.core.constant.ServiceNameConstants; //import com.ruoyi.common.core.domain.R; //import factory.RemoteOrderFallbackFactory; //import model.Order; //import model.OrderGood; //import org.springframework.cloud.openfeign.FeignClient; //import org.springframework.web.bind.annotation.GetMapping; //import org.springframework.web.bind.annotation.PostMapping; //import org.springframework.web.bind.annotation.RequestBody; //import org.springframework.web.bind.annotation.RequestParam; // //import java.util.List; // ///** // * 订单远程调用接口 // * @author luofl // */ //@FeignClient(contextId = "RemoteOrderClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteOrderFallbackFactory.class) //public interface RemoteOrderClient { // // //} ruoyi-api/ruoyi-api-order/src/main/java/feignClient/RemoteOrderGoodsClient.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import factory.RemoteOrderGoodsFallbackFactory; import model.Order; import model.OrderGood; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; @@ -18,5 +19,11 @@ * 查询指定商品订单 */ @PostMapping("/order-good/selectGoodsOrder") public R<List<OrderGood>> goodsOrder(@RequestBody List<Long> goodsIds); public R<List<Order>> goodsOrder(@RequestBody List<Long> goodsIds); /** * 根据ids查找订单列表 */ @PostMapping("/order/getOrderListByIds") public R<List<Order>> getOrderListByIds(@RequestBody List<Long> orderIds); } ruoyi-api/ruoyi-api-order/src/main/java/model/Order.java
@@ -44,9 +44,17 @@ @TableField("order_status") private Integer orderStatus; @ApiModelProperty(value = "是否已分佣: 0-否 1-是") @TableField("is_commission") private Integer isCommission; @ApiModelProperty(value = "核销时间") @TableField("end_time") private LocalDateTime endTime; @ApiModelProperty(value = "售后截止日期") @TableField("after_sale_time") private LocalDateTime afterSaleTime; @ApiModelProperty(value = "技师id") @TableField("technician_id") @@ -103,7 +111,7 @@ @ApiModelProperty(value = "使用积分") @TableField("point") private BigDecimal point; private Integer point; @ApiModelProperty(value = "1wx2积分") @TableField("pay_method") @@ -135,7 +143,7 @@ @ApiModelProperty(value = "本单获取的积分") @TableField("get_point") private BigDecimal getPoint; private Integer getPoint; @ApiModelProperty(value = "微信支付号") @TableField("serial_number") ruoyi-api/ruoyi-api-order/src/main/java/model/OrderGood.java
@@ -31,11 +31,11 @@ @ApiModelProperty(value = "商品id") @TableField("goods_id") private Long goodsId; private Integer goodsId; @ApiModelProperty(value = "订单id") @TableField("order_id") private Integer orderId; private Long orderId; @ApiModelProperty(value = "商品券优惠金额") @TableField("good_amount") @@ -62,5 +62,49 @@ @TableField("create_time") private LocalDateTime createTime; @ApiModelProperty(value = "可获得消费积分") @TableField("earn_spending_points") private Integer earnSpendingPoints; @ApiModelProperty(value = "上级获得分佣金额") @TableField("superior_subcommission") private BigDecimal superiorSubcommission; @ApiModelProperty(value = "上级获得返佣积分") @TableField("superior_rebate_points") private Integer superiorRebatePoints; @ApiModelProperty(value = "获取返佣积分上级类型(1=直推上级,2=直帮上级)") @TableField("superior_type") private Integer superiorType; @ApiModelProperty(value = "核销门店可获得服务费") @TableField("servuce_shop_charges") private BigDecimal servuceShopCharges; @ApiModelProperty(value = "核销门店可获得服务积分") @TableField("servuce_shop_points") private Integer servuceShopPoints; @ApiModelProperty(value = "技师可获得服务积分") @TableField("technician_points") private Integer technicianPoints; @ApiModelProperty(value = "绑定门店可获得分佣金额") @TableField("bound_shop_charges") private BigDecimal boundShopCharges; @ApiModelProperty(value = "绑定门店可获得返佣积分") @TableField("bound_shop_points") private Integer boundShopPoints; @ApiModelProperty(value = "绑定门店上级门店可获得分佣金额") @TableField("bound_shop_superiors_charges") private BigDecimal boundShopSuperiorsCharges; @ApiModelProperty(value = "绑定门店上级门店可获得返佣积分") @TableField("bound_shop_superiors_points") private Integer boundShopSuperiorsPoints; } ruoyi-api/ruoyi-api-order/src/main/java/vo/OrderDetailVO.java
File was renamed from ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderDetailVO.java @@ -1,4 +1,4 @@ package com.ruoyi.order.vo; package vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -18,7 +18,7 @@ private List<OrderGoodsVO> goodsList; @ApiModelProperty(value = "使用积分") private BigDecimal point; private Integer point; @ApiModelProperty(value = "收货地址id") private Long addressId; @@ -54,7 +54,7 @@ private BigDecimal expressAmount; @ApiModelProperty(value = "可获得积分") private BigDecimal pointAmount; private Integer pointAmount; @ApiModelProperty(value = "实际支付价格") private BigDecimal paymentAmount; ruoyi-api/ruoyi-api-order/src/main/java/vo/OrderGoodsVO.java
File was renamed from ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/OrderGoodsVO.java @@ -1,4 +1,4 @@ package com.ruoyi.order.vo; package vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -10,7 +10,7 @@ @ApiModel(value = "订单商品") public class OrderGoodsVO { @ApiModelProperty(value = "商品id") private Long goodsId; private Integer goodsId; @ApiModelProperty(value = "商品名称") private String goodsName; ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/BaseSetting.java
@@ -26,7 +26,7 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value = "1:合伙人积分设置一 2:合伙人积分设置二 3:会员说明设置 4:活动管理-活动设置 1开0关") @ApiModelProperty(value = "1:合伙人积分设置一 2:合伙人积分设置二 3:会员说明设置 4:活动管理-活动设置 1开0关 5:售后设置") @TableId("id") private Integer id; ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/Goods.java
@@ -28,7 +28,7 @@ @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Long id; private Integer id; @ApiModelProperty(value = "名称") @TableField("name") 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/GoodsShopClientFallbackFactory.java
@@ -3,7 +3,10 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.GoodsShop; import com.ruoyi.other.api.feignClient.GoodsShopClient; import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; import org.springframework.cloud.openfeign.FallbackFactory; import java.util.List; /** * @author zhibing.pu @@ -19,6 +22,11 @@ public R<GoodsShop> getGoodsShop(GoodsShop goodsShop) { return R.fail("获取商品门店关系数据失败:" + cause.getMessage()); } @Override public R<List<GoodsShop>> getGoodsShopByGoodsIds(GetGoodsShopByGoodsIds goodsIds) { return R.fail("根据商品id集合和门店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,25 @@ 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()); } @Override public R<Shop> getShopByPhone(String phone) { return R.fail("根据店铺管理员电话获取门店数据失败:" + 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/factory/TechnicianClientFallbackFactory.java
New file @@ -0,0 +1,23 @@ package com.ruoyi.other.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.Technician; import com.ruoyi.other.api.feignClient.TechnicianClient; import org.springframework.cloud.openfeign.FallbackFactory; public class TechnicianClientFallbackFactory implements FallbackFactory<TechnicianClient> { @Override public TechnicianClient create(Throwable cause) { return new TechnicianClient() { @Override public R<Technician> shopdetail(Integer techId) { return R.fail("根据省市区获取地区价格配置失败:" + cause.getMessage()); } @Override public R<Void> updateStatus(Integer status, Integer subscribeId) { 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/GoodsShopClient.java
@@ -4,9 +4,12 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.GoodsShop; import com.ruoyi.other.api.factory.GoodsShopClientFallbackFactory; import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; 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 @@ -22,4 +25,12 @@ */ @PostMapping("/goods-shop/getGoodsShop") R<GoodsShop> getGoodsShop(@RequestBody GoodsShop goodsShop); /** * 根据商品id集合和门店id查询数据 * @param goodsIds * @return */ @PostMapping("/goods-shop/getGoodsShopByGoodsIds") R<List<GoodsShop>> getGoodsShopByGoodsIds(@RequestBody GetGoodsShopByGoodsIds goodsIds); } 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/RemoteVipSettingClient.java
@@ -6,10 +6,11 @@ import com.ruoyi.other.api.factory.RemoteVipSettingFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(contextId = "RemoteOrderGoodsClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = RemoteVipSettingFallbackFactory.class) @FeignClient(contextId = "RemoteVipSettingClient", value = ServiceNameConstants.OTHER_SERVICE, fallbackFactory = RemoteVipSettingFallbackFactory.class) public interface RemoteVipSettingClient { @GetMapping("/vip-setting/getVipSettingById") R<VipSetting> getVipSettingById(Integer id); R<VipSetting> getVipSettingById(@RequestParam(value = "id",required = true) Integer id); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/ShopClient.java
New file @@ -0,0 +1,35 @@ 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); /** * 根据店铺管理员电话获取门店数据 * @param phone * @return */ @PostMapping("/shop/getShopByPhone") R<Shop> getShopByPhone(@RequestParam("phone") String phone); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/StoreClient.java
@@ -3,7 +3,6 @@ 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.OrderFallbackFactory; import com.ruoyi.other.api.factory.StoreFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; 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/java/com/ruoyi/other/api/feignClient/TechnicianClient.java
New file @@ -0,0 +1,20 @@ 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.Technician; import com.ruoyi.other.api.factory.TechnicianClientFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(contextId = "TechnicianClient", value = ServiceNameConstants.ORDER_SERVICE, fallbackFactory = TechnicianClientFallbackFactory.class) public interface TechnicianClient { @PostMapping("/technician/shop/detail") R<Technician> shopdetail(@RequestParam("techId") Integer techId); @PutMapping("/technician-subscribe/updateStatus") R<Void> updateStatus(@RequestParam("status") Integer status, @RequestParam("subscribeId") Integer subscribeId); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/vo/GetGoodsShopByGoodsIds.java
New file @@ -0,0 +1,21 @@ package com.ruoyi.other.api.vo; import lombok.Data; import java.util.List; /** * @author zhibing.pu * @Date 2024/12/2 10:18 */ @Data public class GetGoodsShopByGoodsIds { /** * 门店id */ private Integer shopId; /** * 商品id集合 */ private List<Integer> goodsIds; } ruoyi-api/ruoyi-api-other/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -5,3 +5,11 @@ 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 com.ruoyi.other.api.factory.StoreFallbackFactory com.ruoyi.other.api.factory.CouponClientFallbackFactory com.ruoyi.other.api.factory.TechnicianClientFallbackFactory ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/SysUser.java
@@ -115,7 +115,7 @@ /** * 角色类型 1=平台 2=公司 3=门店 4=修理厂 */ @ApiModelProperty(value = "角色类型 1=平台 2=合作商") @ApiModelProperty(value = "角色类型 1=平台 2=门店") private Integer roleType; @Excel(name = "密码修改时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT) @@ -131,13 +131,9 @@ @TableField("forbidden_remark") private String forbiddenRemark; @ApiModelProperty(value = "充电站") @TableField(exist = false) private List<String> siteNames; @ApiModelProperty(value = "充电站id", required = true) @TableField(exist = false) private List<Integer> siteIds; @ApiModelProperty(value = "前端用户id") @TableField("app_user_id") private Long appUserId; @ApiModelProperty(value = "角色") @TableField(exist = false) @@ -386,25 +382,12 @@ this.roleId = roleId; } public List<String> getSiteNames() { return siteNames; public Long getAppUserId() { return appUserId; } public void setSiteNames(List<String> siteNames) { this.siteNames = siteNames; } public List<String> getRoleNames() { return roleNames; } public List<Integer> getSiteIds() { return siteIds; } public void setSiteIds(List<Integer> siteIds) { this.siteIds = siteIds; public void setAppUserId(Long appUserId) { this.appUserId = appUserId; } public void setRoleNames(List<String> roleNames) { ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -73,6 +73,11 @@ public R resetPassword(SysUser user) { return R.fail("重置用户密码失败:" + cause.getMessage()); } @Override public R saveShopUser(SysUser user) { return R.fail("新增加门店员工账号数据失败:" + cause.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/feignClient/SysUserClient.java
@@ -88,4 +88,14 @@ */ @PostMapping("/user/resetPassword") R resetPassword(@RequestBody SysUser user); /** * 新增加门店员工账号数据 * @param user * @return */ @PostMapping("/user/saveShopUser") R saveShopUser(@RequestBody SysUser user); } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/model/UserShop.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.system.api.model; 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 lombok.Data; /** * @author zhibing.pu * @Date 2024/12/2 9:36 */ @Data @TableName("t_user_shop") public class UserShop { /** * 主键 */ @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 用户id */ @TableField("user_id") private Integer userId; /** * 门店id */ @TableField("shop_id") private Integer shopId; } ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysLoginService.java
@@ -1,5 +1,6 @@ package com.ruoyi.auth.service; import com.ruoyi.system.api.RemoteUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.ruoyi.common.core.constant.CacheConstants; @@ -17,6 +18,7 @@ import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.model.LoginUser; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** @@ -26,16 +28,16 @@ */ @Component public class SysLoginService { @Autowired @Resource private RemoteUserService remoteUserService; @Autowired @Resource private SysPasswordService passwordService; @Autowired @Resource private SysRecordLogService recordLogService; @Autowired @Resource private RedisService redisService; /** ruoyi-auth/src/main/java/com/ruoyi/auth/service/SysRecordLogService.java
@@ -1,6 +1,7 @@ package com.ruoyi.auth.service; import com.ruoyi.system.api.domain.SysLoginLog; import com.ruoyi.system.api.feignClient.SysLoginLogClient; import org.springframework.stereotype.Component; import javax.annotation.Resource; 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-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/aspect/LogAspect.java
@@ -5,7 +5,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.ruoyi.system.api.model.SysOperLog; import com.ruoyi.system.api.domain.SysOperLog; import org.apache.commons.lang3.ArrayUtils; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.AfterReturning; ruoyi-common/ruoyi-common-log/src/main/java/com/ruoyi/common/log/service/AsyncLogService.java
@@ -1,6 +1,7 @@ package com.ruoyi.common.log.service; import com.ruoyi.system.api.model.SysOperLog; import com.ruoyi.system.api.RemoteLogService; import com.ruoyi.system.api.domain.SysOperLog; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import com.ruoyi.common.core.constant.SecurityConstants; ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/utils/DictUtils.java
New file @@ -0,0 +1,76 @@ package com.ruoyi.common.security.utils; import com.alibaba.fastjson2.JSONArray; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.utils.SpringUtils; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.system.api.domain.SysDictData; import java.util.Collection; import java.util.List; /** * 字典工具类 * * @author ruoyi */ public class DictUtils { /** * 设置字典缓存 * * @param key 参数键 * @param dictDatas 字典数据列表 */ public static void setDictCache(String key, List<SysDictData> dictDatas) { SpringUtils.getBean(RedisService.class).setCacheObject(getCacheKey(key), dictDatas); } /** * 获取字典缓存 * * @param key 参数键 * @return dictDatas 字典数据列表 */ public static List<SysDictData> getDictCache(String key) { JSONArray arrayCache = SpringUtils.getBean(RedisService.class).getCacheObject(getCacheKey(key)); if (StringUtils.isNotNull(arrayCache)) { return arrayCache.toList(SysDictData.class); } return null; } /** * 删除指定字典缓存 * * @param key 字典键 */ public static void removeDictCache(String key) { SpringUtils.getBean(RedisService.class).deleteObject(getCacheKey(key)); } /** * 清空字典缓存 */ public static void clearDictCache() { Collection<String> keys = SpringUtils.getBean(RedisService.class).keys(CacheConstants.SYS_DICT_KEY + "*"); SpringUtils.getBean(RedisService.class).deleteObject(keys); } /** * 设置cache key * * @param configKey 参数键 * @return 缓存键key */ public static String getCacheKey(String configKey) { return CacheConstants.SYS_DICT_KEY + configKey; } } ruoyi-modules/ruoyi-job/src/main/java/com/ruoyi/job/task/AfterSalesTask.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.job.task; import lombok.extern.log4j.Log4j2; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Set; @Component("ryTask") @Log4j2 public class AfterSalesTask { @Resource private RedisTemplate<String, String> redisTemplate; /** * 计算佣金(设置每分钟执行一次) */ public void afterSales() { long now = System.currentTimeMillis() / 1000; // 获取当前时间戳(秒) // 从延迟队列中获取需要处理的订单 Set<String> orderIds = redisTemplate.opsForZSet().rangeByScore("delay_queue:commission", 0, now); if (orderIds != null && !orderIds.isEmpty()) { // 处理完后移除已处理的订单 redisTemplate.opsForZSet().removeRangeByScore("delay_queue:commission", 0, now); } } /** * 佣金补偿(每天执行一次) * redis未配置持久化,为防止数据丢失,每天执行一次,将到期未处理的订单重新放入延迟队列中 */ public void afterSalesCompensation() { // 获取未处理的订单 } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -15,6 +15,7 @@ import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.model.LoginUser; import com.ruoyi.system.api.model.UserShop; import com.ruoyi.system.api.query.ChangeUserQuery; import com.ruoyi.system.domain.SysUserRole; import com.ruoyi.system.query.GetSysUserList; @@ -64,6 +65,9 @@ @Resource private ISysUserRoleService sysUserRoleService; @Resource private UserShopService userShopService; @@ -528,4 +532,39 @@ public SysUser getSysUserById(@RequestParam("userId") Long userId){ return userService.getById(userId); } /** * 保存门店员工管理后台账号 * @param user * @return */ @ResponseBody @PostMapping("/saveShopUser") public R saveShopUser(@RequestBody SysUser user){ Integer shopId = user.getObjectId(); SysUser one = userService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getPhonenumber, user.getPhonenumber()).eq(SysUser::getDelFlag, "0") .eq(SysUser::getStatus, "0").eq(SysUser::getRoleType, 2).eq(SysUser::getAppUserId, user.getAppUserId())); if(null == one){ user.setObjectId(null); user.setPassword(SecurityUtils.encryptPassword(user.getPassword())); userService.save(user); //添加用户角色数据 SysUserRole userRole = new SysUserRole(); userRole.setUserId(user.getUserId()); userRole.setRoleId(2L); userRoleService.save(userRole); }else{ user = one; } //添加门店关系数据 UserShop userShop = userShopService.getOne(new LambdaQueryWrapper<UserShop>().eq(UserShop::getShopId, shopId).eq(UserShop::getUserId, user.getAppUserId())); if(null == userShop){ userShop = new UserShop(); userShop.setUserId(user.getUserId().intValue()); userShop.setShopId(user.getObjectId()); userShopService.save(userShop); } return R.ok(); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserShopMapper.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.system.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.system.api.model.UserShop; /** * @author zhibing.pu * @Date 2024/12/2 9:38 */ public interface UserShopMapper extends BaseMapper<UserShop> { } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/UserShopService.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.system.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.system.api.model.UserShop; /** * @author zhibing.pu * @Date 2024/12/2 9:39 */ public interface UserShopService extends IService<UserShop> { } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDictDataServiceImpl.java
@@ -4,9 +4,9 @@ import com.ruoyi.system.api.domain.SysDictData; import com.ruoyi.system.mapper.SysDictDataMapper; import com.ruoyi.system.service.ISysDictDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** @@ -17,7 +17,7 @@ @Service public class SysDictDataServiceImpl implements ISysDictDataService { @Autowired @Resource private SysDictDataMapper dictDataMapper; /** ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserShopServiceImpl.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.system.api.model.UserShop; import com.ruoyi.system.mapper.UserShopMapper; import com.ruoyi.system.service.UserShopService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @Date 2024/12/2 9:39 */ @Service public class UserShopServiceImpl extends ServiceImpl<UserShopMapper, UserShop> implements UserShopService { } ruoyi-modules/ruoyi-system/src/main/resources/mapping/system/UserShopMapper.xml
New file @@ -0,0 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.UserShopMapper"> </mapper> ruoyi-service/ruoyi-account/pom.xml
@@ -121,6 +121,10 @@ <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> </dependency> </dependencies> <build> ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java
@@ -25,8 +25,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; @@ -48,7 +48,7 @@ @Api(tags = {"登录注册-小程序"}) @RestController @RequestMapping("/app-user") public class AppUserController { public class AppUserController extends BaseController { @@ -69,11 +69,18 @@ return appUserService.mobileLogin(mobileLogin); } @PostMapping("getAppUserById") AppUser getAppUserById(@RequestParam("id") Long id){ return appUserService.getById(id); } @ResponseBody @PostMapping("/appletLogin") @ApiOperation(value = "小程序一键登录") public AjaxResult<LoginVo> appletLogin(@RequestBody AppletLogin appletLogin){ public R<LoginVo> appletLogin(@RequestBody AppletLogin appletLogin){ return appUserService.appletLogin(appletLogin); } @@ -89,6 +96,10 @@ public R<Void> editAppUserById(@RequestParam("appUser") AppUser appUser){ appUserService.updateById(appUser); return R.ok(); @PostMapping("/mobileLogin") @ApiOperation(value = "手机号登录") public R<LoginVo> mobileLogin(@RequestBody MobileLogin mobileLogin){ return appUserService.mobileLogin(mobileLogin); } @ResponseBody @@ -111,7 +122,7 @@ @ResponseBody @PostMapping("/getSMSCode") @ApiOperation(value = "获取短信验证码") public AjaxResult getSMSCode(@RequestBody SMSCode smsCode){ public R getSMSCode(@RequestBody SMSCode smsCode){ return appUserService.getSMSCode(smsCode); } @@ -120,7 +131,7 @@ @ResponseBody @PostMapping("/registerAccount") @ApiOperation(value = "注册新账号") public AjaxResult<LoginVo> registerAccount(@RequestBody RegisterAccount registerAccount){ public R<LoginVo> registerAccount(@RequestBody RegisterAccount registerAccount){ return appUserService.registerAccount(registerAccount); } @@ -131,11 +142,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); } @@ -219,6 +230,15 @@ } /** * 获取用户的祖籍列表 */ @GetMapping("/getUserAncestorList") public R<List<AppUser>> getUserAncestorList(Long id){ List<AppUser> list = appUserService.getUserAncestorList(id,null); return R.ok(list); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserShopController.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.AppUserShop; import com.ruoyi.account.service.AppUserShopService; import com.ruoyi.common.core.domain.R; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * @author zhibing.pu * @Date 2024/12/2 9:21 */ @RestController @RequestMapping("/appUserShop") public class AppUserShopController { @Resource private AppUserShopService appUserShopService; @GetMapping("/shop/{userId}") public R<List<AppUserShop>> getAppUserShop(@PathVariable("userId") Long userId) { return R.ok(appUserShopService.list(new LambdaQueryWrapper<AppUserShop>() .eq(AppUserShop::getAppUserId,userId))); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/BalanceChangeRecordController.java
New file @@ -0,0 +1,37 @@ package com.ruoyi.account.controller; import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.account.service.BalanceChangeRecordService; import com.ruoyi.common.core.domain.R; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @author zhibing.pu * @Date 2024/12/2 15:36 */ @RestController @RequestMapping("/balanceChangeRecord") public class BalanceChangeRecordController { @Resource private BalanceChangeRecordService balanceChangeRecordService; /** * 保存账户流水记录 * @param balanceChangeRecord * @return */ @PostMapping("/saveBalanceChangeRecord") public R saveBalanceChangeRecord(@RequestBody BalanceChangeRecord balanceChangeRecord){ balanceChangeRecordService.save(balanceChangeRecord); return R.ok(); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserAddressController.java
@@ -1,6 +1,14 @@ package com.ruoyi.account.controller; 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; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.service.UserAddressService; @@ -25,14 +33,37 @@ public class UserAddressController { @Resource private TokenService tokenService; @Resource private UserAddressService userAddressService; @Resource private TokenService tokenService; /** * 获取用户默认地址 * @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); } @ResponseBody @PostMapping("/add") @ApiOperation(value = "添加", tags = {"小程序-个人中心首页-我的地址"}) public R add(@RequestBody UserAddress userAddress){ Long userId = tokenService.getLoginUserApplet().getUserId(); Long userId = tokenService.getLoginUserApplet().getUserid(); userAddress.setAppUserId(userId); userAddressService.save(userAddress); return R.ok(); @@ -56,7 +87,7 @@ @PostMapping("/set") @ApiOperation(value = "设为默认", tags = {"小程序-个人中心首页-我的地址"}) public R set(@RequestParam Integer id){ Long userId = tokenService.getLoginUserApplet().getUserId(); Long userId = tokenService.getLoginUserApplet().getUserid(); List<UserAddress> list = userAddressService.lambdaQuery().eq(UserAddress::getAppUserId, userId).list(); for (UserAddress userAddress : list) { userAddress.setIsDefault(0); @@ -69,5 +100,17 @@ return R.ok(); } /** * 根据id获取用户地址信息 * @param id * @return */ @ResponseBody @PostMapping("/getUserAddressById") public R<UserAddress> getUserAddressById(@RequestParam("id") Integer id){ UserAddress userAddress = userAddressService.getById(id); return R.ok(userAddress); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserCouponController.java
@@ -7,12 +7,21 @@ import com.ruoyi.account.api.model.UserCoupon; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCouponVo; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.UserCouponService; import com.ruoyi.account.service.UserPointService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.bean.BeanUtils; 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.*; import javax.annotation.Resource; import java.util.List; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.other.api.domain.Banner; import com.ruoyi.other.api.domain.CouponInfo; @@ -90,7 +99,7 @@ if (data==null){ return R.fail("当前优惠券不存在,请刷新后重试"); } if (data.getSendType()!=1&&byId.getLavePoint().compareTo(data.getNeedPoint())==-1){ if (data.getSendType()!=1&&byId.getLavePoint().compareTo(data.getNeedPoint().intValue())==-1){ return R.fail("当前积分不足,兑换失败"); } //检验发放时间 @@ -103,12 +112,12 @@ UserPoint userPoint = new UserPoint(); userPoint.setType(4); userPoint.setHistoricalPoint(byId.getLavePoint()); userPoint.setVariablePoint(data.getNeedPoint()); userPoint.setVariablePoint(data.getNeedPoint().intValue()); userPoint.setAppUserId(userid); userPoint.setObjectId(Long.valueOf(data.getId())); userPointService.save(userPoint); //扣除积分 byId.setLavePoint(byId.getLavePoint().subtract(userPoint.getVariablePoint())); byId.setLavePoint(byId.getLavePoint() - userPoint.getVariablePoint()); appUserService.updateById(byId); } //增加优惠券记录,根据时间类型设置开始结束时间 @@ -130,7 +139,32 @@ /** * 获取支付页面用户优惠券列表数据 * @param paymentUserCoupon * @return */ @ResponseBody @PostMapping("/getPaymentUserCoupon") public R<List<PaymentUserCouponVo>> getPaymentUserCoupon(@RequestBody PaymentUserCoupon paymentUserCoupon){ List<PaymentUserCouponVo> userCoupon = userCouponService.getUserCoupon(paymentUserCoupon.getUserId(), paymentUserCoupon.getType()); return R.ok(userCoupon); } /** * 根据用户优惠券id获取优惠券详情 * @param userCouponId * @return */ @ResponseBody @PostMapping("/getCouponInfo") public R<CouponInfoVo> getCouponInfo(@RequestParam("userCouponId") Long userCouponId){ UserCoupon userCoupon = userCouponService.getById(userCouponId); CouponInfo data = couponClient.detail(userCoupon.getCouponId()).getData(); CouponInfoVo couponInfoVo = new CouponInfoVo(); BeanUtils.copyProperties(data, couponInfoVo); return R.ok(couponInfoVo); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/UserPointController.java
@@ -1,23 +1,23 @@ package com.ruoyi.account.controller; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.service.UserPointService; import com.ruoyi.account.vo.UserPointDetailVO; import com.ruoyi.account.vo.UserPointVO; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.page.TableDataInfo; import com.ruoyi.common.security.utils.SecurityUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; 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.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; /** * <p> @@ -29,7 +29,7 @@ */ @RestController @RequestMapping("/user-point") @Api("用户积分") @Api(tags = "个人积分") public class UserPointController extends BaseController { @Resource private UserPointService userPointService; @@ -49,11 +49,13 @@ */ @GetMapping("/getUserPointDetail") @ApiOperation("获取变更明细") public R<UserPointDetailVO> getUserPointDetail(@ApiParam("指定日期") LocalDateTime date, public TableDataInfo getUserPointDetail(@ApiParam("指定日期") LocalDateTime date, @ApiParam("变动类型(1=消费积分,2=返佣积分,3=拉新人积分,4=兑换商品 " + "5 = 门店业绩积分 6 =门店返佣积分7=技师业绩积分8 =转赠积分 9 =做工积分 " + "10 =注册积分)") Integer type){ return R.ok(); startPage(); List<UserPointDetailVO> list = userPointService.getUserPointDetail(SecurityUtils.getUserId(), date, type); return getDataTable(list); } /** @@ -64,5 +66,17 @@ public R<Void> transferPoint(@ApiParam("积分") BigDecimal point, @ApiParam("手机号") Long phone){ return R.ok(); } /** * 保存积分流水记录 * @param userPoint * @return */ @PostMapping("/saveUserPoint") public R saveUserPoint(@RequestBody UserPoint userPoint){ userPointService.save(userPoint); return R.ok(); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WalletController.java
@@ -1,7 +1,10 @@ package com.ruoyi.account.controller; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.BalanceChangeRecordService; import com.ruoyi.account.service.WalletService; import com.ruoyi.account.vo.WalletVO; @@ -9,17 +12,30 @@ import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.other.api.feignClient.OrderClient; import com.ruoyi.system.api.model.LoginUser; import feignClient.RemoteOrderClient; import feignClient.RemoteOrderGoodsClient; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import model.Order; import model.OrderGood; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Api("钱包") @Api(tags = "小程序-个人中心-我的钱包") @RestController @RequestMapping("wallet") public class WalletController extends BaseController { @@ -29,12 +45,16 @@ private TokenService tokenService; @Resource private WalletService walletService; @Resource private RemoteOrderGoodsClient remoteOrderGoodsClient; @Resource private AppUserService appUserService; /** * 钱包详情 */ @GetMapping("detail") @ApiOperation(value = "钱包详情", notes = "钱包详情", tags = {"小程序-个人中心-我的钱包-钱包详情"}) @ApiOperation(value = "钱包详情", notes = "钱包详情") public R<WalletVO> detail() { LoginUser loginUserApplet = tokenService.getLoginUserApplet(); WalletVO walletVO = walletService.getWalletByUserId(loginUserApplet.getUserid()); @@ -44,12 +64,42 @@ /** * 变更明细 */ @ApiOperation(value = "变更明细", notes = "变更明细", tags = {"小程序-个人中心-我的钱包-变更记录"}) @ApiOperation(value = "变更明细", notes = "变更明细") @GetMapping("change") public R<List<BalanceChangeRecord>> change() { public R<List<BalanceChangeRecord>> change(@ApiParam(value = "变更类型") @RequestParam(required = false) Integer changeType, @ApiParam(value = "创建时间") @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM") LocalDate createTime) { Long userId = SecurityUtils.getUserId(); return R.ok(balanceChangeRecordService.list(new LambdaQueryWrapper<BalanceChangeRecord>() .eq(BalanceChangeRecord::getAppUserId, userId))); LocalDateTime localDateTime = null; if (createTime != null) { LocalTime specificTime = LocalTime.of(0, 0); localDateTime = createTime.atTime(specificTime); } List<BalanceChangeRecord> list = balanceChangeRecordService.list(new LambdaQueryWrapper<BalanceChangeRecord>() .eq(changeType != null, BalanceChangeRecord::getChangeType, changeType) .eq(createTime != null, BalanceChangeRecord::getCreateTime, localDateTime) .eq(BalanceChangeRecord::getAppUserId, userId)); List<Long> orderIds = list.stream().map(BalanceChangeRecord::getOrderId).collect(Collectors.toList()); R<List<Order>> r = remoteOrderGoodsClient.getOrderListByIds(orderIds); if (!R.isSuccess(r)){ return R.fail(r.getMsg()); } List<Order> orderList = r.getData(); list.forEach(bc -> { orderList.stream().filter(o -> o.getId().equals(bc.getOrderId())).findFirst().ifPresent(o -> { Long appUserId = o.getAppUserId(); AppUser appUser = appUserService.getById(appUserId); bc.setUserName(appUser.getName()); bc.setAmount(o.getPaymentAmount()); }); }); return R.ok(list); } // /** ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/enums/PointChangeType.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.account.enums; import lombok.Getter; @Getter public enum PointChangeType { CONSUME(1, "消费积分"), COMMISSION_RETURN(2, "返佣积分"), NEW_USER_REFERRAL(3, "拉新人积分"), EXCHANGE_GOODS(4, "兑换商品"), STORE_PERFORMANCE(5, "门店业绩积分"), STORE_COMMISSION_RETURN(6, "门店返佣积分"), TECHNICIAN_PERFORMANCE(7, "技师业绩积分"), TRANSFER_POINTS(8, "转赠积分"), WORK_PERFORMANCE(9, "做工积分"), REGISTRATION(10, "注册积分"); private final int code; private final String description; PointChangeType(int code, String description) { this.code = code; this.description = description; } public static PointChangeType fromCode(int code) { for (PointChangeType type : values()) { if (type.getCode() == code) { return type; } } throw new IllegalArgumentException("Invalid code: " + code); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/enums/WithdrawalAuditStatus.java
File was renamed from ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/WithdrawalAuditStatus.java @@ -1,4 +1,4 @@ package com.ruoyi.account; package com.ruoyi.account.enums; import lombok.Getter; ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/AppUserShopMapper.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.account.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.account.api.model.AppUserShop; /** * @author zhibing.pu * @Date 2024/12/2 9:20 */ public interface AppUserShopMapper extends BaseMapper<AppUserShop> { } 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); /** @@ -56,4 +57,9 @@ * @return */ List<NearbyReferrerVo> getNearbyReferrer(NearbyReferrer nearbyReferrer); /** * 获取用户的祖籍列表 */ List<AppUser> getUserAncestorList(Long id,List<AppUser> list); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/AppUserShopService.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.account.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.AppUserShop; /** * @author zhibing.pu * @Date 2024/12/2 9:20 */ public interface AppUserShopService extends IService<AppUserShop> { } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppUserService.java
File was deleted ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserCouponService.java
@@ -2,6 +2,12 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.UserCoupon; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCouponVo; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.util.List; /** * <p> @@ -13,4 +19,10 @@ */ public interface UserCouponService extends IService<UserCoupon> { /** * 获取用户支付页面的优惠券列表 * @param userId * @return */ List<PaymentUserCouponVo> getUserCoupon(Long userId, Integer type); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/UserPointService.java
@@ -2,7 +2,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.vo.UserPointDetailVO; import com.ruoyi.account.vo.UserPointVO; import java.time.LocalDateTime; import java.util.List; /** * <p> @@ -15,4 +19,7 @@ public interface UserPointService extends IService<UserPoint> { UserPointVO getUserPoint(Long userId); List<UserPointDetailVO> getUserPointDetail(Long userId, LocalDateTime date, Integer type); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserServiceImpl.java
@@ -2,23 +2,29 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.AppUserShop; import com.ruoyi.account.mapper.AppUserMapper; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.service.AppUserService; import com.ruoyi.account.service.AppUserShopService; 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; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.feignClient.ShopClient; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import com.ruoyi.system.api.model.LoginUser; import org.checkerframework.checker.units.qual.A; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * <p> @@ -40,6 +46,20 @@ @Resource private RedisService redisService; @Resource private ShopClient shopClient; @Resource private AppUserShopService appUserShopService; @Resource private SysUserClient sysUserClient; /** * 小程序一键登录 @@ -47,12 +67,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 +80,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 +97,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,23 +107,23 @@ * @return */ @Override public AjaxResult<LoginVo> mobileLogin(MobileLogin mobileLogin) { //校验验证码 String code = redisService.getCacheObject(mobileLogin.getPhone()); if(null == code || !code.equals(mobileLogin.getCode())){ return AjaxResult.error("验证码错误"); } public R<LoginVo> mobileLogin(MobileLogin mobileLogin) { //校验验证码 TODO 待完善 // String code = redisService.getCacheObject(mobileLogin.getPhone()); // if(null == code || !code.equals(mobileLogin.getCode())){ // return R.fail("验证码错误"); // } //查询用户是否注册,没有注册则跳转到注册页面 AppUser appUser = this.getOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, mobileLogin.getPhone()).ne(AppUser::getStatus, 3).eq(AppUser::getDelFlag, 0)); 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 +136,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 +146,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 +154,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 +176,7 @@ code += Double.valueOf(Math.random() * 10).intValue(); } //发送短信 todo 待对接短信 return AjaxResult.success(); return R.ok(); } @@ -166,33 +186,35 @@ * @return */ @Override public AjaxResult<LoginVo> registerAccount(RegisterAccount registerAccount) { public R<LoginVo> registerAccount(RegisterAccount registerAccount) { // TODO 待完善 //校验验证码 String code = redisService.getCacheObject(registerAccount.getPhone()); if(null == code || !code.equals(registerAccount.getCode())){ return AjaxResult.error("验证码错误"); } // String code = redisService.getCacheObject(registerAccount.getPhone()); // if(null == code || !code.equals(registerAccount.getCode())){ // 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()); } 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("此微信号已注册,请直接登录!"); } // Map<String, Object> map = weChatUtil.code2Session(registerAccount.getJscode()); // Integer errcode = Integer.valueOf(map.get("errcode").toString()); // if(0 != errcode){ // 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 R.fail("此微信号已注册,请直接登录!"); // } AppUser appUser = null; 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(); appUser.setName(registerAccount.getName()); appUser.setPhone(registerAccount.getPhone()); appUser.setWxOpenid(openid); // appUser.setWxOpenid(openid); //注册默认为普通会员 appUser.setVipId(1); appUser.setStatus(1); @@ -207,22 +229,23 @@ AppUser appUser2 = this.getById(registerAccount.getPromoter()); appUser.setInviteUserId(registerAccount.getPromoter()); appUser.setShopId(appUser2.getShopId()); appUser.setPartPoint(BigDecimal.ZERO); appUser.setPartGrowPoint(BigDecimal.ZERO); appUser.setShopPoint(BigDecimal.ZERO); appUser.setSharePoint(BigDecimal.ZERO); appUser.setPartPoint(0); appUser.setPartGrowPoint(0); appUser.setShopPoint(0); appUser.setSharePoint(0); appUser.setShopAmount(BigDecimal.ZERO); appUser.setWithdrawableAmount(BigDecimal.ZERO); appUser.setWithdrawnAmount(BigDecimal.ZERO); appUser.setTotalRechargeAmount(BigDecimal.ZERO); appUser.setTotalRedPacketAmount(BigDecimal.ZERO); appUser.setTotalDistributionAmount(BigDecimal.ZERO); appUser.setLavePoint(BigDecimal.ZERO); appUser.setBalance(BigDecimal.ZERO); appUser.setLavePoint(0); //根据平台的配置未达标,则标注为可修改推广人 appUser.setChangePromoter(0); appUser.setLongitude(registerAccount.getLongitude()); appUser.setLatitude(registerAccount.getLatitude()); //调用地图获取省市区数据 //调用地图获取省市区数据 TODO 待完善 // appUser.setProvince(); // appUser.setProvinceCode(); // appUser.setCity(); @@ -230,6 +253,33 @@ // appUser.setDistrict(); // appUser.setDistrictCode(); this.save(appUser); //查询当前注册的手机号是都和门店管理员手机号相同 Shop shop = shopClient.getShopByPhone(registerAccount.getPhone()).getData(); if(null != shop){ //添加门店用户关系数据 AppUserShop appUserShop = appUserShopService.getOne(new LambdaQueryWrapper<AppUserShop>().eq(AppUserShop::getAppUserId, appUser.getId()).eq(AppUserShop::getShopId, shop.getId())); if(null == appUserShop){ appUserShop = new AppUserShop(); appUserShop.setShopId(shop.getId()); appUserShop.setAppUserId(appUser.getId()); appUserShopService.save(appUserShop); //添加管理后台账号 SysUser user = new SysUser(); user.setDeptId(1L); user.setUserName(appUser.getName()); user.setNickName(appUser.getName()); user.setPhonenumber(appUser.getPhone()); user.setAvatar(appUser.getAvatar()); user.setStatus("0"); user.setDelFlag("0"); user.setRoleType(2); user.setObjectId(shop.getId()); user.setAppUserId(appUser.getId()); sysUserClient.saveShopUser(user); } } } LoginVo loginVo = new LoginVo(); loginVo.setSkipPage(1); @@ -242,7 +292,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); } @@ -257,11 +307,11 @@ } public AppUser getTopAppUser(List<AppUser> list, Long id){ AppUser appUser = list.stream().filter(s -> s.getInviteUserId().equals(id)).findFirst().get(); AppUser appUser = list.stream().filter(s -> s.getId().equals(id)).findFirst().get(); if(null == appUser.getInviteUserId()){ return appUser; } return getTopAppUser(list, appUser.getId()); return getTopAppUser(list, appUser.getInviteUserId()); } @@ -275,8 +325,42 @@ //使用地图获取省市区数据 String longitude = nearbyReferrer.getLongitude(); String latitude = nearbyReferrer.getLatitude(); String cityCode = ""; String cityCode = ""; // TODO 待完善 List<NearbyReferrerVo> list = this.baseMapper.getNearbyReferrer(cityCode, nearbyReferrer); return list; } @Override public List<AppUser> getUserAncestorList(Long id, List<AppUser> list) { if (list == null) { list = new ArrayList<>(); } Set<Long> visitedIds = new HashSet<>(); Long currentId = id; while (currentId != null && !visitedIds.contains(currentId)) { AppUser appUser = getById(currentId); if (appUser == null) { break; // 如果用户不存在,终止循环 } Long inviteUserId = appUser.getInviteUserId(); if (inviteUserId != null) { AppUser invitedUser = getById(inviteUserId); if (invitedUser != null) { list.add(invitedUser); visitedIds.add(currentId); currentId = inviteUserId; } else { break; // 如果邀请用户不存在,终止循环 } } else { break; // 如果没有邀请用户,终止循环 } } return list; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/AppUserShopServiceImpl.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.AppUserShop; import com.ruoyi.account.mapper.AppUserShopMapper; import com.ruoyi.account.service.AppUserShopService; import org.springframework.stereotype.Service; /** * @author zhibing.pu * @Date 2024/12/2 9:21 */ @Service public class AppUserShopServiceImpl extends ServiceImpl<AppUserShopMapper, AppUserShop> implements AppUserShopService { } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserCouponServiceImpl.java
@@ -1,10 +1,24 @@ package com.ruoyi.account.service.impl; import com.alibaba.fastjson2.JSON; 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.api.vo.PaymentUserCouponVo; 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.Instant; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -17,4 +31,55 @@ @Service public class UserCouponServiceImpl extends ServiceImpl<UserCouponMapper, UserCoupon> implements UserCouponService { @Resource private CouponInfoClient couponInfoClient; /** * 获取支付页面的优惠券列表数据 * @param userId * @param orderMoney * @return */ @Override public List<PaymentUserCouponVo> getUserCoupon(Long userId, 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<PaymentUserCouponVo> infoVoList = new ArrayList<>(); for (UserCoupon userCoupon : list) { CouponInfo couponInfo = couponInfoList.stream().filter(s -> s.getId().equals(userCoupon.getCouponId())).findFirst().get(); //排除商品券(商品券线下领取) if(4 == couponInfo.getCouponType()){ continue; } PaymentUserCouponVo couponInfoVo = new PaymentUserCouponVo(); 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)); String forGoodIds = couponInfo.getForGoodIds(); Integer instant = JSON.parseArray(forGoodIds).getInteger(0); if(-1 == instant){ couponInfoVo.setForGoodIds(null); }else{ couponInfoVo.setForGoodIds(JSON.parseArray(forGoodIds, Integer.class)); } couponInfoVo.setAvailable(false); infoVoList.add(couponInfoVo); } return infoVoList; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/UserPointServiceImpl.java
@@ -1,11 +1,25 @@ package com.ruoyi.account.service.impl; 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.mapper.UserPointMapper; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.enums.PointChangeType; import com.ruoyi.account.mapper.UserPointMapper; import com.ruoyi.account.service.UserPointService; import com.ruoyi.account.vo.UserPointDetailVO; import com.ruoyi.account.vo.UserPointVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * <p> @@ -17,10 +31,42 @@ */ @Service public class UserPointServiceImpl extends ServiceImpl<UserPointMapper, UserPoint> implements UserPointService { @Resource private AppUserClient appUserClient; @Override public UserPointVO getUserPoint(Long userId) { // TODO 待实现 return null; AppUser appUser = appUserClient.getAppUserById(userId); List<UserPoint> userPointList = list(new LambdaQueryWrapper<UserPoint>() .eq(UserPoint::getAppUserId, userId)); Map<Integer, Integer> userBalanceMap = userPointList.stream() .collect(Collectors.toMap(UserPoint::getType, UserPoint::getBalance)); Integer lavePoint = appUser.getLavePoint(); UserPointVO userPointVO = new UserPointVO(); userPointVO.setTotalPoint(lavePoint); userPointVO.setShopPoint(userBalanceMap.get(PointChangeType.CONSUME.getCode())); userPointVO.setSharePoint(userBalanceMap.get(PointChangeType.COMMISSION_RETURN.getCode())); userPointVO.setPullNewPoint(userBalanceMap.get(PointChangeType.NEW_USER_REFERRAL.getCode())); userPointVO.setShopAchievementPoint(userBalanceMap.get(PointChangeType.STORE_PERFORMANCE.getCode())); userPointVO.setShopSharePoint(userBalanceMap.get(PointChangeType.STORE_COMMISSION_RETURN.getCode())); return userPointVO; } @Override public List<UserPointDetailVO> getUserPointDetail(Long userId, LocalDateTime date, Integer type) { List<UserPoint> userPointList = list(new LambdaQueryWrapper<UserPoint>() .eq(UserPoint::getAppUserId, userId)); if (CollectionUtil.isNotEmpty(userPointList)) { return userPointList.stream().map(p -> { UserPointDetailVO userPointDetailVO = new UserPointDetailVO(); userPointDetailVO.setType(p.getType()); userPointDetailVO.setVariablePoint(p.getVariablePoint()); userPointDetailVO.setCreateTime(p.getCreateTime()); return userPointDetailVO; }).collect(Collectors.toList()); } return Collections.emptyList(); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/WalletServiceImpl.java
@@ -1,7 +1,7 @@ package com.ruoyi.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.WithdrawalAuditStatus; import com.ruoyi.account.enums.WithdrawalAuditStatus; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.WithdrawalRequests; import com.ruoyi.account.service.AppUserService; @@ -34,9 +34,6 @@ } Integer vipId = appUser.getVipId(); R<VipSetting> r = remoteVipSettingClient.getVipSettingById(vipId); if (r == null || r.getCode() != R.SUCCESS) { throw new RuntimeException("获取会员设置信息失败"); } VipSetting data = r.getData(); if (data == null) { throw new RuntimeException("会员设置信息为空"); 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-account/src/main/java/com/ruoyi/account/vo/UserPointDetailVO.java
@@ -16,7 +16,7 @@ private Integer type; @ApiModelProperty(value = "变动金额") private BigDecimal variablePoint; private Integer variablePoint; @ApiModelProperty(value = "变动时间") private LocalDateTime createTime; ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/UserPointVO.java
@@ -1,11 +1,8 @@ package com.ruoyi.account.vo; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value="UserPoint对象", description="") @@ -15,17 +12,17 @@ private Integer totalPoint; @ApiModelProperty(value = "消费积分数") private BigDecimal shopPoint; private Integer shopPoint; @ApiModelProperty(value = "返佣积分数") private BigDecimal sharePoint; private Integer sharePoint; @ApiModelProperty(value = "拉新积分") private BigDecimal pullNewPoint; private Integer pullNewPoint; @ApiModelProperty(value = "门店业绩积分") private BigDecimal shopAchievementPoint; private Integer shopAchievementPoint; @ApiModelProperty(value = "门店返佣积分") private BigDecimal shopSharePoint; private Integer shopSharePoint; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/vo/WalletVO.java
@@ -10,6 +10,9 @@ @ApiModel(value="钱包对象", description="") public class WalletVO { @ApiModelProperty(value = "账户余额") private BigDecimal balance; @ApiModelProperty(value = "可提现金额") private BigDecimal withdrawalAmount; ruoyi-service/ruoyi-account/src/main/resources/mapper/account/UserShopMapper.xml
New file @@ -0,0 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.account.mapper.AppUserShopMapper"> </mapper> ruoyi-service/ruoyi-order/pom.xml
@@ -124,7 +124,7 @@ <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> <version>3.5.4</version> </dependency> <dependency> @@ -145,6 +145,11 @@ </exclusions> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> </dependency> </dependencies> <build> ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/OrderController.java
@@ -1,20 +1,19 @@ package com.ruoyi.order.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.vo.OrderDetailVO; import org.springframework.web.bind.annotation.*; import vo.OrderDetailVO; import com.ruoyi.order.vo.OrderVO; import com.ruoyi.system.api.model.LoginUser; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import model.Order; import javax.annotation.Resource; import java.util.List; @@ -51,6 +50,14 @@ } /** * 通过订单ids获取订单列表 */ @PostMapping("/getOrderListByIds") public R<List<Order>> getOrderListByIds(@RequestBody List<Long> ids){ return R.ok(orderService.listByIds(ids)); } /** * 订单详情 */ @ApiOperation(value = "订单详情", tags = {"小程序-订单详情"}) @@ -70,8 +77,11 @@ @ApiImplicitParam(value = "分享id", name = "shareId", required = true, dataType = "int", paramType="query"), }) @GetMapping("/check/{orderNumber}/{shopId}") public R<Boolean> check(@PathVariable("orderNumber") String orderNumber, @PathVariable("shopId") Long shopId){ return R.ok(orderService.check(orderNumber, shopId)); public R<Boolean> check(@PathVariable("orderNumber") String orderNumber, @PathVariable("shopId") Integer shopId){ LoginUser loginUserApplet = tokenService.getLoginUserApplet(); Order order = orderService.getOne(new LambdaQueryWrapper<Order>() .eq(Order::getOrderNumber, orderNumber)); return R.ok(orderService.check(order, shopId, loginUserApplet.getUserid())); } /** 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/enums/OrderStatus.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.order.enums; import lombok.Getter; @Getter public enum OrderStatus { PENDING_SHIPMENT(1, "待发货"), PENDING_RECEIPT(2, "待收货"), PENDING_USE(3, "待使用"), COMPLETED(4, "已完成"), CANCELLED(5, "已取消"), REFUNDED(6, "已退款"), AFTER_SALE(7, "售后中"); private final int code; private final String description; OrderStatus(int code, String description) { this.code = code; this.description = description; } // 根据代码获取对应的OrderStatus public static OrderStatus fromCode(int code) { for (OrderStatus status : values()) { if (status.getCode() == code) { return status; } } throw new IllegalArgumentException("Unknown order status code: " + code); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/enums/OrderType.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.order.enums; import lombok.Getter; @Getter public enum OrderType { SERVICE(1, "服务单"), GOOD(2, "商品单"); private final int code; private final String description; OrderType(int code, String description) { this.code = code; this.description = description; } public static OrderType fromCode(int code) { for (OrderType type : OrderType.values()) { if (type.getCode() == code) { return type; } } return null; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/CommissionService.java
New file @@ -0,0 +1,12 @@ package com.ruoyi.order.service; import java.time.LocalDateTime; import java.util.List; public interface CommissionService { // 计算佣金 void calculationCommission(List<Long> orderIds); void addToCommissionDelayQueue(Long orderId, LocalDateTime afterSalesDeadline); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/OrderService.java
@@ -1,7 +1,7 @@ package com.ruoyi.order.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.order.vo.OrderDetailVO; import vo.OrderDetailVO; import com.ruoyi.order.vo.OrderVO; import model.Order; @@ -20,5 +20,9 @@ OrderDetailVO getOrderDetail(Long orderId); boolean check(String orderNumber, Long shopId); boolean check(Order order, Integer shopId, Long userId); void writeOff(String code,Integer shopId); void commission(Long orderId); } 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/CommissionServiceImpl.java
New file @@ -0,0 +1,111 @@ package com.ruoyi.order.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.service.CommissionService; import com.ruoyi.order.service.OrderGoodService; import com.ruoyi.order.service.OrderService; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.feignClient.ShopClient; import model.Order; import model.OrderGood; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.ZoneId; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Service public class CommissionServiceImpl implements CommissionService { @Resource private OrderService orderService; @Resource private OrderGoodService orderGoodService; @Resource private AppUserClient appUserClient; @Resource private ShopClient shopClient; @Resource private RedisTemplate<String, String> redisTemplate; /** * 返佣延迟队列(redis有序集合) * * @param orderId 订单ID * @param afterSalesDeadline 售后截止日期(计算日期) */ @Override public void addToCommissionDelayQueue(Long orderId, LocalDateTime afterSalesDeadline) { // 获取订单售后截止日期时间戳(秒) long deadlineTimestamp = afterSalesDeadline.atZone(ZoneId.systemDefault()).toEpochSecond(); redisTemplate.opsForZSet().add("delay_queue:commission", orderId.toString(), deadlineTimestamp); } @Override public void calculationCommission(List<Long> orderIds) { List<OrderGood> orderGoods = orderGoodService.list(new LambdaQueryWrapper<OrderGood>() .in(OrderGood::getOrderId, orderIds)); Map<Long, List<OrderGood>> ogMap = orderGoods.stream().collect(Collectors.groupingBy(OrderGood::getOrderId)); for (Map.Entry<Long, List<OrderGood>> entry : ogMap.entrySet()) { Long k = entry.getKey(); List<OrderGood> v = entry.getValue(); Order order = orderService.getById(k); if (order.getIsCommission() == 1) { continue; } R<Shop> r = shopClient.getShopById(order.getShopId()); if (!R.isSuccess(r)) { throw new RuntimeException("获取门店信息失败"); } Shop shop = r.getData(); if (shop == null) { throw new RuntimeException("获取门店信息失败"); } Long appUserId = order.getAppUserId(); AppUser appUser = appUserClient.getAppUserById(appUserId); if (appUser == null) { throw new RuntimeException("获取用户信息失败"); } Long inviteUserId = appUser.getInviteUserId(); AppUser inviteUser = appUserClient.getAppUserById(inviteUserId); for (OrderGood og : v) {// 累计分销金额 // 上级分销金额 if (inviteUser != null){ BigDecimal superiorSubcommission = og.getSuperiorSubcommission(); BigDecimal totalDistributionAmount = inviteUser.getTotalDistributionAmount(); totalDistributionAmount = totalDistributionAmount.add(superiorSubcommission); // Integer superiorType = og.getSuperiorType(); Integer sharePoint = inviteUser.getSharePoint(); if (superiorType == 1) { Integer superiorRebatePoints = og.getSuperiorRebatePoints(); sharePoint = sharePoint + superiorRebatePoints; } else if (superiorType == 2) { } else { continue; } inviteUser.setTotalDistributionAmount(totalDistributionAmount); inviteUser.setSharePoint(sharePoint); } // 门店分销金额 og.getBoundShopCharges(); } } } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/OrderServiceImpl.java
@@ -3,25 +3,36 @@ 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.model.AppUserShop; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.enums.OrderStatus; import com.ruoyi.order.enums.OrderType; import com.ruoyi.order.mapper.OrderGoodMapper; import com.ruoyi.order.mapper.OrderMapper; import com.ruoyi.order.service.OrderService; import com.ruoyi.order.vo.OrderDetailVO; import com.ruoyi.order.vo.OrderGoodsVO; import vo.OrderDetailVO; import vo.OrderGoodsVO; import com.ruoyi.order.vo.OrderVO; import com.ruoyi.other.api.domain.CouponInfo; import com.ruoyi.other.api.domain.Goods; import com.ruoyi.other.api.domain.OrderActivityInfo; import com.ruoyi.other.api.domain.Technician; import com.ruoyi.other.api.feignClient.TechnicianClient; import com.ruoyi.system.api.model.LoginUser; import model.Order; import model.OrderGood; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -35,7 +46,15 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService { @Resource private OrderMapper orderMapper; @Resource private OrderGoodMapper orderGoodMapper; @Resource private AppUserClient appUserClient; @Resource private TokenService tokenService; @Resource private TechnicianClient technicianClient; @Override public List<OrderVO> selectOrderListByUserId(Integer status, Long userId) { @@ -115,10 +134,62 @@ } @Override public boolean check(String orderNumber, Long shopId) { Order order = getOne(new LambdaQueryWrapper<Order>() .eq(Order::getOrderNumber, orderNumber) .eq(Order::getShopId, shopId)); return order != null; public boolean check(Order order, Integer shopId, Long userId) { R<List<AppUserShop>> r = appUserClient.getAppUserShop(userId); if (r.getCode() != R.SUCCESS){ throw new ServiceException("获取用户门店信息失败"); } List<AppUserShop> appUserShopList = r.getData(); if (appUserShopList == null || appUserShopList.isEmpty()){ return false; } // 判断用户是否拥有该门店 List<AppUserShop> userShopList = appUserShopList.stream() .filter(appUserShop -> appUserShop.getShopId().equals(shopId)) .collect(Collectors.toList()); if (userShopList.isEmpty()){ return false; } // 判断订单是否属于该门店 if (order == null){ throw new ServiceException("订单不存在"); } return order.getShopId().equals(shopId); } @Override @Transactional(rollbackFor = Exception.class) public void writeOff(String code,Integer shopId) { LoginUser loginUserApplet = tokenService.getLoginUserApplet(); Order order = orderMapper.selectOne(new LambdaQueryWrapper<Order>() .eq(Order::getOrderNumber, code)); boolean check = check(order, shopId, loginUserApplet.getUserid()); if (!check){ throw new ServiceException("订单不存在"); } order.setOrderStatus(OrderStatus.COMPLETED.getCode()); orderMapper.updateById(order); Integer orderType = order.getOrderType(); if (orderType.equals(OrderType.SERVICE.getCode())){ R<Technician> shopdetail = technicianClient.shopdetail(order.getTechnicianId()); if (shopdetail.getCode() != R.SUCCESS){ throw new ServiceException("获取技师信息失败"); } Technician technician = shopdetail.getData(); R<Void> r = technicianClient.updateStatus(2, technician.getId()); if (r.getCode() != R.SUCCESS){ throw new ServiceException("修改技师状态失败"); } } } @Override public void commission(Long orderId) { } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/ShoppingCartServiceImpl.java
@@ -1,28 +1,45 @@ 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.annotation.TableField; 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.*; import com.ruoyi.account.api.model.AppUser; import com.ruoyi.account.api.model.BalanceChangeRecord; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.api.model.UserPoint; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCoupon; import com.ruoyi.account.api.vo.PaymentUserCouponVo; 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.GetGoodsShopByGoodsIds; 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.util.ArrayList; import java.util.List; import java.util.Map; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @Service @@ -52,6 +69,36 @@ @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; @Resource private UserPointClient userPointClient; @Resource private BalanceChangeRecordClient balanceChangeRecordClient; @@ -72,47 +119,11 @@ if(null == data){ throw new RuntimeException("根据类型(1=服务商品,2=单品商品)获取商品数据失败"); } List<Long> goodsIds = data.stream().map(Goods::getId).collect(Collectors.toList()); List<Integer> 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 +168,60 @@ }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()); price.setSuperiorSubcommission(goodsVip.getSuperiorSubcommission()); price.setSuperiorRebatePoints(goodsVip.getSuperiorRebatePoints()); price.setSuperiorType(goodsVip.getSuperiorType()); price.setServuceShopCharges(goodsVip.getServuceShopCharges()); price.setServuceShopPoints(goodsVip.getServuceShopPoints()); price.setTechnicianPoints(goodsVip.getTechnicianPoints()); price.setBoundShopCharges(goodsVip.getBoundShopCharges()); price.setBoundShopPoints(goodsVip.getBoundShopPoints()); price.setBoundShopSuperiorsCharges(goodsVip.getBoundShopSuperiorsCharges()); price.setBoundShopSuperiorsPoints(goodsVip.getBoundShopSuperiorsPoints()); } }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()); price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); price.setSuperiorType(goodsArea.getSuperiorType()); price.setServuceShopCharges(goodsArea.getServuceShopCharges()); price.setServuceShopPoints(goodsArea.getServuceShopPoints()); price.setTechnicianPoints(goodsArea.getTechnicianPoints()); price.setBoundShopCharges(goodsArea.getBoundShopCharges()); price.setBoundShopPoints(goodsArea.getBoundShopPoints()); price.setBoundShopSuperiorsCharges(goodsArea.getBoundShopSuperiorsCharges()); price.setBoundShopSuperiorsPoints(goodsArea.getBoundShopSuperiorsPoints()); } }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()); price.setSuperiorSubcommission(goodsArea.getSuperiorSubcommission()); price.setSuperiorRebatePoints(goodsArea.getSuperiorRebatePoints()); price.setSuperiorType(goodsArea.getSuperiorType()); price.setServuceShopCharges(goodsArea.getServuceShopCharges()); price.setServuceShopPoints(goodsArea.getServuceShopPoints()); price.setTechnicianPoints(goodsArea.getTechnicianPoints()); price.setBoundShopCharges(goodsArea.getBoundShopCharges()); price.setBoundShopPoints(goodsArea.getBoundShopPoints()); price.setBoundShopSuperiorsCharges(goodsArea.getBoundShopSuperiorsCharges()); price.setBoundShopSuperiorsPoints(goodsArea.getBoundShopSuperiorsPoints()); } }else{ //构建价格数据 @@ -178,7 +235,20 @@ 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()); price.setSuperiorSubcommission(goodsSeckill.getSuperiorSubcommission()); price.setSuperiorRebatePoints(goodsSeckill.getSuperiorRebatePoints()); price.setSuperiorType(goodsSeckill.getSuperiorType()); price.setServuceShopCharges(goodsSeckill.getServuceShopCharges()); price.setServuceShopPoints(goodsSeckill.getServuceShopPoints()); price.setTechnicianPoints(goodsSeckill.getTechnicianPoints()); price.setBoundShopCharges(goodsSeckill.getBoundShopCharges()); price.setBoundShopPoints(goodsSeckill.getBoundShopPoints()); price.setBoundShopSuperiorsCharges(goodsSeckill.getBoundShopSuperiorsCharges()); price.setBoundShopSuperiorsPoints(goodsSeckill.getBoundShopSuperiorsPoints()); } return price; } @@ -198,6 +268,58 @@ * 获取结束时间 */ private Long endTime; /** * 现金支付 */ private Boolean cashPayment; /** * 积分支付 */ private Boolean pointPayment; /** * 可获得消费积分 */ private Integer earnSpendingPoints; /** * 上级获得分佣金额 */ private BigDecimal superiorSubcommission; /** * 上级获得返佣积分 */ private Integer superiorRebatePoints; /** * 获取返佣积分上级类型(1=直推上级,2=直帮上级) */ private Integer superiorType; /** * 核销门店可获得服务费 */ private BigDecimal servuceShopCharges; /** * 核销门店可获得服务积分 */ private Integer servuceShopPoints; /** * 技师可获得服务积分 */ private Integer technicianPoints; /** * 绑定门店可获得分佣金额 */ private BigDecimal boundShopCharges; /** * 绑定门店可获得返佣积分 */ private Integer boundShopPoints; /** * 绑定门店上级门店可获得分佣金额 */ private BigDecimal boundShopSuperiorsCharges; /** * 绑定门店上级门店可获得返佣积分 */ private Integer boundShopSuperiorsPoints; } @@ -215,15 +337,639 @@ * @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()); if(confirmOrder.getPaymentType() == 1){ List<PaymentUserCouponVo> data = userCouponClient.getPaymentUserCoupon(paymentUserCoupon).getData(); for (PaymentUserCouponVo couponInfo : data) { List<Integer> forGoodIds = couponInfo.getForGoodIds(); //全部商品适用 if(null == forGoodIds){ //满减券 if(1 == couponInfo.getCouponType() && orderMoney.compareTo(couponInfo.getConditionAmount()) >= 0){ couponInfo.setAvailable(true); } //代金券和折扣券 if(2 == couponInfo.getCouponType() || 3 == couponInfo.getCouponType()){ couponInfo.setAvailable(true); } }else{ //部分商品适用 BigDecimal goodsMoney = BigDecimal.ZERO; for (MyShoppingCartVo myShoppingCartVo : goodsList) { Integer goodsId = myShoppingCartVo.getGoodsId(); BigDecimal cash = myShoppingCartVo.getCash(); if(forGoodIds.contains(goodsId)){ goodsMoney = goodsMoney.add(cash); } } //满减 if(1 == couponInfo.getCouponType() && couponInfo.getConditionAmount().compareTo(goodsMoney) <= 0){ couponInfo.setAvailable(true); } //代金券 if(2 == couponInfo.getCouponType() || 3 == couponInfo.getCouponType()){ couponInfo.setAvailable(true); } } } 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.setGoodsId(goods.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.setDistributionMode(goods.getDistributionMode()); vo.setEarnSpendingPoints(price.getEarnSpendingPoints()); vo.setSuperiorSubcommission(price.getSuperiorSubcommission()); vo.setSuperiorRebatePoints(price.getSuperiorRebatePoints()); vo.setSuperiorType(price.getSuperiorType()); vo.setServuceShopCharges(price.getServuceShopCharges()); vo.setServuceShopPoints(price.getServuceShopPoints()); vo.setTechnicianPoints(price.getTechnicianPoints()); vo.setBoundShopCharges(price.getBoundShopCharges()); vo.setBoundShopPoints(price.getBoundShopPoints()); vo.setBoundShopSuperiorsCharges(price.getBoundShopSuperiorsCharges()); vo.setBoundShopSuperiorsPoints(price.getBoundShopSuperiorsPoints()); 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(); String goodsJson = shoppingCartPayment.getGoodsJson(); List<Long> ids = new ArrayList<>(); Integer num = 0; JSONArray objects = JSON.parseArray(goodsJson); for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); Integer num1 = objects.getJSONObject(i).getInteger("num"); num += num1; ShoppingCart shoppingCart = this.getById(id); //判断当前数量是否已经超出限购数量(需要计算已经购买的数量) Goods goods = goodsClient.getGoodsById(shoppingCart.getGoodsId()).getData(); if(null != goods.getPurchaseLimit() && -1 != goods.getPurchaseLimit()){ 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(); } if((num1 + sum) > goods.getPurchaseLimit()){ return R.fail(goods.getName() + "已超出购买上限"); } } ids.add(id); } List<ShoppingCart> list = this.listByIds(ids); //构建商品明细列表 List<MyShoppingCartVo> goodsList = buildDetail(appUser, shopId, list, objects); //判断支付当时是否正确 if(1 == shoppingCartPayment.getPaymentType() || 2 == shoppingCartPayment.getPaymentType()){ //现金支付 long count = goodsList.stream().filter(s -> s.getCashPayment()).count(); if(count != goodsList.size()){ return R.fail("支付方式不正确"); } } else if(3 == shoppingCartPayment.getPaymentType()){ //积分支付 long count = goodsList.stream().filter(s -> s.getPointPayment()).count(); if(count != goodsList.size()){ return R.fail("支付方式不正确"); } }else{ return R.fail("支付方式不正确"); } //判断门店是都可以核销所有的商品 List<Integer> goodsIds = goodsList.stream().map(MyShoppingCartVo::getGoodsId).collect(Collectors.toList()); GetGoodsShopByGoodsIds goodsShopByGoodsIds = new GetGoodsShopByGoodsIds(); goodsShopByGoodsIds.setGoodsIds(goodsIds); goodsShopByGoodsIds.setShopId(shopId); List<GoodsShop> data = goodsShopClient.getGoodsShopByGoodsIds(goodsShopByGoodsIds).getData(); List<Integer> collect = data.stream().map(GoodsShop::getGoodsId).collect(Collectors.toList()); if(data.size() != goodsList.size()){ String goodsName = ""; for (Integer goodsId : goodsIds) { if(!collect.contains(goodsId)){ goodsName = goodsClient.getGoodsById(goodsId).getData().getName(); break; } } return R.fail(goodsName + "不能在该门店核销"); } //开始构建支付信息 //现金支付的订单金额 BigDecimal orderMoney = BigDecimal.ZERO; //折扣(9折) BigDecimal discount = null; //积分支付的订单积分 Integer orderPoint = 0; if(3 != shoppingCartPayment.getPaymentType()){ orderMoney = goodsList.stream().map(MyShoppingCartVo::getCash).reduce(BigDecimal::add).get(); }else{ orderPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getPoint).sum(); if(appUser.getLavePoint().intValue() < orderPoint){ return R.fail("账户剩余积分不足"); } } //现金的支付金额 BigDecimal paymentMoney = orderMoney; //满减金额 BigDecimal fullReductionAmount = BigDecimal.ZERO; //代金券抵扣金额 BigDecimal moneyAmount = BigDecimal.ZERO; //折扣券抵扣金额 BigDecimal discountAmount = BigDecimal.ZERO; //活动优惠金额 BigDecimal activityAmount = BigDecimal.ZERO; //减去优惠券优惠金额 CouponInfoVo couponInfoVo = null; if(null != shoppingCartPayment.getUserCouponId() && 3 != shoppingCartPayment.getPaymentType()){ couponInfoVo = userCouponClient.getCouponInfo(shoppingCartPayment.getUserCouponId()).getData(); String forGoodIds = couponInfoVo.getForGoodIds(); List<Integer> parseArray = JSON.parseArray(forGoodIds, Integer.class); //全部商品 if(parseArray.contains(-1)){ //满减 if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(paymentMoney) <= 0){ paymentMoney = paymentMoney.subtract(couponInfoVo.getDiscountAmount()); fullReductionAmount = fullReductionAmount.add(couponInfoVo.getDiscountAmount()); } //代金券 if(2 == couponInfoVo.getCouponType()){ paymentMoney = paymentMoney.subtract(couponInfoVo.getMoneyAmount()); moneyAmount = moneyAmount.add(couponInfoVo.getMoneyAmount()); if(paymentMoney.compareTo(BigDecimal.ZERO) < 0){ paymentMoney = BigDecimal.ZERO; } } //折扣券 if(3 == couponInfoVo.getCouponType()){ BigDecimal paymentMoney1 = couponInfoVo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); discount = couponInfoVo.getDiscount(); paymentMoney = paymentMoney1; discountAmount = discountAmount.add(bigDecimal); } }else{ //部分商品,需要计算参与优惠商品的支付金额,然后再对商品进行优惠券处理 paymentMoney = BigDecimal.ZERO; BigDecimal goodsMoney = BigDecimal.ZERO; for (MyShoppingCartVo myShoppingCartVo : goodsList) { Integer goodsId = myShoppingCartVo.getGoodsId(); BigDecimal cash = myShoppingCartVo.getCash(); if(parseArray.contains(goodsId)){ goodsMoney = goodsMoney.add(cash); }else{ paymentMoney = paymentMoney.add(cash); } } //满减 if(1 == couponInfoVo.getCouponType() && couponInfoVo.getConditionAmount().compareTo(goodsMoney) <= 0){ goodsMoney = goodsMoney.subtract(couponInfoVo.getDiscountAmount()); fullReductionAmount = fullReductionAmount.add(couponInfoVo.getDiscountAmount()); } //代金券 if(2 == couponInfoVo.getCouponType()){ goodsMoney = goodsMoney.subtract(couponInfoVo.getMoneyAmount()); moneyAmount = moneyAmount.add(couponInfoVo.getMoneyAmount()); if(goodsMoney.compareTo(BigDecimal.ZERO) < 0){ goodsMoney = BigDecimal.ZERO; } } //折扣券 if(3 == couponInfoVo.getCouponType()){ BigDecimal paymentMoney1 = couponInfoVo.getDiscount().divide(new BigDecimal(10)).multiply(goodsMoney); BigDecimal bigDecimal = goodsMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); discount = couponInfoVo.getDiscount(); goodsMoney = paymentMoney1; discountAmount = discountAmount.add(bigDecimal); } paymentMoney = paymentMoney.add(goodsMoney); } } //查询当前是否有订单活动 OrderActivityInfo orderActivityInfo = orderActivityInfoClient.getNowOrderActivityInfo(appUser.getVipId()).getData(); BaseSetting baseSetting = baseSettingClient.getBaseSetting(4).getData(); //系统活动设置(优惠券和活动能否同时使用) boolean useSimultaneously = baseSetting.getContent().equals("1") ? true : false; //满XX才打折,只有现金才能优惠 //如果使用优惠券,则需要判断是否可以和同时使用,且活动满足使用条件。 //没有使用优惠券,只需要判断是都满足使用条件 if(((useSimultaneously && null != shoppingCartPayment.getUserCouponId()) || null == shoppingCartPayment.getUserCouponId()) && null != orderActivityInfo && shoppingCartPayment.getPaymentType() != 3 && orderActivityInfo.getConditionAmount().compareTo(paymentMoney) <= 0){ BigDecimal paymentMoney1 = orderActivityInfo.getDiscount().divide(new BigDecimal(10)).multiply(paymentMoney); BigDecimal bigDecimal = paymentMoney.subtract(paymentMoney1).setScale(2, RoundingMode.HALF_EVEN); discount = orderActivityInfo.getDiscount(); paymentMoney = paymentMoney1; activityAmount = activityAmount.add(bigDecimal); } //可获得的消费积分 int earnPoint = goodsList.stream().mapToInt(MyShoppingCartVo::getEarnSpendingPoints).sum(); if(null != shoppingCartPayment.getUserAddressId()){ userAddressClient.getUserAddressById(shoppingCartPayment.getUserAddressId()).getData(); } //获取快递策略,计算快递费 BigDecimal expressFee = BigDecimal.ZERO; if(null != shoppingCartPayment.getUserAddressId()){ SystemConfig systemConfig = systemConfigClient.getSystemConfig(3).getData(); JSONObject jsonObject = JSON.parseObject(systemConfig.getContent()); //快递费 expressFee = jsonObject.getBigDecimal("expressFee"); List<Integer> vip = jsonObject.getJSONArray("vip").toList(Integer.class); //包邮条件(所有会员或者满足条件的会员) if(vip.get(0) == -1 || vip.contains(appUser.getVipId())){ if(shoppingCartPayment.getPaymentType() != 3){ //现金支付,支付金额满足包邮条件 BigDecimal cash = jsonObject.getBigDecimal("cash"); if(paymentMoney.compareTo(cash) >= 0){ expressFee = BigDecimal.ZERO; } }else{ //积分支付,支付积分是否满足包邮条件 Integer point = jsonObject.getInteger("point"); if(orderPoint.compareTo(point) >= 0){ expressFee = BigDecimal.ZERO; } } } } //构建订单明细 Order order = new Order(); order.setAppUserId(userid); order.setNum(num); String goodPics = ""; String goodName = ""; for (MyShoppingCartVo myShoppingCartVo : goodsList) { goodPics += myShoppingCartVo.getHomePicture() + ","; goodName += myShoppingCartVo.getName() + ","; } order.setGoodPics(goodPics.substring(0, goodPics.length() - 1)); order.setGoodName(goodName.substring(0, goodName.length() - 1)); Goods goods = goodsClient.getGoodsById(goodsList.get(0).getGoodsId()).getData(); order.setOrderType(goods.getType()); order.setOrderStatus(1); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); order.setOrderNumber("QJS" + getNumber(3) + sdf.format(new Date())); order.setTotalAmount(orderMoney.setScale(2, RoundingMode.HALF_EVEN)); order.setFullReductionAmount(fullReductionAmount); order.setMoneyAmount(moneyAmount); order.setDiscountAmount(discountAmount); order.setActivityAmount(activityAmount); order.setDiscountTotalAmount(fullReductionAmount.add(moneyAmount).add(discountAmount).add(activityAmount)); order.setPaymentAmount(paymentMoney); order.setPoint(orderPoint); order.setPayMethod(shoppingCartPayment.getPaymentType()); if(3 != shoppingCartPayment.getPaymentType() && (fullReductionAmount.compareTo(BigDecimal.ZERO) > 0 ||moneyAmount.compareTo(BigDecimal.ZERO) > 0 || discountAmount.compareTo(BigDecimal.ZERO) > 0)){ order.setCouponJson(JSON.toJSONString(couponInfoVo)); } if(activityAmount.compareTo(BigDecimal.ZERO) > 0){ order.setActivityJson(JSON.toJSONString(orderActivityInfo)); } if(null != shoppingCartPayment.getUserAddressId()){ UserAddress address = userAddressClient.getUserAddressById(shoppingCartPayment.getUserAddressId()).getData(); order.setExpressAmount(expressFee); order.setAddressJson(JSON.toJSONString(address)); } order.setGetPoint(earnPoint); order.setPayStatus(1); order.setShopId(shoppingCartPayment.getShopId()); order.setDelFlag(0); order.setCreateTime(LocalDateTime.now()); if(2 == shoppingCartPayment.getPaymentType()){ BigDecimal balance = appUser.getBalance(); if(balance.compareTo(paymentMoney.add(expressFee)) < 0){ return R.fail("账户余额不足"); } } orderService.save(order); //构建订单明细数据 for (MyShoppingCartVo myShoppingCartVo : goodsList) { OrderGood orderGood = new OrderGood(); orderGood.setGoodsId(myShoppingCartVo.getGoodsId()); orderGood.setOrderId(order.getId()); GetSeckillActivityInfo info = new GetSeckillActivityInfo(); info.setGoodsId(myShoppingCartVo.getGoodsId()); info.setVip(appUser.getVipId()); GoodsSeckill goodsSeckill = seckillActivityInfoClient.getSeckillActivityInfo(info).getData(); if(null != goodsSeckill){ orderGood.setSeckillJson(JSON.toJSONString(goodsSeckill)); } for (int i = 0; i < objects.size(); i++) { Long id = objects.getJSONObject(i).getLong("id"); if(myShoppingCartVo.getId().equals(id)){ Integer num1 = objects.getJSONObject(i).getInteger("num"); orderGood.setNum(num1); Goods goods1 = goodsClient.getGoodsById(myShoppingCartVo.getGoodsId()).getData(); orderGood.setGoodJson(JSON.toJSONString(goods1)); break; } } orderGood.setDelFlag(0); orderGood.setCreateTime(LocalDateTime.now()); orderGood.setEarnSpendingPoints(myShoppingCartVo.getEarnSpendingPoints()); orderGood.setSuperiorSubcommission(myShoppingCartVo.getSuperiorSubcommission()); orderGood.setSuperiorRebatePoints(myShoppingCartVo.getSuperiorRebatePoints()); orderGood.setSuperiorType(myShoppingCartVo.getSuperiorType()); orderGood.setServuceShopCharges(myShoppingCartVo.getServuceShopCharges()); orderGood.setServuceShopPoints(myShoppingCartVo.getServuceShopPoints()); orderGood.setTechnicianPoints(myShoppingCartVo.getTechnicianPoints()); orderGood.setBoundShopCharges(myShoppingCartVo.getBoundShopCharges()); orderGood.setBoundShopPoints(myShoppingCartVo.getBoundShopPoints()); orderGood.setBoundShopSuperiorsCharges(myShoppingCartVo.getBoundShopSuperiorsCharges()); orderGood.setBoundShopSuperiorsPoints(myShoppingCartVo.getBoundShopSuperiorsPoints()); orderGoodService.save(orderGood); } //开始构建支付数据 //现金支付 paymentMoney = paymentMoney.add(expressFee).setScale(2, RoundingMode.HALF_EVEN); if(1 == shoppingCartPayment.getPaymentType()){ //调起微信支付 TODO 待完善 } //账户余额 if(2 == shoppingCartPayment.getPaymentType()){ BigDecimal totalRedPacketAmount = appUser.getTotalRedPacketAmount(); BigDecimal totalDistributionAmount = appUser.getTotalDistributionAmount(); BigDecimal balance = appUser.getBalance(); if(paymentMoney.compareTo(totalRedPacketAmount) <= 0){ totalRedPacketAmount = totalRedPacketAmount.subtract(paymentMoney); balance = balance.subtract(paymentMoney); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setBalance(balance); }else{ paymentMoney = paymentMoney.subtract(totalRedPacketAmount); totalRedPacketAmount = BigDecimal.ZERO; if(paymentMoney.compareTo(totalDistributionAmount) <= 0){ totalDistributionAmount = totalDistributionAmount.subtract(paymentMoney); balance = balance.subtract(paymentMoney); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); }else{ paymentMoney = paymentMoney.subtract(totalDistributionAmount); totalDistributionAmount = BigDecimal.ZERO; balance = balance.subtract(paymentMoney); appUser.setTotalRedPacketAmount(totalRedPacketAmount); appUser.setTotalDistributionAmount(totalDistributionAmount); appUser.setBalance(balance); } } //构建积分流水记录 if(earnPoint > 0){ appUser.setShopPoint(appUser.getShopPoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint); UserPoint userPoint = new UserPoint(); userPoint.setType(1); userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); userPoint.setVariablePoint(earnPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); } appUserClient.editAppUserById(appUser); //构建余额明细变动记录 BalanceChangeRecord balanceChangeRecord = new BalanceChangeRecord(); balanceChangeRecord.setAppUserId(appUser.getId()); balanceChangeRecord.setOrderId(order.getId()); balanceChangeRecord.setChangeType(5); balanceChangeRecord.setBeforeAmount(balance.add(paymentMoney)); balanceChangeRecord.setChangeAmount(paymentMoney); balanceChangeRecord.setAfterAmount(balance); balanceChangeRecord.setDelFlag(0); balanceChangeRecord.setCreateTime(LocalDateTime.now()); balanceChangeRecordClient.saveBalanceChangeRecord(balanceChangeRecord); //修改订支付状态 order.setPayStatus(2); orderService.updateById(order); //删除购物车数据 this.removeBatchByIds(ids); } //积分支付 if(3 == shoppingCartPayment.getPaymentType()){ Integer lavePoint = appUser.getLavePoint(); appUser.setLavePoint(lavePoint - orderPoint); appUser.setShopPoint(appUser.getShopPoint() + earnPoint); appUser.setLavePoint(appUser.getLavePoint() + earnPoint); appUserClient.editAppUserById(appUser); //构建积分流水记录 UserPoint userPoint = new UserPoint(); userPoint.setType(4); userPoint.setHistoricalPoint(lavePoint); userPoint.setVariablePoint(orderPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); if(earnPoint > 0){ userPoint = new UserPoint(); userPoint.setType(1); userPoint.setHistoricalPoint(appUser.getLavePoint() - earnPoint); userPoint.setVariablePoint(earnPoint); userPoint.setBalance(appUser.getLavePoint()); userPoint.setCreateTime(LocalDateTime.now()); userPoint.setAppUserId(appUser.getId()); userPoint.setObjectId(order.getId()); userPointClient.saveUserPoint(userPoint); } //修改订支付状态 order.setPayStatus(2); orderService.updateById(order); //删除购物车数据 this.removeBatchByIds(ids); } return R.ok(); } public String getNumber(Integer size){ String str = ""; for (Integer i = 0; i < size; i++) { str += Double.valueOf(Math.random() * 10).intValue(); } return str; } } 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,8 @@ package com.ruoyi.order.vo; import com.ruoyi.account.api.model.UserAddress; import com.ruoyi.account.api.vo.CouponInfoVo; import com.ruoyi.account.api.vo.PaymentUserCouponVo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -31,14 +33,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; private List<PaymentUserCouponVo> 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 @@ -13,12 +15,16 @@ public class MyShoppingCartVo { @ApiModelProperty("数据id") private Long id; @ApiModelProperty("商品id") private Integer goodsId; @ApiModelProperty("封面图") 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 +33,56 @@ 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; /** * 上级获得分佣金额 */ private BigDecimal superiorSubcommission; /** * 上级获得返佣积分 */ private Integer superiorRebatePoints; /** * 获取返佣积分上级类型(1=直推上级,2=直帮上级) */ private Integer superiorType; /** * 核销门店可获得服务费 */ private BigDecimal servuceShopCharges; /** * 核销门店可获得服务积分 */ private Integer servuceShopPoints; /** * 技师可获得服务积分 */ private Integer technicianPoints; /** * 绑定门店可获得分佣金额 */ private BigDecimal boundShopCharges; /** * 绑定门店可获得返佣积分 */ private Integer boundShopPoints; /** * 绑定门店上级门店可获得分佣金额 */ private BigDecimal boundShopSuperiorsCharges; /** * 绑定门店上级门店可获得返佣积分 */ private Integer boundShopSuperiorsPoints; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/vo/ShoppingCartPayment.java
@@ -11,12 +11,16 @@ @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) @ApiModelProperty(value = "支付方式(1=微信,2=账户余额,3=积分)", required = true) private Integer paymentType; @ApiModelProperty(value = "核销门店id", required = true) private Integer shopId; @ApiModelProperty(value = "优惠券id", required = false) private String userCouponId; private Long userCouponId; @ApiModelProperty(value = "配送方式(1=自提,2=快递)", required = false) private Integer distributionMode; @ApiModelProperty(value = "配送地址id", required = false) private Integer userAddressId; } ruoyi-service/ruoyi-other/pom.xml
@@ -114,7 +114,7 @@ <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.2</version> <version>3.5.4</version> </dependency> <dependency> @@ -132,6 +132,10 @@ <version>RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> </dependency> </dependencies> <build> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/BannerController.java
@@ -32,8 +32,8 @@ @ApiOperation(value = "banner列表", tags = {"小程序-banner"}) public R<List<Banner>> list(String name, Integer jumpType, Integer position){ List<Banner> list = bannerService.lambdaQuery().like(StringUtils.isNotEmpty(name), Banner::getName, name) .eq(Banner::getJumpType, jumpType) .eq(Banner::getPosition, position) .eq(jumpType!=null,Banner::getJumpType, jumpType) .eq(position!=null,Banner::getPosition, position) .list(); return R.ok(list); } 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
@@ -13,6 +13,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; 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; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -76,5 +83,19 @@ } } /** * 根据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/GoodsCategoryController.java
@@ -34,7 +34,7 @@ @Resource private GoodsCategoryService goodsCategoryService; @PostMapping("/index/list") @GetMapping("/index/list") @ApiOperation(value = "商品分类", tags = {"小程序-首页"}) public R<List<GoodsCategory>> indexlist(){ List<GoodsCategory> indexlist = goodsCategoryService.lambdaQuery() 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/GoodsShopController.java
@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.GoodsShop; import com.ruoyi.other.api.vo.GetGoodsShopByGoodsIds; import com.ruoyi.other.service.GoodsShopService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * <p> @@ -39,5 +41,16 @@ } /** * 根据商品id集合和门店id查询数据 * @param goodsIds * @return */ @ResponseBody @PostMapping("/getGoodsShopByGoodsIds") public R<List<GoodsShop>> getGoodsShopByGoodsIds(@RequestBody GetGoodsShopByGoodsIds goodsIds) { List<GoodsShop> list = goodsShopService.list(new LambdaQueryWrapper<GoodsShop>().eq(GoodsShop::getShopId, goodsIds.getShopId()).in(GoodsShop::getGoodsId, goodsIds.getGoodsIds())); return R.ok(list); } } 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/SeckillActivityInfoController.java
@@ -11,6 +11,8 @@ import com.ruoyi.other.api.vo.GetSeckillActivityInfo; import com.ruoyi.other.service.GoodsSeckillService; import com.ruoyi.other.service.SeckillActivityInfoService; import com.ruoyi.other.vo.SeckillActivityDetailVO; import com.ruoyi.other.vo.SeckillActivityVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -49,10 +51,10 @@ */ @GetMapping("/list") @ApiOperation(value = "秒杀活动列表",tags = {"小程序-商城-首页-秒杀活动列表"}) public AjaxResult list(Goods goods) public R<List<SeckillActivityVO>> list(Goods goods) { startPage(); return AjaxResult.success(seckillActivityInfoService.listSeckillActivity(goods)); return R.ok(seckillActivityInfoService.listSeckillActivity(goods)); } /** @@ -60,16 +62,14 @@ */ @GetMapping("/detail/{id}") @ApiOperation(value = "秒杀活动详情", tags = {"小程序-商城-首页-秒杀活动列表-秒杀活动详情"}) public AjaxResult detail(@PathVariable("id") Integer id) public R<SeckillActivityDetailVO> detail(@PathVariable("id") Integer id) { return AjaxResult.success(seckillActivityInfoService.detail(id)); return R.ok(seckillActivityInfoService.detail(id)); } /** * 根据商品id和会员等级获取对应的秒杀活动 * @param info * @return */ @PostMapping("/getSeckillActivityInfo") public R<GoodsSeckill> getSeckillActivityInfo(@RequestBody GetSeckillActivityInfo info){ ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/ShopController.java
@@ -6,8 +6,10 @@ import com.ruoyi.account.api.model.AppUser; 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.security.utils.SecurityUtils; import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.api.domain.Technician; import com.ruoyi.other.enums.ShopStatus; import com.ruoyi.other.service.ShopService; import com.ruoyi.other.service.TechnicianService; @@ -114,5 +116,31 @@ // 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); } /** * 根据店铺管理员电话获取门店数据 * @param phone * @return */ @ResponseBody @PostMapping("/getShopByPhone") public R<Shop> getShopByPhone(@RequestParam("phone") String phone){ Shop one = shopService.getOne(new LambdaQueryWrapper<Shop>().eq(Shop::getPhone, phone).eq(Shop::getDelFlag, 0).eq(Shop::getStatus, 1)); return R.ok(one); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/SystemConfigController.java
@@ -9,6 +9,8 @@ import com.ruoyi.other.api.dto.StartPageSetDto; import com.ruoyi.other.service.SystemConfigService; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.Api; import org.springframework.web.bind.annotation.*; import io.swagger.annotations.ApiOperation; import javax.annotation.Resource; @@ -39,7 +41,7 @@ systemConfigService.save(systemConfig); return R.ok(); } @PostMapping("/index/detail") @GetMapping("/index/detail") @ApiOperation(value = "宣传图片-公司简介", tags = {"后台-广告管理-首页配置","小程序-首页"}) public R<IndexConfigSetDto> detail(){ SystemConfig one = systemConfigService.lambdaQuery().eq(SystemConfig::getType, 2).one(); @@ -51,6 +53,19 @@ } /** * 根据类型获取系统配置 * @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); } @PostMapping("/index/start") @ApiOperation(value = "宣传图片-公司简介", tags = {"小程序-启动页"}) public R<StartPageSetDto> indexstart(){ ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TechnicianSubscribeController.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.common.core.web.page.TableDataInfo; @@ -51,7 +52,7 @@ @PostMapping("/subscribe") @ApiOperation(value = "预约技师", notes = "预约技师", tags = {"小程序-个人中心-门店管理-预约列表-预约技师"}) public R<Void> subscribe(@RequestBody TechnicianSubscribe technicianSubscribe){ technicianSubscribeService.subscribe(technicianSubscribe); technicianSubscribeService.subscribe(technicianSubscribe, technicianSubscribe.getTechnicianId()); return R.ok(); } @@ -73,6 +74,23 @@ return R.ok(); } /** * 更新技师预约状态 * * @param status */ @PutMapping("/updateStatus") @ApiOperation(value = "更新技师预约状态", notes = "更新技师预约状态", tags = {"后台-技师预约管理-更新技师预约状态"}) public R<Void> updateStatus(@ApiParam @RequestParam Integer status, @ApiParam @RequestParam Long subscribeId) { boolean update = technicianSubscribeService.update(new LambdaUpdateWrapper<TechnicianSubscribe>() .eq(TechnicianSubscribe::getId, subscribeId) .set(TechnicianSubscribe::getStatus, status)); if (!update) { return R.fail("更新失败"); } return R.ok(); } @GetMapping("/home/list") @ApiOperation(value = "列表", notes = "列表", tags = {"小程序-个人中心-我的预约"}) ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/VipSettingController.java
@@ -10,16 +10,13 @@ import com.ruoyi.other.service.VipGoodService; import com.ruoyi.other.service.VipSettingService; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*; import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.VipSetting; import com.ruoyi.other.service.VipSettingService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @@ -110,7 +107,7 @@ @GetMapping("getVipSettingById") @ApiOperation(value = "获取会员设置") public R<VipSetting> getVipSettingById(@ApiParam(value = "会员id") Integer id){ public R<VipSetting> getVipSettingById(@ApiParam(value = "会员id") @RequestParam Integer id){ return R.ok(vipSettingService.getById(id)); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/enums/TechnicianStatus.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.other.enums; import lombok.Getter; @Getter public enum TechnicianStatus { UNSUBSCRIBE(0, "待服务"), SERVE(1, "已服务"), CANCEL(2, "已取消"); private final Integer code; private final String message; TechnicianStatus(Integer code, String message) { this.code = code; this.message = message; } public static String getMessage(Integer code) { for (TechnicianStatus value : TechnicianStatus.values()) { if (value.getCode().equals(code)) { return value.getMessage(); } } return null; } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/ShopMapper.java
@@ -4,6 +4,7 @@ import com.ruoyi.other.api.domain.Shop; import com.ruoyi.other.vo.NearbyShopVO; import com.ruoyi.other.vo.ShopDetailVO; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -17,7 +18,7 @@ */ public interface ShopMapper extends BaseMapper<Shop> { List<NearbyShopVO> selectNearbyShopList(String longitude, String latitude); List<NearbyShopVO> selectNearbyShopList(@Param("longitude") String longitude,@Param("latitude") String latitude); ShopDetailVO selectShopDetail(Integer shopId); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TechnicianSubscribeService.java
@@ -20,7 +20,8 @@ * 查询用于指定门店的相关预约记录 */ List<TechnicianSubscribeVO> getTechnicianSubscribeByUserAndShop(Long userId, Long shopId); List<TechnicianSubscribeVO> getTechnicianSubscribeByUser(Long userId, Integer status); void subscribe(TechnicianSubscribe technicianSubscribe); void subscribe(TechnicianSubscribe technicianSubscribe, Long technicianId); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TechnicianSubscribeServiceImpl.java
@@ -1,18 +1,18 @@ package com.ruoyi.other.service.impl; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.redis.annotation.DistributedLock; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.other.api.domain.Technician; import com.ruoyi.other.api.domain.TechnicianSubscribe; import com.ruoyi.other.enums.TechnicianErrorCode; import com.ruoyi.other.enums.TechnicianStatus; import com.ruoyi.other.mapper.TechnicianMapper; import com.ruoyi.other.mapper.TechnicianSubscribeMapper; import com.ruoyi.other.service.TechnicianSubscribeService; import com.ruoyi.other.vo.TechnicianSubscribeVO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.time.LocalDateTime; @@ -43,26 +43,22 @@ } @Override @Transactional(rollbackFor = Exception.class) public void subscribe(TechnicianSubscribe technicianSubscribe) { // @DistributedLock(lockNamePre = "#technician_subscribe_lock", lockNamePost = "#technicianId") public void subscribe(TechnicianSubscribe subscribe, Long technicianId) { // Long count = technicianSubscribeMapper.selectCount(new LambdaQueryWrapper<TechnicianSubscribe>() // .eq(TechnicianSubscribe::getTechnicianId, technicianId) // .eq(TechnicianSubscribe::getSubscribeTime, subscribe.getSubscribeTime()) // .eq(TechnicianSubscribe::getStatus, TechnicianStatus.UNSUBSCRIBE.getCode())); // if (count > 0) { // throw new ServiceException("当前时间段已被预约", TechnicianErrorCode.TECHNICIAN_ALREADY_SUBSCRIBED.getCode()); // } // 创建技师预约单 Long technicianId = technicianSubscribe.getTechnicianId(); Long userId = SecurityUtils.getUserId(); TechnicianSubscribe subscribe = new TechnicianSubscribe(); subscribe.setAppUserId(userId); subscribe.setStatus(TechnicianStatus.UNSUBSCRIBE.getCode()); subscribe.setDelFlag(0); subscribe.setCreateTime(LocalDateTime.now()); technicianSubscribeMapper.insert(subscribe); // 更新技师状态 UpdateWrapper<Technician> updateWrapper = new UpdateWrapper<>(); updateWrapper.eq("id", technicianId); updateWrapper.eq("subscribe_status", 1); updateWrapper.eq("status", 2); updateWrapper.set("subscribe_status", 2); updateWrapper.set("create_time", LocalDateTime.now()); int update = technicianMapper.update(null, updateWrapper); if (update == 0){ throw new ServiceException("该技师已被预约", TechnicianErrorCode.TECHNICIAN_ALREADY_SUBSCRIBED.getCode()); } } } ruoyi-service/ruoyi-other/src/main/resources/mapper/other/SeckillActivityInfoMapper.xml
@@ -15,9 +15,9 @@ FROM t_seckill_activity_info tsai LEFT JOIN t_goods tg ON tsai.good_id = tg.id LEFT JOIN t_goods_seckill tgs ON tgs.goods_id = tg.id LEFT JOIN t_goods_seckill tgs ON tgs.seckill_activity_info_id = tsai.id WHERE tsai.end_time >= NOW() <if test="goodsName != null and goodsName != ''"> <if test="name != null and name != ''"> AND tg.`name` LIKE concat('%',#{goodsName},'%') </if> <if test="goodsCategoryId != null"> @@ -43,7 +43,7 @@ FROM t_seckill_activity_info tsai LEFT JOIN t_goods tg ON tsai.good_id = tg.id LEFT JOIN t_goods_seckill tgs ON tgs.goods_id = tg.id LEFT JOIN t_goods_seckill tgs ON tgs.seckill_activity_info_id = tsai.id WHERE tsai.id = #{seckillActivityId} </select> </mapper>