|
|
@@ -16,13 +16,34 @@
|
|
|
*/
|
|
|
package org.springblade.business.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.springblade.business.dto.TaskBatchMonitorDTO;
|
|
|
+import org.springblade.business.dto.TaskBatchMonitorVo;
|
|
|
+import org.springblade.business.dto.TaskBatchPage;
|
|
|
import org.springblade.business.entity.TaskBatch;
|
|
|
import org.springblade.business.mapper.TaskBatchMapper;
|
|
|
import org.springblade.business.service.ITaskBatchService;
|
|
|
+import org.springblade.business.utils.TimeConverter;
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.core.tool.utils.CollectionUtil;
|
|
|
+import org.springblade.evisa.feign.EVisaClient;
|
|
|
+import org.springblade.evisa.vo.CertBeanVO;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.redis.core.RedisTemplate;
|
|
|
+import org.springframework.data.redis.core.StringRedisTemplate;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.io.BufferedReader;
|
|
|
+import java.io.InputStreamReader;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* 服务实现类
|
|
|
@@ -32,6 +53,10 @@ import java.util.List;
|
|
|
*/
|
|
|
@Service
|
|
|
public class TaskBatchServiceImpl extends BaseServiceImpl<TaskBatchMapper, TaskBatch> implements ITaskBatchService {
|
|
|
+ @Autowired
|
|
|
+ private StringRedisTemplate redisTemplate;
|
|
|
+ @Autowired
|
|
|
+ private EVisaClient eVisaClient;
|
|
|
|
|
|
@Override
|
|
|
public void deletedById(String id) {
|
|
|
@@ -47,4 +72,174 @@ public class TaskBatchServiceImpl extends BaseServiceImpl<TaskBatchMapper, TaskB
|
|
|
public List<TaskBatch> queryDataInfo() {
|
|
|
return baseMapper.queryDataInfo();
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<List<TaskBatchMonitorDTO>> selectTaskBatchList(TaskBatchPage page) {
|
|
|
+ //初始化查询参数
|
|
|
+ page.setTaskType(1);
|
|
|
+
|
|
|
+ List<TaskBatchMonitorDTO> data = new ArrayList<>();
|
|
|
+ //获取合同段id
|
|
|
+ if (page.getTaskType() == 1) {
|
|
|
+ Set<String> keys = redisTemplate.keys("sign-*");
|
|
|
+ if (CollectionUtil.isNotEmpty(keys)) {
|
|
|
+ List<String> strings = new ArrayList<>();
|
|
|
+ keys.forEach(f -> {
|
|
|
+ strings.add(f.replace("sign-", ""));
|
|
|
+ });
|
|
|
+ if (CollectionUtil.isNotEmpty(strings)) {
|
|
|
+ page.setFormDataIds(strings);
|
|
|
+ List<TaskBatchMonitorDTO> list = baseMapper.selectTaskBatchList2(page);
|
|
|
+ for (TaskBatchMonitorDTO taskBatchMonitorDTO : list) {
|
|
|
+ String value = redisTemplate.opsForValue().get("sign-" + taskBatchMonitorDTO.getFormDataId());
|
|
|
+ if (StringUtils.isNotEmpty(value)) {
|
|
|
+ taskBatchMonitorDTO.setTaskType(1);
|
|
|
+ //开始时间
|
|
|
+ DateTime startTime = DateUtil.parse(value, "yyyy-MM-dd HH:mm:ss");
|
|
|
+ taskBatchMonitorDTO.setStartTime(startTime.toString("HH:mm"));
|
|
|
+ //预计完成时间
|
|
|
+ if (taskBatchMonitorDTO.getPdfUrlSize() != null && taskBatchMonitorDTO.getPdfUrlSize() != 0) {
|
|
|
+ Long pdfUrlSize = taskBatchMonitorDTO.getPdfUrlSize();
|
|
|
+ //判断偏移多少秒 每50M 30秒
|
|
|
+ int time = calculateExecutionTime((double) pdfUrlSize / 1024 / 1024);
|
|
|
+
|
|
|
+ DateTime dateTime = DateUtil.offsetSecond(startTime, time);
|
|
|
+
|
|
|
+ String s = TimeConverter.secondsToMinutesSeconds(time);
|
|
|
+ taskBatchMonitorDTO.setFinishTime(s + "(" + dateTime.toString("HH:mm") + ")");
|
|
|
+ }else{
|
|
|
+ taskBatchMonitorDTO.setFinishTime("无法估算");
|
|
|
+ }
|
|
|
+ data.add(taskBatchMonitorDTO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return R.data(data);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<TaskBatchMonitorVo> count(TaskBatchPage page) {
|
|
|
+ List<TaskBatchMonitorDTO> list = baseMapper.selectTaskBatchList2(page);
|
|
|
+ for (TaskBatchMonitorDTO taskBatchMonitorDTO : list) {
|
|
|
+ String value = redisTemplate.opsForValue().get("sign-" + taskBatchMonitorDTO.getFormDataId());
|
|
|
+ if (StringUtils.isNotEmpty(value)) {
|
|
|
+ taskBatchMonitorDTO.setTaskType(1);
|
|
|
+ } else {
|
|
|
+ taskBatchMonitorDTO.setTaskType(2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //检测项目下所有工序资料PDF签章有效性
|
|
|
+ boolean jarRunning = false;
|
|
|
+ try {
|
|
|
+ jarRunning = isJarRunning("blade-e-visa.jar");
|
|
|
+ } catch (Exception e) {
|
|
|
+ }
|
|
|
+ long runTotal = list.stream().filter(f -> f.getTaskType() == 1).count();
|
|
|
+ long orderTotal = list.stream().filter(f -> f.getTaskType() == 2).count();
|
|
|
+ TaskBatchMonitorVo taskBatchMonitorVo = new TaskBatchMonitorVo();
|
|
|
+ taskBatchMonitorVo.setStatus(jarRunning);
|
|
|
+ taskBatchMonitorVo.setRunTotal(runTotal);
|
|
|
+ taskBatchMonitorVo.setOrderTotal(orderTotal);
|
|
|
+ return R.data(taskBatchMonitorVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public R<IPage<TaskBatchMonitorDTO>> pageOrder(TaskBatchPage page) {
|
|
|
+ boolean jarRunning = false;
|
|
|
+ try {
|
|
|
+ jarRunning = isJarRunning("blade-e-visa.jar");
|
|
|
+ } catch (Exception e) {
|
|
|
+ }
|
|
|
+ //获取正在处理的任务
|
|
|
+ Integer time = 0;
|
|
|
+ if(jarRunning){
|
|
|
+ R<List<TaskBatchMonitorDTO>> listR = selectTaskBatchList(new TaskBatchPage());
|
|
|
+ List<TaskBatchMonitorDTO> data = listR.getData();
|
|
|
+ if(CollectionUtil.isNotEmpty(data)){
|
|
|
+ List<TaskBatchMonitorDTO> collect = data.stream().filter(f -> f.getEstimatedTimeSeconds() != null).collect(Collectors.toList());
|
|
|
+ TaskBatchMonitorDTO taskBatchMonitorDTO = collect.get(collect.size() - 1);
|
|
|
+ //正在处理的任务最后一个偏移时间
|
|
|
+ time += taskBatchMonitorDTO.getEstimatedTimeSeconds();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //初始化查询参数
|
|
|
+ page.setTaskType(2);
|
|
|
+ page.setTime(time);
|
|
|
+
|
|
|
+ Set<String> keys = redisTemplate.keys("sign-*");
|
|
|
+ if (CollectionUtil.isNotEmpty(keys)) {
|
|
|
+ List<String> strings = new ArrayList<>();
|
|
|
+ keys.forEach(f -> {
|
|
|
+ strings.add(f.replace("sign-", ""));
|
|
|
+ });
|
|
|
+ page.setFormDataIds(strings);
|
|
|
+ }
|
|
|
+ IPage<TaskBatchMonitorDTO> taskBatchMonitorDTOIPage = baseMapper.selectTaskBatchList(new Page<>(page.getCurrent(),page.getSize()),page);
|
|
|
+ taskBatchMonitorDTOIPage.getRecords().forEach(f->{
|
|
|
+ if(f.getEstimatedTimeSeconds() == null || page.getTime() == 0){
|
|
|
+ f.setFinishTime("无法估算");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ DateTime dateTime = DateUtil.offsetSecond(DateUtil.parse(f.getCreateTime()), f.getEstimatedTimeSeconds());
|
|
|
+ String s = TimeConverter.secondsToMinutesSeconds(f.getEstimatedTimeSeconds());
|
|
|
+ f.setFinishTime(s + "(" + dateTime.toString("HH:mm") + ")");
|
|
|
+ });
|
|
|
+ return R.data(taskBatchMonitorDTOIPage);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据文件大小计算执行时间
|
|
|
+ *
|
|
|
+ * @param fileSizeMB 文件大小(MB)
|
|
|
+ * @return 执行时间(秒)
|
|
|
+ */
|
|
|
+ public static int calculateExecutionTime(double fileSizeMB) {
|
|
|
+ if (fileSizeMB < 0) {
|
|
|
+ throw new IllegalArgumentException("文件大小不能为负数: " + fileSizeMB);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (fileSizeMB <= 50) {
|
|
|
+ return 30;
|
|
|
+ } else if (fileSizeMB <= 100) {
|
|
|
+ return 60;
|
|
|
+ } else if (fileSizeMB <= 150) {
|
|
|
+ return 90;
|
|
|
+ } else {
|
|
|
+ // 超过150MB,每50MB递增30秒
|
|
|
+ double excess = fileSizeMB - 150;
|
|
|
+ int increments = (int) Math.ceil(excess / 50); // 向上取整
|
|
|
+ return 90 + increments * 30;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 使用jps命令检查jar包是否在运行
|
|
|
+ */
|
|
|
+ public static boolean isJarRunning(String jarName) {
|
|
|
+ try {
|
|
|
+ ProcessBuilder processBuilder = new ProcessBuilder("jps", "-l");
|
|
|
+ Process process = processBuilder.start();
|
|
|
+
|
|
|
+ BufferedReader reader = new BufferedReader(
|
|
|
+ new InputStreamReader(process.getInputStream())
|
|
|
+ );
|
|
|
+
|
|
|
+ String line;
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
+ if (line.contains(jarName)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ process.waitFor();
|
|
|
+ return false;
|
|
|
+
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|