ck
2026-04-10 ca39e19ed7d785b0bf0db33af837a4b37e858259
add 新增 收藏夹
9个文件已添加
2个文件已修改
330 ■■■■■ 已修改文件
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/controller/XpAppUserCollectAddrController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/mapper/XpAppUserCollectAddrMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/dto/CollectAddrDTO.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/query/XpUserCollectAddrListQuery.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCollectAddrVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/model/vo/XpAppUserCouponTotalVo.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/IXpAppUserCollectAddrService.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCollectAddrServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/java/com/xiaopeng/account/service/impl/XpAppUserCouponServiceImpl.java 1 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-account-boot/src/main/resources/mapper/account/XpAppUserCollectAddrMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
xp-robotaxi-api/src/main/java/com/xiaopeng/api/model/account/XpAppUserCollectAddr.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
}