VehicleDataSyncController.java 5.34 KB
package com.bsth.controller.schedule.datasync;

import com.bsth.controller.schedule.BController;
import com.bsth.controller.schedule.datasync.common.ApiResult;
import com.bsth.controller.schedule.datasync.request.VehicleDataSyncTaskRequest;
import com.bsth.entity.schedule.datasync.VehicleDataSyncTask;
import com.bsth.entity.schedule.datasync.VehicleDataSyncTaskTypeEnum;
import com.bsth.service.schedule.datasync.VehicleDataSyncTaskService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Date;

@RestController
@RequestMapping("dataSync/vehicle")
public class VehicleDataSyncController extends BController<VehicleDataSyncTask, Long> {
    @Autowired
    private VehicleDataSyncTaskService vehicleDataSyncService;

    //------------------ 外部系统调用的api(如下)-----------------------//
    /**
     * 添加任务(此接口用于外部系统调用)。
     * @return
     */
    @GetMapping(value = "/api/addTask")
    public ApiResult addTask() {
        try {
            // 远程触发,使用当前服务器时间作为参数
            Date currentDate = new Date();
            VehicleDataSyncTask task = VehicleDataSyncTask.builder()
                    .type(VehicleDataSyncTaskTypeEnum.REMOTE_TRIGGER) // 类型
                    .paramFrom(currentDate)
                    .paramTo(currentDate)
                    .build();
            this.vehicleDataSyncService.addToDataSyncTaskQueue(task);
            return ApiResult.success(
                    "200",
                    "添加同步任务成功",
                    "添加同步任务成功");
        } catch (Exception exp) {
            return ApiResult.failure(
                    "500",
                    "添加同步任务失败,内部错误:" + exp.getMessage());
        }
    }
    //------------------ 外部系统调用的api(如上)-----------------------//

    /**
     * 手动添加同步任务。
     * @param vehicleDataSyncTaskRequest
     * @return
     */
    @PostMapping(value = "/addTask")
    public ApiResult addTask(@RequestBody VehicleDataSyncTaskRequest vehicleDataSyncTaskRequest) {
        try {
            VehicleDataSyncTask task = VehicleDataSyncTask.builder()
                    .type(VehicleDataSyncTaskTypeEnum.ACTIVE_TRIGGER) // 类型
                    .paramClzbh(vehicleDataSyncTaskRequest.getParamClzbh())
                    .paramFrom(vehicleDataSyncTaskRequest.getParamFrom())
                    .paramTo(vehicleDataSyncTaskRequest.getParamTo())
                    .build();
            this.vehicleDataSyncService.addToDataSyncTaskQueue(task);
            return ApiResult.success(
                    "200",
                    "添加同步任务成功",
                    "添加同步任务成功");
        } catch (Exception exp) {
            return ApiResult.failure(
                    "500",
                    "添加同步任务失败,内部错误:" + exp.getMessage());
        }
    }

    /**
     * 获取日志相关文件。
     * @param response
     * @param id 日志Id
     */
    @GetMapping(value = "/logfile/{id}/{type}")
    public void exportTaskLogFile(
            HttpServletResponse response,
            @PathVariable("id") long id,
            @PathVariable("type") Integer type) {
        File file;
        if (type == 1) {
            file = this.vehicleDataSyncService.getTaskLogFile(id);
        } else if (type == 2) {
            file = this.vehicleDataSyncService.getTaskValidateErrorFile(id);
        } else if (type == 3) {
            file = this.vehicleDataSyncService.getTaskPrepareFile(id);
        } else if (type == 4) {
            file = this.vehicleDataSyncService.getTaskAddErrorFile(id);
        } else if (type == 5) {
            file = this.vehicleDataSyncService.getTaskUpdateErrorFile(id);
        } else if (type == 6) {
            file = this.vehicleDataSyncService.getTaskDeviceAddErrorFile(id);
        } else {
            throw new RuntimeException("未知类型[" + type + "]的日志文件!");
        }

        if (file == null || !file.exists()) {
            throw new RuntimeException("日志文件不存在!");
        }

        try {
            responseStreamFile(response, file);
        } catch (Exception exp) {
            exp.printStackTrace();
            throw new RuntimeException("获取同步日志文件错误:" + exp.getMessage());
        }
    }

    // 流输出文件
    private void responseStreamFile(HttpServletResponse response, File file) throws IOException {
        // 流输出导出文件
        response.setHeader("content-type", "application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());
        response.setContentType("application/octet-stream");

        try (
                OutputStream os = response.getOutputStream();
                BufferedOutputStream bos = new BufferedOutputStream(os);
                InputStream is = new FileInputStream(file);
                BufferedInputStream bis = new BufferedInputStream(is)
        ) {
            int length;
            byte[] temp = new byte[1024 * 10];
            while ((length = bis.read(temp)) != -1) {
                bos.write(temp, 0, length);
            }
            bos.flush();
        }
    }

}