diff --git a/pmapi/pom.xml b/pmapi/pom.xml index 4aea8f4..5a618db 100644 --- a/pmapi/pom.xml +++ b/pmapi/pom.xml @@ -252,6 +252,12 @@ org.xhtmlrenderer flying-saucer-pdf-itext5 + + + com.itextpdf + html2pdf + + diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/expert/helper/PermissionCheckHelper.java b/pmapi/src/main/java/com/ningdatech/pmapi/expert/helper/PermissionCheckHelper.java index bb6a413..41c0642 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/expert/helper/PermissionCheckHelper.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/expert/helper/PermissionCheckHelper.java @@ -1,5 +1,8 @@ package com.ningdatech.pmapi.expert.helper; +import com.ningdatech.pmapi.user.entity.enumeration.RoleEnum; +import com.ningdatech.pmapi.user.security.auth.model.UserInfoDetails; +import com.ningdatech.pmapi.user.util.LoginUserUtil; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -13,8 +16,8 @@ import org.springframework.stereotype.Component; public class PermissionCheckHelper { public boolean isSuperAdmin() { - // TODO - return false; + UserInfoDetails details = LoginUserUtil.loginUserDetail(); + return details.getUserRoleList().stream().anyMatch(w -> w.getCode().equals(RoleEnum.SUPER_ADMIN.name())); } } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/irs/sign/IRSAPIRequest.java b/pmapi/src/main/java/com/ningdatech/pmapi/irs/sign/IRSAPIRequest.java index 28e92eb..cf8a11c 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/irs/sign/IRSAPIRequest.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/irs/sign/IRSAPIRequest.java @@ -1,7 +1,8 @@ package com.ningdatech.pmapi.irs.sign; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.ningdatech.pmapi.irs.config.IrsSealPlatformProperties; +import com.ningdatech.pmapi.todocenter.model.dto.SignReqDTO; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import org.apache.commons.lang3.tuple.Pair; import org.apache.http.HttpEntity; @@ -28,26 +29,10 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; - public class IRSAPIRequest { - //天印服务器接口信息 -// private static String ProjectID = "XXX"; -// private static String ProjectSecret = "XXXX"; -// private static String accessKey = "XXXX"; -// private static String secretKey = "XXXX"; -// private static String apiUrl = "https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220309000004/seal-platform/seal/v1/rest/sign/signPdf"; - - private static String ProjectID = "XXX"; - private static String ProjectSecret = "XXXX"; - private static String accessKey = "XXXX"; - private static String secretKey = "XXXX"; - private static String apiUrl = "https://ibcdsg.zj.gov.cn:8443/restapi/prod/IC33000020220309000004/seal-platform/seal/v1/rest/sign/signPdf"; - public static void main(String[] args) throws Exception { - createSignPdf(); - } /** @@ -56,33 +41,36 @@ public class IRSAPIRequest { * * @return */ - public static JSONObject createSignPdf() { + public static byte[] createSignPdf(SignReqDTO req) { + String pdfEncode64 = req.getPdfEncode64(); + Float posX = req.getPosX(); + Float posY = req.getPosY(); + String sealSn = req.getSealSn(); + String fileName = req.getFileName(); JSONObject obj = null; String resp = null; try { JSONObject ReqData = new JSONObject(); - String pathname = "D://001.pdf"; - File file = new File(pathname); - String fileByte1 = IRSAPIRequest.PDFToBase64(file); - ReqData.put("fileBase64", fileByte1); - ReqData.put("sealSn", "33012108041829053952"); - ReqData.put("posX", "200"); - ReqData.put("posY", "200"); + ReqData.put("fileBase64", pdfEncode64); + ReqData.put("sealSn", sealSn); + ReqData.put("posX", posX); + ReqData.put("posY", posY); ReqData.put("signType", "1"); // ReqData.put("key", "单位"); ReqData.put("posPage", "1"); - ReqData.put("fileName", "01.pdf"); - + ReqData.put("fileName", fileName); resp = post(ReqData, "post"); - JSONObject jsonObject = JSON.parseObject(resp); - String data = jsonObject.getString("data"); - JSONObject jsondata = JSON.parseObject(data); - String signFileB64 = jsondata.getString("signFileB64"); - IRSAPIRequest.base64StringToPdf(signFileB64, "D:\\test21.pdf"); + + //JSONObject jsonObject = JSON.parseObject(resp); + //String data = jsonObject.getString("data"); + //JSONObject jsondata = JSON.parseObject(data); + //String signFileB64 = jsondata.getString("signFileB64"); + //IRSAPIRequest.base64StringToPdf(signFileB64, "D:\\test21.pdf"); } catch (Exception e) { e.printStackTrace(); } - return obj; + // return obj; + return resp.getBytes(); } @@ -92,12 +80,12 @@ public class IRSAPIRequest { DateFormat dateFormat = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); String date = dateFormat.format(new Date()); - URL url = new URL(apiUrl); + URL url = new URL(IrsSealPlatformProperties.apiUrl); URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), null); String canonicalQueryString = getCanonicalQueryString(uri.getQuery()); - String message = requestMethod.toUpperCase() + "\n" + uri.getPath() + "\n" + canonicalQueryString + "\n" + accessKey + "\n" + date + "\n"; + String message = requestMethod.toUpperCase() + "\n" + uri.getPath() + "\n" + canonicalQueryString + "\n" + IrsSealPlatformProperties.accessKey + "\n" + date + "\n"; Mac hasher = Mac.getInstance("HmacSHA256"); - hasher.init(new SecretKeySpec(secretKey.getBytes(), "HmacSHA256")); + hasher.init(new SecretKeySpec(IrsSealPlatformProperties.secretKey.getBytes(), "HmacSHA256")); byte[] hash = hasher.doFinal(message.getBytes()); DatatypeConverter.printHexBinary(hash); String sign = DatatypeConverter.printBase64Binary(hash); @@ -112,14 +100,14 @@ public class IRSAPIRequest { String signature = sign(stream); //System.out.println(signature); // 设置HTTP请求头 - HttpEntityEnclosingRequestBase req = new HttpPost(apiUrl); + HttpEntityEnclosingRequestBase req = new HttpPost(IrsSealPlatformProperties.apiUrl); // project-id为用户的projectId - req.addHeader("appId", ProjectID); + req.addHeader("appId", IrsSealPlatformProperties.projectId); // signature为之前生成的签名 req.addHeader("signature", signature); req.addHeader("X-BG-HMAC-SIGNATURE", sign); req.addHeader("X-BG-HMAC-ALGORITHM", "hmac-sha256"); - req.addHeader("X-BG-HMAC-ACCESS-KEY", accessKey); + req.addHeader("X-BG-HMAC-ACCESS-KEY", IrsSealPlatformProperties.accessKey); req.addHeader("X-BG-DATE-TIME", date); req.addHeader("Content-Type", "application/json"); @@ -151,7 +139,7 @@ public class IRSAPIRequest { Mac mac = Mac.getInstance("HmacSHA256"); // 获取安全密钥 - Key secKey = new SecretKeySpec(ProjectSecret.getBytes("UTF-8"), mac.getAlgorithm()); + Key secKey = new SecretKeySpec(IrsSealPlatformProperties.projectSecret.getBytes("UTF-8"), mac.getAlgorithm()); // 初始化 mac.init(secKey); @@ -169,7 +157,7 @@ public class IRSAPIRequest { Mac mac = Mac.getInstance("HmacSHA256"); // 获取安全密钥 - Key secKey = new SecretKeySpec(secretKey.getBytes("UTF-8"), mac.getAlgorithm()); + Key secKey = new SecretKeySpec(IrsSealPlatformProperties.secretKey.getBytes("UTF-8"), mac.getAlgorithm()); // 初始化 mac.init(secKey); @@ -275,7 +263,8 @@ public class IRSAPIRequest { BufferedOutputStream bos = null; try { - byte[] bytes = decoder.decodeBuffer(base64Content);//base64编码内容转换为字节数组 + // base64编码内容转换为字节数组 + byte[] bytes = decoder.decodeBuffer(base64Content); ByteArrayInputStream byteInputStream = new ByteArrayInputStream(bytes); bis = new BufferedInputStream(byteInputStream); File file = new File(filePath); diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/vo/MeetingByManagerVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/vo/MeetingByManagerVO.java index a906367..c618011 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/vo/MeetingByManagerVO.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/entity/vo/MeetingByManagerVO.java @@ -61,4 +61,7 @@ public class MeetingByManagerVO { @ApiModelProperty("专家状态") private Integer expertStatus; + @ApiModelProperty("创建时间") + private LocalDateTime createOn; + } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/helper/MeetingManageHelper.java b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/helper/MeetingManageHelper.java index 741a114..2953f4b 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/meeting/helper/MeetingManageHelper.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/meeting/helper/MeetingManageHelper.java @@ -118,6 +118,7 @@ public class MeetingManageHelper { .confirmedRoster(meeting.getConfirmedRoster()) .inviteStatus(meeting.getInviteStatus()) .status(meeting.getStatus()) + .createOn(meeting.getCreateOn()) .build(); } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/FourSystemEnum.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/FourSystemEnum.java new file mode 100644 index 0000000..144dbb9 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/FourSystemEnum.java @@ -0,0 +1,44 @@ +package com.ningdatech.pmapi.projectlib.enumeration; + +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 四大体系枚举 + * + * @return + * @author CMM + * @since 2023/03/16 16:27 + */ +@Getter +@AllArgsConstructor +@NoArgsConstructor +public enum FourSystemEnum { + /** + * 项目类型 + */ + BUSINESS_APPLICATION(1, "业务应用"), + APPLICATION_SUPPORT(2, "应用支撑"), + DATA_RESOURCES(3, "数据资源"), + INFRASTRUCTURE(4, "基础设施"); + + private Integer code; + private String desc; + + public static String getDescByCode(Integer code) { + if (Objects.isNull(code)) { + return StringUtils.EMPTY; + } + for (FourSystemEnum t : FourSystemEnum.values()) { + if (code.equals(t.getCode())) { + return t.desc; + } + } + return StringUtils.EMPTY; + } +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/handle/PreliminaryPreviewHandle.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/handle/PreliminaryPreviewHandle.java index 4b985a4..a4d07bd 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/handle/PreliminaryPreviewHandle.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/handle/PreliminaryPreviewHandle.java @@ -47,7 +47,7 @@ public class PreliminaryPreviewHandle extends AbstractProcessBusinessHandle { // 根据项目ID查询项目预审流程的流程状态 ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class) .eq(ProjectInst::getProjectId, projectId) - .eq(ProjectInst::getInstType, InstTypeEnum.DEPT_UNITED_REVIEW.getCode()) + .eq(ProjectInst::getInstType, InstTypeEnum.PRELIMINARY_PREVIEW.getCode()) .orderByDesc(ProjectInst::getCreatOn) .last("limit 1")); if (Objects.isNull(projectInst)){ diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/Project.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/Project.java index a8b5584..109a2ba 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/Project.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/Project.java @@ -312,4 +312,7 @@ public class Project implements Serializable { @ApiModelProperty("项目预审申请单文件ID") private Long pretrialFileId; + @ApiModelProperty("项目预审申请单文件名") + private String pretrialFileName; + } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/vo/ProjectDetailVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/vo/ProjectDetailVO.java index 97b6456..08afd44 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/vo/ProjectDetailVO.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/vo/ProjectDetailVO.java @@ -294,6 +294,12 @@ public class ProjectDetailVO { private String projectTypeName; + @ApiModelProperty("项目预审申请单文件ID") + private Long pretrialFileId; + + @ApiModelProperty("项目预审申请单文件名") + private String pretrialFileName; + public String getProjectTypeName() { if (Objects.nonNull(this.projectType)) { Optional.ofNullable(ProjectTypeEnum.getDesc(this.projectType)) diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java index 18b0c36..8ed108a 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/controller/TodoCenterController.java @@ -169,4 +169,10 @@ public class TodoCenterController { String instanceId = todoCenterManage.adjustmentAndHandle(dto); return "退回项目内容调整并且重新通过 【" + instanceId + "】 成功"; } + + @ApiOperation("获取未签章的pdf文件") + @PostMapping("/getNotSealedPdf/{projectId}") + public Long getNotSealedPdf (@Valid @PathVariable("projectId") Long projectId){ + return todoCenterManage.getNotSealedPdf(projectId); + } } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/enumeration/IsOrNotEnum.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/enumeration/IsOrNotEnum.java new file mode 100644 index 0000000..99b4dba --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/enumeration/IsOrNotEnum.java @@ -0,0 +1,71 @@ +package com.ningdatech.pmapi.todocenter.enumeration; + +import java.util.Objects; + +import org.apache.commons.lang3.StringUtils; + +import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +/** + * 是否增补项目枚举 + * + * @author CMM + */ +@Getter +@AllArgsConstructor +@NoArgsConstructor +@ApiModel(value = "IsOrNotEnum", description = "是否-枚举") +public enum IsOrNotEnum { + /** + * 否 + */ + NOT(0, "否"), + + /** + * 是 + */ + IS(1, "是"); + + + private Integer code; + private String desc; + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public static String getDescByCode(Integer code) { + if (Objects.isNull(code)) { + return StringUtils.EMPTY; + } + for (IsOrNotEnum t : IsOrNotEnum.values()) { + if (code.equals(t.getCode())) { + return t.desc; + } + } + return StringUtils.EMPTY; + } + + public static IsOrNotEnum getEnumByValue(Integer code) { + if (Objects.isNull(code)) { + return null; + } + for (IsOrNotEnum t : IsOrNotEnum.values()) { + if (code.equals(t.getCode())) { + return t; + } + } + return null; + } + + public boolean eq(String val) { + return this.name().equals(val); + } +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java index 83be119..84e9dac 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java @@ -1,40 +1,53 @@ package com.ningdatech.pmapi.todocenter.manage; +import cn.hutool.core.codec.Base64; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.google.common.collect.Sets; import com.ningdatech.basic.exception.BizException; import com.ningdatech.basic.function.VUtils; import com.ningdatech.basic.model.PageVo; -import com.ningdatech.basic.util.CollUtils; import com.ningdatech.basic.util.NdDateUtils; +import com.ningdatech.file.entity.File; +import com.ningdatech.file.entity.vo.result.FileResultVO; +import com.ningdatech.file.service.FileService; import com.ningdatech.pmapi.common.constant.CommonConst; import com.ningdatech.pmapi.common.helper.UserInfoHelper; import com.ningdatech.pmapi.common.model.entity.ExcelExportWriter; -import com.ningdatech.pmapi.common.statemachine.event.ProjectStatusChangeEvent; import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; import com.ningdatech.pmapi.common.util.ExcelDownUtil; +import com.ningdatech.pmapi.irs.sign.IRSAPIRequest; import com.ningdatech.pmapi.organization.model.entity.DingEmployeeInfo; import com.ningdatech.pmapi.organization.model.entity.DingOrganization; import com.ningdatech.pmapi.organization.service.IDingEmployeeInfoService; import com.ningdatech.pmapi.organization.service.IDingOrganizationService; import com.ningdatech.pmapi.projectdeclared.manage.DefaultDeclaredProjectManage; -import com.ningdatech.pmapi.projectdeclared.model.dto.DefaultDeclaredDTO; +import com.ningdatech.pmapi.projectlib.enumeration.FourSystemEnum; +import com.ningdatech.pmapi.projectlib.enumeration.InstTypeEnum; import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; +import com.ningdatech.pmapi.projectlib.enumeration.ProjectTypeEnum; import com.ningdatech.pmapi.projectlib.manage.ProjectLibManage; import com.ningdatech.pmapi.projectlib.model.dto.ProjectDTO; import com.ningdatech.pmapi.projectlib.model.entity.Project; import com.ningdatech.pmapi.projectlib.model.entity.ProjectApplication; +import com.ningdatech.pmapi.projectlib.model.entity.ProjectInst; import com.ningdatech.pmapi.projectlib.model.req.ProjectListReq; import com.ningdatech.pmapi.projectlib.model.vo.ProjectLibListItemVO; import com.ningdatech.pmapi.projectlib.service.IProjectApplicationService; +import com.ningdatech.pmapi.projectlib.service.IProjectInstService; import com.ningdatech.pmapi.projectlib.service.IProjectService; +import com.ningdatech.pmapi.signature.entity.CompanySignature; +import com.ningdatech.pmapi.signature.service.ICompanySignatureService; import com.ningdatech.pmapi.staging.enums.MsgTypeEnum; import com.ningdatech.pmapi.staging.service.INdWorkNoticeStagingService; import com.ningdatech.pmapi.staging.service.IProjectStagingService; import com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo; +import com.ningdatech.pmapi.todocenter.enumeration.IsOrNotEnum; import com.ningdatech.pmapi.todocenter.model.dto.AdjustHandleDTO; +import com.ningdatech.pmapi.todocenter.model.dto.PdfGenerateDTO; +import com.ningdatech.pmapi.todocenter.model.dto.SignReqDTO; import com.ningdatech.pmapi.todocenter.model.vo.ProcessProgressDetailVo; import com.ningdatech.pmapi.todocenter.enumeration.IsAppendProjectEnum; import com.ningdatech.pmapi.todocenter.model.req.ProcessDetailReq; @@ -42,6 +55,7 @@ import com.ningdatech.pmapi.todocenter.model.req.ToBeProcessedExportReq; import com.ningdatech.pmapi.todocenter.model.req.ToBeProcessedReq; import com.ningdatech.pmapi.todocenter.model.vo.ResToBeProcessedVO; import com.ningdatech.pmapi.todocenter.utils.BuildUserUtils; +import com.ningdatech.pmapi.todocenter.utils.PdfUtils; import com.ningdatech.pmapi.user.entity.UserInfo; import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO; import com.ningdatech.pmapi.user.service.IUserInfoService; @@ -50,33 +64,36 @@ import com.wflow.contants.HisProInsEndActId; import com.wflow.exception.BusinessException; import com.wflow.workflow.bean.dto.ProcessInstanceUserDto; import com.wflow.workflow.bean.dto.ReqProcessHandlerDTO; -import com.wflow.workflow.bean.process.ProcessComment; +import com.wflow.workflow.bean.dto.SealPositionInfoDTO; import com.wflow.workflow.bean.process.ProgressNode; import com.wflow.workflow.bean.process.enums.NodeTypeEnum; import com.wflow.workflow.bean.vo.ProcessInstanceVo; import com.wflow.workflow.bean.vo.ProcessProgressVo; import com.wflow.workflow.bean.vo.ProcessTaskVo; import com.wflow.workflow.enums.ProcessHandlerEnum; -import com.wflow.workflow.enums.ProcessStatusEnum; import com.wflow.workflow.service.ProcessInstanceService; import com.wflow.workflow.service.ProcessTaskService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FileUtils; import org.assertj.core.util.Lists; import org.flowable.bpmn.model.*; import org.flowable.engine.HistoryService; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ActivityInstance; -import org.mockito.internal.matchers.CompareTo; import org.springframework.beans.BeanUtils; +import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; - +import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.InputStream; +import java.math.BigDecimal; +import java.net.URL; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; - import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.*; import static com.wflow.workflow.task.TriggerServiceTask.runtimeService; @@ -93,10 +110,8 @@ public class TodoCenterManage { private final HistoryService historyService; private final IUserInfoService userInfoService; private final IProjectService projectService; - private final ProjectLibManage projectLibManage; private final StateMachineUtils stateMachineUtils; - private final IDingEmployeeInfoService dingEmployeeInfoService; private final IDingOrganizationService dingOrganizationService; private final ProcessInstanceService processInstanceService; @@ -105,8 +120,11 @@ public class TodoCenterManage { private final IProjectApplicationService projectApplicationService; private final UserInfoHelper userInfoHelper; private final BuildUserUtils buildUserUtils; - private final IProjectStagingService projectStagingService; + private final IProjectInstService projectInstService; + private final PdfUtils pdfUtils; + private final FileService fileService; + private final ICompanySignatureService companySignatureService; /** @@ -246,8 +264,14 @@ public class TodoCenterManage { switch (param.getAction()) { // 通过 case PASS: + // 盖章并通过 + case SEAL_PASS: // 通过该任务,流程到下一审核人处 processTaskService.handleTask(param, userId); + if (ProcessHandlerEnum.SEAL_PASS.name().equals(param.getAction().name())) { + // 调用IRS接口,获取盖章后的pdf文件,并保存到项目库中 + getSignPdf(param, declaredProject); + } // 获取流程通过后的流程实例 HistoricProcessInstance newInstance = historyService.createHistoricProcessInstanceQuery() .processInstanceId(processInstanceId) @@ -313,12 +337,6 @@ public class TodoCenterManage { workNoticeStagingService.addByWorkNotice(sendWorkNoticeInfo, MsgTypeEnum.AUDIT); } break; - // 盖章并通过 - case SEAL_PASS: - // TODO 调用盖章接口,返回盖章后的文件流 - // 通过该任务,流程到下一审核人处 - processTaskService.handleTask(param, userId); - break; // 驳回 case REJECT: // 驳回该任务,中止流程并使项目进入对应状态,给项目创建人、流程发起人发送浙政钉工作通知: @@ -406,6 +424,63 @@ public class TodoCenterManage { } } + /** + * 调用IRS接口,获取盖章后的pdf文件,上传到OSS,并保存文件ID到项目库中 + * @param param + * @param declaredProject + * @return void + * @author CMM + * @since 2023/03/16 21:34 + */ + private void getSignPdf(ReqProcessHandlerDTO param, Project declaredProject) { + Long projectId = param.getProjectId(); + // 设置pdf模板参数 + JSONObject paramsMap = assemblyPdfParams(projectId); + // TODO 根据当前盖章单位设置对应的盖章意见与盖章日期 + paramsMap.put("superOrgOpinion",null); + paramsMap.put("superOrgAuditDate",null); + paramsMap.put("higherOrgOpinion",null); + paramsMap.put("higherOrgAuditDate",null); + paramsMap.put("bigDataBureauOpinion",null); + paramsMap.put("bigDataBureauAuditDate",null); + // 再次获取装配了盖章意见和盖章日期参数的未盖章pdf文件 + Long pretrialFileId = generateNotSealedPdf(projectId,paramsMap); + // 获取预审申请单文件,并转换为Base64 + File pdfFile = fileService.getById(pretrialFileId); + InputStream fileInputStream = fileService.getFileInputStream(pdfFile); + String pdfEncode64 = Base64.encode(fileInputStream); + // 装配盖章接口请求参数信息 + SignReqDTO req = new SignReqDTO(); + req.setPdfEncode64(pdfEncode64); + String originalFileName = pdfFile.getOriginalFileName(); + req.setFileName(originalFileName); + SealPositionInfoDTO sealPositionInfo = param.getSealInfo(); + Float posX = sealPositionInfo.getPosX(); + Float posY = sealPositionInfo.getPosY(); + req.setPosX(posX); + req.setPosY(posY); + // 获取流程发起人信息 + Long projectSponsor = declaredProject.getSponsor(); + UserFullInfoDTO userFullInfo = userInfoHelper.getUserFullInfo(projectSponsor); + // 获取印章编号 + CompanySignature companySignature = companySignatureService.getOne(Wrappers.lambdaQuery(CompanySignature.class) + .eq(CompanySignature::getOrganizationCode, userFullInfo.getOrganizationCode())); + String sealSn = companySignature.getSealSn(); + req.setSealSn(sealSn); + + // 调用盖章接口,获取盖章后返回的pdf文件字符数组 + byte[] signPdf = IRSAPIRequest.createSignPdf(req); + // 转换成MultipartFile + MultipartFile multipartFile = new MockMultipartFile("file", originalFileName + ".pdf", "application/pdf", signPdf); + // 上传OSS + FileResultVO resultVo = fileService.upload(multipartFile, "default"); + // 将返回的文件ID更新到项目库中对应的项目下 + declaredProject.setPretrialFileId(resultVo.getId()); + declaredProject.setPretrialFileName(resultVo.getOriginalFileName()); + declaredProject.setUpdateOn(LocalDateTime.now()); + projectService.updateById(declaredProject); + } + /** * 当为驳回操作时,更新项目表中的项目状态 @@ -938,4 +1013,142 @@ public class TodoCenterManage { } return Boolean.TRUE; } + + /** + * 获取未盖章的预审申请单pdf文件 + * @param projectId + * @return java.lang.Long + * @author CMM + * @since 2023/03/16 22:46 + */ + public Long getNotSealedPdf(Long projectId) { + // 设置pdf模板参数 + JSONObject paramsMap = assemblyPdfParams(projectId); + paramsMap.put("superOrgOpinion",null); + paramsMap.put("superOrgAuditDate",null); + paramsMap.put("higherOrgOpinion",null); + paramsMap.put("higherOrgAuditDate",null); + paramsMap.put("bigDataBureauOpinion",null); + paramsMap.put("bigDataBureauAuditDate",null); + return generateNotSealedPdf(projectId, paramsMap); + } + + private Long generateNotSealedPdf(Long projectId, JSONObject paramsMap) { + // 获取本地目录的pdf模板 + String fileName = "预审申请单"; + InputStream htmlInputStream = + this.getClass().getClassLoader().getResourceAsStream("template/" + fileName + ".html"); + // 生成pdf字节数组 + byte[] pdf = pdfUtils.generatePdf(htmlInputStream, paramsMap); + + // 转换成MultipartFile + MultipartFile multipartFile = new MockMultipartFile("file", fileName + ".pdf", "application/pdf", pdf); + + // 上传OSS + FileResultVO resultVO = fileService.upload(multipartFile, "default"); + + // 将返回的文件ID保存到项目库中 + Project project = projectService.getById(projectId); + project.setPretrialFileId(resultVO.getId()); + project.setPretrialFileName(resultVO.getOriginalFileName()); + project.setUpdateOn(LocalDateTime.now()); + projectService.updateById(project); + + + try { + if (null != htmlInputStream) { + htmlInputStream.close(); + } + + // 删除输出文件夹下的临时文件 + java.io.File resourcesPath = new java.io.File("pmapi/src/main/resources"); + String reportPath = resourcesPath.getCanonicalPath(); + String path = reportPath + "/template/fileout"; + java.io.File directory = new java.io.File(path); + FileUtils.cleanDirectory(directory); + } catch (IOException e) { + log.error(e.getMessage()); + } + + // 返回文件id供前端下载 + return resultVO.getId(); + } + + /** + * 装配pdf模板参数 + * @param projectId 申报项目ID + * @return com.alibaba.fastjson.JSONObject + * @author CMM + * @since 2023/03/16 22:28 + */ + private JSONObject assemblyPdfParams(Long projectId) { + // 获取本地目录的pdf模板 + String fileName = "预审申请单"; + // 获取表单数据 + Project project = projectService.getById(projectId); + PdfGenerateDTO pdfGenerateDTO = new PdfGenerateDTO(); + BeanUtils.copyProperties(project, pdfGenerateDTO); + JSONObject paramsMap = JSONObject.parseObject(JSONObject.toJSONString(pdfGenerateDTO)); + // 设置title + String title = "【" + project.getProjectName() + "】" + fileName; + paramsMap.put("title",title); + // 获取流程发起人信息 + Long projectSponsor = project.getSponsor(); + UserFullInfoDTO userFullInfo = userInfoHelper.getUserFullInfo(projectSponsor); + // 获取印章编号 + CompanySignature companySignature = companySignatureService.getOne(Wrappers.lambdaQuery(CompanySignature.class) + .eq(CompanySignature::getOrganizationCode, userFullInfo.getOrganizationCode())); + if (Objects.nonNull(companySignature)){ + String sealSn = companySignature.getSealSn(); + paramsMap.put("projectNo", sealSn); + }else { + paramsMap.put("projectNo", null); + } + // 获取预审申报的开始时间 + ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class) + .eq(ProjectInst::getProjectId, projectId) + .eq(ProjectInst::getInstType, InstTypeEnum.PRELIMINARY_PREVIEW.getCode()) + .orderByDesc(ProjectInst::getCreatOn) + .last("limit 1")); + LocalDateTime time = null; + if (Objects.nonNull(projectInst)) { + time = projectInst.getCreatOn(); + paramsMap.put("time", NdDateUtils.format(time, "yyyy-MM-dd HH:mm")); + }else { + paramsMap.put("time", null); + } + // 获取是否临时增补项目 + String isTemporaryAugment = IsOrNotEnum.getDescByCode(project.getIsTemporaryAugment()); + paramsMap.put("isTemporaryAugment", isTemporaryAugment); + // 获取项目类型 + Integer projectType = project.getProjectType(); + paramsMap.put("projectType", ProjectTypeEnum.getDesc(projectType)); + // 获取是否首次新建 + String isFirst = IsOrNotEnum.getDescByCode(project.getIsFirst()); + paramsMap.put("isFirst", isFirst); + // 获取是否一地创新全省共享项目 + Boolean isInnovateWholeProvinceShare = project.getIsInnovateWholeProvinceShare(); + paramsMap.put("isInnovateWholeProvinceShare", Boolean.TRUE.equals(isInnovateWholeProvinceShare) ? + IsOrNotEnum.IS.getDesc() : IsOrNotEnum.NOT.getDesc()); + // 获取项目建设起始时间 + String beginTime = project.getBeginTime(); + String endTime = project.getEndTime(); + String beginAndEndTime = beginTime + StrUtil.DASHED + endTime; + paramsMap.put("beginAndEndTime", beginAndEndTime); + // 获取四大体系 + String fourSystem = FourSystemEnum.getDescByCode(project.getFourSystems()); + paramsMap.put("fourSystems", fourSystem); + // 获取是否数字化改革项目 + String isDigitalReform = IsOrNotEnum.getDescByCode(project.getIsDigitalReform()); + paramsMap.put("isDigitalReform", isDigitalReform); + // 获取是否上云 + String isCloud = IsOrNotEnum.getDescByCode(project.getIsCloud()); + paramsMap.put("isCloud", isCloud); + // 获取本年计划投资金额 + BigDecimal yearPlanInvest = project.getAnnualPlanAmount(); + paramsMap.put("yearPlanInvest",yearPlanInvest); + // TODO 根据地区编码获取当地大数据局(中心)的名称 + paramsMap.put("bigDataBureauName",null); + return paramsMap; + } } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/PdfGenerateDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/PdfGenerateDTO.java index bfb9ba0..499d195 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/PdfGenerateDTO.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/PdfGenerateDTO.java @@ -137,4 +137,10 @@ public class PdfGenerateDTO { @ApiModelProperty("一地创新全省共享项目-是否开启 false:关闭 true:开启") private Boolean isInnovateWholeProvinceShare; + + @ApiModelProperty("本地区大数据局名称") + private String bidDataBureauName; + + @ApiModelProperty("年度计划投资") + private BigDecimal yearPlanInvest; } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SignReqDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SignReqDTO.java new file mode 100644 index 0000000..6610cf5 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SignReqDTO.java @@ -0,0 +1,24 @@ +package com.ningdatech.pmapi.todocenter.model.dto; + +import lombok.Data; + +/** + * 印章信息及位置坐标 + * + * @author CMM + * @since 2023/03/16 11:56 + */ +@Data +public class SignReqDTO { + + private String pdfEncode64; + + private Float posX; + + private Float posY; + + private String sealSn; + + private String fileName; + +} diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfGenerateUtil.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfGenerateUtil.java deleted file mode 100644 index d657e04..0000000 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfGenerateUtil.java +++ /dev/null @@ -1,140 +0,0 @@ -package com.ningdatech.pmapi.todocenter.utils; - -import com.itextpdf.text.Image; -import com.itextpdf.text.Rectangle; -import com.itextpdf.text.pdf.*; -import lombok.extern.slf4j.Slf4j; - -import java.io.*; -import java.util.*; - -/** - * pdf 生成工具 - * - * @author CMM - * @since 2023/03/13 13:41 - */ -@Slf4j -public class PdfGenerateUtil { - - private PdfGenerateUtil() { - } - - - /** - * 生成填充了模板参数的pdf - * - * @param templatePdfInputStream 模板pdf流 - * @param paramsMap 填充参数 - * @return - */ - public static byte[] generatePdf(InputStream templatePdfInputStream,Map paramsMap) throws IOException { - byte[] templatePdfByteArray = readBytes(templatePdfInputStream); - return generatePdf(templatePdfByteArray, paramsMap); - } - - /** - * 生成填充了模板参数的pdf - * - * @param templatePdfByteArray 模板pdf字节数组 - * @param paramsMap 填充参数 - * @return - */ - public static byte[] generatePdf(byte[] templatePdfByteArray, Map paramsMap) { - - PdfReader reader = null; - ByteArrayOutputStream bos = null; - try { - //创建书写器,用于往document中书写信息 - // 通过本地文件路径获取资源 - reader = new PdfReader(templatePdfByteArray); - bos = new ByteArrayOutputStream(); - PdfStamper stamper = new PdfStamper(reader, bos); - - //使用中文字体 - BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); - ArrayList fontList = new ArrayList<>(); - fontList.add(baseFont); - - - AcroFields form = stamper.getAcroFields(); - form.setSubstitutionFonts(fontList); - - for (String fieldName : paramsMap.keySet()) { - if (paramsMap.get(fieldName) == null) { - continue; - } - - if (fieldName.indexOf("Image") > 0) { - String imgPath = paramsMap.get(fieldName).toString(); - int pageNo = form.getFieldPositions(fieldName).get(0).page; - Rectangle rectangle = form.getFieldPositions(fieldName).get(0).position; - float x = rectangle.getLeft(); - float y = rectangle.getTop(); - //根据路径读取图片 - Image image = Image.getInstance(imgPath); - //获取图片页面 - PdfContentByte under = stamper.getOverContent(pageNo); - //图片大小自适应 - image.scaleToFit(rectangle.getWidth(), rectangle.getHeight()); - //添加图片 - image.setAbsolutePosition(x, y - rectangle.getHeight()); - under.addImage(image); - } else { - // 设置占位字段 - form.setField(fieldName, paramsMap.get(fieldName).toString()); - } - } - - stamper.setFormFlattening(false); - stamper.close(); - - } catch (Exception e) { - log.error("通过模板生成PDF失败", e.getMessage()); - return null; - } finally { - try { - if (null != reader) { - reader.close(); - } - if (null != bos) { - bos.close(); - } - - } catch (IOException e) { - log.error("close resource error", e.getMessage()); - } - } - - return bos.toByteArray(); - } - - /** - * 读取输入流到字节数组 - * - * @param in - * @return - * @throws IOException - */ - private static byte[] readBytes(InputStream in) throws IOException { - //读取字节的缓冲 - byte[] buffer = new byte[1024]; - //最终的数据 - byte[] result = new byte[0]; - int size = 0; - while ((size = in.read(buffer)) != -1) { - int oldLen = result.length; - byte[] tmp = new byte[oldLen + size]; - if (oldLen > 0) {//copy 旧字节 - System.arraycopy(result, 0, tmp, 0, oldLen); - } - //copy 新字节 - System.arraycopy(buffer, 0, tmp, oldLen, size); - - result = tmp; - } - return result; - } -} - - diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfUtils.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfUtils.java index ef34fb0..cb519a9 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfUtils.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfUtils.java @@ -1,9 +1,13 @@ package com.ningdatech.pmapi.todocenter.utils; +import cn.hutool.core.util.StrUtil; import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.*; import com.ningdatech.basic.exception.BizException; +import com.ningdatech.pmapi.common.util.StrUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; @@ -40,7 +44,7 @@ public class PdfUtils { File directory = new File(""); //pdf输出路径 String absolutePath = directory.getAbsolutePath(); - String linkPath = "\\src\\main\\resources"; + String linkPath = "\\pmapi\\src\\main\\resources"; String filePath = absolutePath + linkPath + "\\template\\fileout"; if(!new File(filePath).exists()){ new File(filePath).mkdir(); @@ -58,13 +62,14 @@ public class PdfUtils { //替换参数、多个参数多次替换 for (String fieldName : paramsMap.keySet()) { if (paramsMap.get(fieldName) == null) { - continue; + // 没有值的字段使用-覆盖 + htmlInfo = htmlInfo.replace("#" + fieldName + "#", ""); + }else { + // 设置占位字段 + htmlInfo = htmlInfo.replace("#" + fieldName + "#", paramsMap.get(fieldName).toString()); } - // 设置占位字段 - htmlInfo = htmlInfo.replace("#" + fieldName + "#", paramsMap.get(fieldName).toString()); } - //生成临时文件 String htmlFileName = UUID.randomUUID().toString().replace("-","") + ".html"; String htmlFilePath = filePath + File.separator + htmlFileName; @@ -95,15 +100,6 @@ public class PdfUtils { inputStream = new FileInputStream(pdfFilePath); - //删除临时文件 - File delFile = new File(pdfFilePath); - if(delFile.exists()){ - delFile.delete(); - } - File delHtmlFile = new File(htmlFilePath); - if(delHtmlFile.exists()){ - delHtmlFile.delete(); - } // 返回生成的pdf文件字节数组 return readBytes(inputStream); } catch (IOException e) { diff --git a/pmapi/src/main/resources/application-dev.yml b/pmapi/src/main/resources/application-dev.yml index 11eb7bc..b6df76f 100644 --- a/pmapi/src/main/resources/application-dev.yml +++ b/pmapi/src/main/resources/application-dev.yml @@ -96,7 +96,7 @@ mybatis-plus: logic-not-delete-value: false logging: config: classpath:logback-spring.xml -#日志配置 + #日志配置 level: root: info file: @@ -195,6 +195,7 @@ provincial: secret: 75152a97f20e4c4c854dc6301cf72ad4 +#天印服务器接口信息 irs: seal-platform: project-id: 1 diff --git a/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf b/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf deleted file mode 100644 index 901265d..0000000 Binary files a/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf and /dev/null differ diff --git a/pmapi/src/main/resources/template/盖章文件.html b/pmapi/src/main/resources/template/盖章文件.html deleted file mode 100644 index 6d681c7..0000000 --- a/pmapi/src/main/resources/template/盖章文件.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - Document - - - -
-

- 【 - - 】预审申请单 -

-
-

- - 项目编号: - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
项目基本信息
项目名称
是否临时增补是否一地创新全省共享项目
项目负责人负责人手机号
项目联系人项目联系人手机号
建设单位建设单位统一社会信用代码
项目类型是否首次新建
预算年度建设起止时间
四大体系
是否数字化改革项目综合业务领域
立项依据
是否上云云类型
项目简介
资金申报情况
申报金额
自有资金政府投资-本级财政资金
政府投资-上级补助资金银行贷款
自有资金政府投资-本级财政资金
其他资金
2021年计划投资(万元)
资金分配情况
软件开发云资源、硬件购置
第三方服务
年度支付计划
年度支付金额
自有资金政府投资-本级财政资金
政府投资-上级补助资金银行贷款
其他资金
备注
备注
单位意见
本级主管单位意见(盖章)
上级主管单位意见(盖章)
{本地区大数据局的名称}意见(盖章)
-
-
- - diff --git a/pmapi/src/main/resources/template/预审申请单.html b/pmapi/src/main/resources/template/预审申请单.html index db9bdb7..5c25ab8 100644 --- a/pmapi/src/main/resources/template/预审申请单.html +++ b/pmapi/src/main/resources/template/预审申请单.html @@ -1,5 +1,8 @@ - + @@ -9,7 +12,7 @@ body { padding: 0; margin: 0; - font-family:SimSun; + font-family: SimSun; } .pdf { margin: 0 auto; @@ -20,7 +23,7 @@ padding: 0 0 40px 0; font-size: 34px; margin: 40px 0 0 0; - font-family:SimSun; + font-family: SimSun; } .tab { padding: 0 20px; @@ -72,12 +75,16 @@ .text { min-height: 150px; } + .content > .right { + float: right; + margin-right: 10px; + }

- 预审申请单 + #title#

@@ -231,15 +238,45 @@ 本级主管单位意见(盖章) - + +

+

+ #superOrgOpinion# +

+

+ #superOrgAuditDate# +

+
+ 上级主管单位意见(盖章) - - - - {本地区大数据局的名称}意见(盖章) - + +
+

+ #higherOrgOpinion# +

+

+ #higherOrgAuditDate# +

+
+ + + + + #bigDataBureauName# + 意见(盖章) + + +
+

+ #bigDataBureauOpinion# +

+

+ #bigDataBureauAuditDate# +

+
+ diff --git a/pmapi/src/main/resources/template/预审申请单.pdf b/pmapi/src/main/resources/template/预审申请单.pdf deleted file mode 100644 index 451899c..0000000 Binary files a/pmapi/src/main/resources/template/预审申请单.pdf and /dev/null differ diff --git a/pmapi/src/test/java/com/ningdatech/pmapi/todocenter/TodoCenterTest.java b/pmapi/src/test/java/com/ningdatech/pmapi/todocenter/TodoCenterTest.java index 804410c..8858d0d 100644 --- a/pmapi/src/test/java/com/ningdatech/pmapi/todocenter/TodoCenterTest.java +++ b/pmapi/src/test/java/com/ningdatech/pmapi/todocenter/TodoCenterTest.java @@ -17,7 +17,6 @@ import com.ningdatech.pmapi.staging.service.INdWorkNoticeStagingService; import com.ningdatech.pmapi.todocenter.bean.entity.WorkNoticeInfo; import com.ningdatech.pmapi.todocenter.manage.TodoCenterManage; import com.ningdatech.pmapi.todocenter.model.dto.PdfGenerateDTO; -import com.ningdatech.pmapi.todocenter.utils.PdfGenerateUtil; import com.ningdatech.pmapi.todocenter.utils.PdfUtils; import com.ningdatech.pmapi.user.entity.UserInfo; import com.ningdatech.pmapi.user.service.IUserInfoService; @@ -28,13 +27,10 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockMultipartFile; import org.springframework.web.multipart.MultipartFile; - -import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.InputStream; import java.time.LocalDateTime; import java.util.concurrent.*; - import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.PASS_MSG_TEMPLATE; /** @@ -127,7 +123,7 @@ public class TodoCenterTest extends AppTests { public void GeneratePdf(){ // 获取本地目录的pdf模板 String fileName = "预审申请单"; - InputStream pdfInputStream = + InputStream htmlInputStream = this.getClass().getClassLoader().getResourceAsStream("template/" + fileName + ".html"); // 获取表单数据 ProjectDetailVO projectDetail = projectLibManage.getProjectDetail(44L); @@ -153,10 +149,11 @@ public class TodoCenterTest extends AppTests { paramsMap.put("isDigitalReform", "否"); Integer isCloud = projectDetail.getIsCloud(); paramsMap.put("isCloud", "否"); + paramsMap.put("yearPlanInvest",null); + paramsMap.put("bigDataBureauName",null); // 生成pdf字节数组 - - byte[] pdf = pdfUtils.generatePdf(pdfInputStream, paramsMap); + byte[] pdf = pdfUtils.generatePdf(htmlInputStream, paramsMap); // 转换成MultipartFile MultipartFile multipartFile = new MockMultipartFile("file", fileName + ".pdf", "application/pdf", pdf); @@ -169,8 +166,8 @@ public class TodoCenterTest extends AppTests { project.setPretrialFileId(resultVO.getId()); try { - if (null != pdfInputStream) { - pdfInputStream.close(); + if (null != htmlInputStream) { + htmlInputStream.close(); } } catch (IOException e) { e.printStackTrace(); diff --git a/pom.xml b/pom.xml index 5bd0f3c..b4e66e4 100644 --- a/pom.xml +++ b/pom.xml @@ -169,6 +169,12 @@ flying-saucer-pdf-itext5 9.0.3 + + + com.itextpdf + html2pdf + 2.0.2 +