Эх сурвалжийг харах

Merge remote-tracking branch 'origin/dev' into dev

LHB 1 сар өмнө
parent
commit
2ca42c9b98

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

@@ -16,6 +16,7 @@
  */
 package org.springblade.business.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 
 import java.io.Serializable;
@@ -178,4 +179,7 @@ public class Task extends BaseEntity {
     @ApiModelProperty("计量任务是否生成审计意见单 1是0否")
     private Integer isBuildAudit;
 
+    @ApiModelProperty("电签状态")
+    @TableField(exist = false)
+    private Integer eStatus;
 }

+ 3 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/BusinessTaskPageVO.java

@@ -58,4 +58,7 @@ public class BusinessTaskPageVO implements Serializable {
     @ApiModelProperty(value = "签字人员集合")
     private List<TaskParallel> taskApproveUserNamesList;
 
+    @ApiModelProperty("电签状态,用来判断是否同意过")
+    private Integer eStatus;
+
 }

+ 16 - 1
blade-service-api/blade-manager-api/src/main/java/org/springblade/manager/entity/ProjectInfo.java

@@ -215,5 +215,20 @@ public class ProjectInfo extends BaseEntity {
      *
      */
     @ApiModelProperty(value = "短信时间")
-    private int msTime;
+    private Double msTime;
+    /**
+     * 项目状态
+     */
+    @ApiModelProperty(value = "项目状态, 0:未开始, 1:配置中, 2: 进行中, 3: 已完成")
+    private Integer projectStatus;
+    /**
+     * 项目排序
+     */
+    @ApiModelProperty(value = "项目排序")
+    private Integer sort;
+    /**
+     * 项目负责人
+     */
+    @ApiModelProperty(value = "项目负责人")
+    private Long projectLeader;
 }

+ 3 - 3
blade-service/blade-archive/src/main/java/org/springblade/archive/service/impl/ArchiveAutoPdfServiceImpl.java

@@ -364,9 +364,9 @@ public class ArchiveAutoPdfServiceImpl implements IArchiveAutoPdfService {
         }
 
         //声影的要不要打码
-        if (archivesAuto.isMedia()) {
-            return;
-        }
+//        if (archivesAuto.isMedia()) {
+//            return;
+//        }
 
         List<String> urls = new ArrayList<>();
         for (ArchiveFile f : waitArchiveFiles) {

+ 12 - 1
blade-service/blade-archive/src/main/java/org/springblade/archive/utils/FileUtils.java

@@ -581,7 +581,18 @@ public class FileUtils {
                                     pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(180)); // 顺时针旋转270°
                                     //横表旋转后打页码坐标不一样
                                     over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
-                                }else {
+                                }else if (rotate!= null && rotate.intValue() == 90) {
+                                    //交换width和height
+                                    pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(0)); // 顺时针旋转270°
+                                    //横表旋转后打页码坐标不一样
+                                    over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
+                                }else if (rotate!= null && rotate.intValue() == -90) {
+                                    //交换width和height
+                                    pdfReader.getPageN(index).put(PdfName.ROTATE, new PdfNumber(180)); // 顺时针旋转270°
+                                    //横表旋转后打页码坐标不一样
+                                    over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
+                                }
+                                else {
                                     over.showTextAligned(Element.ALIGN_LEFT, pageNumber, width - 35, 20, 0);
                                 }
                             }

+ 11 - 1
blade-service/blade-business/src/main/java/org/springblade/business/controller/InformationWriteQueryController.java

@@ -1445,6 +1445,7 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
                  /*   result.forEach(query -> urls.add(
                             StringUtils.isNotEmpty(query.getNodePdfUrl()) ? query.getNodePdfUrl() + "@@@" + query.getName() + "-" + query.getId() : query.getPdfUrl() + "@@@" + query.getName() + "-" + query.getId()));
                    */
+                Map<String, Integer> nameMap = new HashMap<>();
                 for (int i=0;i<result.size();i++) {
                     String url_link = "";
                     List<TaskApprovalVO.ApprovalFile> files = jdbcTemplate.query("select name as fileName,domain_url as fileUrl from m_table_file where is_deleted = 0 and type in(10,11,12)and tab_id = ?", new BeanPropertyRowMapper<>(TaskApprovalVO.ApprovalFile.class), result.get(i).getWbsId());
@@ -1472,7 +1473,16 @@ public R<String> batchDownloadFileToZip(String ids, HttpServletResponse response
                     } else if (url != null && url.size() == 1) {
                         url_link = url.get(0);
                     }
-                    urls.add(url_link + "@@@" + result.get(i).getName() + "-" + result.get(i).getId());
+                    String fileName = result.get(i).getName();
+                    fileName = fileName == null ? "找不到文件题目" : fileName.replaceAll("\\\\", "_").replaceAll("/", "_");
+                    if (nameMap.containsKey(fileName)) {
+                        int num = nameMap.get(fileName) == null ? 1 : nameMap.get(fileName);
+                        nameMap.put(fileName, num + 1);
+                        fileName = fileName + "_" + num;
+                    } else {
+                        nameMap.put(fileName, 1);
+                    }
+                    urls.add(url_link + "@@@" + fileName);
                 }
 
                 //删除空数据

+ 16 - 7
blade-service/blade-business/src/main/java/org/springblade/business/controller/TaskController.java

@@ -123,12 +123,12 @@ public class TaskController extends BladeController {
         if (config != null) {
             if(projectId!=null && !projectId.equals("") && Func.isNotEmpty(projectId)){
                 ProjectInfo projectInfo = projectClient.getById(projectId);
-                addTime = projectInfo.getMsTime();
+                addTime = projectInfo.getMsTime() == null ? 60 : (int)(projectInfo.getMsTime() * 60);
             }
             //获取当前时间
             Date now = DateUtil.now();
             // 16 改为 1小时后超时
-            now = DateUtil.plusHours(now, addTime);
+            now = DateUtil.plusMinutes(now, addTime);
 
             LambdaUpdateWrapper<DefaultConfig> wrapper = new LambdaUpdateWrapper<>();
             wrapper.set(DefaultConfig::getSmsTimeOut, DateUtil.format(now, "yyyy-MM-dd HH:mm:ss"));
@@ -1303,7 +1303,8 @@ public class TaskController extends BladeController {
         int size = dto.getSize();
         //封装入参SQL
         List<Object> params = new ArrayList<>();
-        StringBuilder sqlString = new StringBuilder("SELECT * FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in(1,3,4,8,9,10)");
+        String sqlResult = "SELECT * ";
+        StringBuilder sqlString = new StringBuilder(" FROM u_task WHERE 1=1 AND is_deleted = 0 AND approval_type in(1,3,4,8,9,10)");
         if (ObjectUtil.isNotEmpty(dto.getTypeValue())) {
             sqlString.append(" AND type = ?");
             params.add(dto.getTypeValue());
@@ -1379,7 +1380,8 @@ public class TaskController extends BladeController {
                     sqlString.append("EXISTS (SELECT 1 FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.status = ? AND u_task_parallel.task_user = ?)");
                     params.add(1);
                     params.add(SecureUtil.getUserId());
-
+                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
+                            "AND u_task_parallel.task_user = " + SecureUtil.getUserId() + " and is_deleted = 0 order by id desc limit 1) as e_status";
                     //如果是待办页面,且 任务状态下拉框 选择的不是 待审批状态 的任务,那么直接返回null
                 } else if (ObjectUtil.isNotEmpty(dto.getStatusValue()) && !dto.getStatusValue().equals(1)) {
                     return null;
@@ -1390,6 +1392,8 @@ public class TaskController extends BladeController {
                     params.add(1);
                     params.add(SecureUtil.getUserId());
                     sqlString.append(" AND status = 1");
+                    sqlResult = "SELECT *, (SELECT ifnull(e_visa_status, -1)  FROM u_task_parallel WHERE u_task.process_instance_id = u_task_parallel.process_instance_id AND u_task_parallel.STATUS = 1 " +
+                            "AND u_task_parallel.task_user = " + SecureUtil.getUserId() + " and is_deleted = 0 order by id desc limit 1) as e_status";
                 }
 
             } else if (dto.getSelectedType().equals(2)) { //已办页面
@@ -1407,7 +1411,7 @@ public class TaskController extends BladeController {
 //        sqlString.append(" AND (SELECT COUNT(1)  FROM u_information_query WHERE u_task.form_data_id = id and is_deleted=0) > 0");
 
         //总数量
-        String sqlCount = sqlString.toString().replace("*", "count(1)");
+        String sqlCount = "select count(1) " +  sqlString;
         Optional<Integer> totalCountOptional = Optional.ofNullable(jdbcTemplate.queryForObject(sqlCount, Integer.class, params.toArray()));
         int totalCount = totalCountOptional.orElse(0);
 
@@ -1423,13 +1427,17 @@ public class TaskController extends BladeController {
             }
         } else {
             //Web端默认倒叙
-            sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+            if (!sqlResult.equals("SELECT * ")) {
+                sqlString.append(" ORDER BY e_status asc, create_time DESC LIMIT ? OFFSET ?");
+            } else {
+                sqlString.append(" ORDER BY create_time DESC LIMIT ? OFFSET ?");
+            }
         }
         params.add(size);
         params.add((current - 1) * size);
 
         //执行SQL获取数据
-        String sqlPage = sqlString.toString();
+        String sqlPage = sqlResult + sqlString;
         List<Task> resultList = jdbcTemplate.query(
                 sqlPage,
                 new BeanPropertyRowMapper<>(Task.class),
@@ -1467,6 +1475,7 @@ public class TaskController extends BladeController {
                     vo.setApprovalType(task.getApprovalType());
                     vo.setFormDataId(task.getFormDataId());
                     vo.setProcessInstanceId(task.getProcessInstanceId());
+                    vo.setEStatus(task.getEStatus());
                     List<TaskParallel> taskParallelList = finalTaskParallelGroupMap.get(task.getProcessInstanceId());
                     if (taskParallelList != null && taskParallelList.size() > 0) {
                         //如果是垂直签,且是待办页面,判断是否是当前用户审批轮次,不是当前用户审批轮次就不显示该任务

+ 15 - 5
blade-service/blade-business/src/main/java/org/springblade/business/service/impl/TaskServiceImpl.java

@@ -39,6 +39,7 @@ import org.springblade.core.tool.utils.Func;
 import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.core.tool.utils.ResourceUtil;
 import org.springblade.evisa.feign.EVisaClient;
+import org.springblade.evisa.redissionUtil.DistributedRedisLock;
 import org.springblade.evisa.vo.EVisaTaskApprovalVO;
 import org.springblade.flow.core.constant.ProcessConstant;
 import org.springblade.flow.core.feign.IFlowClient;
@@ -1566,11 +1567,20 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
             //这里发起的默认为普通流程
             task.setType(1);
             task.setStatus(1);
-            //保存附表信息
-            this.taskParallelService.saveBatch(taskParallelArray);
-
-            //保存主表数据
-            this.save(task);
+            try {
+                if (DistributedRedisLock.acquire("TaskService_StartApproval_" + task.getFormDataId(), 20)) {
+                    long count = this.count(Wrappers.<Task>lambdaQuery().eq(Task::getFormDataId, task.getFormDataId()).ne(Task::getStatus, 3));
+                    if (count > 0) {
+                        return false;
+                    }
+                    //保存附表信息
+                    this.taskParallelService.saveBatch(taskParallelArray);
+                    //保存主表数据
+                    this.save(task);
+                }
+            } finally {
+                DistributedRedisLock.release("TaskService_StartApproval_" + task.getFormDataId());
+            }
         }
         return true;
     }

+ 42 - 0
blade-service/blade-manager/src/main/java/org/springblade/manager/controller/ExcelTabController.java

@@ -2007,6 +2007,48 @@ public class ExcelTabController extends BladeController {
         return pdfUrl;
     }
 
+    @GetMapping("/downBussPdf")
+    @ApiOperationSupport(order = 32)
+    @ApiOperation(value = "下载pdf数据")
+    @ApiImplicitParam(name = "id", value = "fileId")
+    public void downBussPdf(String id,HttpServletResponse response) throws Exception {
+        if (id == null || id.trim().isEmpty()) {
+            throw new ServiceException("暂无PDF数据");
+        }
+        //获取节点下的所有表单,和附件,如果表单全是隐藏的,并且没有附件,则提示暂无数据
+        String sql = "select name,pdf_url,e_visa_pdf_url,node_pdf_url from u_information_query where id = " +  id;
+        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
+        if (maps.isEmpty()) {
+            throw new ServiceException("暂无PDF数据");
+        } else  {
+            Map<String, Object> stringObjectMap = maps.get(0);
+            String pdfUrl = stringObjectMap.get("pdf_url") == null ? "" : stringObjectMap.get("pdf_url") + "";
+            String fileName = stringObjectMap.get("name") == null ? "找不到文件题名" : stringObjectMap.get("name") + "";
+            if (Func.isNotEmpty(stringObjectMap.get("node_pdf_url"))) {
+                pdfUrl = stringObjectMap.get("node_pdf_url") == null ? "" : stringObjectMap.get("node_pdf_url") + "";
+            } else if (Func.isNotEmpty(stringObjectMap.get("e_visa_pdf_url"))) {
+                //优先使用电签的pdf
+                pdfUrl = stringObjectMap.get("e_visa_pdf_url") == null ? "" : stringObjectMap.get("e_visa_pdf_url") + "";
+            }
+            if (pdfUrl.isEmpty()) {
+                throw new ServiceException("暂无PDF数据");
+            }
+//            fileName = URLEncoder.encode(fileName, Charsets.UTF_8.name());
+            InputStream redio = CommonUtil.getOSSInputStream(pdfUrl);
+            byte[] buffer = IoUtil.readToByteArray(redio);
+            OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
+            response.setContentType("application/pdf");
+            response.setCharacterEncoding("UTF-8");
+            fileName = fileName.replaceAll("/", "_");
+            String encode = URLEncoder.encode(fileName, "UTF-8");
+            encode = encode.replaceAll( "%2B", "+");
+            response.setHeader("Content-disposition", "attachment;filename=" + encode + ".pdf");
+            toClient.write(buffer);
+            toClient.flush();
+            toClient.close();
+        }
+    }
+
 
     /**
      * 用户端删除复制信息表

+ 22 - 20
blade-service/blade-manager/src/main/java/org/springblade/manager/service/impl/ExcelTabServiceImpl.java

@@ -1797,11 +1797,7 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         /*获取参数库数据*/
         Map<String, Object> nodeBaseInfo = nodeBaseInfoService.getAllNodeBaseInfoByPkeyId(pkeyId, nodeId);
         if(nodeBaseInfo!=null){
-            for (Map.Entry<String, Object> entry : nodeBaseInfo.entrySet()) {
-                if (reData.get(entry.getKey()) == null || reData.get(entry.getKey()).toString().isEmpty()) {
-                    reData.put(entry.getKey(), entry.getValue());
-                }
-            }
+            reData.putAll(nodeBaseInfo);
         }
 //        if(reData.size()>0){
 //            //处理key重复导致pdf数据错位
@@ -2838,6 +2834,9 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
         //实体数据
         String querySql = "select * from " + wbsTreePrivate.getInitTableName() + " where p_key_id=" + pkeyId + " and group_id = " + groupId;
         List<Map<String, Object>> dataIn = jdbcTemplate.queryForList(querySql);
+
+
+
         String keyNames="";
         //匹配关联
         try {
@@ -2854,6 +2853,20 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
             htmlString = htmlString.replaceAll("placeholder", "placeholderxx");
             htmlString = htmlString.replaceAll("title", "titlexx");
             Document doc = Jsoup.parse(htmlString);
+
+
+            // 获取默认值
+            Elements elements = doc.getElementsByAttribute("defText");
+            if(Func.isNotEmpty(elements) && elements.size()>=1){
+                for(Element eleme: elements){
+                    String id = Func.isNull(eleme.attr("id"))?eleme.attr("keyname"):eleme.attr("id");
+                    if(Func.isNotEmpty(id)){
+
+                        reData.put(id, eleme.attr("defText"));
+                    }
+                }
+            }
+
             keyNames= getKeyNameList(doc);
             TrialSelfInspectionRecord record = jdbcTemplate.query("select * from u_trial_self_inspection_record where id = " + groupId, new BeanPropertyRowMapper<>(TrialSelfInspectionRecord.class)).stream().findAny().orElse(null);
             // 优先使用试验记录中的委托单和样品
@@ -3150,25 +3163,14 @@ public class ExcelTabServiceImpl extends BaseServiceImpl<ExcelTabMapper, ExcelTa
                     }
                 }
             }
+
+
         } catch (Exception e) {
             e.printStackTrace();
         }
 
-        // 获取默认值
-        QueryWrapper<TextdictInfo> queryWrapper = new QueryWrapper<>();
-        queryWrapper.select("col_key", "sig_role_name");
-        queryWrapper.eq("type", 4);
-        queryWrapper.eq("tab_id", wbsTreePrivate.getPKeyId());
-        final List<TextdictInfo> textDictInfos = textdictInfoService.getBaseMapper().selectList(queryWrapper);
-        if (!textDictInfos.isEmpty()) {
-            for (TextdictInfo textdictInfo : textDictInfos) {
-                if (reData.containsKey(textdictInfo.getColKey())) {
-                    String keyVal = reData.get(textdictInfo.getColKey()) + "";
-                } else {
-                    reData.put(textdictInfo.getColKey() + "", textdictInfo.getSigRoleName());
-                }
-            }
-        }
+
+
 
         // 移除Id 和 p_key_id
         reData.remove("id");