update 增加项目计划导入导出

dev_xds
haha 2023-08-18 00:18:13 +08:00
parent 46dc8626f3
commit 5df7e47467
6 changed files with 346 additions and 48 deletions

View File

@ -4,37 +4,82 @@
<template slot="title">
<div>{{ title + ' 【计划节点】' }}</div>
<right-toolbar @queryTable="loadData" :search="false">
<template slot="left">
<el-button type="primary" @click="doExport"></el-button>
<el-popover placement="top-start" title="提示" trigger="hover" content="请选择导出的模板修改后的文件。">
<el-button type="success" slot="reference" @click="doImport" style="margin:0px 12px;">导入</el-button>
</el-popover>
</template>
</right-toolbar>
</template>
<el-tabs v-model="activeName" >
<el-tab-pane :label="''+it.nodeText" :name="''+it.id" :key="idx" v-for="(it,idx) in nodes" >
<node-item :item="it" :showLabel="false" style="border-bottom: solid 1px #ccc;"></node-item>
<div v-for="(it2,idx) in it.children" :key="idx" class="lvl-2">
<node-item :item="it2"></node-item>
<div v-for="(it3,idx) in it2.children" :key="idx" v-if="it2.children.length>0" style="padding-left: 40px;" class="lvl-3">
<node-item :item="it3"></node-item>
</div>
<el-tabs v-model="activeName">
<el-tab-pane :label="'' + it.nodeText" :name="'' + it.id" :key="idx" v-for="(it, idx) in nodes">
<node-item :item="it" :showLabel="false" style="border-bottom: solid 1px #ccc;"></node-item>
<div v-for="(it2, idx) in it.children" :key="idx" class="lvl-2">
<node-item :item="it2"></node-item>
<div v-for="(it3, idx) in it2.children" :key="idx" v-if="it2.children.length > 0"
style="padding-left: 40px;" class="lvl-3">
<node-item :item="it3"></node-item>
</div>
</el-tab-pane>
</div>
</el-tab-pane>
</el-tabs>
</el-drawer>
<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="600px"
:close-on-click-modal="false" :close-on-press-escape="false"
append-to-body :custom-class="'build-node-import-dlg file-'+ upload.files.length">
<el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :multiple="false" :on-change="uploadChange"
:action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-remove="uploadChange"
:on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<div class="el-upload__tip text-center" slot="tip">
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;"
@click="doExport">下载模板</el-link>
</div>
</el-upload>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitFileForm"> </el-button>
<el-button @click="upload.open = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {listByProject} from '@/api/project/build_node_data.js'
import { listByProject } from '@/api/project/build_node_data.js'
import { getToken } from "@/utils/auth";
import NodeItem from './nodeItem.vue'
export default {
name: 'RuoyiUiBuildNodeDrawer',
components:{
components: {
NodeItem
},
data() {
return {
isOpen:false,
isOpen: false,
prj: null,
nodes:[],
activeName:''
nodes: [],
activeName: '',
//
upload: {
files:[],
//
open: false,
//
title: "",
//
isUploading: false,
//
updateSupport: 0,
//
headers: { Authorization: "Bearer " + getToken() },
//
url: process.env.VUE_APP_BASE_API+"/project/build_node_data/importData"
},
};
},
@ -43,27 +88,53 @@ export default {
},
methods: {
loadData(init){
listByProject(this.prj.id).then(d=>{
let tmps=(d.data||[]).map(it=>{
it.lvl=it.baseBuildNode.nodeLvl;
it.parentLvl=it.lvl.substring(0,it.lvl.length-2);
it.nodeText=it.baseBuildNode.nodeText;
it.file=this.$tryToJson(it.files,[]);
return it;
});
let objs=tmps.filter(d=>d.parentLvl.length==0);
objs.forEach(it=>{
it.children=tmps.filter(item=>item.parentLvl==it.lvl)
it.children.forEach(item=>{
item.children=tmps.filter(item3=>item3.parentLvl==item.lvl);
uploadChange(a,b,c){
this.upload.files=b;
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true;
},
//
handleFileSuccess(response, file, fileList) {
this.upload.open = false;
this.upload.isUploading = false;
this.$refs.upload.clearFiles();
this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
this.loadData();
},
submitFileForm() {
this.$refs.upload.submit();
},
doImport() {
this.upload.title = `${this.prj.projectName}_项目计划节点导入`;
this.upload.open = true;
},
doExport() {
this.download('project/build_node_data/export', {
projectId: this.prj.id
}, `${this.prj.projectName}_项目计划节点.xlsx`);
},
loadData(init) {
listByProject(this.prj.id).then(d => {
let tmps = (d.data || []).map(it => {
it.lvl = it.baseBuildNode.nodeLvl;
it.parentLvl = it.lvl.substring(0, it.lvl.length - 2);
it.nodeText = it.baseBuildNode.nodeText;
it.file = this.$tryToJson(it.files, []);
return it;
});
})
this.nodes=objs;
if(init){
this.activeName=objs.length>0?objs[0].id+'':'';
}
let objs = tmps.filter(d => d.parentLvl.length == 0);
objs.forEach(it => {
it.children = tmps.filter(item => item.parentLvl == it.lvl)
it.children.forEach(item => {
item.children = tmps.filter(item3 => item3.parentLvl == item.lvl);
});
})
this.nodes = objs;
if (init) {
this.activeName = objs.length > 0 ? objs[0].id + '' : '';
}
});
},
show(prj) {
@ -77,26 +148,49 @@ export default {
</script>
<style lang="scss" scoped>
.project-build-node-drawer{
::v-deep .el-drawer{
.project-build-node-drawer {
::v-deep .el-drawer {
min-width: 1600px;
}
::v-deep .el-drawer__header{
::v-deep .el-drawer__header {
margin-bottom: 0px;
}
::v-deep .el-drawer__body{
padding:0px 24px;
::v-deep .el-drawer__body {
padding: 0px 24px;
.el-form {
overflow: hidden;
.el-form-item{
.el-form-item {
margin-bottom: 15px !important;
}
}
.lvl-3{
.lbl-title{
.lvl-3 {
.lbl-title {
font-size: 12px;
}
}
}
}
</style>
<style lang="scss">
.build-node-import-dlg{
.el-upload{
width:100%;
.el-upload-dragger{
width: 100%;
}
}
&.file-1{
.el-upload{
display: none;
}
.el-upload__tip{
display: none;
}
}
}
</style>

View File

@ -1,8 +1,12 @@
package com.yanzhu.jh.project.controller;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.yanzhu.jh.project.domain.vo.SurProjectBuildNodeDataExport;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
@ -21,6 +25,7 @@ import com.yanzhu.jh.project.domain.SurProjectBuildNodeData;
import com.yanzhu.jh.project.service.ISurProjectBuildNodeDataService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* Controller
@ -58,8 +63,25 @@ public class SurProjectBuildNodeDataController extends BaseController
public void export(HttpServletResponse response, SurProjectBuildNodeData surProjectBuildNodeData)
{
List<SurProjectBuildNodeData> list = surProjectBuildNodeDataService.selectSurProjectBuildNodeDataList(surProjectBuildNodeData);
ExcelUtil<SurProjectBuildNodeData> util = new ExcelUtil<SurProjectBuildNodeData>(SurProjectBuildNodeData.class);
util.exportExcel(response, list, "项目建设节点数据数据");
List<SurProjectBuildNodeDataExport> exportList=new ArrayList<>();
for(SurProjectBuildNodeData it :list){
exportList.add(SurProjectBuildNodeDataExport.convert(it));
}
ExcelUtil<SurProjectBuildNodeDataExport> util = new ExcelUtil<SurProjectBuildNodeDataExport>(SurProjectBuildNodeDataExport.class);
util.exportExcel(response, exportList, "项目计划节点");
}
@Log(title = "项目建设节点数据", businessType = BusinessType.IMPORT)
@PreAuthorize("@ss.hasPermi('project:build_node_data:import')")
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{
ExcelUtil<SurProjectBuildNodeDataExport> util = new ExcelUtil<SurProjectBuildNodeDataExport>(SurProjectBuildNodeDataExport.class);
InputStream is=file.getInputStream();
List<SurProjectBuildNodeDataExport> list = util.importExcel(is);
is.close();
int n=surProjectBuildNodeDataService.importData(list);
return success("成功导入"+n+"条数据!");
}
/**

View File

@ -0,0 +1,149 @@
package com.yanzhu.jh.project.domain.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.yanzhu.jh.project.domain.SurProjectBuildNodeData;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import java.util.Date;
public class SurProjectBuildNodeDataExport {
@Excel(name = "编号(不要修改)", width = 20,prompt = "不要修改修改此列")
private Long id;
@Excel(name = "项目编号", width = 10,prompt = "不要修改修改此列")
private Long projectId;
@Excel(name = "项目名称", width = 30,align = HorizontalAlignment.LEFT,prompt = "不要修改修改此列")
private String projectName;
@Excel(name = "一级", width = 20,align = HorizontalAlignment.LEFT,prompt = "不要修改修改此列")
private String lvl1;
@Excel(name = "二级", width = 20,align = HorizontalAlignment.LEFT,prompt = "不要修改修改此列")
private String lvl2;
@Excel(name = "三级", width = 20,align = HorizontalAlignment.LEFT,prompt = "不要修改修改此列")
private String lvl3;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "计划开始时间", width = 15, dateFormat = "yyyy-MM-dd")
private Date planStartDate;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "计划结束时间", width = 15, dateFormat = "yyyy-MM-dd")
private Date planEndDate;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "实际开始时间", width = 15, dateFormat = "yyyy-MM-dd")
private Date startDate;
@JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "实际结束时间", width = 15, dateFormat = "yyyy-MM-dd")
private Date endDate;
public Long getProjectId() {
return projectId;
}
public void setProjectId(Long projectId) {
this.projectId = projectId;
}
public static SurProjectBuildNodeDataExport convert(SurProjectBuildNodeData it) {
SurProjectBuildNodeDataExport d=new SurProjectBuildNodeDataExport();
d.id=it.getId();
d.projectName=it.getProject().getProjectName();
d.planStartDate=it.getPlanStartDate();
d.planEndDate=it.getPlanEndDate();
d.startDate=it.getStartDate();
d.endDate=it.getEndDate();
d.projectId=it.getProjectId();
String name= it.getBaseBuildNode().getNodeText();
String lvl=it.getBaseBuildNode().getNodeLvl();
d.lvl1="";
d.lvl2="";
d.lvl3="";
if(lvl.length()==2){
d.lvl1=name;
}
if(lvl.length()==4){
d.lvl2=name;
}
if(lvl.length()==6){
d.lvl3=name;
}
return d;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getLvl1() {
return lvl1;
}
public void setLvl1(String lvl1) {
this.lvl1 = lvl1;
}
public String getLvl2() {
return lvl2;
}
public void setLvl2(String lvl2) {
this.lvl2 = lvl2;
}
public String getLvl3() {
return lvl3;
}
public void setLvl3(String lvl3) {
this.lvl3 = lvl3;
}
public Date getPlanStartDate() {
return planStartDate;
}
public void setPlanStartDate(Date planStartDate) {
this.planStartDate = planStartDate;
}
public Date getPlanEndDate() {
return planEndDate;
}
public void setPlanEndDate(Date planEndDate) {
this.planEndDate = planEndDate;
}
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}

View File

@ -1,4 +0,0 @@
package com.yanzhu.jh.project.domain.where;
public class SurProjectBuildNodeDataExport {
}

View File

@ -2,6 +2,7 @@ package com.yanzhu.jh.project.service;
import java.util.List;
import com.yanzhu.jh.project.domain.SurProjectBuildNodeData;
import com.yanzhu.jh.project.domain.vo.SurProjectBuildNodeDataExport;
/**
* Service
@ -60,4 +61,6 @@ public interface ISurProjectBuildNodeDataService
public int deleteSurProjectBuildNodeDataById(Long id);
public int addProjectNodes(long projectId);
public int importData(List<SurProjectBuildNodeDataExport> list);
}

View File

@ -1,7 +1,10 @@
package com.yanzhu.jh.project.service.impl;
import java.util.List;
import java.util.stream.Collectors;
import com.ruoyi.common.utils.DateUtils;
import com.yanzhu.jh.project.domain.vo.SurProjectBuildNodeDataExport;
import com.yanzhu.jh.project.mapper.SurProjectMapper;
import com.yanzhu.jh.project.domain.BaseBuildNode;
import com.yanzhu.jh.project.mapper.BaseBuildNodeMapper;
@ -119,4 +122,35 @@ public class SurProjectBuildNodeDataServiceImpl implements ISurProjectBuildNodeD
}
return n;
}
@Override
public int importData(List<SurProjectBuildNodeDataExport> list) {
if(list.size()==0){
return 0;
}
SurProjectBuildNodeData where=new SurProjectBuildNodeData();
where.setProjectId(list.get(0).getProjectId());
List<SurProjectBuildNodeData> items=surProjectBuildNodeDataMapper.selectSurProjectBuildNodeDataList(where);
if(items.size()==0){
return 0;
}
int cnt=0;
try {
for (SurProjectBuildNodeDataExport it : list) {
List<SurProjectBuildNodeData> finds = items.stream().filter(d -> d.getId() == it.getId()).collect(Collectors.toList());
if (finds.size() == 1) {
SurProjectBuildNodeData find = finds.get(0);
find.setPlanEndDate(it.getPlanEndDate());
find.setPlanStartDate(it.getPlanStartDate());
find.setStartDate(it.getStartDate());
find.setEndDate(it.getEndDate());
cnt++;
updateSurProjectBuildNodeData(find);
}
}
}catch (Exception ex){
ex.printStackTrace();
}
return cnt;
}
}