复习5号学习的内容                                            (业务+技术)

作业范围:

业务如下

1、地图上展示机构作业范围和快递员作业范围(地图上画一些坐标保存起来)

2、最终技术在地图上画范围,画完之后把地图上多边形保存到Mongdb

技术如下

1、保存坐标用的技术Mongdb(里面有地理位置的查询,方便使用),是介于关系型数据库和非关系型数据库之间的一款数据库,使用不需要提前创建且并发强存储强。---以后用价值不是很高数据量特别大的时候用Mongdb技术。

2、Java操作Mongdb,用得到的是springDataMongdb


2025/7/9

智能调度功能:分配快递员、取派件任务、运单调度、运输任务


2025/7/10

取派件任务

一、业务分析:

快递员在登录到APP后,可以查到取派件任务列表

取件任务列表:

业务三:神领核心功能-智能调度需求分析

派件任务列表:

业务三:神领核心功能-智能调度需求分析


二、技术实现思路

1、编写消费消息的逻辑,生成快递员取派件任务。

大的方面

业务三:神领核心功能-智能调度需求分析

具体work微服务监听消息实现思路

业务三:神领核心功能-智能调度需求分析


2、查询快递员任务数

业务分析:

在前一天-智能调度之选取快递员的业务中OrderMQListener监听类(订单业务消息,接收到新订单后,根据快递员的负载情况,分配快递员)在选取符合条件的快递员的方法中是写死的,现在我们需要把写死的代码变成动态的。

技术思路:

业务三:神领核心功能-智能调度需求分析

PickupDispatchTaskController

    @GetMapping("count")
    @ApiOperation(value = "任务数量查询", notes = "按照当日快递员id列表查询每个快递员的取派件任务数")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "courierIds", value = "订单id列表", required = true),
            @ApiImplicitParam(name = "taskType", value = "任务类型", required = true),
            @ApiImplicitParam(name = "date", value = "日期,格式:yyyy-MM-dd 或 yyyyMMdd", required = true)
    })
    public List<CourierTaskCountDTO> findCountByCourierIds(@RequestParam("courierIds") List<Long> courierIds,
                                                           @RequestParam("taskType") PickupDispatchTaskType taskType,
                                                           @RequestParam("date") String date) {
        return this.pickupDispatchTaskService.findCountByCourierIds(courierIds, taskType, date);
    }

PickupDispatchTaskServiceImpl

 /**
     * 按照当日快递员id列表查询每个快递员的取派件任务数
     *
     * @param courierIds             快递员id列表
     * @param pickupDispatchTaskType 任务类型
     * @param date                   日期,格式:yyyy-MM-dd 或 yyyyMMdd
     * @return 任务数
    SELECT courier_id, COUNT(*) count  FROM  sl_pickup_dispatch_task  WHERE courier_id IN (1024988097613534273,1024988171324232993)
    AND estimated_start_time BETWEEN   '2025-07-10 00:00:00'  AND  '2025-07-10 23:59:59'
    AND task_type = 1
    GROUP BY courier_id
     */
    @Override
    public List<CourierTaskCountDTO> findCountByCourierIds(List<Long> courierIds, PickupDispatchTaskType pickupDispatchTaskType, String date) {
        // date = 2025-07-10

        //计算一天的时间的边界(处理sql的时间问题)
        DateTime dateTime = DateUtil.parse(date);
        LocalDateTime startDateTime = DateUtil.beginOfDay(dateTime).toLocalDateTime();
        LocalDateTime endDateTime = DateUtil.endOfDay(dateTime).toLocalDateTime();
        //快递员id列表
        List<CourierTaskCountDTO> courierTaskCountDTOS = this.baseMapper.findCountByCourierIds(courierIds, pickupDispatchTaskType.getCode(), startDateTime, endDateTime);

        //下面的处理是,还没产生任务的快递员,把任务数量设置 为0
        // 没有任务数的用0填充
        for (Long courierId : courierIds) {  //景元 景昌的两个id
             CourierTaskCountDTO countDTO = CollUtil.findOneByField(courierTaskCountDTOS, "courierId", courierId);
            if(ObjectUtil.isNull(countDTO)){
                courierTaskCountDTOS.add(CourierTaskCountDTO.builder().courierId(courierId).count(0L).build());
            }
        }
        return courierTaskCountDTOS;
    }

TaskPickupDispatchMapper

/**
 * 取件、派件任务信息表 Mapper 接口
 */
@Mapper
public interface TaskPickupDispatchMapper extends BaseMapper<PickupDispatchTaskEntity> {

    List<CourierTaskCountDTO> findCountByCourierIds(@Param("courierIds") List<Long> courierIds,
                                                    @Param("type") Integer type,
                                                    @Param("startDateTime") LocalDateTime startDateTime,
                                                    @Param("endDateTime") LocalDateTime endDateTime);
}

TaskPickupDispatchMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sl.ms.work.mapper.TaskPickupDispatchMapper">

    <select id="findCountByCourierIds" resultType="com.sl.ms.work.domain.dto.CourierTaskCountDTO">
        SELECT courier_id, COUNT(*) count
        FROM  sl_pickup_dispatch_task
        WHERE courier_id IN
        <foreach collection="courierIds" open="(" close=")" separator="," item="courierId">
            #{courierId}
        </foreach>
        AND estimated_start_time BETWEEN   #{startDateTime}  AND  #{endDateTime}
        AND task_type = #{type}
        GROUP BY courier_id
    </select>

</mapper>

3、更新派件任务状态

业务分析

取派件任务状态枚举类可以看到三个状态

业务三:神领核心功能-智能调度需求分析

业务三:神领核心功能-智能调度需求分析

快递员取消的原因

业务三:神领核心功能-智能调度需求分析

实现思路:

业务三:神领核心功能-智能调度需求分析