xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCouponController.java
@@ -1,9 +1,11 @@ package com.xiaopeng.account.controller; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.dto.SendCouponDto; import com.xiaopeng.account.model.query.XpUserCouponListQuery; import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; @@ -11,6 +13,9 @@ import com.xiaopeng.account.service.IXpAppUserCouponService; import com.xiaopeng.api.dto.account.GetUserCouponDto; import com.xiaopeng.api.dto.account.UseUserCouponDto; import com.xiaopeng.api.dto.account.UserResourcesDto; import com.xiaopeng.api.feignClient.account.UserResourcesClient; import com.xiaopeng.api.feignClient.account.XpAppUserClient; import com.xiaopeng.api.feignClient.operation.XpOpenCityClient; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.vo.account.UserCouponVo; @@ -42,18 +47,31 @@ private final IXpAppUserCouponService xpAppUserCouponService; private final XpOpenCityClient xpOpenCityClient; private final UserResourcesClient userResourcesClient; public XpAppUserCouponController(IXpAppUserCouponService xpAppUserCouponService, XpOpenCityClient xpOpenCityClient) { public XpAppUserCouponController(IXpAppUserCouponService xpAppUserCouponService, XpOpenCityClient xpOpenCityClient, UserResourcesClient userResourcesClient) { this.xpAppUserCouponService = xpAppUserCouponService; this.xpOpenCityClient = xpOpenCityClient; this.userResourcesClient = userResourcesClient; } @PostMapping("/inner/appUserCoupon/getUserCoupon") public R<UserCouponVo> getUserCoupon(@RequestBody GetUserCouponDto dto) { String phone ="18888888888"; if(dto.getUserId()>1){ UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(dto.getUserId().toString()); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } } UserCouponVo userCouponVo = new UserCouponVo(); // 获取用户所有优惠券 List<XpAppUserCoupon> couponList = xpAppUserCouponService.list(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getStatus, 1).eq(XpAppUserCoupon::getAppUserId, dto.getUserId()).apply("FIND_IN_SET({0}, open_city_id)", dto.getOpenCityId()) ); List<XpAppUserCoupon> couponList = xpAppUserCouponService.list(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getStatus, 1).eq(XpAppUserCoupon::getPhone,phone).apply("FIND_IN_SET({0}, open_city_id)", dto.getOpenCityId()) ); if(couponList.isEmpty()){ return R.ok(userCouponVo); } @@ -98,7 +116,14 @@ public R<XpAppUserCouponVo> list(@RequestBody XpUserCouponListQuery query, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); XpAppUserCouponVo vo = xpAppUserCouponService.userCouponList(query, uid); String phone ="18888888888"; UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } XpAppUserCouponVo vo = xpAppUserCouponService.userCouponList(query, phone); return R.ok(vo); } @@ -129,8 +154,14 @@ public R<XpAppUserCouponListVo> detail(@PathVariable("couponId") Long couponId, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); String phone ="18888888888"; UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } XpAppUserCoupon coupon = xpAppUserCouponService.getById(couponId); if(uid.equals(coupon.getAppUserId().toString())){ if(phone.equals(coupon.getPhone())){ XpAppUserCouponListVo vo = new XpAppUserCouponListVo(); vo.setCouponId(coupon.getId().toString()); vo.setTitle(coupon.getCouponName()); @@ -158,9 +189,25 @@ public R<XpAppUserCouponTotalVo> total(HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(uid); String phone ="18888888888"; UserResourcesDto baseUserByUid = userResourcesClient.getBaseUserByUid(uid); if(baseUserByUid!=null){ Object data = baseUserByUid.getData(); phone = JSONObject.parseObject(data.toString()).getString("mobile"); } XpAppUserCouponTotalVo vo = xpAppUserCouponService.userCouponTotal(phone); return R.ok(vo); } /** * 发放优惠券 */ @PostMapping("/api/v1/appUserCoupon/send") @ApiOperation(value = "发放优惠券", tags = {"管理后台-发放优惠券"}) public R<String> send(@RequestBody SendCouponDto dto) { return xpAppUserCouponService.send(dto); } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCouponMapper.java
@@ -17,6 +17,6 @@ */ public interface XpAppUserCouponMapper extends BaseMapper<XpAppUserCoupon> { Page<XpAppUserCouponListVo> userCouponList(@Param("page") Page<XpAppUserCouponListVo> page, @Param("query") XpUserCouponListQuery query, @Param("uid") Long uid); Page<XpAppUserCouponListVo> userCouponList(@Param("page") Page<XpAppUserCouponListVo> page, @Param("query") XpUserCouponListQuery query, @Param("phone") String phone); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/dto/SendCouponDto.java
New file @@ -0,0 +1,18 @@ package com.xiaopeng.account.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel("发放优惠券Dto") public class SendCouponDto { @ApiModelProperty("手机号集合 不传为全部") private List<String> phone; @ApiModelProperty("优惠券id") private Long couponId; } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCouponService.java
@@ -3,11 +3,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.dto.SendCouponDto; import com.xiaopeng.account.model.query.XpUserCouponListQuery; import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.common.core.domain.R; import java.util.List; @@ -24,17 +26,17 @@ /** * 获取用户优惠券列表 * @param query * @param uid * @param phone * @return */ XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String uid); XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String phone); /**+ * 获取用户优惠券数量total * @param uid * @param phone * @return */ XpAppUserCouponTotalVo userCouponTotal(String uid); XpAppUserCouponTotalVo userCouponTotal(String phone); /** * 领取优惠券 @@ -52,4 +54,11 @@ List<XpAppUserCoupon> timeRule(List<XpAppUserCoupon> couponList); /** * 发送优惠券 * @param dto * @return */ R<String> send(SendCouponDto dto); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -7,17 +7,24 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.account.mapper.XpAppUserCouponMapper; import com.xiaopeng.account.model.dto.ReceiveCouponDto; import com.xiaopeng.account.model.dto.SendCouponDto; import com.xiaopeng.account.model.query.XpUserCouponListQuery; import com.xiaopeng.account.model.vo.XpAppUserCouponListVo; import com.xiaopeng.account.model.vo.XpAppUserCouponTotalVo; import com.xiaopeng.account.model.vo.XpAppUserCouponVo; import com.xiaopeng.account.service.IXpAppUserCouponService; import com.xiaopeng.account.util.holiday.HolidayUtil; import com.xiaopeng.api.feignClient.operation.XpCouponClient; import com.xiaopeng.api.feignClient.operation.XpWhiteListClient; import com.xiaopeng.api.model.account.XpAppUserCoupon; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.api.model.operation.XpWhitelist; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.utils.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -36,16 +43,22 @@ @Autowired private HolidayUtil holidayUtil; @Autowired private XpCouponClient xpCouponClient; @Autowired private XpWhiteListClient xpWhiteListClient; /** * 获取用户优惠券列表 * @param query * @param uid * @param phone * @return */ @Override public XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String uid) { public XpAppUserCouponVo userCouponList(XpUserCouponListQuery query, String phone) { Page<XpAppUserCouponListVo> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<XpAppUserCouponListVo> list = baseMapper.userCouponList(page, query, Long.valueOf(uid)); Page<XpAppUserCouponListVo> list = baseMapper.userCouponList(page, query, phone); XpAppUserCouponVo vo = new XpAppUserCouponVo(); vo.setTotal((int) page.getTotal()); vo.setList(list.getRecords()); @@ -54,12 +67,12 @@ /** * 获取用户优惠券数量total * @param uid * @param phone * @return */ @Override public XpAppUserCouponTotalVo userCouponTotal(String uid) { List<XpAppUserCoupon> couponList = baseMapper.selectList(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getAppUserId, uid)); public XpAppUserCouponTotalVo userCouponTotal(String phone) { List<XpAppUserCoupon> couponList = baseMapper.selectList(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getPhone, phone)); XpAppUserCouponTotalVo vo = new XpAppUserCouponTotalVo(); vo.setAvailableNum((int) couponList.stream().filter(e -> e.getStatus() == 1).count()); vo.setUsedNum((int) couponList.stream().filter(e -> e.getStatus() == 2).count()); @@ -104,6 +117,46 @@ return xpAppUserCoupons; } /** * 发送优惠券 * @param dto * @return */ @Override public R<String> send(SendCouponDto dto) { R<XpCoupon> coupon = xpCouponClient.getCouponById(dto.getCouponId()); if(coupon!=null){ XpCoupon xpCoupon = coupon.getData(); if(dto.getPhone()==null){ // 全部发放 R<List<String>> allWhiteList = xpWhiteListClient.getAllWhiteList(); if(allWhiteList!=null){ List<String> phoneList = allWhiteList.getData(); dto.setPhone(phoneList); } } for (String phone : dto.getPhone()) { XpAppUserCoupon xpAppUserCoupon = new XpAppUserCoupon(); xpAppUserCoupon.setFullMoney(xpCoupon.getConditionalAmount()); xpAppUserCoupon.setMoney(xpCoupon.getAmount()); xpAppUserCoupon.setCouponId(dto.getCouponId()); xpAppUserCoupon.setExpirationTime(LocalDateTime.now().plusDays(100)); xpAppUserCoupon.setStatus(0); xpAppUserCoupon.setCouponType(xpCoupon.getCouponType()); xpAppUserCoupon.setPhone( phone); xpAppUserCoupon.setCouponName(xpCoupon.getCouponName()); xpAppUserCoupon.setOpenCityId("0"); xpAppUserCoupon.setTimeJson("[{\"time\": [\"00:00-23:59\"], \"type\": 3, \"typeStr\": 0}]"); baseMapper.insert(xpAppUserCoupon); } } return null; } /** * 是否在运营内 xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCouponMapper.xml
@@ -23,7 +23,7 @@ else status end as `status` FROM xp_app_user_coupon WHERE app_user_id = #{uid} WHERE phone = #{phone} ) as t where 1=1 <if test="query.status != null"> xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpCouponClientFallbackFactory.java
New file @@ -0,0 +1,27 @@ package com.xiaopeng.api.factory.operation; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.feignClient.operation.XpCouponClient; import com.xiaopeng.api.feignClient.operation.XpPricingClient; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.api.model.operation.XpPricing; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; @Slf4j @Component public class XpCouponClientFallbackFactory implements FallbackFactory<XpCouponClient> { @Override public XpCouponClient create(Throwable cause) { return new XpCouponClient() { @Override public R<XpCoupon> getCouponById(Long couponId) { log.error("XpCouponClientFallbackFactory getCouponById error:{}", cause.getMessage()); return null; } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/factory/operation/XpWhiteListClientFallbackFactory.java
New file @@ -0,0 +1,26 @@ package com.xiaopeng.api.factory.operation; import com.xiaopeng.api.feignClient.operation.XpCouponClient; import com.xiaopeng.api.feignClient.operation.XpWhiteListClient; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.common.core.domain.R; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.util.List; @Slf4j @Component public class XpWhiteListClientFallbackFactory implements FallbackFactory<XpWhiteListClient> { @Override public XpWhiteListClient create(Throwable cause) { return new XpWhiteListClient() { @Override public R<List<String>> getAllWhiteList() { return null; } }; } } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpCouponClient.java
New file @@ -0,0 +1,24 @@ package com.xiaopeng.api.feignClient.operation; import com.xiaopeng.api.factory.operation.XpCouponClientFallbackFactory; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @FeignClient(contextId = "XpCouponClient", value = ServiceNameConstantsEnum.XP_OPERATION_SERVICE, fallbackFactory = XpCouponClientFallbackFactory.class) public interface XpCouponClient { /** * 根据优惠券id获取优惠券信息 * @param couponId * @return */ @PostMapping("/inner/xp-coupon/getCouponById") R<XpCoupon> getCouponById(@RequestParam Long couponId); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/feignClient/operation/XpWhiteListClient.java
New file @@ -0,0 +1,29 @@ package com.xiaopeng.api.feignClient.operation; import com.xiaopeng.api.dto.operation.LonLatDto; import com.xiaopeng.api.factory.operation.XpPricingClientFallbackFactory; import com.xiaopeng.api.factory.operation.XpWhiteListClientFallbackFactory; import com.xiaopeng.api.model.operation.XpPricing; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.dto.ServiceNameConstantsEnum; 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; @FeignClient(contextId = "XpWhiteListClient", value = ServiceNameConstantsEnum.XP_OPERATION_SERVICE, fallbackFactory = XpWhiteListClientFallbackFactory.class) public interface XpWhiteListClient { /** * 获取所有白名单手机号 * @return */ @PostMapping("/inner/getAllWhiteList") R<List<String>> getAllWhiteList(); } xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCoupon.java
@@ -52,6 +52,10 @@ @ApiModelProperty(value = "用户id") private Long appUserId; @ApiModelProperty(value = "手机号") private String phone; @ApiModelProperty(value = "优惠券发放id") private Long couponId; xp-robotaxi-api/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -17,6 +17,8 @@ com.xiaopeng.api.factory.account.XpOperationUserClientFallbackFactory com.xiaopeng.api.factory.operation.XpElectronicClientFallbackFactory com.xiaopeng.api.factory.operation.XpOpenCityClientFallbackFactory com.xiaopeng.api.factory.operation.XpCouponClientFallbackFactory com.xiaopeng.api.factory.operation.XpWhiteListClientFallbackFactory com.xiaopeng.api.factory.operation.ReassignOrderClientFallbackFactory com.xiaopeng.api.factory.vehicleConvoy.UserVehicleClientFallbackFactory com.xiaopeng.api.factory.vehicleConvoy.XpFleetOperationsClientFallbackFactory xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpCouponController.java
@@ -1,9 +1,14 @@ package com.xiaopeng.operation.controller; import com.xiaopeng.api.model.operation.XpCoupon; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.operation.service.IXpCouponService; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestParam; /** * <p> @@ -14,7 +19,20 @@ * @since 2026-02-03 */ @Controller @RequestMapping("/xp-coupon") @RequestMapping("") public class XpCouponController { private final IXpCouponService xpCouponService; public XpCouponController(IXpCouponService xpCouponService) { this.xpCouponService = xpCouponService; } @PostMapping("/inner/xp-coupon/getCouponById") public R<XpCoupon> getCouponById(@RequestParam Long couponId){ XpCoupon xpCoupon = xpCouponService.getById(couponId); return R.ok(xpCoupon); } } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/controller/XpWhitelistController.java
@@ -72,6 +72,17 @@ @Resource private TokenService tokenService; /** * 获取所有白名单手机号 * @return */ @PostMapping("/inner/getAllWhiteList") public R<List<String>> getAllWhiteList(){ return R.ok(xpWhitelistService.getAllWhiteList()); } @ApiOperation(value = "白名单管理分页列表", response = XpWhitelist.class) @PostMapping("/pageList") public R<PageInfo<XpWhitelist>> pageList(@RequestBody WhitelistPageListQuery query) { xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/IXpWhitelistService.java
@@ -34,4 +34,8 @@ R deleteByIds(List<Long> ids, SysUser sysUser); R freezeByIds(List<Long> ids, SysUser sysUser); List<String> getAllWhiteList(); } xp-robotaxi-operation-boot/src/main/java/com/xiaopeng/operation/service/impl/XpWhitelistServiceImpl.java
@@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -182,4 +183,14 @@ xpWhitelistOperlogMapper.insert(xpWhitelistOperlog); return R.ok(); } /** * 获取所有白名单 * @return */ @Override public List<String> getAllWhiteList() { return lambdaQuery().select(XpWhitelist::getAccount).list() .stream().map(XpWhitelist::getAccount).collect(Collectors.toList()); } }