xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCollectAddrController.java
New file @@ -0,0 +1,71 @@ package com.xiaopeng.account.controller; import com.xiaopeng.account.model.dto.CollectAddrDTO; import com.xiaopeng.account.model.query.XpUserCollectAddrListQuery; import com.xiaopeng.account.model.vo.XpAppUserCollectAddrVO; import com.xiaopeng.account.service.IXpAppUserCollectAddrService; import com.xiaopeng.common.core.domain.R; import com.xiaopeng.common.core.web.page.PageInfo; import com.xiaopeng.unifiedverification.interceptor.XpClientCheck; import io.swagger.annotations.ApiOperation; import org.springframework.validation.annotation.Validated; 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.servlet.http.HttpServletRequest; /** * <p> * 用户收藏地址 前端控制器 * </p> * * @author ck * @since 2026-04-10 */ @RestController @RequestMapping("") public class XpAppUserCollectAddrController { private final IXpAppUserCollectAddrService xpAppUserCollectAddrService; public XpAppUserCollectAddrController(IXpAppUserCollectAddrService xpAppUserCollectAddrService) { this.xpAppUserCollectAddrService = xpAppUserCollectAddrService; } /** * 收藏地址/取消收藏地址 */ @PostMapping("/api/v1/mini-program/collect/addr") @ApiOperation(value = "收藏/取消收藏地址", tags = {"小程序-收藏/取消收藏地址"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R<String> collectAddr(@Validated @RequestBody CollectAddrDTO dto, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); boolean result = xpAppUserCollectAddrService.collectAddr(dto, uid); if (result) { return R.ok(); } return R.fail(); } /** * 获取收藏夹收藏地址列表 */ @PostMapping("/api/v1/mini-program/collect/addrlist") @ApiOperation(value = "收藏夹", tags = {"小程序-获取用户收藏夹收藏地址列表"}) @XpClientCheck(checkToken = false, checkOtpToken = true) public R<PageInfo<XpAppUserCollectAddrVO>> collectAddrlist(@RequestBody XpUserCollectAddrListQuery query, HttpServletRequest request) { // uid已通过拦截器otp校验,可以直接使用 String uid = request.getHeader("XP-Uid"); return R.ok(xpAppUserCollectAddrService.userCollectAddrList(query, uid)); } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCollectAddrMapper.java
New file @@ -0,0 +1,21 @@ package com.xiaopeng.account.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xiaopeng.account.model.query.XpUserCollectAddrListQuery; import com.xiaopeng.account.model.vo.XpAppUserCollectAddrVO; import com.xiaopeng.api.model.account.XpAppUserCollectAddr; import org.apache.ibatis.annotations.Param; /** * <p> * 用户收藏地址Mapper 接口 * </p> * * @author mitao * @since 2026-02-03 */ public interface XpAppUserCollectAddrMapper extends BaseMapper<XpAppUserCollectAddr> { Page<XpAppUserCollectAddrVO> userCollectAddrPageList(@Param("page") Page<XpAppUserCollectAddrVO> page, @Param("query") XpUserCollectAddrListQuery query, @Param("uid") Long uid); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/dto/CollectAddrDTO.java
New file @@ -0,0 +1,25 @@ package com.xiaopeng.account.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel("收藏地址/取消收藏参数") public class CollectAddrDTO { @ApiModelProperty("1=收藏 2=取消收藏") @NotNull(message = "类型不能为空") private Integer type; @ApiModelProperty(value = "经度") @NotNull(message = "经度不能为空") private Double longitude; @ApiModelProperty(value = "纬度") @NotNull(message = "纬度不能为空") private Double latitude; } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/query/XpUserCollectAddrListQuery.java
New file @@ -0,0 +1,11 @@ package com.xiaopeng.account.model.query; import com.xiaopeng.common.core.web.page.BasePage; import io.swagger.annotations.ApiModel; import lombok.Data; @Data @ApiModel(value = "用户收藏地址列表查询参数") public class XpUserCollectAddrListQuery extends BasePage { } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCollectAddrVO.java
New file @@ -0,0 +1,21 @@ package com.xiaopeng.account.model.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data @ApiModel("用户收藏地址-列表Vo") public class XpAppUserCollectAddrVO { @ApiModelProperty(value = "经度") private Double longitude; @ApiModelProperty(value = "纬度") private Double latitude; } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponTotalVo.java
@@ -7,6 +7,11 @@ @Data @ApiModel("用户优惠券数量Vo") public class XpAppUserCouponTotalVo { //待领取数量 @ApiModelProperty(value = "待领取数量") private Integer awaitReceiveNum; // 可用数量 @ApiModelProperty(value = "可用数量") private Integer availableNum; xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCollectAddrService.java
New file @@ -0,0 +1,39 @@ package com.xiaopeng.account.service; import com.baomidou.mybatisplus.extension.service.IService; import com.xiaopeng.account.model.dto.CollectAddrDTO; import com.xiaopeng.account.model.query.XpUserCollectAddrListQuery; import com.xiaopeng.account.model.vo.XpAppUserCollectAddrVO; import com.xiaopeng.api.model.account.XpAppUserCollectAddr; import com.xiaopeng.common.core.web.page.PageInfo; /** * <p> * 用户收藏地址 服务类 * </p> * * @author ck * @since 2026-04-10 */ public interface IXpAppUserCollectAddrService extends IService<XpAppUserCollectAddr> { /** * 收藏地址 * * @param dto * @param uid * @return */ Boolean collectAddr(CollectAddrDTO dto, String uid); /** * 收藏地址分页列表 * * @param uid * @return */ PageInfo<XpAppUserCollectAddrVO> userCollectAddrList(XpUserCollectAddrListQuery query, String uid); } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCollectAddrServiceImpl.java
New file @@ -0,0 +1,81 @@ package com.xiaopeng.account.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.xiaopeng.account.mapper.XpAppUserCollectAddrMapper; import com.xiaopeng.account.model.dto.CollectAddrDTO; import com.xiaopeng.account.model.query.XpUserCollectAddrListQuery; import com.xiaopeng.account.model.vo.XpAppUserCollectAddrVO; import com.xiaopeng.account.service.IXpAppUserCollectAddrService; import com.xiaopeng.api.model.account.XpAppUserCollectAddr; import com.xiaopeng.common.core.exception.ServiceException; import com.xiaopeng.common.core.web.page.PageInfo; /** * <p> * 用户收藏地址 服务实现类 * </p> * * @author ck * @since 2026-04-10 */ public class XpAppUserCollectAddrServiceImpl extends ServiceImpl<XpAppUserCollectAddrMapper, XpAppUserCollectAddr> implements IXpAppUserCollectAddrService { /** * 收藏地址 * * @param dto * @param uid * @return */ @Override public Boolean collectAddr(CollectAddrDTO dto, String uid) { if (dto.getType() == 1) { Long count = this.count(new LambdaQueryWrapper<XpAppUserCollectAddr>() .eq(XpAppUserCollectAddr::getAppUserId, Long.parseLong(uid)) .eq(XpAppUserCollectAddr::getDeleted, 0)); if (count >= 50) { throw new ServiceException("收藏夹已满,请先删除旧地址"); } Long old = this.count(new LambdaQueryWrapper<XpAppUserCollectAddr>() .eq(XpAppUserCollectAddr::getAppUserId, Long.parseLong(uid)) .eq(XpAppUserCollectAddr::getDeleted, 0).eq(XpAppUserCollectAddr::getLongitude, dto.getLongitude()) .eq(XpAppUserCollectAddr::getLatitude, dto.getLatitude())); if (old > 0) { return true; } XpAppUserCollectAddr xpAppUserCollectAddr = new XpAppUserCollectAddr(); xpAppUserCollectAddr.setAppUserId(Long.parseLong(uid)); xpAppUserCollectAddr.setLatitude(dto.getLatitude()); xpAppUserCollectAddr.setLongitude(dto.getLongitude()); return this.save(xpAppUserCollectAddr); } else { XpAppUserCollectAddr xpAppUserCollectAddr = this.getOne(new LambdaQueryWrapper<XpAppUserCollectAddr>() .eq(XpAppUserCollectAddr::getAppUserId, Long.parseLong(uid)) .eq(XpAppUserCollectAddr::getDeleted, 0).eq(XpAppUserCollectAddr::getLongitude, dto.getLongitude()) .eq(XpAppUserCollectAddr::getLatitude, dto.getLatitude()).last("limit 1")); if (xpAppUserCollectAddr != null) { return this.removeById(xpAppUserCollectAddr.getId()); } } return false; } /** * 收藏地址列表 * * @param uid * @return */ @Override public PageInfo<XpAppUserCollectAddrVO> userCollectAddrList(XpUserCollectAddrListQuery query, String uid) { Page<XpAppUserCollectAddrVO> page = new Page<>(query.getPageNum(), query.getPageSize()); Page<XpAppUserCollectAddrVO> pageData = this.baseMapper.userCollectAddrPageList(page, query, Long.parseLong(uid)); PageInfo<XpAppUserCollectAddrVO> resultPage = new PageInfo<>(query.getPageNum(), query.getPageSize()); resultPage.setTotal(pageData.getTotal()); resultPage.setRecords(pageData.getRecords()); return resultPage; } } xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java
@@ -82,6 +82,7 @@ public XpAppUserCouponTotalVo userCouponTotal(String uid) { List<XpAppUserCoupon> couponList = baseMapper.selectList(new LambdaQueryWrapper<XpAppUserCoupon>().eq(XpAppUserCoupon::getAppUserId, uid)); XpAppUserCouponTotalVo vo = new XpAppUserCouponTotalVo(); vo.setAwaitReceiveNum((int) couponList.stream().filter(e -> e.getStatus() == 0).count()); vo.setAvailableNum((int) couponList.stream().filter(e -> e.getStatus() == 1).count()); vo.setUsedNum((int) couponList.stream().filter(e -> e.getStatus() == 2).count()); vo.setExpiredNum((int) couponList.stream().filter(e -> e.getStatus() == 3).count()); xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCollectAddrMapper.xml
New file @@ -0,0 +1,12 @@ <?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.xiaopeng.account.mapper.XpAppUserCollectAddrMapper"> <select id="userCollectAddrPageList" resultType="com.xiaopeng.account.model.vo.XpAppUserCollectAddrVO"> select longitude,latitude from xp_app_user_collect_addr WHERE app_user_id = #{uid} and is_deleted = 0 order by create_time asc </select> </mapper> xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCollectAddr.java
New file @@ -0,0 +1,43 @@ package com.xiaopeng.api.model.account; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.xiaopeng.common.core.web.domain.BaseModel; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import javax.validation.constraints.NotNull; /** * <p> * 用户收藏地址 * </p> * * @author mitao * @since 2026-02-03 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("xp_app_user_collect_addr") @ApiModel(value="XpAppUserCollectAddr对象", description="用户收藏地址") public class XpAppUserCollectAddr extends BaseModel { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.ASSIGN_ID) private Long id; @ApiModelProperty(value = "用户id") private Long appUserId; @ApiModelProperty(value = "经度") private Double longitude; @ApiModelProperty(value = "纬度") private Double latitude; }