Browse Source

项目库导入修改

tags/24080901
CMM 1 year ago
parent
commit
80954b7ee3
7 changed files with 191 additions and 64 deletions
  1. +4
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/common/constant/CommonConst.java
  2. +31
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/projectlib/constant/ImportTemplateConstant.java
  3. +3
    -2
      pmapi/src/main/java/com/ningdatech/pmapi/projectlib/controller/AnnualPlanController.java
  4. +28
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/ImportTemplateEnum.java
  5. +118
    -56
      pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/AnnualPlanLibManage.java
  6. +6
    -6
      pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/dto/AnnualLibImportDTO.java
  7. +1
    -0
      pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java

+ 4
- 0
pmapi/src/main/java/com/ningdatech/pmapi/common/constant/CommonConst.java View File

@@ -42,6 +42,10 @@ public interface CommonConst {
String ITEM_BASED = "依据项:"; String ITEM_BASED = "依据项:";
String ITEM_BASED_FILE_NAME = "依据文件名:"; String ITEM_BASED_FILE_NAME = "依据文件名:";
String APPENDIX = "文件:"; String APPENDIX = "文件:";
String NEW_CONSTRUCTION = "新建";
String CONTINUED_CONSTRUCTION = "续建";
String MONTH = "月";





} }

+ 31
- 0
pmapi/src/main/java/com/ningdatech/pmapi/projectlib/constant/ImportTemplateConstant.java View File

@@ -0,0 +1,31 @@
package com.ningdatech.pmapi.projectlib.constant;

import com.ningdatech.pmapi.projectlib.enumeration.ImportTemplateEnum;

import java.util.*;


/**
* <p>
* ImportTemplateEnumConstant
* </p>
*
* @author WendyYang
* @since 20:11 2022/11/4
*/
public class ImportTemplateConstant {

public static final List<String> ANNUAL_PLAN_COL_LIST = Arrays.asList("序号","项目id","项目名称","建设内容","建设依据","建设性质","建设起止年限(填写到月)", "总投资", "自有资金", "政府投资-本级财政","政府投资-上级补助资金","银行贷款","其他","一季度","二季度","三季度","四季度","建设单位","项目联系人","项目分管领导","备注");

private static final Map<ImportTemplateEnum, List<String>> IMPORT_TEMPLATE_MAP;

static {
IMPORT_TEMPLATE_MAP = new HashMap<>(ImportTemplateEnum.values().length);
IMPORT_TEMPLATE_MAP.put(ImportTemplateEnum.ANNUAL_PLAN, ANNUAL_PLAN_COL_LIST);
}

public static List<String> getTemplateTitle(ImportTemplateEnum template) {
return IMPORT_TEMPLATE_MAP.getOrDefault(template, Collections.emptyList());
}

}

+ 3
- 2
pmapi/src/main/java/com/ningdatech/pmapi/projectlib/controller/AnnualPlanController.java View File

@@ -2,6 +2,7 @@ package com.ningdatech.pmapi.projectlib.controller;


import com.ningdatech.basic.model.PageVo; import com.ningdatech.basic.model.PageVo;
import com.ningdatech.log.annotation.WebLog; import com.ningdatech.log.annotation.WebLog;
import com.ningdatech.pmapi.projectlib.enumeration.ImportTemplateEnum;
import com.ningdatech.pmapi.projectlib.manage.AnnualPlanLibManage; import com.ningdatech.pmapi.projectlib.manage.AnnualPlanLibManage;
import com.ningdatech.pmapi.projectlib.model.dto.ProjectDTO; import com.ningdatech.pmapi.projectlib.model.dto.ProjectDTO;
import com.ningdatech.pmapi.projectlib.model.req.ProjectApprovedReq; import com.ningdatech.pmapi.projectlib.model.req.ProjectApprovedReq;
@@ -64,8 +65,8 @@ public class AnnualPlanController {
@PostMapping("/importAnnualPlan") @PostMapping("/importAnnualPlan")
@ApiOperation("导入年度计划") @ApiOperation("导入年度计划")
@WebLog("导入年度计划") @WebLog("导入年度计划")
public void importAnnualPlan(MultipartFile file) {
annualPlanLibManage.importAnnualPlan(file);
public void importAnnualPlan(@RequestParam("template") ImportTemplateEnum template, MultipartFile file) {
annualPlanLibManage.importAnnualPlan(template,file);
} }


@PostMapping("/modify") @PostMapping("/modify")


+ 28
- 0
pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/ImportTemplateEnum.java View File

@@ -0,0 +1,28 @@
package com.ningdatech.pmapi.projectlib.enumeration;

import lombok.Getter;

/**
* <p>
* 导入模版枚举
* </p>
*
* @author WendyYang
* @since 2022-11-04
*/
@Getter
public enum ImportTemplateEnum {

/**
* 通用导入模版枚举
*/

ANNUAL_PLAN("年度计划(增补)库导入");

private final String value;

ImportTemplateEnum(String value) {
this.value = value;
}

}

+ 118
- 56
pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/AnnualPlanLibManage.java View File

@@ -1,6 +1,9 @@
package com.ningdatech.pmapi.projectlib.manage; package com.ningdatech.pmapi.projectlib.manage;


import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.event.AnalysisEventListener;
@@ -13,12 +16,15 @@ import com.ningdatech.basic.model.PageVo;
import com.ningdatech.basic.util.CollUtils; import com.ningdatech.basic.util.CollUtils;
import com.ningdatech.basic.util.ValidUtil; import com.ningdatech.basic.util.ValidUtil;
import com.ningdatech.pmapi.common.constant.CommonConst; import com.ningdatech.pmapi.common.constant.CommonConst;
import com.ningdatech.pmapi.common.enumeration.CommonEnum;
import com.ningdatech.pmapi.common.helper.UserInfoHelper; import com.ningdatech.pmapi.common.helper.UserInfoHelper;
import com.ningdatech.pmapi.common.model.entity.ExcelExportWriter; import com.ningdatech.pmapi.common.model.entity.ExcelExportWriter;
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils; import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils;
import com.ningdatech.pmapi.common.util.ExcelDownUtil; import com.ningdatech.pmapi.common.util.ExcelDownUtil;
import com.ningdatech.pmapi.datascope.model.DataScopeDTO; import com.ningdatech.pmapi.datascope.model.DataScopeDTO;
import com.ningdatech.pmapi.datascope.utils.DataScopeUtil; import com.ningdatech.pmapi.datascope.utils.DataScopeUtil;
import com.ningdatech.pmapi.projectlib.constant.ImportTemplateConstant;
import com.ningdatech.pmapi.projectlib.enumeration.ImportTemplateEnum;
import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum; import com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum;
import com.ningdatech.pmapi.projectlib.helper.ProjectHelper; import com.ningdatech.pmapi.projectlib.helper.ProjectHelper;
import com.ningdatech.pmapi.projectlib.model.dto.AnnualLibImportDTO; import com.ningdatech.pmapi.projectlib.model.dto.AnnualLibImportDTO;
@@ -35,6 +41,7 @@ import com.ningdatech.pmapi.user.security.auth.model.UserFullInfoDTO;
import com.ningdatech.pmapi.user.util.LoginUserUtil; import com.ningdatech.pmapi.user.util.LoginUserUtil;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -42,6 +49,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;


import static com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum.*; import static com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum.*;
@@ -162,65 +170,109 @@ public class AnnualPlanLibManage {
} }


@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void importAnnualPlan(MultipartFile file) {
try (InputStream inputStream = file.getInputStream()) {
EasyExcel.read(inputStream, new AnalysisEventListener<AnnualLibImportDTO>() {

private final List<Project> records = new ArrayList<>();
public void importAnnualPlan(ImportTemplateEnum template, MultipartFile file) {
String contentType = file.getContentType();
if (!contentType.equals(ExcelUtil.XLS_CONTENT_TYPE) &&
!contentType.equals(ExcelUtil.XLSX_CONTENT_TYPE)
) {
throw BizException.wrap("导入失败,不支持的文件类型,请按照提供的模板导入文件!");
}
try (InputStream inputStream = file.getInputStream();
ExcelReader reader = ExcelUtil.getReader(inputStream)) {
Map<String, String> alias;
List<String> title = ImportTemplateConstant.getTemplateTitle(template);
switch (template) {
case ANNUAL_PLAN:
alias = new HashMap<>(title.size());
alias.put(title.get(0), "id");
alias.put(title.get(1), "projectId");
alias.put(title.get(2), "projectName");
alias.put(title.get(3), "projectIntroduction");
alias.put(title.get(4), "buildBasis");
alias.put(title.get(5), "isFirst");
alias.put(title.get(6), "buildCycle");
alias.put(title.get(7), "declaredAmount");
alias.put(title.get(8), "annualPlanAmount");
alias.put(title.get(9), "declareHaveAmount");
alias.put(title.get(10), "declareGovOwnFinanceAmount");
alias.put(title.get(11), "declareGovSuperiorFinanceAmount");
alias.put(title.get(12), "declareBankLendingAmount");
alias.put(title.get(13), "declareOtherAmount");
alias.put(title.get(14), "firstQuarter");
alias.put(title.get(15), "secondQuarter");
alias.put(title.get(16), "thirdQuarter");
alias.put(title.get(17), "fourthQuarter");
alias.put(title.get(18), "buildUnitName");
alias.put(title.get(19), "contactName");
alias.put(title.get(20), "responsibleMan");
alias.put(title.get(21), "projectRemarks");
reader.setHeaderAlias(alias);
importAnnualPlanData(reader.readAll(AnnualLibImportDTO.class));
break;
default:
throw new BizException("不支持的数据导入类型");
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}


@Override
public void onException(Exception exception, AnalysisContext context) throws Exception {
super.onException(exception, context);
throw BizException.wrap("导入年度计划解析失败");
}
private void importAnnualPlanData(List<AnnualLibImportDTO> importDataList) {
if (CollectionUtils.isEmpty(importDataList)) {
return;
}
List<Project> projectList = new ArrayList<>();
List<Long> projectIds = CollUtils.fieldList(importDataList, AnnualLibImportDTO::getProjectId);
Assert.isTrue(projectIds.size() == importDataList.size(), "项目ID不可重复");
Long userId = LoginUserUtil.getUserId();
LocalDateTime now = LocalDateTime.now();
importDataList.forEach(w -> {
Project project = new Project();
project.setCreateBy(userId);
project.setCreateOn(now);
project.setUpdateBy(userId);
project.setUpdateOn(now);


@Override
public void invoke(AnnualLibImportDTO data, AnalysisContext context) {
ValidUtil.valid(data);
Project project = new Project();
project.setId(data.getProjectId());
project.setProjectName(data.getProjectName());
project.setProjectRemarks(data.getProjectRemarks());
project.setEngineeringSpeedOne(data.getEngineeringSpeedOne());
project.setEngineeringSpeedTwo(data.getEngineeringSpeedTwo());
project.setEngineeringSpeedThree(data.getEngineeringSpeedThree());
project.setEngineeringSpeedFour(data.getEngineeringSpeedFour());
project.setAnnualPlanAmount(data.getAnnualPlanAmount());
project.setDeclareOtherAmount(data.getDeclareOtherAmount());
project.setBuildBasis(data.getBuildBasis());
project.setBuildOrgName(data.getBuildUnitName());
project.setDeclareBankLendingAmount(data.getDeclareBankLendingAmount());
project.setDeclareGovOwnFinanceAmount(data.getDeclareGovOwnFinanceAmount());
project.setDeclareGovSuperiorFinanceAmount(data.getDeclareGovSuperiorFinanceAmount());
project.setDeclareHaveAmount(data.getDeclareHaveAmount());
project.setDeclareOtherAmount(data.getDeclareOtherAmount());
project.setContactName(data.getContactName());
project.setResponsibleMan(data.getResponsibleMan());
String[] dataArr = data.getBuildCycle().split("至");
project.setBeginTime(dataArr[0].trim());
project.setEndTime(dataArr[1].trim());
project.setProjectIntroduction(data.getProjectIntroduction());
project.setIsFirst("新建".equals(data.getIsFirst()) ? 1 : 0);
records.add(project);
}
project.setId(w.getProjectId());
project.setProjectName(w.getProjectName());
project.setProjectIntroduction(w.getProjectIntroduction());
// 建设依据(立项依据忽略)
if (CommonConst.NEW_CONSTRUCTION.equals(w.getIsFirst())){
project.setIsFirst(CommonEnum.YES.getCode());
}else if (CommonConst.CONTINUED_CONSTRUCTION.equals(w.getIsFirst())){
project.setIsFirst(CommonEnum.NO.getCode());
}
String buildCycle = w.getBuildCycle();
int index = buildCycle.indexOf(CommonConst.MONTH);
if (-1 == index){
throw new BizException("项目ID为%s的建设起止年限格式不正确,请按照");
}
String beginTime = buildCycle.substring(0, index + 1);
project.setBeginTime(beginTime);
String endTime = buildCycle.substring(index + 2);
project.setEndTime(endTime);
project.setDeclareAmount(w.getDeclaredAmount());
project.setAnnualPlanAmount(w.getAnnualPlanAmount());
project.setDeclareHaveAmount(w.getDeclareHaveAmount());
project.setDeclareGovOwnFinanceAmount(w.getDeclareGovOwnFinanceAmount());
project.setDeclareGovSuperiorFinanceAmount(w.getDeclareGovSuperiorFinanceAmount());
project.setDeclareBankLendingAmount(w.getDeclareBankLendingAmount());
project.setDeclareOtherAmount(w.getDeclareOtherAmount());
project.setEngineeringSpeedOne(w.getFirstQuarter());
project.setEngineeringSpeedTwo(w.getSecondQuarter());
project.setEngineeringSpeedThree(w.getThirdQuarter());
project.setEngineeringSpeedFour(w.getFourthQuarter());


@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (records.isEmpty()) {
throw BizException.wrap("导入年度计划为空");
}
List<Long> projectIds = CollUtils.fieldList(records, Project::getId);
long count = projectService.count(Wrappers.lambdaQuery(Project.class)
.in(Project::getId, projectIds));
if (count != records.size()) {
throw BizException.wrap("请确保所有项目都存在");
}
projectService.updateBatchById(records);
}
}).sheet(0).doReadSync();
} catch (IOException e) {
throw BizException.wrap("导入年度计划失败");
}
project.setBuildOrgName(w.getBuildUnitName());
project.setContactName(w.getContactName());
project.setResponsibleMan(w.getResponsibleMan());
project.setProjectRemarks(w.getProjectRemarks());
projectList.add(project);
});
LambdaQueryWrapper<Project> delQuery = Wrappers.lambdaQuery(Project.class)
.in(Project::getId, projectIds);
projectService.remove(delQuery);
projectService.saveBatch(projectList);
} }


public void updateAnnualPlan(ProjectDTO req) { public void updateAnnualPlan(ProjectDTO req) {
@@ -304,4 +356,14 @@ public class AnnualPlanLibManage {
} }
return user; return user;
} }


public static void main(String[] args) {
String a = "2023年3月至2023年11月";
int index = a.indexOf("-");
String b = a.substring(0, index + 1);
System.out.println(b);
String c = a.substring(index + 2);
System.out.println(c);
}
} }

+ 6
- 6
pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/dto/AnnualLibImportDTO.java View File

@@ -62,8 +62,8 @@ public class AnnualLibImportDTO {
@NotNull(message = "政府投资-本级财政不能为空") @NotNull(message = "政府投资-本级财政不能为空")
private BigDecimal declareGovOwnFinanceAmount; private BigDecimal declareGovOwnFinanceAmount;


@ExcelProperty("政府投资-上级补")
@NotNull(message = "政府投资-上级补不能为空")
@ExcelProperty("政府投资-上级补助资金")
@NotNull(message = "政府投资-上级补助资金不能为空")
private BigDecimal declareGovSuperiorFinanceAmount; private BigDecimal declareGovSuperiorFinanceAmount;


@ExcelProperty("银行贷款") @ExcelProperty("银行贷款")
@@ -76,19 +76,19 @@ public class AnnualLibImportDTO {


@ExcelProperty("一季度") @ExcelProperty("一季度")
@NotBlank(message = "一季度不能为空") @NotBlank(message = "一季度不能为空")
private String engineeringSpeedOne;
private String firstQuarter;


@ExcelProperty("二季度") @ExcelProperty("二季度")
@NotBlank(message = "二季度不能为空") @NotBlank(message = "二季度不能为空")
private String engineeringSpeedTwo;
private String secondQuarter;


@ExcelProperty("三季度") @ExcelProperty("三季度")
@NotBlank(message = "三季度不能为空") @NotBlank(message = "三季度不能为空")
private String engineeringSpeedThree;
private String thirdQuarter;


@ExcelProperty("四季度") @ExcelProperty("四季度")
@NotBlank(message = "四季度不能为空") @NotBlank(message = "四季度不能为空")
private String engineeringSpeedFour;
private String fourthQuarter;


@ExcelProperty("建设单位") @ExcelProperty("建设单位")
@NotBlank(message = "建设单位不能为空") @NotBlank(message = "建设单位不能为空")


+ 1
- 0
pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java View File

@@ -662,6 +662,7 @@ public class TodoCenterManage {
ResToBeProcessedVO res = new ResToBeProcessedVO(); ResToBeProcessedVO res = new ResToBeProcessedVO();
Project project = projectInfoMap.get(d.getInstanceId()); Project project = projectInfoMap.get(d.getInstanceId());
BeanUtils.copyProperties(project, res); BeanUtils.copyProperties(project, res);
res.setInstCode(d.getInstanceId());
res.setBuildOrg(project.getBuildOrgName()); res.setBuildOrg(project.getBuildOrgName());
res.setDeclaredAmount(project.getDeclareAmount()); res.setDeclaredAmount(project.getDeclareAmount());
res.setProjectId(project.getId()); res.setProjectId(project.getId());


Loading…
Cancel
Save