getChildOrganizationList(@RequestParam(value = "parentCode", required = false) String parentCode) {
+ return govBusinessStripManage.getChildOrganizationList(parentCode);
+ }
+
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/organization/entity/GovBusinessStrip.java b/pmapi/src/main/java/com/ningdatech/pmapi/organization/entity/GovBusinessStrip.java
index 4309dff..60ff77d 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/organization/entity/GovBusinessStrip.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/organization/entity/GovBusinessStrip.java
@@ -5,7 +5,6 @@ import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
-import java.time.LocalDateTime;
/**
*
@@ -24,14 +23,6 @@ public class GovBusinessStrip implements Serializable {
private Long id;
- private LocalDateTime createOn;
-
- private LocalDateTime updateOn;
-
- private Long createBy;
-
- private Long updateBy;
-
/**
* 条线code
*/
@@ -41,4 +32,14 @@ public class GovBusinessStrip implements Serializable {
* 条线名称
*/
private String businessStripName;
+
+ /**
+ * 父级条线code
+ */
+ private String parentCode;
+
+ /**
+ * 父级条线名称
+ */
+ private String parentName;
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/organization/manage/GovBusinessStripManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/organization/manage/GovBusinessStripManage.java
new file mode 100644
index 0000000..078b653
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/organization/manage/GovBusinessStripManage.java
@@ -0,0 +1,42 @@
+package com.ningdatech.pmapi.organization.manage;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ningdatech.pmapi.organization.entity.GovBusinessStrip;
+import com.ningdatech.pmapi.organization.model.vo.GovBusinessStripTreeVO;
+import com.ningdatech.pmapi.organization.service.IGovBusinessStripService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author liuxinxin
+ * @date 2023/3/14 下午4:48
+ */
+
+@Component
+@RequiredArgsConstructor
+public class GovBusinessStripManage {
+
+ private final IGovBusinessStripService iGovBusinessStripService;
+
+
+ public List getChildOrganizationList(String parentCode) {
+ if (Objects.isNull(parentCode)) {
+ parentCode = "-1";
+ }
+ List govBusinessStripList = iGovBusinessStripService.list(Wrappers.lambdaQuery(GovBusinessStrip.class)
+ .eq(GovBusinessStrip::getParentCode, parentCode));
+
+ return govBusinessStripList.stream().map(r -> {
+ GovBusinessStripTreeVO govBusinessStripTreeVO = new GovBusinessStripTreeVO();
+ govBusinessStripTreeVO.setBusinessStripCode(r.getBusinessStripCode());
+ govBusinessStripTreeVO.setBusinessStripName(r.getBusinessStripName());
+ govBusinessStripTreeVO.setParentCode(r.getParentCode());
+ govBusinessStripTreeVO.setParentName(r.getParentName());
+ return govBusinessStripTreeVO;
+ }).collect(Collectors.toList());
+ }
+}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/organization/model/vo/GovBusinessStripTreeVO.java b/pmapi/src/main/java/com/ningdatech/pmapi/organization/model/vo/GovBusinessStripTreeVO.java
new file mode 100644
index 0000000..c3e50bb
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/organization/model/vo/GovBusinessStripTreeVO.java
@@ -0,0 +1,28 @@
+package com.ningdatech.pmapi.organization.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Liuxinxin
+ * @since 2023-03-08
+ */
+@Data
+@ApiModel(value = "条线树形 responseVO", description = "")
+public class GovBusinessStripTreeVO {
+
+ private Long id;
+
+ @ApiModelProperty("条线code")
+ private String businessStripCode;
+
+ @ApiModelProperty("条线名称")
+ private String businessStripName;
+
+ @ApiModelProperty("父级条线code")
+ private String parentCode;
+
+ @ApiModelProperty("父级条线名称")
+ private String parentName;
+}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/converter/ApplicationConverter.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/converter/ApplicationConverter.java
new file mode 100644
index 0000000..741aece
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/converter/ApplicationConverter.java
@@ -0,0 +1,113 @@
+package com.ningdatech.pmapi.projectdeclared.converter;
+
+import cn.hutool.core.collection.CollUtil;
+import com.ningdatech.pmapi.projectlib.model.entity.Project;
+import com.ningdatech.pmapi.projectlib.model.entity.ProjectApplication;
+import com.ningdatech.pmapi.provincial.model.dto.ProvincialApplicationDTO;
+import com.ningdatech.pmapi.provincial.model.dto.ProvincialProjectDTO;
+import org.assertj.core.util.Lists;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Classname ApplicationConverter
+ * @Description
+ * @Date 2023/3/13 17:38
+ * @Author PoffyZhang
+ */
+public class ApplicationConverter {
+
+ public static ProvincialProjectDTO convertProject(Project projectInfo,List applications) {
+ return ProvincialProjectDTO.builder()
+ .regionCode(projectInfo.getAreaCode())
+ .regionName(projectInfo.getArea())
+ .projectName(projectInfo.getProjectName())
+ .projectId(String.valueOf(projectInfo.getId()))
+ .projectType(projectInfo.getProjectType())
+ .totalMoney(projectInfo.getDeclareAmount())
+ .yearBudget(projectInfo.getAnnualPlanAmount())
+ .budgetFrom(projectInfo.getDeclareHaveAmount() + "," +
+ projectInfo.getDeclareGovOwnFinanceAmount() + ","
+ + projectInfo.getDeclareGovSuperiorFinanceAmount())
+ .year(String.valueOf(projectInfo.getProjectYear()))
+ .financialCode(projectInfo.getFinancialCode())
+ .developCode(projectInfo.getDevelopCode())
+ .beginTime(projectInfo.getBeginTime())
+ .endTime(projectInfo.getEndTime())
+ .buildBasis("立项依据")
+ .buildBasisFile(projectInfo.getBuildBasis())
+ .projectSummary(projectInfo.getProjectIntroduction())
+ .responsibleMan(projectInfo.getResponsibleMan())
+ .responsibleManPhone(projectInfo.getResponsibleManMobile())
+ .contactName(projectInfo.getContactName())
+ .contactPhone(projectInfo.getContactPhone())
+ .buildUnit(projectInfo.getBuildOrgName())
+ .buildUnitCode(projectInfo.getBuildOrgCode())
+ .superUnit(projectInfo.getSuperOrg())
+ .superUnitCode(projectInfo.getSuperOrgCode())
+ .projectApplyFile(projectInfo.getProjectPdf())
+ .projectEstimateFile(projectInfo.getCalculationTotalInvestmentFile())
+ .unitThreePlan(projectInfo.getMainResponsibilitiesApplicantFile())
+ .otherFile(projectInfo.getPreliminaryPlanFile())
+ .projectRemark(projectInfo.getProjectRemarks())
+ .includeApplication(projectInfo.getIncludeApplication())
+ .applicationInfo(convertApplications(applications))
+ .build();
+ }
+
+ //放入项目 app
+ private static List convertApplications(List applications) {
+ if(CollUtil.isEmpty(applications)){
+ Collections.emptyList();
+ }
+
+ return applications.stream().map(ApplicationConverter::convertApp).collect(Collectors.toList());
+ }
+
+ private static ProvincialApplicationDTO convertApp(ProjectApplication projectApplication) {
+ return ProvincialApplicationDTO.builder()
+ .clouds(convertCloud(projectApplication))
+ .isFirst(projectApplication.getIsFirst())
+ .applicationName(projectApplication.getApplicationName())
+ .applicationCode(projectApplication.getRelatedExistsApplicationCode())
+ .relatedExistsApplication(projectApplication.getRelatedExistsApplication())
+ .applicationType(2)
+ .buildLevel(projectApplication.getBuildLevel())
+ .isUniteBuild(projectApplication.getIsUniteBuild())
+ .unionBuildKind(projectApplication.getUnionBuildKind())
+ .applicationSummary(projectApplication.getApplicationSummary())
+ .applicationRemark(projectApplication.getApplicationRemark())
+ .applicationEstimateFile(projectApplication.getApplicationEstimateFile())
+ .isFiveDomain(projectApplication.getIsDigitalModification())
+ .fiveDomain(projectApplication.getDigitalModification())
+ .bizDomain(projectApplication.getBizDomain())
+ .isBizCooperate(projectApplication.getIsBizCooperate())
+ .userRange(projectApplication.getUsesRangeRemark())
+ .useGovCloud(projectApplication.getUseGovCloud())
+ .nationalITSpec(projectApplication.getNationalItSpec())
+ .netEnv(String.valueOf(projectApplication.getNetEnv()))
+ .secrecyGrade(projectApplication.getSecrecyGrade())
+ .passwordGrade(projectApplication.getPasswordGrade())
+ .accountAppName(projectApplication.getAccountAppName())
+ .brainAccountAppName(projectApplication.getDomainBrainAccount())
+ .useCommonData(projectApplication.getUseCommonData())
+ .dataName(projectApplication.getDataName())
+ .commonComponents(projectApplication.getCommonComponents())
+ .useCommonComponent(projectApplication.getUseCommonComponent())
+ .isProduceCommonComponent(projectApplication.getProduceCommonComponent())
+ .produceCommonComponent(projectApplication.getProduceCommonComponents())
+ .publishSide(projectApplication.getPublishSide())
+ .build();
+ }
+
+ private static List convertCloud(ProjectApplication projectApplication) {
+ return Lists.newArrayList(ProvincialApplicationDTO.Cloud.builder()
+ .cloudType(projectApplication.getCloudsType())
+ .cloudNums(projectApplication.getCloudsNumber())
+ .cloudBasicSpec(projectApplication.getCloudsFoundationSpecifications())
+ .cloudUseDescription(projectApplication.getCloudsDescription())
+ .build());
+ }
+
+}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ConstructionPlanManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ConstructionPlanManage.java
index cadff84..98ddd0d 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ConstructionPlanManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ConstructionPlanManage.java
@@ -102,7 +102,7 @@ public class ConstructionPlanManage {
VUtils.isTrue(Objects.isNull(projectDto.getId())).throwMessage("提交失败 缺少项目ID!");
Project projectInfo = projectService.getById(projectDto.getId());
VUtils.isTrue(Objects.isNull(projectInfo)).throwMessage("提交失败 此项目不存在!");
- VUtils.isTrue(StringUtils.isBlank(projectInfo.getConstructionPlanFile())).throwMessage("提交失败 请提交建设方案!");
+ VUtils.isTrue(StringUtils.isBlank(projectDto.getConstructionPlanFile())).throwMessage("提交失败 请提交建设方案!");
String regionCode = projectInfo.getAreaCode();
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DeclaredProjectManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DeclaredProjectManage.java
index 621ce1c..1b136ac 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DeclaredProjectManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/DeclaredProjectManage.java
@@ -64,6 +64,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
/**
@@ -375,19 +376,15 @@ public class DeclaredProjectManage {
}
public void exportList(HttpServletResponse response, ProjectListReq param) {
- Long userId = LoginUserUtil.getUserId();
+ UserInfoDetails userInfoDetails = LoginUserUtil.loginUserDetail();
+ Long userId = userInfoDetails.getUserId();
VUtils.isTrue(Objects.isNull(userId)).throwMessage("获取登录用户失败!");
- UserFullInfoDTO userFullInfo = userInfoHelper.getUserFullInfo(userId);
//放入用户的单位
- param.setBuildOrgCode(userFullInfo.getOrganizationCode());
- param.setPageNumber(CommonConst.EXPORT_PAGE_NUMBER);
- param.setPageSize(CommonConst.EXPORT_PAGE_SIZE);
-
+ param.setBuildOrgCode(userInfoDetails.getOrganizationCode());
LambdaQueryWrapper query = ProjectHelper.projectQuery(param);
- Page page = projectService.page(param.page(), query);
- List records = page.getRecords();
-
+ List records = projectService.list(query);
+ AtomicInteger serialNumber = new AtomicInteger(0);
List collect = records.stream().map(r -> {
DeclaredProjectExportDTO exportDTO = new DeclaredProjectExportDTO();
BeanUtils.copyProperties(r, exportDTO);
@@ -395,11 +392,9 @@ public class DeclaredProjectManage {
exportDTO.setStatusName(ProjectStatusEnum.getDesc(r.getStatus()));
String createOnStr = NdDateUtils.format(r.getCreateOn(), "yyyy-MM-dd HH:mm");
exportDTO.setCreateOn(createOnStr);
+ exportDTO.setSerialNumber(serialNumber.incrementAndGet());
return exportDTO;
}).collect(Collectors.toList());
- for (int i = 0; i < collect.size(); i++) {
- collect.get(i).setSerialNumber(i + 1);
- }
String fileName = "项目申报列表";
ExcelDownUtil.setFileName(fileName,response);
//数据导出处理函数
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ProjectAdjustmentManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ProjectAdjustmentManage.java
index 2159c44..1dd6877 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ProjectAdjustmentManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ProjectAdjustmentManage.java
@@ -43,6 +43,7 @@ import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -163,13 +164,9 @@ public class ProjectAdjustmentManage {
req.setBuildOrgCode(userFullInfo.getOrganizationCode());
LambdaQueryWrapper query = ProjectHelper.projectQuery(req);
- Page page = projectService.page(req.page(), query);
-
- req.setPageNumber(CommonConst.EXPORT_PAGE_NUMBER);
- req.setPageSize(CommonConst.EXPORT_PAGE_SIZE);
- List records = page.getRecords();
-
+ List records = projectService.list(query);
+ AtomicInteger serialNumber = new AtomicInteger(0);
List collect = records.stream().map(r -> {
ProjectAdjustmentExportDTO exportDTO = new ProjectAdjustmentExportDTO();
BeanUtils.copyProperties(r, exportDTO);
@@ -177,11 +174,9 @@ public class ProjectAdjustmentManage {
exportDTO.setStatusName(ProjectStatusEnum.getDesc(r.getStatus()));
String createOnStr = NdDateUtils.format(r.getCreateOn(), "yyyy-MM-dd HH:mm");
exportDTO.setCreateOn(createOnStr);
+ exportDTO.setSerialNumber(serialNumber.incrementAndGet());
return exportDTO;
}).collect(Collectors.toList());
- for (int i = 0; i < collect.size(); i++) {
- collect.get(i).setSerialNumber(i + 1);
- }
String fileName = "项目内容调整列表";
ExcelDownUtil.setFileName(fileName,response);
//数据导出处理函数
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ReviewByProvincialDeptManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ReviewByProvincialDeptManage.java
index a612d74..3f182cf 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ReviewByProvincialDeptManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectdeclared/manage/ReviewByProvincialDeptManage.java
@@ -1,18 +1,30 @@
package com.ningdatech.pmapi.projectdeclared.manage;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ningdatech.basic.function.VUtils;
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils;
+import com.ningdatech.pmapi.projectdeclared.converter.ApplicationConverter;
import com.ningdatech.pmapi.projectdeclared.model.dto.DefaultDeclaredDTO;
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum;
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.service.IProjectApplicationService;
import com.ningdatech.pmapi.projectlib.service.IProjectService;
+import com.ningdatech.pmapi.provincial.model.dto.ProvincialApplicationDTO;
+import com.ningdatech.pmapi.provincial.model.dto.ProvincialProjectDTO;
+import com.ningdatech.pmapi.provincial.service.IJoinReviewProvincialBureauService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Collections;
+import java.util.List;
import java.util.Objects;
+import java.util.stream.Collectors;
/**
* @Classname ReviewByProvincialDeptManage
@@ -31,6 +43,10 @@ public class ReviewByProvincialDeptManage {
private final DefaultDeclaredProjectManage defaultProjectManage;
+ private final IJoinReviewProvincialBureauService joinReviewProvincialBureauService;
+
+ private final IProjectApplicationService applicationService;
+
/**
* 省级部门联审
* @param project
@@ -47,17 +63,21 @@ public class ReviewByProvincialDeptManage {
VUtils.isTrue(!ProjectStatusEnum.JOINT_REVIEW_BY_PROVINCIAL_DEPARTMENTS.getCode().equals(projectInfo.getStatus()) ||
!ProjectStatusEnum.NOT_APPROVED.getCode().equals(projectInfo.getStage()))
.throwMessage("提交失败 该项目不是 省级部门联审状态状态或者未立项阶段");
- // TODO 对接省级联审的接口
- Boolean sucessProvince = Boolean.TRUE;
- if(sucessProvince){
- //测试先成功
- stateMachineUtils.pass(project);
- projectService.updateById(project);
- //直接去预审
- if(StringUtils.isNotBlank(defaultProjectManage
- .directStartProcess(project,project.getPreStartUserId()))){
- return Boolean.TRUE;
- }
+
+ // 对接省级联审的接口
+ List applications = applicationService.list(Wrappers.lambdaQuery(ProjectApplication.class)
+ .eq(ProjectApplication::getProjectId, projectInfo.getId()));
+ if(joinReviewProvincialBureauService.pushImportProject(
+ ApplicationConverter.convertProject(projectInfo,applications))){
+ return Boolean.TRUE;
+// //测试先成功
+// stateMachineUtils.pass(project);
+// projectService.updateById(project);
+// //直接去预审
+// if(StringUtils.isNotBlank(defaultProjectManage
+// .directStartProcess(project,project.getPreStartUserId()))){
+// return Boolean.TRUE;
+// }
}
return Boolean.FALSE;
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 dc7b710..a8b5584 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
@@ -309,4 +309,7 @@ public class Project implements Serializable {
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateBy;
+ @ApiModelProperty("项目预审申请单文件ID")
+ private Long pretrialFileId;
+
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/ProjectApplication.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/ProjectApplication.java
index 1e9e569..29e5af8 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/ProjectApplication.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/entity/ProjectApplication.java
@@ -67,7 +67,7 @@ public class ProjectApplication implements Serializable {
@ApiModelProperty("是否数改系统 0:否 1:是")
private Integer isDigitalModification;
- @ApiModelProperty("数改系统")
+ @ApiModelProperty("数改系统 1: '党政机关整体智治',2: '数字政府',3: '数字经济',4: '数字社会',7: '数字文化',5: '数字法治',6: '一体化智能化公共数据平台', 8: '基层智治' 多个用英文,分隔")
private String digitalModification;
@ApiModelProperty("业务领域")
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/controller/TestController.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/controller/TestController.java
index 898a551..1ee799d 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/controller/TestController.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/controller/TestController.java
@@ -1,5 +1,7 @@
package com.ningdatech.pmapi.provincial.controller;
+import com.ningdatech.pmapi.projectdeclared.manage.ReviewByProvincialDeptManage;
+import com.ningdatech.pmapi.projectlib.model.entity.Project;
import com.ningdatech.pmapi.provincial.model.dto.ProvincialProjectDTO;
import com.ningdatech.pmapi.provincial.service.IJoinReviewProvincialBureauService;
import io.swagger.annotations.Api;
@@ -24,14 +26,19 @@ public class TestController {
@Autowired
private IJoinReviewProvincialBureauService joinReviewProvincialBureauService;
- @PostMapping("/push")
+ @Autowired
+ private ReviewByProvincialDeptManage provincialDeptManage;
+
+ @GetMapping("/push")
@ApiOperation("测试推送")
- private String push(@Valid @RequestBody ProvincialProjectDTO project){
- return joinReviewProvincialBureauService.pushImportProject(project);
+ private Boolean push(@Valid @RequestParam Long projectId){
+ Project project = new Project();
+ project.setId(projectId);
+ return provincialDeptManage.startTheProcess(project);
}
@GetMapping("/detail")
- @ApiOperation("测试推送")
+ @ApiOperation("测试获取详情")
private String detail(@RequestParam String projectId){
return joinReviewProvincialBureauService.processInfo(projectId);
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialApplicationDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialApplicationDTO.java
index 61b60bd..22ebf5d 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialApplicationDTO.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialApplicationDTO.java
@@ -1,11 +1,13 @@
package com.ningdatech.pmapi.provincial.model.dto;
+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,7 +19,9 @@ import java.util.List;
@Data
@Builder
@ApiModel(value = "ProvincialApplicationDTO", description = "")
-public class ProvincialApplicationDTO {
+public class ProvincialApplicationDTO implements Serializable {
+
+
//云 信息
private List clouds;
//是否初次建设 1是 2不是
@@ -85,7 +89,9 @@ public class ProvincialApplicationDTO {
//发布端 '浙里办','浙政钉','数字化改革门户','支付宝','微信','网页','PC客户端','APP端'
private String publishSide;
- public static class Cloud {
+ @Builder
+ @JsonIgnoreProperties(value = { "handler"})
+ public static class Cloud implements Serializable {
//云资源台数 11
private Integer cloudNums;
//云资源类型 云服务器(ECS)
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialProjectDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialProjectDTO.java
index 7ed55cf..d84da7e 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialProjectDTO.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/model/dto/ProvincialProjectDTO.java
@@ -7,6 +7,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
+import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@@ -21,7 +22,7 @@ import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(value = "ProvincialProjectDTO", description = "")
-public class ProvincialProjectDTO {
+public class ProvincialProjectDTO implements Serializable {
@ApiModelProperty("区域code")
private String regionCode;
@@ -114,10 +115,10 @@ public class ProvincialProjectDTO {
private String projectRemark;
@ApiModelProperty("是否有效 1有效 2无效 3撤回")
- private String isEffective;
+ private Integer isEffective;
@ApiModelProperty("是否包含应用 1包含")
- private String includeApplication;
+ private Integer includeApplication;
@ApiModelProperty("app信息")
private List applicationInfo;
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/IJoinReviewProvincialBureauService.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/IJoinReviewProvincialBureauService.java
index 4942df2..900bd7f 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/IJoinReviewProvincialBureauService.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/IJoinReviewProvincialBureauService.java
@@ -14,7 +14,7 @@ public interface IJoinReviewProvincialBureauService {
* 推送/保存 重大接口到 省局联审
* @return
*/
- String pushImportProject(ProvincialProjectDTO project);
+ Boolean pushImportProject(ProvincialProjectDTO project);
/**
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/impl/JoinReviewProvincialBureauServiceImpl.java b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/impl/JoinReviewProvincialBureauServiceImpl.java
index 8453a65..1004b79 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/impl/JoinReviewProvincialBureauServiceImpl.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/provincial/service/impl/JoinReviewProvincialBureauServiceImpl.java
@@ -2,6 +2,8 @@ package com.ningdatech.pmapi.provincial.service.impl;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
+import com.alibaba.fastjson.JSON;
+import com.ningdatech.basic.model.ApiResponse;
import com.ningdatech.pmapi.common.config.ProvincialProperties;
import com.ningdatech.pmapi.provincial.model.dto.ProvincialProjectDTO;
import com.ningdatech.pmapi.provincial.service.IJoinReviewProvincialBureauService;
@@ -35,12 +37,12 @@ public class JoinReviewProvincialBureauServiceImpl implements IJoinReviewProvinc
* @return
*/
@Override
- public String pushImportProject(ProvincialProjectDTO project){
+ public Boolean pushImportProject(ProvincialProjectDTO project){
Long timeStamp = System.currentTimeMillis()/1000;
String url = provincialProperties.getHost() + provincialProperties.getPushUrl()
+ "?timestamp=" + timeStamp;
log.info("省局推送联审url {}",url);
- ResponseEntity responseEntity = null;
+ ResponseEntity responseEntity = null;
String signature = getSha256(timeStamp,provincialProperties.getPushUrl(),
HttpMethod.POST.name());
@@ -55,14 +57,19 @@ public class JoinReviewProvincialBureauServiceImpl implements IJoinReviewProvinc
.accept(MediaType.APPLICATION_JSON)
.body(project);
+ log.info("省局联审 提交 :{}", requestEntity);
+ log.info("省局联审 提交body :{}", JSON.toJSONString(requestEntity.getBody()));
try {
- responseEntity = restTemplate.exchange(requestEntity,String.class);
+ responseEntity = restTemplate.exchange(requestEntity, ApiResponse.class);
log.info("省局联审 响应 :{}",responseEntity);
+ if(responseEntity.getBody().getCode().equals(200)){
+ return Boolean.TRUE;
+ }
} catch (Exception e) {
log.error("[省局联审] http request error", e);
}
- return responseEntity.getBody();
+ return Boolean.FALSE;
}
/**
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sms/controller/VerificationCodeController.java b/pmapi/src/main/java/com/ningdatech/pmapi/sms/controller/VerificationCodeController.java
index b766142..1b6733e 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/sms/controller/VerificationCodeController.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/sms/controller/VerificationCodeController.java
@@ -35,7 +35,7 @@ public class VerificationCodeController {
@ApiOperation(value = "发送验证码", notes = "发送验证码")
@PostMapping(value = "/send")
public void send(@Validated @RequestBody ReqVerificationCodePO request) {
-// smsManage.sendVerificationCode(request);
+ smsManage.sendVerificationCode(request);
}
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sms/manage/SmsManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/sms/manage/SmsManage.java
index 3465c5b..5c6fb2e 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/sms/manage/SmsManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/sms/manage/SmsManage.java
@@ -11,6 +11,9 @@ import com.ningdatech.pmapi.sms.model.dto.VerifyCodeCacheDTO;
import com.ningdatech.pmapi.sms.model.po.ReqVerificationCodePO;
import com.ningdatech.pmapi.sms.utils.DateUtil;
import com.ningdatech.pmapi.sms.utils.SmsRedisKeyUtils;
+import com.ningdatech.yxt.client.YxtClient;
+import com.ningdatech.yxt.constants.YxtSmsSignEnum;
+import com.ningdatech.yxt.model.cmd.SendSmsCmd;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -29,65 +32,65 @@ import java.util.Collections;
@Component
@RequiredArgsConstructor
public class SmsManage {
-//
-// private final YxtClient yxtClient;
-// private final CachePlusOps cachePlusOps;
-//
-// public void sendVerificationCode(ReqVerificationCodePO request) {
-// Assert.isTrue(PhoneUtil.isMobile(request.getMobile()), "手机号码格式不正确");
-// String verificationType = request.getVerificationType();
-// VerificationCodeType verificationCodeTypeEnum = VerificationCodeType.of(verificationType);
-//
-// // 验证是否被锁定
-// String lockKey = SmsRedisKeyUtils.smsSendLockKey(verificationCodeTypeEnum, request.getMobile());
-// if (StringUtils.isNotBlank(cachePlusOps.get(lockKey))) {
-// throw BizException.wrap("今日" + verificationCodeTypeEnum.getDesc() + "的验证码发送次数过多,已被锁定");
-// }
-// // 验证发送间隔
-// String cacheKey = SmsRedisKeyUtils.smsCodeVerifyKey(verificationCodeTypeEnum, request.getMobile());
-// VerifyCodeCacheDTO preCache = (VerifyCodeCacheDTO) cachePlusOps.get(cacheKey);
-// if (preCache != null) {
-// if (LocalDateTime.now().minusMinutes(verificationCodeTypeEnum.getSendInterval())
-// .isBefore(preCache.getSendTime())) {
-// throw BizException.wrap(verificationCodeTypeEnum.getSendInterval() + "分钟之内已发送过验证码,请稍后重试");
-// }
-// }
-// String code = RandomUtil.randomNumbers(6);
-// VerifyCodeCacheDTO cache = VerifyCodeCacheDTO.builder()
-// .code(code)
-// .sendTime(LocalDateTime.now())
-// .mobile(request.getMobile())
-// .build();
-//
-// // 创建短信内容
-// SendSmsCmd sendSmsCmd = new SendSmsCmd();
-// switch (verificationCodeTypeEnum) {
-// case LOGIN:
-// SendSmsCmd.SendSmsContext sendSmsContext = new SendSmsCmd.SendSmsContext();
-// sendSmsContext.setReceiveNumber(request.getMobile());
-// sendSmsContext.setContent(String.format(YxtSmsTemplateConst.SMS_LOGIN_TEMPLATE, code, verificationCodeTypeEnum.getExpireTime()));
-// sendSmsCmd.setContextList(Collections.singletonList(sendSmsContext));
-// sendSmsCmd.setSmsSignEnum(YxtSmsSignEnum.ZJS_ELECTRONIC_EXPERT_LIB);
-// break;
-// default:
-// throw new IllegalArgumentException("非法的短信发送类型");
-// }
-// // 发送 短信
-// yxtClient.submitSmsTask(sendSmsCmd);
-// log.info("send verificationCode mobile = {},code = {}", request.getMobile(), code);
-//
-// cachePlusOps.set(new CacheKey(cacheKey, Duration.ofMinutes(verificationCodeTypeEnum.getExpireTime())), cache);
-// String limitKey = SmsRedisKeyUtils.smsSendLimitKey(verificationCodeTypeEnum, request.getMobile());
-// if (StringUtils.isNotBlank(cachePlusOps.get(limitKey))) {
-// long limitCount = cachePlusOps.incr(new CacheKey(limitKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())));
-// // 超出单日发送次数之后直接锁定
-// if (limitCount >= verificationCodeTypeEnum.getSendTimesByDay().longValue()) {
-// cachePlusOps.set(new CacheKey(lockKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())), request.getMobile());
-// }
-// } else {
-// cachePlusOps.set(new CacheKey(limitKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())), 1);
-// }
-// }
+
+ private final YxtClient yxtClient;
+ private final CachePlusOps cachePlusOps;
+
+ public void sendVerificationCode(ReqVerificationCodePO request) {
+ Assert.isTrue(PhoneUtil.isMobile(request.getMobile()), "手机号码格式不正确");
+ String verificationType = request.getVerificationType();
+ VerificationCodeType verificationCodeTypeEnum = VerificationCodeType.of(verificationType);
+
+ // 验证是否被锁定
+ String lockKey = SmsRedisKeyUtils.smsSendLockKey(verificationCodeTypeEnum, request.getMobile());
+ if (StringUtils.isNotBlank(cachePlusOps.get(lockKey))) {
+ throw BizException.wrap("今日" + verificationCodeTypeEnum.getDesc() + "的验证码发送次数过多,已被锁定");
+ }
+ // 验证发送间隔
+ String cacheKey = SmsRedisKeyUtils.smsCodeVerifyKey(verificationCodeTypeEnum, request.getMobile());
+ VerifyCodeCacheDTO preCache = (VerifyCodeCacheDTO) cachePlusOps.get(cacheKey);
+ if (preCache != null) {
+ if (LocalDateTime.now().minusMinutes(verificationCodeTypeEnum.getSendInterval())
+ .isBefore(preCache.getSendTime())) {
+ throw BizException.wrap(verificationCodeTypeEnum.getSendInterval() + "分钟之内已发送过验证码,请稍后重试");
+ }
+ }
+ String code = RandomUtil.randomNumbers(6);
+ VerifyCodeCacheDTO cache = VerifyCodeCacheDTO.builder()
+ .code(code)
+ .sendTime(LocalDateTime.now())
+ .mobile(request.getMobile())
+ .build();
+
+ // 创建短信内容
+ SendSmsCmd sendSmsCmd = new SendSmsCmd();
+ switch (verificationCodeTypeEnum) {
+ case LOGIN:
+ SendSmsCmd.SendSmsContext sendSmsContext = new SendSmsCmd.SendSmsContext();
+ sendSmsContext.setReceiveNumber(request.getMobile());
+ sendSmsContext.setContent(String.format(YxtSmsTemplateConst.SMS_LOGIN_TEMPLATE, code, verificationCodeTypeEnum.getExpireTime()));
+ sendSmsCmd.setContextList(Collections.singletonList(sendSmsContext));
+ sendSmsCmd.setSmsSignEnum(YxtSmsSignEnum.ZJS_ELECTRONIC_EXPERT_LIB);
+ break;
+ default:
+ throw new IllegalArgumentException("非法的短信发送类型");
+ }
+ // 发送 短信
+ yxtClient.submitSmsTask(sendSmsCmd);
+ log.info("send verificationCode mobile = {},code = {}", request.getMobile(), code);
+
+ cachePlusOps.set(new CacheKey(cacheKey, Duration.ofMinutes(verificationCodeTypeEnum.getExpireTime())), cache);
+ String limitKey = SmsRedisKeyUtils.smsSendLimitKey(verificationCodeTypeEnum, request.getMobile());
+ if (StringUtils.isNotBlank(cachePlusOps.get(limitKey))) {
+ long limitCount = cachePlusOps.incr(new CacheKey(limitKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())));
+ // 超出单日发送次数之后直接锁定
+ if (limitCount >= verificationCodeTypeEnum.getSendTimesByDay().longValue()) {
+ cachePlusOps.set(new CacheKey(lockKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())), request.getMobile());
+ }
+ } else {
+ cachePlusOps.set(new CacheKey(limitKey, Duration.ofSeconds(DateUtil.restSecondsFromNowToNoon())), 1);
+ }
+ }
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IRegionService.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IRegionService.java
index 901a498..2aca320 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IRegionService.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/IRegionService.java
@@ -1,8 +1,8 @@
package com.ningdatech.pmapi.sys.service;
import com.baomidou.mybatisplus.extension.service.IService;
-import com.ningdatech.pmapi.sys.model.entity.Region;
import com.ningdatech.pmapi.sys.model.dto.RegionDTO;
+import com.ningdatech.pmapi.sys.model.entity.Region;
import java.util.List;
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RegionServiceImpl.java b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RegionServiceImpl.java
index 0a2e2ae..7b5f4bd 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RegionServiceImpl.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/sys/service/impl/RegionServiceImpl.java
@@ -52,9 +52,9 @@ public class RegionServiceImpl extends ServiceImpl impleme
@Override
public Long getRegionIdByParentIdWithSameRegionCode(Long parentId, String regionCode) {
return baseMapper.selectOne(Wrappers.lambdaQuery(Region.class)
- .eq(Region::getParentId, parentId)
- .eq(Region::getRegionCode, regionCode)
- .eq(Region::getDeleted, false))
+ .eq(Region::getParentId, parentId)
+ .eq(Region::getRegionCode, regionCode)
+ .eq(Region::getDeleted, false))
.getId();
}
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
new file mode 100644
index 0000000..bfb9ba0
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/model/dto/PdfGenerateDTO.java
@@ -0,0 +1,140 @@
+package com.ningdatech.pmapi.todocenter.model.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.math.BigDecimal;
+
+/**
+ * pdf生成实体
+ *
+ * @author CMM
+ * @since 2023/03/13 14:24
+ */
+@Data
+public class PdfGenerateDTO {
+ @ApiModelProperty("应用ID")
+ private Long id;
+
+ @ApiModelProperty("项目名称")
+ private String projectName;
+
+ @ApiModelProperty("是否临时增补 0:否 1:是")
+ private String isTemporaryAugment;
+
+ @ApiModelProperty("项目负责人")
+ private String responsibleMan;
+
+ @ApiModelProperty("负责人手机号码")
+ private String responsibleManMobile;
+
+ @ApiModelProperty("项目联系人")
+ private String contactName;
+
+ @ApiModelProperty("项目联系人手机号码")
+ private String contactPhone;
+
+ @ApiModelProperty("建设单位名称")
+ private String buildOrgName;
+
+ @ApiModelProperty("建设单位统一社会信用代码")
+ private String orgCreditCode;
+
+ @ApiModelProperty("项目类型 1:建设 2:运维")
+ private String projectType;
+
+ @ApiModelProperty("是否首次新建 0:否 1:是")
+ private String isFirst;
+
+ @ApiModelProperty("项目预算年度")
+ private Integer projectYear;
+
+ @ApiModelProperty("项目建设起止时间")
+ private String beginAndEndTime;
+
+ @ApiModelProperty("四大体系 1:业务应用 2:应用支撑 3:数据资源 4:基础设施")
+ private String fourSystems;
+
+ @ApiModelProperty("是否数字化改革项目 0:否 1:是")
+ private String isDigitalReform;
+
+ @ApiModelProperty("综合业务领域")
+ private String bizDomain;
+
+ @ApiModelProperty("立项依据")
+ private String buildBasis;
+
+
+ @ApiModelProperty("是否上云 0:否 1:是")
+ private String isCloud;
+
+ private String cloudType;
+
+ @ApiModelProperty("等保级别 1:一级 2:二级 3:三级 4:四级 5:五级")
+ private Integer protectionLevel;
+
+ @ApiModelProperty("是否密评 0:否 1:是")
+ private Integer isSecretComments;
+
+ @ApiModelProperty("项目简介")
+ private String projectIntroduction;
+
+ @ApiModelProperty("资金申报情况-申报金额(万元)")
+ private BigDecimal declareAmount;
+
+ @ApiModelProperty("资金申报情况-自有金额(万元)")
+ private BigDecimal declareHaveAmount;
+
+ @ApiModelProperty("资金申报情况-政府投资-本级财政资金(万元)")
+ private BigDecimal declareGovOwnFinanceAmount;
+
+ @ApiModelProperty("资金申报情况-政府投资-上级补助资金(万元)")
+ private BigDecimal declareGovSuperiorFinanceAmount;
+
+ @ApiModelProperty("银行贷款(万元)")
+ private BigDecimal declareBankLendingAmount;
+
+ @ApiModelProperty("其它资金(万元)")
+ private BigDecimal declareOtherAmount;
+
+ @ApiModelProperty("资金分配情况-软件开发(万元)")
+ private BigDecimal softwareDevelopmentAmount;
+
+ @ApiModelProperty("资金分配情况-云资源、硬件购置(万元)")
+ private BigDecimal cloudHardwarePurchaseAmount;
+
+ @ApiModelProperty("资金分配情况-第三方服务(万元)")
+ private BigDecimal thirdPartyAmount;
+
+ @ApiModelProperty("年度支付计划-年度支付计划(万元)")
+ private BigDecimal annualPlanAmount;
+
+ @ApiModelProperty("年度支付计划-自有金额(万元)")
+ private BigDecimal annualPlanHaveAmount;
+
+ @ApiModelProperty("年度支付计划-政府投资-本级财政资金(万元)")
+ private BigDecimal annualPlanGovOwnFinanceAmount;
+
+ @ApiModelProperty("年度支付计划-政府投资-上级补助资金(万元)")
+ private BigDecimal annualPlanGovSuperiorFinanceAmount;
+
+ @ApiModelProperty("年度支付计划-银行贷款(万元)")
+ private BigDecimal annualPlanBankLendingAmount;
+
+ @ApiModelProperty("年度支付计划-其它资金(万元)")
+ private BigDecimal annualPlanOtherAmount;
+
+ @ApiModelProperty("备注")
+ private String projectRemarks;
+
+ @ApiModelProperty("附件-是否开启 false:关闭 true:开启")
+ private Boolean isAccessories;
+
+ @ApiModelProperty("备注-是否开启 false:关闭 true:开启")
+ private Boolean isRemarks;
+
+ @ApiModelProperty("年度支付计划-是否开启 false:关闭 true:开启")
+ private Boolean isAnnualPlanAmount;
+
+ @ApiModelProperty("一地创新全省共享项目-是否开启 false:关闭 true:开启")
+ private Boolean isInnovateWholeProvinceShare;
+}
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
new file mode 100644
index 0000000..d657e04
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfGenerateUtil.java
@@ -0,0 +1,140 @@
+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
new file mode 100644
index 0000000..ef34fb0
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/utils/PdfUtils.java
@@ -0,0 +1,153 @@
+package com.ningdatech.pmapi.todocenter.utils;
+
+
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.pdf.*;
+import com.ningdatech.basic.exception.BizException;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+import org.xhtmlrenderer.pdf.ITextFontResolver;
+import org.xhtmlrenderer.pdf.ITextRenderer;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * pdf生成工具类
+ *
+ * @author CMM
+ * @since 2023/03/13 17:01
+ */
+@Slf4j
+@Component
+public class PdfUtils {
+ /**
+ * 生成PDF文件
+ *
+ * @return int
+ * @author CMM
+ * @since 2023/03/13 17:07
+ */
+ public byte[] generatePdf(InputStream templateHtmlInputStream, Map paramsMap){
+ FileInputStream inputStream = null;
+
+ try {
+ File directory = new File("");
+ //pdf输出路径
+ String absolutePath = directory.getAbsolutePath();
+ String linkPath = "\\src\\main\\resources";
+ String filePath = absolutePath + linkPath + "\\template\\fileout";
+ if(!new File(filePath).exists()){
+ new File(filePath).mkdir();
+ }
+ //字体格式
+ String FONT = absolutePath + linkPath + "\\template\\simsun.ttc";
+ StringBuilder stringBuilder = new StringBuilder();
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(templateHtmlInputStream, StandardCharsets.UTF_8));
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ stringBuilder.append(line);
+ }
+ String htmlInfo = stringBuilder.toString();
+
+ //替换参数、多个参数多次替换
+ for (String fieldName : paramsMap.keySet()) {
+ if (paramsMap.get(fieldName) == null) {
+ continue;
+ }
+ // 设置占位字段
+ htmlInfo = htmlInfo.replace("#" + fieldName + "#", paramsMap.get(fieldName).toString());
+ }
+
+
+ //生成临时文件
+ String htmlFileName = UUID.randomUUID().toString().replace("-","") + ".html";
+ String htmlFilePath = filePath + File.separator + htmlFileName;
+ File file = new File(htmlFilePath);
+ FileOutputStream fop = new FileOutputStream(file);
+ if (!file.exists()) {
+ file.createNewFile();
+ }
+ byte[] contentInBytes = htmlInfo.getBytes();
+ fop.write(contentInBytes);
+ fop.flush();
+ fop.close();
+
+ //生成pdf
+ String fileName = UUID.randomUUID().toString().replace("-","") + ".pdf";
+ String pdfFilePath = filePath + File.separator + fileName;
+ String url = new File(htmlFilePath).toURI().toURL().toString();
+ OutputStream os = Files.newOutputStream(Paths.get(pdfFilePath));
+
+ ITextRenderer renderer = new ITextRenderer();
+ renderer.setDocument(url);
+ ITextFontResolver fontResolver = renderer.getFontResolver();
+ fontResolver.addFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
+ renderer.layout();
+ renderer.createPDF(os);
+ os.flush();
+ os.close();
+
+ 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) {
+ throw new BizException("生成pdf文件失败!");
+ } catch (DocumentException e) {
+ throw new BizException("生成pdf文件失败!");
+ } finally {
+ try {
+ if (null != inputStream) {
+
+ inputStream.close();
+ }
+ } catch (IOException e) {
+ log.error("close resource error", e.getMessage());
+ }
+ }
+ }
+
+
+ /**
+ * 读取输入流到字节数组
+ *
+ * @param in
+ * @return
+ * @throws IOException
+ */
+ private 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/user/service/IUserInfoService.java b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java
index d382b64..c87664f 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/IUserInfoService.java
@@ -1,7 +1,7 @@
package com.ningdatech.pmapi.user.service;
-import com.ningdatech.pmapi.user.entity.UserInfo;
import com.baomidou.mybatisplus.extension.service.IService;
+import com.ningdatech.pmapi.user.entity.UserInfo;
import com.wflow.workflow.bean.dto.ProcessInstanceUserDto;
import java.util.Map;
@@ -9,7 +9,7 @@ import java.util.Set;
/**
*
- * 服务类
+ * 服务类
*
*
* @author Lierbao
@@ -19,4 +19,7 @@ public interface IUserInfoService extends IService {
Map getUserMapByIds(Set staterUsers);
ProcessInstanceUserDto getUserInfo(String userId);
+
+ UserInfo getUserInfoByPhoneNo(String phoneNo);
+
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java
index 8630091..bdf3546 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/user/service/impl/UserInfoServiceImpl.java
@@ -12,6 +12,7 @@ import com.ningdatech.pmapi.user.mapper.NdUserInfoMapper;
import com.ningdatech.pmapi.user.service.IUserInfoService;
import com.wflow.workflow.bean.dto.ProcessInstanceUserDto;
import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -22,7 +23,7 @@ import java.util.stream.Collectors;
/**
*
- * 服务实现类
+ * 服务实现类
*
*
* @author Lierbao
@@ -36,6 +37,7 @@ public class UserInfoServiceImpl extends ServiceImpl
private final IDingEmployeeInfoService dingEmployeeInfoService;
private final IDingOrganizationService dingOrganizationService;
+
@Override
public Map getUserMapByIds(Set staterUsers) {
List userInfos = userInfoMapper.selectBatchIds(staterUsers);
@@ -44,13 +46,13 @@ public class UserInfoServiceImpl extends ServiceImpl
userInfo.setUserId(String.valueOf(u.getId()));
userInfo.setUserName(u.getRealName());
Long accountId = u.getAccountId();
- if (Objects.isNull(accountId)){
+ if (Objects.isNull(accountId)) {
throw new BizException("该用户没有录入浙政钉用户信息!");
}
// 根据浙政钉用户ID获取单位code
DingEmployeeInfo employeeInfo = dingEmployeeInfoService.getOne(Wrappers.lambdaQuery(DingEmployeeInfo.class)
.eq(DingEmployeeInfo::getAccountId, accountId)
- .eq(DingEmployeeInfo::getMainJob,String.valueOf(Boolean.TRUE))
+ .eq(DingEmployeeInfo::getMainJob, String.valueOf(Boolean.TRUE))
.last("limit 1"));
String organizationCode = employeeInfo.getOrganizationCode();
// 根据 单位code获取单位名称
@@ -70,7 +72,7 @@ public class UserInfoServiceImpl extends ServiceImpl
processInstanceUserDto.setUserId(String.valueOf(userInfo.getId()));
processInstanceUserDto.setUserName(userInfo.getRealName());
Long accountId = userInfo.getAccountId();
- if (Objects.isNull(accountId)){
+ if (Objects.isNull(accountId)) {
throw new BizException("该用户没有录入浙政钉用户信息!");
}
// 根据浙政钉用户ID获取部门code
@@ -85,4 +87,15 @@ public class UserInfoServiceImpl extends ServiceImpl
processInstanceUserDto.setOrgName(organizationName);
return processInstanceUserDto;
}
+
+ @Override
+ public UserInfo getUserInfoByPhoneNo(String phoneNo) {
+ if (StringUtils.isEmpty(phoneNo)) {
+ return null;
+ }
+ UserInfo userInfo = userInfoMapper
+ .selectOne(Wrappers.lambdaQuery(UserInfo.class)
+ .eq(UserInfo::getMobile, phoneNo));
+ return userInfo;
+ }
}
diff --git a/pmapi/src/main/resources/security/auth-dev.yml b/pmapi/src/main/resources/security/auth-dev.yml
index 19fcc71..86f67a6 100644
--- a/pmapi/src/main/resources/security/auth-dev.yml
+++ b/pmapi/src/main/resources/security/auth-dev.yml
@@ -21,6 +21,7 @@ security:
- /oa/**
- /wflow/**
- /sys/**
+ - /api/v1/verification/**
ignore-csrf-urls:
- /api/v1/user/auth/**
- /v2/api-docs
@@ -37,6 +38,7 @@ security:
- /oa/**
- /wflow/**
- /sys/**
+ - /api/v1/verification/**
role-map:
"engineer":
"project_manager":
diff --git a/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf b/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf
new file mode 100644
index 0000000..901265d
Binary files /dev/null and b/pmapi/src/main/resources/template/fileout/c34f631755a04532a0116494fd5f99ac.pdf differ
diff --git a/pmapi/src/main/resources/template/simsun.ttc b/pmapi/src/main/resources/template/simsun.ttc
new file mode 100644
index 0000000..40e9693
Binary files /dev/null and b/pmapi/src/main/resources/template/simsun.ttc differ
diff --git a/pmapi/src/main/resources/template/盖章文件.html b/pmapi/src/main/resources/template/盖章文件.html
new file mode 100644
index 0000000..6d681c7
--- /dev/null
+++ b/pmapi/src/main/resources/template/盖章文件.html
@@ -0,0 +1,254 @@
+
+
+
+
+
+ Document
+
+
+
+
+
+ 【
+
+ 】预审申请单
+
+
+
+
+ 项目编号:
+
+
+
+
+
+
+
+ 项目基本信息 |
+
+
+ 项目名称 |
+ |
+
+
+ 是否临时增补 |
+ |
+ 是否一地创新全省共享项目 |
+ |
+
+
+ 项目负责人 |
+ |
+ 负责人手机号 |
+ |
+
+
+ 项目联系人 |
+ |
+ 项目联系人手机号 |
+ |
+
+
+ 建设单位 |
+ |
+ 建设单位统一社会信用代码 |
+ |
+
+
+ 项目类型 |
+ |
+ 是否首次新建 |
+ |
+
+
+ 预算年度 |
+ |
+ 建设起止时间 |
+ |
+
+
+ 四大体系 |
+ |
+
+
+ 是否数字化改革项目 |
+ |
+ 综合业务领域 |
+ |
+
+
+ 立项依据 |
+ |
+
+
+ 是否上云 |
+ |
+ 云类型 |
+ |
+
+
+ 项目简介 |
+ |
+
+
+ 资金申报情况 |
+
+
+ 申报金额 |
+ |
+
+
+ 自有资金 |
+ |
+ 政府投资-本级财政资金 |
+ |
+
+
+ 政府投资-上级补助资金 |
+ |
+ 银行贷款 |
+ |
+
+
+ 自有资金 |
+ |
+ 政府投资-本级财政资金 |
+ |
+
+
+ 其他资金 |
+ |
+
+
+ 2021年计划投资(万元) |
+ |
+
+
+ 资金分配情况 |
+
+
+ 软件开发 |
+ |
+ 云资源、硬件购置 |
+ |
+
+
+ 第三方服务 |
+ |
+
+
+ 年度支付计划 |
+
+
+ 年度支付金额 |
+ |
+
+
+ 自有资金 |
+ |
+ 政府投资-本级财政资金 |
+ |
+
+
+ 政府投资-上级补助资金 |
+ |
+ 银行贷款 |
+ |
+
+
+ 其他资金 |
+ |
+
+
+ 备注 |
+
+
+ 备注 |
+ |
+
+
+ 单位意见 |
+
+
+ 本级主管单位意见(盖章) |
+ |
+
+
+ 上级主管单位意见(盖章) |
+ |
+
+
+ {本地区大数据局的名称}意见(盖章) |
+ |
+
+
+
+
+
+
+
diff --git a/pmapi/src/main/resources/template/预审申请单.html b/pmapi/src/main/resources/template/预审申请单.html
new file mode 100644
index 0000000..db9bdb7
--- /dev/null
+++ b/pmapi/src/main/resources/template/预审申请单.html
@@ -0,0 +1,249 @@
+
+
+
+
+
+ Document
+
+
+
+
+
+ 预审申请单
+
+
+
+
+ 项目编号:
+ #projectNo#
+
+ #time#
+
+
+
+
+ 项目基本信息 |
+
+
+ 项目名称 |
+ #projectName# |
+
+
+ 是否临时增补 |
+ #isTemporaryAugment# |
+ 是否一地创新全省共享项目 |
+ #isInnovateWholeProvinceShare# |
+
+
+ 项目负责人 |
+ #responsibleMan# |
+ 负责人手机号 |
+ #responsibleManMobile# |
+
+
+ 项目联系人 |
+ #contactName# |
+ 项目联系人手机号 |
+ #contactPhone# |
+
+
+ 建设单位 |
+ #buildOrgName# |
+ 建设单位统一社会信用代码 |
+ #orgCreditCode# |
+
+
+ 项目类型 |
+ #projectType# |
+ 是否首次新建 |
+ #isFirst# |
+
+
+ 预算年度 |
+ #projectYear# |
+ 建设起止时间 |
+ #beginAndEndTime# |
+
+
+ 四大体系 |
+ #fourSystems# |
+
+
+ 是否数字化改革项目 |
+ #isDigitalReform# |
+ 综合业务领域 |
+ #bizDomain# |
+
+
+ 立项依据 |
+ #buildBasis# |
+
+
+ 是否上云 |
+ #isCloud# |
+ 云类型 |
+ #cloudType# |
+
+
+ 项目简介 |
+ #projectIntroduction# |
+
+
+ 资金申报情况 |
+
+
+ 申报金额 |
+ #declareAmount# |
+
+
+ 自有资金 |
+ #declareHaveAmount# |
+ 政府投资-本级财政资金 |
+ #declareGovOwnFinanceAmount# |
+
+
+ 政府投资-上级补助资金 |
+ #declareGovSuperiorFinanceAmount# |
+ 银行贷款 |
+ #declareBankLendingAmount# |
+
+
+ 其他资金 |
+ #declareOtherAmount# |
+
+
+ 本年计划投资(万元) |
+ #yearPlanInvest# |
+
+
+ 资金分配情况 |
+
+
+ 软件开发 |
+ #softwareDevelopmentAmount# |
+ 云资源、硬件购置 |
+ #cloudHardwarePurchaseAmount# |
+
+
+ 第三方服务 |
+ #thirdPartyAmount# |
+
+
+ 年度支付计划 |
+
+
+ 年度支付金额 |
+ #annualPlanAmount# |
+
+
+ 自有资金 |
+ #annualPlanHaveAmount# |
+ 政府投资-本级财政资金 |
+ #annualPlanGovOwnFinanceAmount# |
+
+
+ 政府投资-上级补助资金 |
+ #annualPlanGovSuperiorFinanceAmount# |
+ 银行贷款 |
+ #annualPlanBankLendingAmount# |
+
+
+ 其他资金 |
+ #annualPlanOtherAmount# |
+
+
+ 备注 |
+
+
+ 备注 |
+ #projectRemarks# |
+
+
+ 单位意见 |
+
+
+ 本级主管单位意见(盖章) |
+ |
+
+
+ 上级主管单位意见(盖章) |
+ |
+
+
+ {本地区大数据局的名称}意见(盖章) |
+ |
+
+
+
+
+
+
+
diff --git a/pmapi/src/main/resources/template/预审申请单.pdf b/pmapi/src/main/resources/template/预审申请单.pdf
new file mode 100644
index 0000000..451899c
Binary files /dev/null and b/pmapi/src/main/resources/template/预审申请单.pdf 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 4a61788..804410c 100644
--- a/pmapi/src/test/java/com/ningdatech/pmapi/todocenter/TodoCenterTest.java
+++ b/pmapi/src/test/java/com/ningdatech/pmapi/todocenter/TodoCenterTest.java
@@ -1,18 +1,38 @@
package com.ningdatech.pmapi.todocenter;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
import com.ningdatech.basic.model.GenericResult;
+import com.ningdatech.basic.util.NdDateUtils;
+import com.ningdatech.file.entity.vo.result.FileResultVO;
+import com.ningdatech.file.service.FileService;
import com.ningdatech.pmapi.AppTests;
+import com.ningdatech.pmapi.projectlib.enumeration.ProjectTypeEnum;
+import com.ningdatech.pmapi.projectlib.manage.ProjectLibManage;
+import com.ningdatech.pmapi.projectlib.model.entity.Project;
+import com.ningdatech.pmapi.projectlib.model.vo.ProjectDetailVO;
+import com.ningdatech.pmapi.projectlib.service.IProjectService;
import com.ningdatech.pmapi.staging.enums.MsgTypeEnum;
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;
import com.ningdatech.zwdd.client.ZwddClient;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
+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;
@@ -25,10 +45,6 @@ import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.PASS_MSG_TEMPL
*/
@Slf4j
public class TodoCenterTest extends AppTests {
-
- //@Autowired
- //private TaskExecutor executor;
-
@Autowired
private TodoCenterManage todoCenterManage;
@Autowired
@@ -37,6 +53,14 @@ public class TodoCenterTest extends AppTests {
private ZwddClient zwddClient;
@Autowired
private INdWorkNoticeStagingService workNoticeStagingService;
+ @Autowired
+ private ProjectLibManage projectLibManage;
+ @Autowired
+ private FileService fileService;
+ @Autowired
+ private IProjectService projectService;
+ @Autowired
+ private PdfUtils pdfUtils;
@Test
public void sendWorkNoticeTest() throws ExecutionException, InterruptedException {
//String msg = String.format(PASS_MSG_TEMPLATE, "发改委", "0223-00-测试项目");
@@ -98,4 +122,58 @@ public class TodoCenterTest extends AppTests {
// 放入工作通知暂存表中,通过扫表异步发送
workNoticeStagingService.addByWorkNotice(passWorkNoticeInfo, MsgTypeEnum.AUDIT);
}
+
+ @Test
+ public void GeneratePdf(){
+ // 获取本地目录的pdf模板
+ String fileName = "预审申请单";
+ InputStream pdfInputStream =
+ this.getClass().getClassLoader().getResourceAsStream("template/" + fileName + ".html");
+ // 获取表单数据
+ ProjectDetailVO projectDetail = projectLibManage.getProjectDetail(44L);
+ PdfGenerateDTO pdfGenerateDTO = new PdfGenerateDTO();
+ BeanUtils.copyProperties(projectDetail, pdfGenerateDTO);
+ // 设置pdf模板参数
+ JSONObject paramsMap = JSONObject.parseObject(JSONObject.toJSONString(pdfGenerateDTO));
+ paramsMap.put("time", NdDateUtils.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm"));
+ paramsMap.put("isTemporaryAugment", "否");
+ Integer projectType = projectDetail.getProjectType();
+ paramsMap.put("projectType", ProjectTypeEnum.getDesc(projectType));
+ Integer isFirst = projectDetail.getIsFirst();
+ paramsMap.put("isFirst", "是");
+ Boolean isInnovateWholeProvinceShare = projectDetail.getIsInnovateWholeProvinceShare();
+ paramsMap.put("isInnovateWholeProvinceShare", Boolean.TRUE.equals(isInnovateWholeProvinceShare) ? "是" : "否");
+ String beginTime = projectDetail.getBeginTime();
+ String endTime = projectDetail.getEndTime();
+ String beginAndEndTime = beginTime + StrUtil.DASHED + endTime;
+ paramsMap.put("beginAndEndTime", beginAndEndTime);
+ Integer fourSystems = projectDetail.getFourSystems();
+ paramsMap.put("fourSystems", "业务应用");
+ Integer isDigitalReform = projectDetail.getIsDigitalReform();
+ paramsMap.put("isDigitalReform", "否");
+ Integer isCloud = projectDetail.getIsCloud();
+ paramsMap.put("isCloud", "否");
+
+ // 生成pdf字节数组
+
+ byte[] pdf = pdfUtils.generatePdf(pdfInputStream, paramsMap);
+
+ // 转换成MultipartFile
+ MultipartFile multipartFile = new MockMultipartFile("file", fileName + ".pdf", "application/pdf", pdf);
+
+ // 上传OSS
+ FileResultVO resultVO = fileService.upload(multipartFile, "default");
+
+ // 将返回的文件ID保存到项目库中
+ Project project = projectService.getById(44L);
+ project.setPretrialFileId(resultVO.getId());
+
+ try {
+ if (null != pdfInputStream) {
+ pdfInputStream.close();
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
}
diff --git a/pom.xml b/pom.xml
index f67648b..5bd0f3c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -148,6 +148,28 @@
spring-statemachine-core
2.0.1.RELEASE
+
+
+ com.itextpdf
+ itextpdf
+ 5.5.9
+
+
+ com.itextpdf
+ itext-asian
+ 5.2.0
+
+
+ com.itextpdf.tool
+ xmlworker
+ 5.5.9
+
+
+ org.xhtmlrenderer
+ flying-saucer-pdf-itext5
+ 9.0.3
+
+
@@ -165,6 +187,8 @@
+
+