订单业务功能开发v12 订单地址功能关联 & 订单下单业务逻辑完善

wxpay
LI-CCONG\李聪聪 7 months ago
parent cc1dec1d5a
commit 03bdeca486

@ -37,7 +37,7 @@ public class ClientAddressController {
public CommonResult<List<ClientAddressReqVO>> queryAddressList(@RequestParam("clientId") String clientId) { public CommonResult<List<ClientAddressReqVO>> queryAddressList(@RequestParam("clientId") String clientId) {
List<ClientAddress> clientAddresses = addressService.queryAddressList(clientId); List<ClientAddress> clientAddresses = addressService.queryAddressList(clientId);
List<ClientAddressReqVO> addressRespVOList = BeanUtils.copyList(clientAddresses, ClientAddressReqVO.class, (s, t) -> { List<ClientAddressReqVO> addressRespVOList = BeanUtils.copyList(clientAddresses, ClientAddressReqVO.class, (s, t) -> {
t.setLocationDTO(new LocationDTO(s.getLongitude(), s.getLatitude())); t.setLocation(new LocationDTO(s.getLongitude(), s.getLatitude()));
}); });
return CommonResult.success(addressRespVOList); return CommonResult.success(addressRespVOList);
} }

@ -9,14 +9,17 @@ import cc.yunxi.common.utils.CollUtils;
import cc.yunxi.common.utils.CommonUtil; import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.dto.UserDTO; import cc.yunxi.domain.dto.UserDTO;
import cc.yunxi.domain.po.ClientAddress;
import cc.yunxi.domain.po.Product; import cc.yunxi.domain.po.Product;
import cc.yunxi.domain.po.RecycleOrderProduct; import cc.yunxi.domain.po.RecycleOrderProduct;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;
import cc.yunxi.domain.vo.priceproduct.ProductSimpleVO; import cc.yunxi.domain.vo.priceproduct.ProductSimpleVO;
import cc.yunxi.domain.vo.recycleorder.*; import cc.yunxi.domain.vo.recycleorder.*;
import cc.yunxi.domain.po.RecycleOrder; import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.query.RecycleOrderQuery; import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.service.IClientAddressService;
import cc.yunxi.service.IPriceProductService; import cc.yunxi.service.IPriceProductService;
import cc.yunxi.service.IRecycleOrderProductService; import cc.yunxi.service.IRecycleOrderProductService;
import cc.yunxi.service.IRecycleOrderService; import cc.yunxi.service.IRecycleOrderService;
@ -52,6 +55,8 @@ public class RecycleOrderController {
private final IPriceProductService priceProductService; private final IPriceProductService priceProductService;
private final IClientAddressService clientAddressService;
@ApiOperation("分页查询回收订单") @ApiOperation("分页查询回收订单")
@PostMapping("/page") @PostMapping("/page")
public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) { public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) {
@ -154,22 +159,32 @@ public class RecycleOrderController {
} }
/** /**
* - *
* @param orderRespVOList * @param orderRespVOList
* @param locationDTO * @param locationDTO
*/ */
private void assembleOrderDetailsInfo(List<RecycleOrderRespVO> orderRespVOList, LocationDTO locationDTO) { private void assembleOrderDetailsInfo(List<RecycleOrderRespVO> orderRespVOList, LocationDTO locationDTO) {
if (CollUtils.isEmpty(orderRespVOList)) return; if (CollUtils.isEmpty(orderRespVOList)) return;
// 废品关联信息
List<String> orderIds = orderRespVOList.stream().map(RecycleOrderRespVO::getId).collect(Collectors.toList()); List<String> orderIds = orderRespVOList.stream().map(RecycleOrderRespVO::getId).collect(Collectors.toList());
List<RecycleOrderProduct> orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(orderIds); List<RecycleOrderProduct> orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(orderIds);
List<RecycleOrderDetailResponseVO> detailResponseVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class); List<RecycleOrderDetailResponseVO> detailResponseVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class);
this.assembleProductInfo(detailResponseVOList); this.assembleProductInfo(detailResponseVOList);
Map<String, List<RecycleOrderDetailResponseVO>> orderProductsMap = Map<String, List<RecycleOrderDetailResponseVO>> orderProductsMap =
detailResponseVOList.stream().collect(Collectors.groupingBy(RecycleOrderDetailResponseVO::getRecycleOrderId)); detailResponseVOList.stream().collect(Collectors.groupingBy(RecycleOrderDetailResponseVO::getRecycleOrderId));
// 地址关联信息
Map<String, String> orderAddressMap = orderRespVOList.stream().collect(Collectors.toMap(
RecycleOrderRespVO::getId, RecycleOrderRespVO::getClientAddressId));
Set<String> addressIds = new HashSet<>(orderAddressMap.values());
List<ClientAddress> clientAddresses = clientAddressService.queryAddressList(addressIds);
List<ClientAddressSimpleVO> addressSimpleVOList = BeanUtils.copyList(clientAddresses, ClientAddressSimpleVO.class);
Map<String, ClientAddressSimpleVO> clientAddressMap = addressSimpleVOList.stream().collect(Collectors.toMap(
ClientAddressSimpleVO::getId, cas -> cas));
for (RecycleOrderRespVO orderRespVO : orderRespVOList) { for (RecycleOrderRespVO orderRespVO : orderRespVOList) {
this.computeOrderDistance(orderRespVO, locationDTO); this.computeOrderDistance(orderRespVO, locationDTO);
List<RecycleOrderDetailResponseVO> orderDetails = orderProductsMap.get(orderRespVO.getId()); List<RecycleOrderDetailResponseVO> orderDetails = orderProductsMap.get(orderRespVO.getId());
orderRespVO.setOrderDetails(orderDetails); orderRespVO.setOrderDetails(orderDetails);
orderRespVO.setAddressInfo(clientAddressMap.get(orderRespVO.getClientAddressId()));
} }
} }

@ -63,17 +63,13 @@ public class RecycleOrder {
@TableField("client_name") @TableField("client_name")
private String clientName; private String clientName;
@ApiModelProperty(value = "废品预估重量", required = true)
@TableField("predict_weight")
private ProductWeightEnum predictWeight;
@ApiModelProperty("散户手机号") @ApiModelProperty("散户手机号")
@TableField("client_mobile") @TableField("client_mobile")
private String clientMobile; private String clientMobile;
@ApiModelProperty("散户下单地址") @ApiModelProperty("散户下单地址")
@TableField("recycle_address") @TableField("client_address_id")
private String recycleAddress; private String clientAddressId;
@ApiModelProperty("下单地址-经度") @ApiModelProperty("下单地址-经度")
@TableField("longitude") @TableField("longitude")
@ -83,6 +79,10 @@ public class RecycleOrder {
@TableField("latitude") @TableField("latitude")
private String latitude; private String latitude;
@ApiModelProperty(value = "废品预估重量", required = true)
@TableField("predict_weight")
private ProductWeightEnum predictWeight;
@ApiModelProperty("回收员id") @ApiModelProperty("回收员id")
@TableField("staffs_id") @TableField("staffs_id")
private String staffsId; private String staffsId;

@ -9,7 +9,7 @@ import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import javax.validation.groups.Default; import javax.validation.groups.Default;
@ApiModel(description = "添加散户地址 Request VO") @ApiModel(description = "散户地址 Request VO")
@Data @Data
public class ClientAddressReqVO { public class ClientAddressReqVO {
@ -47,7 +47,7 @@ public class ClientAddressReqVO {
@ApiModelProperty(value = "位置信息",required = true) @ApiModelProperty(value = "位置信息",required = true)
@NotNull(message = "位置信息不能为空") @NotNull(message = "位置信息不能为空")
private LocationDTO locationDTO; private LocationDTO location;
@ApiModelProperty(value = "是否默认1是0否",required = true) @ApiModelProperty(value = "是否默认1是0否",required = true)
@NotNull(message = "默认地址不能为空", groups = AddAddressGroup.class) @NotNull(message = "默认地址不能为空", groups = AddAddressGroup.class)

@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
@ApiModel(description = "添加散户地址 Request VO") @ApiModel(description = "散户地址 Response VO")
@Data @Data
public class ClientAddressRespVO { public class ClientAddressRespVO {

@ -0,0 +1,30 @@
package cc.yunxi.domain.vo.clientaddress;
import cc.yunxi.domain.dto.LocationDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(description = "散户地址 Simple VO")
@Data
public class ClientAddressSimpleVO {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("散户id")
private String clientId;
@ApiModelProperty("联系人姓名")
private String receiveUserName;
@ApiModelProperty("联系人手机号")
private String receiveMobilePhone;
@ApiModelProperty("地址")
private String receiveStreet;
@ApiModelProperty("门牌号")
private String receiveHouseNumber;
}

@ -34,9 +34,9 @@ public class RecycleOrderCreateVO {
@NotNull(message = "废品预估重量不能为空") @NotNull(message = "废品预估重量不能为空")
private ProductWeightEnum predictWeight; private ProductWeightEnum predictWeight;
@ApiModelProperty(value = "散户地址", required = true, example = "xxx市yyy区") @ApiModelProperty(value = "散户地址", required = true, example = "1768203816228900865")
@NotBlank(message = "散户地址不能为空") @NotBlank(message = "散户地址不能为空")
private String recycleAddress; private String clientAddressId;
@ApiModelProperty(value = "当前位置", required = true) @ApiModelProperty(value = "当前位置", required = true)
@NotNull(message = "位置定位信息未授权") @NotNull(message = "位置定位信息未授权")

@ -1,6 +1,7 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.enums.OrderStatusEnum; import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum; import cc.yunxi.enums.OrderTypeEnum;
@ -53,8 +54,8 @@ public class RecycleOrderRespVO {
@ApiModelProperty("散户手机号") @ApiModelProperty("散户手机号")
private String clientMobile; private String clientMobile;
@ApiModelProperty("散户地址") @ApiModelProperty("散户地址id")
private String recycleAddress; // todo private String clientAddressId;
@ApiModelProperty("预估重量") @ApiModelProperty("预估重量")
private ProductWeightEnum predictWeight; private ProductWeightEnum predictWeight;
@ -125,6 +126,9 @@ public class RecycleOrderRespVO {
@ApiModelProperty("订单距离(回收员专用)") @ApiModelProperty("订单距离(回收员专用)")
private String distance; private String distance;
@ApiModelProperty("散户地址信息")
private ClientAddressSimpleVO addressInfo;
@ApiModelProperty("订单明细详情") @ApiModelProperty("订单明细详情")
private List<RecycleOrderDetailResponseVO> orderDetails; private List<RecycleOrderDetailResponseVO> orderDetails;

@ -1,11 +1,13 @@
package cc.yunxi.service; package cc.yunxi.service;
import cc.yunxi.domain.po.ClientAddress; import cc.yunxi.domain.po.ClientAddress;
import cc.yunxi.domain.po.RecycleOrderProduct;
import cc.yunxi.domain.vo.clientaddress.ClientAddressReqVO; import cc.yunxi.domain.vo.clientaddress.ClientAddressReqVO;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
@ -27,6 +29,15 @@ public interface IClientAddressService extends IService<ClientAddress> {
List<ClientAddress> queryAddressList(String clientId); List<ClientAddress> queryAddressList(String clientId);
/**
* id
* @param addressIds
* @return List<RecycleOrderProduct>
*/
List<ClientAddress> queryAddressList(Collection<String> addressIds);
/** /**
* *
* @param addressId * @param addressId

@ -15,6 +15,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List; import java.util.List;
/** /**
@ -37,6 +38,7 @@ public class ClientAddressServiceImpl extends ServiceImpl<ClientAddressMapper, C
return queryAddressList(clientId, null); return queryAddressList(clientId, null);
} }
private List<ClientAddress> queryAddressList(String clientId, String excludeId) { private List<ClientAddress> queryAddressList(String clientId, String excludeId) {
LambdaQueryWrapperX<ClientAddress> wrapperX = new LambdaQueryWrapperX<>(); LambdaQueryWrapperX<ClientAddress> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eq(ClientAddress::getClientId, clientId).orderByDesc(ClientAddress::getIsDefault); wrapperX.eq(ClientAddress::getClientId, clientId).orderByDesc(ClientAddress::getIsDefault);
@ -44,6 +46,14 @@ public class ClientAddressServiceImpl extends ServiceImpl<ClientAddressMapper, C
return list(wrapperX); return list(wrapperX);
} }
@Override
public List<ClientAddress> queryAddressList(Collection<String> addressIds) {
LambdaQueryWrapperX<ClientAddress> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.in(ClientAddress::getId, addressIds);
return list(wrapperX);
}
@Override @Override
public ClientAddress getAddressInfo(String addressId) { public ClientAddress getAddressInfo(String addressId) {
if (StrUtil.isEmpty(addressId)) { if (StrUtil.isEmpty(addressId)) {
@ -60,8 +70,8 @@ public class ClientAddressServiceImpl extends ServiceImpl<ClientAddressMapper, C
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public String addAddress(ClientAddressReqVO addressCreateVO) { public String addAddress(ClientAddressReqVO addressCreateVO) {
ClientAddress clientAddress = BeanUtils.copyBean(addressCreateVO, ClientAddress.class, (s, t) -> { ClientAddress clientAddress = BeanUtils.copyBean(addressCreateVO, ClientAddress.class, (s, t) -> {
t.setLongitude(s.getLocationDTO().getLongitude()); t.setLongitude(s.getLocation().getLongitude());
t.setLatitude(s.getLocationDTO().getLatitude()); t.setLatitude(s.getLocation().getLatitude());
}); });
List<ClientAddress> addressList = queryAddressList(addressCreateVO.getClientId()); List<ClientAddress> addressList = queryAddressList(addressCreateVO.getClientId());
if(addressList.size() > LIMIT) { if(addressList.size() > LIMIT) {
@ -94,8 +104,8 @@ public class ClientAddressServiceImpl extends ServiceImpl<ClientAddressMapper, C
} }
} }
ClientAddress clientAddress = BeanUtils.copyBean(addressUpdateVO, ClientAddress.class, (s, t) -> { ClientAddress clientAddress = BeanUtils.copyBean(addressUpdateVO, ClientAddress.class, (s, t) -> {
t.setLongitude(s.getLocationDTO().getLongitude()); t.setLongitude(s.getLocation().getLongitude());
t.setLatitude(s.getLocationDTO().getLatitude()); t.setLatitude(s.getLocation().getLatitude());
}); });
clientAddress.setUpdateTime(LocalDateTime.now()); clientAddress.setUpdateTime(LocalDateTime.now());
this.updateById(clientAddress); this.updateById(clientAddress);

@ -6,10 +6,7 @@ import cc.yunxi.common.exception.ForbiddenException;
import cc.yunxi.common.utils.BeanUtils; import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.CommonUtil; import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.dto.LocationDTO; import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.Client; import cc.yunxi.domain.po.*;
import cc.yunxi.domain.po.PriceProduct;
import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.po.RecycleOrderProduct;
import cc.yunxi.domain.query.RecycleOrderQuery; import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorder.*; import cc.yunxi.domain.vo.recycleorder.*;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailCreateVO;
@ -19,6 +16,7 @@ import cc.yunxi.mapper.RecycleOrderMapper;
import cc.yunxi.service.IClientService; import cc.yunxi.service.IClientService;
import cc.yunxi.service.IRecycleOrderProductService; import cc.yunxi.service.IRecycleOrderProductService;
import cc.yunxi.service.IRecycleOrderService; import cc.yunxi.service.IRecycleOrderService;
import cc.yunxi.service.IRecycleStationService;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -53,6 +51,9 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
@Resource @Resource
private IRecycleOrderProductService recycleOrderProductService; private IRecycleOrderProductService recycleOrderProductService;
@Resource
private IRecycleStationService recycleStationService;
public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) { public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) {
LambdaQueryWrapper<RecycleOrder> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapper<RecycleOrder> wrapper = new LambdaQueryWrapper<>();
@ -95,9 +96,17 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
// 查询散户是否存在 // 查询散户是否存在
Client client = clientService.getClientById(orderCreateVO.getClientId()); Client client = clientService.getClientById(orderCreateVO.getClientId());
if (ObjectUtil.isEmpty(client)) { if (ObjectUtil.isEmpty(client)) {
throw new DbException("散户不存在"); throw new DbException("散户不存在!");
}
// 判断下单地址和回收站的距离
LocationDTO location = orderCreateVO.getLocation();
RecycleStation recycleStation = recycleStationService.getStationById(orderCreateVO.getRecycleStationId());
BigDecimal distance = CommonUtil.getDistance(location.getLongitude(), location.getLatitude(),
recycleStation.getLongitude(), recycleStation.getLatitude());
BigDecimal acceptRange = new BigDecimal(recycleStation.getAcceptRange());
if (acceptRange.compareTo(distance) < 0) {
throw new BizIllegalException("超出回收站接单范围!");
} }
// 判断下单地址和回收站的距离 todo
// 创建订单 // 创建订单
RecycleOrder recycleOrder = BeanUtils.copyBean(orderCreateVO, RecycleOrder.class, (source, target) -> { RecycleOrder recycleOrder = BeanUtils.copyBean(orderCreateVO, RecycleOrder.class, (source, target) -> {
target.setLatitude(source.getLocation().getLatitude()); target.setLatitude(source.getLocation().getLatitude());

Loading…
Cancel
Save