diff --git a/nxhs-service/src/main/java/cc/yunxi/controller/RecycleOrderController.java b/nxhs-service/src/main/java/cc/yunxi/controller/RecycleOrderController.java index 7d9ed23..ffd375c 100644 --- a/nxhs-service/src/main/java/cc/yunxi/controller/RecycleOrderController.java +++ b/nxhs-service/src/main/java/cc/yunxi/controller/RecycleOrderController.java @@ -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> 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 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> OrderProductList(@RequestParam("orderId") String orderId) { - List orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(Collections.singletonList(orderId)); - List 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 orderRespVOList, LocationDTO locationDTO) { - if (CollUtils.isEmpty(orderRespVOList)) return; - // 废品关联信息 - List orderIds = orderRespVOList.stream().map(RecycleOrderRespVO::getId).collect(Collectors.toList()); - List orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(orderIds); - List detailResponseVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class); - this.assembleProductInfo(detailResponseVOList); - Map> orderProductsMap = - detailResponseVOList.stream().collect(Collectors.groupingBy(RecycleOrderDetailResponseVO::getRecycleOrderId)); - // 地址关联信息 - Map orderAddressMap = orderRespVOList.stream().collect(Collectors.toMap( - RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getClientAddressId()).orElse(""), (k1, k2) -> k1)); - Set addressIds = new HashSet<>(orderAddressMap.values()); - List clientAddresses = clientAddressService.queryAddressList(addressIds); - List addressSimpleVOList = BeanUtils.copyList(clientAddresses, ClientAddressSimpleVO.class); - Map clientAddressMap = addressSimpleVOList.stream().collect(Collectors.toMap( - ClientAddressSimpleVO::getId, v -> v, (k1, k2) -> k1)); - for (RecycleOrderRespVO orderRespVO : orderRespVOList) { - this.computeOrderDistance(orderRespVO, locationDTO); - List orderDetails = orderProductsMap.get(orderRespVO.getId()); - orderRespVO.setOrderDetails(orderDetails); - orderRespVO.setAddressInfo(clientAddressMap.get(orderRespVO.getClientAddressId())); + private void perfectOrderAttributes(OrderTypeEnum orderType, List 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 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 detailVOList) { - if (CollUtils.isEmpty(detailVOList)) return; - Set productIds = detailVOList.stream().map(RecycleOrderDetailResponseVO::getProductId).collect(Collectors.toSet()); + private void assembleProductInfo(List orderRespVOList) { + List orderIds = orderRespVOList.stream().map(RecycleOrderRespVO::getId).collect(Collectors.toList()); + List orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(orderIds); + List detailResponseVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class); + // 查询废品信息 + Set productIds = detailResponseVOList.stream().map(RecycleOrderDetailResponseVO::getProductId).collect(Collectors.toSet()); List productList = priceProductService.queryProductList(productIds); Map 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> orderProductsMap = + detailResponseVOList.stream().collect(Collectors.groupingBy(RecycleOrderDetailResponseVO::getRecycleOrderId)); + orderRespVOList.forEach(v -> v.setOrderDetails(orderProductsMap.get(v.getId()))); } + + + /** + * 组装订单散户地址信息 + * @param orderRespVOList + */ + private void assembleClientAddressInfo(List orderRespVOList) { + Map orderAddressMap = orderRespVOList.stream().collect(Collectors.toMap( + RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getClientAddressId()).orElse(""), (k1, k2) -> k1)); + Set addressIds = new HashSet<>(CollUtils.removeEmpty(orderAddressMap.values())); + List clientAddresses = clientAddressService.queryAddressList(addressIds); + List addressSimpleVOList = BeanUtils.copyList(clientAddresses, ClientAddressSimpleVO.class); + Map 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 orderRespVOList) { + Map orderRecyclerMap = orderRespVOList.stream().collect(Collectors.toMap( + RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getStaffsId()).orElse(""), (k1, k2) -> k1)); + Set recyclerIds = new HashSet<>(CollUtils.removeEmpty(orderRecyclerMap.values())); + List recyclerList = recyclerService.getRecyclerByIds(recyclerIds); + List recyclerSimpleVOList = BeanUtils.copyList(recyclerList, RecyclerSimpleVO.class); + Map 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 orderRespVOList) { + Map orderHousingEstateMap = orderRespVOList.stream().collect(Collectors.toMap( + RecycleOrderRespVO::getId, v -> Optional.ofNullable(v.getHousingEstateId()).orElse(""), (k1, k2) -> k1)); + Set housingEstateIds = new HashSet<>(CollUtils.removeEmpty(orderHousingEstateMap.values())); + List housingEstateList = housingEstateService.getHousingListByIds(housingEstateIds); + List housingSimpleVOList = BeanUtils.copyList(housingEstateList, HousingEstateSimpleVO.class); + Map housingEstateMap = housingSimpleVOList.stream().collect( + Collectors.toMap(HousingEstateSimpleVO::getId, v -> v, (k1, k2) -> k1)); + orderRespVOList.forEach(v -> v.setHousingEstateInfo(housingEstateMap.get(v.getHousingEstateId()))); + } + } diff --git a/nxhs-service/src/main/java/cc/yunxi/domain/vo/recycleorder/shorder/RecycleOrderRespVO.java b/nxhs-service/src/main/java/cc/yunxi/domain/vo/recycleorder/shorder/RecycleOrderRespVO.java index ff5fab5..e02dcc2 100644 --- a/nxhs-service/src/main/java/cc/yunxi/domain/vo/recycleorder/shorder/RecycleOrderRespVO.java +++ b/nxhs-service/src/main/java/cc/yunxi/domain/vo/recycleorder/shorder/RecycleOrderRespVO.java @@ -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; diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IHousingEstateService.java b/nxhs-service/src/main/java/cc/yunxi/service/IHousingEstateService.java index a6dcfff..5d23614 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/IHousingEstateService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/IHousingEstateService.java @@ -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 { List getHousingListByStation(String stationId); + /** + * 根据id集获取小区列表 + * + * @param housingIds + * @return HousingEstate + */ + List getHousingListByIds(Collection housingIds); + + /** * 小区详情 * @param housingEstateId diff --git a/nxhs-service/src/main/java/cc/yunxi/service/IRecyclerService.java b/nxhs-service/src/main/java/cc/yunxi/service/IRecyclerService.java index d2252ce..7a5dc17 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/IRecyclerService.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/IRecyclerService.java @@ -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 { Page queryRecyclerByPage(RecyclerQuery recyclerQuery); /** - * 根据id获取散户信息 + * 根据id获取回收员信息 * @param id * @return Client */ Recycler getRecyclerById(String id); + /** + * 根据id集获取回收员列表 + * @param recyclerIds + * @return Client + */ + List getRecyclerByIds(Collection recyclerIds); + /** * 根据openid获取回收员信息 * @param openid @@ -60,4 +70,5 @@ public interface IRecyclerService extends IService { * @param amount */ void totalTick(String recyclerId, Double distance, BigDecimal amount); + } diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/HousingEstateServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/HousingEstateServiceImpl.java index 5344826..82e1759 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/HousingEstateServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/HousingEstateServiceImpl.java @@ -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 getHousingListByIds(Collection housingIds) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(HousingEstate::getId, housingIds); + return this.list(wrapper); + } + + @Override public HousingEstate getHousingInfo(String housingEstateId) { if (StrUtil.isEmpty(housingEstateId)) { diff --git a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecyclerServiceImpl.java b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecyclerServiceImpl.java index 940159a..efff368 100644 --- a/nxhs-service/src/main/java/cc/yunxi/service/impl/RecyclerServiceImpl.java +++ b/nxhs-service/src/main/java/cc/yunxi/service/impl/RecyclerServiceImpl.java @@ -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 i return recycler; } + @Override + public List getRecyclerByIds(Collection recyclerIds) { + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX<>(); + wrapperX.in(Recycler::getId, recyclerIds); + return list(wrapperX); + } + @Override @Transactional