任务管理模块技术文档

1. 概述

任务管理模块是i-Husky运维服务系统的核心功能组件,负责工单子任务的创建、分配、执行、跟踪和完成管理。该模块采用前后端分离架构,提供完整的任务生命周期管理功能,支持多端协作和实时状态同步。

1.1 技术栈

  • 前端: Vue 3 + Composition API + Element Plus + Vite
  • 后端: Spring Boot 2.5.15 + MyBatis-Plus + MySQL
  • 安全: Spring Security + JWT
  • 缓存: Redis
  • 文件存储: 阿里云OSS
  • 移动端: UniApp (Vue 3)

1.2 核心特性

  • 任务生命周期管理: 完整的状态流转和权限控制
  • 智能任务分配: 基于技术员技能和负载的分配算法
  • 实时进度跟踪: 动态进度计算和可视化展示
  • 处理记录时间线: 完整的执行历史和附件管理
  • 团队协作: 支持评论、回复和多角色协作
  • 多端同步: Web管理端和移动技术员端数据实时同步

2. 系统架构

2.1 整体架构图

┌─────────────────────────────────────────────────────────────┐
│                    任务管理模块架构                        │
├─────────────────────────────────────────────────────────────┤
│  前端展示层                                               │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │  Web管理端      │  │  移动技术员端   │              │
│  │  (Vue 3 +      │  │  (UniApp)       │              │
│  │   Element Plus) │  │                 │              │
│  └─────────────────┘  └─────────────────┘              │
├─────────────────────────────────────────────────────────────┤
│  API接口层                                                │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │ REST API + JWT认证统一接口                            │ │
│  └─────────────────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────────────┤
│  业务逻辑层                                               │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │ 任务管理Service │  │ 处理记录Service │              │
│  │                 │  │                 │              │
│  │ - 任务CRUD      │  │ - 时间线管理    │              │
│  │ - 状态管理      │  │ - 附件管理      │              │
│  │ - 进度计算      │  │ - 评论协作      │              │
│  │ - 分配算法      │  │                 │              │
│  └─────────────────┘  └─────────────────┘              │
├─────────────────────────────────────────────────────────────┤
│  数据访问层                                               │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │ MyBatis Mapper  │  │ 数据库          │              │
│  │                 │  │                 │              │
│  │ - XML映射       │  │ - 任务表        │              │
│  │ - 动态SQL       │  │ - 处理记录表    │              │
│  │ - 关联查询      │  │ - 状态变更表    │              │
│  │                 │  │                 │              │
│  └─────────────────┘  └─────────────────┘              │
├─────────────────────────────────────────────────────────────┤
│  基础支撑层                                               │
│  ┌─────────────────┐  ┌─────────────────┐              │
│  │ 权限管理        │  │ 通知服务        │              │
│  │                 │  │                 │              │
│  │ - 角色权限      │  │ - 邮件通知      │              │
│  │ - 数据权限      │  │ - WebSocket     │              │
│  │ - 操作日志      │  │ - 异步任务      │              │
│  └─────────────────┘  └─────────────────┘              │
└─────────────────────────────────────────────────────────────┘

2.2 数据流程图

工单创建 → 任务拆解 → 技术员分配 → 任务执行 → 进度更新 → 任务完成
    ↓         ↓         ↓         ↓         ↓         ↓
  维护计划  智能算法  负载均衡  处理记录  实时计算  状态同步
    ↓         ↓         ↓         ↓         ↓         ↓
  模板应用  批量生成  邮件通知  附件上传  工单更新  完成通知

3. 前端架构

3.1 组件层次结构

ui/src/views/business/subtask/
├── index.vue                           # 主列表页面
├── components/                        # 子组件目录
│   ├── task-processing.vue            # 任务处理对话框
│   ├── subtask-execution.vue          # 任务详情视图
│   ├── process-record-timeline.vue    # 处理记录时间线
│   ├── subtask-collaboration.vue      # 协作评论组件
│   └── assign-technician.vue          # 技术员分配组件
└── [其他组件...]

3.2 核心组件技术实现

3.2.1 任务处理组件 (task-processing.vue)

技术特点:

  • 使用Composition API进行状态管理
  • 响应式表单验证和动态字段控制
  • 文件上传组件集成与状态同步
  • 自动状态更新机制

关键代码实现:

// 处理结果与状态映射
const mapProcessResultToStatus = (processResult) => {
  const mapping = {
    'processing': 'processing',
    'completed': 'completed',
    'problem': 'processing',
    'need_help': 'processing',
    'paused': 'paused',
    'cancelled': 'cancelled'
  };
  return mapping[processResult] || 'processing';
};

// 使用带状态更新的处理记录API
const res = await addProcessRecordWithStatusUpdate(submitData);

3.2.2 处理记录时间线组件 (process-record-timeline.vue)

技术特点:

  • 时间线数据的动态加载和分页
  • 附件的缩略图预览和批量管理
  • 图片懒加载和性能优化
  • 响应式布局适配

关键功能:

// 附件列表处理
const getImageList = (attachments) => {
  if (!attachments) return [];
  return attachments.split(',').filter(url => url.trim());
};

// 快速预览功能
const handleQuickPreview = (image) => {
  // 实现图片预览逻辑
};

3.2.3 协作评论组件 (subtask-collaboration.vue)

技术特点:

  • 评论与回复的层级数据结构
  • 实时字数统计和输入验证
  • 图片上传预览和压缩
  • 权限控制和编辑管理

3.3 状态管理模式

采用Vue 3的响应式引用进行状态管理:

// 响应式状态定义
const subtask = ref({});
const loading = ref(false);
const submitting = ref(false);

// 表单状态管理
const processForm = reactive({
  subtaskId: props.subtaskId,
  processResult: '',
  detailDescription: '',
  attachments: [],
  attachmentsKey: '',
  remark: ''
});

3.4 API接口设计

统一的RESTful API接口调用:

// 任务相关API
import {
  getWorkOrderSubtask,        // 获取任务详情
  startSubtask,              // 开始任务
  pauseSubtask,             // 暂停任务
  completeSubtask,          // 完成任务
  updateSubtaskStatus       // 更新任务状态
} from '@/api/business/workOrderSubtask.js';

// 处理记录API
import {
  addProcessRecordWithStatusUpdate,  // 添加处理记录并更新状态
  getProcessTimeline                 // 获取处理时间线
} from '@/api/business/subtaskProcessRecord.js';

4. 后端架构

4.1 分层架构设计

com.husky.business/
├── controller/                    # 控制器层
│   └── BzWorkOrderSubtaskController.java
├── service/                       # 业务逻辑层
│   ├── IBzWorkOrderSubtaskService.java    # 服务接口
│   └── impl/                              # 服务实现
│       └── BzWorkOrderSubtaskServiceImpl.java
├── domain/                        # 数据模型层
│   ├── BzWorkOrderSubtask.java           # 任务实体
│   └── BzSubtaskProcessRecord.java       # 处理记录实体
├── mapper/                        # 数据访问层
│   └── BzWorkOrderSubtaskMapper.java
└── dto/vo/                       # 数据传输对象

4.2 核心业务逻辑

4.2.1 任务生命周期管理

/**
 * 任务状态流转业务逻辑
 */
@Transactional
public int startSubtask(Long subtaskId) {
    // 1. 验证任务状态
    if (!"pending".equals(subtask.getStatus())) {
        log.error("任务状态不正确,无法开始执行");
        return 0;
    }

    // 2. 更新任务状态和时间戳
    subtask.setStatus("in_progress");
    subtask.setStartedTime(DateUtils.getNowDate());
    subtask.setUpdateTime(DateUtils.getNowDate());

    // 3. 保存更改
    return bzWorkOrderSubtaskMapper.updateBzWorkOrderSubtask(subtask);
}

4.2.2 进度计算算法

/**
 * 工单整体进度计算
 */
public Integer calculateWorkOrderProgress(Long orderId) {
    // 获取所有子任务
    List<BzWorkOrderSubtask> subtasks =
        bzWorkOrderSubtaskMapper.selectBzWorkOrderSubtaskByOrderId(orderId);

    // 计算平均完成进度
    int totalProgress = 0;
    for (BzWorkOrderSubtask subtask : subtasks) {
        totalProgress += subtask.getProgressPercentage() != null ?
            subtask.getProgressPercentage() : 0;
    }

    return totalProgress / subtasks.size();
}

4.3 数据库设计

4.3.1 任务主表结构 (bz_work_order_subtask)

CREATE TABLE `bz_work_order_subtask` (
  `subtask_id` bigint NOT NULL AUTO_INCREMENT,
  `order_id` bigint DEFAULT NULL COMMENT '关联工单ID',
  `subtask_code` varchar(100) DEFAULT NULL COMMENT '任务编码',
  `subtask_title` varchar(500) DEFAULT NULL COMMENT '任务标题',
  `subtask_description` text COMMENT '任务描述',
  `subtask_type` varchar(50) DEFAULT NULL COMMENT '任务类型',
  `equipment_id` bigint DEFAULT NULL COMMENT '关联设备ID',
  `assigned_technician_id` bigint DEFAULT NULL COMMENT '分配技术员ID',
  `status` varchar(50) DEFAULT NULL COMMENT '任务状态',
  `priority` varchar(20) DEFAULT NULL COMMENT '优先级',
  `progress_percentage` int DEFAULT '0' COMMENT '完成进度(0-100)',
  `estimated_duration` int DEFAULT NULL COMMENT '预计耗时(分钟)',
  `actual_duration` int DEFAULT NULL COMMENT '实际耗时(分钟)',
  `planned_start_time` datetime DEFAULT NULL COMMENT '计划开始时间',
  `started_time` datetime DEFAULT NULL COMMENT '实际开始时间',
  `completed_time` datetime DEFAULT NULL COMMENT '完成时间',
  `result` text COMMENT '处理结果',
  `solution` text COMMENT '解决方案',
  `attachment_images` text COMMENT '图片附件',
  `attachment_files` text COMMENT '文件附件',
  `notes` text COMMENT '备注',
  `del_flag` char(1) DEFAULT '0' COMMENT '删除标志',
  `create_by` varchar(64) DEFAULT NULL COMMENT '创建者',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) DEFAULT NULL COMMENT '更新者',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`subtask_id`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_status` (`status`),
  KEY `idx_technician_id` (`assigned_technician_id`)
) ENGINE=InnoDB COMMENT='工单子任务表';

4.3.2 处理记录表结构 (bz_subtask_process_record)

CREATE TABLE `bz_subtask_process_record` (
  `record_id` bigint NOT NULL AUTO_INCREMENT,
  `subtask_id` bigint DEFAULT NULL COMMENT '子任务ID',
  `process_result` varchar(50) DEFAULT NULL COMMENT '处理结果',
  `detail_description` text COMMENT '详细描述',
  `attachments` text COMMENT '附件URL列表',
  `process_type` varchar(50) DEFAULT NULL COMMENT '处理类型',
  `operator_id` bigint DEFAULT NULL COMMENT '操作者ID',
  `operator_name` varchar(100) DEFAULT NULL COMMENT '操作者姓名',
  `operator_role` varchar(50) DEFAULT NULL COMMENT '操作者角色',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `remark` text COMMENT '备注',
  PRIMARY KEY (`record_id`),
  KEY `idx_subtask_id` (`subtask_id`),
  KEY `idx_operator_id` (`operator_id`)
) ENGINE=InnoDB COMMENT='子任务处理记录表';

4.4 MyBatis映射文件设计

4.4.1 动态SQL查询

<!-- 多条件动态查询 -->
<select id="selectBzWorkOrderSubtaskList" parameterType="BzWorkOrderSubtask"
        resultMap="BzWorkOrderSubtaskWithOrderResult">
    <include refid="selectBzWorkOrderSubtaskWithOrderVo"/>
    <where>
        <if test="orderId != null"> and st.order_id = #{orderId}</if>
        <if test="subtaskTitle != null and subtaskTitle != ''">
            and st.subtask_title like concat('%', #{subtaskTitle}, '%')
        </if>
        <if test="status != null and status != ''">
            and st.status = #{status}
        </if>
        <if test="assignedTechnicianId != null">
            and st.assigned_technician_id = #{assignedTechnicianId}
        </if>
    </where>
    order by st.create_time desc
</select>

4.4.2 批量操作优化

<!-- 批量插入子任务 -->
<insert id="batchInsertBzWorkOrderSubtask" parameterType="java.util.List">
    insert into bz_work_order_subtask
    (order_id, subtask_code, subtask_title, subtask_type, ...)
    values
    <foreach collection="list" item="item" separator=",">
        (#{item.orderId}, #{item.subtaskCode}, #{item.subtaskTitle}, ...)
    </foreach>
</insert>

5. API接口设计

5.1 RESTful API规范

5.1.1 任务管理接口

@RestController
@RequestMapping("/afterservice/workOrderSubtask")
public class BzWorkOrderSubtaskController extends BaseController {

    // 基础CRUD操作
    @GetMapping("/list")                           // 查询任务列表
    @PostMapping                                  // 新增任务
    @PutMapping                                   // 修改任务
    @DeleteMapping("/{subtaskIds}")                // 删除任务

    // 生命周期管理
    @PutMapping("/start/{subtaskId}")             // 开始任务
    @PutMapping("/pause/{subtaskId}")             // 暂停任务
    @PutMapping("/complete/{subtaskId}")          // 完成任务
    @PutMapping("/cancel/{subtaskId}")            // 取消任务

    // 进度和分配管理
    @PutMapping("/progress/{subtaskId}")          // 更新进度
    @PutMapping("/assign/{subtaskId}")            // 分配技术员
    @PutMapping("/reassign/{subtaskId}")          // 重新分配

    // 统计查询
    @GetMapping("/statistics/{orderId}")          // 工单统计
    @GetMapping("/workloadByTechnician/{id}")     // 技术员工作量

    // 技术员端接口
    @GetMapping("/technician/list")               // 技术员任务列表
    @PutMapping("/{subtaskId}/accept")            // 接受任务
    @PutMapping("/{subtaskId}/complete")          // 完成任务
}

5.2 权限控制设计

// 基于注解的权限控制
@PreAuthorize("@ss.hasPermi('business:subtask:list')")
@GetMapping("/list")
public TableDataInfo list(BzWorkOrderSubtask bzWorkOrderSubtask)

@PreAuthorize("@ss.hasPermi('business:subtask:edit')")
@PutMapping("/start/{subtaskId}")
public AjaxResult startSubtask(@PathVariable Long subtaskId)

5.3 统一响应格式

// 标准响应格式
public AjaxResult toAjax(int rows) {
    return rows > 0 ? AjaxResult.success() : AjaxResult.error();
}

// 带数据的成功响应
public AjaxResult success(Object data) {
    return AjaxResult.success("操作成功", data);
}

// 错误响应
public AjaxResult error(String msg) {
    return AjaxResult.error(msg);
}

6. 关键技术实现

6.1 状态联动机制

6.1.1 状态流转引擎

/**
 * 状态联动服务接口
 */
public interface IStatusLinkageService {
    /**
     * 带联动效果的状态变更
     */
    int changeStatusWithLinkage(String entityType, Long entityId,
                              String newStatus, Long userId,
                              String userName, String remark);

    /**
     * 获取允许的下一个状态列表
     */
    List<String> getAllowedNextStatuses(String entityType, String currentStatus);
}

6.1.2 状态变更历史

/**
 * 状态变更日志记录
 */
@Transactional
public int recordStatusChange(Long subtaskId, String oldStatus,
                             String newStatus, String remark) {
    // 记录状态变更历史
    BzStatusChangeLog log = new BzStatusChangeLog();
    log.setEntityType("subtask");
    log.setEntityId(subtaskId);
    log.setOldStatus(oldStatus);
    log.setNewStatus(newStatus);
    log.setRemark(remark);

    return bzStatusChangeLogService.insertBzStatusChangeLog(log);
}

6.2 通知服务机制

6.2.1 邮件通知服务

/**
 * 邮件通知服务
 */
@Service
public class BzEmailNotificationServiceImpl implements IBzEmailNotificationService {

    /**
     * 发送任务分配通知
     */
    public void sendSubtaskAssignmentNotification(BzWorkOrderSubtask subtask,
                                               String technicianName,
                                               String email) {
        // 构建邮件内容
        String subject = "任务分配通知 - " + subtask.getSubtaskCode();
        String content = buildAssignmentEmailContent(subtask, technicianName);

        // 发送邮件
        emailService.send(email, subject, content);

        // 记录邮件日志
        recordEmailLog(email, technicianName, subject, "SUBTASK_ASSIGNMENT");
    }
}

6.2.2 异步任务处理

/**
 * 异步任务管理器
 */
public class AsyncManager {

    /**
     * 执行异步任务
     */
    public void execute(TimerTask task) {
        // 使用线程池执行异步任务
        scheduledExecutor.schedule(task, 0, TimeUnit.MILLISECONDS);
    }
}

/**
 * 工单完成异步任务工厂
 */
public class AsyncFactory {

    /**
     * 记录工单完成信息
     */
    public static TimerTask recordWorkOrderCompletion(BzWorkOrder workOrder) {
        return new TimerTask() {
            @Override
            public void run() {
                // 异步记录完成信息、发送通知等
                workOrderCompletionService.recordCompletion(workOrder);
            }
        };
    }
}

6.3 文件上传与管理

6.3.1 统一附件上传组件

<!-- UnifiedAttachmentUpload 组件 -->
<template>
  <el-upload
    :action="uploadUrl"
    :headers="headers"
    :before-upload="beforeUpload"
    :on-success="handleSuccess"
    :on-error="handleError"
    :limit="limit"
    :file-size="maxSize"
    multiple
  >
    <el-button type="primary">选择文件</el-button>
  </el-upload>
</template>

<script setup>
// 文件上传前验证
const beforeUpload = (file) => {
  // 文件类型验证
  const isValidType = checkFileType(file);
  // 文件大小验证
  const isValidSize = checkFileSize(file);
  return isValidType && isValidSize;
};

// 上传成功处理
const handleSuccess = (response, file) => {
  // 更新文件列表
  uploadedFiles.value.push(response.data);
  emit('update:modelValue', uploadedFiles.value);
};
</script>

6.4 数据库性能优化

6.4.1 索引优化策略

-- 任务表关键索引
CREATE INDEX idx_order_status ON bz_work_order_subtask(order_id, status);
CREATE INDEX idx_technician_status ON bz_work_order_subtask(assigned_technician_id, status);
CREATE INDEX idx_create_time ON bz_work_order_subtask(create_time);

-- 处理记录表索引
CREATE INDEX idx_subtask_time ON bz_subtask_process_record(subtask_id, create_time);
CREATE INDEX idx_operator_time ON bz_subtask_process_record(operator_id, create_time);

6.4.2 查询性能优化

<!-- 分页查询优化 -->
<select id="selectBzWorkOrderSubtaskList" resultMap="BzWorkOrderSubtaskResult">
    SELECT * FROM bz_work_order_subtask
    WHERE del_flag = '0'
    ORDER BY create_time DESC
    LIMIT #{pageSize} OFFSET #{pageNum}
</select>

<!-- 统计查询优化 -->
<select id="calculateWorkOrderProgress" resultType="Integer">
    SELECT
        CASE WHEN COUNT(*) = 0 THEN 0
             ELSE ROUND(SUM(progress_percentage) / COUNT(*))
        END as progress
    FROM bz_work_order_subtask
    WHERE order_id = #{orderId} AND del_flag = '0'
</select>

7. 安全性设计

7.1 权限控制体系

7.1.1 基于角色的访问控制(RBAC)

@PreAuthorize("@ss.hasPermi('business:subtask:add')")
@PostMapping
public AjaxResult add(@RequestBody BzWorkOrderSubtask bzWorkOrderSubtask)

@PreAuthorize("@ss.hasPermi('business:subtask:edit')")
@PutMapping("/start/{subtaskId}")
public AjaxResult startSubtask(@PathVariable Long subtaskId)

7.1.2 数据权限控制

// 技术员只能查看分配给自己的任务
@GetMapping("/technician/list")
public TableDataInfo getTechnicianTasks(BzWorkOrderSubtask bzWorkOrderSubtask) {
    Long currentUserId = getCurrentUserId();
    bzWorkOrderSubtask.setAssignedTechnicianId(currentUserId);

    List<BzWorkOrderSubtask> list =
        bzWorkOrderSubtaskService.selectBzWorkOrderSubtaskList(bzWorkOrderSubtask);
    return getDataTable(list);
}

7.2 操作日志审计

7.2.1 操作日志记录

@Log(title = "开始子任务", businessType = BusinessType.UPDATE)
@PutMapping("/start/{subtaskId}")
public AjaxResult startSubtask(@PathVariable Long subtaskId) {
    return toAjax(bzWorkOrderSubtaskService.startSubtask(subtaskId));
}

7.2.2 数据变更历史

/**
 * 记录状态变更历史
 */
public int recordStatusChange(Long subtaskId, String oldStatus,
                           String newStatus, String remark) {
    BzStatusChangeLog log = new BzStatusChangeLog();
    log.setEntityType("subtask");
    log.setEntityId(subtaskId);
    log.setOldStatus(oldStatus);
    log.setNewStatus(newStatus);
    log.setChangeBy(SecurityUtils.getUsername());
    log.setChangeTime(new Date());
    log.setRemark(remark);

    return statusChangeLogMapper.insertBzStatusChangeLog(log);
}

8. 性能优化策略

8.1 缓存策略

8.1.1 Redis缓存应用

@Service
public class BzWorkOrderSubtaskServiceImpl implements IBzWorkOrderSubtaskService {

    @Cacheable(value = "subtask", key = "#subtaskId")
    public BzWorkOrderSubtask selectBzWorkOrderSubtaskBySubtaskId(Long subtaskId) {
        return bzWorkOrderSubtaskMapper.selectBzWorkOrderSubtaskBySubtaskId(subtaskId);
    }

    @CacheEvict(value = "subtask", key = "#subtask.subtaskId")
    public int updateBzWorkOrderSubtask(BzWorkOrderSubtask subtask) {
        return bzWorkOrderSubtaskMapper.updateBzWorkOrderSubtask(subtask);
    }
}

8.2 数据库优化

8.2.1 批量操作优化

@Transactional
public int batchInsertBzWorkOrderSubtask(List<BzWorkOrderSubtask> subtaskList) {
    if (subtaskList == null || subtaskList.isEmpty()) {
        return 0;
    }

    // 批量插入,减少数据库IO
    return bzWorkOrderSubtaskMapper.batchInsertBzWorkOrderSubtask(subtaskList);
}

8.2.2 查询优化

<!-- 避免N+1查询问题 -->
<resultMap type="BzWorkOrderSubtask" id="BzWorkOrderSubtaskWithOrderResult">
    <!-- 基本字段映射 -->
    <association property="workOrder" javaType="BzWorkOrder">
        <id property="orderId" column="order_id"/>
        <result property="orderTitle" column="order_title"/>
        <result property="orderCode" column="order_code"/>
    </association>
</resultMap>

8.3 前端性能优化

8.3.1 组件懒加载

// 路由懒加载
const routes = [
  {
    path: '/business/subtask',
    component: () => import('@/views/business/subtask/index.vue'),
    meta: { requiresAuth: true }
  }
];

8.3.2 图片懒加载和压缩

<template>
  <el-image
    :src="image.url"
    :lazy="true"
    fit="cover"
    :preview-src-list="previewList"
  >
    <template #error>
      <div class="image-error">加载失败</div>
    </template>
  </el-image>
</template>

9. 部署和监控

9.1 部署配置

9.1.1 数据库配置

# application.yml
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/husky_afterservice_db?useUnicode=true&characterEncoding=utf8
    username: root
    password: password
    druid:
      initial-size: 10
      max-active: 800
      min-idle: 10
      max-wait: 60000

9.1.2 缓存配置

spring:
  redis:
    host: localhost
    port: 6379
    database: 0
    timeout: 10000ms
    lettuce:
      pool:
        max-active: 200
        max-wait: -1ms
        max-idle: 10
        min-idle: 0

9.2 监控指标

9.2.1 性能监控

// Druid数据源监控
@RestController
@RequestMapping("/druid")
public class DruidController {

    @GetMapping("/stat")
    public AjaxResult getDataSourceStat() {
        // 返回数据源统计信息
        return AjaxResult.success(DruidStatManager.getInstance().getDataSourceStatList());
    }
}

9.2.2 业务监控

@Service
public class SubtaskMonitoringService {

    /**
     * 监控任务处理时效
     */
    public void monitorTaskProcessingTime() {
        // 监控任务从分配到完成的平均处理时间
        // 监控各环节的处理效率
        // 发现异常任务并预警
    }

    /**
     * 监控技术员工作量
     */
    public void monitorTechnicianWorkload() {
        // 监控技术员任务分配均衡性
        // 监控任务完成质量
        // 生成工作量报表
    }
}

10. 扩展性设计

10.1 插件化架构

10.1.1 任务分配策略插件

/**
 * 任务分配策略接口
 */
public interface TaskAssignmentStrategy {

    /**
     * 为任务分配技术员
     * @param subtask 任务信息
     * @param candidates 候选技术员列表
     * @return 推荐的技术员
     */
    BzTechnician assignTechnician(BzWorkOrderSubtask subtask,
                                 List<BzTechnician> candidates);
}

/**
 * 负载均衡分配策略
 */
@Service("loadBalanceStrategy")
public class LoadBalanceAssignmentStrategy implements TaskAssignmentStrategy {

    @Override
    public BzTechnician assignTechnician(BzWorkOrderSubtask subtask,
                                        List<BzTechnician> candidates) {
        // 基于当前任务数量进行负载均衡分配
        return candidates.stream()
            .min(Comparator.comparingInt(t -> getCurrentTaskCount(t.getTechnicianId())))
            .orElse(null);
    }
}

10.2 事件驱动架构

10.2.1 任务状态事件

/**
 * 任务状态变更事件
 */
public class TaskStatusChangeEvent {
    private Long subtaskId;
    private String oldStatus;
    private String newStatus;
    private Long operatorId;
    private Date changeTime;

    // 事件监听器
    @EventListener
    public void handleTaskStatusChange(TaskStatusChangeEvent event) {
        // 处理状态变更后的业务逻辑
        // 更新工单进度、发送通知等
    }
}

11. 最佳实践

11.1 代码规范

11.1.1 命名规范

// 实体类命名:Bz + 业务名称 + 实体类型
public class BzWorkOrderSubtask {
    private Long subtaskId;           // 主键ID
    private Long orderId;            // 关联工单ID
    private String subtaskTitle;      // 任务标题
    // ...
}

// Service接口命名:I + 业务名称 + Service
public interface IBzWorkOrderSubtaskService {
    public BzWorkOrderSubtask selectBzWorkOrderSubtaskBySubtaskId(Long subtaskId);
    // ...
}

11.1.2 注解规范

// 事务注解
@Transactional
public int updateSubtaskStatus(Long subtaskId, String status) {
    // 业务逻辑
}

// 权限注解
@PreAuthorize("@ss.hasPermi('business:subtask:edit')")
@PutMapping("/start/{subtaskId}")
public AjaxResult startSubtask(@PathVariable Long subtaskId)

// 日志注解
@Log(title = "开始子任务", businessType = BusinessType.UPDATE)

11.2 异常处理

11.2.1 统一异常处理

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(BusinessException.class)
    public AjaxResult handleBusinessException(BusinessException e) {
        log.error("业务异常:{}", e.getMessage());
        return AjaxResult.error(e.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public AjaxResult handleException(Exception e) {
        log.error("系统异常", e);
        return AjaxResult.error("系统异常,请联系管理员");
    }
}

11.3 测试策略

11.3.1 单元测试

@SpringBootTest
public class BzWorkOrderSubtaskServiceTest {

    @Autowired
    private IBzWorkOrderSubtaskService subtaskService;

    @Test
    public void testStartSubtask() {
        // 准备测试数据
        BzWorkOrderSubtask subtask = createTestSubtask();

        // 执行测试
        int result = subtaskService.startSubtask(subtask.getSubtaskId());

        // 验证结果
        assertEquals(1, result);
        assertEquals("in_progress", subtask.getStatus());
    }
}

12. 总结

12.1 技术架构优势

  1. 分层清晰:严格的三层架构,职责分明,便于维护
  2. 技术先进:采用Vue 3、Spring Boot等现代化技术栈
  3. 性能优化:多层次的缓存策略和数据库优化
  4. 安全可靠:完善的权限控制和操作审计
  5. 扩展性强:插件化架构和事件驱动设计

12.2 业务价值

  1. 提高效率:自动化任务分配和进度跟踪
  2. 降低成本:优化技术员工作负载和资源利用
  3. 提升质量:标准化的处理流程和质量控制
  4. 增强协作:多端协作和实时信息同步
  5. 数据驱动:完整的业务数据统计和分析

12.3 未来发展方向

  1. AI智能化:引入机器学习优化任务分配算法
  2. 移动化:完善移动端功能和离线支持
  3. 物联网集成:与设备监控系统的深度集成
  4. 大数据分析:构建预测性维护模型
  5. 微服务化:向微服务架构演进

文档版本: 1.0
创建日期: 2025年10月15日
适用系统版本: i-Husky运维服务系统 v3.9.0+
维护责任人: 技术架构团队

作者:聂盼盼  创建时间:2025-10-15 23:44
最后编辑:聂盼盼  更新时间:2025-10-28 19:53