feat(job): 新增 SnailJob 任务执行器和相关接口

- 添加了 DmsInspectStanceExecutor、DmsLubeStanceExecutor 和 DmsMaintStanceExecutor 三个任务执行器
- 新增了 DmsJobEntity 任务实体类
- 实现了 RemoteInspectInstanceService、RemoteLubeInstanceService 和 RemoteMaintInstanceService 接口
- 添加了 RemoteJobService 接口及其实现类
- 新建了相关的 Maven 项目配置文件
master
zch 3 months ago
parent 9f207e2ff8
commit 888dd9da65

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>hwmom-api-dms</artifactId>
<description>
hwmom-api-dms dms接口模块
</description>
<dependencies>
<!-- RuoYi Common Core-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,9 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteInspectInstanceService {
public R<Integer> insertInspectInstance(String planInspectCode);
}

@ -0,0 +1,13 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteLubeInstanceService {
public R<Void> insertLubeInstance(String lubeInstanceCode);
}

@ -0,0 +1,8 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteMaintInstanceService {
public R<Integer> insertDmsBillsMaintInstance(String planMaintCode);
}

@ -0,0 +1,9 @@
package org.dromara.dms.api;
import org.dromara.common.core.domain.R;
public interface RemoteRepairStanceService {
public R<Integer> insertDmsRepairInstance(String planRepairCode);
}

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-api</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-api-job</artifactId>
<description>
ruoyi-api-job job接口模块
</description>
<dependencies>
<!-- RuoYi Common Core-->
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-excel</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.aizuda</groupId>
<artifactId>snail-job-client-job-core</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,50 @@
package org.dromara.job.api;
import com.aizuda.snailjob.client.job.core.dto.JobResponseVO;
import org.dromara.common.core.domain.R;
import org.dromara.job.api.model.DmsJobEntity;
/**
*
*
* @author Yinq
*/
public interface RemoteJobService {
/**
*
*
* @param dmsJobEntity
* @return id
*/
public R<Long> addClusterJob(DmsJobEntity dmsJobEntity);
/**
*
*/
public R<Void> updateClusterJob(DmsJobEntity dmsJobEntity);
/**
*
*
* @param jobId
* @return
*/
public R<JobResponseVO> queryJob(Long jobId);
/**
*
*
* @param jobId ID
* @param status
* status NO:0 ; YES:1
*/
public R<Void> updateJobStatus(Long jobId, Long status);
/**
* SnailJobOpenApi
*/
// public Boolean deleteJob(Long jobId);
}

@ -0,0 +1,58 @@
package org.dromara.job.api.model;
import com.aizuda.snailjob.client.job.core.enums.AllocationAlgorithmEnum;
import com.aizuda.snailjob.client.job.core.enums.TriggerTypeEnum;
import com.aizuda.snailjob.common.core.enums.JobBlockStrategyEnum;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
/**
* SnailJob
*
* @author zch
* @date 2025-03-25
*/
@Data
@Accessors(chain = true)
public class DmsJobEntity implements Serializable {
private static final long serialVersionUID = 1L;
/** 直接复制com.aizuda.snailjob.client.job.core.dto.JobResponseVO */
private Long id;
private String groupName;
private String jobName;
private String argsStr;
private String extAttrs;
private LocalDateTime nextTriggerAt;
private Integer jobStatus;
private AllocationAlgorithmEnum routeKey;//private Integer routeKey;(1:一致性哈希2:随机;3:LRU;4:轮询;5:第一个;6:最后一个;)
private Integer executorType;
private String executorInfo;
private TriggerTypeEnum triggerType;//private Integer triggerType;//触发类型:2. 固定时间 3.CRON 表达式 99.工作流
private String triggerInterval;
private JobBlockStrategyEnum blockStrategy;//private Integer blockStrategy;//阻塞策略:1、丢弃 2、覆盖 3、并行
private Integer executorTimeout;
private Integer maxRetryTimes;
private Integer retryInterval;
private Integer taskType;
private Integer parallelNum;
private String description;
private LocalDateTime createDt;
private LocalDateTime updateDt;
}

@ -0,0 +1,148 @@
package org.dromara.dms.dubbo;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.constant.DmsConstants;
import org.dromara.common.core.domain.R;
import org.dromara.dms.api.RemoteInspectInstanceService;
import org.dromara.dms.domain.*;
import org.dromara.dms.mapper.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteInspectInstanceServiceImpl implements RemoteInspectInstanceService {
private final DmsPlanInspectMapper dmsPlanInspectMapper;
private final DmsInspectRouteDetailMapper dmsInspectRouteDetailMapper;
private final DmsBillsInspectInstanceMapper dmsBillsInspectInstanceMapper;
private final DmsInspectInstanceDetailMapper dmsInspectInstanceDetailMapper;
private final DmsInspectInstanceDetailProjectMapper dmsInspectInstanceDetailProjectMapper;
private final DmsInspectProjectDeviceMapper dmsInspectProjectDeviceMapper;
@Override
@Transactional( rollbackFor = Exception.class )
public R<Integer> insertInspectInstance(String planInspectCode){
// 使用 replaceAll 方法将双引号替换为空字符串
String result = planInspectCode.replaceAll("\"", "");
DmsPlanInspect dmsPlanInspect = dmsPlanInspectMapper.selectPlanInspectJoinJobByInspectCode(result);
Long timeLimit = dmsPlanInspect.getTimeLimit();
if (timeLimit != null) {
Long days = timeLimit / (24 * 60 * 60l);
Long hours = timeLimit % (24 * 60 * 60l);
// System.out.println(days);
// System.out.println(hours);
dmsPlanInspect.setTimeLimitDays(days);
dmsPlanInspect.setTimeLimitHours(hours / (60 * 60l));
}
DmsBillsInspectInstance dmsBillsInspectInstance = new DmsBillsInspectInstance();
// DmsRepairInstance dmsRepairInstance = dmsRepairInstanceService.selectDmsRepairInstanceByRepairInstanceId(2l);
dmsBillsInspectInstance.setPlanInspectId(dmsPlanInspect.getPlanInspectId());
// dmsBillsInspectInstance.setWfProcessId(105l);
dmsBillsInspectInstance.setInspectType(dmsPlanInspect.getInspectType());//检查类型(1巡检 2点检)
dmsBillsInspectInstance.setPlanBeginTime(dmsPlanInspect.getPlanTime());
dmsBillsInspectInstance.setPlanEndTime(new Date(dmsPlanInspect.getPlanTime().getTime()+dmsPlanInspect.getTimeLimit()*1000l));
dmsBillsInspectInstance.setInspectRouteId(dmsPlanInspect.getInspectRouteId());
// dmsBillsInspectInstance.setDeviceAmount(dmsPlanInspect.getDeviceAmount());//设备数量
// dmsBillsInspectInstance.setPerformer(dmsPlanInspect.getPerformer());//执行人
//写死105也可根据传入对象的wfprocessid作为传参。
/*
Long aLong = dmsRepairInstanceMapper.selectWfProcessActivityId(105l);
if (dmsBillsInspectInstance.getInspectType().equals("1")) {
dmsBillsInspectInstance.setWfProcessId(105l);
} else if (dmsBillsInspectInstance.getInspectType().equals("2")) {
dmsBillsInspectInstance.setWfProcessId(104l);
}
*/
// dmsBillsInspectInstance.setIsFlag("1");
dmsBillsInspectInstance.setInspectStatus(DmsConstants.DMS_BILLS_INSPECT_INSTANCE_INSPECT_STATUS_TO_INSPECT);//待巡检
int i = dmsBillsInspectInstanceMapper.insert(dmsBillsInspectInstance);
// List<DmsBillsInspectInstance> dmsBillsInspectInstances = dmsBillsInspectInstanceMapper.selectDmsBillsInspectInstanceList(dmsBillsInspectInstance);
//新建第一步工单实例节点
/*
DmsBillsInspectInstanceActivity dmsBillsInspectInstanceActivity = new DmsBillsInspectInstanceActivity();
dmsBillsInspectInstanceActivity.setInspectInstanceId(dmsBillsInspectInstance.getInspectInstanceId());
dmsBillsInspectInstanceActivity.setInspectRouteId(dmsBillsInspectInstance.getInspectRouteId());
dmsBillsInspectInstanceActivity.setDeviceAmount(dmsBillsInspectInstance.getDeviceAmount());
dmsBillsInspectInstanceActivity.setPerformer(dmsBillsInspectInstance.getPerformer());
dmsBillsInspectInstanceActivity.setProcessStepOrder(1l);
dmsBillsInspectInstanceActivity.setProcessActivityId(aLong);
dmsBillsInspectInstanceActivityMapper.insertDmsBillsInspectInstanceActivity(dmsBillsInspectInstanceActivity);
*/
//新建点巡检工单明细
/* DmsInspectRouteDetail queryInspectRouteDetail = new DmsInspectRouteDetail();
queryInspectRouteDetail.setInspectRouteId(dmsBillsInspectInstance.getInspectRouteId());*/
MPJLambdaWrapper<DmsInspectRouteDetail> lqw = JoinWrappers.lambda(DmsInspectRouteDetail.class)
.eq(DmsInspectRouteDetail::getInspectRouteId, dmsBillsInspectInstance.getInspectRouteId());
List<DmsInspectRouteDetail> dmsInspectRouteDetails = dmsInspectRouteDetailMapper.selectList(lqw);
for(DmsInspectRouteDetail dmsInspectRouteDetail:dmsInspectRouteDetails){
DmsInspectInstanceDetail dmsInspectInstanceDetail = new DmsInspectInstanceDetail();
Long deviceId = dmsInspectRouteDetail.getMachineId();
dmsInspectInstanceDetail.setInspectInstanceId(dmsBillsInspectInstance.getInspectInstanceId());
dmsInspectInstanceDetail.setLineStep(dmsInspectRouteDetail.getLineStep());
dmsInspectInstanceDetail.setMachineId(deviceId);
dmsInspectInstanceDetail.setInstanceDetailStatus("1");//1待巡检 2巡检中 3已完成
dmsInspectInstanceDetail.setInspectStandard(dmsInspectRouteDetail.getInspectStandard());
dmsInspectInstanceDetail.setInspectStatus("0");//TODO:为什么设置为异常?
// dmsInspectInstanceDetailMapper.insertDmsInspectInstanceDetail(dmsInspectInstanceDetail);
dmsInspectInstanceDetailMapper.insert(dmsInspectInstanceDetail);
Long projectId = dmsInspectInstanceDetailMapper.selectProjectId(dmsInspectRouteDetail.getInspectStandard());
/*
DmsInspectProjectDevice queryInspectProjectDevice = new DmsInspectProjectDevice();
queryInspectProjectDevice.setTargetType("2");
queryInspectProjectDevice.setTargetId(deviceId);
List<DmsInspectProjectDevice> dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectDmsInspectProjectDeviceList(queryInspectProjectDevice);
*/
MPJLambdaWrapper<DmsInspectProjectDevice> DmsInspectProjectDeviceLQW = JoinWrappers.lambda(DmsInspectProjectDevice.class)
.eq(DmsInspectProjectDevice::getTargetType, "2")//关联类型(1设备类型)
.eq(DmsInspectProjectDevice::getTargetId, deviceId);
List<DmsInspectProjectDevice> dmsInspectProjectDevices = dmsInspectProjectDeviceMapper.selectList(DmsInspectProjectDeviceLQW);
// for(DmsInspectProjectDevice dmsInspectProjectDevice:dmsInspectProjectDevices){
DmsInspectInstanceDetailProject dmsInspectInstanceDetailProject = new DmsInspectInstanceDetailProject();
dmsInspectInstanceDetailProject.setInstanceDetailId(dmsInspectInstanceDetail.getInstanceDetailId());
dmsInspectInstanceDetailProject.setInspectProjectId(projectId);
// dmsInspectInstanceDetailProjectMapper.insertDmsInspectInstanceDetailProject(dmsInspectInstanceDetailProject);
dmsInspectInstanceDetailProjectMapper.insert(dmsInspectInstanceDetailProject);
// }
}
return R.ok(i);
}
}

@ -0,0 +1,133 @@
package org.dromara.dms.dubbo;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.constant.DmsConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.dms.domain.*;
import org.dromara.dms.domain.bo.DmsBillsLubeInstanceBo;
import org.dromara.dms.domain.bo.DmsPlanLubeBo;
import org.dromara.dms.domain.vo.DmsPlanLubeDetailVo;
import org.dromara.dms.mapper.*;
import org.dromara.dms.service.IDmsBillsLubeInstanceService;
import org.dromara.dms.service.IDmsPlanInspectService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.dms.api.RemoteLubeInstanceService;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteLubeInstanceServiceImpl implements RemoteLubeInstanceService {
private final DmsBillsLubeInstanceMapper dmsBillsLubeInstanceMapper;
private final DmsBillsLubeDetailMapper dmsBillsLubeDetailMapper;
private final DmsPlanLubeMapper dmsPlanLubeMapper;
private final DmsBillsLubeInstanceActivityMapper dmsBillsLubeInstanceActivityMapper;
private final DmsPlanLubeDetailMapper dmsPlanLubeDetailMapper;
private final IDmsBillsLubeInstanceService dmsBillsLubeInstanceService;
private final IDmsPlanInspectService dmsPlanInspectService;
private final DmsPlanInspectMapper dmsPlanInspectMapper;
private final DmsInspectRouteDetailMapper dmsInspectRouteDetailMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public R<Void> insertLubeInstance(String planLubeCode) {
// 去除润滑计划编号中的双引号
// String lubeInstanceCodeS = planLubeCode.replaceAll("\"", "");
// 根据润滑计划编号查询润滑计划信息
DmsPlanLube dmsPlanLube = dmsPlanLubeMapper.selectDmsPlanLubeJoinByPlanLubeCode(planLubeCode);
DmsPlanLubeDetail dmsPlanLubeDetail = new DmsPlanLubeDetail();
dmsPlanLubeDetail.setPlanLubeId(dmsPlanLube.getPlanLubeId());
MPJLambdaWrapper<DmsPlanLubeDetail> dmsPlanLubeDetailWrapper = JoinWrappers
.lambda(DmsPlanLubeDetail.class)
.eq(DmsPlanLubeDetail::getPlanLubeId, dmsPlanLube.getPlanLubeId());
List<DmsPlanLubeDetailVo> dmsPlanLubeDetailList = dmsPlanLubeDetailMapper.selectVoList(dmsPlanLubeDetailWrapper);
dmsPlanLube.setDmsPlanLubeDetailList(dmsPlanLubeDetailList);
// 获取润滑计划详情列表
List<DmsPlanLubeDetailVo> planLubeDetails = dmsPlanLube.getDmsPlanLubeDetailList();
if (planLubeDetails == null || planLubeDetails.isEmpty()) {
// 如果润滑计划详情为空返回false
return R.fail();
}
// 创建新的润滑工单实例对象
DmsBillsLubeInstanceBo dmsBillsLubeInstanceBo = new DmsBillsLubeInstanceBo();
// 设置润滑工单的计划ID
dmsBillsLubeInstanceBo.setPlanLubeId(dmsPlanLube.getPlanLubeId());
// 设置计划开始时间为润滑时间
dmsBillsLubeInstanceBo.setPlanBeginTime(dmsPlanLube.getLubeTime());
// 生成并设置润滑工单编码
dmsBillsLubeInstanceBo.setBillsLubeCode(Seq.getId(Seq.dmsLubeInstanceSeqType, Seq.dmsLubeInstanceCode));
// 设置润滑状态为待润滑
dmsBillsLubeInstanceBo.setLubeStatus(DmsConstants.DMS_BILLS_LUBE_INSTANCE_STATUS_TO_LUBE);
// 设置润滑组
dmsBillsLubeInstanceBo.setLubeGroup(dmsPlanLube.getLubeGroup());
// 设置润滑监督人
dmsBillsLubeInstanceBo.setLubeSupervisor(dmsPlanLube.getLubeSupervisor());
// 设置润滑级别
dmsBillsLubeInstanceBo.setLubeLevel(dmsPlanLube.getLubeLevel());
// 获取时间限制
Long timeLimit = dmsPlanLube.getTimeLimit();
// 计算并设置计划结束时间
Date planEndTime = new Date(dmsPlanLube.getLubeTime().getTime() + timeLimit * 1000L);
dmsBillsLubeInstanceBo.setPlanEndTime(planEndTime);
// 插入润滑工单实例到数据库
boolean success = dmsBillsLubeInstanceService.insertByBo(dmsBillsLubeInstanceBo);
DmsPlanLubeBo dmsPlanLubeBo = MapstructUtils.convert(dmsPlanLube, DmsPlanLubeBo.class);
// 批量插入润滑工单详情
List<DmsPlanLubeDetailVo> lubeDetails = dmsPlanLubeBo.getDmsPlanLubeDetailList();
List<DmsBillsLubeDetail> billsLubeDetails = new ArrayList<>();
for (DmsPlanLubeDetailVo planLubeDetail : lubeDetails) {
DmsBillsLubeDetail dmsBillsLubeDetail = new DmsBillsLubeDetail();
dmsBillsLubeDetail.setLubeInstanceId(dmsBillsLubeInstanceBo.getLubeInstanceId());
dmsBillsLubeDetail.setMachineId(planLubeDetail.getDeviceId());
dmsBillsLubeDetail.setLubeStationId(planLubeDetail.getLubeStationId());
dmsBillsLubeDetail.setLubeStandardId(planLubeDetail.getLubeStandardId());
//dmsBillsLubeDetail.setActiveFlag("Y"); // 假设是否标记字段对应activeFlag
billsLubeDetails.add(dmsBillsLubeDetail);
}
/* // 使用mybatis-plus批量保存
return dmsBillsLubeDetailMapper.insertBatch(billsLubeDetails);*/
// 修改批量插入方式避免SQL Server批量插入时获取自动生成主键的问题
boolean result = true;
for (DmsBillsLubeDetail detail : billsLubeDetails) {
result = result && dmsBillsLubeDetailMapper.insert(detail) > 0;
if (!result) {
break;
}
}
return R.ok();
}
}

@ -0,0 +1,118 @@
package org.dromara.dms.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.constant.DmsConstants;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.uuid.Seq;
import org.dromara.dms.api.RemoteMaintInstanceService;
import org.dromara.dms.domain.*;
import org.dromara.dms.mapper.DmsBillsMaintDetailMapper;
import org.dromara.dms.mapper.DmsBillsMaintDetailProjectMapper;
import org.dromara.dms.mapper.DmsBillsMaintInstanceMapper;
import org.dromara.dms.mapper.DmsPlanMaintMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteMaintInstanceServiceImpl implements RemoteMaintInstanceService {
private final DmsPlanMaintMapper dmsPlanMaintMapper;
private final DmsBillsMaintInstanceMapper dmsBillsMaintInstanceMapper;
private final DmsBillsMaintDetailMapper dmsBillsMaintDetailMapper;
private final DmsBillsMaintDetailProjectMapper dmsBillsMaintDetailProjectMapper;
/**
*
*
* @param planMaintCode
* @return
*/
@Override
@Transactional( rollbackFor = Exception.class )
public R<Integer> insertDmsBillsMaintInstance(String planMaintCode) {
String planMaintCodeS = planMaintCode.replaceAll("\"", "");
DmsPlanMaint dmsPlanMaint = dmsPlanMaintMapper.selectDmsPlanMaintJoinByPlanMaintCode(planMaintCodeS);
List<DmsPlanMaintDetail> planMaintDetails = dmsPlanMaint.getDmsPlanMaintDetailList();
if (planMaintDetails == null || planMaintDetails.isEmpty()) {
return R.fail();
}
DmsBillsMaintInstance dmsBillsMaintInstance = new DmsBillsMaintInstance();
dmsBillsMaintInstance.setPlanBeginTime(dmsPlanMaint.getMaintTime());
dmsBillsMaintInstance.setPlanMaintId(dmsPlanMaint.getPlanMaintId());
dmsBillsMaintInstance.setBillsMaintCode(Seq.getId(Seq.maintInstanceSeqType, Seq.maintInstanceCode));
dmsBillsMaintInstance.setMaintStatus(DmsConstants.DMS_BILLS_MAINT_INSTANCE_STATUS_TO_MAINT);//待保养
dmsBillsMaintInstance.setMaintGroup(dmsPlanMaint.getMaintGroup());
dmsBillsMaintInstance.setMaintSupervisor(dmsPlanMaint.getMaintSupervisor());
dmsBillsMaintInstance.setMaintLevel(dmsPlanMaint.getMaintLevel());
Date lubeTime = dmsPlanMaint.getMaintTime();
Long timeLimit = dmsPlanMaint.getTimeLimit();
// dmsBillsMaintInstance.setIsFlag(1l);
// dmsBillsMaintInstance.setWfProcessId(103l);
dmsBillsMaintInstance.setPlanEndTime(new Date(lubeTime.getTime() + timeLimit * 1000l));
int i = dmsBillsMaintInstanceMapper.insert(dmsBillsMaintInstance);
// DmsMaintInstanceActivity dmsMaintInstanceActivity = new DmsMaintInstanceActivity();
// dmsMaintInstanceActivity.setMaintInstanceId(dmsBillsMaintInstance.getMaintInstanceId());
// dmsMaintInstanceActivity.setProcessStepOrder(1L);
// int i1 = dmsMaintInstanceActivityMapper.insertDmsMaintInstanceActivity(dmsMaintInstanceActivity);
batchInsertDmsBillsMaintDetail(dmsPlanMaint, dmsBillsMaintInstance.getMaintInstanceId());
return R.ok(i);
}
public void batchInsertDmsBillsMaintDetail(DmsPlanMaint dmsPlanMaint, Long maintInstanceId) {
List<DmsPlanMaintDetail> planMaintDetails = dmsPlanMaint.getDmsPlanMaintDetailList();
List<DmsBillsMaintDetail> billsMaintDetails = new ArrayList<>();
planMaintDetails.forEach(planMaintDetail -> {
DmsBillsMaintDetail dmsBillsMaintDetail = new DmsBillsMaintDetail();
dmsBillsMaintDetail.setMaintInstanceId(maintInstanceId);
dmsBillsMaintDetail.setMachineId(planMaintDetail.getMachineId());
dmsBillsMaintDetail.setMaintStationId(planMaintDetail.getMaintStationId());
dmsBillsMaintDetail.setMaintStandardId(planMaintDetail.getMaintStandardId());
// dmsBillsMaintDetail.setIsFlag(1L);
dmsBillsMaintDetail.setMaintStatus(1L);
billsMaintDetails.add(dmsBillsMaintDetail);
});
// dmsBillsMaintInstanceMapper.batchDmsBillsMaintDetail(billsMaintDetails);
dmsBillsMaintDetailMapper.insertBatch(billsMaintDetails);
ArrayList<DmsBillsMaintDetailProject> billsMaintDetailProjectList = new ArrayList<>();
List<DmsBillsMaintDetail> list = dmsBillsMaintDetailMapper.selectDetailList(maintInstanceId);
for (DmsBillsMaintDetail detail : list) {
List<DmsBaseMaintProject> projects = dmsBillsMaintDetailMapper.selectPrjectIds(detail.getMaintStationId());
for (DmsBaseMaintProject project : projects) {
DmsBillsMaintDetailProject billsMaintDetailProject = new DmsBillsMaintDetailProject();
billsMaintDetailProject.setBillsMaintDetailId(detail.getBillsMaintDetailId());
// DmsBaseMaintStation station = dmsBillsMaintDetailMapper.selectMainStation(detail.getStationId());
billsMaintDetailProject.setMaintProjectId(project.getMaintProjectId());
billsMaintDetailProject.setMaintProjectName(project.getMaintProjectName());
billsMaintDetailProject.setMaintProjectDesc(project.getMaintProjectDesc());
billsMaintDetailProject.setMaintProjectStatus("2");
billsMaintDetailProjectList.add(billsMaintDetailProject);
}
}
// dmsBillsMaintInstanceMapper.batchDmsProject(list1);
dmsBillsMaintDetailProjectMapper.insertOrUpdateBatch(billsMaintDetailProjectList);
}
}

@ -0,0 +1,134 @@
package org.dromara.dms.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.dms.api.RemoteRepairStanceService;
import org.dromara.dms.domain.DmsPlanRepair;
import org.dromara.dms.domain.DmsRepairInstance;
import org.dromara.dms.domain.DmsRepairInstanceActivity;
import org.dromara.dms.mapper.DmsPlanRepairMapper;
import org.dromara.dms.mapper.DmsRepairInstanceActivityMapper;
import org.dromara.dms.mapper.DmsRepairInstanceMapper;
import org.dromara.dms.service.IDmsPlanRepairService;
import org.dromara.system.api.model.LoginUser;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.util.Date;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteRepairStanceServicempl implements RemoteRepairStanceService {
private final DmsPlanRepairMapper dmsPlanRepairMapper;
private final DmsRepairInstanceMapper dmsRepairInstanceMapper;
private final DmsRepairInstanceActivityMapper dmsRepairInstanceActivityMapper;
private final IDmsPlanRepairService dmsPlanRepairService;
public static String lastDate="2000-01-01";
//流水号
public static int serialNumber = 0;
/**
* ;
*
*/
@Override
@Transactional( rollbackFor = Exception.class )
public R<Integer> insertDmsRepairInstance(String planRepairCode) {
String repairCode = planRepairCode.replaceAll("\"", "");
DmsPlanRepair dmsPlanRepair = dmsPlanRepairMapper.selectDmsPlanRepairByPlanRepairCode(repairCode);
Long timeLimit = dmsPlanRepair.getTimeLimit();
if (timeLimit !=null){
Long days = timeLimit / (24 * 60 * 60l);
Long hours = timeLimit % (24 * 60 * 60l);
dmsPlanRepair.setTimeLimitDays(days);
dmsPlanRepair.setTimeLimitHours(hours/(60*60l));
}
dmsPlanRepair.setCreateMethod("2");//1:手工创建工单2根据计划自动创建工单
DmsRepairInstance dmsRepairInstance = new DmsRepairInstance();
// dmsRepairInstance.setWfProcessId(101l);
dmsRepairInstance.setPlanRepairId(dmsPlanRepair.getPlanRepairId());
dmsRepairInstance.setPlanBeginTime(dmsPlanRepair.getRepairTime());
dmsRepairInstance.setInstanceType("2");
// dmsRepairInstance.setRepairType(dmsPlanRepair.getRepairType());
// dmsRepairInstance.setRepairGroup(dmsPlanRepair.getRepairGroup());
// dmsRepairInstance.setRepairSupervisor(dmsPlanRepair.getRepairSupervisor());
// WfProcessActivity wfProcessActivity = new WfProcessActivity();
// wfProcessActivity.setWfProcessId(dmsRepairInstance.getWfProcessId());
// Long aLong = dmsRepairInstanceMapper.selectWfProcessActivityId(dmsRepairInstance.getWfProcessId());
// 创建一个SimpleDateFormat对象用于格式化日期为"yyyyMMdd"格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
// 获取当前日期
Date date = new Date();
// 将当前日期格式化为字符串
String format = sdf.format(date);
// 如果格式化后的日期字符串与上次记录的日期不同
if (!format.equals(lastDate)){
// 更新上次记录的日期为当前日期
lastDate = format;
// 重置序列号为0
serialNumber = 0;
}
// 增加序列号
serialNumber++;
// 将序列号格式化为6位数不足部分用0填充
String serialNumberStr = String.format("%06d", serialNumber);
// 拼接日期和序列号生成每日代码
String dailyCode = format + serialNumberStr;
// 设置维修单的代码
dmsRepairInstance.setBillsRepairCode(dailyCode);
// LoginUser user = SecurityUtils.getLoginUser();
LoginUser user = LoginHelper.getLoginUser();
if (dmsRepairInstance.getPlanBeginTime()!=null){
DmsPlanRepair planRepair = dmsPlanRepairMapper.selectDmsPlanRepairByPlanRepairId(dmsRepairInstance.getPlanRepairId());
Long limit = planRepair.getTimeLimit();
Date planBeginTime = dmsRepairInstance.getPlanBeginTime();
dmsRepairInstance.setPlanEndTime(new Date(planBeginTime.getTime() + limit*1000l));
}
// dmsRepairInstance.setIsFlag("1");
dmsRepairInstance.setBillsStatus("1");
if (dmsRepairInstance.getInstanceType()==null) {
dmsRepairInstance.setInstanceType("1");
}
// dmsRepairInstance.setApplyBy(user.getUsername());
// dmsRepairInstance.setApplyTime(DateUtils.getNowDate());
// dmsRepairInstance.setWfProcessId(101l);
int flag = dmsRepairInstanceMapper.insert(dmsRepairInstance);
//创建工单时新建工单实例节点
DmsRepairInstanceActivity dmsRepairInstanceActivity = new DmsRepairInstanceActivity();
dmsRepairInstanceActivity.setRepairInstanceId(dmsRepairInstance.getRepairInstanceId());
dmsRepairInstanceActivity.setProcessHandleStatus("1");
//先写死第一步所对应的步骤后续通过wfProcessId来查询步骤对应的id
// dmsRepairInstanceActivity.setProcessActivityId(aLong);
dmsRepairInstanceActivity.setProcessStepOrder(1l);
dmsRepairInstanceActivity.setCreateBy(user.getUserId());
dmsRepairInstanceActivity.setCreateTime(DateUtils.getNowDate());
dmsRepairInstanceActivity.setStartTime(DateUtils.getNowDate());
// dmsRepairInstanceActivity.setRepairType(dmsRepairInstance.getRepairType());
// dmsRepairInstanceActivity.setRepairGroup(dmsRepairInstance.getRepairGroup());
// dmsRepairInstanceActivity.setRepairSupervisor(dmsRepairInstance.getRepairSupervisor());
dmsRepairInstanceActivityMapper.insert(dmsRepairInstanceActivity);
return R.ok(flag);
}
}

@ -0,0 +1,147 @@
package org.dromara.job.service;
import com.aizuda.snailjob.client.job.core.dto.JobResponseVO;
import com.aizuda.snailjob.client.job.core.openapi.SnailJobOpenApi;
import com.aizuda.snailjob.common.core.enums.StatusEnum;
//import com.aizuda.snailjob.template.datasource.persistence.mapper.JobMapper;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.domain.R;
import org.dromara.job.api.RemoteJobService;
import org.dromara.job.api.model.DmsJobEntity;
import org.springframework.stereotype.Service;
/**
*
*
* @author ruoyi
*/
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteJobServiceImpl implements RemoteJobService {
// private final JobMapper jobMapper;
/**
*
*
* @param dmsJobEntity
* @return idR
*/
@Override
public R<Long> addClusterJob(DmsJobEntity dmsJobEntity) {
try {
Long jobId = SnailJobOpenApi.addClusterJob()
.setRouteKey(dmsJobEntity.getRouteKey())//执行器路由策略:(1:一致性哈希2:随机;3:LRU;4:轮询;5:第一个;6:最后一个;)
.setJobName(dmsJobEntity.getJobName())//任务名称
.setExecutorInfo(dmsJobEntity.getExecutorInfo())//执行器名称
.setExecutorTimeout(dmsJobEntity.getExecutorTimeout())//任务执行超时时间(秒)
.setDescription(dmsJobEntity.getDescription())//任务描述
.setBlockStrategy(dmsJobEntity.getBlockStrategy())//阻塞策略:1、丢弃 2、覆盖 3、并行
.setMaxRetryTimes(dmsJobEntity.getMaxRetryTimes())//最大重试次数
.setTriggerType(dmsJobEntity.getTriggerType())//触发类型:2. 固定时间 3.CRON 表达式 99.工作流
.setTriggerInterval(dmsJobEntity.getTriggerInterval())//触发间隔
.addArgsStr(dmsJobEntity.getArgsStr(), dmsJobEntity.getExtAttrs())//执行任务参数
.setRetryInterval(dmsJobEntity.getRetryInterval())//重试间隔时长(秒)
.execute();
if (jobId != null) {
return R.ok(jobId);
} else {
return R.fail("新增集群任务失败");
}
} catch (Exception e) {
// 根据SnailJob实际的异常类型和错误处理机制可能需要更具体的异常捕获
return R.fail("新增集群任务异常: " + e.getMessage());
}
}
/**
*
* @param dmsJobEntity
* @return R
*/
@Override
public R<Void> updateClusterJob(DmsJobEntity dmsJobEntity) {
try {
boolean success = SnailJobOpenApi.updateClusterJob(dmsJobEntity.getId())
.setRouteKey(dmsJobEntity.getRouteKey())//执行器路由策略:(1:一致性哈希2:随机;3:LRU;4:轮询;5:第一个;6:最后一个;)
.setJobName(dmsJobEntity.getJobName())//任务名称
.setExecutorInfo(dmsJobEntity.getExecutorInfo())//执行器名称
.setExecutorTimeout(dmsJobEntity.getExecutorTimeout())//任务执行超时时间(秒)
.setDescription(dmsJobEntity.getDescription())//任务描述
.setBlockStrategy(dmsJobEntity.getBlockStrategy())//阻塞策略:1、丢弃 2、覆盖 3、并行
.setMaxRetryTimes(dmsJobEntity.getMaxRetryTimes())//最大重试次数
.setTriggerType(dmsJobEntity.getTriggerType())//触发类型:2. 固定时间 3.CRON 表达式 99.工作流
.setTriggerInterval(dmsJobEntity.getTriggerInterval())//触发间隔
.addArgsStr(dmsJobEntity.getArgsStr(), dmsJobEntity.getExtAttrs())//执行任务参数
.setRetryInterval(dmsJobEntity.getRetryInterval())//重试间隔时长(秒)
.execute();
return success ? R.ok() : R.fail("修改集群任务失败");
} catch (Exception e) {
return R.fail("修改集群任务异常: " + e.getMessage());
}
}
/**
*
*
* @param jobId ID
* @return R
*/
@Override
public R<JobResponseVO> queryJob(Long jobId) {
try {
JobResponseVO jobDetail = SnailJobOpenApi.getJobDetail(jobId).execute();
if (jobDetail != null) {
return R.ok(jobDetail);
} else {
return R.fail("查询任务详情失败或任务不存在");
}
} catch (Exception e) {
return R.fail("查询任务详情异常: " + e.getMessage());
}
}
/**
*
*
* @param jobId ID
* @param status (NO:0 ; YES:1)
* @return R
*/
@Override
public R<Void> updateJobStatus(Long jobId, Long status) {
try {
boolean success = SnailJobOpenApi
.updateJobStatus(jobId)
.setStatus(StatusEnum.YES.getStatus().equals(status.intValue()) ? StatusEnum.YES : StatusEnum.NO)
.execute();
return success ? R.ok() : R.fail("更新任务状态失败");
} catch (Exception e) {
return R.fail("更新任务状态异常: " + e.getMessage());
}
}
/**
* SnailJobOpenApi
*/
/* @Override
public Boolean deleteJob(Long jobId) { // 如果需要统一返回R类型此方法也应修改
int i = jobMapper.deleteById(jobId);
return i > 0;
}*/
// 若 deleteJob 方法也需要改造:
/*
@Override
public R<Void> deleteJob(Long jobId) {
try {
// 假设 jobMapper.deleteById 成功返回大于0的数失败则返回0或抛异常
int i = jobMapper.deleteById(jobId);
return i > 0 ? R.ok() : R.fail("删除任务失败");
} catch (Exception e) {
return R.fail("删除任务异常: " + e.getMessage());
}
}
*/
}

@ -0,0 +1,44 @@
package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.dms.api.RemoteInspectInstanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@JobExecutor(name = "stanceInspect")
public class DmsInspectStanceExecutor {
private static final ObjectMapper objectMapper = new ObjectMapper();
@DubboReference
private final RemoteInspectInstanceService remoteInspectInstanceService;
// 推荐使用构造函数注入Spring 4.3+支持隐式@Autowired
public DmsInspectStanceExecutor(RemoteInspectInstanceService remoteInspectInstanceService) {
this.remoteInspectInstanceService = remoteInspectInstanceService;
}
public ExecuteResult jobExecute(JobArgs jobArgs) {
try {
String jsonStr = String.valueOf(jobArgs.getJobParams());
// 将 JSON 字符串转为 Map
Map<String, Object> paramMap = objectMapper.readValue(jsonStr, Map.class);
String planCode = (String) paramMap.get("planInspectCode");
R<Integer> instance = remoteInspectInstanceService.insertInspectInstance(planCode);
return ExecuteResult.success(instance);
} catch (Exception e) {
return ExecuteResult.failure(e.getMessage());
}
}
}

@ -0,0 +1,45 @@
package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.dms.api.RemoteLubeInstanceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@JobExecutor(name = "stanceLube")
public class DmsLubeStanceExecutor {
private static final ObjectMapper objectMapper = new ObjectMapper();
@DubboReference
private final RemoteLubeInstanceService dmsBillsLubeInstanceService;
public DmsLubeStanceExecutor(RemoteLubeInstanceService dmsBillsLubeInstanceService) {
this.dmsBillsLubeInstanceService = dmsBillsLubeInstanceService;
}
public ExecuteResult jobExecute(JobArgs jobArgs) {
try {
String jsonStr = String.valueOf(jobArgs.getJobParams());
// 将 JSON 字符串转为 Map
Map<String, Object> paramMap = objectMapper.readValue(jsonStr, Map.class);
String planCode = (String) paramMap.get("planLubeCode");
R<Void> instance = dmsBillsLubeInstanceService.insertLubeInstance(planCode);
return ExecuteResult.success(instance);
} catch (Exception e) {
return ExecuteResult.failure(e.getMessage());
}
}
}

@ -0,0 +1,43 @@
package org.dromara.job.snailjob;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.common.core.domain.R;
import org.dromara.dms.api.RemoteMaintInstanceService;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
@JobExecutor(name = "stanceMaint")
public class DmsMaintStanceExecutor {
private static final ObjectMapper objectMapper = new ObjectMapper();
@DubboReference
private final RemoteMaintInstanceService dmsBillsMaintInstanceService;
public DmsMaintStanceExecutor(RemoteMaintInstanceService dmsBillsMaintInstanceService) {
this.dmsBillsMaintInstanceService = dmsBillsMaintInstanceService;
}
public ExecuteResult jobExecute(JobArgs jobArgs) {
try {
String jsonStr = String.valueOf(jobArgs.getJobParams());
// 将 JSON 字符串转为 Map
Map<String, Object> paramMap = objectMapper.readValue(jsonStr, Map.class);
String planCode = (String) paramMap.get("planMaintCode");
R<Integer> instance = dmsBillsMaintInstanceService.insertDmsBillsMaintInstance(planCode);
return ExecuteResult.success(instance);
} catch (Exception e) {
return ExecuteResult.failure(e.getMessage());
}
}
}
Loading…
Cancel
Save