From d47099019aa49e38fcb3d93e58e3416563584a7f Mon Sep 17 00:00:00 2001 From: CMM <2198256324@qq.com> Date: Thu, 16 Mar 2023 23:47:55 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=94=9F=E6=88=90=E9=A2=84=E5=AE=A1?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=8D=95pdf?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pmapi/pom.xml | 6 + .../ningdatech/pmapi/irs/sign/IRSAPIRequest.java | 44 ++-- .../projectlib/enumeration/FourSystemEnum.java | 44 ++++ .../handle/PreliminaryPreviewHandle.java | 2 +- .../pmapi/projectlib/model/entity/Project.java | 3 + .../controller/TodoCenterController.java | 6 + .../pmapi/todocenter/enumeration/IsOrNotEnum.java | 71 ++++++ .../pmapi/todocenter/manage/TodoCenterManage.java | 247 ++++++++++++++++++-- .../pmapi/todocenter/model/dto/PdfGenerateDTO.java | 6 + .../pmapi/todocenter/model/dto/SignReqDTO.java | 24 ++ .../pmapi/todocenter/utils/PdfGenerateUtil.java | 140 ------------ .../pmapi/todocenter/utils/PdfUtils.java | 24 +- .../fileout/c34f631755a04532a0116494fd5f99ac.pdf | Bin 58310 -> 0 bytes .../src/main/resources/template/盖章文件.html | 254 --------------------- .../main/resources/template/预审申请单.html | 57 ++++- .../main/resources/template/预审申请单.pdf | Bin 85885 -> 0 bytes .../pmapi/todocenter/TodoCenterTest.java | 15 +- pom.xml | 6 + 18 files changed, 482 insertions(+), 467 deletions(-) create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/FourSystemEnum.java create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/todocenter/enumeration/IsOrNotEnum.java create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SignReqDTO.java delete mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfGenerateUtil.java delete mode 100644 pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf delete mode 100644 pmapi/src/main/resources/template/盖章文件.html delete mode 100644 pmapi/src/main/resources/template/预审申请单.pdf diff --git a/pmapi/pom.xml b/pmapi/pom.xml index 1314c06..51efe5c 100644 --- a/pmapi/pom.xml +++ b/pmapi/pom.xml @@ -247,6 +247,12 @@ org.xhtmlrenderer flying-saucer-pdf-itext5 + + + com.itextpdf + html2pdf + + 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..8abf904 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,7 @@ package com.ningdatech.pmapi.irs.sign; -import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +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,7 +28,6 @@ import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; - public class IRSAPIRequest { //天印服务器接口信息 // private static String ProjectID = "XXX"; @@ -43,11 +42,8 @@ public class IRSAPIRequest { 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 +52,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(); } @@ -275,7 +274,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/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/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/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf b/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf deleted file mode 100644 index 901265db5a3cae7f77f9af4458a7b84475f8101e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58310 zcmd42V|Xsjx-A^r$&78=HfLaH>Bx<_?2iJY(~4FfGR6v^KH%mNe>K0Uszfdv#dH{DNT8&fAUd?qF)20Br5 zD<@+II#DZqCu3n_Lt7(bUS3Bh2V;F}D7VZc&8b-IMZ_y3*E(kK{n)0PdL0IG$=+IX zSzl>aDM%=jF3al?1J4U*J@GhTuy}1^l}JMSv0z0wj%)BBONVj5JS_)FhcNv5@E{J6 z7fuKKQ1XaGJMpgNhd;{7PiGgkYpZ2!$~~$N6|qkt7(FbUEiCC#72M$!7M%~{C+|xq ze@?3Ah_j8189wL8arnS%dKe^0_a_R_bkn1BF^m`NStz1DFH6b)uvcYv?jKlT$~qtj zB=L|`EsL!eu<6Hg27V2{UTs+x5MszqFw#!Jx!WLM*@p_-vC~9ljvkjjzMjM&Mp9;@ z;ua!85=-nATAi;bmKfoa8r~UVrw=Z`%vQK55a5#Mb?zTBh5)#TQCD*W z{kVff3SW~!ML?kMy=u3{jCZ*RmGdXIS79K-j7K2G2e+doCb3d*#}mKwk7ES`7Mx)h zC6c{mm&GVf0EPIiq~Jk|8UJ_@ESJ~1gOd?`LXCp|+KaQT{9cWQPqZ@H&7)&31F2%B-3TlgnkVu$_G2i^VWFH99q*+pK<%3$=t%;4QhU?uJAOht} zVFZ&4e;hUcFV5^|CNPn;7Bs=&z2T4yp}!+x%OzjpOmfzUJMZEJ5EQX_aeg06));1m z5G)>A+=wh3iacILrW|nFY?w6e*`{se-<$x9uXJf+T0+O2Cvp%JCM?5Tmxa%nDHp*} zS9T=a-c!-uwpq0qT_Wm-g%zYPLaF*Y8T1M@9x)#gW3KV<$U;6gO3H0{bZfaYwNO=c zyc_^PBzozPTn3mvNF3q2C*5jt{WG*1D|U{f5k`3cBI`GtRaELF4{^==!1!|KjZA-} zWX%|Ur1<6wDXu~04?rFy$5RT3tiMPec5Tqs^RIvRo!oT|j^ebmWB)11nGh6w~|@(pvzqw?QiCV3?fQ*?-bM^mrv z(G?NJH5EPNn^twZM{-1*(4eF1GQZ8W$2hA(8*%Ue@(f(LxV(2EH7i&3NI98{{*ICj zPZ?5T3r>a7*2D!NbYm7aK%T?@Eapb~|0$SgmaLiKh|-p1VQ{30da@NDhgHWDNoIzAcvww6kDLHv`JYjI;QR)Jv07l6)B5n!mC>sT11EId3WH&*Eoa%nP z2B$OV|G^>$yNAWFX+b~-K}bMwIDxngu~O!Id2)V*=7t5d?AoDUEZB4Zm_vdb&Lom@ zy~vRvVz7Y-FgWnNr^A`^^+)+JSO3V6uT333TI(fdy_N|KNlBy#j8{2o3bRVHOc z_?b0A66i!2>KCbV37;zJ;Q5$Vf$v4|`_suD3@I8};*s49!f#BUum~}lAMn>}w7mB7 z?ou4+h$ewdBQF4sIDSU9r2l9ry}(Ww0R-tCU6(j*AtEdvn1OK%Lpe0x2ByRA3e}** z5_m2!ByrM0n#mgY zcM6970wFEC9h5C{g@@LWNahjh^LSN(EuZ_zX{_m60~4H)U+9tL%2o$eimGpdFYo%- zb48AbW7xcTa_{q=JP(3)tc~z;{={6c8P8e_lG`UgKI$RAc~7}IiajF66dj`!d~K({JW zG9|d`956}iSgJbft(_DHZ%U0Y9DKn&kH8KA@NR8|v>hB-l(pcJl>c*qZENBc-&| z8tUCe-}EGJYj<+xrUak%5g1>iGK}bSC%xO<^zU&26B?*oW?~`yXkg^#cD$K8y%j_A z-NsUiPtRp+jrf`H*yhonUD1^`u`o_ZA1mFgy0VYx@4m(jcS8|+7aTH?DT>3-V^lr} zX@8s&`qgo*=24R}R7nqx$&~SC;PQ4cw4C#NyECQGx^5g^Q+n7`AUkd2+s(b+@qQ5~ z1Iay!K3F>tg>jHG`S@kD*>&4*brtx@IStb_iGIS9+nbJ_z-d3Sa_~Wwg0`i>x$N0g zMxA4>GW;WEvLydX1bVK>3>a5cZykL1igk2-j&#Fya;^V-8ZY+K=wliF)2sQbVexH* zFXL_E<>}~3Ku`DO;tw92HFXdB*WB&)z9Tq`hXI_&3injjMDY(j=!V0F+M-qZ@TL6Y z&0)E0vh&#A9MHbD0fC|=_Ft4OKx?LNzR@xLP1e9xnCoZPf1(Mt`Yt%dESCC?D9;;E zc|upFPMF=;E?!-nptD)Jw}Ot(mX3r??CeD`ey8@daPXaTLq?uvGyOFTUT^~d(cK}oYhwOUqFUF-x2Wg=Iuy{ zh_Z)*#U_SUaSF`_=37NI+lf==tV|k~YTwinMYs7AEO)L*_&bd5x-q7v8zW7_B8>&L zXSJEnlH;tYfe+^}xqIN&b%2^!))_@#QUT~$ZYp6w4`W9q-y7l zKER$A&szYJuIo>-$GcyhktZoJX@!sVPcgZxh0zESt?e8^1vyZyA2}gy@1qm0MW>o3 zS)_(ZbF~_1>VZ<~M94c6{G4%h)WN`~1E)iH0$F$3UU+~2vzlwL0i#*my7iZncV2{Q zU#VC4U}`dQ_E`(BQnvy3?SZafRuJi*j$c&4qr6R6t7m28HV<@OtyTXed7G*`*+cgf_3`HaJe2t5RzZI_@>^ZCr*H8@^Z{cPV@{Tn!i( zYR=Jo`PRoosGTC*QN`t4vC(eQZ(CH`4{nd-v(#~FoR$@U)I*jlV8qs3%7$oa0Lapo z>E+tgFH#$z)JtWPTI%@rEA2)5e-|mnqavLE3Lj(!!)Cf=vAQFE81{8fIxDv|=_AEI z=kn8poBAo30ULDx!+Z||^N9(;jX7%C2Er?d!+%DXi;4*k$WDr0iXf0)nF$Qd1m&Cr zhlvb)awi5o5Il$pWq#PPwHIr;PA`XGI$SNTb;uk-lG<)UFI_M=psyeqS{Pacg4b?j zM%iWQb>Y)WG7l!qFysL2JlQ{JNFADVhgldT`qzn`LK^HZNd;PSyC5?2DMYmIoCNVF zUz0K$m`s0WVNQFwc_}A=4dfBI5_ukW@@qPQI=LVLIpd0XDXD0morauwW88}9FEtm& z^S`p@QURm@Y>j#Ha5%DfP115=5?N{@^Qwh85Tp=O*p<)RaOPWL=f#IiqhY6iR4@}1 z3?S85`MZJvLFHn)_|uFsTTMsOg>0-JJ*(fqfL!&2jq-IXL_}OvZdfvlWPYFoaq1YQ zg!);X!{JnCb)(z2vx}p2ze3Bf2?CW^e{q*qH1c<{N&XIlA@K1m(3~LRZ8NenXLP+x ziS}9yyq{9t{#dK7n_y%vn8ZqWiDtHNXu`NPg7U9__&RrOqwv3co${p{<0aa6r~VCN zk^$|%FtTj9S%B=U;KyJnwDsGl|7VOO?4y(t?q|XOj`78#Qsb|o`kj!o%q)T`er!Ua zM9$7?2S)Wq_crVM?&(!r7z-H^?C50PHfsZ->~34@hPYKA!NuAFAc(#Zh)h zN2ISeN3?7PfEEx(6iO6o@X8vDU%`YZ0Z4(P^PJH30?HP3*kJ<$JHz#wpaGG&ppXy- zW&#DooT$YL;{MJ98oCY%fXxs z0)-18IRH5UE(+m6n35Mti(Brb+H<+=5sIWHG#bua8T=Cf4DMp)Urf=_7zBVf$;XG8 zTkxq4Va}%t#IHLyTKRTPLpt24;&3$PiQmB=r9u7<{seSLyqUrg!L=%ugqwV--kq09YdO|F=;(vH`sB;TEtGCr=R?|2 zD0B6q5>E8tAWZ5c6qY1slK9_d0A3A2ev2UKU>l;xQIN^f0GIYi3oc$FFR>D92f`$3KO%m zvZLr=KtB!KIb=gGO&|u;k5L7fgMW_|x{QK&M%+>_!@kMMjRMOR*`!3eerftF*+0US zi13c^8bpnfM^0ma@S<+&cQHep1f>t*jkKZWQt=N82*A*oB?^Nlj8Z2k{bH2(%RgDh zw3af~mFZd0(JBOihT}Z{N1yaK^t}I~6aiWy`cB_Zlpx0dNuqW}2&4&_;g5b~4eY_d z@PpZ3-%(;O+W?a%q3G#EfaFdO5282Ye`_P152J;RGV1#W`}goK4GP0iStauaB#Kg@ zEt^Q^KO7gQ&TNW4+7SH=1KCZ)51~4Y`}Y4X_)mfUZ^%#Xe)e7;l|WBcH*j*yB7^9s z8NdPc11cuke|uU#XGQ1*y_DD-cVL^MNxue|(+Lgg?2FSE!$ z6^j0x#glkeula+UHh_?rh&5X8T3qAs z7Y~?pJm`Fz`d=_%Gll+|P)FBk>BFe28W60xvNWi{_fiSk06UEFTOl;!{6yb3^|HT5 zXxu7J>6e291x0_|Lmz{@Gd($g{A8`oP)1G=sL1BclPutTnLE@E2ozw>I(~z=piBU5 z{)bucehescb-1_Z*6pYkbs&Tb7K1k@P8lkn+M`Jkd3g%pZCcOXR9_pB3KsYfg{Twyw2Lcx-H3ZBX@(-m1}O+?V*! z4V`z-O;cm0wq68u(KqwgcQKC@8C$;9KJpLO(|uyHP_;KXt~srXK5Zw%Te?qOyHZ1Q z7q-0I?=>?c!Lf8c4sOoij?3L93_aIRl{qGl4Oqn%0Q%W9)6)^_LoE?_DAG4PPj@yq z5pO>0RUfsjs@xp|r_#C)c_#2*?q|a`3%M1RmAT8ZaJYCM`{#j`<0e+#7z_=2Lwl0; zTAgxQbk*%O6GL~GZ{-7YoSWX`HCJ+4QCB-;WFxxmUz6MAw%FXf?!_H#LSOc_F^^;J z>uhS&#jVe$P20L(Ppe$;cc0VyaTusGZQ{Ci47#+{Z8<5Km@^$o6%DjvHVdDp za-L!>u|AF$dwn@xA3UqIX%?BvX07}Drpa$`_r*B1B~R!llNK{$3r-gvl9vp#$78kY zi9rD#P`Uz`U+{MK4W_aFHe~zThAW1->*ke{iaca#hq%C5IW5QhE!v?(4zd2zm5&p_ zEJV|TGv2pDJ>09kQK)AJ5@6A955q6R)DfCP88$9GrzX!Ad--oZ6CYo1Ls&L3J-a@y zNuFG-vo30Urg)iM?`c@7pLY*@=hvm@ROm$^u0IVI&2e z&N&Q07y)rD12S)c=YxTVjGz>pAheesMC=B^0HQ;%KLR{wAm#d;XmA-p5O*MQlj%c# zbG>6+>u6i^;jG;E!AiGJ9zF_vtc;lg=@MVCI@9r5 z;G>$?WcZn-^1;`c!O~HyZqyas%QTZ>rzLohGDAScvz_maCbOnLV9BW~2_i`UDE>q> z=|t3{D;rqOybifP?j7+AL|%-^K{ZrzD%9=0^Xxfnxd4BksKtJ~sCUaK3Q}f}Y$G z%GMC8*rX14iOcKXa~2TJ_g~4){x6#SKPLBI1pe>H&GD~R|4D9UHZ~51f4&F&HlvJ8 zEUf<*wx4&pXKE>@@p(=2xNbjrTAr=7CvR0eIn7I`J~9&%n@|AdN%$e~CsX6U{j^gW zOp1aYhyQ^MIv9;E4zYv8QZLR72uum`Yp(Xx$S5&~C`O`ZrcHVC6oBb2^N&Ok?`vT91YVS=T#HQ!M5L$N2XDFN1h3H8iuba<~0ejyL z(@eM-=QC1T_qLV+(r%$LK9`?8G&k0dLh!%eiE zx5+{>G@E^B@@3#YUGEK?8oKaEWE}KkseV4aeUxwYlh$$7cc)BWQEJd6xhIJ*7K9NeNy+*f{{g&hWNwG35XYBiA9p=-7K?8AHiOwwsu#i?aR9!wu;7-_a963G*i>UQ%M z91Nxhm6<7#$Bb=W)p3>+&PQO5OpcKbk&Y9N$A`4z)|1|>uAY~d8}PR-cO+A;C^B?f z>a9)JtNkg^@F?A?Zk^Xk`o6n|gu00li+h>VPp&?-cgfSSu3PIb58vqm@9c}*aX}W} z#cM278AwvGq}1U;5}op=7RTJ?{KEXg=3Ua3rf1LZx5KTjF1{=8;-}T_U~kn&UvqxE zF!*30RTvy}PVSF!3{x0g2CqVmj4qeUoekURkLeAxW1behn}9piBeZ7fPWxRlQM4Ex zzE{@*JoGO2`096s0g!yEfQ9VgW->UtbHPr4dA3`b+5 zKwskBg55$sFsSrI(ClgS36n;Qptbz)YI4HJCOLcpLc|6>x>UvLQ z7y$mD-thyS_nrD`a>{qee;PaqPa>P#@Gkm@7mX<8d3c; z-_Uv48}A}(&T0J`Y?1Xk8)TF9+83WV7+9J3dvhBJqLECcM)zy6;g@*5G-3`vrS<#r65|t1u72b)Zh(U`T*w)Q{ z*ivJXT zEj|cM_z{G}C!@4yI#e7g>rt_3{P@sp;J8F^S6Vm5uGu5hBb`(7RK`|bQWp8!{f|~t zely@+tOQRjZ5SVFhYN0052o+!?b!^+KDNnJg{6(=T{w$s^=iGzT{_j0R_9SZ3z~ze zeMMW+29yoQ6Yi~cMC&uD$&znmcnNoE4ios+!#i$RR8GH(?*4N)#mvWvcJ=m6_0{d- z*Qyz2P5Z0%w6&QPAH)RBm)MoV%~!N+Hfk04=W$Jt>P;Zm`=9|Am3a$yD(F~~$=ir+!=ep>2@Lhiq#pi09eOQSU8s4RpoN`am8X_W*v zOTi!Vd4I=(&Eltrgv>fI1H%@inW16|C^KVC2{_JiGvm?lL(dU1N5}}36bzX`astzc zOw4-DIy3@R30KI$W`(O1G|aA=!E%B}=Q$FHR0|yw6b~;xr^_MFy|9##7C_IwrYk5~ zYDm{$ur!$DLC=MxYdc!lOjW#`}mT4%`XixmEZ_=XCwXFVOF{DwZ zQr+}h!_vCxQA4b%VM)2-ce^D|)0T#A6`r;hRw?XK@nVR@f+ds1KvUWY(*4$2<(fDw zKm}_FE1Gr$tx(GHQ6AOo@Y?%Yz*_$rVI!n3#&vrUnTn6N}@eC4+2kbuRc4JLJ<|bFIG3Lcw-b zZ<|H5Yr}(6<1AhvBw19 zitf%o6%{_s7Te{zl^!mOfWPo1ZrLT`$;20)zrLQo?t#65*>6bIR&J2@Lw8fbmEr&q zo%n&V;(EbR!hnI8=a{}u@9c)Y`b=5+wiEpLC7un3eZl3opwVxH+e=0p}cu8Rka%&ptZ5oldCEwqDE+Mu#AzaUX*55u!O0F~d5lwX{|U9Zbc{V714 zZ?hsSQS4PO#*UAT80IG*Rcn`Kq9ME)eG~YTP=;T;8Z%OplHk{2z4os7XwXEf^aiU9 z*NB6*AzcipkhW*XV}86I`sYPnUbP;&3>+J461<}cy%#t7r=2&lIT_sn_}xd>+&q;26(fA*;VLqB*5($B)p zRA2sm15}15oDn8h}Y&wgmxv+Np2m|~#kOA0& z+S*F40_ODe!LR`XydwdsrL|g+*?IgfU8QTTY_2)A$X5q0(0qM-yFQffO7Wse@}|sc zryG+SlUsy7KO((bV>1XQ<&O4WHcIhxS1IA*VU20vHGepY_j4Xt20Uc_Fih)1*ESr{ z;RYj=JH1(1S<#Dm(&}jmrBp~IR8)4w-mLw(U@HmgL+Pxm=~&m)w6fu1Yie0GzdAoJ z(v$(zTnqTe5^u_j{OalX&f8!yl)nud0TS^M^d|-A@S0G*wme%|)EY~(>y>@&(ammr z;2b;HDSEH*>nXn;@r#+Qol^3FyhJklbh1+5=8e1jfxCPsT!aHdeKlB44bchV#;8}~3*jBfrOVy=B+rs-W#|T;#*CU6H4*iZRT8&?sys`^G*-A%J{7|+ zwRE+NmDH8=Ru+5Hz0W~-q(5#zWWU-rQ#UbCyS%_IhF{_6;HS-0jEVFQro2dGZ?z5I z;BeXCak$LBcX;)za66eDtnhjW7YP~$;!76l&6@c{xPWG(mHKrFcKhl9*cnYSD@*OL z>zLK|^UEumGYTnSWaI4vjWF^Vaivd2Qjb99ABQ$$QjT%goLQ$QI#rU+1|bqWxcaGk z*K523eEPk`|2C!4mE}=$pZ*g0vfbQnn#i&;6)QetJgzUMO2f(s>Rz$IRw?=!Hc*?8 zxWETc38gMa^ zyp}I)`M4wUe0o0k;-@lET1Dy7sGW$OKqXUy&CZqeoDPZ#dM4C1uf+(Z}Dw=paGT)#jtaZ>E;+ zvJ7Kq@qres&8e0%`CRP0X}Ab^xUcxO9zwno9Wfl1(9Cx|>m1o!@P2JEwn(fSd5gbc zcT4YsrTX7`nSeS14m1&B8Bla9Dqqx=F>3;y3SILciI9fYuasIalbTas%GyEtu;q?? z4C@2bs$fRK8+S&uOcLoVuiSKn4(sqTyJQ+@Y(B)W^uy!+{*a;E$@)`v#kOImhkt<) zVqO-J0N0fW3=lU@6LZWy8L2Yr8JS-1lW=A!Fl;T^l*rj3Z3h=)s1|ZK@0~7+I0o`z z1@?6<-&D>yN*^61uti@hU>)5%Er%5t#0?N$UEY#EVApl3qBUG}iUt-dD*6ZzcOHl` zkb{I72#aj6hvYEq4rDJ|NJ zZBIm7e3wplpSSMiaK4&&Oc;|x$s1KF!;PS*n-2HNv{#d1%e~&nOrfsSjB_V#*F1rT zf><&OQqff)4Ki#7W-k}gY6oYt>-j1BtbJkNnVja6RA>>OxbW?B?TdUR(93>ZyHJzn zDc~Tv3f`Z3sz=6*6%^wb+1$xl^vdB7LPt#(dXP4B+nAp`F7qoS+3=(fD%_xIlE|sZ zFffDM3w8Z+iz;NmHDip*&Fv?`OEtPUe+^{-^W!dDR zC8yaHjUXW;&%t1+5JRUNOu$y+2v5&muc z2k;?G((FLIAxX5^RDf^QL zpLn@GrM(9=hROKQl7O;_KSdq(aO*}H8u7XnIN;7k`iw4TY&z$rgZ7(6_z;?ou?1CuM%z1kl3JvhbW39ODYto70-fri14 z9p5SXY+I#uum^ZzUahvxo-Q}toA|xh2i=nyju{f2C0%hXbA;?yI~z%f;=#p4e4L&omOT}i<(yMKCX_luz+PM)_; zso$QO`|2Cc!?c;?RiyK(77s$ZJU?`?YA~$&XrFmpVtu>4aqiqNm-9+B6D?D7k}i{7 zB>CdAlXQ~ZBo2GPv$4bkgvZ;;^DIbPsT|q;;Q`(p0FNp((kn?ON$aDn$by`rtpRH` zI}i2F^&o6K?Tp;uiHAi0WY9A?kMWbU25@uky}XQBbxX|Vjq3ZAbrhqu`eOieh|^c$ z4B^HQTtw}=96?q23w45s53z6y1V`+ISlB>3Rp1Tb$=Sl;s`{LMQli-E*~sx;_;7Zv zcTjn4Ap1Rz>sf*?aMXdE5Bc2_#_{uG?5>((SRDd6hcqEu=*P=Hy#r08`ppVCu?%8 zyJ>g|Dg!8N0w^@)c2vAtzw*4&elUD+d>CiRdZQf!@C)t`wUsARC_zs^70S(`gA3Al zU8^8xU>=xj2rCMk@^_+WQ3Zt0hr((x3=^r< z>q^yYsT8xMWge=f*}6F}83F}XN;0x#DKE;)L5B3zpBT)F`+?BR?!f%(davL1F}_Zrv%xMW*?z$x>*LuIaaogX1�H(BXpb?XbhHw5<&bGF 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 W;)mN>J}6vW4Yo%{#=ydG&;I}zoyDX8 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 451899ce41d1701d7d5bb9c4b4edf2c47ebd4f83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85885 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 f*PUIAoLtflying-saucer-pdf-itext5 9.0.3 + + + com.itextpdf + html2pdf + 2.0.2 + From 4b3d48e297510e2a289306a1a00336de59793938 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?niohe=C2=B7erbao?= Date: Fri, 17 Mar 2023 09:10:18 +0800 Subject: [PATCH 2/6] =?UTF-8?q?IRS=20=E7=AD=BE=E7=AB=A0=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E8=B4=A6=E5=8F=B7=E5=AF=86=E7=A0=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ningdatech/pmapi/irs/sign/IRSAPIRequest.java | 29 +++++++--------------- pmapi/src/main/resources/application-dev.yml | 3 ++- 2 files changed, 11 insertions(+), 21 deletions(-) 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 8abf904..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,6 +1,7 @@ package com.ningdatech.pmapi.irs.sign; 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; @@ -29,18 +30,6 @@ 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 { @@ -91,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); @@ -111,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"); @@ -150,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); @@ -168,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); 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 From 0a46415f17e97915374b97cdad2b77721f7efe9b Mon Sep 17 00:00:00 2001 From: CMM <2198256324@qq.com> Date: Fri, 17 Mar 2023 09:21:28 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=BA=93=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E8=AF=A6=E6=83=85=E8=BF=94=E5=9B=9E=E9=A2=84=E5=AE=A1?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E5=8D=95=E6=96=87=E4=BB=B6=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ningdatech/pmapi/projectlib/model/vo/ProjectDetailVO.java | 6 ++++++ 1 file changed, 6 insertions(+) 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)) From 20f4a05ee53db8ec4a401d749e8a5e78300cbd0c Mon Sep 17 00:00:00 2001 From: PoffyZhang <99775271@qq.com> Date: Fri, 17 Mar 2023 09:58:12 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=87=91=E9=A2=9D=20?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/DefaultDeclaredProjectManage.java | 23 ++++++++++++---------- .../task/CheckProvincialReviewResultTask.java | 6 +++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DefaultDeclaredProjectManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DefaultDeclaredProjectManage.java index 34ad67b..b225a2b 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DefaultDeclaredProjectManage.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DefaultDeclaredProjectManage.java @@ -86,16 +86,19 @@ public class DefaultDeclaredProjectManage { VUtils.isTrue(declareAmount.compareTo(totalAmount) != 0) .throwMessage(String.format("申报失败! 申报总金额【{}】 不等于其它申报金额 【{}】",declareAmount,totalAmount)); - BigDecimal annualPlanAmount = projectInfo.getAnnualPlanAmount(); - BigDecimal annualGovSuperAmount = projectInfo.getAnnualPlanGovSuperiorFinanceAmount(); - BigDecimal annualOwnSuperAmount = projectInfo.getAnnualPlanGovOwnFinanceAmount(); - BigDecimal annualBankLendingAmount = projectInfo.getAnnualPlanBankLendingAmount(); - BigDecimal annualHaveAmount = projectInfo.getAnnualPlanHaveAmount(); - BigDecimal anualOtherAmount = projectInfo.getAnnualPlanOtherAmount(); - BigDecimal totalAnnual = annualGovSuperAmount - .add(annualOwnSuperAmount).add(annualBankLendingAmount).add(annualHaveAmount).add(anualOtherAmount); - VUtils.isTrue(annualPlanAmount.compareTo(totalAnnual) != 0) - .throwMessage(String.format("申报失败! 年度支付总金额【{}】 不等于其它年度支付金额 【{}】",annualPlanAmount,totalAnnual)); + //判断 年度计划金额 如果开着的话 + if(projectInfo.getIsAnnualPlanAmount()){ + BigDecimal annualPlanAmount = projectInfo.getAnnualPlanAmount(); + BigDecimal annualGovSuperAmount = projectInfo.getAnnualPlanGovSuperiorFinanceAmount(); + BigDecimal annualOwnSuperAmount = projectInfo.getAnnualPlanGovOwnFinanceAmount(); + BigDecimal annualBankLendingAmount = projectInfo.getAnnualPlanBankLendingAmount(); + BigDecimal annualHaveAmount = projectInfo.getAnnualPlanHaveAmount(); + BigDecimal anualOtherAmount = projectInfo.getAnnualPlanOtherAmount(); + BigDecimal totalAnnual = annualGovSuperAmount + .add(annualOwnSuperAmount).add(annualBankLendingAmount).add(annualHaveAmount).add(anualOtherAmount); + VUtils.isTrue(annualPlanAmount.compareTo(totalAnnual) != 0) + .throwMessage(String.format("申报失败! 年度支付总金额【{}】 不等于其它年度支付金额 【{}】",annualPlanAmount,totalAnnual)); + } } public ProcessInstanceUserDto buildUser(Long userId){ diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CheckProvincialReviewResultTask.java b/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CheckProvincialReviewResultTask.java index 3542bbe..b10e960 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CheckProvincialReviewResultTask.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/scheduler/task/CheckProvincialReviewResultTask.java @@ -39,14 +39,14 @@ public class CheckProvincialReviewResultTask { private final IProjectService projectService; private final StateMachineUtils stateMachineUtils; - @Scheduled(cron = "0 */5 * * * ?") + @Scheduled(cron = "0 */1 * * * ?") public void statusFlow() throws UnknownHostException { //测试暂时用自己电脑HOST if (TaskContant.Host.HOST_ZPF.equals(InetAddress.getLocalHost().getHostName())) { //1. 定时取 省级部门联审中的项目 去取项目 List projectList = projectService.list(Wrappers.lambdaQuery(Project.class) - .eq(Project::getStage, ProjectStatusEnum.NOT_APPROVED) - .eq(Project::getStatus, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS) + .eq(Project::getStage, ProjectStatusEnum.NOT_APPROVED.getCode()) + .eq(Project::getStatus, ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode()) .orderByAsc(Project::getCreateOn)); log.info("需要去查询省级联审结果的项目 size:{}",projectList.size()); From 75f9aa8f348586a4250f7375d1941560c27b2018 Mon Sep 17 00:00:00 2001 From: PoffyZhang <99775271@qq.com> Date: Fri, 17 Mar 2023 10:41:59 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=87=91=E9=A2=9D=20?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ningdatech/pmapi/provincial/model/res/ProcessCommentRes.java | 4 ++++ .../pmapi/provincial/model/res/ProvincialApplicationRes.java | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProcessCommentRes.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProcessCommentRes.java index 44bd830..a7486f6 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProcessCommentRes.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProcessCommentRes.java @@ -2,8 +2,10 @@ package com.ningdatech.pmapi.provincial.model.res; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; /** * @Classname ProcessCommentDTO @@ -14,6 +16,8 @@ import lombok.Data; @Data @Builder @ApiModel(value = "ProcessCommentRes", description = "省局返回流程审核详情") +@AllArgsConstructor +@NoArgsConstructor public class ProcessCommentRes { @ApiModelProperty("任务id") diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProvincialApplicationRes.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProvincialApplicationRes.java index ae67383..a505ec8 100644 --- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProvincialApplicationRes.java +++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/res/ProvincialApplicationRes.java @@ -2,8 +2,10 @@ package com.ningdatech.pmapi.provincial.model.res; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import io.swagger.annotations.ApiModel; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.List; @@ -17,6 +19,8 @@ import java.util.List; @Data @Builder @ApiModel(value = "ProvincialApplicationRes", description = "") +@NoArgsConstructor +@AllArgsConstructor public class ProvincialApplicationRes implements Serializable { @@ -89,6 +93,8 @@ public class ProvincialApplicationRes implements Serializable { @Builder @JsonIgnoreProperties(value = { "handler"}) + @NoArgsConstructor + @AllArgsConstructor public static class Cloud implements Serializable { //云资源台数 11 private Integer cloudNums; From 13fd6bd3eee1a3c42798d9c645f5274c8a1ffcd3 Mon Sep 17 00:00:00 2001 From: CMM <2198256324@qq.com> Date: Fri, 17 Mar 2023 11:05:57 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E7=9B=96=E7=AB=A0=E5=90=8E=E6=96=87=E4=BB=B6=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TodoCenterController.java | 7 +++ .../pmapi/todocenter/manage/TodoCenterManage.java | 73 +++++++++------------- .../pmapi/todocenter/model/dto/SealInfoDTO.java | 37 +++++++++++ 3 files changed, 75 insertions(+), 42 deletions(-) create mode 100644 pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SealInfoDTO.java 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 8ed108a..8e40dc2 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 @@ -6,6 +6,7 @@ import javax.validation.Valid; import com.ningdatech.pmapi.projectdeclared.model.dto.DefaultDeclaredDTO; import com.ningdatech.pmapi.todocenter.model.dto.AdjustHandleDTO; +import com.ningdatech.pmapi.todocenter.model.dto.SealInfoDTO; import com.ningdatech.pmapi.todocenter.model.vo.ProcessProgressDetailVo; import com.ningdatech.pmapi.todocenter.model.req.ProcessDetailReq; import com.ningdatech.pmapi.todocenter.model.req.ToBeProcessedExportReq; @@ -175,4 +176,10 @@ public class TodoCenterController { public Long getNotSealedPdf (@Valid @PathVariable("projectId") Long projectId){ return todoCenterManage.getNotSealedPdf(projectId); } + + @ApiOperation("获取签章后的pdf文件") + @PostMapping("/getSealedPdf") + public Long getSealedPdf(@Valid @RequestBody SealInfoDTO req){ + return todoCenterManage.getSealedPdf(req); + } } 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 84e9dac..77437a1 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 @@ -47,6 +47,7 @@ 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.SealInfoDTO; import com.ningdatech.pmapi.todocenter.model.dto.SignReqDTO; import com.ningdatech.pmapi.todocenter.model.vo.ProcessProgressDetailVo; import com.ningdatech.pmapi.todocenter.enumeration.IsAppendProjectEnum; @@ -64,7 +65,6 @@ 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.dto.SealPositionInfoDTO; import com.wflow.workflow.bean.process.ProgressNode; import com.wflow.workflow.bean.process.enums.NodeTypeEnum; import com.wflow.workflow.bean.vo.ProcessInstanceVo; @@ -268,10 +268,6 @@ public class TodoCenterManage { 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) @@ -426,16 +422,16 @@ public class TodoCenterManage { /** * 调用IRS接口,获取盖章后的pdf文件,上传到OSS,并保存文件ID到项目库中 - * @param param + * @param req * @param declaredProject * @return void * @author CMM * @since 2023/03/16 21:34 */ - private void getSignPdf(ReqProcessHandlerDTO param, Project declaredProject) { - Long projectId = param.getProjectId(); + private Long getSealedPdf(SealInfoDTO req, Project declaredProject) { + Long projectId = req.getProjectId(); // 设置pdf模板参数 - JSONObject paramsMap = assemblyPdfParams(projectId); + JSONObject paramsMap = assemblyPdfParams(declaredProject); // TODO 根据当前盖章单位设置对应的盖章意见与盖章日期 paramsMap.put("superOrgOpinion",null); paramsMap.put("superOrgAuditDate",null); @@ -450,26 +446,24 @@ public class TodoCenterManage { InputStream fileInputStream = fileService.getFileInputStream(pdfFile); String pdfEncode64 = Base64.encode(fileInputStream); // 装配盖章接口请求参数信息 - SignReqDTO req = new SignReqDTO(); - req.setPdfEncode64(pdfEncode64); + SignReqDTO signReq = new SignReqDTO(); + signReq.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); + signReq.setFileName(originalFileName); + Float posX = req.getPosX(); + Float posY = req.getPosY(); + signReq.setPosX(posX); + signReq.setPosY(posY); + // 获取当前登录签章用户信息 + Long userId = LoginUserUtil.getUserId(); + UserFullInfoDTO userFullInfo = userInfoHelper.getUserFullInfo(userId); // 获取印章编号 CompanySignature companySignature = companySignatureService.getOne(Wrappers.lambdaQuery(CompanySignature.class) .eq(CompanySignature::getOrganizationCode, userFullInfo.getOrganizationCode())); String sealSn = companySignature.getSealSn(); - req.setSealSn(sealSn); - + signReq.setSealSn(sealSn); // 调用盖章接口,获取盖章后返回的pdf文件字符数组 - byte[] signPdf = IRSAPIRequest.createSignPdf(req); + byte[] signPdf = IRSAPIRequest.createSignPdf(signReq); // 转换成MultipartFile MultipartFile multipartFile = new MockMultipartFile("file", originalFileName + ".pdf", "application/pdf", signPdf); // 上传OSS @@ -479,6 +473,7 @@ public class TodoCenterManage { declaredProject.setPretrialFileName(resultVo.getOriginalFileName()); declaredProject.setUpdateOn(LocalDateTime.now()); projectService.updateById(declaredProject); + return resultVo.getId(); } @@ -1023,7 +1018,8 @@ public class TodoCenterManage { */ public Long getNotSealedPdf(Long projectId) { // 设置pdf模板参数 - JSONObject paramsMap = assemblyPdfParams(projectId); + Project project = projectService.getById(projectId); + JSONObject paramsMap = assemblyPdfParams(project); paramsMap.put("superOrgOpinion",null); paramsMap.put("superOrgAuditDate",null); paramsMap.put("higherOrgOpinion",null); @@ -1053,11 +1049,9 @@ public class TodoCenterManage { project.setPretrialFileName(resultVO.getOriginalFileName()); project.setUpdateOn(LocalDateTime.now()); projectService.updateById(project); - - try { if (null != htmlInputStream) { - htmlInputStream.close(); + htmlInputStream.close(); } // 删除输出文件夹下的临时文件 @@ -1076,34 +1070,23 @@ public class TodoCenterManage { /** * 装配pdf模板参数 - * @param projectId 申报项目ID + * @param project 申报项目ID * @return com.alibaba.fastjson.JSONObject * @author CMM * @since 2023/03/16 22:28 */ - private JSONObject assemblyPdfParams(Long projectId) { + private JSONObject assemblyPdfParams(Project project) { // 获取本地目录的pdf模板 String fileName = "预审申请单"; + Long projectId = project.getId(); // 获取表单数据 - 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); - } + paramsMap.put("projectNo", projectId); // 获取预审申报的开始时间 ProjectInst projectInst = projectInstService.getOne(Wrappers.lambdaQuery(ProjectInst.class) .eq(ProjectInst::getProjectId, projectId) @@ -1151,4 +1134,10 @@ public class TodoCenterManage { paramsMap.put("bigDataBureauName",null); return paramsMap; } + + public Long getSealedPdf(SealInfoDTO req) { + Long projectId = req.getProjectId(); + Project declaredProject = projectService.getById(projectId); + return getSealedPdf(req, declaredProject); + } } diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SealInfoDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SealInfoDTO.java new file mode 100644 index 0000000..0cde7b7 --- /dev/null +++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/SealInfoDTO.java @@ -0,0 +1,37 @@ +package com.ningdatech.pmapi.todocenter.model.dto; + +import lombok.Data; + +/** + * 调用天印外部接口签章所需信息 + * + * @author CMM + * @since 2023/03/16 17:01 + */ +@Data +public class SealInfoDTO { + + /** + * 项目ID + */ + private Long projectId; + /** + * 印章x坐标 + */ + private Float posX; + /** + * 印章y坐标 + */ + private Float posY; + + /** + * 页码 + */ + private String posPage; + + /** + * 签署类型 + */ + private Integer signType; + +}