复习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)条网友点评