复习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、更新派件任务状态
业务分析:
取派件任务状态枚举类可以看到三个状态
快递员取消的原因
实现思路:
推荐阅读:
文章有(0)条网友点评