订单业务功能开发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) {
List<ClientAddress> clientAddresses = addressService.queryAddressList(clientId);
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);
}

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

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

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

@ -5,7 +5,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel(description = "添加散户地址 Request VO")
@ApiModel(description = "散户地址 Response VO")
@Data
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 = "废品预估重量不能为空")
private ProductWeightEnum predictWeight;
@ApiModelProperty(value = "散户地址", required = true, example = "xxx市yyy区")
@ApiModelProperty(value = "散户地址", required = true, example = "1768203816228900865")
@NotBlank(message = "散户地址不能为空")
private String recycleAddress;
private String clientAddressId;
@ApiModelProperty(value = "当前位置", required = true)
@NotNull(message = "位置定位信息未授权")

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

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

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

@ -6,10 +6,7 @@ import cc.yunxi.common.exception.ForbiddenException;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.Client;
import cc.yunxi.domain.po.PriceProduct;
import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.po.RecycleOrderProduct;
import cc.yunxi.domain.po.*;
import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorder.*;
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.IRecycleOrderProductService;
import cc.yunxi.service.IRecycleOrderService;
import cc.yunxi.service.IRecycleStationService;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -53,6 +51,9 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
@Resource
private IRecycleOrderProductService recycleOrderProductService;
@Resource
private IRecycleStationService recycleStationService;
public Page<RecycleOrder> queryOrderByPage(RecycleOrderQuery recycleOrderQuery) {
LambdaQueryWrapper<RecycleOrder> wrapper = new LambdaQueryWrapper<>();
@ -95,9 +96,17 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
// 查询散户是否存在
Client client = clientService.getClientById(orderCreateVO.getClientId());
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) -> {
target.setLatitude(source.getLocation().getLatitude());

Loading…
Cancel
Save