编辑 | blame | 历史 | 原始文档

任务附件同步ImageData功能说明

功能概述

本功能实现了将任务附件(sys_task_attachment表)自动同步到ImageData表的能力。当任务关联了服务单(serviceOrderId)或调度单(dispatchOrdId)后,系统会自动将任务附件同步到ImageData表,以便在旧系统中查看和使用。

核心功能

1. 自动同步

  • 上传附件时,如果任务已关联服务单或调度单,自动同步到ImageData
  • 支持普通文件上传和微信上传两种方式
  • 同步失败不影响附件上传的主流程

2. 手动同步

  • 提供API接口,支持手动触发同步
  • 支持批量同步任务的所有附件
  • 支持检查附件是否已同步

3. 附件分类映射

附件分类自动映射到ImageData的图片类型:
- 1-知情同意书 → ImageType 0
- 2-病人资料 → ImageType 1
- 3-操作记录 → ImageType 2
- 4-出车前 → ImageType 3
- 5-出车后 → ImageType 4
- 6-系安全带 → ImageType 5

数据库变更

sys_task_attachment 表新增字段

-- 是否已同步到ImageData (0-未同步 1-已同步)
synced_to_image_data TINYINT(1) DEFAULT 0

-- 同步时间
sync_time DATETIME

-- 关联的ImageData ID
image_data_id BIGINT

执行SQL脚本

执行文件: sql/update_sys_task_attachment_sync_fields.sql

新增文件

1. 服务接口

  • ITaskAttachmentSyncService.java - 附件同步服务接口
  • TaskAttachmentSyncServiceImpl.java - 附件同步服务实现

2. Controller

  • TaskAttachmentSyncController.java - 附件同步控制器

3. SQL脚本

  • update_sys_task_attachment_sync_fields.sql - 数据库更新脚本

修改文件

1. 实体类

  • SysTaskAttachment.java - 添加同步相关字段

2. Mapper

  • SysTaskAttachmentMapper.xml - 更新SQL语句

3. 服务实现

  • SysTaskServiceImpl.java - 集成自动同步逻辑

API接口

1. 手动同步任务附件

接口: POST /task/attachment/sync/task/{taskId}

权限: task:general:edit

参数:
- taskId: 任务ID(路径参数)

返回示例:
json { "code": 200, "msg": "成功同步 3 个附件" }

2. 检查附件同步状态

接口: GET /task/attachment/sync/check/{attachmentId}

权限: task:general:query

参数:
- attachmentId: 附件ID(路径参数)

返回示例:
json { "code": 200, "msg": "已同步", "data": true }

使用场景

场景1:新上传附件自动同步

  1. 用户在小程序上传任务附件
  2. 系统保存附件到sys_task_attachment表
  3. 检测任务是否已关联服务单/调度单
  4. 如果已关联,自动同步到ImageData表
  5. 更新附件的同步状态字段

场景2:手动批量同步

  1. 任务后期关联了服务单/调度单
  2. 调用手动同步接口同步历史附件
  3. 系统批量同步该任务的所有未同步附件
  4. 返回同步成功的附件数量

场景3:旧系统查看附件

  1. 用户在旧系统中查看调度单
  2. 调用ImageData接口获取图片列表
  3. 显示通过新系统上传的任务附件
  4. 实现新旧系统数据互通

技术实现

1. 同步服务

@Service
public class TaskAttachmentSyncServiceImpl implements ITaskAttachmentSyncService {
    
    // 同步单个附件
    public boolean syncAttachmentToImageData(
        SysTaskAttachment attachment, 
        Long serviceOrderId, 
        Long dispatchOrdId);
    
    // 批量同步任务附件
    public int syncTaskAttachmentsToImageData(
        Long taskId, 
        Long serviceOrderId, 
        Long dispatchOrdId);
}

2. 自动同步触发

在上传附件时自动触发:

// 上传附件成功后
if (result > 0) {
    // 尝试自动同步到ImageData
    tryAutoSyncAttachment(attachment, taskId);
}

3. 数据源切换

同步到ImageData时自动切换到SQL Server数据源:

@DataSource(DataSourceType.SQLSERVER)
public boolean syncAttachmentToImageData(...) {
    // 在SQL Server数据源中执行
    imageDataService.insertImageData(imageData);
}

注意事项

1. 数据源配置

  • 确保SQL Server数据源配置正确
  • 确保ImageData表存在且可访问

2. 文件路径

  • 附件路径使用相对路径存储
  • 同步时保持路径格式一致

3. 事务管理

  • 同步失败不影响主流程
  • 错误信息仅记录日志

4. 性能考虑

  • 自动同步是异步的,不影响用户体验
  • 批量同步时逐个处理,避免事务超时

常见问题

Q1: 如何判断附件是否需要同步?

A: 检查任务是否关联了serviceOrderId或dispatchOrdId

Q2: 同步失败会影响附件上传吗?

A: 不会,同步失败只记录日志,不影响主流程

Q3: 如何重新同步失败的附件?

A: 调用手动同步接口,系统会自动跳过已同步的附件

Q4: ImageData的图片类型如何确定?

A: 根据附件分类自动映射到对应的ImageType

扩展建议

1. 定时同步任务

可以添加定时任务,定期检查并同步未同步的附件

2. 同步状态通知

可以在同步完成后发送通知给相关人员

3. 同步日志

可以添加详细的同步日志表,记录每次同步的详细信息

4. 批量操作

可以添加批量同步多个任务附件的功能