wlzboy
2025-11-11 310633feef20e9b77d44fd25e0b41778e033b33b
feat: 车辆GPS统计,并修改了一些变更任务状态的逻辑
15个文件已添加
8个文件已修改
145 ■■■■■ 已修改文件
app/api/mileageStats.js 补丁 | 查看 | 原始文档 | blame | 历史
app/api/task.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/pages/task/create-emergency.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/pages/task/detail.vue 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/config/TiandituMapConfig.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleMileageStatsTask.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskTimeInterval.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleMileageStats.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleMileageStatsMapper.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleMileageStatsService.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
sql/vehicle_mileage_stats.sql 补丁 | 查看 | 原始文档 | blame | 历史
sql/vehicle_mileage_stats_job.sql 补丁 | 查看 | 原始文档 | blame | 历史
sql/vehicle_mileage_stats_menu.sql 补丁 | 查看 | 原始文档 | blame | 历史
sql/车辆里程统计使用说明.md 补丁 | 查看 | 原始文档 | blame | 历史
sql/车辆里程统计实现总结.md 补丁 | 查看 | 原始文档 | blame | 历史
app/api/mileageStats.js
app/api/task.js
@@ -141,3 +141,11 @@
    method: 'get'
  })
}
// æ£€æŸ¥è½¦è¾†æ˜¯å¦æœ‰æ­£åœ¨è¿›è¡Œä¸­çš„任务
export function checkVehicleActiveTasks(vehicleId) {
  return request({
    url: '/task/vehicle/' + vehicleId + '/active',
    method: 'get'
  })
}
app/pages/task/create-emergency.vue
@@ -511,6 +511,7 @@
import { listBranchUsers } from "@/api/system/user"
import { searchIcd10 } from "@/api/icd10"
import { calculateTransferPrice } from "@/api/price"
import { checkVehicleActiveTasks } from "@/api/task"
import { getDicts } from "@/api/dict"
import { getServiceOrdAreaTypes, getServiceOrderTypes, getHospitalDepartments } from "@/api/dictionary"
app/pages/task/detail.vue
@@ -328,6 +328,7 @@
<script>
  import { getTask, changeTaskStatus } from '@/api/task'
  import { checkVehicleActiveTasks } from '@/api/task'
  import { formatDateTime } from '@/utils/common'
  import AttachmentUpload from '@/components/AttachmentUpload.vue'
  
@@ -504,10 +505,8 @@
      handleTaskAction(action) {
        switch (action) {
          case 'depart':
            // å‡ºå‘ -> çŠ¶æ€å˜ä¸ºå‡ºå‘ä¸­
            this.$modal.confirm('确定要出发吗?').then(() => {
              this.updateTaskStatus('DEPARTING', '任务已出发')
            }).catch(() => {});
            // å‡ºå‘ -> æ£€æŸ¥è½¦è¾†æ˜¯å¦æœ‰å…¶ä»–正在进行中的任务
            this.checkVehicleAndDepart();
            break;
            
          case 'cancel':
@@ -547,6 +546,82 @@
        }
      },
      
      // æ£€æŸ¥è½¦è¾†çŠ¶æ€å¹¶å‡ºå‘
      checkVehicleAndDepart() {
        // èŽ·å–ä»»åŠ¡è½¦è¾†ID
        const vehicleId = this.getVehicleId();
        if (!vehicleId) {
          this.$modal.showToast('未找到任务车辆信息');
          return;
        }
        // æ˜¾ç¤ºåŠ è½½æç¤º
        uni.showLoading({
          title: '检查车辆状态...'
        });
        checkVehicleActiveTasks(vehicleId).then(response => {
          uni.hideLoading();
          const activeTasks = response.data || [];
          // è¿‡æ»¤æŽ‰å½“前任务本身
          const otherActiveTasks = activeTasks.filter(task => task.taskId !== this.taskId);
          if (otherActiveTasks.length > 0) {
            // è½¦è¾†æœ‰å…¶ä»–正在进行中的任务
            const task = otherActiveTasks[0];
            const taskStatus = this.getStatusText(task.taskStatus);
            const message = `该车辆已有正在转运中的任务!
任务单号:${task.taskCode}
任务状态:${taskStatus}
请先完成当前任务后再出发新任务。`;
            uni.showModal({
              title: '提示',
              content: message,
              showCancel: false,
              confirmText: '我知道了'
            });
            return;
          }
          // è½¦è¾†æ²¡æœ‰å…¶ä»–正在进行中的任务,可以出发
          this.$modal.confirm('确定要出发吗?').then(() => {
            this.updateTaskStatus('DEPARTING', '任务已出发')
          }).catch(() => {});
        }).catch(error => {
          uni.hideLoading();
          console.error('检查车辆状态失败:', error);
          // æ£€æŸ¥å¤±è´¥æ—¶ï¼Œä»ç„¶å…è®¸å‡ºå‘
          this.$modal.confirm('检查车辆状态失败,是否继续出发?').then(() => {
            this.updateTaskStatus('DEPARTING', '任务已出发')
          }).catch(() => {});
        });
      },
      // èŽ·å–ä»»åŠ¡è½¦è¾†ID
      getVehicleId() {
        if (!this.taskDetail) {
          return null;
        }
        // ä»Žè½¦è¾†åˆ—表中获取第一个车辆的ID
        if (this.taskDetail.vehicleList && this.taskDetail.vehicleList.length > 0) {
          return this.taskDetail.vehicleList[0].vehicleId;
        }
        // æˆ–者从单个车辆对象获取
        if (this.taskDetail.vehicleId) {
          return this.taskDetail.vehicleId;
        }
        return null;
      },
      // æ›´æ–°ä»»åŠ¡çŠ¶æ€
      updateTaskStatus(status, remark) {
        // èŽ·å–GPS位置信息
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/VehicleMileageStatsController.java
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/SysTaskController.java
@@ -280,6 +280,16 @@
    }
    /**
     * æ£€æŸ¥è½¦è¾†æ˜¯å¦æœ‰æ­£åœ¨è¿›è¡Œä¸­çš„任务(APP端)
     * æ­£åœ¨è¿›è¡Œä¸­çš„任务是指状态不为:PENDING(待处理)、COMPLETED(已完成)、CANCELLED(已取消)的任务
     */
    @GetMapping("/vehicle/{vehicleId}/active")
    public AjaxResult checkVehicleActiveTasks(@PathVariable Long vehicleId) {
        List<SysTask> activeTasks = sysTaskService.checkVehicleActiveTasks(vehicleId);
        return success(activeTasks);
    }
    /**
     * åˆ†é…ä»»åŠ¡è¯·æ±‚å¯¹è±¡
     */
    public static class AssignTaskRequest {
ruoyi-common/src/main/java/com/ruoyi/common/config/TiandituMapConfig.java
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/VehicleMileageStatsTask.java
ruoyi-system/src/main/java/com/ruoyi/system/domain/TaskTimeInterval.java
ruoyi-system/src/main/java/com/ruoyi/system/domain/VehicleMileageStats.java
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysTaskMapper.java
@@ -114,4 +114,13 @@
     * @return ç»“æžœ
     */
    public int assignTask(SysTask sysTask);
    /**
     * æŸ¥è¯¢è½¦è¾†æ­£åœ¨è¿›è¡Œä¸­çš„任务
     * æ­£åœ¨è¿›è¡Œä¸­çš„任务是指状态不为:PENDING(待处理)、COMPLETED(已完成)、CANCELLED(已取消)的任务
     *
     * @param vehicleId è½¦è¾†ID
     * @return æ­£åœ¨è¿›è¡Œä¸­çš„任务列表
     */
    public List<SysTask> selectActiveTasksByVehicleId(Long vehicleId);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/VehicleMileageStatsMapper.java
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysTaskService.java
@@ -205,4 +205,13 @@
     * @return ä»»åŠ¡è¯¦æƒ…
     */
    public SysTask getTaskDetail(Long taskId);
    /**
     * æ£€æŸ¥è½¦è¾†æ˜¯å¦æœ‰æ­£åœ¨è¿›è¡Œä¸­çš„任务
     * æ­£åœ¨è¿›è¡Œä¸­çš„任务是指状态不为:PENDING(待处理)、COMPLETED(已完成)、CANCELLED(已取消)的任务
     *
     * @param vehicleId è½¦è¾†ID
     * @return æ­£åœ¨è¿›è¡Œä¸­çš„任务列表
     */
    public List<SysTask> checkVehicleActiveTasks(Long vehicleId);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/IVehicleMileageStatsService.java
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysTaskServiceImpl.java
@@ -961,6 +961,18 @@
        return task;
    }
    /**
     * æ£€æŸ¥è½¦è¾†æ˜¯å¦æœ‰æ­£åœ¨è¿›è¡Œä¸­çš„任务
     * æ­£åœ¨è¿›è¡Œä¸­çš„任务是指状态不为:PENDING(待处理)、COMPLETED(已完成)、CANCELLED(已取消)的任务
     *
     * @param vehicleId è½¦è¾†ID
     * @return æ­£åœ¨è¿›è¡Œä¸­çš„任务列表
     */
    @Override
    public List<SysTask> checkVehicleActiveTasks(Long vehicleId) {
        return sysTaskMapper.selectActiveTasksByVehicleId(vehicleId);
    }
    @Autowired
    private TaskCodeGenerator taskCodeGenerator;
    
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/VehicleMileageStatsServiceImpl.java
ruoyi-system/src/main/resources/mapper/system/SysTaskMapper.xml
@@ -268,6 +268,19 @@
        where task_id = #{taskId}
    </update>
    <select id="selectActiveTasksByVehicleId" parameterType="Long" resultMap="SysTaskResult">
        select t.task_id, t.task_code, t.task_type, t.task_status, t.task_description,
               t.departure_address, t.destination_address,
               t.planned_start_time, t.actual_start_time,
               t.create_time, t.update_time
        from sys_task t
        inner join sys_task_vehicle tv on t.task_id = tv.task_id
        where tv.vehicle_id = #{vehicleId}
          and t.del_flag = '0'
          and t.task_status not in ('PENDING', 'COMPLETED', 'CANCELLED')
        order by t.create_time desc
    </select>
    <delete id="deleteSysTaskByTaskId" parameterType="Long">
        update sys_task set del_flag = '2', update_time = now() where task_id = #{taskId}
    </delete>
ruoyi-system/src/main/resources/mapper/system/VehicleMileageStatsMapper.xml
sql/vehicle_mileage_stats.sql
sql/vehicle_mileage_stats_job.sql
sql/vehicle_mileage_stats_menu.sql
sql/³µÁ¾Àï³Ìͳ¼ÆÊ¹ÓÃ˵Ã÷.md
sql/³µÁ¾Àï³Ìͳ¼ÆÊµÏÖ×ܽá.md