package com.ruoyi.order.service.impl;
|
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.constant.Constants;
|
import com.ruoyi.common.core.constant.OrderConstants;
|
import com.ruoyi.common.core.utils.GaoDeMapUtil;
|
import com.ruoyi.common.core.vo.Path;
|
import com.ruoyi.order.entity.ChangeDispatch;
|
import com.ruoyi.order.entity.Order;
|
import com.ruoyi.order.mapper.OrderMapper;
|
import com.ruoyi.order.request.UserOrderRequest;
|
import com.ruoyi.order.service.ChangeDispatchService;
|
import com.ruoyi.order.service.OrderService;
|
import com.ruoyi.order.vo.*;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import javax.annotation.Resource;
|
import java.math.BigDecimal;
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.time.LocalDate;
|
import java.time.Month;
|
import java.time.Year;
|
import java.time.temporal.TemporalAdjusters;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
/**
|
* <p>
|
* 订单管理 服务实现类
|
* </p>
|
*
|
* @author hjl
|
* @since 2024-05-29
|
*/
|
|
@Service
|
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
|
|
@Resource
|
private ChangeDispatchService changeDispatchService;
|
|
@Override
|
public OrderResultVO orderCountHome(OrderCountRequest orderCount) {
|
List<String> cityList = orderCount.getCityList();
|
Integer orderState = orderCount.getOrderState();
|
String countType = orderCount.getCountType();
|
String startTime = orderCount.getStartTime();
|
String endTime = orderCount.getEndTime();
|
List<OrderQueryVO> list;
|
// 根据查询类型查询订单信息
|
if (OrderConstants.YEAR.equals(countType)) {
|
list = baseMapper.orderCountByYear(cityList, orderState);
|
} else if (OrderConstants.MONTH.equals(countType)) {
|
list = baseMapper.orderCountByMonth(cityList, orderState);
|
} else if (OrderConstants.WEEK.equals(countType)) {
|
list = baseMapper.orderCountByWeek(cityList, orderState);
|
} else if (OrderConstants.TODAY.equals(countType)) {
|
list = baseMapper.orderCountByToday(cityList, orderState);
|
} else {
|
try {
|
startTime = startTime + " 00:00:00";
|
endTime = endTime + " 00:00:00";
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
Date date1 = sdf.parse(startTime);
|
Date date2 = sdf.parse(endTime);
|
long diffInMillis = date2.getTime() - date1.getTime();
|
long diffInDays = diffInMillis / (24 * 60 * 60 * 1000);
|
if (diffInDays > Constants.YEAR_DAY) {
|
list = baseMapper.orderCountByTimeRangeYear(cityList, startTime, endTime,orderState);
|
} else if (diffInDays > Constants.THIRTY) {
|
list = baseMapper.orderCountByTimeRangeMonth(cityList, startTime, endTime,orderState);
|
} else {
|
list = baseMapper.orderCountByTimeRange(cityList, startTime, endTime,orderState);
|
}
|
} catch (ParseException e) {
|
list = new ArrayList<>();
|
}
|
}
|
// 计算订单总额及总订单数量
|
BigDecimal totalMoney;
|
int orderNumber;
|
if (list.isEmpty()) {
|
totalMoney = BigDecimal.ZERO;
|
orderNumber = 0;
|
} else {
|
totalMoney = list.stream().map(OrderQueryVO::getTotalPrice)
|
.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
|
orderNumber = list.stream().filter(order -> order.getNumber() != null)
|
.mapToInt(OrderQueryVO::getNumber).sum();
|
}
|
return new
|
|
OrderResultVO(totalMoney, orderNumber, list);
|
|
}
|
|
@Override
|
public List<Order> excelExport(OrderQueryRequest orderQueryRequest) {
|
List<String> ids = orderQueryRequest.getIds();
|
List<Order> list;
|
if (null != ids && !ids.isEmpty()) {
|
list = baseMapper.exportByIdList(ids);
|
} else {
|
list = baseMapper.exportList(orderQueryRequest);
|
}
|
return list;
|
}
|
|
@Override
|
public Page<Order> queryPage(OrderQueryRequest orderQueryRequest) {
|
Page<Order> page = Page.of(orderQueryRequest.getPageNum(), orderQueryRequest.getPageSize());
|
// 基础查询
|
Page<Order> pageList = baseMapper.queryPage(orderQueryRequest, page);
|
for (Order order : pageList.getRecords()) {
|
ChangeDispatch changeDispatch = changeDispatchService.lambdaQuery()
|
.eq(ChangeDispatch::getOrderId, order.getId())
|
.eq(ChangeDispatch::getIsDelete, 0)
|
.orderByDesc(ChangeDispatch::getCreateTime)
|
.last("limit 1").one();
|
if (null != changeDispatch) {
|
order.setApplyReason(changeDispatch.getApplyReason());
|
}
|
}
|
return pageList;
|
}
|
|
|
@Override
|
public Page<OrderCountVO> orderCount(String name, String phone, Page<OrderCountVO> page) {
|
return baseMapper.orderCount(name, phone, page);
|
}
|
|
@Override
|
public OrderPageCountVO orderPageCount(OrderQueryRequest orderQueryRequest) {
|
List<Order> orderList = baseMapper.orderPageCount(orderQueryRequest);
|
int total = 0;
|
int toBeDispatched = 0;
|
int stayDoorstep = 0;
|
int toBeCompleted = 0;
|
int completed = 0;
|
int canceled = 0;
|
int reInvestment = 0;
|
for (Order order : orderList) {
|
total++;
|
Integer state = order.getState();
|
if (Constants.ZERO.equals(state)) {
|
toBeDispatched++;
|
} else if (Constants.ONE.equals(state)) {
|
stayDoorstep++;
|
} else if (Constants.TWO.equals(state)) {
|
toBeCompleted++;
|
} else if (Constants.THREE.equals(state)) {
|
completed++;
|
} else if (Constants.FOUR.equals(state)) {
|
canceled++;
|
}
|
if (order.getState().equals(Constants.SIX)) {
|
reInvestment++;
|
}
|
}
|
return new OrderPageCountVO(total, toBeDispatched, stayDoorstep,
|
toBeCompleted, completed, canceled, reInvestment);
|
}
|
|
@Override
|
public BigDecimal tradeMoney(MoneyQueryRequest moneyQueryRequest) {
|
List<String> cityList = moneyQueryRequest.getCityList();
|
String type = moneyQueryRequest.getType();
|
// 计算当前季度时间所包含时间
|
int currentYear = Year.now().getValue();
|
// 获取当前月份
|
Month currentMonth = LocalDate.now().getMonth();
|
// 计算当前季度的开始时间和结束时间
|
LocalDate startDate = LocalDate.of(currentYear, getStartMonthOfQuarter(currentMonth), 1);
|
LocalDate endDate = startDate.plusMonths(2).with(TemporalAdjusters.lastDayOfMonth());
|
String startDateStr = String.valueOf(startDate);
|
String endDateStr = String.valueOf(endDate);
|
BigDecimal totalMoney;
|
if (OrderConstants.QUARTER.equals(type)) {
|
// 用户总交易额
|
totalMoney = baseMapper.totalMoneyByQuarter(startDateStr, endDateStr, cityList);
|
} else if (OrderConstants.YEAR.equals(type)) {
|
// 用户总交易额
|
totalMoney = baseMapper.totalMoneyByYear(cityList);
|
} else if (OrderConstants.MONTH.equals(type)) {
|
// 用户总交易额
|
totalMoney = baseMapper.totalMoneyByMonth(cityList);
|
} else {
|
// 数量初始化
|
totalMoney = BigDecimal.ZERO;
|
}
|
return totalMoney;
|
}
|
|
@Override
|
public Page<Order> orderListWorker(Integer userId, Integer state, Integer pageNum, Integer pageSize) {
|
return baseMapper.orderListWorker(userId, state, Page.of(pageNum, pageSize));
|
}
|
|
@Override
|
public List<WorkerOrderRankVO> workerOrderRank(List<Integer> workerIds) {
|
List<WorkerOrderRankVO> list = baseMapper.workerOrderRank(workerIds);
|
if (list.size() > Constants.TEN) {
|
list.subList(Constants.ZERO, Constants.TEN);
|
}
|
return list;
|
}
|
|
@Override
|
public Path orderNavigation(String userPosition, String workerPosition) {
|
return GaoDeMapUtil.routing(workerPosition, userPosition);
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public Boolean orderTop(String orderId, Integer workerId) {
|
// 订单代办列表
|
List<Order> orderList = this.lambdaQuery().eq(Order::getServerId, workerId)
|
.in(Order::getState, Constants.ONE, Constants.TWO)
|
.eq(Order::getIsDelete, 0)
|
.orderByAsc(Order::getTopSort).list();
|
int itemSort = 2;
|
for (Order order : orderList) {
|
if (null != order.getTopSort()) {
|
order.setTopSort(itemSort);
|
itemSort++;
|
}
|
}
|
this.updateBatchById(orderList);
|
return this.lambdaUpdate().set(Order::getTopSort, Constants.ONE)
|
.eq(Order::getServerId, workerId)
|
.eq(Order::getId, orderId)
|
.eq(Order::getIsDelete, 0).update();
|
}
|
|
@Override
|
public WorkerOrderCountVO orderStateCount(Integer workerId) {
|
return baseMapper.orderStateCount(workerId);
|
}
|
|
@Override
|
public Boolean placeOrder(UserOrderRequest userOrderRequest) {
|
// 下单参数
|
String orderNumber = userOrderRequest.getOrderNumber();
|
Integer serveId = userOrderRequest.getServeId();
|
String reservationName = userOrderRequest.getReservationName();
|
String reservationPhone = userOrderRequest.getReservationPhone();
|
Integer userId = userOrderRequest.getUserId();
|
String time = userOrderRequest.getTime();
|
String reservationRemark = userOrderRequest.getReservationRemark();
|
Double longitude = userOrderRequest.getLongitude();
|
Double latitude = userOrderRequest.getLatitude();
|
BigDecimal subsidy = userOrderRequest.getSubsidy();
|
BigDecimal defaultPrice = userOrderRequest.getDefaultPrice();
|
String serveName = userOrderRequest.getServeName();
|
String address = userOrderRequest.getAddress();
|
String addressDetail = userOrderRequest.getAddressDetail();
|
// 订单信息
|
Order order = new Order();
|
order.setOrderNumber(orderNumber);
|
order.setServeId(serveId);
|
order.setServeName(serveName);
|
order.setServePrice(defaultPrice);
|
order.setUserId(userId);
|
order.setReservationName(reservationName);
|
order.setReservationPhone(reservationPhone);
|
order.setReservationAddress(address);
|
order.setTime(time);
|
order.setReservationRemark(reservationRemark);
|
order.setOrderMoney(defaultPrice.add(new BigDecimal(String.valueOf(subsidy))));
|
order.setState(Constants.ZERO);
|
order.setType(Constants.ZERO);
|
order.setLongitude(longitude);
|
order.setLatitude(latitude);
|
order.setIsWithdrawal(Constants.ZERO);
|
order.setSubsidy(subsidy);
|
order.setAddress(addressDetail);
|
return this.save(order);
|
}
|
|
@Override
|
public String orderEstimate(UserOrderRequest userOrderRequest) {
|
// 下单参数
|
String orderNumber = userOrderRequest.getOrderNumber();
|
Integer serveId = userOrderRequest.getServeId();
|
String reservationName = userOrderRequest.getReservationName();
|
String reservationPhone = userOrderRequest.getReservationPhone();
|
Integer userId = userOrderRequest.getUserId();
|
String time = userOrderRequest.getTime();
|
String reservationRemark = userOrderRequest.getReservationRemark();
|
Double longitude = userOrderRequest.getLongitude();
|
Double latitude = userOrderRequest.getLatitude();
|
BigDecimal subsidy = userOrderRequest.getSubsidy();
|
BigDecimal defaultPrice = userOrderRequest.getDefaultPrice();
|
String serveName = userOrderRequest.getServeName();
|
String address = userOrderRequest.getAddress();
|
String addressDetail = userOrderRequest.getAddressDetail();
|
// 订单信息
|
Order order = new Order();
|
order.setOrderNumber(orderNumber);
|
order.setServeId(serveId);
|
order.setServeName(serveName);
|
order.setServePrice(defaultPrice);
|
order.setUserId(userId);
|
order.setReservationName(reservationName);
|
order.setReservationPhone(reservationPhone);
|
if (null == userOrderRequest.getAddressId()) {
|
order.setReservationAddress(addressDetail);
|
} else {
|
order.setReservationAddress(address);
|
}
|
order.setTime(time);
|
order.setReservationRemark(reservationRemark);
|
if (null != subsidy) {
|
order.setOrderMoney(defaultPrice.add(new BigDecimal(String.valueOf(subsidy))));
|
} else {
|
order.setOrderMoney(defaultPrice);
|
}
|
order.setState(Constants.ZERO);
|
order.setType(Constants.ZERO);
|
order.setLongitude(longitude);
|
order.setLatitude(latitude);
|
order.setIsWithdrawal(Constants.ZERO);
|
order.setSubsidy(subsidy);
|
order.setAddress(addressDetail);
|
this.save(order);
|
return String.valueOf(order.getId());
|
}
|
|
/**
|
* 根据当前月份获取当前季度的开始月份
|
*/
|
private static Month getStartMonthOfQuarter(Month currentMonth) {
|
if (currentMonth.compareTo(Month.JANUARY) >= 0 && currentMonth.compareTo(Month.MARCH) <= 0) {
|
return Month.JANUARY;
|
} else if (currentMonth.compareTo(Month.APRIL) >= 0 && currentMonth.compareTo(Month.JUNE) <= 0) {
|
return Month.APRIL;
|
} else if (currentMonth.compareTo(Month.JULY) >= 0 && currentMonth.compareTo(Month.SEPTEMBER) <= 0) {
|
return Month.JULY;
|
} else {
|
return Month.OCTOBER;
|
}
|
}
|
}
|