diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java index 06f5c41..305eff6 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java @@ -30,24 +30,28 @@ /** * 文件自定义名称参数构建器 */ - protected List customizedSignNamesParamCreator() { + protected List customizedSignNamesParamCreator(Boolean wordWays) { List approvalImageList = new ArrayList<>(); keyParamList = Arrays.asList("发起人", "审核人", "批准人"); - customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + if(wordWays){ + customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(0)); + imageConfig.setDocName("检测人"); + approvalImageList.add(imageConfig); + imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(1)); + imageConfig.setDocName("核验人"); + approvalImageList.add(imageConfig); + }else { + customizedSignNames = Arrays.asList("{检定员}", "{核验人}", "{批准人}"); + } for (int i = 0; i < 3; i++) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setFiledName(keyParamList.get(i)); imageConfig.setDocName(customizedSignNames.get(i)); approvalImageList.add(imageConfig); } - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(0)); - imageConfig.setDocName("检测人"); - approvalImageList.add(imageConfig); - imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(1)); - imageConfig.setDocName("核验人"); - approvalImageList.add(imageConfig); return approvalImageList; } @@ -85,6 +89,23 @@ return electronicImage; } + + /** + * 默认电子签名的图片设置,支持重写 + */ + protected ElectronicImage defaultExcelSignName(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(60f) + .stampHeight(30f) + .stampWidth(50f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + /** * 默认电子签章的图片设置,允许重写 */ diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java index 06f5c41..305eff6 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java @@ -30,24 +30,28 @@ /** * 文件自定义名称参数构建器 */ - protected List customizedSignNamesParamCreator() { + protected List customizedSignNamesParamCreator(Boolean wordWays) { List approvalImageList = new ArrayList<>(); keyParamList = Arrays.asList("发起人", "审核人", "批准人"); - customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + if(wordWays){ + customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(0)); + imageConfig.setDocName("检测人"); + approvalImageList.add(imageConfig); + imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(1)); + imageConfig.setDocName("核验人"); + approvalImageList.add(imageConfig); + }else { + customizedSignNames = Arrays.asList("{检定员}", "{核验人}", "{批准人}"); + } for (int i = 0; i < 3; i++) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setFiledName(keyParamList.get(i)); imageConfig.setDocName(customizedSignNames.get(i)); approvalImageList.add(imageConfig); } - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(0)); - imageConfig.setDocName("检测人"); - approvalImageList.add(imageConfig); - imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(1)); - imageConfig.setDocName("核验人"); - approvalImageList.add(imageConfig); return approvalImageList; } @@ -85,6 +89,23 @@ return electronicImage; } + + /** + * 默认电子签名的图片设置,支持重写 + */ + protected ElectronicImage defaultExcelSignName(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(60f) + .stampHeight(30f) + .stampWidth(50f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + /** * 默认电子签章的图片设置,允许重写 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d544f9e..34bd121 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -94,7 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); - printDocUrl=pdfNewUrl; + printDocUrl = pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); @@ -107,7 +107,7 @@ File invalidFile = new File(tempLocalFileDir); // 删除运行空间下的文件 deleteFile(invalidFile); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); + log.debug("invalid print file start delete, the file directory is {},this file is {}", tempLocalFileDir, miniName); } } return miniName; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java index 06f5c41..305eff6 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java @@ -30,24 +30,28 @@ /** * 文件自定义名称参数构建器 */ - protected List customizedSignNamesParamCreator() { + protected List customizedSignNamesParamCreator(Boolean wordWays) { List approvalImageList = new ArrayList<>(); keyParamList = Arrays.asList("发起人", "审核人", "批准人"); - customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + if(wordWays){ + customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(0)); + imageConfig.setDocName("检测人"); + approvalImageList.add(imageConfig); + imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(1)); + imageConfig.setDocName("核验人"); + approvalImageList.add(imageConfig); + }else { + customizedSignNames = Arrays.asList("{检定员}", "{核验人}", "{批准人}"); + } for (int i = 0; i < 3; i++) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setFiledName(keyParamList.get(i)); imageConfig.setDocName(customizedSignNames.get(i)); approvalImageList.add(imageConfig); } - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(0)); - imageConfig.setDocName("检测人"); - approvalImageList.add(imageConfig); - imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(1)); - imageConfig.setDocName("核验人"); - approvalImageList.add(imageConfig); return approvalImageList; } @@ -85,6 +89,23 @@ return electronicImage; } + + /** + * 默认电子签名的图片设置,支持重写 + */ + protected ElectronicImage defaultExcelSignName(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(60f) + .stampHeight(30f) + .stampWidth(50f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + /** * 默认电子签章的图片设置,允许重写 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d544f9e..34bd121 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -94,7 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); - printDocUrl=pdfNewUrl; + printDocUrl = pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); @@ -107,7 +107,7 @@ File invalidFile = new File(tempLocalFileDir); // 删除运行空间下的文件 deleteFile(invalidFile); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); + log.debug("invalid print file start delete, the file directory is {},this file is {}", tempLocalFileDir, miniName); } } return miniName; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java index 9178192..8128620 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java @@ -93,7 +93,8 @@ if (StringUtils.isNotEmpty(signFileNames)) { signFileNames = signFileNames.substring(0, signFileNames.length() - 1); } - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); electronicImage.setSealImageUrlsDir(filePrintRegister.getTemDir()); electronicImage.setElectronicSealImageUrls(signFileNames); electronicImage.setImageConfig(approvalImageList.get(i)); @@ -106,7 +107,7 @@ } else { //多个工作流字段签名 for (ApprovalLogResponse approvalLog : approvalLogList) { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); filePrintRegister.getParams().putAll(createApprovalParam(timeSeqCount, approvalLog)); timeSeqCount++; String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); @@ -148,7 +149,8 @@ electronicImage, filePrintRegister)); } //添加二维码逻辑 - ElectronicImage electronicImage = defaultElectronicImage("二维码"); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicImage("二维码"): + defaultElectronicImage("{qr}"); electronicImage.setIsSealImage(true); electronicImageSeals.add(doPopulateQRCode(electronicImage, filePrintRegister)); @@ -219,7 +221,7 @@ * @return */ protected final ElectronicImage doPopulateQRCode(ElectronicImage electronicImage, FilePrintRegister filePrintRegister) { - String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg":filePrintRegister.getCustomFileName()+".jpg"; + String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg" : filePrintRegister.getCustomFileName() + ".jpg"; //设置集合 electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + qrCodeName); //放入待下载的文件集合 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java index 06f5c41..305eff6 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java @@ -30,24 +30,28 @@ /** * 文件自定义名称参数构建器 */ - protected List customizedSignNamesParamCreator() { + protected List customizedSignNamesParamCreator(Boolean wordWays) { List approvalImageList = new ArrayList<>(); keyParamList = Arrays.asList("发起人", "审核人", "批准人"); - customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + if(wordWays){ + customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(0)); + imageConfig.setDocName("检测人"); + approvalImageList.add(imageConfig); + imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(1)); + imageConfig.setDocName("核验人"); + approvalImageList.add(imageConfig); + }else { + customizedSignNames = Arrays.asList("{检定员}", "{核验人}", "{批准人}"); + } for (int i = 0; i < 3; i++) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setFiledName(keyParamList.get(i)); imageConfig.setDocName(customizedSignNames.get(i)); approvalImageList.add(imageConfig); } - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(0)); - imageConfig.setDocName("检测人"); - approvalImageList.add(imageConfig); - imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(1)); - imageConfig.setDocName("核验人"); - approvalImageList.add(imageConfig); return approvalImageList; } @@ -85,6 +89,23 @@ return electronicImage; } + + /** + * 默认电子签名的图片设置,支持重写 + */ + protected ElectronicImage defaultExcelSignName(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(60f) + .stampHeight(30f) + .stampWidth(50f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + /** * 默认电子签章的图片设置,允许重写 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d544f9e..34bd121 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -94,7 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); - printDocUrl=pdfNewUrl; + printDocUrl = pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); @@ -107,7 +107,7 @@ File invalidFile = new File(tempLocalFileDir); // 删除运行空间下的文件 deleteFile(invalidFile); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); + log.debug("invalid print file start delete, the file directory is {},this file is {}", tempLocalFileDir, miniName); } } return miniName; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java index 9178192..8128620 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java @@ -93,7 +93,8 @@ if (StringUtils.isNotEmpty(signFileNames)) { signFileNames = signFileNames.substring(0, signFileNames.length() - 1); } - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); electronicImage.setSealImageUrlsDir(filePrintRegister.getTemDir()); electronicImage.setElectronicSealImageUrls(signFileNames); electronicImage.setImageConfig(approvalImageList.get(i)); @@ -106,7 +107,7 @@ } else { //多个工作流字段签名 for (ApprovalLogResponse approvalLog : approvalLogList) { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); filePrintRegister.getParams().putAll(createApprovalParam(timeSeqCount, approvalLog)); timeSeqCount++; String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); @@ -148,7 +149,8 @@ electronicImage, filePrintRegister)); } //添加二维码逻辑 - ElectronicImage electronicImage = defaultElectronicImage("二维码"); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicImage("二维码"): + defaultElectronicImage("{qr}"); electronicImage.setIsSealImage(true); electronicImageSeals.add(doPopulateQRCode(electronicImage, filePrintRegister)); @@ -219,7 +221,7 @@ * @return */ protected final ElectronicImage doPopulateQRCode(ElectronicImage electronicImage, FilePrintRegister filePrintRegister) { - String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg":filePrintRegister.getCustomFileName()+".jpg"; + String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg" : filePrintRegister.getCustomFileName() + ".jpg"; //设置集合 electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + qrCodeName); //放入待下载的文件集合 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java index 2a74d2f..d28dfe3 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -49,11 +49,11 @@ List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); Map> ApprovalLogMap = approvalLogList.stream() .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - List approvalImageList = customizedSignNamesParamCreator(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), metaData.getCertificateReportFile()); filePrintRegister.setTemplateWordType("1".equals(metaData.getCertificateReportCategory()) ? true : false); + //定制化签名开发预处理,定制化参数 + List approvalImageList = customizedSignNamesParamCreator(filePrintRegister.getTemplateWordType()); filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); filePrintRegister.setParams(new HashMap()); filePrintRegister.setWatermark(true); diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java index 06f5c41..305eff6 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java @@ -30,24 +30,28 @@ /** * 文件自定义名称参数构建器 */ - protected List customizedSignNamesParamCreator() { + protected List customizedSignNamesParamCreator(Boolean wordWays) { List approvalImageList = new ArrayList<>(); keyParamList = Arrays.asList("发起人", "审核人", "批准人"); - customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + if(wordWays){ + customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(0)); + imageConfig.setDocName("检测人"); + approvalImageList.add(imageConfig); + imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(1)); + imageConfig.setDocName("核验人"); + approvalImageList.add(imageConfig); + }else { + customizedSignNames = Arrays.asList("{检定员}", "{核验人}", "{批准人}"); + } for (int i = 0; i < 3; i++) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setFiledName(keyParamList.get(i)); imageConfig.setDocName(customizedSignNames.get(i)); approvalImageList.add(imageConfig); } - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(0)); - imageConfig.setDocName("检测人"); - approvalImageList.add(imageConfig); - imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(1)); - imageConfig.setDocName("核验人"); - approvalImageList.add(imageConfig); return approvalImageList; } @@ -85,6 +89,23 @@ return electronicImage; } + + /** + * 默认电子签名的图片设置,支持重写 + */ + protected ElectronicImage defaultExcelSignName(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(60f) + .stampHeight(30f) + .stampWidth(50f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + /** * 默认电子签章的图片设置,允许重写 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d544f9e..34bd121 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -94,7 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); - printDocUrl=pdfNewUrl; + printDocUrl = pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); @@ -107,7 +107,7 @@ File invalidFile = new File(tempLocalFileDir); // 删除运行空间下的文件 deleteFile(invalidFile); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); + log.debug("invalid print file start delete, the file directory is {},this file is {}", tempLocalFileDir, miniName); } } return miniName; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java index 9178192..8128620 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java @@ -93,7 +93,8 @@ if (StringUtils.isNotEmpty(signFileNames)) { signFileNames = signFileNames.substring(0, signFileNames.length() - 1); } - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); electronicImage.setSealImageUrlsDir(filePrintRegister.getTemDir()); electronicImage.setElectronicSealImageUrls(signFileNames); electronicImage.setImageConfig(approvalImageList.get(i)); @@ -106,7 +107,7 @@ } else { //多个工作流字段签名 for (ApprovalLogResponse approvalLog : approvalLogList) { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); filePrintRegister.getParams().putAll(createApprovalParam(timeSeqCount, approvalLog)); timeSeqCount++; String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); @@ -148,7 +149,8 @@ electronicImage, filePrintRegister)); } //添加二维码逻辑 - ElectronicImage electronicImage = defaultElectronicImage("二维码"); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicImage("二维码"): + defaultElectronicImage("{qr}"); electronicImage.setIsSealImage(true); electronicImageSeals.add(doPopulateQRCode(electronicImage, filePrintRegister)); @@ -219,7 +221,7 @@ * @return */ protected final ElectronicImage doPopulateQRCode(ElectronicImage electronicImage, FilePrintRegister filePrintRegister) { - String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg":filePrintRegister.getCustomFileName()+".jpg"; + String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg" : filePrintRegister.getCustomFileName() + ".jpg"; //设置集合 electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + qrCodeName); //放入待下载的文件集合 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java index 2a74d2f..d28dfe3 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -49,11 +49,11 @@ List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); Map> ApprovalLogMap = approvalLogList.stream() .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - List approvalImageList = customizedSignNamesParamCreator(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), metaData.getCertificateReportFile()); filePrintRegister.setTemplateWordType("1".equals(metaData.getCertificateReportCategory()) ? true : false); + //定制化签名开发预处理,定制化参数 + List approvalImageList = customizedSignNamesParamCreator(filePrintRegister.getTemplateWordType()); filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); filePrintRegister.setParams(new HashMap()); filePrintRegister.setWatermark(true); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java index 7977387..5bcaefb 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java @@ -44,7 +44,7 @@ FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); filePrintRegister.setTemplateWordType("1".equals(metaData.getMeasureCategory()) ? true : false); //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); + customizedSignNamesParamCreator(filePrintRegister.getTemplateWordType()); //填充定制化的参数 filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); //定制化参数开发 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 08a79ff..9e2b49f 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -50,12 +50,12 @@ /** * 电子印章宽度(推荐120) */ - private Float stampWidth; + private float stampWidth; /** * 电子印章高度(推荐120) */ - private Float stampHeight; + private float stampHeight; /** * 关键字 diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java index 5446273..111c025 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/flowable/ApprovalLogResponse.java @@ -17,7 +17,8 @@ @ApiModelProperty("任务编号") private String taskId; - + @ApiModelProperty("历史任务编号") + private String ruTaskId; // @ApiModelProperty("任务执行编号") // private String executionId; @@ -98,14 +99,17 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date finishTime; + @ApiModelProperty("会签/或签(1/2)") + private Integer countersignOrSign; + @Data @Builder public static class FlowCommentDto { /** - * 意见类别 1正常意见 2拒绝意见 3驳回意见 + * 意见类别 0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请 */ - @ApiModelProperty("意见类别: 1正常意见 2拒绝意见 3驳回意见") + @ApiModelProperty("意见类别:0提交申请 1正常意见 2拒绝意见 3驳回意见 4取消申请") private String type; /** diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index 486faab..03f3881 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -393,10 +393,10 @@ certificateFutureTask.thenRun( () -> { String printFileName = certificateFutureTask.join(); - certificateReport.setCertificateReportFile(certificateFutureTask.join()); - this.baseMapper.updateById(certificateReport); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// certificateReport.setCertificateReportFile(certificateFutureTask.join()); +// this.baseMapper.updateById(certificateReport); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } ); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java index 609341d..965ecce 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessSiteExecutiveLogServiceImpl.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; @@ -190,6 +191,9 @@ } private void populateBusinessSiteExecutiveLogDetail(BusinessOrder businessOrder, BusinessSiteExecutiveLogDetail businessSiteExecutiveLogDetail) { + if(ObjectUtils.isEmpty(businessOrder)){ + return; + } businessSiteExecutiveLogDetail.setCustomerAddress(businessOrder.getCustomerAddress()); businessSiteExecutiveLogDetail.setCustomerName(businessOrder.getCustomerName()); businessSiteExecutiveLogDetail.setCustomerPhone(businessOrder.getCustomerPhone()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java index ec7d148..a347fdd 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/flowable/ApprovalOperateServiceImpl.java @@ -1,6 +1,8 @@ package com.casic.missiles.service.Impl.flowable; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.ObjectUtil; import com.casic.missiles.core.model.auth.AuthUser; import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; @@ -16,8 +18,10 @@ import com.casic.missiles.service.flowable.ApprovalOperateService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.flowable.bpmn.model.*; import org.flowable.common.engine.impl.identity.Authentication; import org.flowable.engine.HistoryService; +import org.flowable.engine.RepositoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; @@ -25,6 +29,7 @@ import org.flowable.engine.task.Comment; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; +import org.flowable.variable.api.history.HistoricVariableInstance; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -51,6 +56,8 @@ private UserMapper userMapper; @Resource private DeptMapper deptMapper; + @Resource + private RepositoryService repositoryService; @Override public List> approvalLog(String processId) { @@ -59,14 +66,16 @@ List list = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processId) .orderByHistoricActivityInstanceStartTime() - .desc().list(); + .asc().list(); List hisFlowList = new ArrayList<>(); + List commentList = taskService.getProcessInstanceComments(processId); for (HistoricActivityInstance histIns : list) { //histIns.getTaskId()对应每个用户生成的任务id,暂时仅用于判断 非任务活动节点taskId为null if (StringUtils.isNotBlank(histIns.getTaskId())) { ApprovalLogResponse flowTask = new ApprovalLogResponse(); //activityId对应用户任务节点的taskId(ACT_RU_TASK表的TASK_DEF_KEY_,即流程定义中自定义生成的分taskId),用于对审批人按任务节点分组 flowTask.setTaskId(histIns.getActivityId()); + flowTask.setRuTaskId(histIns.getTaskId()); flowTask.setTaskName(histIns.getActivityName()); flowTask.setCreateTime(histIns.getStartTime()); flowTask.setFinishTime(histIns.getEndTime()); @@ -85,50 +94,74 @@ flowTask.setDuration(histIns.getDurationInMillis() == null || histIns.getDurationInMillis() == 0 ? null : getDate(histIns.getDurationInMillis())); // 获取意见评论内容 - List commentList = taskService.getProcessInstanceComments(histIns.getProcessInstanceId()); + commentList.forEach(comment -> { if (histIns.getTaskId().equals(comment.getTaskId())) { flowTask.setComment(ApprovalLogResponse.FlowCommentDto.builder().type(comment.getType()).comment(comment.getFullMessage()).build()); } }); - //覆盖已有的root,因为驳回会再产生一个发起人任务 - int flag = 0; - ApprovalLogResponse oldValue = null; - if(histIns.getActivityId().contains("root")){ - for (ApprovalLogResponse his : hisFlowList) { - if(his.getTaskId().contains("root")){ - oldValue = his; - flag = 1; - break; + //判断会签or或签 + BpmnModel bpmnModel = repositoryService.getBpmnModel(histIns.getProcessDefinitionId()); + if (!histIns.getActivityName().contains("发起人")) { + Task task = taskService.createTaskQuery().taskId(histIns.getTaskId()).singleResult(); + if (Objects.nonNull(task)) { + FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); + List outgoingFlows = flowNode.getOutgoingFlows(); + for (SequenceFlow outgoingFlow : outgoingFlows) { + FlowElement targetFlowElement = outgoingFlow.getSourceFlowElement(); + if (targetFlowElement instanceof UserTask) { + UserTask userTask = (UserTask) targetFlowElement; + if (Objects.nonNull(userTask) && Objects.nonNull(userTask.getLoopCharacteristics())){ + //或签 + if ("${nrOfCompletedInstances/nrOfInstances > 0}".equals(userTask.getLoopCharacteristics().getCompletionCondition())) { + flowTask.setCountersignOrSign(2);//或签 + } else { + flowTask.setCountersignOrSign(1);//会签 + } + } + } } } } - if(flag > 0){ - hisFlowList.remove(oldValue); - } hisFlowList.add(flowTask); } } + hisFlowList = hisFlowList.stream().filter(i -> !(i.getTaskId().contains("root") && ObjectUtil.isEmpty(i.getFinishTime()))).collect(Collectors.toList()); + hisFlowList = hisFlowList.stream().filter(i -> !(!i.getTaskId().contains("root") && ObjectUtil.isNotEmpty(i.getFinishTime()) && ObjectUtil.isEmpty(i.getComment()))).collect(Collectors.toList()); + + HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() + .processInstanceId(processId) + .singleResult(); + String startUserId = historicProcessInstance.getStartUserId(); + User user = userMapper.selectById(Long.valueOf(startUserId)); + + HistoricVariableInstance reason = historyService.createHistoricVariableInstanceQuery().processInstanceId(processId).variableName("reason").singleResult(); + if (ObjectUtil.isNotEmpty(reason) && ObjectUtil.isNotEmpty(reason.getValue())) { + hisFlowList.get(0).setComment(ApprovalLogResponse.FlowCommentDto.builder().type("0").comment(reason.getValue().toString()).build()); + } + Map> resultMap = new HashMap<>(); //结果按taskId分组,并保证审批顺序 if (!CollectionUtils.isEmpty(hisFlowList)) { - resultMap = hisFlowList.stream().collect(Collectors.groupingBy(ApprovalLogResponse::getTaskId, LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); + resultMap = hisFlowList.stream().collect(Collectors.groupingBy(i -> String.format("%s_%s", i.getTaskId(), DateUtil.formatDateTime(i.getCreateTime())), + LinkedHashMap::new, Collectors.toCollection(ArrayList::new))); } + + //对分组的taskId的列表进行整合,taskId是流程定义中自定义的,多实例的任务每个人的taskId相同 Map> finalResultMap = resultMap; List> resultList = new ArrayList<>(); + for (String key : resultMap.keySet()) { List approvalLogList = finalResultMap.get(key); + boolean cancel = false; for (ApprovalLogResponse approvalLog : approvalLogList) { if (approvalLog.getTaskId().contains("root")) { - HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery() - .processInstanceId(processId) - .singleResult(); - String startUserId = historicProcessInstance.getStartUserId(); + approvalLog.setAssigneeId(Long.valueOf(startUserId)); - User user = userMapper.selectById(Long.valueOf(startUserId)); + approvalLog.setApprovalStatus(approvalLog.getTaskName());//发起人 - if(!Objects.isNull(user)){ + if (!Objects.isNull(user)) { approvalLog.setAssigneeName(user.getName()); Dept dept = deptMapper.selectById(user.getDeptId()); approvalLog.setDeptId(user.getDeptId()); @@ -139,8 +172,25 @@ } else if (!Objects.isNull(approvalLog.getFinishTime())) { approvalLog.setApprovalStatus("审批完成");//可能是通过/拒绝/驳回,审批意见中可见 } + + if (ObjectUtil.isNotEmpty(approvalLog.getComment()) && "4".equals(approvalLog.getComment().getType())) { + cancel = true; + approvalLog.setAssigneeId(Long.valueOf(startUserId)); + if (!Objects.isNull(user)) { + approvalLog.setAssigneeName(user.getName()); + Dept dept = deptMapper.selectById(user.getDeptId()); + approvalLog.setDeptId(user.getDeptId()); + approvalLog.setDeptName(dept.getSimpleName()); + } + } } - resultList.add(approvalLogList); + + if (!cancel) { + resultList.add(approvalLogList); + } else { + resultList.add(Collections.singletonList(approvalLogList.get(0))); + } + } return resultList; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 61db6ed..c2a48b8 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -33,6 +33,7 @@ import com.spire.doc.documents.ShapeType; import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; +import io.swagger.models.auth.In; import org.apache.commons.lang3.StringUtils; import org.apache.poi.util.IOUtils; @@ -157,11 +158,15 @@ } public static void main(String[] args) throws Exception { -// String path = "D:\\casic\\cut\\"; -//// String wordPath = path + "问TOE202403001.docx"; -// String pdfPath = path + "1.pdf"; -// String imagePath = path + "test.png"; -// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); + String path = "D:\\casic\\cut\\"; + String imagePath = path + "朱俊霖.jpg"; + String filePath = path + "1.xlsx"; + imageWrite("{检定员}", imagePath, filePath, path + "2.xlsx"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); // PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); // PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); // for (float[] f : list) { @@ -286,17 +291,13 @@ return arrays; } - public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { - if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { - System.out.println("进来了 不匹配 跳出"); - return; - } + public static void imageWrite(String val, String imgpath, String filePath, String outPath) throws Exception { //载Excel示例文档 Workbook workbook = new Workbook(); workbook.loadFromFile(filePath); //获取第一张工作表 Worksheet worksheet = workbook.getWorksheets().get(0); - if (!StringUtils.isEmpty(val) && val.equals("{qr}")) { + if (!StringUtils.isEmpty(val) && val.equals("{检定员}")) { //查找文档中的字符串“图片” CellRange[] ranges = worksheet.findAllString(val, false, false); for (int i = 0; i < ranges.length; i++) { @@ -305,13 +306,11 @@ //获取单元格所在的行列 int row = ranges[0].getRow(); int column = ranges[0].getColumn(); - double width = (ranges[0].getColumnWidth() * 7) * 5; - double height = ranges[0].getRowHeight() * 1.3; - //透明背景 - transferAlpha2File(imgpath, imgpath); -// 添加图片到获取的单元格 +// 添加图片到获取的单元格 ExcelPicture picture = worksheet.getPictures().add(row, column, imgpath); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + picture.setWidth(80); + picture.setHeight(30); + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); // 保存文档 workbook.saveToFile(outPath, ExcelVersion.Version2013); @@ -370,7 +369,6 @@ } g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver()); result = ImageIO.write(bufferedImage, "png", new File(imgTarget));// 直接输出文件 -// result = ImageIO.write(bufferedImage, "jpg", new File(imgTarget));// 直接输出文件 } catch (Exception e) { e.printStackTrace(); result = false; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java index 06f5c41..305eff6 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FileImageTemplateProvider.java @@ -30,24 +30,28 @@ /** * 文件自定义名称参数构建器 */ - protected List customizedSignNamesParamCreator() { + protected List customizedSignNamesParamCreator(Boolean wordWays) { List approvalImageList = new ArrayList<>(); keyParamList = Arrays.asList("发起人", "审核人", "批准人"); - customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + if(wordWays){ + customizedSignNames = Arrays.asList("编制:", "审核:", "批准:"); + ImageConfig imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(0)); + imageConfig.setDocName("检测人"); + approvalImageList.add(imageConfig); + imageConfig = new ImageConfig(); + imageConfig.setFiledName(keyParamList.get(1)); + imageConfig.setDocName("核验人"); + approvalImageList.add(imageConfig); + }else { + customizedSignNames = Arrays.asList("{检定员}", "{核验人}", "{批准人}"); + } for (int i = 0; i < 3; i++) { ImageConfig imageConfig = new ImageConfig(); imageConfig.setFiledName(keyParamList.get(i)); imageConfig.setDocName(customizedSignNames.get(i)); approvalImageList.add(imageConfig); } - ImageConfig imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(0)); - imageConfig.setDocName("检测人"); - approvalImageList.add(imageConfig); - imageConfig = new ImageConfig(); - imageConfig.setFiledName(keyParamList.get(1)); - imageConfig.setDocName("核验人"); - approvalImageList.add(imageConfig); return approvalImageList; } @@ -85,6 +89,23 @@ return electronicImage; } + + /** + * 默认电子签名的图片设置,支持重写 + */ + protected ElectronicImage defaultExcelSignName(String keyWord) { + ElectronicImage electronicImage = ElectronicImage.builder() + .keyWordIndex(-1) + .keyWord(keyWord) + .vertical(-10f) + .horizontal(60f) + .stampHeight(30f) + .stampWidth(50f) + .diaphaneity(150f) + .build(); + return electronicImage; + } + /** * 默认电子签章的图片设置,允许重写 */ diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index d544f9e..34bd121 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -94,7 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); - printDocUrl=pdfNewUrl; + printDocUrl = pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); @@ -107,7 +107,7 @@ File invalidFile = new File(tempLocalFileDir); // 删除运行空间下的文件 deleteFile(invalidFile); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); + log.debug("invalid print file start delete, the file directory is {},this file is {}", tempLocalFileDir, miniName); } } return miniName; diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java index 9178192..8128620 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileApprovalDataSupport.java @@ -93,7 +93,8 @@ if (StringUtils.isNotEmpty(signFileNames)) { signFileNames = signFileNames.substring(0, signFileNames.length() - 1); } - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); electronicImage.setSealImageUrlsDir(filePrintRegister.getTemDir()); electronicImage.setElectronicSealImageUrls(signFileNames); electronicImage.setImageConfig(approvalImageList.get(i)); @@ -106,7 +107,7 @@ } else { //多个工作流字段签名 for (ApprovalLogResponse approvalLog : approvalLogList) { - ElectronicImage electronicImage = defaultElectronicSignName(customizedSignName); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicSignName(customizedSignName) : defaultExcelSignName(customizedSignName); filePrintRegister.getParams().putAll(createApprovalParam(timeSeqCount, approvalLog)); timeSeqCount++; String signFileName = fileRegisterMapper.getSignFileNameById(approvalLog.getAssigneeId()); @@ -148,7 +149,8 @@ electronicImage, filePrintRegister)); } //添加二维码逻辑 - ElectronicImage electronicImage = defaultElectronicImage("二维码"); + ElectronicImage electronicImage = filePrintRegister.getTemplateWordType() ? defaultElectronicImage("二维码"): + defaultElectronicImage("{qr}"); electronicImage.setIsSealImage(true); electronicImageSeals.add(doPopulateQRCode(electronicImage, filePrintRegister)); @@ -219,7 +221,7 @@ * @return */ protected final ElectronicImage doPopulateQRCode(ElectronicImage electronicImage, FilePrintRegister filePrintRegister) { - String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg":filePrintRegister.getCustomFileName()+".jpg"; + String qrCodeName = StringUtils.isEmpty(filePrintRegister.getCustomFileName()) ? "检测.jpg" : filePrintRegister.getCustomFileName() + ".jpg"; //设置集合 electronicImage.setElectronicSealImageUrl(filePrintRegister.getTemDir() + qrCodeName); //放入待下载的文件集合 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java index 2a74d2f..d28dfe3 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -49,11 +49,11 @@ List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); Map> ApprovalLogMap = approvalLogList.stream() .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - List approvalImageList = customizedSignNamesParamCreator(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), metaData.getCertificateReportFile()); filePrintRegister.setTemplateWordType("1".equals(metaData.getCertificateReportCategory()) ? true : false); + //定制化签名开发预处理,定制化参数 + List approvalImageList = customizedSignNamesParamCreator(filePrintRegister.getTemplateWordType()); filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); filePrintRegister.setParams(new HashMap()); filePrintRegister.setWatermark(true); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java index 7977387..5bcaefb 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java @@ -44,7 +44,7 @@ FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); filePrintRegister.setTemplateWordType("1".equals(metaData.getMeasureCategory()) ? true : false); //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); + customizedSignNamesParamCreator(filePrintRegister.getTemplateWordType()); //填充定制化的参数 filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); //定制化参数开发 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ExcelPrintUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ExcelPrintUtils.java index b12ec9f..9fbe773 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ExcelPrintUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/ExcelPrintUtils.java @@ -135,13 +135,22 @@ CellRange[] ranges = worksheet.findAllString(entry.getKey(), false, false); for (int i = 0; i < ranges.length; i++) { //重置文本为空 - ranges[i].setText(""); + if (!"专用章".equals(entry.getKey())) { + ranges[i].setText(""); + } //获取单元格所在的行列 int row = ranges[i].getRow(); int column = ranges[i].getColumn(); // 添加图片到获取的单元格 - ExcelPicture picture = worksheet.getPictures().add(row, column, electronicSeal.getSealImageUrlsDir()); - picture.setTopRowOffset(5);//设置填充图片后的单元格 内边距 + ExcelPicture picture = worksheet.getPictures().add(row, column, electronicSeal.getElectronicSealImageUrl()); + if ("专用章".equals(entry.getKey())) { + picture.setWidth(200); + picture.setHeight(120); + } else if (!"{qr}".equals(entry.getKey())) { + picture.setWidth((int) electronicSeal.getStampWidth()); + picture.setHeight((int) electronicSeal.getStampHeight()); + } + picture.setTopRowOffset(10);//设置填充图片后的单元格 内边距 picture.setLeftColumnOffset(10); } }