|
|
@@ -3,6 +3,7 @@ package com.ylx.order.service.impl;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.ylx.common.core.domain.model.LoginUser;
|
|
|
import com.ylx.common.exception.ServiceException;
|
|
|
+import com.ylx.common.utils.DistanceUtil;
|
|
|
import com.ylx.massage.domain.CancelOrderApplication;
|
|
|
import com.ylx.order.domain.OrderDispatch;
|
|
|
import com.ylx.order.domain.dto.AdminOrderDispatchDTO;
|
|
|
@@ -16,6 +17,7 @@ import com.ylx.order.domain.vo.AdminOrderServiceCategoryVO;
|
|
|
import com.ylx.order.enums.AfterSaleServiceStatusEnum;
|
|
|
import com.ylx.order.mapper.AdminOrderMapper;
|
|
|
import com.ylx.order.service.AdminOrderService;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.security.core.Authentication;
|
|
|
import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -24,6 +26,7 @@ import org.springframework.util.StringUtils;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
|
@@ -38,6 +41,7 @@ import java.util.UUID;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
+@Slf4j
|
|
|
public class AdminOrderServiceImpl implements AdminOrderService {
|
|
|
|
|
|
private static final String PLATFORM_REFUND_REASON = "平台发起退款申请";
|
|
|
@@ -54,6 +58,8 @@ public class AdminOrderServiceImpl implements AdminOrderService {
|
|
|
private static final Integer DISPATCH_SOURCE_ADMIN = 1;
|
|
|
private static final Integer CURRENT_DISPATCH = 1;
|
|
|
private static final Integer NOT_DELETED = 0;
|
|
|
+ private static final BigDecimal MAX_LATITUDE = new BigDecimal("90");
|
|
|
+ private static final BigDecimal MAX_LONGITUDE = new BigDecimal("180");
|
|
|
|
|
|
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
@@ -147,18 +153,20 @@ public class AdminOrderServiceImpl implements AdminOrderService {
|
|
|
public AdminOrderDetailVO detail(Long id) {
|
|
|
validateOrderId(id);
|
|
|
|
|
|
+ // 查询订单详情
|
|
|
AdminOrderDetailVO.OrderInfoVO orderInfo = adminOrderMapper.selectOrderDetailInfoById(id);
|
|
|
if (orderInfo == null) {
|
|
|
throw new ServiceException("订单不存在或已删除");
|
|
|
}
|
|
|
|
|
|
fillOrderDetailDisplayFields(orderInfo);
|
|
|
-
|
|
|
+ // 查询项目详情
|
|
|
AdminOrderDetailVO.ProjectInfoVO projectInfo = adminOrderMapper.selectOrderProjectDetailById(id);
|
|
|
if (projectInfo != null) {
|
|
|
fillProjectDetailDisplayFields(projectInfo);
|
|
|
}
|
|
|
|
|
|
+ // 查询订单操作日志
|
|
|
List<AdminOrderDetailVO.OperationLogVO> operationLogs = adminOrderMapper.selectOrderOperationLogs(id);
|
|
|
if (operationLogs == null) {
|
|
|
operationLogs = Collections.emptyList();
|
|
|
@@ -345,21 +353,82 @@ public class AdminOrderServiceImpl implements AdminOrderService {
|
|
|
|
|
|
/**
|
|
|
* 填充订单详情显示字段
|
|
|
+ *
|
|
|
* @param orderInfo
|
|
|
*/
|
|
|
private void fillOrderDetailDisplayFields(AdminOrderDetailVO.OrderInfoVO orderInfo) {
|
|
|
orderInfo.setStatusName(getStatusName(orderInfo.getStatus()));
|
|
|
orderInfo.setPaymentMethodName(getPaymentMethodName(orderInfo.getStatus(), orderInfo.getPaymentMethod()));
|
|
|
orderInfo.setAfterSalesServiceStatusName(getAfterSalesServiceStatusName(orderInfo.getAfterSalesServiceStatus()));
|
|
|
- orderInfo.setPlatformIncome(null);
|
|
|
- orderInfo.setMerchantIncome(null);
|
|
|
+
|
|
|
+ // 获取用户下单的经纬度
|
|
|
+ BigDecimal userLatitude = orderInfo.getUserLatitude();
|
|
|
+ BigDecimal userLongitude = orderInfo.getUserLongitude();
|
|
|
+
|
|
|
+ //获取商户下单的真实经纬度
|
|
|
+ BigDecimal merchantLatitude = orderInfo.getMerchantLatitude();
|
|
|
+ BigDecimal merchantLongitude = orderInfo.getMerchantLongitude();
|
|
|
+
|
|
|
+ //计算距离
|
|
|
+ BigDecimal distanceMeters = calculateDistance(userLatitude, userLongitude, merchantLatitude, merchantLongitude);
|
|
|
+ log.info("用户与商户距离:{}米", distanceMeters);
|
|
|
+ //把米转换为公里
|
|
|
+ orderInfo.setDistance(distanceMeters.divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 计算用户与商户两点之间的球面直线距离,单位:米。
|
|
|
+ *
|
|
|
+ * @param userLatitude 用户纬度
|
|
|
+ * @param userLongitude 用户经度
|
|
|
+ * @param merchantLatitude 商户纬度
|
|
|
+ * @param merchantLongitude 商户经度
|
|
|
+ * @return 距离,保留2位小数;坐标缺失或非法时返回null
|
|
|
+ */
|
|
|
+ private BigDecimal calculateDistance(BigDecimal userLatitude, BigDecimal userLongitude, BigDecimal merchantLatitude, BigDecimal merchantLongitude) {
|
|
|
+ if (!isCoordinateValid(userLatitude, userLongitude) || !isCoordinateValid(merchantLatitude, merchantLongitude)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ double distanceMeters = DistanceUtil.getDistance(
|
|
|
+ userLatitude.doubleValue(),
|
|
|
+ userLongitude.doubleValue(),
|
|
|
+ merchantLatitude.doubleValue(),
|
|
|
+ merchantLongitude.doubleValue());
|
|
|
+ return BigDecimal.valueOf(distanceMeters).setScale(2, RoundingMode.HALF_UP);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 校验单组经纬度是否完整且在合法范围内。
|
|
|
+ *
|
|
|
+ * @param latitude 纬度
|
|
|
+ * @param longitude 经度
|
|
|
+ * @return true-合法,false-非法
|
|
|
+ */
|
|
|
+ private boolean isCoordinateValid(BigDecimal latitude, BigDecimal longitude) {
|
|
|
+ if (latitude == null || longitude == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (BigDecimal.ZERO.compareTo(latitude) == 0 || BigDecimal.ZERO.compareTo(longitude) == 0) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return latitude.abs().compareTo(MAX_LATITUDE) <= 0
|
|
|
+ && longitude.abs().compareTo(MAX_LONGITUDE) <= 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 填充项目详情显示字段
|
|
|
+ *
|
|
|
+ * @param projectInfo
|
|
|
+ */
|
|
|
private void fillProjectDetailDisplayFields(AdminOrderDetailVO.ProjectInfoVO projectInfo) {
|
|
|
projectInfo.setUnitName(getUnitName(projectInfo.getUnitType()));
|
|
|
- projectInfo.setAfterSalesServiceStatusName(getAfterSalesServiceStatusName(projectInfo.getAfterSalesServiceStatus()));
|
|
|
+ //projectInfo.setAfterSalesServiceStatusName(getAfterSalesServiceStatusName(projectInfo.getAfterSalesServiceStatus()));
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 填充订单操作日志显示字段
|
|
|
+ * @param log
|
|
|
+ */
|
|
|
private void fillOperationLogDisplayFields(AdminOrderDetailVO.OperationLogVO log) {
|
|
|
String statusName = getStatusName(log.getStatus());
|
|
|
log.setStatusName(statusName);
|
|
|
@@ -371,6 +440,12 @@ public class AdminOrderServiceImpl implements AdminOrderService {
|
|
|
return statusEnum == null ? "" : statusEnum.getDesc();
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 解析开始服务照片
|
|
|
+ *
|
|
|
+ * @param startPhoto
|
|
|
+ * @return List<String> 开始服务照片列表
|
|
|
+ */
|
|
|
private List<String> splitStartPhoto(String startPhoto) {
|
|
|
if (!StringUtils.hasText(startPhoto)) {
|
|
|
return new ArrayList<>();
|