diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/common/constant/CommonConst.java b/pmapi/src/main/java/com/ningdatech/pmapi/common/constant/CommonConst.java
index f79e150..7f1dd50 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/common/constant/CommonConst.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/common/constant/CommonConst.java
@@ -42,6 +42,10 @@ public interface CommonConst {
String ITEM_BASED = "依据项:";
String ITEM_BASED_FILE_NAME = "依据文件名:";
String APPENDIX = "文件:";
+ String NEW_CONSTRUCTION = "新建";
+ String CONTINUED_CONSTRUCTION = "续建";
+ String MONTH = "月";
+
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/constant/ImportTemplateConstant.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/constant/ImportTemplateConstant.java
new file mode 100644
index 0000000..2b9f020
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/constant/ImportTemplateConstant.java
@@ -0,0 +1,31 @@
+package com.ningdatech.pmapi.projectlib.constant;
+
+import com.ningdatech.pmapi.projectlib.enumeration.ImportTemplateEnum;
+
+import java.util.*;
+
+
+/**
+ *
+ * ImportTemplateEnumConstant
+ *
+ *
+ * @author WendyYang
+ * @since 20:11 2022/11/4
+ */
+public class ImportTemplateConstant {
+
+ public static final List ANNUAL_PLAN_COL_LIST = Arrays.asList("序号","项目id","项目名称","建设内容","建设依据","建设性质","建设起止年限(填写到月)", "总投资", "自有资金", "政府投资-本级财政","政府投资-上级补助资金","银行贷款","其他","一季度","二季度","三季度","四季度","建设单位","项目联系人","项目分管领导","备注");
+
+ private static final Map> 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 getTemplateTitle(ImportTemplateEnum template) {
+ return IMPORT_TEMPLATE_MAP.getOrDefault(template, Collections.emptyList());
+ }
+
+}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/controller/AnnualPlanController.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/controller/AnnualPlanController.java
index be316dd..901d3e4 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/controller/AnnualPlanController.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/controller/AnnualPlanController.java
@@ -2,6 +2,7 @@ package com.ningdatech.pmapi.projectlib.controller;
import com.ningdatech.basic.model.PageVo;
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.model.dto.ProjectDTO;
import com.ningdatech.pmapi.projectlib.model.req.ProjectApprovedReq;
@@ -64,8 +65,8 @@ public class AnnualPlanController {
@PostMapping("/importAnnualPlan")
@ApiOperation("导入年度计划")
@WebLog("导入年度计划")
- public void importAnnualPlan(MultipartFile file) {
- annualPlanLibManage.importAnnualPlan(file);
+ public void importAnnualPlan(@RequestParam("template") ImportTemplateEnum template, MultipartFile file) {
+ annualPlanLibManage.importAnnualPlan(template,file);
}
@PostMapping("/modify")
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/ImportTemplateEnum.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/ImportTemplateEnum.java
new file mode 100644
index 0000000..de78e8f
--- /dev/null
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/enumeration/ImportTemplateEnum.java
@@ -0,0 +1,28 @@
+package com.ningdatech.pmapi.projectlib.enumeration;
+
+import lombok.Getter;
+
+/**
+ *
+ * 导入模版枚举
+ *
+ *
+ * @author WendyYang
+ * @since 2022-11-04
+ */
+@Getter
+public enum ImportTemplateEnum {
+
+ /**
+ * 通用导入模版枚举
+ */
+
+ ANNUAL_PLAN("年度计划(增补)库导入");
+
+ private final String value;
+
+ ImportTemplateEnum(String value) {
+ this.value = value;
+ }
+
+}
\ No newline at end of file
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/AnnualPlanLibManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/AnnualPlanLibManage.java
index ab7cb14..371d1df 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/AnnualPlanLibManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/manage/AnnualPlanLibManage.java
@@ -1,6 +1,9 @@
package com.ningdatech.pmapi.projectlib.manage;
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.context.AnalysisContext;
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.ValidUtil;
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.model.entity.ExcelExportWriter;
import com.ningdatech.pmapi.common.statemachine.util.StateMachineUtils;
import com.ningdatech.pmapi.common.util.ExcelDownUtil;
import com.ningdatech.pmapi.datascope.model.DataScopeDTO;
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.helper.ProjectHelper;
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 lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
@@ -42,6 +49,7 @@ 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.*;
import static com.ningdatech.pmapi.projectlib.enumeration.ProjectStatusEnum.*;
@@ -162,65 +170,109 @@ public class AnnualPlanLibManage {
}
@Transactional(rollbackFor = Exception.class)
- public void importAnnualPlan(MultipartFile file) {
- try (InputStream inputStream = file.getInputStream()) {
- EasyExcel.read(inputStream, new AnalysisEventListener() {
-
- private final List 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 alias;
+ List 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 importDataList) {
+ if (CollectionUtils.isEmpty(importDataList)) {
+ return;
+ }
+ List projectList = new ArrayList<>();
+ List 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 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 delQuery = Wrappers.lambdaQuery(Project.class)
+ .in(Project::getId, projectIds);
+ projectService.remove(delQuery);
+ projectService.saveBatch(projectList);
}
public void updateAnnualPlan(ProjectDTO req) {
@@ -304,4 +356,14 @@ public class AnnualPlanLibManage {
}
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);
+ }
}
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/dto/AnnualLibImportDTO.java b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/dto/AnnualLibImportDTO.java
index fbfa348..69f35a2 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/dto/AnnualLibImportDTO.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/projectlib/model/dto/AnnualLibImportDTO.java
@@ -62,8 +62,8 @@ public class AnnualLibImportDTO {
@NotNull(message = "政府投资-本级财政不能为空")
private BigDecimal declareGovOwnFinanceAmount;
- @ExcelProperty("政府投资-上级补")
- @NotNull(message = "政府投资-上级补不能为空")
+ @ExcelProperty("政府投资-上级补助资金")
+ @NotNull(message = "政府投资-上级补助资金不能为空")
private BigDecimal declareGovSuperiorFinanceAmount;
@ExcelProperty("银行贷款")
@@ -76,19 +76,19 @@ public class AnnualLibImportDTO {
@ExcelProperty("一季度")
@NotBlank(message = "一季度不能为空")
- private String engineeringSpeedOne;
+ private String firstQuarter;
@ExcelProperty("二季度")
@NotBlank(message = "二季度不能为空")
- private String engineeringSpeedTwo;
+ private String secondQuarter;
@ExcelProperty("三季度")
@NotBlank(message = "三季度不能为空")
- private String engineeringSpeedThree;
+ private String thirdQuarter;
@ExcelProperty("四季度")
@NotBlank(message = "四季度不能为空")
- private String engineeringSpeedFour;
+ private String fourthQuarter;
@ExcelProperty("建设单位")
@NotBlank(message = "建设单位不能为空")
diff --git a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java
index 3523916..1c81f09 100644
--- a/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java
+++ b/pmapi/src/main/java/com/ningdatech/pmapi/todocenter/manage/TodoCenterManage.java
@@ -662,6 +662,7 @@ public class TodoCenterManage {
ResToBeProcessedVO res = new ResToBeProcessedVO();
Project project = projectInfoMap.get(d.getInstanceId());
BeanUtils.copyProperties(project, res);
+ res.setInstCode(d.getInstanceId());
res.setBuildOrg(project.getBuildOrgName());
res.setDeclaredAmount(project.getDeclareAmount());
res.setProjectId(project.getId());