Browse Source

技术和产品的导出、导入

licailing 4 năm trước cách đây
mục cha
commit
a0a9583ef0

+ 25 - 9
src/main/java/com/izouma/zhirongip/domain/resource/Digital.java

@@ -1,9 +1,13 @@
 package com.izouma.zhirongip.domain.resource;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.izouma.zhirongip.annotations.Searchable;
 import com.izouma.zhirongip.annotations.SearchableOne;
 import com.izouma.zhirongip.domain.BaseEntity;
+import com.izouma.zhirongip.dto.ProductDTO;
+import com.izouma.zhirongip.dto.TechnologyDTO;
 import com.izouma.zhirongip.enums.DigitalType;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -37,9 +41,18 @@ public class Digital extends BaseEntity {
     @ApiModelProperty(value = "所属领域")
     private Long field;
 
+    @Transient
+    @ExcelProperty(value = "技术区分")
+    private String settingName;
+
+    @Transient
+    @ExcelProperty(value = "行业领域")
+    private String fieldName;
+
+
     @Searchable
     @SearchableOne
-    @ApiModelProperty(value = "名称")
+    @ExcelProperty(value = "技术名称")
     private String name;
 
     /*
@@ -48,23 +61,26 @@ public class Digital extends BaseEntity {
     公司: 地区
      */
     @SearchableOne
-    @ApiModelProperty(value = "成果所属人")
+    @ExcelProperty(value = "技术所属人")
     private String owner;
 
-    @ExcelIgnore
+    @ExcelProperty(value = "附图")
     private String img;
 
-    @ExcelIgnore
     @Column(columnDefinition = "TEXT")
-    @ApiModelProperty(value = "描述")
+    @ExcelProperty(value = "描述")
     private String manual;
 
+    @ExcelIgnore
     @Enumerated(EnumType.STRING)
     private DigitalType type;
 
-    @Transient
-    private String fieldName;
+    public Digital(TechnologyDTO dto) {
+        BeanUtil.copyProperties(dto, this);
+    }
+
+    public Digital(ProductDTO dto) {
+        BeanUtil.copyProperties(dto, this);
+    }
 
-    @Transient
-    private String settingName;
 }

+ 41 - 0
src/main/java/com/izouma/zhirongip/dto/ProductDTO.java

@@ -0,0 +1,41 @@
+package com.izouma.zhirongip.dto;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+import com.izouma.zhirongip.domain.resource.Digital;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "数据")
+public class ProductDTO extends BaseRowModel {
+    @ExcelProperty(value = "产品类别")
+    private String settingName;
+
+    @ExcelProperty(value = "行业领域")
+    private String fieldName;
+
+    @ExcelProperty(value = "产品名称")
+    private String name;
+
+    @ExcelProperty(value = "产品所属人")
+    private String owner;
+
+    @ExcelProperty(value = "附图")
+    private String img;
+
+    @ExcelProperty(value = "描述")
+    private String manual;
+
+    public ProductDTO(Digital digital) {
+        BeanUtil.copyProperties(digital, this);
+    }
+
+}

+ 35 - 0
src/main/java/com/izouma/zhirongip/dto/TechnologyDTO.java

@@ -0,0 +1,35 @@
+package com.izouma.zhirongip.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.metadata.BaseRowModel;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@Builder
+@ApiModel(value = "数据")
+public class TechnologyDTO extends BaseRowModel {
+    @ExcelProperty(value = "技术区分")
+    private String settingName;
+
+    @ExcelProperty(value = "行业领域")
+    private String fieldName;
+
+    @ExcelProperty(value = "技术名称")
+    private String name;
+
+    @ExcelProperty(value = "技术所属人")
+    private String owner;
+
+    @ExcelProperty(value = "附图")
+    private String img;
+
+    @ExcelProperty(value = "描述")
+    private String manual;
+
+}

+ 86 - 3
src/main/java/com/izouma/zhirongip/service/resource/DigitalService.java

@@ -1,18 +1,33 @@
 package com.izouma.zhirongip.service.resource;
 
+import cn.hutool.core.collection.CollUtil;
+import com.izouma.zhirongip.converter.StringArrayConverter;
 import com.izouma.zhirongip.domain.Setting;
 import com.izouma.zhirongip.domain.resource.Digital;
+import com.izouma.zhirongip.domain.resource.IntellectualProperty;
 import com.izouma.zhirongip.domain.supply.Logo;
+import com.izouma.zhirongip.dto.IntellectualPropertyDTO;
 import com.izouma.zhirongip.dto.PageQuery;
+import com.izouma.zhirongip.dto.ProductDTO;
+import com.izouma.zhirongip.dto.TechnologyDTO;
+import com.izouma.zhirongip.enums.DigitalType;
 import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.SettingRepo;
 import com.izouma.zhirongip.repo.resource.DigitalRepo;
 import com.izouma.zhirongip.utils.JpaUtils;
+import com.izouma.zhirongip.utils.excel.ExcelUtils;
 import lombok.AllArgsConstructor;
 import org.apache.xmlbeans.impl.xb.xsdschema.Public;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
 
+import javax.transaction.Transactional;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -34,10 +49,78 @@ public class DigitalService {
                 });
     }
 
-    public Digital get(Long id){
+    public Digital get(Long id) {
         Digital _digital = digitalRepo.findById(id).orElseThrow(new BusinessException("无记录"));
-        _digital.setFieldName(settingRepo.findById(_digital.getField()).orElseThrow(new BusinessException("无记录")).getName());
-        _digital.setSettingName(settingRepo.findById(_digital.getSettingId()).orElseThrow(new BusinessException("无记录")).getName());
+        _digital.setFieldName(settingRepo.findById(_digital.getField())
+                .orElseThrow(new BusinessException("无记录"))
+                .getName());
+        _digital.setSettingName(settingRepo.findById(_digital.getSettingId())
+                .orElseThrow(new BusinessException("无记录"))
+                .getName());
         return _digital;
     }
+
+    @Transactional(rollbackOn = Exception.class)
+    public void upload(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = is.read(buffer)) > -1) {
+            baos.write(buffer, 0, len);
+        }
+        baos.flush();
+
+        InputStream indicatorStream = new ByteArrayInputStream(baos.toByteArray());
+        List<TechnologyDTO> dtos = ExcelUtils.readExcel(indicatorStream, TechnologyDTO.class, 1, 1);
+
+        List<Digital> records = new ArrayList<>();
+        List<Setting> settings = settingRepo.findAllByFlagIn(CollUtil.newArrayList(1, 10));
+        Map<Integer, Map<String, Long>> mapMap = settings
+                .stream()
+                .collect(Collectors.groupingBy(Setting::getFlag, Collectors.toMap(Setting::getName, Setting::getId)));
+
+        dtos.forEach(dto -> {
+            Digital property = new Digital(dto);
+            property.setType(DigitalType.TECHNOLOGY);
+            property.setField(mapMap.get(1).get(dto.getFieldName()));
+            property.setSettingId(mapMap.get(10).get(dto.getSettingName()));
+
+            records.add(property);
+        });
+
+        digitalRepo.saveAll(records);
+    }
+
+    @Transactional(rollbackOn = Exception.class)
+    public void uploadProduct(InputStream is) throws IOException {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+        byte[] buffer = new byte[1024];
+        int len;
+        while ((len = is.read(buffer)) > -1) {
+            baos.write(buffer, 0, len);
+        }
+        baos.flush();
+
+        InputStream indicatorStream = new ByteArrayInputStream(baos.toByteArray());
+        List<ProductDTO> dtos = ExcelUtils.readExcel(indicatorStream, ProductDTO.class, 1, 1);
+
+        List<Digital> records = new ArrayList<>();
+        List<Setting> settings = settingRepo.findAllByFlagIn(CollUtil.newArrayList(1, 12));
+        Map<Integer, Map<String, Long>> mapMap = settings
+                .stream()
+                .collect(Collectors.groupingBy(Setting::getFlag, Collectors.toMap(Setting::getName, Setting::getId)));
+
+        dtos.forEach(dto -> {
+            Digital property = new Digital(dto);
+            property.setType(DigitalType.PRODUCT);
+            property.setField(mapMap.get(1).get(dto.getFieldName()));
+            property.setSettingId(mapMap.get(12).get(dto.getSettingName()));
+
+            records.add(property);
+        });
+
+        digitalRepo.saveAll(records);
+    }
 }

+ 43 - 4
src/main/java/com/izouma/zhirongip/web/resource/DigitalController.java

@@ -1,29 +1,34 @@
 package com.izouma.zhirongip.web.resource;
 
-import com.izouma.zhirongip.web.BaseController;
 import com.izouma.zhirongip.domain.resource.Digital;
-import com.izouma.zhirongip.service.resource.DigitalService;
 import com.izouma.zhirongip.dto.PageQuery;
+import com.izouma.zhirongip.dto.ProductDTO;
 import com.izouma.zhirongip.exception.BusinessException;
 import com.izouma.zhirongip.repo.resource.DigitalRepo;
+import com.izouma.zhirongip.service.resource.DigitalService;
 import com.izouma.zhirongip.utils.ObjUtils;
 import com.izouma.zhirongip.utils.excel.ExcelUtils;
-
+import com.izouma.zhirongip.web.BaseController;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.domain.Page;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.InputStream;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/digital")
 @AllArgsConstructor
+@Slf4j
 public class DigitalController extends BaseController {
     private final DigitalService digitalService;
-    private final DigitalRepo digitalRepo;
+    private final DigitalRepo    digitalRepo;
 
     @PreAuthorize("hasRole('ADMIN')")
     @PostMapping("/save")
@@ -59,5 +64,39 @@ public class DigitalController extends BaseController {
         List<Digital> data = all(pageQuery).getContent();
         ExcelUtils.export(response, data);
     }
+
+    @GetMapping("/excelProduct")
+    @ResponseBody
+    public void excelProduct(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<Digital> data = all(pageQuery).getContent();
+        List<ProductDTO> dtos = data.stream().map(ProductDTO::new).collect(Collectors.toList());
+        ExcelUtils.export(response, dtos);
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/upload")
+    public void uploadFile(@RequestParam("file") MultipartFile file) {
+        InputStream is;
+        try {
+            is = file.getInputStream();
+            digitalService.upload(is);
+        } catch (IOException e) {
+            log.error("上传失败", e);
+            throw new BusinessException("上传失败", e.getMessage());
+        }
+    }
+
+    @PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/uploadProduct")
+    public void uploadProduct(@RequestParam("file") MultipartFile file) {
+        InputStream is;
+        try {
+            is = file.getInputStream();
+            digitalService.uploadProduct(is);
+        } catch (IOException e) {
+            log.error("上传失败", e);
+            throw new BusinessException("上传失败", e.getMessage());
+        }
+    }
 }
 

+ 1 - 1
src/main/vue/src/components/ExcelUpload.vue

@@ -37,7 +37,7 @@ export default {
         }
     },
     created() {
-        this.uploadUrl = resolveUrl(this.$baseUrl, this.uri + '/upload');
+        this.uploadUrl = resolveUrl(this.$baseUrl, this.uri);
     },
     methods: {
         upload() {},

+ 4 - 3
src/main/vue/src/views/resource/DigitalList.vue

@@ -10,15 +10,16 @@
             >
                 新增
             </el-button>
-            <!-- <el-button
+            <el-button
                 @click="download"
-                icon="el-icon-upload2"
+                icon="el-icon-download"
                 :loading="downloading"
                 :disabled="fetchingData || totalElements < 1"
                 class="filter-item"
             >
                 导出
-            </el-button> -->
+            </el-button>
+            <excel-upload uri="digital/upload" @input="getData"></excel-upload>
         </page-title>
         <div class="filters-container">
             <el-input

+ 5 - 4
src/main/vue/src/views/resource/DigitalProductList.vue

@@ -10,15 +10,16 @@
             >
                 新增
             </el-button>
-            <!-- <el-button
+            <el-button
                 @click="download"
-                icon="el-icon-upload2"
+                icon="el-icon-download"
                 :loading="downloading"
                 :disabled="fetchingData || totalElements < 1"
                 class="filter-item"
             >
                 导出
-            </el-button> -->
+            </el-button>
+            <excel-upload uri="digital/uploadProduct" @input="getData"></excel-upload>
         </page-title>
         <div class="filters-container">
             <el-input
@@ -153,7 +154,7 @@ export default {
         download() {
             this.downloading = true;
             this.$axios
-                .get('/digital/excel', {
+                .get('/digital/excelProduct', {
                     responseType: 'blob',
                     params: {
                         size: 10000,

+ 1 - 1
src/main/vue/src/views/resource/IntellectualPropertyList.vue

@@ -19,7 +19,7 @@
             >
                 导出
             </el-button>
-            <excel-upload uri="intellectualProperty" @input="getData"></excel-upload>
+            <excel-upload uri="intellectualProperty/upload" @input="getData"></excel-upload>
         </page-title>
         <div class="filters-container">
             <el-input