feat(customer):新增客户端设置地址的相关功能(CRUD+设置默认)

This commit is contained in:
JIAN 2024-08-28 23:14:30 +08:00
parent 2a8830feb7
commit d62a73d0ed
5 changed files with 260 additions and 23 deletions

View File

@ -0,0 +1,84 @@
package com.jzo2o.customer.controller.consumer;
import com.jzo2o.common.expcetions.ForbiddenOperationException;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.customer.enums.AddressDefaultStatusEnum;
import com.jzo2o.customer.model.domain.AddressBook;
import com.jzo2o.customer.model.dto.request.AddressBookPageQueryReqDTO;
import com.jzo2o.customer.model.dto.request.AddressBookUpsertReqDTO;
import com.jzo2o.customer.service.IAddressBookService;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author JIAN
*/
@RestController("consumerAddressBookController")
@RequestMapping("/consumer/address-book")
@Api(tags = "用户端 - 地址簿相关接口")
public class AddressBookController {
@Resource
private IAddressBookService addressBookService;
/**
* 增加地址信息
*/
@PostMapping
public void add(@RequestBody AddressBookUpsertReqDTO addressBookUpsertReqDTO) {
addressBookService.insert(addressBookUpsertReqDTO);
}
/**
* 查询地址信息
*/
@GetMapping("/page")
public PageResult<AddressBook> page(AddressBookPageQueryReqDTO addressBookPageQueryReqDTO) {
return addressBookService.page(addressBookPageQueryReqDTO);
}
/**
* 查询指定id的地址信息(展示详情)
*/
@GetMapping("/{id}")
public AddressBook getById(@PathVariable Long id) {
return addressBookService.getById(id);
}
/**
* 更改指定id的地址信息(修改地址)
*/
@PutMapping("/{id}")
public void updateById(@PathVariable Long id,
@RequestBody AddressBookUpsertReqDTO addressBookUpsertReqDTO) {
addressBookService.updateById(id, addressBookUpsertReqDTO);
}
/**
* 删除指定id的地址信息(逻辑删除)
*/
@DeleteMapping("/batch")
public void deleteBatch(@RequestBody List<Long> ids) {
addressBookService.removeByIds(ids);
}
/**
* 设置默认地址
*/
@PutMapping("/default")
public void updateDefault(@RequestParam Long id, @RequestParam int flag) {
if (flag != AddressDefaultStatusEnum.DEFAULT.getStatus()
&& flag != AddressDefaultStatusEnum.NONE_DEFAULT.getStatus()) {
throw new ForbiddenOperationException("设置的参数有误拒绝请求");
}
addressBookService.updateDefault(id, flag);
}
@GetMapping("/defaultAddress")
public AddressBook getDefaultAddress() {
return addressBookService.getDefaultAddress();
}
}

View File

@ -0,0 +1,15 @@
package com.jzo2o.customer.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 描述用户地址的默认状态
* @author JIAN
*/
@AllArgsConstructor
@Getter
public enum AddressDefaultStatusEnum {
DEFAULT(1), NONE_DEFAULT(0);
private final int status;
}

View File

@ -1,13 +1,14 @@
package com.jzo2o.customer.model.domain;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.io.Serializable;
import lombok.Builder;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* <p>
* 地址薄
@ -17,6 +18,7 @@ import lombok.experimental.Accessors;
* @since 2023-07-06
*/
@Data
@Builder
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("address_book")
@ -83,6 +85,7 @@ public class AddressBook implements Serializable {
/**
* 是否已删除0未删除1已删除
*/
@TableLogic
private Integer isDeleted;
/**
@ -106,6 +109,4 @@ public class AddressBook implements Serializable {
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;
}
}

View File

@ -1,11 +1,11 @@
package com.jzo2o.customer.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.jzo2o.api.customer.dto.response.AddressBookResDTO;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.customer.model.domain.AddressBook;
import com.jzo2o.customer.model.dto.request.AddressBookPageQueryReqDTO;
import com.jzo2o.customer.model.dto.request.AddressBookUpsertReqDTO;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
@ -13,7 +13,6 @@ import java.util.List;
* <p>
* 地址薄 服务类
* </p>
*
* @author itcast
* @since 2023-07-06
*/
@ -21,10 +20,34 @@ public interface IAddressBookService extends IService<AddressBook> {
/**
* 根据用户id和城市编码获取地址
*
* @param userId 用户id
* @param userId 用户id
* @param cityCode 城市编码
* @return 地址编码
*/
List<AddressBookResDTO> getByUserIdAndCity(Long userId, String cityCode);
}
/**
* 增加地址信息
*/
void insert(AddressBookUpsertReqDTO addressBookUpsertReqDTO);
/**
* 查询地址信息
*/
PageResult<AddressBook> page(AddressBookPageQueryReqDTO addressBookPageQueryReqDTO);
/**
* 修改地址信息
*/
void updateById(Long id, AddressBookUpsertReqDTO addressBookUpsertReqDTO);
/**
* 修改默认地址
*/
void updateDefault(Long id, int flag);
/**
* 获取用户默认地址
*/
AddressBook getDefaultAddress();
}

View File

@ -1,31 +1,28 @@
package com.jzo2o.customer.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jzo2o.api.customer.dto.response.AddressBookResDTO;
import com.jzo2o.api.publics.MapApi;
import com.jzo2o.api.publics.dto.response.LocationResDTO;
import com.jzo2o.common.expcetions.CommonException;
import com.jzo2o.common.expcetions.ServerErrorException;
import com.jzo2o.common.model.PageResult;
import com.jzo2o.customer.enums.AddressDefaultStatusEnum;
import com.jzo2o.common.handler.UserInfoHandler;
import com.jzo2o.common.model.CurrentUserInfo;
import com.jzo2o.common.utils.BeanUtils;
import com.jzo2o.common.utils.CollUtils;
import com.jzo2o.common.utils.NumberUtils;
import com.jzo2o.common.utils.StringUtils;
import com.jzo2o.common.utils.ObjectUtils;
import com.jzo2o.customer.mapper.AddressBookMapper;
import com.jzo2o.customer.model.domain.AddressBook;
import com.jzo2o.customer.model.dto.request.AddressBookPageQueryReqDTO;
import com.jzo2o.customer.model.dto.request.AddressBookUpsertReqDTO;
import com.jzo2o.customer.service.IAddressBookService;
import com.jzo2o.mvc.utils.UserContext;
import com.jzo2o.mysql.utils.PageUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@ -33,12 +30,32 @@ import java.util.List;
* <p>
* 地址薄 服务实现类
* </p>
*
* @author itcast
* @since 2023-07-06
*/
@Service
public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, AddressBook> implements IAddressBookService {
/**
* 获取当前用户id
*/
private final UserInfoHandler userInfoHandler;
public AddressBookServiceImpl(UserInfoHandler userInfoHandler) {
this.userInfoHandler = userInfoHandler;
}
private Long currentUserId() {
if (ObjectUtils.isEmpty(userInfoHandler)) {
throw new ServerErrorException("不能获取当前用户信息获取地址失败");
} else {
CurrentUserInfo currentUserInfo = userInfoHandler.currentUserInfo();
if (ObjectUtils.isEmpty(currentUserInfo)) {
throw new ServerErrorException("不能获取当前用户信息获取地址失败");
} else {
return currentUserInfo.getId();
}
}
}
@Override
public List<AddressBookResDTO> getByUserIdAndCity(Long userId, String city) {
@ -47,9 +64,106 @@ public class AddressBookServiceImpl extends ServiceImpl<AddressBookMapper, Addre
.eq(AddressBook::getUserId, userId)
.eq(AddressBook::getCity, city)
.list();
if(CollUtils.isEmpty(addressBooks)) {
if (CollUtils.isEmpty(addressBooks)) {
return new ArrayList<>();
}
return BeanUtils.copyToList(addressBooks, AddressBookResDTO.class);
}
}
private AddressBook getAddressBookByUpsertReqDTO(AddressBookUpsertReqDTO addressBookUpsertReqDTO) {
// 解析经纬度
String location = addressBookUpsertReqDTO.getLocation();
Double lon = null, lat = null;
if (!ObjectUtils.isEmpty(location)) {
String[] pos = location.split(",");
if (pos.length == 2) {
lon = Double.parseDouble(pos[0]);
lat = Double.parseDouble(pos[1]);
}
}
// 构建AddressBook实体
return AddressBook.builder()
.userId(currentUserId())
.name(addressBookUpsertReqDTO.getName())
.phone(addressBookUpsertReqDTO.getPhone())
.province(addressBookUpsertReqDTO.getProvince())
.city(addressBookUpsertReqDTO.getCity())
.county(addressBookUpsertReqDTO.getCounty())
.address(addressBookUpsertReqDTO.getAddress())
.isDefault(addressBookUpsertReqDTO.getIsDefault())
.lon(lon).lat(lat).build();
}
@Override
@Transactional
public void insert(AddressBookUpsertReqDTO addressBookUpsertReqDTO) {
// 取消其他默认地址
if (addressBookUpsertReqDTO.getIsDefault() == AddressDefaultStatusEnum.DEFAULT.getStatus()) {
lambdaUpdate()
.eq(AddressBook::getUserId, currentUserId())
.eq(AddressBook::getIsDefault, AddressDefaultStatusEnum.DEFAULT.getStatus())
.set(AddressBook::getIsDefault, AddressDefaultStatusEnum.NONE_DEFAULT.getStatus())
.update();
}
baseMapper.insert(getAddressBookByUpsertReqDTO(addressBookUpsertReqDTO));
}
@Override
public PageResult<AddressBook> page(AddressBookPageQueryReqDTO addressBookPageQueryReqDTO) {
Long userId = currentUserId();
// mybatis-plus会自动筛选逻辑删除的字段
LambdaQueryWrapper<AddressBook> queryWrapper = Wrappers.<AddressBook>lambdaQuery()
.eq(AddressBook::getUserId, userId);
Page<AddressBook> page = PageUtils.parsePageQuery(addressBookPageQueryReqDTO, AddressBook.class);
Page<AddressBook> addressBookPage = baseMapper.selectPage(page, queryWrapper);
return new PageResult<>(addressBookPage.getPages(), addressBookPage.getTotal(), addressBookPage.getRecords());
}
@Override
@Transactional
public void updateById(Long id, AddressBookUpsertReqDTO addressBookUpsertReqDTO) {
AddressBook addressBook = baseMapper.selectById(id);
if (ObjectUtils.isEmpty(addressBook)) {
throw new CommonException("地址id不存在无法更新");
}
addressBook = getAddressBookByUpsertReqDTO(addressBookUpsertReqDTO);
addressBook.setId(id);
baseMapper.updateById(addressBook);
}
@Override
@Transactional
public void updateDefault(Long id, int flag) {
AddressBook addressBook = baseMapper.selectById(id);
if (ObjectUtils.isEmpty(addressBook)) {
throw new CommonException("地址id不存在无法更新");
}
// 取消原有默认地址
lambdaUpdate()
.eq(AddressBook::getUserId, currentUserId())
.eq(AddressBook::getIsDefault, AddressDefaultStatusEnum.DEFAULT.getStatus())
.set(AddressBook::getIsDefault, AddressDefaultStatusEnum.NONE_DEFAULT.getStatus())
.update();
// 设置指定id为默认地址
lambdaUpdate()
.eq(AddressBook::getId, id)
.set(AddressBook::getIsDefault, AddressDefaultStatusEnum.DEFAULT.getStatus())
.update();
}
@Override
public AddressBook getDefaultAddress() {
return lambdaQuery()
.eq(AddressBook::getUserId, currentUserId())
.eq(AddressBook::getIsDefault, AddressDefaultStatusEnum.DEFAULT.getStatus())
.one();
}
}