huangjn %!s(int64=2) %!d(string=hai) anos
pai
achega
45869ca2ba

+ 7 - 0
blade-service-api/blade-business-api/src/main/java/org/springblade/business/feign/TaskClient.java

@@ -28,6 +28,13 @@ public interface TaskClient {
     String QUERY_BUSINESS_DATA_TASK = API_PREFIX + "/query-business-data-task";
     String QUERY_APPROVAL_USER = API_PREFIX + "/query-approval-user";
     String QUERY_BUSINESS_TABLE_E_VISA_CONFIG = API_PREFIX + "/query-business-table-e-visa-config";
+    String QUERY_TASK_CONTRACT_ID = API_PREFIX + "/query-task-contract-id";
+
+    /**
+     * 获取当前任务所在的合同段
+     */
+    @PostMapping(QUERY_TASK_CONTRACT_ID)
+    String queryTaskContractId(@RequestParam String taskId);
 
     /**
      * 获取当前任务绑定的表格

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/StartTaskVO.java

@@ -62,7 +62,7 @@ public class StartTaskVO {
     }
 
     @Data
-    public class CustomUserTask {
+    public static class CustomUserTask {
         private String userId;
         private String userName;
 

+ 1 - 1
blade-service-api/blade-business-api/src/main/java/org/springblade/business/vo/TaskVO.java

@@ -71,7 +71,7 @@ public class TaskVO extends Task {
 	}
 
 	@Data
-	public class CustomUserTask {
+	public static class CustomUserTask {
 		private String userId;
 		private String userName;
 

+ 2 - 2
blade-service/blade-business/src/main/java/org/springblade/business/controller/EVisaTaskCheckController.java

@@ -78,13 +78,13 @@ public class EVisaTaskCheckController {
             //获取这些审批人在当前合同段的权限
             List<JSONObject> userRoleList = this.saveUserInfoByProjectClient.queryUserContractRole(customFlowUserList, json.getString("contractId"));
             if(userRoleList == null || userRoleList.size() <= 0){
-                return R.data(300, null, "所选审批人均未找到对应权限,请联系服务人员处理");
+                return R.data(300, false, "所选审批人均未找到对应权限,请联系服务人员处理");
             }
 
             //获取电签配置
             List<JSONObject> jsonList = this.queryTableEVisaConfig(json);
             if(jsonList == null){
-                return R.data(300, null, "未找到符合电签配置的相关流程,请联系服务人员处理");
+                return R.data(300, false, "未找到符合电签配置的相关流程,请联系服务人员处理");
             }
 
             //汇总电签配置的审批角色

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

@@ -465,6 +465,7 @@ public class InformationWriteQueryController extends BladeController {
 	public R<Boolean> taskOne(@RequestBody StartTaskVO startTaskVO){
 		//此时的ids是当前节点的primaryKeyId但并不是业务数据ID,需要根据ids和classify去查询具体的业务ID
 		InformationQuery businessData = this.informationQueryService.getOne(Wrappers.<InformationQuery>lambdaQuery().eq(InformationQuery::getWbsId, startTaskVO.getIds().replaceAll(",", "")).eq(InformationQuery::getClassify, startTaskVO.getClassify().toString()));
+
 		//处理上报信息
 		if(businessData != null){
 			//设置业务数据ID

+ 29 - 10
blade-service/blade-business/src/main/java/org/springblade/business/feignClient/TaskClientImpl.java

@@ -29,8 +29,35 @@ public class TaskClientImpl implements TaskClient {
 
     private final ITaskParallelService taskParallelService;
 
+    @Override
+    public String queryTaskContractId(String taskId) {
+        //找到任务
+        Task task = this.queryTask(taskId);
+        if(task != null){
+            return task.getContractId();
+        }
+        return null;
+    }
+
     @Override
     public List<JSONObject> queryBusinessTableEVisaConfig(String taskId, String isFinal) {
+        //找到任务
+        Task task = this.queryTask(taskId);
+        if(task != null){
+            //存在任务,根据formDataId查询
+            List<String> privatePrimaryKeyIds = this.informationQueryService.queryBusinessTableData(task.getFormDataId());
+            if(privatePrimaryKeyIds != null && privatePrimaryKeyIds.size() > 0){
+                //查询这些表格的电签配置
+                return this.eVisaConfigClient.queryEVisaConfigByTableIds(privatePrimaryKeyIds, task.getContractId(), isFinal);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取对应任务
+     */
+    private Task queryTask(String taskId){
         //获取任务
         Task task = this.taskService.getById(taskId);
         if(task == null || StringUtils.isEmpty(task.getFormDataId())){
@@ -45,18 +72,10 @@ public class TaskClientImpl implements TaskClient {
                     return null;
                 }
             } else {
-                //未找到任务,直接返回
-                return null;
+                return task;
             }
         }
-        //存在任务,根据formDataId查询
-        List<String> privatePrimaryKeyIds = this.informationQueryService.queryBusinessTableData(task.getFormDataId());
-        if(privatePrimaryKeyIds != null && privatePrimaryKeyIds.size() > 0){
-            //查询这些表格的电签配置
-            return this.eVisaConfigClient.queryEVisaConfigByTableIds(privatePrimaryKeyIds, task.getContractId(), isFinal);
-        }
-
-        return null;
+        return task;
     }
 
     @Override

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

@@ -79,8 +79,6 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
 
     private final ContractClient contractClient;
 
-    private final Integer FOREACH_MAX = 10;
-
     @Override
     public List<TaskParallel> queryApprovalUser(String formDataIds) {
         //返回结果
@@ -130,7 +128,7 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                  }
              } else {
                 try{
-                    if(foreachNumber < FOREACH_MAX){
+                    if(foreachNumber < 10){
                         //如果存在锁,则等待解锁
                         TimeUnit.MILLISECONDS.sleep(5);
                         foreachNumber ++;
@@ -327,8 +325,14 @@ public class TaskServiceImpl extends BaseServiceImpl<TaskMapper, Task> implement
                     if(eVisaStatus.contains("@@@@")){
                         finalPdfUrl = eVisaStatus.split("@@@@")[1];
                     }
-                    //执行合同章,返回的是盖有合同章的PDF路径
-//                    finalPdfUrl = this.eVisaClient.eVisaContractSeal(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class), finalPdfUrl);
+                    //todo ===================== 执行合同章
+                    try{
+                        //执行合同章,返回的是盖有合同章的PDF路径
+                        finalPdfUrl = this.eVisaClient.eVisaContractSeal(JSONObject.parseObject(JSONObject.toJSONString(taskApprovalVO), EVisaTaskApprovalVO.class), finalPdfUrl);
+                    }catch (Exception e){
+                        e.printStackTrace();
+                    }
+                    //todo ===================== 执行合同章
 
                     //根据主表的业务ID(processInstanceId)获取主流程的taskId
                     String masterTaskId = this.newFlowClient.queryTaskIdByProcessInstanceId(masterTask.getProcessInstanceId());

+ 102 - 34
blade-service/blade-e-visa/src/main/java/org/springblade/evisa/service/impl/EVisaServiceImpl.java

@@ -198,6 +198,83 @@ public class EVisaServiceImpl implements EVisaService {
 
     @Override
     public String eVisaContractSeal(EVisaTaskApprovalVO task, String finalPdfUrl) {
+        //获取任务对应表格的电签配置
+        List<JSONObject> eVisaConfigList = this.taskClient.queryBusinessTableEVisaConfig(task.getParallelProcessInstanceId(), "true");
+        if(eVisaConfigList == null || eVisaConfigList.size() == 0){
+            //没有电签配置,默认当前任务为不签字审批,返回成功
+            return finalPdfUrl;
+        }
+
+        String sysBatch = ParamCache.getValue(CommonConstant.SYS_USER_TASK_BATCH);
+        int batch = 2;
+        if(CommonUtil.checkIsBigDecimal(sysBatch)){
+            batch = new Integer(sysBatch);
+        }
+
+        //确定合同段并获取合同章
+        List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId("", this.taskClient.queryTaskContractId(task.getParallelProcessInstanceId()));
+        if(userPfxList == null || userPfxList.size() <= 0){
+            //没有签章,不执行电签
+            return finalPdfUrl;
+        }
+
+        //上锁
+        if(DistributedRedisLock.acquire(AuthUtil.getUserId().toString(), batch)){
+            try{
+                //准备签章策略
+                List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
+                for(JSONObject eVisaConfig : eVisaConfigList){
+                    //找到类型与之对应的合同章
+                    Iterator<SignPfxFile> iterator = userPfxList.iterator();
+                    while (iterator.hasNext()){
+                        SignPfxFile next = iterator.next();
+                        if(eVisaConfig.getString("type").equals(next.getPfxType())){
+                            //设置签章策略
+                            SealStrategyVO vo = new SealStrategyVO();
+                            vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + next.getCertificatePassword());
+                            vo.setSealPassword(next.getCertificatePassword());
+                            vo.setSealPerson(next.getCertificateUserName() + System.currentTimeMillis());
+                            //设置签字文件
+                            vo.setImageUrl(next.getSignatureFileUrl());
+                            vo.setSealType("3");
+
+                            vo.setCompanySeal(true);
+
+                            vo.setKeyword(eVisaConfig.getString("KEY"));
+                            vo.setOffSetX(eVisaConfig.getString("X"));
+                            vo.setOffSetY(eVisaConfig.getString("Y"));
+
+                            sealStrategyVOS.add(vo);
+                            iterator.remove();
+                            break;
+                        }
+                    }
+                }
+
+                SealPdfVO pdfVO = new SealPdfVO();
+                pdfVO.setStrategyVoList(sealStrategyVOS);
+
+                //获取字节
+                byte[] fileByte = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(finalPdfUrl));
+                //执行电签
+                Object[] result = this.signPdf(pdfVO, fileByte);
+                if(result != null){
+                    if(result[0] != null){
+                        MultipartFile newFiles = new MockMultipartFile("file", SnowFlakeUtil.getId() + ".pdf", "text/plain", IOUtils.toByteArray(new ByteArrayInputStream((byte[])result[0])));
+                        //重新上传
+                        BladeFile bladeFile = this.newIOSSClient.uploadFileByInputStream(newFiles);
+                        if(bladeFile != null){
+                            finalPdfUrl = bladeFile.getLink();
+                        }
+                    }
+                }
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        }
+        //释放锁
+        DistributedRedisLock.release(AuthUtil.getUserId().toString());
+
         return finalPdfUrl;
     }
 
@@ -226,7 +303,7 @@ public class EVisaServiceImpl implements EVisaService {
             return SUCCESS + "@@@@" + taskFile.getApprovalFileList().get(0).getFileUrl();
         }
 
-        //首先获取当前用户的证书信息
+        //获取当前用户的证书信息
         List<SignPfxFile> userPfxList = this.signPfxClient.querySignPfxByUserIdOrContractId(AuthUtil.getUserId().toString(), "");
         if(userPfxList == null || userPfxList.size() <= 0){
             //没有签章,不执行电签
@@ -241,32 +318,23 @@ public class EVisaServiceImpl implements EVisaService {
                 List<TaskApprovalVO.ApprovalFile> files = taskFile.getApprovalFileList();
                 //这里的文件只会是一张拼接好的PDF
                 for(TaskApprovalVO.ApprovalFile file : files){
-                    //获取PDF文件
-//                    PDDocument document = PDDocument.load(CommonUtil.getOSSInputStream(file.getFileUrl()));
-//                    int page = document.getPages().getCount();
-
                     //准备签章策略
                     List<SealStrategyVO> sealStrategyVOS = new ArrayList<>();
-//                    for(int i = 0; i <page; i ++){
-                        for(JSONObject eVisaConfig : eVisaConfigList){
-                            //设置签章策略
-                            SealStrategyVO vo = new SealStrategyVO();
-                            vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + AuthUtil.getUserId());
-                            vo.setSealPassword(AuthUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
-                            vo.setSealPerson(AuthUtil.getNickName());
-                            //设置签字文件
-                            vo.setImageUrl(userPfxList.get(0).getSignatureFileUrl());
-                            vo.setSealType("3");
-
-                            vo.setKeyword(eVisaConfig.getString("KEY"));
-                            vo.setLx(eVisaConfig.getString("X"));
-                            vo.setLy(eVisaConfig.getString("Y"));
-
-                            //设置页
-//                            vo.setPage(( i + 1) + "");
-                            sealStrategyVOS.add(vo);
-                        }
-//                    }
+                    for (JSONObject eVisaConfig : eVisaConfigList) {
+                        //设置签章策略
+                        SealStrategyVO vo = new SealStrategyVO();
+                        vo.setSealCode(EVisaConstant.SIGN_SEAL_CODE + AuthUtil.getUserId());
+                        vo.setSealPassword(AuthUtil.getUserId().toString().substring(0, EVisaConstant.USER_ID_SUB));
+                        vo.setSealPerson(AuthUtil.getNickName());
+                        //设置签字文件
+                        vo.setImageUrl(userPfxList.get(0).getSignatureFileUrl());
+                        vo.setSealType("3");
+
+                        vo.setKeyword(eVisaConfig.getString("KEY"));
+                        vo.setOffSetX(eVisaConfig.getString("X"));
+                        vo.setOffSetY(eVisaConfig.getString("Y"));
+                        sealStrategyVOS.add(vo);
+                    }
                     SealPdfVO pdfVO = new SealPdfVO();
                     pdfVO.setStrategyVoList(sealStrategyVOS);
 
@@ -426,7 +494,6 @@ public class EVisaServiceImpl implements EVisaService {
                 String visible = "1";
                 sealStrategy.setVisible(visible);
 
-                byte[] imageData = null;
                 if(!"authentication".equals(vo.getImageUrl())){
                     String imageUrl = vo.getImageUrl();
                     if(StringUtils.isEmpty(imageUrl)){
@@ -434,7 +501,7 @@ public class EVisaServiceImpl implements EVisaService {
                         return null;
                     }
                     //获取字节
-                    imageData = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(imageUrl));
+                    byte[] imageData = CommonUtil.InputStreamToBytes(CommonUtil.getOSSInputStream(imageUrl));
                     //对图片进行扣白底
                     imageData = ImageUtil.transferAlpha(imageData);
 
@@ -443,21 +510,22 @@ public class EVisaServiceImpl implements EVisaService {
                         imageData = ImageUtil.resizeImage(imageData,540,540);
                     }else {
                         imageData = ImageUtil.resizeImage(imageData,480,132);
+//                        imageData = ImageUtil.resizeImage(imageData,540,540);
                     }
 
                     //图片dpi设置
                     imageData = this.handleDpi(imageData);
-                }
-                if (imageData != null) {
-                    //图片进行Base64编码/
-                    String imageDataString =  new String(Base64.encode(imageData), StandardCharsets.UTF_8);
-                    sealStrategy.setSealImage(imageDataString);
-                }
 
-                if("authentication".equals(vo.getImageUrl())){
+                    if (imageData != null) {
+                        //图片进行Base64编码/
+                        String imageDataString =  new String(Base64.encode(imageData), StandardCharsets.UTF_8);
+                        sealStrategy.setSealImage(imageDataString);
+                    }
+                } else {
                     //工程文件认证的 是要用透明图片
                     sealStrategy.setSealImage(EVisaConstant.base64String);
                 }
+
                 sealStrategy.setSealMiscInfo(vo.getSealPerson(), vo.getSealLocation(),  vo.getSealReason());
 
                 //关键字签章

+ 21 - 10
blade-service/blade-manager/src/main/java/org/springblade/manager/feign/EVisaConfigClientImpl.java

@@ -40,26 +40,37 @@ public class EVisaConfigClientImpl implements EVisaConfigClient {
     public List<JSONObject> queryEVisaConfigByTableIds(List<String> tableIds, String contractId, String isFinal) {
         List<JSONObject> jsonResult = new ArrayList<>();
 
-        //需要获取这条任务对应合同段下当前用户的岗位
-        List<SaveUserInfoByProjectDTO> contractUserList = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getUserId, AuthUtil.getUserId()));
+        List<TextdictInfo> configResult;
+
+        if(Boolean.parseBoolean(isFinal)){
+            //最后,属于合同章
+            configResult = this.textdictInfoService.list(Wrappers.<TextdictInfo>lambdaQuery().in(TextdictInfo::getTabId, tableIds).eq(TextdictInfo::getType, 6));
 
-        List<String> userRoleList;
-        if(contractUserList != null && contractUserList.size() > 0){
-            userRoleList = contractUserList.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList());
         } else {
-            userRoleList = Arrays.asList(AuthUtil.getUser().getRoleId().split(","));
-        }
+            //需要获取这条任务对应合同段下当前用户的岗位
+            List<SaveUserInfoByProjectDTO> contractUserList = this.saveUserInfoByProjectService.list(Wrappers.<SaveUserInfoByProjectDTO>lambdaQuery().eq(SaveUserInfoByProjectDTO::getContractId, contractId).eq(SaveUserInfoByProjectDTO::getUserId, AuthUtil.getUserId()));
 
-        List<TextdictInfo> configResult = this.textdictInfoService.list(Wrappers.<TextdictInfo>lambdaQuery().in(TextdictInfo::getTabId, tableIds).in(TextdictInfo::getSigRoleId, userRoleList));
+            List<String> userRoleList;
+            if(contractUserList != null && contractUserList.size() > 0){
+                userRoleList = contractUserList.stream().map(SaveUserInfoByProjectDTO::getRoleId).distinct().collect(Collectors.toList());
+            } else {
+                userRoleList = Arrays.asList(AuthUtil.getUser().getRoleId().split(","));
+            }
+
+            configResult = this.textdictInfoService.list(Wrappers.<TextdictInfo>lambdaQuery().in(TextdictInfo::getTabId, tableIds).in(TextdictInfo::getSigRoleId, userRoleList));
+        }
 
         if(configResult != null && configResult.size() > 0){
             configResult.forEach(config -> {
                 JSONObject jsonObject = new JSONObject();
                 //标识
-                jsonObject.put("KEY", config.getId());
+                jsonObject.put("KEY", Boolean.parseBoolean(isFinal) ? config.getColName() : config.getId());
+                if(Boolean.parseBoolean(isFinal)){
+                    jsonObject.put("type", config.getSigRoleId());
+                }
                 //X/Y轴偏移量
                 jsonObject.put("X", config.getPyzbx());
-                jsonObject.put("Y", config.getColKey());
+                jsonObject.put("Y", config.getPyzby());
 
                 jsonResult.add(jsonObject);
             });