diff --git a/ruoyi-admin/src/main/resources/application-test.yml b/ruoyi-admin/src/main/resources/application-test.yml index fc67ebb..9ceb3de 100644 --- a/ruoyi-admin/src/main/resources/application-test.yml +++ b/ruoyi-admin/src/main/resources/application-test.yml @@ -1,7 +1,7 @@ # 项目相关配置 ruoyi: # 文件路径 示例( Windows配置D:/poject,Linux配置 /home/poject) - profile: /home/pojectFile + profile: /home/pojectFile/ # Spring配置 数据源配置 spring: # redis 配置 diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/controller/ApplyPlanController.java b/ruoyi-business/src/main/java/com/ruoyi/business/controller/ApplyPlanController.java index 0289055..a63dffc 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/controller/ApplyPlanController.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/controller/ApplyPlanController.java @@ -4,23 +4,20 @@ import java.util.List; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.business.domain.bo.AddApplyPlanBO; import com.ruoyi.business.domain.bo.JobQueryBO; +import com.ruoyi.business.domain.bo.YinDaoCallBackBO; import com.ruoyi.common.utils.bean.BeanUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; @@ -39,10 +36,33 @@ import com.ruoyi.common.core.page.TableDataInfo; @Api(tags = "应用执行计划管理接口") @RestController @RequestMapping("/business/ctApplyPlan") +@Slf4j public class ApplyPlanController extends BaseController { @Autowired private IApplyPlanService applyPlanService; + + @PostMapping("/callBack/updatePlanStatus") + public void updatePlanStatus(@RequestParam(required = false) String bodyMd5, @RequestParam(required = false) Long timestamp, + @RequestParam(required = false) String sign, @RequestBody String body) { + log.info("fake callback: bodyMd5:{}", bodyMd5); + log.info("fake callback: sign:{}", sign); + log.info("fake callback: timestamp:{}", timestamp); + log.info("fake callback: body:{}", body); + + YinDaoCallBackBO yinDaoCallBackBO = JSONObject.parseObject(body, YinDaoCallBackBO.class); + // 获取应用名称 task_uuid + if (applyPlanService.ydCallBack(yinDaoCallBackBO)) { + log.debug("任务id:" + yinDaoCallBackBO.getJobUuid() + "回调成功,回调状态:" + yinDaoCallBackBO.getStatus()); + }else{ + log.debug("任务id:" + yinDaoCallBackBO.getJobUuid() + "回调失败,回调状态:" + yinDaoCallBackBO.getStatus()); + } + //异步处理业务 + // new Runable() -> { + // do things + // } + } + /** * 重新运行 */ diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/ApplyStartBO.java b/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/ApplyStartBO.java index cba9d40..b8d085b 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/ApplyStartBO.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/ApplyStartBO.java @@ -65,17 +65,17 @@ public class ApplyStartBO { @Excel(name = "计划参数") @ApiModelProperty(name="planParams",value = "计划参数") private String planParams; + /** * 应用运行参数 - *

+ * * 非必填 */ - private List planParamsList; + private List params; /** * 等待超时时间 * - * @see com.xybot.api.sdk.enums.WaitTimeoutEnum *

* 非必填,不填,默认为10分钟 */ @@ -83,8 +83,6 @@ public class ApplyStartBO { /** * 优先级 - * - * @see com.xybot.api.sdk.enums.PriorityEnum * 非必填,不填,默认为middle */ private String priority; diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/YinDaoCallBackBO.java b/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/YinDaoCallBackBO.java new file mode 100644 index 0000000..159b883 --- /dev/null +++ b/ruoyi-business/src/main/java/com/ruoyi/business/domain/bo/YinDaoCallBackBO.java @@ -0,0 +1,69 @@ +package com.ruoyi.business.domain.bo; + +import lombok.Data; + +import java.util.List; + +/** + * 任务结果数据对象 + */ +@Data +public class YinDaoCallBackBO { + /** + * 参考 DataTypeEnum + */ + private String dataType; + + /** + * 应用运行uuid + */ + private String jobUuid; + /** + * @see YinDaoCallBackBO + */ + private String status; + /** + * 运行描述 + */ + private String msg; + /** + * 应用运行参数 + */ + private List result; + /** + * 任务开始运行的时间 + */ + private String startTime; + + /** + * 任务结束运行的时间 + */ + private String endTime; + /** + * 执行的机器人uuid + */ + private String robotClientUuid; + + /** + * 机器人名称 + */ + private String robotClientName; + /** + * 应用名 + */ + private String robotName; + + /** + * 应用运行参数 + */ + @Data + public static class RobotParam { + // 参数名 + private String name; + // 参数值 + private String value; + // 参数类型 + private String type; + + } +} diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/service/IApplyPlanService.java b/ruoyi-business/src/main/java/com/ruoyi/business/service/IApplyPlanService.java index eb2a6e1..8f97fbb 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/service/IApplyPlanService.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/service/IApplyPlanService.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.business.domain.bo.AddApplyPlanBO; import com.ruoyi.business.domain.bo.ApplyStartBO; import com.ruoyi.business.domain.bo.JobQueryBO; +import com.ruoyi.business.domain.bo.YinDaoCallBackBO; import com.ruoyi.business.domain.vo.JobQueryVO; /** @@ -16,6 +17,14 @@ import com.ruoyi.business.domain.vo.JobQueryVO; * @date 2024-06-14 */ public interface IApplyPlanService extends IService { + /** + * 影刀回调逻辑 + * + * @param + * @return + */ + boolean ydCallBack(YinDaoCallBackBO yinDaoCallBackBO) ; + /** * 重新运行 diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyPlanServiceImpl.java b/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyPlanServiceImpl.java index 7663a06..9cfe8a8 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyPlanServiceImpl.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyPlanServiceImpl.java @@ -30,6 +30,7 @@ import com.ruoyi.common.enums.ExcTypeStatus; import com.ruoyi.common.enums.PlanRunStatus; import com.ruoyi.common.enums.RebotStatus; import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.bean.BeanUtils; @@ -66,6 +67,36 @@ public class ApplyPlanServiceImpl extends ServiceImpl finalState = new ArrayList<>(); + finalState.add(PlanRunStatus.FINISH.getKey()); + finalState.add(PlanRunStatus.STOPPED.getKey()); + finalState.add(PlanRunStatus.ERROR.getKey()); + finalState.add(PlanRunStatus.SKIPPED.getKey()); + finalState.add(PlanRunStatus.CANCEL.getKey()); + // 如果是终态 + if (StringUtils.isNotEmpty(yinDaoCallBackBO.getRobotClientName()) && finalState.contains(yinDaoCallBackBO.getStatus())) { + Rebot rebot = new Rebot(); + rebot.setStatus(RebotStatus.IDLE.getKey()); + return rebotService.lambdaUpdate().eq(Rebot::getRobotClientName, yinDaoCallBackBO.getRobotClientName()).update(rebot); + } else { + return isUpdate; + } + + } /** * 重新运行 @@ -106,7 +137,7 @@ public class ApplyPlanServiceImpl extends ServiceImpl applyPlanList = this.lambdaQuery().eq(ApplyPlan::getExcType, ExcTypeStatus.TWO.getKey()).isNull(ApplyPlan::getTaskUuid).orderByAsc(ApplyPlan::getExcTime).list(); if (applyPlanList.isEmpty()) { @@ -144,7 +175,7 @@ public class ApplyPlanServiceImpl extends ServiceImpl paramList = JSON.parseArray(e.getPlanParams(), ApplyStartBO.RobotParam.class); - applyStartBO.setPlanParamsList(paramList); + applyStartBO.setParams(paramList); } } try { @@ -190,7 +221,7 @@ public class ApplyPlanServiceImpl extends ServiceImpl applyPlanList = this.lambdaQuery().eq(ApplyPlan::getExcType, ExcTypeStatus.TREE.getKey()).ne(ApplyPlan::getTaskStatus, PlanRunStatus.RUNNING.getKey()).ne(ApplyPlan::getTaskStatus, PlanRunStatus.CREATED.getKey()).list(); @@ -261,7 +292,7 @@ public class ApplyPlanServiceImpl extends ServiceImpl paramList = JSON.parseArray(e.getPlanParams(), ApplyStartBO.RobotParam.class); - applyStartBO.setPlanParamsList(paramList); + applyStartBO.setParams(paramList); } } @@ -278,7 +309,7 @@ public class ApplyPlanServiceImpl extends ServiceImpl listRebotVos = YinDaoHttpUtils.listRebot(listRebotBO); if (listRebotVos.isEmpty()) { log.debug("暂无空闲机器人"); - // 刷新机器人数据 -// rebotService.syn(new Rebot()); return false; } @@ -460,35 +472,29 @@ public class ApplyPlanServiceImpl extends ServiceImpl paramList = JSON.parseArray(applyPlan.getPlanParams(), ApplyStartBO.RobotParam.class); - applyStartBO.setPlanParamsList(paramList); + applyStartBO.setParams(paramList); } } JobStartVO jobStartVO = YinDaoHttpUtils.appStart(applyStartBO); @@ -507,9 +513,7 @@ public class ApplyPlanServiceImpl extends ServiceImpl paramList = addApplyPlanBO.getResourceLibrarieList().stream() .map(item -> { diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyServiceImpl.java b/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyServiceImpl.java index 7434828..318b45e 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyServiceImpl.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/service/impl/ApplyServiceImpl.java @@ -5,7 +5,9 @@ import java.util.Map; import java.util.stream.Collectors; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.ruoyi.business.domain.ApplyPlan; import com.ruoyi.business.domain.Rebot; +import com.ruoyi.business.domain.ResourceLibrary; import com.ruoyi.business.domain.bo.ApplyStartBO; import com.ruoyi.business.domain.bo.JobQueryBO; import com.ruoyi.business.domain.bo.ListApplyBO; @@ -14,6 +16,8 @@ import com.ruoyi.business.domain.vo.JobQueryVO; import com.ruoyi.business.domain.vo.JobStartVO; import com.ruoyi.business.domain.vo.ListApplyVO; import com.ruoyi.business.domain.vo.ListRebotVO; +import com.ruoyi.business.service.IApplyPlanService; +import com.ruoyi.business.service.IResourceLibraryService; import com.ruoyi.business.util.YinDaoHttpUtils; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.core.domain.entity.SysDept; @@ -40,6 +44,13 @@ public class ApplyServiceImpl extends ServiceImpl implements @Autowired private ISysDeptService sysDeptService; + + @Autowired + private IResourceLibraryService resourceLibraryService; + + @Autowired + private IApplyPlanService applyPlanService; + /** * 启动应用 * @@ -98,7 +109,7 @@ public class ApplyServiceImpl extends ServiceImpl implements BeanUtils.copyBeanProp(newApply, listRebotVO); newApply.setAppCreateTime(listRebotVO.getCreateTime()); newApply.setAppUpdateTime(listRebotVO.getUpdateTime()); - if(null != sysDepts){ + if (null != sysDepts) { newApply.setDeptId(sysDepts.get(0).getDeptId()); newApply.setDeptName(sysDepts.get(0).getDeptName()); } @@ -110,11 +121,21 @@ public class ApplyServiceImpl extends ServiceImpl implements newApply.setAppCreateTime(listRebotVO.getCreateTime()); newApply.setAppUpdateTime(listRebotVO.getUpdateTime()); newApply.setId(apply.getId()); - if(null != sysDepts){ + newApply.setSupportParam(listRebotVO.getSupportParam()); + if (null != sysDepts) { newApply.setDeptId(sysDepts.get(0).getDeptId()); newApply.setDeptName(sysDepts.get(0).getDeptName()); } + // 修改应用名称 updateById(newApply); + // 修改参数里应用名称 + ResourceLibrary resourceLibrary = new ResourceLibrary(); + resourceLibrary.setAppName(listRebotVO.getAppName()); + resourceLibraryService.lambdaUpdate().eq(ResourceLibrary::getAppId, apply.getId()).update(resourceLibrary); + // 修改已执行的计划应用名称 + ApplyPlan applyPlan = new ApplyPlan(); + applyPlan.setAppName(listRebotVO.getAppName()); + applyPlanService.lambdaUpdate().eq(ApplyPlan::getAppId, apply.getId()).update(applyPlan); } }); } diff --git a/ruoyi-business/src/main/java/com/ruoyi/business/util/YinDaoHttpUtils.java b/ruoyi-business/src/main/java/com/ruoyi/business/util/YinDaoHttpUtils.java index def2b8f..86f87fb 100644 --- a/ruoyi-business/src/main/java/com/ruoyi/business/util/YinDaoHttpUtils.java +++ b/ruoyi-business/src/main/java/com/ruoyi/business/util/YinDaoHttpUtils.java @@ -2,6 +2,7 @@ package com.ruoyi.business.util; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; import com.ruoyi.business.domain.bo.*; import com.ruoyi.business.domain.vo.*; import com.ruoyi.business.yddoman.BaseDTO; @@ -12,10 +13,8 @@ import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.HttpClientUtil; import lombok.extern.slf4j.Slf4j; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; +import java.util.stream.Collectors; /** * 影刀请求工具类 @@ -44,14 +43,28 @@ public class YinDaoHttpUtils { private static final String QUERY_APP_START_RESULT = REQUEST_PREFIX + "/dispatch/v2/job/query"; // 查询应用运行日志(异常时可以查询原因) private static final String QUERY_APP_START_RESULT_LOG = REQUEST_PREFIX + "/dispatch/v2/job/list"; + // 服务器ip + private static final String SERVER_URL = "http://192.168.10.214:9000"; /** * 启动应用 */ public static JobStartVO appStart(ApplyStartBO applyStartBO) throws IllegalAccessException { + if (!Objects.isNull(applyStartBO.getPlanParams())) { + List robotParams = JSON.parseArray(applyStartBO.getPlanParams(), ApplyStartBO.RobotParam.class); + List newParamList = robotParams.stream().peek(e -> { + if ("file".equals(e.getType())) { + e.setValue(SERVER_URL + e.getValue()); + } + }).collect(Collectors.toList()); + applyStartBO.setParams(newParamList); + log.debug("请求的参数:" + applyStartBO.getParams()); + } + // 实体类转map Map data = BeanToMapUtil.convertEntityToMap(applyStartBO); + BaseDTO baseDTO = sendPost(APP_START, data); return JSON.parseObject(baseDTO.getData().toString(), JobStartVO.class); } @@ -185,7 +198,11 @@ public class YinDaoHttpUtils { headMap.put("Content-Type", "application/json;charset=utf-8"); headMap.put("authorization", "Bearer " + getToken(tokenMap)); + log.debug("请求的url:" + url); + log.debug("请求的参数:" + JSONUtil.toJsonStr(map)); + log.debug("请求头:" + JSONUtil.toJsonStr(headMap)); String returnStr = HttpClientUtil.postJson(url, headMap, JSONUtil.toJsonStr(map), "utf-8"); + if (StringUtils.isEmpty(returnStr)) { throw new ServiceException("请求影刀接口失败"); } diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index cb303b0..7ea7ec9 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -117,6 +117,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() // 上传文件 .antMatchers("/common/upload","/dev-api/profile/upload/**").permitAll() + // 影刀回调 + .antMatchers("/business/ctApplyPlan/callBack/updatePlanStatus").permitAll() // 除上面外的所有请求全部需要鉴权认证 .anyRequest().authenticated() .and()