ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppCouponFallbackFactory.java
New file @@ -0,0 +1,34 @@ package com.ruoyi.account.api.factory; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; /** * 门店服务降级处理 * * @author ruoyi */ @Component public class AppCouponFallbackFactory implements FallbackFactory<AppCouponClient> { private static final Logger log = LoggerFactory.getLogger(AppCouponFallbackFactory.class); @Override public AppCouponClient create(Throwable throwable) { log.error("用户优惠券记录调用失败:{}", throwable.getMessage()); return new AppCouponClient() { @Override public R<List<Integer>> getCountByCouponIds(String couponIds) { return null; } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppCouponClient.java
New file @@ -0,0 +1,32 @@ package com.ruoyi.account.api.feignClient; import com.ruoyi.account.api.factory.AppCouponFallbackFactory; import com.ruoyi.account.api.factory.AppUserFallbackFactory; 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 java.util.List; /** * 用户服务 * @author ruoyi */ @FeignClient(contextId = "AppCouponClient", value = ServiceNameConstants.CONTRACT_ACCOUNT, fallbackFactory = AppCouponFallbackFactory.class) public interface AppCouponClient { /** * 管理后台远程调用 根据优惠券ids 查询对应的发放数量 * @return 优惠券ids 查询每个优惠券的发放数量 */ @PostMapping("/t-app-coupon/getCountByCouponIds") public R<List<Integer>> getCountByCouponIds(String couponIds); /** * 管理后台远程调用 根据优惠券id 查询对应的使用数量 * @param couponId * @return */ @PostMapping("/t-app-coupon/getUseCountByCouponId") public R<Integer> getUseCountByCouponId(Integer couponId); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/query/ExchangeRecordGoodsQuery.java
New file @@ -0,0 +1,17 @@ package com.ruoyi.account.api.query; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("管理后台 优惠券兑换记录") public class ExchangeRecordGoodsQuery extends BasePage { @ApiModelProperty(value = "用户名称") private String name; @ApiModelProperty(value = "状态1未使用 2已使用 3已过期 4已取消") private Integer state; @ApiModelProperty(value = "优惠券id",required = true) private Integer couponId; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/ExchangeRecordVO.java
New file @@ -0,0 +1,25 @@ package com.ruoyi.account.api.vo; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("管理后台 优惠券兑换记录列表返回VO") public class ExchangeRecordVO { @ApiModelProperty(value = "获得时间") private String name; @ApiModelProperty(value = "获得用户") private String state; @ApiModelProperty(value = "优惠金额") private String discountAmount; @ApiModelProperty(value = "使用门槛") private String meetTheConditions; @ApiModelProperty(value = "使用状态 1未使用 2已使用") private Integer status; @ApiModelProperty(value = "失效时间") private String endTime; @ApiModelProperty(value = "关联订单") private String orderId; } ruoyi-api/ruoyi-api-account/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -1 +1,2 @@ com.ruoyi.account.api.factory.AppUserFallbackFactory com.ruoyi.account.api.factory.AppUserFallbackFactory com.ruoyi.account.api.factory.AppCouponFallbackFactory ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/OrderFallbackFactory.java
@@ -1,10 +1,14 @@ package com.ruoyi.order.api.factory; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.feignClient.OrderClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; /** * 充电订单服务降级处理 @@ -12,16 +16,20 @@ * @author ruoyi */ @Component public class OrderFallbackFactory implements FallbackFactory<ChargingOrderClient> public class OrderFallbackFactory implements FallbackFactory<OrderClient> { private static final Logger log = LoggerFactory.getLogger(OrderFallbackFactory.class); @Override public ChargingOrderClient create(Throwable cause) { public OrderClient create(Throwable cause) { log.error("商品订单调用失败:{}", cause.getMessage()); return new ChargingOrderClient() { return new OrderClient() { @Override public R<List<Integer>> getSalesCountByGoodsId(String goodsIds) { return null; } }; } } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TCoupon.java
@@ -106,6 +106,12 @@ @ApiModelProperty(value = "状态(1=上架,2=下架)") @TableField("status") private Integer status; @ApiModelProperty(value = "发放数量") @TableField(exist = false) private Integer count; @ApiModelProperty(value = "使用数量") @TableField(exist = false) private Integer useCount; ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/factory/OtherFallbackFactory.java
@@ -6,7 +6,6 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.TCompany; import com.ruoyi.other.api.domain.TUserTag; import com.ruoyi.other.api.feignClient.GoodsClient; import com.ruoyi.other.api.feignClient.OtherClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/feignClient/OtherClient.java
@@ -7,7 +7,6 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.other.api.domain.TCompany; import com.ruoyi.other.api.domain.TUserTag; import com.ruoyi.other.api.factory.GoodsFallbackFactory; import com.ruoyi.other.api.factory.OtherFallbackFactory; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/SysUserFallbackFactory.java
@@ -86,6 +86,11 @@ } @Override public R<SysUser> queryUserByAccount(String account) { return null; } @Override public R<SysUser> queryUserByUserName(String userName) { return R.fail("通过账号查询用户失败:" + cause.getMessage()); } @@ -94,6 +99,11 @@ public R addSysUser(SysUser user) { return R.fail("添加用户失败:" + cause.getMessage()); } @Override public R resetPassword(SysUser user) { return null; } }; } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/ServiceNameConstants.java
@@ -36,4 +36,5 @@ */ public static final String CONTRACT_SERVICE = "ruoyi-contract"; public static final String CONTRACT_ORDER = "ruoyi-order"; public static final String CONTRACT_ACCOUNT = "ruoyi-account"; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -1,8 +1,25 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.account.service.TAppCouponService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TCoupon; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; 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 java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * <p> @@ -15,6 +32,47 @@ @RestController @RequestMapping("/t-app-coupon") public class TAppCouponController { @Autowired private TAppCouponService tAppCouponService; /** * 管理后台远程调用 根据优惠券ids 查询对应的发放数量 * @return 优惠券ids 查询每个优惠券的发放数量 */ @PostMapping("/getCountByCouponIds") public R<List<Integer>> getCountByCouponIds(String couponIds) { // 最终结果 和优惠券id一一对应 List<Integer> res = new ArrayList<>(); String[] split = couponIds.split(","); // 查询每个优惠券的发放数量 List<TAppCoupon> couponId = tAppCouponService.list(new QueryWrapper<TAppCoupon>() .in("coupon_id", Arrays.asList(split))); for (String s : split) { res.add(tAppCouponService.list(new QueryWrapper<TAppCoupon>() .eq("coupon_id", s)).size()); } return R.ok(res); } /** * 后台远程调用 根据优惠券id 查询使用数量 * @param couponId * @return */ @PostMapping("/getUseCountByCouponId") public R<Integer> getUseCountByCouponId(Integer couponId){ return R.ok(tAppCouponService.list(new QueryWrapper<TAppCoupon>() .eq("coupon_id", couponId) .eq("status",2)).size()); } /** * 后台远程调用 根据优惠券id 查询领取记录 * @param couponId * @return */ @PostMapping("/getExchangeRecordByCouponId") public R<PageInfo<ExchangeRecordVO>> getUseCountByCouponId(ExchangeRecordGoodsQuery couponId){ return R.ok(tAppCouponService.pagelist(couponId)); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/mapper/TAppCouponMapper.java
@@ -2,6 +2,11 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.common.core.web.page.PageInfo; import java.util.List; /** * <p> @@ -13,4 +18,5 @@ */ public interface TAppCouponMapper extends BaseMapper<TAppCoupon> { List<ExchangeRecordVO> pageList(PageInfo<ExchangeRecordVO> pageInfo, ExchangeRecordGoodsQuery dto); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/TAppCouponService.java
@@ -2,6 +2,9 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.common.core.web.page.PageInfo; /** * <p> @@ -13,4 +16,5 @@ */ public interface TAppCouponService extends IService<TAppCoupon> { PageInfo<ExchangeRecordVO> pagelist(ExchangeRecordGoodsQuery couponId); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java
@@ -2,9 +2,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.account.api.model.TAppCoupon; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.account.mapper.TAppCouponMapper; import com.ruoyi.account.service.TAppCouponService; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TCoupon; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; /** * <p> @@ -17,4 +24,11 @@ @Service public class TAppCouponServiceImpl extends ServiceImpl<TAppCouponMapper, TAppCoupon> implements TAppCouponService { @Override public PageInfo<ExchangeRecordVO> pagelist(ExchangeRecordGoodsQuery dto) { PageInfo<ExchangeRecordVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<ExchangeRecordVO> list = this.baseMapper.pageList(pageInfo,dto); pageInfo.setRecords(list); return pageInfo; } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TExchangeOrderController.java
@@ -35,10 +35,10 @@ private TExchangeOrderService exchangeOrderService; /** * 管理后台 根据商品ids 查询对应的销量 * @param goodsIds * @param goodsIds 订单号-商品类型 * @return */ @PostMapping("/t-exchange-order/getSalesCountByGoodsIds") @PostMapping("/getSalesCountByGoodsIds") public R<List<Integer>> getSalesCountByGoodsId(String goodsIds){ String[] split = goodsIds.split("-"); // 取出最后一位字符 类型1查询现金购买 类型2查询积分兑换 @@ -47,13 +47,11 @@ switch (Integer.parseInt(s)){ case 1: for (int i = 0; i < split.length-1; i++) { Integer reduce = tShoppingOrderService.list(new QueryWrapper<TShoppingOrder>() .eq("goods_id", split[i]) .eq("payment_status", 2) .ne("refund_status", 2)) .stream().map(TShoppingOrder::getPurchaseQuantity).reduce(0, Integer::sum); res.add(reduce); } break; @@ -63,13 +61,10 @@ .eq("goods_id", split[i]) ) .stream().map(TExchangeOrder::getPurchaseQuantity).reduce(0, Integer::sum); res.add(reduce); } break; } return R.ok(res); } } ruoyi-service/ruoyi-other/pom.xml
@@ -23,6 +23,12 @@ </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-account</artifactId> <version>3.6.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-other</artifactId> <version>3.6.2</version> <scope>compile</scope> ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TCouponController.java
@@ -1,9 +1,21 @@ package com.ruoyi.other.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.account.api.query.ExchangeRecordGoodsQuery; import com.ruoyi.account.api.vo.ExchangeRecordVO; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.api.dto.GoodsDTO; import com.ruoyi.other.query.CouponQuery; import com.ruoyi.other.service.TActivityService; import com.ruoyi.other.service.TCouponService; import com.ruoyi.other.service.TGoodsService; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; /** * <p> @@ -16,6 +28,49 @@ @RestController @RequestMapping("/t-coupon") public class TCouponController { @Autowired private TCouponService tCouponService; @Autowired private AppCouponClient appCouponClient; @PostMapping("/saveGoods") @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券添加") public AjaxResult saveActivity(@RequestBody TCoupon dto) { tCouponService.save(dto); return AjaxResult.success(); } @GetMapping("/delete") @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券删除") public AjaxResult delete(Integer id) { tCouponService.removeById(id); return AjaxResult.success(); } @PostMapping("/updateVip") @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券修改") public AjaxResult updateActivity(@RequestBody TCoupon dto) { tCouponService.updateById(dto); return AjaxResult.success(); } @GetMapping("/getInfo") @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券查看详情") public AjaxResult<TCoupon> getInfo(Integer id) { TCoupon byId = tCouponService.getById(id); // 查询累计发放数量 byId.setCount(appCouponClient.getCountByCouponIds(String.valueOf(id)).getData().get(0)); // 查询累计使用数量 byId.setUseCount(appCouponClient.getUseCountByCouponId(id).getData()); return AjaxResult.ok(byId); } @PostMapping("/exchangeRecord") @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券查看详情-兑换记录") public AjaxResult<PageInfo<ExchangeRecordVO>> exchangeRecord(@RequestBody ExchangeRecordGoodsQuery dto) { return AjaxResult.ok(null); } @ApiOperation(tags = {"管理后台-优惠券管理"},value = "优惠券列表分页查询") @PostMapping(value = "/pageList") public AjaxResult<PageInfo<TCoupon>> pageList(@RequestBody CouponQuery dto) { return AjaxResult.ok(tCouponService.pageList(dto)); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/mapper/TCouponMapper.java
@@ -1,7 +1,14 @@ package com.ruoyi.other.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.api.dto.GoodsDTO; import com.ruoyi.other.query.CouponQuery; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> @@ -13,4 +20,5 @@ */ public interface TCouponMapper extends BaseMapper<TCoupon> { List<TCoupon> pageList(@Param("pageInfo")PageInfo<TCoupon> pageInfo, @Param("req") CouponQuery dto); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/query/CouponQuery.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.other.query; import com.ruoyi.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("优惠券列表查询DTO") public class CouponQuery extends BasePage { @ApiModelProperty(value = "优惠券名称") private String name; @ApiModelProperty(value = "类型 1充电优惠券 2购物优惠券") private Integer type; @ApiModelProperty(value = "获得方式(1=积分兑换,2=现金购买)") private Integer waysToObtain; @ApiModelProperty(value = "启用状态 1启用 2禁用") private Integer status; } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/TCouponService.java
@@ -1,7 +1,10 @@ package com.ruoyi.other.service; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.query.CouponQuery; /** * <p> @@ -13,4 +16,5 @@ */ public interface TCouponService extends IService<TCoupon> { PageInfo<TCoupon> pageList(CouponQuery dto); } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TCouponServiceImpl.java
@@ -1,10 +1,18 @@ package com.ruoyi.other.service.impl; import com.ruoyi.account.api.feignClient.AppCouponClient; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; import com.ruoyi.other.mapper.TCouponMapper; import com.ruoyi.other.query.CouponQuery; import com.ruoyi.other.service.TCouponService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.util.List; /** * <p> @@ -17,4 +25,25 @@ @Service public class TCouponServiceImpl extends ServiceImpl<TCouponMapper, TCoupon> implements TCouponService { @Autowired private AppCouponClient appCouponClient; @Override public PageInfo<TCoupon> pageList(CouponQuery dto) { PageInfo<TCoupon> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<TCoupon> list = this.baseMapper.pageList(pageInfo,dto); StringBuilder couponIds = new StringBuilder(); for (TCoupon tCoupon : list) { couponIds.append(tCoupon.getId()).append(","); } if (StringUtils.hasLength(couponIds)){ // 去除最后一个字符 couponIds.deleteCharAt(couponIds.length()-1); } List<Integer> data = appCouponClient.getCountByCouponIds(couponIds.toString()).getData(); for (int i = 0; i < list.size(); i++) { list.get(i).setCount(data.get(i)); } pageInfo.setRecords(list); return pageInfo; } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGoodsServiceImpl.java
@@ -45,6 +45,7 @@ return pageInfo; } String string = stringBuilder.toString(); // 订单号加上商品类型 String res = string+"-"+dto.getType(); List<Integer> data = orderClient.getSalesCountByGoodsId(res).getData(); ruoyi-service/ruoyi-other/src/main/resources/mapper/TCouponMapper.xml
@@ -32,5 +32,24 @@ <sql id="Base_Column_List"> id, type, name, preferential_mode, discount_amount, meet_the_conditions, discount, maximum_discount_amount, inventory_quantity, validity_period_mode, end_time, days, ways_to_obtain, redeem_points, exchange_limit, payment_amount, vip_payment_amount, explain, remark, status, create_time, del_flag </sql> <select id="pageList" resultType="com.ruoyi.other.api.domain.TCoupon"> select * from t_coupon <where> <if test="req.name != null and req.name != ''"> AND `name` LIKE concat('%',#{req.name}, '%') </if> <if test="req.type != null"> AND `type` = #{req.type} </if> <if test="req.status != null"> AND status = #{req.status} </if> <if test="req.waysToObtain != null"> AND ways_to_obtain = #{req.waysToObtain} </if> AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} </where> ORDER BY create_time DESC </select> </mapper>