Sfoglia il codice sorgente

Merge branch 'dev' of http://219.151.181.73:3000/zhuwei/bladex into dev

lvy 23 ore fa
parent
commit
bc9c3ff9ef
19 ha cambiato i file con 1361 aggiunte e 216 eliminazioni
  1. 55 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskBatchMonitorDTO.java
  2. 20 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskBatchMonitorVo.java
  3. 33 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskBatchPage.java
  4. 6 0
      blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java
  5. 10 0
      blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java
  6. 65 0
      blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskBatchController.java
  7. 7 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.java
  8. 110 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml
  9. 1 0
      blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml
  10. 11 0
      blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskBatchService.java
  11. 196 1
      blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskBatchServiceImpl.java
  12. 42 0
      blade-service/blade-business/src/main/java/org/springblade/business/utils/TimeConverter.java
  13. 2 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java
  14. 1 1
      blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java
  15. 14 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java
  16. 1 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeSynchronousRecordController.java
  17. 7 0
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java
  18. 2 1
      blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java
  19. 778 211
      blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java

+ 55 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskBatchMonitorDTO.java

@@ -0,0 +1,55 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * @author LHB
+ */
+@Data
+public class TaskBatchMonitorDTO {
+
+    @ApiModelProperty("任务id")
+    private String formDataId;
+
+    @ApiModelProperty("任务类型:1-正在处理,2-排队中")
+    private Integer taskType;
+
+    @ApiModelProperty("所属系统:1-质检,2-试验")
+    private Integer type;
+
+    @ApiModelProperty("项目名称")
+    private String projectName;
+
+    @ApiModelProperty("合同段")
+    private String contractName;
+
+    @ApiModelProperty("任务名称")
+    private String taskName;
+
+    @ApiModelProperty("任务人")
+    private String userName;
+
+    @ApiModelProperty("任务类型:1-个人整数,2企业证书")
+    private String signType;
+
+    @ApiModelProperty("文件大小")
+    private Long pdfUrlSize;
+
+    @ApiModelProperty("任务开始时间")
+    private String createTime;
+
+    @ApiModelProperty("电签开始时间")
+    private String startTime;
+
+    @ApiModelProperty("完成时间")
+    private String finishTime;
+
+    @ApiModelProperty("偏移秒数")
+    private Integer estimatedTimeSeconds;
+
+}

+ 20 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskBatchMonitorVo.java

@@ -0,0 +1,20 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author LHB
+ */
+@Data
+public class TaskBatchMonitorVo {
+    @ApiModelProperty("状态:true-运行中,false-已停止")
+    private Boolean status;
+    @ApiModelProperty("执行数量")
+    private long runTotal;
+    @ApiModelProperty("等待数量")
+    private long orderTotal;
+}

+ 33 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/dto/TaskBatchPage.java

@@ -0,0 +1,33 @@
+package org.springblade.business.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * @author LHB
+ */
+@Data
+public class TaskBatchPage {
+    @ApiModelProperty("任务类型:1-正在处理,2-排队中")
+    private Integer taskType;
+    @ApiModelProperty("类型:1-质检,2-试验")
+    private Integer type;
+    @ApiModelProperty("项目id")
+    private Long projectId;
+    @ApiModelProperty("合同段id")
+    private Long contractId;
+    @ApiModelProperty("任务名称")
+    private String taskName;
+
+    @ApiModelProperty("页码")
+    private Integer current;
+    @ApiModelProperty("数量")
+    private Integer size;
+    @ApiModelProperty("偏移时间")
+    private Integer time;
+    @ApiModelProperty("数量")
+    private List<String> formDataIds;
+
+}

+ 6 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/entity/Task.java

@@ -182,4 +182,10 @@ public class Task extends BaseEntity {
     @ApiModelProperty("电签状态")
     @TableField(exist = false)
     private Integer eStatus;
+
+    //新增用于过滤的字段
+    @TableField(exist = false)
+    private Boolean isApprovalAble = true;
+
+
 }

+ 10 - 0
blade-service/blade-archive/src/main/java/org/springblade/archive/controller/ArchiveFileController.java

@@ -508,4 +508,14 @@ public class ArchiveFileController extends BladeController {
         FindAndReplaceDto1 dto1 = new FindAndReplaceDto1(dto, archiveFiles);
         return R.status(archiveFileClient.findAndReplace(dto1));
     }
+    @PostMapping("/sumPageTotal")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "统计页数")
+    public R sumPageTotal(@RequestBody List<Integer>list){
+        if(!list.isEmpty()){
+            return R.data(list.stream().mapToInt(Integer::intValue).sum());
+        }else {
+            return R.data(0);
+        }
+    }
 }

+ 65 - 0
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskBatchController.java

@@ -0,0 +1,65 @@
+package org.springblade.business.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springblade.business.dto.TaskBatchMonitorDTO;
+import org.springblade.business.dto.TaskBatchMonitorVo;
+import org.springblade.business.dto.TaskBatchPage;
+import org.springblade.business.service.ITaskBatchService;
+import org.springblade.core.tool.api.R;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author LHB
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/taskBatch")
+@Api(value = "电签相关接口", tags = "电签相关接口")
+public class TaskBatchController {
+
+    @Resource
+    private ITaskBatchService taskBatchService;
+
+    /**
+     * 获取状态统计接口
+     */
+    @PostMapping("/count")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "获取状态统计接口")
+    public R<TaskBatchMonitorVo> count(@RequestBody TaskBatchPage page){
+        return taskBatchService.count(page);
+    }
+
+
+    /**
+     * 电签监控-运行中接口
+     */
+    @PostMapping("/page")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "电签监控-运行中接口")
+    public R<List<TaskBatchMonitorDTO>> selectTaskBatchList(@RequestBody TaskBatchPage page){
+        return taskBatchService.selectTaskBatchList(page);
+    }
+
+    /**
+     * 电签监控-排队中接口
+     */
+    @PostMapping("/pageOrder")
+    @ApiOperationSupport(order = 1)
+    @ApiOperation(value = "电签监控-排队中接口")
+    public R<IPage<TaskBatchMonitorDTO>> pageOrder(@RequestBody TaskBatchPage page){
+        return taskBatchService.pageOrder(page);
+    }
+}

+ 7 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.java

@@ -16,7 +16,11 @@
  */
 package org.springblade.business.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.lettuce.core.dynamic.annotation.Param;
+import org.springblade.business.dto.TaskBatchMonitorDTO;
+import org.springblade.business.dto.TaskBatchPage;
 import org.springblade.business.entity.TaskBatch;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
@@ -36,4 +40,7 @@ public interface TaskBatchMapper extends BaseMapper<TaskBatch> {
 
     List<TaskBatch>  queryDataInfo();
 
+    IPage<TaskBatchMonitorDTO> selectTaskBatchList(Page page, @Param("query") TaskBatchPage query);
+
+    List<TaskBatchMonitorDTO> selectTaskBatchList2(@Param("query") TaskBatchPage query);
 }

+ 110 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TaskBatchMapper.xml

@@ -28,5 +28,115 @@
     <select id="queryDataInfo" resultMap="taskBatchResultMap">
         SELECT a.* from u_task_batch a LIMIT 40
     </select>
+    <select id="selectTaskBatchList" resultType="org.springblade.business.dto.TaskBatchMonitorDTO">
+        SELECT
+            a.formDataId,
+            b.type,
+            d.project_name projectName,
+            c.contract_name contractName,
+            b.NAME taskName,
+            a.nick_name userName,
+            DATE_FORMAT(a.create_time,'%H:%i') createTime,
+            1 signType,
+            b.pdf_url_size pdfUrlSize,
+            CASE
+                WHEN b.pdf_url_size/1024 &lt;= 51200 THEN 30 + ${query.time}  -- 0-50M固定30秒
+                ELSE GREATEST(30, CEIL(b.pdf_url_size/52428800) * 30) + ${query.time}
+            END AS estimated_time_seconds
+        FROM
+            (
+                SELECT
+                    json_data ->> '$.formDataId' formDataId,
+                    GROUP_CONCAT( nick_name ) nick_name,
+                    create_time
+                FROM
+                    u_task_batch a
+                WHERE
+                    sign_type = 1
+                GROUP BY
+                    json_data ->> '$.formDataId'
+                ORDER BY
+                    create_time
+            ) a
+            INNER JOIN u_information_query b ON a.formDataId = b.id
+            INNER JOIN m_contract_info c ON b.contract_id = c.id
+            INNER JOIN m_project_info d ON b.project_id = d.id
+        <where>
+            <if test="query.type != null">
+                AND b.type = #{query.type}
+            </if>
+            <if test="query.projectId != null">
+                AND b.project_id = #{query.projectId}
+            </if>
+            <if test="query.contractId != null">
+                AND b.contract_id = #{query.contractId}
+            </if>
+            <if test="query.taskName != null and query.taskName != ''">
+                AND b.name like concat('%',#{query.taskName},'%')
+            </if>
+            <if test="query.formDataIds != null and query.formDataIds.size() != 0">
+                AND a.formDataId not in
+                <foreach collection="query.formDataIds" item="formDataId" open="(" close=")" separator=",">
+                    #{formDataId}
+                </foreach>
+            </if>
+        </where>
+
+    </select>
+    <select id="selectTaskBatchList2" resultType="org.springblade.business.dto.TaskBatchMonitorDTO">
+        SELECT
+            a.formDataId,
+            b.type,
+            d.project_name projectName,
+            c.contract_name contractName,
+            b.NAME taskName,
+            a.nick_name userName,
+            DATE_FORMAT(a.create_time,'%H:%i') createTime,
+            1 signType,
+            b.pdf_url_size pdfUrlSize,
+            CASE
+                WHEN b.pdf_url_size/1024 &lt;= 51200 THEN 30
+                ELSE GREATEST(30, CEIL(b.pdf_url_size/52428800) * 30)
+            END AS estimated_time_seconds
+        FROM
+            (
+                SELECT
+                    json_data ->> '$.formDataId' formDataId,
+                    GROUP_CONCAT( nick_name ) nick_name,
+                    create_time
+                FROM
+                    u_task_batch a
+                WHERE
+                    sign_type = 1
+                GROUP BY
+                    json_data ->> '$.formDataId'
+                ORDER BY
+                    create_time
+            ) a
+        INNER JOIN u_information_query b ON a.formDataId = b.id
+        INNER JOIN m_contract_info c ON b.contract_id = c.id
+        INNER JOIN m_project_info d ON b.project_id = d.id
+        <where>
+            <if test="type != null">
+                AND b.type = #{type}
+            </if>
+            <if test="projectId != null">
+                AND b.project_id = #{projectId}
+            </if>
+            <if test="contractId != null">
+                AND b.contractId = #{contractId}
+            </if>
+            <if test="taskName != null and taskName != ''">
+                AND b.name like concat('%',#{taskName},'%')
+            </if>
+
+            <if test="formDataIds != null and formDataIds.size() != 0">
+                AND a.formDataId  in
+                <foreach collection="formDataIds" item="formDataId" open="(" close=")" separator=",">
+                    #{formDataId}
+                </foreach>
+            </if>
+        </where>
+    </select>
 
 </mapper>

+ 1 - 0
blade-service/blade-business/src/main/java/org/springblade/business/mapper/TrialCyFinishTestReportMapper.xml

@@ -34,6 +34,7 @@
                 AND reportNo like concat('%',#{query.reportNo},'%')
             </if>
         </where>
+        ORDER BY reportDate DESC ,CAST(SUBSTRING_INDEX(reportNo, '-', -1) AS UNSIGNED) DESC
     </select>
     <select id="selectViewPdfList" resultType="java.lang.String">
         select

+ 11 - 0
blade-service/blade-business/src/main/java/org/springblade/business/service/ITaskBatchService.java

@@ -16,10 +16,16 @@
  */
 package org.springblade.business.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+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.core.mp.base.BaseService;
+import org.springblade.core.tool.api.R;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * 服务类
@@ -36,4 +42,9 @@ public interface ITaskBatchService extends BaseService<TaskBatch> {
 
     List<TaskBatch> queryDataInfo();
 
+    R<List<TaskBatchMonitorDTO>> selectTaskBatchList(TaskBatchPage page);
+
+    R<TaskBatchMonitorVo> count(TaskBatchPage page);
+
+    R<IPage<TaskBatchMonitorDTO>> pageOrder(TaskBatchPage page);
 }

+ 196 - 1
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskBatchServiceImpl.java

@@ -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;
+        }
+    }
 }

+ 42 - 0
blade-service/blade-business/src/main/java/org/springblade/business/utils/TimeConverter.java

@@ -0,0 +1,42 @@
+package org.springblade.business.utils;
+
+public class TimeConverter {
+
+    /**
+     * 将秒数转换为 "X分Y秒" 格式
+     * @param seconds 秒数
+     * @return 格式化的时间字符串
+     */
+    public static String secondsToMinutesSeconds(int seconds) {
+        if (seconds < 0) {
+            throw new IllegalArgumentException("秒数不能为负数: " + seconds);
+        }
+
+        int minutes = seconds / 60;
+        int remainingSeconds = seconds % 60;
+
+        if (minutes == 0) {
+            return remainingSeconds + "秒";
+        } else if (remainingSeconds == 0) {
+            return minutes + "分";
+        } else {
+            return minutes + "分" + remainingSeconds + "秒";
+        }
+    }
+
+    /**
+     * 将秒数转换为 "XX:XX" 格式(分钟:秒)
+     * @param seconds 秒数
+     * @return 格式化的时间字符串
+     */
+    public static String secondsToMinutesSecondsColon(int seconds) {
+        if (seconds < 0) {
+            throw new IllegalArgumentException("秒数不能为负数: " + seconds);
+        }
+
+        int minutes = seconds / 60;
+        int remainingSeconds = seconds % 60;
+
+        return String.format("%d:%02d", minutes, remainingSeconds);
+    }
+}

+ 2 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/controller/EVController.java

@@ -1,5 +1,6 @@
 package org.springblade.evisa.controller;
 
+import cn.hutool.core.date.DateTime;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import io.swagger.annotations.Api;
@@ -100,7 +101,7 @@ public class EVController {
                         }
 
                         if(!aBoolean){
-                            RedisTemplate.opsForValue().set("sign-" + dataInfo.getFormDataId(), "1", 7200, TimeUnit.SECONDS);
+                            RedisTemplate.opsForValue().set("sign-" + dataInfo.getFormDataId(), DateTime.now().toString(), 7200, TimeUnit.SECONDS);
                             CompletableFuture<Void> runAsync = CompletableFuture.runAsync(() -> {
                                 try {
                                     /*===============执行批量任务===============*/

+ 1 - 1
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVDataServiceImpl.java

@@ -378,7 +378,7 @@ public class EVDataServiceImpl implements EVDataService {
                         // 添加签字
                         String addSqlBatch = "insert into u_task_batch(id,task_parallel_id,json_data,create_user,create_dept,create_time,update_user,update_time,status,is_deleted,nick_name,sign_format,sign_type) \n" +
                                 " SELECT a.id,a.process_instance_id,json_object('approvalFileList',json_array(),'approvalType',b.approval_type,'comment','','flag','OK','formDataId',b.form_data_id,'parallelProcessInstanceId',a.parallel_process_instance_id,'pass',true,'taskId',b.id) as  json_data,a.task_user,a.create_dept,a.create_time,a.update_user,a.update_time,1 as status,0 as is_deleted,a.task_user_name as nick_name ,1 as sign_format,1 as sign_type from u_task_parallel a,u_task b where b.`status` in(1,2) and  a.process_instance_id=b.process_instance_id \n" +
-                                " and b.id="+taskApp.getTaskId()+" and a.parallel_process_instance_id not in(SELECT JSON_EXTRACT(c.json_data, '$.parallelProcessInstanceId') from u_task_batch c)";
+                                " and b.id="+taskApp.getTaskId()+" and a.parallel_process_instance_id not in(SELECT JSON_EXTRACT(c.json_data, '$.parallelProcessInstanceId') from u_task_batch c where sign_type=1)";
                         jdbcTemplate.execute(addSqlBatch);
                     }
                     updateSql = "update s_interim_pay_certificate set approve_status=" + taskApp.getSigType() + ",update_time=SYSDATE(), raw_url='" + taskApp.getLastFilePdfUrl() + "' where contract_period_id = " + taskApp.getFormDataId();

+ 14 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -1840,7 +1840,20 @@ public class ExcelTabController extends BladeController {
                 .eq(WbsTreeContract::getPKeyId, pkeyId));
         return R.data(wbsTreeContract.getPdfUrl());
     }
-
+    @GetMapping("/cope-buss-tab-list")
+    @ApiOperationSupport(order = 19)
+    @ApiOperation(value = "表单批量复制", notes = "表单批量复制")
+    @Transactional
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(name = "pkeyId", value = "pkeyId", required = true),
+            @ApiImplicitParam(name = "size", value = "size", required = true)
+    })
+    public R copeBussTab(Long pkeyId,Integer size) {
+        for (Integer i = 0; i < size; i++) {
+            copeBussTab(pkeyId);
+        }
+        return R.success("成功");
+    }
 
     @GetMapping("/cope-buss-tab")
     @ApiOperationSupport(order = 19)

+ 1 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/WbsTreeSynchronousRecordController.java

@@ -169,6 +169,7 @@ public class WbsTreeSynchronousRecordController {
                 .eq(WbsTreeSynchronousRecord::getProjectId, projectId)
                 .eq(WbsTreeSynchronousRecord::getIsDeleted, 0)
                 .ne(WbsTreeSynchronousRecord::getStatus, 2)
+                .orderByDesc(WbsTreeSynchronousRecord::getCreateTime)
         );
         List<WbsTreeSynchronousRecordDTO> wbsTreeSynchronousRecordDTOS = BeanUtil.copyProperties(list, WbsTreeSynchronousRecordDTO.class);
         wbsTreeSynchronousRecordDTOS.forEach(m -> {

+ 7 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ContractInfoServiceImpl.java

@@ -1251,6 +1251,13 @@ public class ContractInfoServiceImpl extends BaseServiceImpl<ContractInfoMapper,
     @Override
     public ContractInfoVO2 selectByCondition(ContractInfo contractInfo) {
         ContractInfo contractInfo1 = baseMapper.selectById(contractInfo.getId());
+        if(contractInfo1!=null&&StringUtils.isEmpty(contractInfo1.getProjectPlace())){
+            //查询area表里面的数据
+            ProjectContractArea projectContractArea = projectContractAreaMapper.selectOne(Wrappers.<ProjectContractArea>query().lambda().eq(ProjectContractArea::getContractId, contractInfo1.getId()).last("LIMIT 1"));
+            if(projectContractArea!=null){
+                contractInfo1.setProjectPlace(projectContractArea.getProvince()+projectContractArea.getCity()+projectContractArea.getCounty());
+            }
+        }
         ContractInfoVO2 contractInfoVO2 = new ContractInfoVO2();
         contractInfoVO2.setContractInfo(contractInfo1);
         Integer contractType = contractInfo1.getContractType();

+ 2 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -3022,7 +3022,8 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     contractId = wbsTreeContract.getContractId();
                 }
             }
-            String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "' , sort = " + sort + ",e_visa_pdf_url = null" + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
+            Long pdfSize = CommonUtil.getResourceLength(bladeFile.getLink());
+            String sql = "update u_information_query set pdf_url ='" + bladeFile.getLink() + "',pdf_url_size = " + pdfSize + " , sort = " + sort + ",e_visa_pdf_url = null" + " where classify='" + classify + "' and  wbs_id='" + nodeId + "' and contract_id ='" + contractId + "' ";
             System.out.println(sql);
             jdbcTemplate.execute(sql);
         }

File diff suppressed because it is too large
+ 778 - 211
blade-service/blade-meter/src/main/java/org/springblade/meter/controller/TaskController.java


Some files were not shown because too many files changed in this diff