From 5d7b65670282a4fad015e37d567cfa171b162052 Mon Sep 17 00:00:00 2001
From: huliguo <2023611923@qq.com>
Date: 星期二, 20 五月 2025 12:25:19 +0800
Subject: [PATCH] 基础代码

---
 pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java |  380 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 380 insertions(+), 0 deletions(-)

diff --git a/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java
new file mode 100644
index 0000000..09ff25c
--- /dev/null
+++ b/pt-errand/src/main/java/com/ruoyi/errand/service/impl/CourierServiceImpl.java
@@ -0,0 +1,380 @@
+package com.ruoyi.errand.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.errand.constant.DelFlagConstant;
+import com.ruoyi.errand.domain.*;
+import com.ruoyi.errand.mapper.*;
+import com.ruoyi.errand.object.dto.sys.AddCourierDTO;
+import com.ruoyi.errand.object.dto.sys.CourierPageListDTO;
+import com.ruoyi.errand.object.dto.sys.EditCourierDTO;
+import com.ruoyi.errand.object.vo.app.CompleteOrderDTO;
+import com.ruoyi.errand.object.vo.app.CourierInfoVO;
+import com.ruoyi.errand.object.vo.app.CourierOrderListVO;
+import com.ruoyi.errand.object.vo.app.CourierStatisticsVO;
+import com.ruoyi.errand.object.vo.sys.AllCourierListVO;
+import com.ruoyi.errand.object.vo.sys.AppUserPageListVO;
+import com.ruoyi.errand.object.vo.sys.CourierPageListVO;
+import com.ruoyi.errand.object.vo.sys.CourierSysDetailVO;
+import com.ruoyi.errand.service.AppUserService;
+import com.ruoyi.errand.service.CourierService;
+import com.ruoyi.errand.utils.RedisService;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.TemporalAdjusters;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class CourierServiceImpl extends ServiceImpl<CourierMapper, Courier> implements CourierService {
+
+    @Resource
+    private  EvaluationMapper evaluationMapper;
+    @Autowired
+    private OrderMapper orderMapper;
+    @Autowired
+    private CommunityCourierMapper communityCourierMapper;
+    @Autowired
+    private RedisService redisService;
+    @Autowired
+    private AppUserMapper appUserMapper;
+    @Autowired
+    private CommunityMapper communityMapper;
+
+
+    @Override
+    public CourierInfoVO getCourierInfo() {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        return this.baseMapper.getCourierInfo(appuser.getCourierId());
+    }
+
+    @Override
+    public CourierStatisticsVO getDatStatistics() {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+
+        //本日 本周 本月
+        CourierStatisticsVO vo =this.baseMapper.getDatStatistics(appuser.getCourierId());
+        //统计五星好评的订单数量
+        Integer fiveCount=evaluationMapper.getFiveCount(appuser.getCourierId());
+        vo.setFive(fiveCount);
+        return vo;
+    }
+
+    @Override
+    public IPage<CourierOrderListVO> getCourierOrderList(Integer pageNum, Integer pageSize, Integer orderStatus) {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        IPage<CourierOrderListVO> page=new Page<>(pageNum, pageSize);
+        return this.baseMapper.getCourierOrderList(page,orderStatus,appuser.getCourierId());
+    }
+
+    @Override
+    public void receiveOrder(Integer id) {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        if (appuser.getCourierId()==null){
+            throw new ServiceException("您还不是跑腿员");
+        }
+        CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, appuser.getCourierId()));
+        if(communityCourier==null){
+            throw new ServiceException("您未绑定小区");
+        }
+        //判断订单是否存在
+        Order order = orderMapper.selectById(id);
+        if (order==null || order.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("订单不存在");
+        }
+        if (order.getOrderStatus()!=1){
+            throw new ServiceException("订单状态错误");
+        }
+        if (!order.getCommunityId().equals(communityCourier.getCommunityId())){
+            throw new ServiceException("该订单不属于您绑定的小区");
+        }
+
+        //修改订单状态
+        order.setOrderStatus(2);
+        order.setReceivingTime(LocalDateTime.now());
+        orderMapper.updateById(order);
+
+    }
+
+    @Override
+    public void completeOrder(CompleteOrderDTO completeOrderDTO) {
+        AppUser appuser = (AppUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
+        if (appuser.getCourierId()==null){
+            throw new ServiceException("您还不是跑腿员");
+        }
+        CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaUpdateWrapper<CommunityCourier>()
+                .eq(CommunityCourier::getCourierId, appuser.getCourierId()));
+        if(communityCourier==null){
+            throw new ServiceException("您未绑定小区");
+        }
+        //判断订单是否存在
+        Order order = orderMapper.selectById(completeOrderDTO.getId());
+        if (order==null || order.getDelFlag().equals(DelFlagConstant.DELETE)){
+            throw new ServiceException("订单不存在");
+        }
+        if (order.getOrderStatus()!=2){
+            throw new ServiceException("订单状态错误");
+        }
+        if (!order.getCommunityId().equals(communityCourier.getCommunityId())){
+            throw new ServiceException("该订单不属于您绑定的小区");
+        }
+
+        order.setOrderStatus(4);
+        order.setCourierPics(completeOrderDTO.getCourierPics());
+        order.setFinishTime(LocalDateTime.now());
+        orderMapper.updateById(order);
+        //评价
+        if (completeOrderDTO.getRating()!=null){
+            Evaluation evaluation = new Evaluation();
+            evaluation.setOrderId(order.getId());
+            evaluation.setType(1);
+            evaluation.setRating(completeOrderDTO.getRating());
+            if (null!=completeOrderDTO.getContent()){
+                evaluation.setContent(completeOrderDTO.getContent());
+            }
+            evaluationMapper.insert(evaluation);
+        }
+    }
+
+    @Override
+    public IPage<CourierPageListVO> getCourierPageList(CourierPageListDTO dto) {
+        IPage<CourierPageListVO> page = new Page<>(dto.getPageNum(),dto.getPageSize());
+        IPage<CourierPageListVO> iPage=this.baseMapper.getCourierPageList(page,dto);
+
+        iPage.getRecords().forEach(x->{
+            List<Order> orderList = orderMapper.selectList(new LambdaUpdateWrapper<Order>()
+                    .eq(Order::getCourierId, x.getId())
+                    .eq(Order::getDelFlag,DelFlagConstant.UNDELETE)
+                    .eq(Order::getPayMethod,2));
+            if (orderList!=null&& !orderList.isEmpty()){
+                //当天接单量
+                LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+                LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+                long todayNum = countByTimeRange(orderList, todayStart, todayEnd);
+                x.setToday((int) todayNum);
+                //本周接单量
+                LocalDate today = LocalDate.now();
+                LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+                LocalDateTime weekStart = LocalDateTime.of(monday, LocalTime.MIN);
+                LocalDate sunday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+                LocalDateTime weekEnd = LocalDateTime.of(sunday, LocalTime.MAX);
+                long week = countByTimeRange(orderList, weekStart, weekEnd);
+                x.setWeek((int) week);
+                //本月接单量
+                LocalDate firstDay = today.withDayOfMonth(1);
+                LocalDateTime mouthStart = LocalDateTime.of(firstDay, LocalTime.MIN);
+                LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth());
+                LocalDateTime mouthEnd = LocalDateTime.of(lastDay, LocalTime.MAX);
+                long mouth = countByTimeRange(orderList, mouthStart, mouthEnd);
+                x.setMouth((int) mouth);
+                //五星好评数
+                List<Integer> orderIds = orderList.stream().map(Order::getId).collect(Collectors.toList());
+                Long five = evaluationMapper.selectCount(new LambdaQueryWrapper<Evaluation>()
+                        .in(Evaluation::getOrderId, orderIds)
+                        .eq(Evaluation::getType, 0)
+                        .eq(Evaluation::getRating, 5.0));
+                x.setFive(five.intValue());
+            }
+
+        });
+        return iPage;
+    }
+
+    @Override
+    public CourierSysDetailVO detail(Integer id) {
+        CourierSysDetailVO vo=this.baseMapper.detail(id);
+        List<Order> orderList = orderMapper.selectList(new LambdaUpdateWrapper<Order>()
+                .eq(Order::getCourierId, id)
+                .eq(Order::getDelFlag,DelFlagConstant.UNDELETE)
+                .eq(Order::getPayMethod,2));
+        if (orderList!=null&& !orderList.isEmpty()){
+            //当天接单量
+            LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+            LocalDateTime todayEnd = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+            long todayNum = countByTimeRange(orderList, todayStart, todayEnd);
+            vo.setToday((int) todayNum);
+            //本周接单量
+            LocalDate today = LocalDate.now();
+            LocalDate monday = today.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
+            LocalDateTime weekStart = LocalDateTime.of(monday, LocalTime.MIN);
+            LocalDate sunday = today.with(TemporalAdjusters.nextOrSame(DayOfWeek.SUNDAY));
+            LocalDateTime weekEnd = LocalDateTime.of(sunday, LocalTime.MAX);
+            long week = countByTimeRange(orderList, weekStart, weekEnd);
+            vo.setWeek((int) week);
+            //本月接单量
+            LocalDate firstDay = today.withDayOfMonth(1);
+            LocalDateTime mouthStart = LocalDateTime.of(firstDay, LocalTime.MIN);
+            LocalDate lastDay = today.with(TemporalAdjusters.lastDayOfMonth());
+            LocalDateTime mouthEnd = LocalDateTime.of(lastDay, LocalTime.MAX);
+            long mouth = countByTimeRange(orderList, mouthStart, mouthEnd);
+            vo.setMouth((int) mouth);
+            //五星好评
+            List<Integer> orderIds = orderList.stream().map(Order::getId).collect(Collectors.toList());
+            Long five = evaluationMapper.selectCount(new LambdaQueryWrapper<Evaluation>()
+                    .in(Evaluation::getOrderId, orderIds)
+                    .eq(Evaluation::getType, 0)
+                    .eq(Evaluation::getRating, 5.0));
+            vo.setFive(five.intValue());
+            //总共接单量
+            vo.setTotal(orderIds.size());
+        }
+
+
+        return vo;
+    }
+
+    @Override
+    public void add(AddCourierDTO addCourierDTO) {
+        AppUser appUser = appUserMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, addCourierDTO.getPhone()).
+                eq(AppUser::getDelFlag, DelFlagConstant.UNDELETE));
+        if (appUser == null) {
+            throw new ServiceException("请先注册小程序");
+        }
+        //手机号是否存在
+        Courier courier = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Courier>().eq(Courier::getPhone, addCourierDTO.getPhone())
+                .eq(Courier::getDelFlag, DelFlagConstant.UNDELETE));
+        if (courier != null) {
+            throw new ServiceException("该手机号的跑腿员已存在");
+        }
+        if (addCourierDTO.getCommunityId() != null) {
+            //绑定的小区是否存在
+            Community community = communityMapper.selectById(addCourierDTO.getCommunityId());
+            if (community == null|| Objects.equals(community.getDelFlag(), DelFlagConstant.DELETE)) {
+                throw new ServiceException("绑定的小区不存在");
+            }
+            //绑定的小区是否被别人绑定了
+            CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>()
+                    .eq(CommunityCourier::getCommunityId, addCourierDTO.getCommunityId()));
+            if (communityCourier != null) {
+                throw new ServiceException("该小区已被绑定");
+            }
+
+        }
+        //保存跑腿人员
+        Courier courier1 = new Courier();
+        BeanUtils.copyProperties(addCourierDTO, courier1);
+        this.save(courier1);
+        //绑定小区
+        if (addCourierDTO.getCommunityId() != null) {
+            CommunityCourier communityCourier = new CommunityCourier();
+            communityCourier.setCommunityId(addCourierDTO.getCommunityId());
+            communityCourier.setCourierId(courier1.getId());
+            communityCourierMapper.insert(communityCourier);
+        }
+    }
+
+    @Override
+    public void edit(EditCourierDTO editCourierDTO) {
+        Courier courier = this.getById(editCourierDTO.getId());
+        //检查是否存在
+        if (courier == null || courier.getDelFlag().equals(DelFlagConstant.DELETE)) {
+            throw new ServiceException("该跑腿员不存在");
+        }
+        //是否更改了手机号
+        if (!courier.getPhone().equals(editCourierDTO.getPhone())) {
+            //更改了手机号
+            AppUser appUser = appUserMapper.selectOne(new LambdaQueryWrapper<AppUser>().eq(AppUser::getPhone, editCourierDTO.getPhone()).
+                    eq(AppUser::getDelFlag, DelFlagConstant.UNDELETE));
+            if (appUser == null) {
+                throw new ServiceException("请先注册小程序");
+            }
+            Courier courier1 = this.getBaseMapper().selectOne(new LambdaQueryWrapper<Courier>().eq(Courier::getPhone, editCourierDTO.getPhone())
+                    .eq(Courier::getDelFlag, DelFlagConstant.UNDELETE));
+            if (courier1 != null ) {
+                throw new ServiceException("该手机号的跑腿员已存在");
+            }
+        }
+        //是否更改了小区
+        CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, editCourierDTO.getId()));
+        if (communityCourier != null) {
+            //之前有绑定小区
+            if (editCourierDTO.getCommunityId() == null) {
+                //现在没有绑定,之前的要解绑
+                communityCourierMapper.deleteById(communityCourier.getId());
+
+            }else if (!editCourierDTO.getCommunityId().equals(communityCourier.getCommunityId())) {
+                //现在绑定了,不和之前的一样
+                //绑定的小区是否存在
+                Community community = communityMapper.selectById(editCourierDTO.getCommunityId());
+                if (community == null|| Objects.equals(community.getDelFlag(), DelFlagConstant.DELETE)) {
+                    throw new ServiceException("绑定的小区不存在");
+                }
+                //绑定的小区是否被别人绑定了
+                CommunityCourier communityCourier1 = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>()
+                        .eq(CommunityCourier::getCommunityId, editCourierDTO.getCommunityId()));
+                if (communityCourier1 != null) {
+                    throw new ServiceException("该小区已被绑定");
+                }
+                //修改
+                communityCourier.setCommunityId(editCourierDTO.getCommunityId());
+                communityCourier.setUpdateTime(LocalDateTime.now());
+                communityCourierMapper.updateById(communityCourier);
+            }
+        }
+        //修改
+        BeanUtils.copyProperties(editCourierDTO, courier);
+        this.updateById(courier);
+
+    }
+
+    @Override
+    public void froze(Integer id) {
+        Courier  courier= this.getById(id);
+        if (courier == null||courier.getDelFlag().equals(DelFlagConstant.DELETE)) {
+            throw new ServiceException("该跑腿员不存在");
+        }
+        courier.setStatus(courier.getStatus()==0?1:0);
+        courier.setUpdateTime(LocalDateTime.now());
+        this.updateById(courier);
+    }
+
+    @Override
+    public void delete(Integer id) {
+        Courier  courier= this.getById(id);
+        if (courier == null||courier.getDelFlag().equals(DelFlagConstant.DELETE)) {
+            throw new ServiceException("该跑腿员不存在");
+        }
+        //判断跑腿员是否绑定了小区
+        CommunityCourier communityCourier = communityCourierMapper.selectOne(new LambdaQueryWrapper<CommunityCourier>().eq(CommunityCourier::getCourierId, id));
+        if (communityCourier != null) {
+            communityCourierMapper.deleteById(communityCourier.getId());//解绑
+        }
+        courier.setDelFlag(DelFlagConstant.DELETE);
+        courier.setUpdateTime(LocalDateTime.now());
+        this.updateById(courier);
+
+    }
+
+    @Override
+    public List<AllCourierListVO> getAllCourierList() {
+        List<Integer> couriers= communityCourierMapper.getAllCourierList();
+        return this.baseMapper.getAllCourierList(couriers);
+
+    }
+
+    private static long countByTimeRange(List<Order> orderList, LocalDateTime start, LocalDateTime end) {
+        return orderList.stream()
+                .filter(order -> order.getOrderTime() != null) // 过滤空时间
+                .filter(order -> order.getOrderTime().isAfter(start.minusNanos(1))) // 大于等于 start
+                .filter(order -> order.getOrderTime().isBefore(end.plusNanos(1))) // 小于等于 end
+                .count();
+    }
+
+
+}
\ No newline at end of file

--
Gitblit v1.7.1