订单业务功能开发v9 - 订单明细信息、预估价计算

wxpay
LI-CCONG\李聪聪 8 months ago
parent 883fbff5fb
commit 8d0967d3de

@ -5,6 +5,7 @@ import cc.yunxi.aspect.UserTypeAnnotation;
import cc.yunxi.common.domain.CommonResult; import cc.yunxi.common.domain.CommonResult;
import cc.yunxi.common.domain.PageDTO; import cc.yunxi.common.domain.PageDTO;
import cc.yunxi.common.utils.BeanUtils; import cc.yunxi.common.utils.BeanUtils;
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;
@ -12,7 +13,7 @@ import cc.yunxi.domain.po.RecycleOrderProduct;
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.recycleorder.RecycleOrderDetailResponseVO; import cc.yunxi.domain.vo.recycleorderdetail.RecycleOrderDetailResponseVO;
import cc.yunxi.enums.UserTypeEnum; import cc.yunxi.enums.UserTypeEnum;
import cc.yunxi.service.IRecycleOrderProductService; import cc.yunxi.service.IRecycleOrderProductService;
import cc.yunxi.service.IRecycleOrderService; import cc.yunxi.service.IRecycleOrderService;
@ -25,7 +26,8 @@ import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.*;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
@ -54,22 +56,25 @@ public class RecycleOrderController {
recycleOrderQuery.setUserId(userDTO.getId()).setUserType(userDTO.getUserType()); // 默认先从前端获取回收站Id todo recycleOrderQuery.setUserId(userDTO.getId()).setUserType(userDTO.getUserType()); // 默认先从前端获取回收站Id todo
// 2.分页查询 // 2.分页查询
Page<RecycleOrder> result = recycleOrderService.queryOrderByPage(recycleOrderQuery); Page<RecycleOrder> result = recycleOrderService.queryOrderByPage(recycleOrderQuery);
// 3.订单距离计算 List<RecycleOrder> recycleOrders = result.getRecords();
// 回收员端计算距离信息
LocationDTO locationDTO = recycleOrderQuery.getLocation(); LocationDTO locationDTO = recycleOrderQuery.getLocation();
if (ObjectUtil.isNotEmpty(locationDTO)) { if (ObjectUtil.isNotEmpty(locationDTO)) {
for(RecycleOrder recycleOrder : recycleOrders) {
String longitude = locationDTO.getLongitude(); String longitude = locationDTO.getLongitude();
String latitude = locationDTO.getLatitude(); String latitude = locationDTO.getLatitude();
for(RecycleOrder recycleOrder : result.getRecords()) {
BigDecimal distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude()); BigDecimal distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude());
recycleOrder.setDistance(distance.toString().concat("km")); recycleOrder.setDistance(distance.toString().concat("km"));
} }
} }
// 2.封装并返回 // 3.返回结果
PageDTO<RecycleOrderRespVO> recyclerPageVO = PageDTO.of(result, RecycleOrderRespVO.class); PageDTO<RecycleOrderRespVO> recyclerPageVO = PageDTO.of(result, RecycleOrderRespVO.class);
List<String> orderIds = recycleOrders.stream().map(RecycleOrder::getId).collect(Collectors.toList());
this.computeOrderDetailsInfo(orderIds, recyclerPageVO.getList());
return CommonResult.success(recyclerPageVO); return CommonResult.success(recyclerPageVO);
} }
@ApiOperation("创建回收订单") @ApiOperation("散户创建回收订单")
@PostMapping("/create") @PostMapping("/create")
@UserTypeAnnotation(UserTypeEnum.CLIENT) @UserTypeAnnotation(UserTypeEnum.CLIENT)
public CommonResult<String> createOrder(@RequestBody RecycleOrderCreateVO orderCreateVO) { public CommonResult<String> createOrder(@RequestBody RecycleOrderCreateVO orderCreateVO) {
@ -81,17 +86,18 @@ public class RecycleOrderController {
@ApiOperation("回收订单详情") @ApiOperation("回收订单详情")
@PostMapping("/info") @GetMapping("/info")
public CommonResult<RecycleOrderRespVO> findOrder(@RequestBody RecycleOrderQuery recycleOrderQuery) { public CommonResult<RecycleOrderRespVO> findOrder(@RequestParam("orderId") String orderId, LocationDTO location) {
RecycleOrder recycleOrder = recycleOrderService.getOrderById(recycleOrderQuery.getId()); RecycleOrder recycleOrder = recycleOrderService.getOrderById(orderId);
LocationDTO locationDTO = recycleOrderQuery.getLocation(); // 回收员端计算距离信息
if (ObjectUtil.isNotEmpty(locationDTO)) { if (ObjectUtil.isNotEmpty(location)) {
String longitude = locationDTO.getLongitude(); String longitude = location.getLongitude();
String latitude = locationDTO.getLatitude(); String latitude = location.getLatitude();
BigDecimal distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude()); BigDecimal distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude());
recycleOrder.setDistance(distance.toString().concat("km")); recycleOrder.setDistance(distance.toString().concat("km"));
} }
RecycleOrderRespVO recycleOrderRespVO = BeanUtils.copyBean(recycleOrder, RecycleOrderRespVO.class); RecycleOrderRespVO recycleOrderRespVO = BeanUtils.copyBean(recycleOrder, RecycleOrderRespVO.class);
this.computeOrderDetailsInfo(Collections.singletonList(recycleOrder.getId()), Collections.singletonList(recycleOrderRespVO));
return CommonResult.success(recycleOrderRespVO); return CommonResult.success(recycleOrderRespVO);
} }
@ -99,7 +105,7 @@ public class RecycleOrderController {
@ApiOperation("回收订单明细详情") @ApiOperation("回收订单明细详情")
@GetMapping("/product-info") @GetMapping("/product-info")
public CommonResult<List<RecycleOrderDetailResponseVO>> OrderProductList(@RequestParam("orderId") String orderId) { public CommonResult<List<RecycleOrderDetailResponseVO>> OrderProductList(@RequestParam("orderId") String orderId) {
List<RecycleOrderProduct> orderProducts = recycleOrderProductService.getOrderProductsByOrderId(orderId); List<RecycleOrderProduct> orderProducts = recycleOrderProductService.getOrderProductsByOrderIds(Collections.singletonList(orderId));
List<RecycleOrderDetailResponseVO> recycleOrderDetailVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class); List<RecycleOrderDetailResponseVO> recycleOrderDetailVOList = BeanUtils.copyList(orderProducts, RecycleOrderDetailResponseVO.class);
// 是否展示最新价格? todo // 是否展示最新价格? todo
return CommonResult.success(recycleOrderDetailVOList); return CommonResult.success(recycleOrderDetailVOList);
@ -156,4 +162,29 @@ public class RecycleOrderController {
return CommonResult.success(true); return CommonResult.success(true);
} }
/**
*
* @param orderIds
* @param orderRespVOList
*/
private void computeOrderDetailsInfo(List<String> orderIds, List<RecycleOrderRespVO> orderRespVOList) {
if (CollUtils.isEmpty(orderIds) || CollUtils.isEmpty(orderRespVOList)) return;
// 查询订单下废品信息
List<RecycleOrderProduct> productsInOrders = recycleOrderProductService.getOrderProductsByOrderIds(orderIds);
List<RecycleOrderDetailResponseVO> detailResponseVOList = BeanUtils.copyList(productsInOrders, RecycleOrderDetailResponseVO.class);
Map<String, List<RecycleOrderDetailResponseVO>> orderProductsMap =
detailResponseVOList.stream().collect(Collectors.groupingBy(RecycleOrderDetailResponseVO::getRecycleOrderId));
// 组装数据、计算预估值
for (RecycleOrderRespVO orderRespVO : orderRespVOList) {
List<RecycleOrderDetailResponseVO> orderDetails = orderProductsMap.get(orderRespVO.getId());
orderRespVO.setOrderDetails(orderDetails);
BigDecimal expectedPrice = new BigDecimal("0");
for (RecycleOrderDetailResponseVO orderDetail : orderDetails) {
BigDecimal bigDecimal = new BigDecimal(orderDetail.getProductWeight().getCode());
BigDecimal recoveryPrice = orderDetail.getRecoveryPrice();
expectedPrice = expectedPrice.add(bigDecimal.multiply(recoveryPrice));
}
orderRespVO.setExpectedPrice(expectedPrice);
}
}
} }

@ -17,7 +17,7 @@ import lombok.experimental.Accessors;
@ApiModel(value = "RecycleOrderQuery", description = "回收订单查询条件") @ApiModel(value = "RecycleOrderQuery", description = "回收订单查询条件")
public class RecycleOrderQuery extends PageQuery<RecycleOrder> { public class RecycleOrderQuery extends PageQuery<RecycleOrder> {
@ApiModelProperty(value = "订单编号", required = false, example = "1234567890") @ApiModelProperty(value = "订单编号", required = false, example = "1766396926952042498")
private String id; private String id;
@ApiModelProperty(value = "订单状态", required = false, example = "PENDING") @ApiModelProperty(value = "订单状态", required = false, example = "PENDING")

@ -1,13 +1,16 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorder;
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;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List;
/** /**
* <p> * <p>
@ -60,6 +63,9 @@ public class RecycleOrderRespVO {
@ApiModelProperty("订单创建时间") @ApiModelProperty("订单创建时间")
private LocalDateTime creatorTime; private LocalDateTime creatorTime;
@ApiModelProperty("订单修改时间")
private LocalDateTime updateTime;
@ApiModelProperty("预约上门时间起") @ApiModelProperty("预约上门时间起")
private LocalDateTime appointmentTimeStart; private LocalDateTime appointmentTimeStart;
@ -72,10 +78,20 @@ public class RecycleOrderRespVO {
// @ApiModelProperty("协商上门时间止") // @ApiModelProperty("协商上门时间止")
// private LocalDateTime consultTimeEnd; // private LocalDateTime consultTimeEnd;
@ApiModelProperty("收货时间") @ApiModelProperty("接单时间")
@TableField("receive_time")
private LocalDateTime receiveTime; private LocalDateTime receiveTime;
@ApiModelProperty("到达时间")
@TableField("arrival_time")
private LocalDateTime arrivalTime;
@ApiModelProperty("完成时间")
@TableField("complete_time")
private LocalDateTime completeTime;
@ApiModelProperty("结算时间") @ApiModelProperty("结算时间")
@TableField("settle_time")
private LocalDateTime settleTime; private LocalDateTime settleTime;
@ApiModelProperty("备注") @ApiModelProperty("备注")
@ -105,4 +121,11 @@ public class RecycleOrderRespVO {
@ApiModelProperty("订单距离(回收员专用)") @ApiModelProperty("订单距离(回收员专用)")
private String distance; private String distance;
@ApiModelProperty("预估价")
private BigDecimal expectedPrice;
@ApiModelProperty("订单明细详情")
private List<RecycleOrderDetailResponseVO> orderDetails;
} }

@ -1,4 +1,4 @@
package cc.yunxi.domain.vo.recycleorder; package cc.yunxi.domain.vo.recycleorderdetail;
import cc.yunxi.enums.OrderStatusEnum; import cc.yunxi.enums.OrderStatusEnum;
import cc.yunxi.enums.OrderTypeEnum; import cc.yunxi.enums.OrderTypeEnum;

@ -14,11 +14,11 @@ import lombok.Getter;
@SwaggerDisplayEnum @SwaggerDisplayEnum
public enum ProductWeightEnum implements BaseEnum { public enum ProductWeightEnum implements BaseEnum {
I("1", "10Kg以下"), I("10", "10Kg以下"),
II("2", "10Kg~20Kg"), II("15", "10Kg~20Kg"),
III("3", "20Kg以上"); III("20", "20Kg以上");
@EnumValue @EnumValue
private final String code; private final String code;

@ -28,11 +28,11 @@ public interface IRecycleOrderProductService extends IService<RecycleOrderProduc
/** /**
* *
* @param orderId * @param orderIds
* @return List<RecycleOrderProduct> * @return List<RecycleOrderProduct>
*/ */
List<RecycleOrderProduct> getOrderProductsByOrderId(String orderId); List<RecycleOrderProduct> getOrderProductsByOrderIds(List<String> orderIds);
/** /**

@ -1,5 +1,6 @@
package cc.yunxi.service.impl; package cc.yunxi.service.impl;
import cc.yunxi.common.domain.LambdaQueryWrapperX;
import cc.yunxi.domain.po.PriceProduct; import cc.yunxi.domain.po.PriceProduct;
import cc.yunxi.domain.po.RecycleOrderProduct; import cc.yunxi.domain.po.RecycleOrderProduct;
import cc.yunxi.mapper.RecycleOrderProductMapper; import cc.yunxi.mapper.RecycleOrderProductMapper;
@ -32,9 +33,9 @@ public class RecycleOrderProductServiceImpl extends ServiceImpl<RecycleOrderProd
} }
@Override @Override
public List<RecycleOrderProduct> getOrderProductsByOrderId(String orderId) { public List<RecycleOrderProduct> getOrderProductsByOrderIds(List<String> orderIds) {
LambdaQueryWrapper<RecycleOrderProduct> wrapper = new LambdaQueryWrapper<>(); LambdaQueryWrapperX<RecycleOrderProduct> wrapper = new LambdaQueryWrapperX<>();
wrapper.eq(RecycleOrderProduct::getRecycleOrderId, orderId); wrapper.inIfPresent(RecycleOrderProduct::getRecycleOrderId, orderIds);
return this.list(wrapper); return this.list(wrapper);
} }

@ -99,6 +99,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
if (ObjectUtil.isEmpty(client)) { if (ObjectUtil.isEmpty(client)) {
throw new DbException("散户不存在"); throw new DbException("散户不存在");
} }
// 判断下单地址和回收站的距离 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