定点、到站回收订单业务功能开发v2

door
LI-CCONG\李聪聪 7 months ago
parent 19db7d4b03
commit 1b1f9b25bc

@ -11,6 +11,7 @@ import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.dto.UserDTO;
import cc.yunxi.domain.po.*;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;
import cc.yunxi.domain.vo.housingestate.HousingEstateSimpleVO;
import cc.yunxi.domain.vo.priceproduct.ProductSimpleVO;
import cc.yunxi.domain.query.RecycleOrderQuery;
import cc.yunxi.domain.vo.recycleorder.dzorder.DZRecycleOrderCreateVO;
@ -18,6 +19,7 @@ import cc.yunxi.domain.vo.recycleorder.shorder.*;
import cc.yunxi.domain.vo.recycleorder.tmorder.TMRecycleOrderCreateVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.domain.vo.recycler.RecyclerSimpleVO;
import cc.yunxi.enums.OrderTypeEnum;
import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.service.*;
import cc.yunxi.utils.UserContext;
@ -57,6 +59,8 @@ public class RecycleOrderController {
private final IClientAddressService clientAddressService;
private final IHousingEstateService housingEstateService;
@ApiOperation("分页查询回收订单")
@PostMapping("/page")
public CommonResult<PageDTO<RecycleOrderRespVO>> queryOrderByPage(@RequestBody RecycleOrderQuery recycleOrderQuery) {
@ -73,7 +77,10 @@ public class RecycleOrderController {
t.setLocation(new LocationDTO(s.getLongitude(), s.getLatitude()));
});
// 3.数据组装处理
this.assembleOrderDetailsInfo(recycleOrderPageVO.getList(), recycleOrderQuery.getLocation());
List<RecycleOrderRespVO> orderRespVOList = recycleOrderPageVO.getList();
if (CollUtils.isNotEmpty(orderRespVOList)) {
this.perfectOrderAttributes(recycleOrderQuery.getOrderType(), orderRespVOList, recycleOrderQuery.getLocation());
}
return CommonResult.success(recycleOrderPageVO);
}
@ -118,7 +125,7 @@ public class RecycleOrderController {
RecycleOrderRespVO recycleOrderRespVO = BeanUtils.copyBean(recycleOrder, RecycleOrderRespVO.class, (s, t) -> {
t.setLocation(new LocationDTO(s.getLongitude(), s.getLatitude()));
});
this.assembleOrderDetailsInfo(Collections.singletonList(recycleOrderRespVO), location);
this.perfectOrderAttributes(recycleOrder.getOrderType(), CollUtils.singletonList(recycleOrderRespVO), location);
// 接单后展示回收员信息
if (StrUtil.isNotEmpty(recycleOrder.getStaffsId())) {
Recycler recycler = recyclerService.getRecyclerById(recycleOrder.getStaffsId());
@ -131,17 +138,6 @@ public class RecycleOrderController {
}
@ApiOperation("回收订单明细详情")
@GetMapping("/product-info")
public CommonResult<List<RecycleOrderDetailResponseVO>> OrderProductList(@RequestParam("orderId") String orderId) {
List<RecycleOrderProduct> orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(Collections.singletonList(orderId));
List<RecycleOrderDetailResponseVO> recycleOrderDetailVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class);
this.assembleProductInfo(recycleOrderDetailVOList);
// 是否展示最新价格? todo
return CommonResult.success(recycleOrderDetailVOList);
}
@ApiOperation("回收订单更新")
@PostMapping("/update")
@UserTypeAnnotation(UserTypeEnum.CLIENT)
@ -203,67 +199,125 @@ public class RecycleOrderController {
}
/**
*
*
* @param orderType
* @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, v -> Optional.ofNullable(v.getClientAddressId()).orElse(""), (k1, k2) -> k1));
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, v -> v, (k1, k2) -> k1));
for (RecycleOrderRespVO orderRespVO : orderRespVOList) {
this.computeOrderDistance(orderRespVO, locationDTO);
List<RecycleOrderDetailResponseVO> orderDetails = orderProductsMap.get(orderRespVO.getId());
orderRespVO.setOrderDetails(orderDetails);
orderRespVO.setAddressInfo(clientAddressMap.get(orderRespVO.getClientAddressId()));
private void perfectOrderAttributes(OrderTypeEnum orderType, List<RecycleOrderRespVO> orderRespVOList, LocationDTO locationDTO) {
switch (orderType) {
case SH_ORDER:
this.computeOrderDistance(orderRespVOList, locationDTO);
this.assembleProductInfo(orderRespVOList);
this.assembleClientAddressInfo(orderRespVOList);
this.assembleRecyclerInfo(orderRespVOList);
break;
case TM_RECOVERY:
this.assembleProductInfo(orderRespVOList);
this.assembleRecyclerInfo(orderRespVOList);
this.assembleHousingEstateInfo(orderRespVOList);
break;
case DZ_RECOVERY:
this.assembleProductInfo(orderRespVOList);
this.assembleRecyclerInfo(orderRespVOList);
break;
default:
break;
}
}
/**
* ->(km)
* @param orderRespVO
* -> (km)
* @param orderRespVOList
* @param locationDTO
*/
private void computeOrderDistance(RecycleOrderRespVO orderRespVO, LocationDTO locationDTO) {
private void computeOrderDistance(List<RecycleOrderRespVO> orderRespVOList, LocationDTO locationDTO) {
if (ObjectUtil.isNotEmpty(locationDTO) && locationDTO.isValid()) {
String longitude = locationDTO.getLongitude();
String latitude = locationDTO.getLatitude();
String orderLongitude = orderRespVO.getLocation().getLongitude();
String orderLatitude = orderRespVO.getLocation().getLatitude();
BigDecimal distance = CommonUtil.getDistance(longitude, latitude, orderLongitude, orderLatitude);
orderRespVOList.forEach(orderRespVO -> {
String orderLongitude = orderRespVO.getLocation().getLongitude();
String orderLatitude = orderRespVO.getLocation().getLatitude();
BigDecimal distance = CommonUtil.getDistance(longitude, latitude, orderLongitude, orderLatitude);
// orderRespVO.setDistance(distance.toString().concat("km"));
orderRespVO.setDistance2(distance.doubleValue());
orderRespVO.setDistance2(distance.doubleValue());
});
}
}
/**
*
* @param detailVOList
*
* @param orderRespVOList
*/
private void assembleProductInfo(List<RecycleOrderDetailResponseVO> detailVOList) {
if (CollUtils.isEmpty(detailVOList)) return;
Set<String> productIds = detailVOList.stream().map(RecycleOrderDetailResponseVO::getProductId).collect(Collectors.toSet());
private void assembleProductInfo(List<RecycleOrderRespVO> orderRespVOList) {
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);
// 查询废品信息
Set<String> productIds = detailResponseVOList.stream().map(RecycleOrderDetailResponseVO::getProductId).collect(Collectors.toSet());
List<Product> productList = priceProductService.queryProductList(productIds);
Map<String, Product> productMap = productList.stream().collect(Collectors.toMap(Product::getId, p -> p, (k1, k2) -> k1));
for (RecycleOrderDetailResponseVO detailVO : detailVOList) {
String productId = detailVO.getProductId();
Product product = productMap.get(productId);
for (RecycleOrderDetailResponseVO detailVO : detailResponseVOList) {
Product product = productMap.get(detailVO.getProductId());
detailVO.setProduct(BeanUtils.copyBean(product, ProductSimpleVO.class));
}
Map<String, List<RecycleOrderDetailResponseVO>> orderProductsMap =
detailResponseVOList.stream().collect(Collectors.groupingBy(RecycleOrderDetailResponseVO::getRecycleOrderId));
orderRespVOList.forEach(v -> v.setOrderDetails(orderProductsMap.get(v.getId())));
}
/**
*
* @param orderRespVOList
*/
private void assembleClientAddressInfo(List<RecycleOrderRespVO> orderRespVOList) {
Map<String, String> orderAddressMap = orderRespVOList.stream().collect(Collectors.toMap(
RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getClientAddressId()).orElse(""), (k1, k2) -> k1));
Set<String> addressIds = new HashSet<>(CollUtils.removeEmpty(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, v -> v, (k1, k2) -> k1));
orderRespVOList.forEach(v -> v.setAddressInfo(clientAddressMap.get(v.getClientAddressId())));
}
/**
*
* @param orderRespVOList
*/
private void assembleRecyclerInfo(List<RecycleOrderRespVO> orderRespVOList) {
Map<String, String> orderRecyclerMap = orderRespVOList.stream().collect(Collectors.toMap(
RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getStaffsId()).orElse(""), (k1, k2) -> k1));
Set<String> recyclerIds = new HashSet<>(CollUtils.removeEmpty(orderRecyclerMap.values()));
List<Recycler> recyclerList = recyclerService.getRecyclerByIds(recyclerIds);
List<RecyclerSimpleVO> recyclerSimpleVOList = BeanUtils.copyList(recyclerList, RecyclerSimpleVO.class);
Map<String, RecyclerSimpleVO> recyclerMap = recyclerSimpleVOList.stream().collect(
Collectors.toMap(RecyclerSimpleVO::getId, v -> v, (k1, k2) -> k1));
orderRespVOList.forEach(v -> {
v.setRecyclerInfo(recyclerMap.get(v.getStaffsId()));
v.setEstimateArrivalTime(v.getAppointmentTimeStart().plusHours(1)); // 预计上门时间
});
}
/**
*
* @param orderRespVOList
*/
private void assembleHousingEstateInfo(List<RecycleOrderRespVO> orderRespVOList) {
Map<String, String> orderHousingEstateMap = orderRespVOList.stream().collect(Collectors.toMap(
RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getHousingEstateId()).orElse(""), (k1, k2) -> k1));
Set<String> housingEstateIds = new HashSet<>(CollUtils.removeEmpty(orderHousingEstateMap.values()));
List<HousingEstate> housingEstateList = housingEstateService.getHousingListByIds(housingEstateIds);
List<HousingEstateSimpleVO> housingSimpleVOList = BeanUtils.copyList(housingEstateList, HousingEstateSimpleVO.class);
Map<String, HousingEstateSimpleVO> housingEstateMap = housingSimpleVOList.stream().collect(
Collectors.toMap(HousingEstateSimpleVO::getId, v -> v, (k1, k2) -> k1));
orderRespVOList.forEach(v -> v.setHousingEstateInfo(housingEstateMap.get(v.getHousingEstateId())));
}
}

@ -2,6 +2,7 @@ package cc.yunxi.domain.vo.recycleorder.shorder;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.vo.clientaddress.ClientAddressSimpleVO;
import cc.yunxi.domain.vo.housingestate.HousingEstateSimpleVO;
import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.domain.vo.recycler.RecyclerSimpleVO;
import cc.yunxi.enums.OrderStatusEnum;
@ -100,6 +101,9 @@ public class RecycleOrderRespVO {
@ApiModelProperty("结算时间")
private LocalDateTime settleTime;
@ApiModelProperty("小区id")
private String housingEstateId;
@ApiModelProperty("备注")
private String remark;
@ -136,6 +140,9 @@ public class RecycleOrderRespVO {
@ApiModelProperty("散户地址信息")
private ClientAddressSimpleVO addressInfo;
@ApiModelProperty("小区信息")
private HousingEstateSimpleVO housingEstateInfo;
@ApiModelProperty("回收员信息")
private RecyclerSimpleVO recyclerInfo;

@ -2,10 +2,11 @@ package cc.yunxi.service;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.HousingEstate;
import cc.yunxi.domain.vo.housingestate.HousingEstateRespVO;
import cc.yunxi.domain.po.Recycler;
import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
@ -34,6 +35,15 @@ public interface IHousingEstateService extends IService<HousingEstate> {
List<HousingEstate> getHousingListByStation(String stationId);
/**
* id
*
* @param housingIds
* @return HousingEstate
*/
List<HousingEstate> getHousingListByIds(Collection<String> housingIds);
/**
*
* @param housingEstateId

@ -10,6 +10,9 @@ import com.baomidou.mybatisplus.extension.service.IService;
import javax.validation.Valid;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
*
@ -24,12 +27,19 @@ public interface IRecyclerService extends IService<Recycler> {
Page<Recycler> queryRecyclerByPage(RecyclerQuery recyclerQuery);
/**
* id
* id
* @param id
* @return Client
*/
Recycler getRecyclerById(String id);
/**
* id
* @param recyclerIds
* @return Client
*/
List<Recycler> getRecyclerByIds(Collection<String> recyclerIds);
/**
* openid
* @param openid
@ -60,4 +70,5 @@ public interface IRecyclerService extends IService<Recycler> {
* @param amount
*/
void totalTick(String recyclerId, Double distance, BigDecimal amount);
}

@ -1,10 +1,9 @@
package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.common.exception.BizIllegalException;
import cc.yunxi.domain.dto.LocationDTO;
import cc.yunxi.domain.po.HousingEstate;
import cc.yunxi.domain.po.RecycleOrder;
import cc.yunxi.domain.po.Recycler;
import cc.yunxi.mapper.HousingEstateMapper;
import cc.yunxi.service.IHousingEstateService;
import cn.hutool.core.util.StrUtil;
@ -14,7 +13,7 @@ import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
/**
@ -45,6 +44,15 @@ public class HousingEstateServiceImpl extends ServiceImpl<HousingEstateMapper, H
return this.list(wrapper);
}
@Override
public List<HousingEstate> getHousingListByIds(Collection<String> housingIds) {
LambdaQueryWrapper<HousingEstate> wrapper = new LambdaQueryWrapper<>();
wrapper.in(HousingEstate::getId, housingIds);
return this.list(wrapper);
}
@Override
public HousingEstate getHousingInfo(String housingEstateId) {
if (StrUtil.isEmpty(housingEstateId)) {

@ -7,6 +7,7 @@ import cc.yunxi.common.exception.DbException;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.domain.po.Client;
import cc.yunxi.domain.po.ClientAccountDetail;
import cc.yunxi.domain.po.ClientAddress;
import cc.yunxi.domain.po.Recycler;
import cc.yunxi.domain.query.RecyclerQuery;
import cc.yunxi.domain.vo.client.ClientUpdateVO;
@ -27,6 +28,8 @@ import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
/**
*
@ -67,6 +70,13 @@ public class RecyclerServiceImpl extends ServiceImpl<RecyclerMapper, Recycler> i
return recycler;
}
@Override
public List<Recycler> getRecyclerByIds(Collection<String> recyclerIds) {
LambdaQueryWrapperX<Recycler> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.in(Recycler::getId, recyclerIds);
return list(wrapperX);
}
@Override
@Transactional

Loading…
Cancel
Save