Browse Source

Merge branch '20230904-project-collection-2.0' of http://git.ningdatech.com/liushuai/project-management into dev

tags/24080901
PoffyZhang 1 year ago
parent
commit
6d0718473c
8 changed files with 194 additions and 40 deletions
  1. +13
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/common/config/BeanConfig.java
  2. +5
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/ding/controller/DingInfoPullController.java
  3. +46
    -1
      pmapi/src/main/java/com/ningdatech/pmapi/ding/task/OrganizationBatchGetTask.java
  4. +102
    -13
      pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/GovProjectCollectionManage.java
  5. +13
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/model/entity/GovBizProjectApply.java
  6. +11
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/gov/model/entity/GovBizProjectApprove.java
  7. +3
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/gov/model/entity/GovBizProjectCimplement.java
  8. +1
    -24
      pmapi/src/main/java/com/ningdatech/pmapi/wps/manage/WpsConvertManage.java

+ 13
- 0
pmapi/src/main/java/com/ningdatech/pmapi/common/config/BeanConfig.java View File

@@ -17,12 +17,14 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
@@ -106,4 +108,15 @@ public class BeanConfig {
.setRetryHandler(new DefaultHttpRequestRetryHandler(2, true))
.build();
}

@Bean
public ThreadPoolTaskExecutor getThreadPoolTaskExecutor(){
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(5);
threadPoolTaskExecutor.setKeepAliveSeconds(200);
threadPoolTaskExecutor.setMaxPoolSize(10);
threadPoolTaskExecutor.setQueueCapacity(20);
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
return threadPoolTaskExecutor;
}
}

+ 5
- 0
pmapi/src/main/java/com/ningdatech/pmapi/ding/controller/DingInfoPullController.java View File

@@ -84,6 +84,11 @@ public class DingInfoPullController {
organizationBatchGetTask.batchGetOrganizationTask();
}

@GetMapping("/organization/{orgCode}")
public void organizationGetSubs(@PathVariable String orgCode) {
organizationBatchGetTask.organizationGetSubs(orgCode);
}

@GetMapping("/employeeByRegionCode/{regionCode}")
public void employeeBatchGetByRegionCode(@PathVariable String regionCode) {
employeeBatchGetTask.batchGetEmployeeTaskByRegionCode(regionCode);


+ 46
- 1
pmapi/src/main/java/com/ningdatech/pmapi/ding/task/OrganizationBatchGetTask.java View File

@@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.google.common.collect.Lists;
import com.ningdatech.basic.model.GenericResult;
import com.ningdatech.pmapi.common.constant.BizConst;
import com.ningdatech.pmapi.ding.model.DingOrgInfoTreeDTO;
import com.ningdatech.pmapi.organization.model.entity.DingOrganization;
import com.ningdatech.pmapi.organization.service.IDingOrganizationService;
@@ -21,6 +22,7 @@ import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -103,6 +105,50 @@ public class OrganizationBatchGetTask {
}
}

/**
* 更新 其 子单位
* @param orgCode
*/
public void organizationGetSubs(String orgCode) {
log.info("----拉取浙政钉组织子单位开始---,顶级code:" + orgCode);
DingOrganization topOrg = iDingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getOrganizationCode, orgCode)
.last(BizConst.LIMIT_1));
// 顶级组织code
List<String> topOrgCodes = Lists.newArrayList(orgCode);
GenericResult<List<DingOrgInfoDTO>> listGenericResult = zwddClient.listOrganizationsByCodes(topOrgCodes);
log.info("listGenericResult: {}" + JSON.toJSONString(listGenericResult));
List<DingOrgInfoDTO> dingOrgInfoDtos = listGenericResult.getData();

for(DingOrgInfoDTO dingOrgInfo : dingOrgInfoDtos){
DingOrganization old = iDingOrganizationService.getOne(Wrappers.lambdaQuery(DingOrganization.class)
.eq(DingOrganization::getOrganizationCode, dingOrgInfo.getOrganizationCode())
.last(BizConst.LIMIT_1));
if(Objects.nonNull(old)){
log.info("该单位已经存在 :{}",old.getOrganizationName());
continue;
}

DingOrganization organization = new DingOrganization();
organization.setOrganizationCode(dingOrgInfo.getOrganizationCode());
organization.setOrganizationName(dingOrgInfo.getOrganizationName());
//和顶级单位一个区域
organization.setDivisionCode(topOrg.getDivisionCode());
organization.setParentCode(dingOrgInfo.getParentCode());
organization.setTypeName(dingOrgInfo.getTypeName());
organization.setAddress(dingOrgInfo.getAddress());
organization.setBusinessStripCodes(dingOrgInfo.getBusinessStripCodes());
organization.setDisplayOrder(dingOrgInfo.getDisplayOrder());
organization.setGmtCreate(LocalDateTime.now());
organization.setInstitutionLevelCode(dingOrgInfo.getInstitutionLevelCode());
organization.setParentName(dingOrgInfo.getParentName());
iDingOrganizationService.save(organization);
}

log.info("----拉取浙政钉组织子单位结束---,顶级code:" + orgCode);

}

private void buildSaveRecordList(List<DingOrgInfoTreeDTO> treeDTOList, List<DingOrganization> saveRecordList) {
if (CollectionUtils.isEmpty(treeDTOList)) {
return;
@@ -167,7 +213,6 @@ public class OrganizationBatchGetTask {
}
}
}

}



+ 102
- 13
pmapi/src/main/java/com/ningdatech/pmapi/gov/manage/GovProjectCollectionManage.java View File

@@ -34,15 +34,21 @@ import com.ningdatech.pmapi.wps.manage.WpsConvertManage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.util.*;
@@ -80,6 +86,8 @@ public class GovProjectCollectionManage {

private final WpsConvertManage wpsConvertManage;

private final ThreadPoolTaskExecutor threadPoolTaskExecutor;

@Value("${project.push-url}")
private String pushUrl;

@@ -89,6 +97,9 @@ public class GovProjectCollectionManage {
@Value("${project.delete-all-url}")
private String deleteAllUrl;

@Value("${spring.profiles.active}")
private String active;

public List<GovProjectDictionaryVO> dictionary(String type) {

List<GovProjectDictionary> dictionaries = dictionaryService.list(Wrappers.lambdaQuery(GovProjectDictionary.class)
@@ -430,7 +441,7 @@ public class GovProjectCollectionManage {
saveApply.setUpdateBy(user.getUsername());
saveApply.setUpdateOn(LocalDateTime.now());
if(projectApplyService.saveOrUpdate(saveApply)){
uploadFileToProvincialOss(apply,oldApply,saveApply);
threadPoolTaskExecutor.execute(() -> uploadFileToProvincialOssApply(apply,oldApply,saveApply));
}
}

@@ -454,7 +465,9 @@ public class GovProjectCollectionManage {
saveApprove.setAreaCode(RegionConst.RC_LS);
saveApprove.setUpdateBy(user.getUsername());
saveApprove.setUpdateOn(LocalDateTime.now());
approveService.saveOrUpdate(saveApprove);
if(approveService.saveOrUpdate(saveApprove)){
threadPoolTaskExecutor.execute(() -> uploadFileToProvincialOssApprove(approve,oldApprove,saveApprove));
}
}

// 4.保存 建设项目 实施信息
@@ -478,7 +491,9 @@ public class GovProjectCollectionManage {
saveCimplement.setBizTime(LocalDateTime.now());
saveCimplement.setUpdateBy(user.getUsername());
saveCimplement.setUpdateOn(LocalDateTime.now());
cimplementService.saveOrUpdate(saveCimplement);
if(cimplementService.saveOrUpdate(saveCimplement)){
threadPoolTaskExecutor.execute(() -> uploadFileToProvincialOssCimplement(cimplement,oldCimplement,saveCimplement));
}
}

// 5.保存 运维项目 实施信息
@@ -793,39 +808,93 @@ public class GovProjectCollectionManage {
* @param apply
* @param oldApply
*/
private void uploadFileToProvincialOss(GovBizProjectApplyDTO apply,
private void uploadFileToProvincialOssApply(GovBizProjectApplyDTO apply,
GovBizProjectApply oldApply,GovBizProjectApply saveApply) {
if(checkFieldHas(apply.getBaseProjBasisFile(),oldApply,"baseProjBasisFile")){
JSONArray fileArray = JSON.parseArray(apply.getBaseProjBasisFile());
StringJoiner sj = new StringJoiner(";");
StringJoiner sj = convertAndUpload(apply.getBaseProjBasisFile());
saveApply.setBaseProjBasisFilePdf(sj.toString());
}
if(checkFieldHas(apply.getBaseProjApplyFile(),oldApply,"baseProjApplyFile")){
StringJoiner sj = convertAndUpload(apply.getBaseProjApplyFile());
saveApply.setBaseProjApplyFilePdf(sj.toString());
}
if(checkFieldHas(apply.getBaseOperatMaintenFile(),oldApply,"baseOperatMaintenFile")){
StringJoiner sj = convertAndUpload(apply.getBaseOperatMaintenFile());
saveApply.setBaseOperatMaintenFilePdf(sj.toString());
}
if(checkFieldHas(apply.getBaseResearchReportFile(),oldApply,"baseResearchReportFile")){
StringJoiner sj = convertAndUpload(apply.getBaseResearchReportFile());
saveApply.setBaseResearchReportFilePdf(sj.toString());
}
if(checkFieldHas(apply.getBaseProjOtherFile(),oldApply,"baseProjOtherFile")){
StringJoiner sj = convertAndUpload(apply.getBaseProjOtherFile());
saveApply.setBaseProjOtherFilePdf(sj.toString());
}
projectApplyService.updateById(saveApply);
}

private void uploadFileToProvincialOssApprove(GovBizProjectApproveDTO approve, GovBizProjectApprove oldApprove, GovBizProjectApprove saveApprove) {
if(checkFieldHas(approve.getApprovalFile(),oldApprove,"approvalFile")){
StringJoiner sj = convertAndUpload(approve.getApprovalFile());
saveApprove.setApprovalFilePdf(sj.toString());
}
if(checkFieldHas(approve.getBaseReviewCommentsFile(),oldApprove,"baseReviewCommentsFile")){
StringJoiner sj = convertAndUpload(approve.getBaseReviewCommentsFile());
saveApprove.setBaseReviewCommentsFilePdf(sj.toString());
}
if(checkFieldHas(approve.getPreliminaryDesignFile(),oldApprove,"preliminaryDesignFile")){
StringJoiner sj = convertAndUpload(approve.getPreliminaryDesignFile());
saveApprove.setPreliminaryDesignFilePdf(sj.toString());
}
approveService.updateById(saveApprove);
}

private void uploadFileToProvincialOssCimplement(GovBizProjectCimplementDTO cimplement, GovBizProjectCimplement oldCimplement, GovBizProjectCimplement saveCimplement) {
if(checkFieldHas(cimplement.getBaseChanFile(),oldCimplement,"baseChanFile")){
StringJoiner sj = convertAndUpload(cimplement.getBaseChanFile());
saveCimplement.setBaseChanFilePdf(sj.toString());
}
cimplementService.updateById(saveCimplement);
}

private StringJoiner convertAndUpload(String baseProjBasisFile) {
String[] baseProjBasisFileArr = baseProjBasisFile.split(";");
StringJoiner sj = new StringJoiner(";");
for(String bpb : baseProjBasisFileArr){
JSONArray fileArray = JSON.parseArray(bpb);
fileArray.forEach(j -> {
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(j));
byte[] btyes = wpsConvertManage.downloadToPdfStream(jsonObject.getLong("id"));
String oss = ProvincialManage.uploadToOss(btyes, jsonObject.getString("originalFileName"));
String suffix = jsonObject.getString("suffix");
String originalFileName = jsonObject.getString("originalFileName");
if(!BizConst.DEV.equals(active)){
originalFileName = originalFileName.replace(StrPool.DOT + suffix, ".pdf");
}
// upload(btyes,"/temp",originalFileName);
String oss = ProvincialManage.uploadToOss(btyes, originalFileName);
sj.add(oss);
});
saveApply.setBaseProjBasisFilePdf(sj.toString());
}
projectApplyService.updateById(saveApply);
return sj;
}

private Boolean checkFieldHas(String field,GovBizProjectApply oldApply,String fieldName){
private Boolean checkFieldHas(String field, Object record, String fieldName){
if(StringUtils.isBlank(field)){
return Boolean.FALSE;
}

//如果没有老值
if(Objects.isNull(oldApply)){
if(Objects.isNull(record)){
return Boolean.TRUE;
}

//和老值做个对比 不一样则true
Class<?> clazz = oldApply.getClass();
Class<?> clazz = record.getClass();
String oldFiled = StringUtils.EMPTY;
try {
Field fieldDeclared = clazz.getDeclaredField(fieldName);
fieldDeclared.setAccessible(Boolean.TRUE);
oldFiled = Objects.nonNull(fieldDeclared.get(oldApply)) ? String.valueOf(fieldDeclared.get(oldApply)) : null;
oldFiled = Objects.nonNull(fieldDeclared.get(record)) ? String.valueOf(fieldDeclared.get(record)) : null;
} catch (NoSuchFieldException e) {
log.error("转换PDF文件出错" + e);
} catch (IllegalAccessException e) {
@@ -838,4 +907,24 @@ public class GovProjectCollectionManage {

return Boolean.FALSE;
}

/**
* @param bytes byte数组
* @param fileRoute 文件路径
* @param fileName 文件名
*/
public static void upload(byte[] bytes,String fileRoute,String fileName) {
try {
File directory=new File(fileRoute);
if (!directory.exists()){
directory.mkdirs();
}
File file = new File(directory, fileName);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
bos.write(bytes);
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

+ 13
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/model/entity/GovBizProjectApply.java View File

@@ -152,4 +152,17 @@ public class GovBizProjectApply implements Serializable {

@ApiModelProperty("立项依据材料PDF版")
private String baseProjBasisFilePdf;

@ApiModelProperty("项目申报书PDF版")
private String baseProjApplyFilePdf;

@ApiModelProperty("运维方案PDF版")
private String baseOperatMaintenFilePdf;

@ApiModelProperty("可研报告PDF版")
private String baseResearchReportFilePdf;

@ApiModelProperty("其它文件PDF版")
private String baseProjOtherFilePdf;

}

+ 11
- 2
pmapi/src/main/java/com/ningdatech/pmapi/gov/model/entity/GovBizProjectApprove.java View File

@@ -36,7 +36,7 @@ public class GovBizProjectApprove implements Serializable {
@ApiModelProperty("基本项目名称")
private String baseProjName;

@ApiModelProperty("'发改项目代码'")
@ApiModelProperty("发改项目代码")
private String baseDevelopCode;

@ApiModelProperty("'财政项目代码'")
@@ -54,7 +54,7 @@ public class GovBizProjectApprove implements Serializable {
@ApiModelProperty("建议总投资")
private BigDecimal baseExpertTotalMoney;

@ApiModelProperty("'建议年度预算'")
@ApiModelProperty("建议年度预算")
private BigDecimal baseExpertYearMoney;

@ApiModelProperty("立项批复文件")
@@ -99,4 +99,13 @@ public class GovBizProjectApprove implements Serializable {

@ApiModelProperty("最后修改人")
private String updateBy;

@ApiModelProperty("立项批复文件")
private String approvalFilePdf;

@ApiModelProperty("评审意见附件PDF")
private String baseReviewCommentsFilePdf;

@ApiModelProperty("初步设计方案批复函PDF")
private String preliminaryDesignFilePdf;
}

+ 3
- 0
pmapi/src/main/java/com/ningdatech/pmapi/gov/model/entity/GovBizProjectCimplement.java View File

@@ -115,4 +115,7 @@ public class GovBizProjectCimplement implements Serializable {

@ApiModelProperty("最后修改人")
private String updateBy;

@ApiModelProperty("生产批复文件PDF")
private String baseChanFilePdf;
}

+ 1
- 24
pmapi/src/main/java/com/ningdatech/pmapi/wps/manage/WpsConvertManage.java View File

@@ -13,15 +13,12 @@ import com.suwell.ofd.custom.agent.AtomAgent;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

@@ -44,13 +41,11 @@ public class WpsConvertManage {
@Value("${spring.profiles.active}")
private String active;

// HTTPAgent ha = new HTTPAgent("http://127.0.0.1:8090");
//2、定义方法实现 多个文件合并转为1个pdf文件
public String offs2Pdf() {
AtomAgent ha = new AtomAgent("http://10.53.157.47");
AtomAgent ha = new AtomAgent(WpsContant.WPS_CONVERT_URL_ONLINE);

try {

//2-1、传参文件对象转换输出PDF文件
//1)、定义集合,存储待转换的原文件
List<File> fileList =new ArrayList<File>();
@@ -58,25 +53,10 @@ public class WpsConvertManage {
OutputStream out = null;
//3)、添加原文件到集合
fileList.add(new File("/temp/111.xlsx"));
// fileList.add(new File("D:/cs.doc"));
// fileList.add(new File("D:/a.pdf"));
// fileList.add(new File("D:\\555.ofd"));
//4)、赋值转换后的pdf文件输出流
out=new FileOutputStream(new File("/temp/offices2_pdf.pdf"));
//5)、调用方法,执行将多个文件转为pdf文件
ha.OFDToPDF(fileList, out);

//2-2、传参文件流转换输出PDF文件(与2-1二选一即可)
//1)、定义集合,存储待转换的原文件(支持传文件流)
// Param[] params = new Param[] {
// new Param(PackEntry.wrap(new FileInputStream("D:\\temp\\111.ofd")), "ofd"),
// new Param(PackEntry.wrap(new FileInputStream("D:\\2.ofd")), "ofd"),
// new Param(PackEntry.wrap(new FileInputStream("D:\\T3.txt")), "txt")
// };
//2)、赋值转换后的pdf文件输出流
// out=new FileOutputStream(new File("D:/convert/offices_pdf.pdf"));
//3)、调用方法,执行将多个文件转为pdf文件
// ha.OFDToPDF(params,out);
return "转换成功";
} catch (Exception e) {
log.error(e.getMessage());
@@ -164,8 +144,6 @@ public class WpsConvertManage {
AtomAgent ha = new AtomAgent(WpsContant.WPS_CONVERT_URL_ONLINE);
try (OSSObject ossObject = oss.getObject(file.getBucket(), file.getPath());
InputStream stream = ossObject.getObjectContent();) {
String fileName = null;
byte[] bytes = new byte[4096];
int read;
//测试环境 转不了PDF 请求不了 WPS转换服务器
if(BizConst.DEV.equals(active)){
@@ -188,7 +166,6 @@ public class WpsConvertManage {
//5)、调用方法,执行将多个文件转为pdf文件
ha.OFDToPDF(fileList, out);
FileInputStream fileInputStream = new FileInputStream(pdfFile);
fileName = URLEncoder.encode(WpsContant.PDF_NAME, CharsetUtil.UTF_8);
for(File f : fileList){
//用完就删
f.deleteOnExit();


Loading…
Cancel
Save