订单业务功能开发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.PageDTO;
import cc.yunxi.common.utils.BeanUtils;
import cc.yunxi.common.utils.CollUtils;
import cc.yunxi.common.utils.CommonUtil;
import cc.yunxi.domain.dto.LocationDTO;
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.po.RecycleOrder;
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.service.IRecycleOrderProductService;
import cc.yunxi.service.IRecycleOrderService;
@ -25,7 +26,8 @@ import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
* <p>
@ -54,22 +56,25 @@ public class RecycleOrderController {
recycleOrderQuery.setUserId(userDTO.getId()).setUserType(userDTO.getUserType()); // 默认先从前端获取回收站Id todo
// 2.分页查询
Page<RecycleOrder> result = recycleOrderService.queryOrderByPage(recycleOrderQuery);
// 3.订单距离计算
List<RecycleOrder> recycleOrders = result.getRecords();
// 回收员端计算距离信息
LocationDTO locationDTO = recycleOrderQuery.getLocation();
if (ObjectUtil.isNotEmpty(locationDTO)) {
for(RecycleOrder recycleOrder : recycleOrders) {
String longitude = locationDTO.getLongitude();
String latitude = locationDTO.getLatitude();
for(RecycleOrder recycleOrder : result.getRecords()) {
BigDecimal distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude());
recycleOrder.setDistance(distance.toString().concat("km"));
}
}
// 2.封装并返回
// 3.返回结果
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);
}
@ApiOperation("创建回收订单")
@ApiOperation("散户创建回收订单")
@PostMapping("/create")
@UserTypeAnnotation(UserTypeEnum.CLIENT)
public CommonResult<String> createOrder(@RequestBody RecycleOrderCreateVO orderCreateVO) {
@ -81,17 +86,18 @@ public class RecycleOrderController {
@ApiOperation("回收订单详情")
@PostMapping("/info")
public CommonResult<RecycleOrderRespVO> findOrder(@RequestBody RecycleOrderQuery recycleOrderQuery) {
RecycleOrder recycleOrder = recycleOrderService.getOrderById(recycleOrderQuery.getId());
LocationDTO locationDTO = recycleOrderQuery.getLocation();
if (ObjectUtil.isNotEmpty(locationDTO)) {
String longitude = locationDTO.getLongitude();
String latitude = locationDTO.getLatitude();
@GetMapping("/info")
public CommonResult<RecycleOrderRespVO> findOrder(@RequestParam("orderId") String orderId, LocationDTO location) {
RecycleOrder recycleOrder = recycleOrderService.getOrderById(orderId);
// 回收员端计算距离信息
if (ObjectUtil.isNotEmpty(location)) {
String longitude = location.getLongitude();
String latitude = location.getLatitude();
BigDecimal distance = CommonUtil.getDistance(longitude, latitude, recycleOrder.getLongitude(), recycleOrder.getLatitude());
recycleOrder.setDistance(distance.toString().concat("km"));
}
RecycleOrderRespVO recycleOrderRespVO = BeanUtils.copyBean(recycleOrder, RecycleOrderRespVO.class);
this.computeOrderDetailsInfo(Collections.singletonList(recycleOrder.getId()), Collections.singletonList(recycleOrderRespVO));
return CommonResult.success(recycleOrderRespVO);
}
@ -99,7 +105,7 @@ public class RecycleOrderController {
@ApiOperation("回收订单明细详情")
@GetMapping("/product-info")
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);
// 是否展示最新价格? todo
return CommonResult.success(recycleOrderDetailVOList);
@ -156,4 +162,29 @@ public class RecycleOrderController {
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 = "回收订单查询条件")
public class RecycleOrderQuery extends PageQuery<RecycleOrder> {
@ApiModelProperty(value = "订单编号", required = false, example = "1234567890")
@ApiModelProperty(value = "订单编号", required = false, example = "1766396926952042498")
private String id;
@ApiModelProperty(value = "订单状态", required = false, example = "PENDING")

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

@ -14,11 +14,11 @@ import lombok.Getter;
@SwaggerDisplayEnum
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
private final String code;

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

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

@ -99,6 +99,7 @@ public class RecycleOrderServiceImpl extends ServiceImpl<RecycleOrderMapper, Rec
if (ObjectUtil.isEmpty(client)) {
throw new DbException("散户不存在");
}
// 判断下单地址和回收站的距离 todo
// 创建订单
RecycleOrder recycleOrder = BeanUtils.copyBean(orderCreateVO, RecycleOrder.class, (source, target) -> {
target.setLatitude(source.getLocation().getLatitude());

Loading…
Cancel
Save