>>() {
+ });
+ }
+
+ /**
+ * 操作作业
+ *
+ * {@link JobActionEnum} 中的 静态方法{@link JobActionEnum#getJobAction(String)}可以将前端的字符转换为{@link JobActionEnum}对象
+ *
+ * 或者使用{@link #action(String, String, String)}直接操作,但最终还是调的这个方法,我们只不过是内部做了转换而已
+ *
+ * @param username 用户名
+ * @param action 作业操作类型(必填)
+ * @param jobId 作业id
+ * @see JobActionEnum
+ */
+ public void action(String username, JobActionEnum action, String jobId) {
+ if (action == null) {
+ throw new ArgsException("action不能为空!");
+ }
+ if (StringUtils.isBlank(jobId)) {
+ throw new ArgsException("jobId不能为空!");
+ }
+ String path = JobPathConstant.JOB_ACTION_PATH.replace("{jobId}", jobId).replace("{action}", action.getAction());
+ put(path, username);
+ }
+
+ /**
+ * 操作作业
+ *
+ * @param username 用户名
+ * @param action 作业的操作类型(必填),取值见{@link JobActionEnum}中的中值
+ * @param jobId 作业id
+ */
+ public void action(String username, String action, String jobId) {
+ action(username, JobActionEnum.getJobAction(action), jobId);
+ }
+
+
+ /**
+ * 批量操作作业
+ *
+ * {@link JobsActionEnum} 中的 静态方法{@link JobsActionEnum#getJobAction(String)}可以将前端的字符转换为{@link JobsActionEnum}对象
+ *
+ * 或者使用{@link #actions(String, String, List)}直接操作,但最终还是调的这个方法,我们只不过是内部做了转换而已
+ *
+ * @param username 用户名
+ * @param action 操作类型
+ * @param jobIds 作业id列表
+ */
+ public void actions(String username, JobsActionEnum action, List jobIds) {
+ if (action == null) {
+ throw new ArgsException("action不能为空!");
+ }
+ if (CollectionUtil.isEmpty(jobIds)) {
+ throw new ArgsException("jobIds不能为空!");
+ }
+ Map params = new HashMap<>(1);
+ params.put("jobIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, jobIds));
+ String path = JHApiClient.getUrl(JobPathConstant.JOB_ACTION_IDS_PATH.replace("{action}", action.getAction()), params);
+ put(path, username);
+ }
+
+ /**
+ * 操作作业
+ *
+ * @param username 用户名
+ * @param action 作业的操作类型(必填),取值见{@link JobsActionEnum}中的中值
+ * @param jobIds 作业id列表
+ */
+ public void actions(String username, String action, List jobIds) {
+ actions(username, JobsActionEnum.getJobAction(action), jobIds);
+ }
+
+
+ /**
+ * +
+ * 查询制定作业的作业历史
+ *
+ * @param username 用户名
+ * @param jobId 作业id
+ * @return 作业历史
+ */
+ public JobHistoryInfo getJobHistory(String username, String jobId) {
+ if (StringUtils.isBlank(jobId)) {
+ throw new ArgsException("jobId不能为空!");
+ }
+ String path = JobPathConstant.JOB_HISTORY_PATH.replace("{jobId}", jobId);
+ List list = get(path, username, new TypeReference>>() {
+ });
+ if (CollectionUtil.isEmpty(list)) {
+ throw new ServiceException(path, 500, "历史作业信息不存在!");
+ }
+ return list.get(0);
+ }
+
+
+ /**
+ * 通过多个id查询作业历史列表
+ *
+ * @param username 用户名
+ * @param jobIds 作业id列表
+ * @return 作业历史列表
+ */
+ public List getJobsHistory(String username, List jobIds) {
+ if (CollectionUtil.isEmpty(jobIds)) {
+ throw new ArgsException("jobIds不能为空!");
+ }
+ Map params = new HashMap<>(1);
+ params.put("jobIds", String.join(CommonConstant.NORMAL_CHARACTER_COMMA, jobIds));
+ String path = JHApiClient.getUrl(JobPathConstant.JOB_HISTORY_IDS_PATH, params);
+ return get(path, username, new TypeReference>>() {
+ });
+ }
+
+ /**
+ * 获取作业的动态输出
+ *
+ * @param username 用户名
+ * @param jobId 作业id
+ * @return 作业的动态输出
+ */
+ public String getJobPeek(String username, String jobId) {
+ if (StringUtils.isBlank(jobId)) {
+ throw new ArgsException("jobId不能为空!");
+ }
+ String path = JobPathConstant.JOB_PEEK_PATH.replace("{jobId}", jobId);
+ ResponseResult result = jhApiClient.get(path, getHeaders(username), new TypeReference>() {
+ });
+ if (StringUtils.equals(result.getResult(), CommonConstant.FAILED)) {
+ throw new ServiceException(path, result.getCode(), result.getMessage());
+ }
+ // 产品BUG,这里作兼容性处理,保证SDK在BUG修复后能用
+ if (StringUtils.isNotBlank(result.getData())) {
+ return result.getData();
+ }
+ return result.getMessage();
+ }
+
+
+ /**
+ * 连接作业会话
+ *
+ * @param username 用户名
+ * @param jobId 作业id
+ * @return 未知
+ */
+ public Object connectJobSession(String username, String jobId) {
+ if (StringUtils.isBlank(jobId)) {
+ throw new ArgsException("jobId不能为空!");
+ }
+ String path = JobPathConstant.JOB_CONNECT_SESSION_PATH.replace("{jobId}", jobId);
+ return post(path, username, new TypeReference>() {
+ });
+ }
}
diff --git a/src/main/java/com/jhinno/sdk/openapi/api/job/JobActionEnum.java b/src/main/java/com/jhinno/sdk/openapi/api/job/JobActionEnum.java
new file mode 100644
index 0000000..8c32496
--- /dev/null
+++ b/src/main/java/com/jhinno/sdk/openapi/api/job/JobActionEnum.java
@@ -0,0 +1,64 @@
+package com.jhinno.sdk.openapi.api.job;
+
+import com.jhinno.sdk.openapi.ArgsException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 作业的操作类型
+ *
+ * @author yanlongqi
+ * @date 2024/2/6 15:01
+ */
+
+@Getter
+@AllArgsConstructor
+public enum JobActionEnum {
+
+ /**
+ * 杀死作业
+ */
+ KILL("kill"),
+
+ /**
+ * 恢复作业
+ */
+ RESUME("resume"),
+
+ /**
+ * 暂停作业
+ */
+ STOP("stop"),
+
+ /**
+ * 置顶作业
+ */
+ TOP("top"),
+
+ /**
+ * 置低作业
+ */
+ BOT("bot"),
+ ;
+
+ private final String action;
+
+
+ /**
+ * 将作业的操作转换为JobActionEnum
+ *
+ * @param action 操作字符
+ * @return 作业操作类型
+ * @throws ArgsException action的类型不存在的异常
+ */
+ public static JobActionEnum getJobAction(String action) {
+ for (JobActionEnum value : values()) {
+ if (StringUtils.equals(action, value.getAction())) {
+ return value;
+ }
+ }
+ throw new ArgsException(action + "类型不存在!");
+ }
+
+}
diff --git a/src/main/java/com/jhinno/sdk/openapi/api/job/JobHistoryInfo.java b/src/main/java/com/jhinno/sdk/openapi/api/job/JobHistoryInfo.java
new file mode 100644
index 0000000..26ea333
--- /dev/null
+++ b/src/main/java/com/jhinno/sdk/openapi/api/job/JobHistoryInfo.java
@@ -0,0 +1,24 @@
+package com.jhinno.sdk.openapi.api.job;
+
+import lombok.Data;
+
+/**
+ * 作业历史信息
+ *
+ * @author yanlongqi
+ * @date 2024/2/6 16:00
+ */
+@Data
+public class JobHistoryInfo {
+
+ /**
+ * 作业id
+ */
+ private String jobId;
+
+
+ /**
+ * 作业历史
+ */
+ private String jobhistory;
+}
diff --git a/src/main/java/com/jhinno/sdk/openapi/api/job/JobInfo.java b/src/main/java/com/jhinno/sdk/openapi/api/job/JobInfo.java
new file mode 100644
index 0000000..9791127
--- /dev/null
+++ b/src/main/java/com/jhinno/sdk/openapi/api/job/JobInfo.java
@@ -0,0 +1,273 @@
+package com.jhinno.sdk.openapi.api.job;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 作业详情
+ *
+ * @author yanlongqi
+ * @date 2024/2/6 13:54
+ */
+@Data
+public class JobInfo {
+ /**
+ * 作业id
+ */
+ private String id;
+
+ /**
+ * 作业索引(类型待确认)
+ */
+ private String index;
+
+ /**
+ * 作业id
+ */
+ private String jobId;
+
+ /**
+ * 作业名称
+ */
+ private String name;
+ /**
+ * 作业状态
+ *
+ * 可能的取值:
+ *
+ * - RUN(运行)
+ * - PEND(等待)
+ * - PSUSP(等待中挂起)
+ * - USUSP(用户挂起)
+ * - SSUSP(系统挂起)
+ * - ZOMBI(僵尸)
+ * - DONE(完成)
+ * - EXIT(退出)
+ * - UNKNOWN#UNKWN(状态不明)
+ *
+ *
+ *
+ *
+ * 数组作业(及arrayJob="true")时status的类型是一个map
+ * 如:{"done":1,"run":12}
+ *
+ */
+ private Object status;
+
+ /**
+ * 主机
+ */
+ private String host;
+
+ /**
+ * 队列
+ */
+ private String queue;
+
+ /**
+ * 排队号
+ */
+ private Integer queueNumber;
+
+ /**
+ * 属主
+ */
+ private String owner;
+
+ /**
+ * 执行节列表
+ */
+ private List executionHost;
+
+ /**
+ * 插槽
+ */
+ private String slots;
+
+ /**
+ * 作业提交时间
+ */
+ private Date submitTime;
+
+ /**
+ * 作业执行时间
+ */
+ private Date executionTime;
+
+ /**
+ * 作业终止时间
+ */
+ private Date terminationTime;
+
+ /**
+ * 工作目录
+ */
+ private String cwd;
+
+ /**
+ * 作业提交工作目录
+ */
+ private String subCwd;
+
+ /**
+ * 密级
+ */
+ private String confidential;
+
+ /**
+ * 密级映射
+ */
+ private Integer confidential_map;
+
+ /**
+ * 作业数据删除时间
+ */
+ private Date deleteTime;
+
+ /**
+ * 项目
+ */
+ private String project;
+
+ /**
+ * 索引id
+ */
+ private String indexid;
+
+ /**
+ * 是否数组作业,true是,false不是
+ */
+ private String arrayJob;
+
+ /**
+ * 会话id
+ */
+ private String desktopid;
+
+
+ private List reasons;
+
+ /**
+ * 运行时间
+ */
+ private String runTime;
+
+ /**
+ * 作业类型
+ */
+ private Boolean jobType;
+
+ /**
+ *
+ */
+ private Boolean jobDesktopExpires;
+
+ /**
+ *
+ */
+ private Boolean jobDataNotExists;
+
+ /**
+ *
+ */
+ private Boolean hasAlarmHost;
+
+ /**
+ *
+ */
+ private String alarmInfo;
+
+ /**
+ *
+ */
+ private Boolean hasJobException;
+
+ /**
+ *
+ */
+ private String exceptionInfo;
+
+ /**
+ * 应用名称
+ */
+ private String appName;
+
+ /**
+ *
+ */
+ private Integer underRunThreshold;
+
+ /**
+ *
+ */
+ private Integer overRunThreshold;
+
+ /**
+ *
+ */
+ private Float idleThreshold;
+
+ /**
+ * 用户中文名
+ */
+ private String userNameCn;
+
+ /**
+ *
+ */
+ private String jobIndexIds;
+
+ /**
+ * 作业数据是否删除
+ */
+ private Boolean jobIsDeleted;
+
+ /**
+ * 是否独占
+ */
+ private Boolean exclusive;
+
+ /**
+ * 是否docker作业
+ */
+ private Boolean isDocker;
+
+ /**
+ * 图形脚本名称
+ */
+ private String graphicScriptName;
+
+ /**
+ * 绑定CPU列表
+ */
+ private List