|
|
|
|
@ -3,6 +3,7 @@ package org.springblade.plugin.workbench.service.impl; |
|
|
|
|
import com.alibaba.fastjson.JSON; |
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
|
import liquibase.pro.packaged.N; |
|
|
|
|
import lombok.AllArgsConstructor; |
|
|
|
|
import lombok.NonNull; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
@ -39,6 +40,7 @@ import org.springblade.plugin.workbench.enumutil.RepeatEnum; |
|
|
|
|
import org.springblade.plugin.workbench.enumutil.RepeatTypeEnum; |
|
|
|
|
import org.springblade.plugin.workbench.mapper.BladeManMadeMapper; |
|
|
|
|
import org.springblade.plugin.workbench.service.IAutoStartModelService; |
|
|
|
|
import org.springblade.plugin.workbench.util.MyDateUtil; |
|
|
|
|
import org.springblade.plugin.workbench.vo.AutoStartModelVO; |
|
|
|
|
import org.springblade.plugin.workflow.core.utils.WfTaskUtil; |
|
|
|
|
import org.springblade.system.cache.DictBizCache; |
|
|
|
|
@ -57,7 +59,11 @@ import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
import javax.validation.constraints.NotEmpty; |
|
|
|
|
import java.text.SimpleDateFormat; |
|
|
|
|
import java.time.DayOfWeek; |
|
|
|
|
import java.time.Duration; |
|
|
|
|
import java.time.LocalDate; |
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
|
import java.time.temporal.TemporalAdjusters; |
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
@ -172,121 +178,6 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 整个工作流结束后,根据processinstanceId更新AutoStartModel表中的该记录 |
|
|
|
|
* status = 10,表示可以周期性开启工单了 |
|
|
|
|
* 同时将该工作流中最终表单变量更新到AutoStartModel |
|
|
|
|
* 其次是计算下一次工单开启时间和期望结束时间 |
|
|
|
|
* @param processinstanceId |
|
|
|
|
*/ |
|
|
|
|
// @Override
|
|
|
|
|
//// @Async("taskExecutor")
|
|
|
|
|
// public void updateAutoStartModel(String processinstanceId){
|
|
|
|
|
// try{
|
|
|
|
|
// Thread.sleep(200);
|
|
|
|
|
// }catch (Exception e){
|
|
|
|
|
// e.printStackTrace();
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// //查询AutoStartModel status = 1 isBreak = 0的数据
|
|
|
|
|
// LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery();
|
|
|
|
|
// autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId).eq(AutoStartModel::getIsBreak,0);
|
|
|
|
|
// List<AutoStartModel> list = this.list(autoStartModelWrapper);
|
|
|
|
|
// if(list.size() > 0){
|
|
|
|
|
// list.forEach(autoStartModel -> {
|
|
|
|
|
// autoStartModel.setStatus(10);
|
|
|
|
|
// List<HistoricVariableInstance> variableList = historyService.createHistoricVariableInstanceQuery().processInstanceId(processinstanceId).list();
|
|
|
|
|
// Date qiwangwanchengshijian = DateUtil.plusDays(DateUtil.now(),1);
|
|
|
|
|
// for(HistoricVariableInstance hv : variableList){
|
|
|
|
|
// switch (hv.getVariableName()){
|
|
|
|
|
// case "guanlibumen":
|
|
|
|
|
// autoStartModel.setManagement(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "renwufulei":
|
|
|
|
|
// autoStartModel.setTaskParent(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "renwuzhonglei":
|
|
|
|
|
// autoStartModel.setTaskType(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "renwudengji":
|
|
|
|
|
// autoStartModel.setTaskLevel(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "xitongmingchengshujuku":
|
|
|
|
|
// autoStartModel.setOperateSys(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "xitongmokuaishujubiao":
|
|
|
|
|
// autoStartModel.setOperateModule(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "chongfumoshi":
|
|
|
|
|
// autoStartModel.setRepeatMode(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// case "qiwangwanchengshijian":
|
|
|
|
|
// qiwangwanchengshijian = DateUtil.parse(hv.getValue().toString(),"yyyy-MM-dd HH:mm:ss");
|
|
|
|
|
// break;
|
|
|
|
|
// case "type":
|
|
|
|
|
// autoStartModel.setRepeatMode(Long.valueOf(hv.getValue().toString()));
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// //获取工作流的开始时间
|
|
|
|
|
// HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processinstanceId).singleResult();
|
|
|
|
|
// Date startTime = historicProcessInstance.getStartTime();
|
|
|
|
|
//// Date nextStartTime;
|
|
|
|
|
//// Date nextEndTime;
|
|
|
|
|
//// //获取任务重复模式
|
|
|
|
|
//// Long repeatMode = autoStartModel.getRepeatMode();
|
|
|
|
|
//// System.out.println(Long.valueOf(RepeatEnum.每周.getCode()));
|
|
|
|
|
//// System.out.println(repeatMode);
|
|
|
|
|
//// if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode.toString())){
|
|
|
|
|
//// nextStartTime = DateUtil.plusWeeks(startTime,1);
|
|
|
|
|
//// nextEndTime = DateUtil.plusWeeks(qiwangwanchengshijian,1);
|
|
|
|
|
//// }else if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode.toString())){
|
|
|
|
|
//// nextStartTime = DateUtil.plusMonths(startTime,1);
|
|
|
|
|
//// nextEndTime = DateUtil.plusMonths(qiwangwanchengshijian,1);
|
|
|
|
|
//// }else if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode.toString())){
|
|
|
|
|
//// nextStartTime = DateUtil.plusMonths(startTime,3);
|
|
|
|
|
//// nextEndTime = DateUtil.plusMonths(qiwangwanchengshijian,3);
|
|
|
|
|
//// }else if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode.toString())){
|
|
|
|
|
//// nextStartTime = DateUtil.plusDays(startTime,1);
|
|
|
|
|
//// nextEndTime = DateUtil.plusDays(qiwangwanchengshijian,1);
|
|
|
|
|
//// }else if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode.toString())){
|
|
|
|
|
//// nextStartTime = DateUtil.plusMinutes(startTime,1);
|
|
|
|
|
//// nextEndTime = DateUtil.plusMinutes(qiwangwanchengshijian,1);
|
|
|
|
|
//// }
|
|
|
|
|
//// else{
|
|
|
|
|
//// return;
|
|
|
|
|
//// }
|
|
|
|
|
// //还要自动生成work_order,所以以本次的信息为依据,auto_start_model nextFlag = 1 ,表示已经生成工单了
|
|
|
|
|
// autoStartModel.setNextStartTime(startTime);
|
|
|
|
|
// autoStartModel.setNextEndTime(qiwangwanchengshijian);
|
|
|
|
|
// autoStartModel.setNextFlag(1);
|
|
|
|
|
// baseMapper.updateById(autoStartModel);
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// //生成工单
|
|
|
|
|
// WorkOrder workOrder = new WorkOrder();
|
|
|
|
|
// workOrder.setProcessInstanceId(autoStartModel.getProcessInstanceId());
|
|
|
|
|
// workOrder.setTenantId(autoStartModel.getTenantId());
|
|
|
|
|
// workOrder.setApplyUser(autoStartModel.getApplyUser().toString());
|
|
|
|
|
// workOrder.setMaintenanceCompany(autoStartModel.getMaintenanceCompany().toString());
|
|
|
|
|
// workOrder.setManagement(autoStartModel.getManagement().toString());
|
|
|
|
|
// workOrder.setTaskParent(autoStartModel.getTaskParent().toString());
|
|
|
|
|
// workOrder.setTaskType(autoStartModel.getTaskType().toString());
|
|
|
|
|
// workOrder.setTaskLevel(autoStartModel.getTaskLevel().toString());
|
|
|
|
|
// workOrder.setRepeatMode(autoStartModel.getRepeatMode().toString());
|
|
|
|
|
// workOrder.setType(autoStartModel.getType());
|
|
|
|
|
// workOrder.setOperateSys(autoStartModel.getOperateSys().toString());
|
|
|
|
|
// workOrder.setOperateModule(autoStartModel.getOperateModule().toString());
|
|
|
|
|
// //如果是运维公司发起的日常任务(普通),生成工单,并标记为已完成
|
|
|
|
|
// if(StringUtils.equals(autoStartModel.getApplyRole(),"运维公司") && StringUtils.equals(autoStartModel.getTaskLevel().toString(),"1624973130579636225")){
|
|
|
|
|
// workOrder.setIsFinish(1);
|
|
|
|
|
// workOrder.setFinishTime(qiwangwanchengshijian);
|
|
|
|
|
// }
|
|
|
|
|
//
|
|
|
|
|
// workOrderService.save(workOrder);
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 重复任务生成工单并更新重复任务的元数据 |
|
|
|
|
@ -343,7 +234,7 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe |
|
|
|
|
workOrder.setMaintenanceCompany(variables.get("yunweigongsi").toString()); |
|
|
|
|
workOrder.setTenantId(WfTaskUtil.getTenantId()); |
|
|
|
|
workOrder.setProcessInstanceId(processInstanceId); |
|
|
|
|
workOrder.setExpectedCompletionTime(DateUtil.parse(variables.get("qiwangwanchengshijian").toString(),"yyyy-MM-dd HH:mm:ss")); |
|
|
|
|
workOrder.setExpectedCompletionTime(DateUtil.parse(variables.get("qiwangwanchengshijian").toString().substring(0,10) + " 23:59:59","yyyy-MM-dd HH:mm:ss")); |
|
|
|
|
workOrder.setRepeatMode(variables.get("chongfumoshi").toString()); |
|
|
|
|
//如果是运维公司发起的日常任务(普通),生成工单,并标记为已完成
|
|
|
|
|
User applyUser = UserCache.getUser(Long.valueOf(variables.get("applyUser").toString())); |
|
|
|
|
@ -357,20 +248,73 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 保存工作流程,要做的事情 |
|
|
|
|
* 1.新建工单 |
|
|
|
|
* 2.保存模板数据 |
|
|
|
|
* 3.更新模板的下一次开始和结束时间 |
|
|
|
|
* @param processinstanceId |
|
|
|
|
* @param variables |
|
|
|
|
* @return |
|
|
|
|
* "更新模板数据失败" |
|
|
|
|
* “生成工单失败” |
|
|
|
|
* “保存工单模板数据失败” |
|
|
|
|
*/ |
|
|
|
|
@Override |
|
|
|
|
public String saveStartProcess(String processinstanceId,Map<String,Object> variables){ |
|
|
|
|
String result = ""; |
|
|
|
|
|
|
|
|
|
//保存新增工单和工单模板数据 返回结果: “1” 成功 或 “生成工单失败” 或 “保存工单模板数据失败”
|
|
|
|
|
result = this.newWorkOrderAndSaveModel(processinstanceId,variables); |
|
|
|
|
|
|
|
|
|
if(!StringUtils.equals(result,"1")) { |
|
|
|
|
return result; |
|
|
|
|
}else{ |
|
|
|
|
//更新工单模板的nestStartTime和nextEndTime
|
|
|
|
|
LambdaQueryWrapper<AutoStartModel> wrapper = Wrappers.lambdaQuery(); |
|
|
|
|
wrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId).orderByDesc(AutoStartModel::getCreateTime).last("limit 1"); |
|
|
|
|
AutoStartModel autoStartModel = baseMapper.selectOne(wrapper); |
|
|
|
|
|
|
|
|
|
Date startTime = autoStartModel.getNextStartTime(); |
|
|
|
|
Date endTime = autoStartModel.getNextEndTime(); |
|
|
|
|
String repeatMode = StringUtils.isEmpty(autoStartModel.getRepeatMode().toString()) ? "" : autoStartModel.getRepeatMode().toString(); |
|
|
|
|
|
|
|
|
|
Date nextEndTime = this.nextTime(endTime, repeatMode); |
|
|
|
|
|
|
|
|
|
//如果下次结束时间大于当前记录的结束时间,才会更新
|
|
|
|
|
if(DateUtil.between(endTime,nextEndTime).getSeconds() > 0){ |
|
|
|
|
Date nextStartTime = this.setStartTime(nextEndTime, repeatMode); |
|
|
|
|
autoStartModel.setNextStartTime(nextStartTime); |
|
|
|
|
autoStartModel.setNextEndTime(nextEndTime); |
|
|
|
|
|
|
|
|
|
int i = baseMapper.updateById(autoStartModel); |
|
|
|
|
|
|
|
|
|
if(i > 0) return "1"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return "更新模板数据失败"; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 新增工单并保存模板数据,返回结果: “0” 成功 或 “生成工单失败” 或 “保存工单模板数据失败” |
|
|
|
|
* @param processinstanceId |
|
|
|
|
* @param variables |
|
|
|
|
* @return |
|
|
|
|
*/ |
|
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
|
@Override |
|
|
|
|
public void saveStartProcess(String processinstanceId,Map<String,Object> variables){ |
|
|
|
|
//将新增的流程实例id保存到blade_flow_autostart_model
|
|
|
|
|
public String newWorkOrderAndSaveModel(String processinstanceId,Map<String,Object> variables){ |
|
|
|
|
String result = "1"; |
|
|
|
|
//根据流程表单数据创建AutoStartModel对象
|
|
|
|
|
AutoStartModel autoStartModel = new AutoStartModel(); |
|
|
|
|
autoStartModel.setProcessInstanceId(processinstanceId); |
|
|
|
|
HistoricProcessInstance processInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(processinstanceId).singleResult(); |
|
|
|
|
Date processStartTime = processInstance.getStartTime(); |
|
|
|
|
String chongfumoshi = variables.get("chongfumoshi") == null ? "" : variables.get("chongfumoshi").toString(); |
|
|
|
|
//Date nextStartTime = this.nextDate(processStartTime,chongfumoshi);
|
|
|
|
|
autoStartModel.setNextStartTime(DateUtil.now()); |
|
|
|
|
Date qiwangwanchengshijian = DateUtil.parse(variables.get("qiwangwanchengshijian").toString(), "yyyy-MM-dd HH:mm:ss"); |
|
|
|
|
//Date nextEndTime = this.nextDate(qiwangwanchengshijian,chongfumoshi);
|
|
|
|
|
Date qiwangwanchengshijian = DateUtil.parse(variables.get("qiwangwanchengshijian").toString().substring(0,10) + " 23:59:59", "yyyy-MM-dd HH:mm:ss"); |
|
|
|
|
Date nextStartTime = this.setStartTime(qiwangwanchengshijian, chongfumoshi); |
|
|
|
|
//第一次创建工单的开始时间和结束时间都是以工作流的期望结束时间为基准的
|
|
|
|
|
autoStartModel.setNextStartTime(nextStartTime); |
|
|
|
|
autoStartModel.setNextEndTime(qiwangwanchengshijian); |
|
|
|
|
autoStartModel.setNextFlag(0); |
|
|
|
|
|
|
|
|
|
autoStartModel.setApplyUser(Long.valueOf(variables.get("applyUser").toString())); |
|
|
|
|
autoStartModel.setApplyRole(variables.get("createRole").toString()); |
|
|
|
|
autoStartModel.setMaintenanceCompany(Long.valueOf(variables.get("yunweigongsi").toString())); |
|
|
|
|
@ -385,35 +329,115 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe |
|
|
|
|
autoStartModel.setIsDeleted(0); |
|
|
|
|
autoStartModel.setUploadRecord(JSON.toJSONString(variables.get("uploadrecord"))); |
|
|
|
|
|
|
|
|
|
//自动生成工单
|
|
|
|
|
this.newWorkOrder(autoStartModel); |
|
|
|
|
//修改status = 10 nextFlag = 1,表示该记录已经生成工单了,并且该记录可以重复执行了
|
|
|
|
|
autoStartModel.setCreateTime(DateUtil.now()); |
|
|
|
|
autoStartModel.setStatus(10); |
|
|
|
|
autoStartModel.setNextFlag(1); |
|
|
|
|
baseMapper.insert(autoStartModel); |
|
|
|
|
//自动生成工单并保存
|
|
|
|
|
boolean saveOrder = false; |
|
|
|
|
int retrySaveOrder = 0; |
|
|
|
|
while(!saveOrder && retrySaveOrder < 5){ |
|
|
|
|
try{ |
|
|
|
|
saveOrder = this.newWorkOrder(autoStartModel); |
|
|
|
|
}catch (Exception e){ |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
retrySaveOrder ++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
//如果生成工单失败,返回失败信息
|
|
|
|
|
if(!saveOrder){ |
|
|
|
|
result = "生成工单失败"; |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
//保存模板数据
|
|
|
|
|
int insertModel = 0; |
|
|
|
|
int retrySaveModel = 0; |
|
|
|
|
//首先判断autoStartModel中是否有符合processinstanceId的记录,没有才能继续
|
|
|
|
|
LambdaQueryWrapper<AutoStartModel> autoStartModelWrapper = Wrappers.lambdaQuery(); |
|
|
|
|
autoStartModelWrapper.eq(AutoStartModel::getProcessInstanceId,processinstanceId); |
|
|
|
|
List<AutoStartModel> autoStartModels = baseMapper.selectList(autoStartModelWrapper); |
|
|
|
|
if(autoStartModels.size() > 0) return "数据库中已经有该工作数据了"; |
|
|
|
|
|
|
|
|
|
while(insertModel <= 0){ |
|
|
|
|
try{ |
|
|
|
|
insertModel = baseMapper.insert(autoStartModel); |
|
|
|
|
}catch (Exception e){ |
|
|
|
|
e.printStackTrace(); |
|
|
|
|
retrySaveModel ++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//如果保存模板数据失败,返回失败信息
|
|
|
|
|
if(insertModel <=0){ |
|
|
|
|
result = "保存工单模板数据失败"; |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//根据期望结束时间,计算开始时间
|
|
|
|
|
private Date setStartTime(Date endTime,String repeatMode){ |
|
|
|
|
Date startDate; |
|
|
|
|
LocalDateTime localEndTime = DateUtil.fromDate(endTime); |
|
|
|
|
LocalDate localDate = LocalDate.of(localEndTime.getYear(),localEndTime.getMonth(),localEndTime.getDayOfMonth()); |
|
|
|
|
|
|
|
|
|
private Date nextDate(Date startTime, String repeatMode){ |
|
|
|
|
Date endTime; |
|
|
|
|
//repeatMode 为空串
|
|
|
|
|
if(StringUtils.isEmpty(repeatMode) || StringUtils.isBlank(repeatMode)) return endTime; |
|
|
|
|
|
|
|
|
|
//每天重复
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode)){ |
|
|
|
|
startDate = DateUtil.toDate(localDate); |
|
|
|
|
return startDate; |
|
|
|
|
} |
|
|
|
|
//每周重复,获取当前日期所在周的周一
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode)){ |
|
|
|
|
endTime = DateUtil.plusWeeks(startTime,1); |
|
|
|
|
}else if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode)){ |
|
|
|
|
endTime = DateUtil.plusMonths(startTime,1); |
|
|
|
|
}else if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode)){ |
|
|
|
|
endTime = DateUtil.plusMonths(startTime,3); |
|
|
|
|
}else if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode)){ |
|
|
|
|
endTime = DateUtil.plusMinutes(startTime,1); |
|
|
|
|
}else{ |
|
|
|
|
endTime = startTime; |
|
|
|
|
Date date = DateUtil.toDate(localDate); |
|
|
|
|
return MyDateUtil.getFirstDayOfWeek(date); |
|
|
|
|
} |
|
|
|
|
//每月重复,获取当前日期所在月的第一天
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode)){ |
|
|
|
|
LocalDate firsDayOfMonth = localDate.with(TemporalAdjusters.firstDayOfMonth()); |
|
|
|
|
return DateUtil.toDate(firsDayOfMonth); |
|
|
|
|
} |
|
|
|
|
//每季度重复,获取当前日期所在季度的首月的第一天
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode)){ |
|
|
|
|
int month = localDate.getMonth().getValue(); |
|
|
|
|
if (1 <= month && month <= 3) { |
|
|
|
|
localDate = localDate.withMonth(1); |
|
|
|
|
} else if (4 <= month && month <= 6) { |
|
|
|
|
localDate = localDate.withMonth(4); |
|
|
|
|
} else if (7 <= month && month <= 9) { |
|
|
|
|
localDate = localDate.withMonth(7); |
|
|
|
|
} else { |
|
|
|
|
localDate = localDate.withMonth(10); |
|
|
|
|
} |
|
|
|
|
return DateUtil.toDate(localDate); |
|
|
|
|
} |
|
|
|
|
return endTime; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//计算下次时间
|
|
|
|
|
private Date nextTime(Date date,String repeatMode){ |
|
|
|
|
Date now = DateUtil.now(); |
|
|
|
|
|
|
|
|
|
//每分钟重复
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每分钟.getCode(),repeatMode)) return DateUtil.plusMinutes(date,1); |
|
|
|
|
|
|
|
|
|
//每天重复
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每天.getCode(),repeatMode)) return DateUtil.plusDays(date,1); |
|
|
|
|
|
|
|
|
|
return endTime; |
|
|
|
|
//每周重复
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每周.getCode(),repeatMode)) return DateUtil.plusWeeks(date,1); |
|
|
|
|
|
|
|
|
|
//每月重复
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每月.getCode(),repeatMode)) return DateUtil.plusMonths(date,1); |
|
|
|
|
|
|
|
|
|
//每季度重复
|
|
|
|
|
if(StringUtils.equals(RepeatEnum.每季度.getCode(),repeatMode)) return DateUtil.plusMonths(date,3); |
|
|
|
|
|
|
|
|
|
return now; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void newWorkOrder(AutoStartModel autoStartModel){ |
|
|
|
|
|
|
|
|
|
private boolean newWorkOrder(AutoStartModel autoStartModel){ |
|
|
|
|
boolean save = false; |
|
|
|
|
//生成工单
|
|
|
|
|
WorkOrder workOrder = new WorkOrder(); |
|
|
|
|
workOrder.setProcessInstanceId(autoStartModel.getProcessInstanceId()); |
|
|
|
|
@ -437,6 +461,48 @@ public class AutoStartModelServiceImpl extends BaseServiceImpl<BladeManMadeMappe |
|
|
|
|
workOrder.setFinishTime(new Date()); |
|
|
|
|
} |
|
|
|
|
workOrder.setExpectedCompletionTime(autoStartModel.getNextEndTime()); |
|
|
|
|
workOrderService.save(workOrder); |
|
|
|
|
save = workOrderService.save(workOrder); |
|
|
|
|
return save; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public void autoCreateWorkOrderByQuartz(){ |
|
|
|
|
this.autoCreateWorkOrder(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//自动生成工单
|
|
|
|
|
private void autoCreateWorkOrder(){ |
|
|
|
|
synchronized (AutoStartModelServiceImpl.class){ |
|
|
|
|
Date now = DateUtil.now(); |
|
|
|
|
|
|
|
|
|
LambdaQueryWrapper<AutoStartModel> wrapper = Wrappers.lambdaQuery(); |
|
|
|
|
//nextStartTime <= 当前时间
|
|
|
|
|
wrapper.eq(AutoStartModel::getIsBreak, 0).le(AutoStartModel::getNextStartTime, now); |
|
|
|
|
List<AutoStartModel> autoStartModels = baseMapper.selectList(wrapper); |
|
|
|
|
autoStartModels.forEach(autoStartModel -> { |
|
|
|
|
this.autoCreateWorkOrder(now,autoStartModel); |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
//递归生成工单并更新autoStartModel的nextSatartTime nextEndTime
|
|
|
|
|
private void autoCreateWorkOrder(Date now,AutoStartModel autoStartModel){ |
|
|
|
|
boolean b = this.newWorkOrder(autoStartModel); |
|
|
|
|
if(b){ |
|
|
|
|
Date endTime = autoStartModel.getNextEndTime(); |
|
|
|
|
|
|
|
|
|
//计算下次开始结束时间
|
|
|
|
|
Date nextEndTime = this.nextTime(endTime, autoStartModel.getRepeatMode().toString()); |
|
|
|
|
Date nextStartTime = this.setStartTime(nextEndTime, autoStartModel.getRepeatMode().toString()); |
|
|
|
|
|
|
|
|
|
//更新
|
|
|
|
|
autoStartModel.setNextStartTime(nextStartTime); |
|
|
|
|
autoStartModel.setNextEndTime(nextEndTime); |
|
|
|
|
baseMapper.updateById(autoStartModel); |
|
|
|
|
|
|
|
|
|
while(DateUtil.between(nextStartTime,now).getSeconds() >= 0){ |
|
|
|
|
autoCreateWorkOrder(now,autoStartModel); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|